diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/buffer.c | 17 | ||||
| -rw-r--r-- | src/nvim/change.c | 2 | ||||
| -rw-r--r-- | src/nvim/charset.c | 68 | ||||
| -rw-r--r-- | src/nvim/cursor_shape.c | 12 | ||||
| -rw-r--r-- | src/nvim/diff.c | 20 | ||||
| -rw-r--r-- | src/nvim/digraph.c | 2 | ||||
| -rw-r--r-- | src/nvim/eval.c | 8 | ||||
| -rw-r--r-- | src/nvim/event/socket.c | 4 | ||||
| -rw-r--r-- | src/nvim/ex_cmds.c | 4 | ||||
| -rw-r--r-- | src/nvim/ex_cmds2.c | 2 | ||||
| -rw-r--r-- | src/nvim/ex_docmd.c | 119 | ||||
| -rw-r--r-- | src/nvim/hardcopy.c | 2 | ||||
| -rw-r--r-- | src/nvim/indent_c.c | 38 | ||||
| -rw-r--r-- | src/nvim/menu.c | 12 | ||||
| -rw-r--r-- | src/nvim/ops.c | 2 | ||||
| -rw-r--r-- | src/nvim/option.c | 14 | ||||
| -rw-r--r-- | src/nvim/regexp.c | 27 | ||||
| -rw-r--r-- | src/nvim/sign.c | 4 | ||||
| -rw-r--r-- | src/nvim/spell.c | 16 | ||||
| -rw-r--r-- | src/nvim/spellfile.c | 32 | ||||
| -rw-r--r-- | src/nvim/syntax.c | 12 | ||||
| -rw-r--r-- | src/nvim/window.c | 12 | 
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(®parse); -  if (*regparse == ',') {           /* There is a comma */ -    if (ascii_isdigit(*++regparse)) -      *maxval = getdigits_long(®parse); -    else +  *minval = getdigits_long(®parse, false, 0); +  if (*regparse == ',') {           // There is a comma. +    if (ascii_isdigit(*++regparse)) { +      *maxval = getdigits_long(®parse, 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); +      }      }    } | 
