Skip to content

Commit b4d3e0b

Browse files
committed
new: add relative jump support to goto functionality
1 parent af93fd8 commit b4d3e0b

2 files changed

Lines changed: 41 additions & 9 deletions

File tree

display.c

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff 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
}

interact.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff 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

0 commit comments

Comments
 (0)