aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/buffer.c17
-rw-r--r--src/nvim/change.c2
-rw-r--r--src/nvim/charset.c68
-rw-r--r--src/nvim/cursor_shape.c12
-rw-r--r--src/nvim/diff.c20
-rw-r--r--src/nvim/digraph.c2
-rw-r--r--src/nvim/eval.c8
-rw-r--r--src/nvim/event/socket.c4
-rw-r--r--src/nvim/ex_cmds.c4
-rw-r--r--src/nvim/ex_cmds2.c2
-rw-r--r--src/nvim/ex_docmd.c119
-rw-r--r--src/nvim/hardcopy.c2
-rw-r--r--src/nvim/indent_c.c38
-rw-r--r--src/nvim/menu.c12
-rw-r--r--src/nvim/ops.c2
-rw-r--r--src/nvim/option.c14
-rw-r--r--src/nvim/regexp.c27
-rw-r--r--src/nvim/sign.c4
-rw-r--r--src/nvim/spell.c16
-rw-r--r--src/nvim/spellfile.c32
-rw-r--r--src/nvim/syntax.c12
-rw-r--r--src/nvim/window.c12
22 files changed, 226 insertions, 203 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 8fd4360aed..b50c764ac3 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -1016,8 +1016,9 @@ do_bufdel(
break;
}
arg = p;
- } else
- bnr = getdigits_int(&arg);
+ } else {
+ bnr = getdigits_int(&arg, false, 0);
+ }
}
}
if (!got_int && do_current
@@ -3626,10 +3627,7 @@ int build_stl_str_hl(
// The first digit group is the item's min width
if (ascii_isdigit(*fmt_p)) {
- minwid = getdigits_int(&fmt_p);
- if (minwid < 0) { // overflow
- minwid = 0;
- }
+ minwid = getdigits_int(&fmt_p, false, 0);
}
// User highlight groups override the min width field
@@ -3712,10 +3710,7 @@ int build_stl_str_hl(
if (*fmt_p == '.') {
fmt_p++;
if (ascii_isdigit(*fmt_p)) {
- maxwid = getdigits_int(&fmt_p);
- if (maxwid <= 0) { // overflow
- maxwid = 50;
- }
+ maxwid = getdigits_int(&fmt_p, false, 50);
}
}
@@ -5078,7 +5073,7 @@ chk_modeline(
} else {
e = s + 3;
}
- if (getdigits_safe(&e, &vers) != OK) {
+ if (!try_getdigits(&e, &vers)) {
continue;
}
diff --git a/src/nvim/change.c b/src/nvim/change.c
index 3401f8a0a8..ba80e71ae6 100644
--- a/src/nvim/change.c
+++ b/src/nvim/change.c
@@ -1323,7 +1323,7 @@ int open_line(
if (*p == COM_RIGHT || *p == COM_LEFT) {
c = *p++;
} else if (ascii_isdigit(*p) || *p == '-') {
- off = getdigits_int(&p);
+ off = getdigits_int(&p, true, 0);
} else {
p++;
}
diff --git a/src/nvim/charset.c b/src/nvim/charset.c
index 1dec0beeee..78e7861d9d 100644
--- a/src/nvim/charset.c
+++ b/src/nvim/charset.c
@@ -166,7 +166,7 @@ int buf_init_chartab(buf_T *buf, int global)
}
if (ascii_isdigit(*p)) {
- c = getdigits_int((char_u **)&p);
+ c = getdigits_int((char_u **)&p, true, 0);
} else {
c = mb_ptr2char_adv(&p);
}
@@ -176,7 +176,7 @@ int buf_init_chartab(buf_T *buf, int global)
++p;
if (ascii_isdigit(*p)) {
- c2 = getdigits_int((char_u **)&p);
+ c2 = getdigits_int((char_u **)&p, true, 0);
} else {
c2 = mb_ptr2char_adv(&p);
}
@@ -1595,59 +1595,69 @@ char_u* skiptowhite_esc(char_u *p) {
return p;
}
-/// Get a number from a string and skip over it, signalling overflows
+/// Gets a number from a string and skips over it, signalling overflow.
///
/// @param[out] pp A pointer to a pointer to char_u.
/// It will be advanced past the read number.
/// @param[out] nr Number read from the string.
///
-/// @return OK on success, FAIL on error/overflow
-int getdigits_safe(char_u **pp, intmax_t *nr)
+/// @return true on success, false on error/overflow
+bool try_getdigits(char_u **pp, intmax_t *nr)
{
errno = 0;
*nr = strtoimax((char *)(*pp), (char **)pp, 10);
-
- if ((*nr == INTMAX_MIN || *nr == INTMAX_MAX)
- && errno == ERANGE) {
- return FAIL;
+ if (errno == ERANGE && (*nr == INTMAX_MIN || *nr == INTMAX_MAX)) {
+ return false;
}
-
- return OK;
+ return true;
}
-/// Get a number from a string and skip over it.
+/// Gets a number from a string and skips over it.
///
-/// @param[out] pp A pointer to a pointer to char_u.
+/// @param[out] pp Pointer to a pointer to char_u.
/// It will be advanced past the read number.
+/// @param strict Abort on overflow.
+/// @param def Default value, if parsing fails or overflow occurs.
///
-/// @return Number read from the string.
-intmax_t getdigits(char_u **pp)
+/// @return Number read from the string, or `def` on parse failure or overflow.
+intmax_t getdigits(char_u **pp, bool strict, intmax_t def)
{
intmax_t number;
- int ret = getdigits_safe(pp, &number);
-
- (void)ret; // Avoid "unused variable" warning in Release build
- assert(ret == OK);
-
- return number;
+ int ok = try_getdigits(pp, &number);
+ if (strict && !ok) {
+ abort();
+ }
+ return ok ? number : def;
}
-/// Get an int number from a string. Like getdigits(), but restricted to `int`.
-int getdigits_int(char_u **pp)
+/// Gets an int number from a string.
+///
+/// @see getdigits
+int getdigits_int(char_u **pp, bool strict, int def)
{
- intmax_t number = getdigits(pp);
+ intmax_t number = getdigits(pp, strict, def);
#if SIZEOF_INTMAX_T > SIZEOF_INT
- assert(number >= INT_MIN && number <= INT_MAX);
+ if (strict) {
+ assert(number >= INT_MIN && number <= INT_MAX);
+ } else if (!(number >= INT_MIN && number <= INT_MAX)) {
+ return def;
+ }
#endif
return (int)number;
}
-/// Get a long number from a string. Like getdigits(), but restricted to `long`.
-long getdigits_long(char_u **pp)
+/// Gets a long number from a string.
+///
+/// @see getdigits
+long getdigits_long(char_u **pp, bool strict, long def)
{
- intmax_t number = getdigits(pp);
+ intmax_t number = getdigits(pp, strict, def);
#if SIZEOF_INTMAX_T > SIZEOF_LONG
- assert(number >= LONG_MIN && number <= LONG_MAX);
+ if (strict) {
+ assert(number >= LONG_MIN && number <= LONG_MAX);
+ } else if (!(number >= LONG_MIN && number <= LONG_MAX)) {
+ return def;
+ }
#endif
return (long)number;
}
diff --git a/src/nvim/cursor_shape.c b/src/nvim/cursor_shape.c
index 9c8128db4f..3f06340611 100644
--- a/src/nvim/cursor_shape.c
+++ b/src/nvim/cursor_shape.c
@@ -176,15 +176,17 @@ char_u *parse_shape_opt(int what)
p += len;
if (!ascii_isdigit(*p))
return (char_u *)N_("E548: digit expected");
- int n = getdigits_int(&p);
- if (len == 3) { /* "ver" or "hor" */
- if (n == 0)
+ int n = getdigits_int(&p, false, 0);
+ if (len == 3) { // "ver" or "hor"
+ if (n == 0) {
return (char_u *)N_("E549: Illegal percentage");
+ }
if (round == 2) {
- if (TOLOWER_ASC(i) == 'v')
+ if (TOLOWER_ASC(i) == 'v') {
shape_table[idx].shape = SHAPE_VER;
- else
+ } else {
shape_table[idx].shape = SHAPE_HOR;
+ }
shape_table[idx].percentage = n;
}
} else if (round == 2) {
diff --git a/src/nvim/diff.c b/src/nvim/diff.c
index 7328b88a40..db3ef7ac47 100644
--- a/src/nvim/diff.c
+++ b/src/nvim/diff.c
@@ -2113,7 +2113,7 @@ int diffopt_changed(void)
diff_flags_new |= DIFF_FILLER;
} else if ((STRNCMP(p, "context:", 8) == 0) && ascii_isdigit(p[8])) {
p += 8;
- diff_context_new = getdigits_int(&p);
+ diff_context_new = getdigits_int(&p, false, diff_context_new);
} else if (STRNCMP(p, "iblank", 6) == 0) {
p += 6;
diff_flags_new |= DIFF_IBLANK;
@@ -2137,7 +2137,7 @@ int diffopt_changed(void)
diff_flags_new |= DIFF_VERTICAL;
} else if ((STRNCMP(p, "foldcolumn:", 11) == 0) && ascii_isdigit(p[11])) {
p += 11;
- diff_foldcolumn_new = getdigits_int(&p);
+ diff_foldcolumn_new = getdigits_int(&p, false, diff_foldcolumn_new);
} else if (STRNCMP(p, "hiddenoff", 9) == 0) {
p += 9;
diff_flags_new |= DIFF_HIDDEN_OFF;
@@ -3000,10 +3000,10 @@ static int parse_diff_ed(char_u *line,
// append: {first}a{first}[,{last}]
// delete: {first}[,{last}]d{first}
p = line;
- f1 = getdigits(&p);
+ f1 = getdigits(&p, true, 0);
if (*p == ',') {
p++;
- l1 = getdigits(&p);
+ l1 = getdigits(&p, true, 0);
} else {
l1 = f1;
}
@@ -3011,10 +3011,10 @@ static int parse_diff_ed(char_u *line,
return FAIL; // invalid diff format
}
difftype = *p++;
- f2 = getdigits(&p);
+ f2 = getdigits(&p, true, 0);
if (*p == ',') {
p++;
- l2 = getdigits(&p);
+ l2 = getdigits(&p, true, 0);
} else {
l2 = f2;
}
@@ -3056,18 +3056,18 @@ static int parse_diff_unified(char_u *line,
// @@ -oldline,oldcount +newline,newcount @@
p = line;
if (*p++ == '@' && *p++ == '@' && *p++ == ' ' && *p++ == '-') {
- oldline = getdigits(&p);
+ oldline = getdigits(&p, true, 0);
if (*p == ',') {
p++;
- oldcount = getdigits(&p);
+ oldcount = getdigits(&p, true, 0);
} else {
oldcount = 1;
}
if (*p++ == ' ' && *p++ == '+') {
- newline = getdigits(&p);
+ newline = getdigits(&p, true, 0);
if (*p == ',') {
p++;
- newcount = getdigits(&p);
+ newcount = getdigits(&p, true, 0);
} else {
newcount = 1;
}
diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c
index ea9b210255..f6ec350488 100644
--- a/src/nvim/digraph.c
+++ b/src/nvim/digraph.c
@@ -1618,7 +1618,7 @@ void putdigraph(char_u *str)
EMSG(_(e_number_exp));
return;
}
- int n = getdigits_int(&str);
+ int n = getdigits_int(&str, true, 0);
// If the digraph already exists, replace the result.
dp = (digr_T *)user_digraphs.ga_data;
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index fbfc5a5f76..00b9fcf646 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -2936,10 +2936,10 @@ void ex_lockvar(exarg_T *eap)
char_u *arg = eap->arg;
int deep = 2;
- if (eap->forceit)
+ if (eap->forceit) {
deep = -1;
- else if (ascii_isdigit(*arg)) {
- deep = getdigits_int(&arg);
+ } else if (ascii_isdigit(*arg)) {
+ deep = getdigits_int(&arg, false, -1);
arg = skipwhite(arg);
}
@@ -15775,7 +15775,7 @@ static void f_setreg(typval_T *argvars, typval_T *rettv, FunPtr fptr)
yank_type = kMTBlockWise;
if (ascii_isdigit(stropt[1])) {
stropt++;
- block_len = getdigits_long((char_u **)&stropt) - 1;
+ block_len = getdigits_long((char_u **)&stropt, true, 0) - 1;
stropt--;
}
break;
diff --git a/src/nvim/event/socket.c b/src/nvim/event/socket.c
index af326f9c82..23228aa63a 100644
--- a/src/nvim/event/socket.c
+++ b/src/nvim/event/socket.c
@@ -40,8 +40,8 @@ int socket_watcher_init(Loop *loop, SocketWatcher *watcher,
char *port = host_end + 1;
intmax_t iport;
- int ret = getdigits_safe(&(char_u *){ (char_u *)port }, &iport);
- if (ret == FAIL || iport < 0 || iport > UINT16_MAX) {
+ int ok = try_getdigits(&(char_u *){ (char_u *)port }, &iport);
+ if (!ok || iport < 0 || iport > UINT16_MAX) {
ELOG("Invalid port: %s", port);
return UV_EINVAL;
}
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index c3e1e69a63..16487ce447 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -707,7 +707,7 @@ void ex_retab(exarg_T *eap)
save_list = curwin->w_p_list;
curwin->w_p_list = 0; /* don't want list mode here */
- new_ts = getdigits_int(&(eap->arg));
+ new_ts = getdigits_int(&(eap->arg), false, -1);
if (new_ts < 0) {
EMSG(_(e_positive));
return;
@@ -3357,7 +3357,7 @@ static buf_T *do_sub(exarg_T *eap, proftime_T timeout,
// check for a trailing count
cmd = skipwhite(cmd);
if (ascii_isdigit(*cmd)) {
- i = getdigits_long(&cmd);
+ i = getdigits_long(&cmd, true, 0);
if (i <= 0 && !eap->skip && subflags.do_error) {
EMSG(_(e_zerocount));
return NULL;
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c
index 25528e667f..813d1a9b0b 100644
--- a/src/nvim/ex_cmds2.c
+++ b/src/nvim/ex_cmds2.c
@@ -570,7 +570,7 @@ static int dbg_parsearg(char_u *arg, garray_T *gap)
if (here) {
bp->dbg_lnum = curwin->w_cursor.lnum;
} else if (gap != &prof_ga && ascii_isdigit(*p)) {
- bp->dbg_lnum = getdigits_long(&p);
+ bp->dbg_lnum = getdigits_long(&p, true, 0);
p = skipwhite(p);
} else {
bp->dbg_lnum = 0;
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 61a32bccfa..72d39adb3e 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -2064,14 +2064,14 @@ static char_u * do_one_cmd(char_u **cmdlinep,
}
}
- /*
- * Check for a count. When accepting a BUFNAME, don't use "123foo" as a
- * count, it's a buffer name.
- */
+ //
+ // Check for a count. When accepting a BUFNAME, don't use "123foo" as a
+ // count, it's a buffer name.
+ ///
if ((ea.argt & COUNT) && ascii_isdigit(*ea.arg)
&& (!(ea.argt & BUFNAME) || *(p = skipdigits(ea.arg)) == NUL
|| ascii_iswhite(*p))) {
- n = getdigits_long(&ea.arg);
+ n = getdigits_long(&ea.arg, false, -1);
ea.arg = skipwhite(ea.arg);
if (n <= 0 && !ni && (ea.argt & ZEROR) == 0) {
errormsg = (char_u *)_(e_zerocount);
@@ -3796,14 +3796,16 @@ static linenr_T get_address(exarg_T *eap,
break;
default:
- if (ascii_isdigit(*cmd)) /* absolute line number */
- lnum = getdigits_long(&cmd);
+ if (ascii_isdigit(*cmd)) { // absolute line number
+ lnum = getdigits_long(&cmd, false, 0);
+ }
}
for (;; ) {
cmd = skipwhite(cmd);
- if (*cmd != '-' && *cmd != '+' && !ascii_isdigit(*cmd))
+ if (*cmd != '-' && *cmd != '+' && !ascii_isdigit(*cmd)) {
break;
+ }
if (lnum == MAXLNUM) {
switch (addr_type) {
@@ -3832,14 +3834,16 @@ static linenr_T get_address(exarg_T *eap,
}
}
- if (ascii_isdigit(*cmd))
- i = '+'; /* "number" is same as "+number" */
- else
+ if (ascii_isdigit(*cmd)) {
+ i = '+'; // "number" is same as "+number"
+ } else {
i = *cmd++;
- if (!ascii_isdigit(*cmd)) /* '+' is '+1', but '+0' is not '+1' */
+ }
+ if (!ascii_isdigit(*cmd)) { // '+' is '+1', but '+0' is not '+1'
n = 1;
- else
- n = getdigits(&cmd);
+ } else {
+ n = getdigits(&cmd, true, 0);
+ }
if (addr_type == ADDR_TABS_RELATIVE) {
EMSG(_(e_invrange));
@@ -4504,7 +4508,7 @@ static int get_tabpage_arg(exarg_T *eap)
}
p_save = p;
- tab_number = getdigits(&p);
+ tab_number = getdigits(&p, false, tab_number);
if (relative == 0) {
if (STRCMP(p, "$") == 0) {
@@ -5179,7 +5183,7 @@ two_count:
return FAIL;
}
- *def = getdigits_long(&p);
+ *def = getdigits_long(&p, true, 0);
*argt |= (ZEROR | NOTADR);
if (p != val + vallen || vallen == 0) {
@@ -5196,7 +5200,7 @@ invalid_count:
if (*def >= 0)
goto two_count;
- *def = getdigits_long(&p);
+ *def = getdigits_long(&p, true, 0);
if (p != val + vallen)
goto invalid_count;
@@ -6832,8 +6836,7 @@ static void ex_tabnext(exarg_T *eap)
if (eap->arg && *eap->arg != NUL) {
char_u *p = eap->arg;
char_u *p_save = p;
-
- tab_number = getdigits(&p);
+ tab_number = getdigits(&p, false, 0);
if (p == p_save || *p_save == '-' || *p_save == '+' || *p != NUL
|| tab_number == 0) {
// No numbers as argument.
@@ -7472,18 +7475,16 @@ static void do_exmap(exarg_T *eap, int isabbrev)
*/
static void ex_winsize(exarg_T *eap)
{
- int w, h;
- char_u *arg = eap->arg;
- char_u *p;
-
- w = getdigits_int(&arg);
+ char_u *arg = eap->arg;
+ int w = getdigits_int(&arg, false, 10);
arg = skipwhite(arg);
- p = arg;
- h = getdigits_int(&arg);
- if (*p != NUL && *arg == NUL)
+ char_u *p = arg;
+ int h = getdigits_int(&arg, false, 10);
+ if (*p != NUL && *arg == NUL) {
screen_resize(w, h);
- else
+ } else {
EMSG(_("E465: :winsize requires two number arguments"));
+ }
}
static void ex_wincmd(exarg_T *eap)
@@ -7724,17 +7725,13 @@ static void ex_rundo(exarg_T *eap)
u_read_undo((char *) eap->arg, hash, NULL);
}
-/*
- * ":redo".
- */
+/// ":redo".
static void ex_redo(exarg_T *eap)
{
u_redo(1);
}
-/*
- * ":earlier" and ":later".
- */
+/// ":earlier" and ":later".
static void ex_later(exarg_T *eap)
{
long count = 0;
@@ -7742,10 +7739,10 @@ static void ex_later(exarg_T *eap)
bool file = false;
char_u *p = eap->arg;
- if (*p == NUL)
+ if (*p == NUL) {
count = 1;
- else if (isdigit(*p)) {
- count = getdigits_long(&p);
+ } else if (isdigit(*p)) {
+ count = getdigits_long(&p, false, 0);
switch (*p) {
case 's': ++p; sec = true; break;
case 'm': ++p; sec = true; count *= 60; break;
@@ -7755,11 +7752,12 @@ static void ex_later(exarg_T *eap)
}
}
- if (*p != NUL)
+ if (*p != NUL) {
EMSG2(_(e_invarg2), eap->arg);
- else
+ } else {
undo_time(eap->cmdidx == CMD_earlier ? -count : count,
sec, file, false);
+ }
}
/*
@@ -8413,23 +8411,24 @@ static void ex_findpat(exarg_T *eap)
}
n = 1;
- if (ascii_isdigit(*eap->arg)) { /* get count */
- n = getdigits_long(&eap->arg);
+ if (ascii_isdigit(*eap->arg)) { // get count
+ n = getdigits_long(&eap->arg, false, 0);
eap->arg = skipwhite(eap->arg);
}
- if (*eap->arg == '/') { /* Match regexp, not just whole words */
- whole = FALSE;
- ++eap->arg;
+ if (*eap->arg == '/') { // Match regexp, not just whole words
+ whole = false;
+ eap->arg++;
p = skip_regexp(eap->arg, '/', p_magic, NULL);
if (*p) {
*p++ = NUL;
p = skipwhite(p);
- /* Check for trailing illegal characters */
- if (!ends_excmd(*p))
+ // Check for trailing illegal characters.
+ if (!ends_excmd(*p)) {
eap->errmsg = e_trailing;
- else
+ } else {
eap->nextcmd = check_nextcmd(p);
+ }
}
}
if (!eap->skip)
@@ -8659,17 +8658,16 @@ eval_vars (
*errormsg = (char_u *)"";
return NULL;
}
- }
- /*
- * '#': Alternate file name
- * '%': Current file name
- * File name under the cursor
- * File name for autocommand
- * and following modifiers
- */
- else {
+ //
+ // '#': Alternate file name
+ // '%': Current file name
+ // File name under the cursor
+ // File name for autocommand
+ // and following modifiers
+ //
+ } else {
switch (spec_idx) {
- case SPEC_PERC: /* '%': current file */
+ case SPEC_PERC: // '%': current file
if (curbuf->b_fname == NULL) {
result = (char_u *)"";
valid = 0; // Must have ":p:h" to be valid
@@ -8690,9 +8688,10 @@ eval_vars (
break;
}
s = src + 1;
- if (*s == '<') /* "#<99" uses v:oldfiles */
- ++s;
- i = getdigits_int(&s);
+ if (*s == '<') { // "#<99" uses v:oldfiles.
+ s++;
+ }
+ i = getdigits_int(&s, false, 0);
if (s == src + 2 && src[1] == '-') {
// just a minus sign, don't skip over it
s--;
diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c
index 43cf372e07..4b361d2d45 100644
--- a/src/nvim/hardcopy.c
+++ b/src/nvim/hardcopy.c
@@ -325,7 +325,7 @@ static char_u *parse_list_options(char_u *option_str, option_table_T *table,
break;
}
- table[idx].number = getdigits_int(&p);
+ table[idx].number = getdigits_int(&p, false, 0);
}
table[idx].string = p;
diff --git a/src/nvim/indent_c.c b/src/nvim/indent_c.c
index 3938da761b..1ca1f3dae5 100644
--- a/src/nvim/indent_c.c
+++ b/src/nvim/indent_c.c
@@ -1675,25 +1675,27 @@ void parse_cino(buf_T *buf)
for (p = buf->b_p_cino; *p; ) {
l = p++;
- if (*p == '-')
- ++p;
- char_u *digits_start = p; /* remember where the digits start */
- int n = getdigits_int(&p);
+ if (*p == '-') {
+ p++;
+ }
+ char_u *digits_start = p; // remember where the digits start
+ int n = getdigits_int(&p, true, 0);
divider = 0;
- if (*p == '.') { /* ".5s" means a fraction */
+ if (*p == '.') { // ".5s" means a fraction.
fraction = atoi((char *)++p);
while (ascii_isdigit(*p)) {
- ++p;
- if (divider)
+ p++;
+ if (divider) {
divider *= 10;
- else
+ } else {
divider = 10;
+ }
}
}
- if (*p == 's') { /* "2s" means two times 'shiftwidth' */
- if (p == digits_start)
- n = sw; /* just "s" is one 'shiftwidth' */
- else {
+ if (*p == 's') { // "2s" means two times 'shiftwidth'.
+ if (p == digits_start) {
+ n = sw; // just "s" is one 'shiftwidth'.
+ } else {
n *= sw;
if (divider)
n += (sw * fraction + divider / 2) / divider;
@@ -1910,15 +1912,15 @@ int get_c_indent(void)
int what = 0;
while (*p != NUL && *p != ':') {
- if (*p == COM_START || *p == COM_END || *p == COM_MIDDLE)
+ if (*p == COM_START || *p == COM_END || *p == COM_MIDDLE) {
what = *p++;
- else if (*p == COM_LEFT || *p == COM_RIGHT)
+ } else if (*p == COM_LEFT || *p == COM_RIGHT) {
align = *p++;
- else if (ascii_isdigit(*p) || *p == '-') {
- off = getdigits_int(&p);
+ } else if (ascii_isdigit(*p) || *p == '-') {
+ off = getdigits_int(&p, true, 0);
+ } else {
+ p++;
}
- else
- ++p;
}
if (*p == ':')
diff --git a/src/nvim/menu.c b/src/nvim/menu.c
index 181efbf3b0..18c4f1fff1 100644
--- a/src/nvim/menu.c
+++ b/src/nvim/menu.c
@@ -112,12 +112,14 @@ ex_menu(exarg_T *eap)
}
}
if (ascii_iswhite(*p)) {
- for (i = 0; i < MENUDEPTH && !ascii_iswhite(*arg); ++i) {
- pri_tab[i] = getdigits_long(&arg);
- if (pri_tab[i] == 0)
+ for (i = 0; i < MENUDEPTH && !ascii_iswhite(*arg); i++) {
+ pri_tab[i] = getdigits_long(&arg, false, 0);
+ if (pri_tab[i] == 0) {
pri_tab[i] = 500;
- if (*arg == '.')
- ++arg;
+ }
+ if (*arg == '.') {
+ arg++;
+ }
}
arg = skipwhite(arg);
} else if (eap->addr_count && eap->line2 != 0) {
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index be45376deb..4f0c1b5cb9 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -5714,7 +5714,7 @@ bool prepare_yankreg_from_object(yankreg_T *reg, String regtype, size_t lines)
return false;
}
const char *p = regtype.data+1;
- reg->y_width = getdigits_int((char_u **)&p)-1;
+ reg->y_width = getdigits_int((char_u **)&p, false, 1) - 1;
if (regtype.size > (size_t)(p-regtype.data)) {
return false;
}
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 58398fa244..3ccc67eb14 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -1585,7 +1585,7 @@ int do_set(
*/
else if (varp == (char_u *)&p_bs
&& ascii_isdigit(**(char_u **)varp)) {
- i = getdigits_int((char_u **)varp);
+ i = getdigits_int((char_u **)varp, true, 0);
switch (i) {
case 0:
*(char_u **)varp = empty_option;
@@ -1613,7 +1613,7 @@ int do_set(
else if (varp == (char_u *)&p_ww
&& ascii_isdigit(*arg)) {
*errbuf = NUL;
- i = getdigits_int(&arg);
+ i = getdigits_int(&arg, true, 0);
if (i & 1) {
STRCAT(errbuf, "b,");
}
@@ -3053,7 +3053,7 @@ ambw_end:
if (*++s == '-') { // ignore a '-'
s++;
}
- wid = getdigits_int(&s);
+ wid = getdigits_int(&s, true, 0);
if (wid && *s == '(' && (errmsg = check_stl_option(p_ruf)) == NULL) {
ru_wid = wid;
} else {
@@ -3440,7 +3440,7 @@ char_u *check_colorcolumn(win_T *wp)
if (!ascii_isdigit(*s)) {
return e_invarg;
}
- col = col * getdigits_int(&s);
+ col = col * getdigits_int(&s, true, 0);
if (wp->w_buffer->b_p_tw == 0) {
goto skip; // 'textwidth' not set, skip this item
}
@@ -3455,7 +3455,7 @@ char_u *check_colorcolumn(win_T *wp)
goto skip;
}
} else if (ascii_isdigit(*s)) {
- col = getdigits_int(&s);
+ col = getdigits_int(&s, true, 0);
} else {
return e_invarg;
}
@@ -7109,12 +7109,12 @@ static bool briopt_check(win_T *wp)
&& ((p[6] == '-' && ascii_isdigit(p[7])) || ascii_isdigit(p[6])))
{
p += 6;
- bri_shift = getdigits_int(&p);
+ bri_shift = getdigits_int(&p, true, 0);
}
else if (STRNCMP(p, "min:", 4) == 0 && ascii_isdigit(p[4]))
{
p += 4;
- bri_min = getdigits_int(&p);
+ bri_min = getdigits_int(&p, true, 0);
}
else if (STRNCMP(p, "sbr", 3) == 0)
{
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index 37d71699dd..9bc7ef07eb 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -3105,23 +3105,26 @@ static int read_limits(long *minval, long *maxval)
long tmp;
if (*regparse == '-') {
- /* Starts with '-', so reverse the range later */
+ // Starts with '-', so reverse the range later.
regparse++;
reverse = TRUE;
}
first_char = regparse;
- *minval = getdigits_long(&regparse);
- if (*regparse == ',') { /* There is a comma */
- if (ascii_isdigit(*++regparse))
- *maxval = getdigits_long(&regparse);
- else
+ *minval = getdigits_long(&regparse, false, 0);
+ if (*regparse == ',') { // There is a comma.
+ if (ascii_isdigit(*++regparse)) {
+ *maxval = getdigits_long(&regparse, false, MAX_LIMIT);
+ } else {
*maxval = MAX_LIMIT;
- } else if (ascii_isdigit(*first_char))
- *maxval = *minval; /* It was \{n} or \{-n} */
- else
- *maxval = MAX_LIMIT; /* It was \{} or \{-} */
- if (*regparse == '\\')
- regparse++; /* Allow either \{...} or \{...\} */
+ }
+ } else if (ascii_isdigit(*first_char)) {
+ *maxval = *minval; // It was \{n} or \{-n}
+ } else {
+ *maxval = MAX_LIMIT; // It was \{} or \{-}
+ }
+ if (*regparse == '\\') {
+ regparse++; // Allow either \{...} or \{...\}
+ }
if (*regparse != '}') {
sprintf((char *)IObuff, _("E554: Syntax error in %s{...}"),
reg_magic == MAGIC_ALL ? "" : "\\");
diff --git a/src/nvim/sign.c b/src/nvim/sign.c
index 16ab00a52b..23dd447744 100644
--- a/src/nvim/sign.c
+++ b/src/nvim/sign.c
@@ -1130,7 +1130,7 @@ static int parse_sign_cmd_args(
// first arg could be placed sign id
arg1 = arg;
if (ascii_isdigit(*arg)) {
- *signid = getdigits_int(&arg);
+ *signid = getdigits_int(&arg, true, 0);
if (!ascii_iswhite(*arg) && *arg != NUL) {
*signid = -1;
arg = arg1;
@@ -1182,7 +1182,7 @@ static int parse_sign_cmd_args(
} else if (STRNCMP(arg, "buffer=", 7) == 0) {
arg += 7;
filename = arg;
- *buf = buflist_findnr(getdigits_int(&arg));
+ *buf = buflist_findnr(getdigits_int(&arg, true, 0));
if (*skipwhite(arg) != NUL) {
EMSG(_(e_trailing));
}
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index 0cde781fc3..724a0332bc 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -2706,18 +2706,20 @@ int spell_check_sps(void)
f = 0;
if (ascii_isdigit(*buf)) {
s = buf;
- sps_limit = getdigits_int(&s);
- if (*s != NUL && !ascii_isdigit(*s))
+ sps_limit = getdigits_int(&s, true, 0);
+ if (*s != NUL && !ascii_isdigit(*s)) {
f = -1;
- } else if (STRCMP(buf, "best") == 0)
+ }
+ } else if (STRCMP(buf, "best") == 0) {
f = SPS_BEST;
- else if (STRCMP(buf, "fast") == 0)
+ } else if (STRCMP(buf, "fast") == 0) {
f = SPS_FAST;
- else if (STRCMP(buf, "double") == 0)
+ } else if (STRCMP(buf, "double") == 0) {
f = SPS_DOUBLE;
- else if (STRNCMP(buf, "expr:", 5) != 0
- && STRNCMP(buf, "file:", 5) != 0)
+ } else if (STRNCMP(buf, "expr:", 5) != 0
+ && STRNCMP(buf, "file:", 5) != 0) {
f = -1;
+ }
if (f == -1 || (sps_flags != 0 && f != 0)) {
sps_flags = SPS_BEST;
diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c
index 405e390589..01daafa09e 100644
--- a/src/nvim/spellfile.c
+++ b/src/nvim/spellfile.c
@@ -1833,24 +1833,30 @@ int spell_check_msm(void)
if (!ascii_isdigit(*p))
return FAIL;
// block count = (value * 1024) / SBLOCKSIZE (but avoid overflow)
- start = (getdigits_long(&p) * 10) / (SBLOCKSIZE / 102);
- if (*p != ',')
+ start = (getdigits_long(&p, true, 0) * 10) / (SBLOCKSIZE / 102);
+ if (*p != ',') {
return FAIL;
- ++p;
- if (!ascii_isdigit(*p))
+ }
+ p++;
+ if (!ascii_isdigit(*p)) {
return FAIL;
- incr = (getdigits_long(&p) * 102) / (SBLOCKSIZE / 10);
- if (*p != ',')
+ }
+ incr = (getdigits_long(&p, true, 0) * 102) / (SBLOCKSIZE / 10);
+ if (*p != ',') {
return FAIL;
- ++p;
- if (!ascii_isdigit(*p))
+ }
+ p++;
+ if (!ascii_isdigit(*p)) {
return FAIL;
- added = getdigits_long(&p) * 1024;
- if (*p != NUL)
+ }
+ added = getdigits_long(&p, true, 0) * 1024;
+ if (*p != NUL) {
return FAIL;
+ }
- if (start == 0 || incr == 0 || added == 0 || incr > start)
+ if (start == 0 || incr == 0 || added == 0 || incr > start) {
return FAIL;
+ }
compress_start = start;
compress_inc = incr;
@@ -2787,7 +2793,7 @@ static unsigned get_affitem(int flagtype, char_u **pp)
++*pp; // always advance, avoid getting stuck
return 0;
}
- res = getdigits_int(pp);
+ res = getdigits_int(pp, true, 0);
} else {
res = mb_ptr2char_adv((const char_u **)pp);
if (flagtype == AFT_LONG || (flagtype == AFT_CAPLONG
@@ -2906,7 +2912,7 @@ static bool flag_in_afflist(int flagtype, char_u *afflist, unsigned flag)
case AFT_NUM:
for (p = afflist; *p != NUL; ) {
- int digits = getdigits_int(&p);
+ int digits = getdigits_int(&p, true, 0);
assert(digits >= 0);
n = (unsigned int)digits;
if (n == flag)
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index c811fae916..13fcad71fa 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -5038,7 +5038,7 @@ static char_u *get_syn_pattern(char_u *arg, synpat_T *ci)
ci->sp_off_flags |= (1 << idx);
if (idx == SPO_LC_OFF) { /* lc=99 */
end += 3;
- *p = getdigits_int(&end);
+ *p = getdigits_int(&end, true, 0);
/* "lc=" offset automatically sets "ms=" offset */
if (!(ci->sp_off_flags & (1 << SPO_MS_OFF))) {
@@ -5048,11 +5048,11 @@ static char_u *get_syn_pattern(char_u *arg, synpat_T *ci)
} else { /* yy=x+99 */
end += 4;
if (*end == '+') {
- ++end;
- *p = getdigits_int(&end); /* positive offset */
+ end++;
+ *p = getdigits_int(&end, true, 0); // positive offset
} else if (*end == '-') {
- ++end;
- *p = -getdigits_int(&end); /* negative offset */
+ end++;
+ *p = -getdigits_int(&end, true, 0); // negative offset
}
}
if (*end != ',')
@@ -5118,7 +5118,7 @@ static void syn_cmd_sync(exarg_T *eap, int syncing)
illegal = TRUE;
break;
}
- n = getdigits_long(&arg_end);
+ n = getdigits_long(&arg_end, false, 0);
if (!eap->skip) {
if (key[4] == 'B')
curwin->w_s->b_syn_sync_linebreaks = n;
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 7b6083cf29..1e6de73549 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -5974,15 +5974,17 @@ file_name_in_line (
if (file_lnum != NULL) {
char_u *p;
- /* Get the number after the file name and a separator character */
+ // Get the number after the file name and a separator character.
p = ptr + len;
p = skipwhite(p);
if (*p != NUL) {
- if (!isdigit(*p))
- ++p; /* skip the separator */
+ if (!isdigit(*p)) {
+ p++; // skip the separator
+ }
p = skipwhite(p);
- if (isdigit(*p))
- *file_lnum = getdigits_long(&p);
+ if (isdigit(*p)) {
+ *file_lnum = getdigits_long(&p, false, 0);
+ }
}
}