diff --git a/less.h b/less.h index 43e2cc47..2f880eb1 100644 --- a/less.h +++ b/less.h @@ -580,8 +580,8 @@ struct ansi_state; void postoa LESSPARAMS ((POSITION, char*)); void linenumtoa LESSPARAMS ((LINENUM, char*)); void inttoa LESSPARAMS ((int, char*)); -int lstrtoi LESSPARAMS ((char*, char**)); -POSITION lstrtopos LESSPARAMS ((char*, char**)); +int lstrtoi LESSPARAMS ((char*, char**, int)); +POSITION lstrtopos LESSPARAMS ((char*, char**, int)); #if MSDOS_COMPILER==WIN32C int pclose LESSPARAMS ((FILE*)); #endif diff --git a/lessecho.c b/lessecho.c index 5cd660db..c6fa4c93 100644 --- a/lessecho.c +++ b/lessecho.c @@ -70,10 +70,10 @@ pr_error(s) } static long -lstrtol(s, radix, pend) +lstrtol(s, pend, radix) char *s; - int radix; char **pend; + int radix; { int v; int neg = 0; @@ -210,7 +210,7 @@ main(argc, argv) closequote = *++arg; break; case 'd': - closequote = lstrtol(++arg, 0, &s); + closequote = lstrtol(++arg, &s, 0); if (s == arg) pr_error("Missing number after -d"); break; @@ -221,7 +221,7 @@ main(argc, argv) meta_escape = arg; break; case 'f': - meta_escape_buf[0] = lstrtol(++arg, 0, &s); + meta_escape_buf[0] = lstrtol(++arg, &s, 0); meta_escape_buf[1] = '\0'; meta_escape = meta_escape_buf; if (s == arg) @@ -231,7 +231,7 @@ main(argc, argv) openquote = *++arg; break; case 'p': - openquote = lstrtol(++arg, 0, &s); + openquote = lstrtol(++arg, &s, 0); if (s == arg) pr_error("Missing number after -p"); break; @@ -239,7 +239,7 @@ main(argc, argv) add_metachar(*++arg); break; case 'n': - add_metachar(lstrtol(++arg, 0, &s)); + add_metachar(lstrtol(++arg, &s, 0)); if (s == arg) pr_error("Missing number after -n"); break; diff --git a/lesskey.c b/lesskey.c index 39ebe8b9..f8e4a6eb 100644 --- a/lesskey.c +++ b/lesskey.c @@ -123,11 +123,12 @@ lesskey_parse_error(s) } int -lstrtoi(buf, ebuf) +lstrtoi(buf, ebuf, radix) char *buf; char **ebuf; + int radix; { - return (int) strtol(buf, ebuf, 10); + return (int) strtol(buf, ebuf, radix); } void * diff --git a/lesskey_parse.c b/lesskey_parse.c index 5d761eba..0f8318bd 100644 --- a/lesskey_parse.c +++ b/lesskey_parse.c @@ -21,7 +21,7 @@ extern void lesskey_parse_error(char *msg); extern char *homefile(char *filename); extern void *ecalloc(int count, unsigned int size); -extern int lstrtoi(char *str, char **end); +extern int lstrtoi(char *str, char **end, int radix); extern char version[]; static int linenum; @@ -439,7 +439,7 @@ version_line(s, tables) return (NULL); } s = skipsp(s); - ver = lstrtoi(s, &e); + ver = lstrtoi(s, &e, 10); if (e == s) { parse_error("non-numeric version number in #version line", ""); @@ -678,7 +678,7 @@ parse_lesskey(infile, tables) errors = 0; linenum = 0; if (less_version == 0) - less_version = lstrtoi(version, NULL); + less_version = lstrtoi(version, NULL, 10); /* * Open the input file. diff --git a/mark.c b/mark.c index f3bf0c4f..4de1d094 100644 --- a/mark.c +++ b/mark.c @@ -446,13 +446,13 @@ restore_mark(line) if (m == NULL) return; skip_whitespace; - ln = lstrtoi(line, &line); + ln = lstrtoi(line, &line, 10); if (ln < 1) ln = 1; if (ln > sc_height) ln = sc_height; skip_whitespace; - pos = lstrtopos(line, &line); + pos = lstrtopos(line, &line, 10); skip_whitespace; cmark(m, NULL_IFILE, pos, ln); m->m_filename = save(line); diff --git a/output.c b/output.c index 3fed3df3..0017c525 100644 --- a/output.c +++ b/output.c @@ -504,15 +504,17 @@ TYPE_TO_A_FUNC(inttoa, int) * Convert an string to an integral type. */ #define STR_TO_TYPE_FUNC(funcname, type) \ -type funcname(buf, ebuf) \ +type funcname(buf, ebuf, radix) \ char *buf; \ char **ebuf; \ + int radix; \ { \ type val = 0; \ for (;; buf++) { \ char c = *buf; \ - if (c < '0' || c > '9') break; \ - val = 10 * val + c - '0'; \ + int digit = (c >= '0' && c <= '9') ? c - '0' : (c >= 'a' && c <= 'f') ? c - 'a' + 10 : (c >= 'A' && c <= 'F') ? c - 'A' + 10 : -1; \ + if (digit < 0 || digit >= radix) break; \ + val = radix * val + digit; \ } \ if (ebuf != NULL) *ebuf = buf; \ return val; \ diff --git a/screen.c b/screen.c index 7c903ab6..c05c50ed 100644 --- a/screen.c +++ b/screen.c @@ -1662,7 +1662,7 @@ ltputs(str, affcnt, f_putc) do_tputs(str2, affcnt, f_putc); str += slen + 2; /* Perform the delay. */ - delay = lstrtoi(str, &str); + delay = lstrtoi(str, &str, 10); if (*str == '*') delay *= affcnt; flush(); @@ -2469,7 +2469,7 @@ parse_color6(ps) } else { char *ops = *ps; - int color = lstrtoi(ops, ps); + int color = lstrtoi(ops, ps, 10); if (*ps == ops) return CV_ERROR; return color;