File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -295,16 +295,49 @@ int get_number(INT *i)
295295{
296296 unsigned long long n ;
297297 int err ;
298+ int is_relative = 0 ;
299+ int is_negative = 0 ;
298300 char tmp [BLOCK_SEARCH_SIZE ];
301+ char * parse_start ;
302+
299303 echo ();
300304 getnstr (tmp , BLOCK_SEARCH_SIZE - 1 );
301305 noecho ();
302- if (strbeginswith (tmp , "0x" ))
303- err = sscanf (tmp + strlen ("0x" ), "%llx" , & n );
306+
307+ parse_start = tmp ;
308+
309+ if (tmp [0 ] == '+' || tmp [0 ] == '-' ) {
310+ is_relative = 1 ;
311+ is_negative = (tmp [0 ] == '-' );
312+ parse_start = tmp + 1 ;
313+ }
314+
315+ if (strbeginswith (parse_start , "0x" ))
316+ err = sscanf (parse_start + strlen ("0x" ), "%llx" , & n );
304317 else
305- err = sscanf (tmp , "%llu" , & n );
306- * i = (off_t )n ;
307- if (* i < 0 || n != (unsigned long long ) * i )
308- err = 0 ;
309- return err == 1 ;
318+ err = sscanf (parse_start , "%llu" , & n );
319+
320+ if (err != 1 ) {
321+ return 0 ;
322+ }
323+
324+ if (is_relative ) {
325+ INT current_pos = base + cursor ;
326+ if (is_negative ) {
327+ * i = current_pos - (INT )n ;
328+ } else {
329+ * i = current_pos + (INT )n ;
330+ }
331+ // Check for underflow/overflow
332+ if (* i < 0 ) {
333+ * i = 0 ;
334+ }
335+ } else {
336+ * i = (off_t )n ;
337+ // Check for overflow for absolute positions
338+ if (* i < 0 || n != (unsigned long long ) * i )
339+ return 0 ;
340+ }
341+
342+ return 1 ;
310343}
Original file line number Diff line number Diff line change @@ -261,8 +261,7 @@ static void goto_char(void)
261261{
262262 INT i ;
263263
264- displayOneLineMessage ("New position ? " );
265- ungetstr ("0x" );
264+ displayOneLineMessage ("New position (or +/-offset) ? " );
266265 if (!get_number (& i ) || !set_cursor (i )) displayMessageAndWaitForKey ("Invalid position!" );
267266}
268267
You can’t perform that action at this time.
0 commit comments