diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/ascii.h | 8 | ||||
-rw-r--r-- | src/nvim/charset.c | 85 | ||||
-rw-r--r-- | src/nvim/eval.c | 10 | ||||
-rw-r--r-- | src/nvim/ex_cmds.c | 15 | ||||
-rw-r--r-- | src/nvim/ex_getln.c | 4 | ||||
-rw-r--r-- | src/nvim/keymap.c | 4 | ||||
-rw-r--r-- | src/nvim/message.c | 45 | ||||
-rw-r--r-- | src/nvim/ops.c | 80 | ||||
-rw-r--r-- | src/nvim/option.c | 4 | ||||
-rw-r--r-- | src/nvim/options.lua | 2 | ||||
-rw-r--r-- | src/nvim/spell.c | 4 | ||||
-rw-r--r-- | src/nvim/vim.h | 2 |
12 files changed, 200 insertions, 63 deletions
diff --git a/src/nvim/ascii.h b/src/nvim/ascii.h index 2b3e94d5a0..9938d1b328 100644 --- a/src/nvim/ascii.h +++ b/src/nvim/ascii.h @@ -122,6 +122,14 @@ static inline bool ascii_isxdigit(int c) || (c >= 'A' && c <= 'F'); } +/// Checks if `c` is a binary digit, that is, 0-1. +/// +/// @see {ascii_isdigit} +static inline bool ascii_isbdigit(int c) +{ + return (c == '0' || c == '1'); +} + /// Checks if `c` is a white-space character, that is, /// one of \f, \n, \r, \t, \v. /// diff --git a/src/nvim/charset.c b/src/nvim/charset.c index b93eafbf60..48046c9f17 100644 --- a/src/nvim/charset.c +++ b/src/nvim/charset.c @@ -1454,6 +1454,20 @@ char_u* skipdigits(char_u *q) return p; } +/// skip over binary digits +/// +/// @param q +/// +/// @return Pointer to the character after the skipped digits. +char_u* skipbin(char_u *q) +{ + char_u *p = q; + + while (ascii_isbdigit(*p)) /* skip to next non-digit */ + ++p; + return p; +} + /// skip over digits and hex characters /// /// @param q @@ -1485,6 +1499,20 @@ char_u* skiptodigit(char_u *q) return p; } +/// skip to binary character (or NUL after the string) +/// +/// @param q +/// +/// @return Pointer to the binary character or (NUL after the string). +char_u* skiptobin(char_u *q) +{ + char_u *p = q; + + while (*p != NUL && !ascii_isbdigit(*p)) /* skip to next digit */ + ++p; + return p; +} + /// skip to hex character (or NUL after the string) /// /// @param q @@ -1720,33 +1748,38 @@ int vim_isblankline(char_u *lbuf) } /// Convert a string into a long and/or unsigned long, taking care of -/// hexadecimal and octal numbers. Accepts a '-' sign. -/// If "hexp" is not NULL, returns a flag to indicate the type of the number: +/// hexadecimal, octal and binary numbers. Accepts a '-' sign. +/// If "prep" is not NULL, returns a flag to indicate the type of the number: /// 0 decimal /// '0' octal +/// 'B' bin +/// 'b' bin /// 'X' hex /// 'x' hex /// If "len" is not NULL, the length of the number in characters is returned. /// If "nptr" is not NULL, the signed result is returned in it. /// If "unptr" is not NULL, the unsigned result is returned in it. +/// If "dobin" is non-zero recognize binary numbers, when > 1 always assume +/// binary number. /// If "dooct" is non-zero recognize octal numbers, when > 1 always assume /// octal number. /// If "dohex" is non-zero recognize hex numbers, when > 1 always assume /// hex number. /// /// @param start -/// @param hexp Returns type of number 0 = decimal, 'x' or 'X' is hex, -// '0' = octal +/// @param prep Returns type of number 0 = decimal, 'x' or 'X' is hex, +// '0' = octal, 'b' or 'B' is bin /// @param len Returns the detected length of number. +/// @param dobin recognize binary number /// @param dooct recognize octal number /// @param dohex recognize hex number /// @param nptr Returns the signed result. /// @param unptr Returns the unsigned result. -void vim_str2nr(char_u *start, int *hexp, int *len, int dooct, int dohex, +void vim_str2nr(char_u *start, int *prep, int *len, int dobin, int dooct, int dohex, long *nptr, unsigned long *unptr) { char_u *ptr = start; - int hex = 0; // default is decimal + int pre = 0; // default is decimal int negative = FALSE; unsigned long un = 0; int n; @@ -1756,31 +1789,35 @@ void vim_str2nr(char_u *start, int *hexp, int *len, int dooct, int dohex, ++ptr; } - // Recognize hex and octal. + // Recognize hex, octal, and bin. if ((ptr[0] == '0') && (ptr[1] != '8') && (ptr[1] != '9')) { - hex = ptr[1]; + pre = ptr[1]; if (dohex - && ((hex == 'X') || (hex == 'x')) + && ((pre == 'X') || (pre == 'x')) && ascii_isxdigit(ptr[2])) { // hexadecimal ptr += 2; + } else if (dobin + && ((pre == 'B') || (pre == 'b')) + && ascii_isbdigit(ptr[2])) { + // binary + ptr += 2; } else { // default is decimal - hex = 0; + pre = 0; if (dooct) { // Don't interpret "0", "08" or "0129" as octal. for (n = 1; ascii_isdigit(ptr[n]); ++n) { if (ptr[n] > '7') { // can't be octal - hex = 0; + pre = 0; break; } - if (ptr[n] >= '0') { // assume octal - hex = '0'; + pre = '0'; } } } @@ -1788,28 +1825,38 @@ void vim_str2nr(char_u *start, int *hexp, int *len, int dooct, int dohex, } // Do the string-to-numeric conversion "manually" to avoid sscanf quirks. - if ((hex == '0') || (dooct > 1)) { + if ((pre == 'B') || (pre == 'b') || (dobin > 1)) { + // bin + if (pre != 0) + n += 2; // skip over "0b" + while ('0' <= *ptr && *ptr <= '1') { + un = 2 * un + (unsigned long)(*ptr - '0'); + ++ptr; + } + } else if ((pre == '0') || (dooct > 1)) { // octal while ('0' <= *ptr && *ptr <= '7') { un = 8 * un + (unsigned long)(*ptr - '0'); ptr++; } - } else if ((hex != 0) || (dohex > 1)) { + } else if (pre != 0 || dohex > 1) { // hex + if (pre != 0) + n += 2; // skip over "0x" while (ascii_isxdigit(*ptr)) { un = 16 * un + (unsigned long)hex2nr(*ptr); - ptr++; + ++ptr; } } else { // decimal while (ascii_isdigit(*ptr)) { un = 10 * un + (unsigned long)(*ptr - '0'); - ptr++; + ++ptr; } } - if (hexp != NULL) { - *hexp = hex; + if (prep != NULL) { + *prep = pre; } if (len != NULL) { diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 7ac51d7bd7..479ed2afc9 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -1149,7 +1149,7 @@ call_vim_function ( len = 0; else /* Recognize a number argument, the others must be strings. */ - vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, &n, NULL); + vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, TRUE, &n, NULL); if (len != 0 && len == (int)STRLEN(argv[i])) { argvars[i].v_type = VAR_NUMBER; argvars[i].vval.v_number = n; @@ -4127,7 +4127,7 @@ eval7 ( rettv->vval.v_float = f; } } else { - vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL); + vim_str2nr(*arg, NULL, &len, TRUE, TRUE, TRUE, &n, NULL); *arg += len; if (evaluate) { rettv->v_type = VAR_NUMBER; @@ -15982,7 +15982,7 @@ static void f_str2nr(typval_T *argvars, typval_T *rettv) if (argvars[1].v_type != VAR_UNKNOWN) { base = get_tv_number(&argvars[1]); - if (base != 8 && base != 10 && base != 16) { + if (base != 2 && base != 8 && base != 10 && base != 16) { EMSG(_(e_invarg)); return; } @@ -15991,7 +15991,7 @@ static void f_str2nr(typval_T *argvars, typval_T *rettv) p = skipwhite(get_tv_string(&argvars[0])); if (*p == '+') p = skipwhite(p + 1); - vim_str2nr(p, NULL, NULL, base == 8 ? 2 : 0, base == 16 ? 2 : 0, &n, NULL); + vim_str2nr(p, NULL, NULL, base == 2 ? 2 : 0, base == 8 ? 2 : 0, base == 16 ? 2 : 0, &n, NULL); rettv->vval.v_number = n; } @@ -18273,7 +18273,7 @@ long get_tv_number_chk(typval_T *varp, int *denote) case VAR_STRING: if (varp->vval.v_string != NULL) vim_str2nr(varp->vval.v_string, NULL, NULL, - TRUE, TRUE, &n, NULL); + TRUE, TRUE, TRUE, &n, NULL); return n; case VAR_LIST: EMSG(_("E745: Using a List as a Number")); diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index 34c25589d4..22b243957c 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -348,6 +348,7 @@ void ex_sort(exarg_T *eap) long deleted; colnr_T start_col; colnr_T end_col; + int sort_bin; /* sort on bin number */ int sort_oct; /* sort on octal number */ int sort_hex; /* sort on hex number */ @@ -362,7 +363,7 @@ void ex_sort(exarg_T *eap) regmatch.regprog = NULL; sorti_T *nrs = xmalloc(count * sizeof(sorti_T)); - sort_abort = sort_ic = sort_rx = sort_nr = sort_oct = sort_hex = 0; + sort_abort = sort_ic = sort_rx = sort_nr = sort_bin = sort_oct = sort_hex = 0; for (p = eap->arg; *p != NUL; ++p) { if (ascii_iswhite(*p)) @@ -373,6 +374,8 @@ void ex_sort(exarg_T *eap) sort_rx = TRUE; else if (*p == 'n') sort_nr = 2; + else if (*p == 'b') + sort_bin = 2; else if (*p == 'o') sort_oct = 2; else if (*p == 'x') @@ -410,14 +413,14 @@ void ex_sort(exarg_T *eap) } } - /* Can only have one of 'n', 'o' and 'x'. */ - if (sort_nr + sort_oct + sort_hex > 2) { + /* Can only have one of 'n', 'b', 'o' and 'x'. */ + if (sort_nr + sort_bin + sort_oct + sort_hex > 2) { EMSG(_(e_invarg)); goto sortend; } /* From here on "sort_nr" is used as a flag for any number sorting. */ - sort_nr += sort_oct + sort_hex; + sort_nr += sort_bin + sort_oct + sort_hex; /* * Make an array with all line numbers. This avoids having to copy all @@ -454,6 +457,8 @@ void ex_sort(exarg_T *eap) p = s + start_col; if (sort_hex) s = skiptohex(p); + else if (sort_bin) + s = skiptobin(p); else s = skiptodigit(p); if (s > p && s[-1] == '-') @@ -462,7 +467,7 @@ void ex_sort(exarg_T *eap) /* empty line should sort before any number */ nrs[lnum - eap->line1].start_col_nr = -MAXLNUM; else - vim_str2nr(s, NULL, NULL, sort_oct, sort_hex, + vim_str2nr(s, NULL, NULL, sort_bin, sort_oct, sort_hex, &nrs[lnum - eap->line1].start_col_nr, NULL); *s2 = c; } else { diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 6d81f3680a..1a9a5bd3ec 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -4780,7 +4780,7 @@ int get_list_range(char_u **str, int *num1, int *num2) *str = skipwhite(*str); if (**str == '-' || ascii_isdigit(**str)) { /* parse "from" part of range */ - vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL); + vim_str2nr(*str, NULL, &len, FALSE, FALSE, FALSE, &num, NULL); *str += len; *num1 = (int)num; first = TRUE; @@ -4788,7 +4788,7 @@ int get_list_range(char_u **str, int *num1, int *num2) *str = skipwhite(*str); if (**str == ',') { /* parse "to" part of range */ *str = skipwhite(*str + 1); - vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL); + vim_str2nr(*str, NULL, &len, FALSE, FALSE, FALSE, &num, NULL); if (len > 0) { *num2 = (int)num; *str = skipwhite(*str + len); diff --git a/src/nvim/keymap.c b/src/nvim/keymap.c index b2fd929714..16b1577f06 100644 --- a/src/nvim/keymap.c +++ b/src/nvim/keymap.c @@ -575,7 +575,7 @@ find_special_key ( if (bp[0] == 't' && bp[1] == '_' && bp[2] && bp[3]) bp += 3; /* skip t_xx, xx may be '-' or '>' */ else if (STRNICMP(bp, "char-", 5) == 0) { - vim_str2nr(bp + 5, NULL, &l, TRUE, TRUE, NULL, NULL); + vim_str2nr(bp + 5, NULL, &l, TRUE, TRUE, TRUE, NULL, NULL); bp += l + 5; break; } @@ -602,7 +602,7 @@ find_special_key ( if (STRNICMP(last_dash + 1, "char-", 5) == 0 && ascii_isdigit(last_dash[6])) { /* <Char-123> or <Char-033> or <Char-0x33> */ - vim_str2nr(last_dash + 6, NULL, NULL, TRUE, TRUE, NULL, &n); + vim_str2nr(last_dash + 6, NULL, NULL, TRUE, TRUE, TRUE, NULL, &n); key = (int)n; } else { /* diff --git a/src/nvim/message.c b/src/nvim/message.c index 66b8b9b5d2..c3c20f793c 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -3037,7 +3037,7 @@ static double tv_float(typval_T *tvs, int *idxp) * http://www.ijs.si/software/snprintf/ * * This snprintf() only supports the following conversion specifiers: - * s, c, d, u, o, x, X, p (and synonyms: i, D, U, O - see below) + * s, c, b, B, d, u, o, x, X, p (and synonyms: i, D, U, O - see below) * with flags: '-', '+', ' ', '0' and '#'. * An asterisk is supported for field width as well as precision. * @@ -3295,8 +3295,8 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs) } break; - case 'd': case 'u': case 'o': case 'x': case 'X': case 'p': { - // u, o, x, X and p conversion specifiers imply the value is unsigned; + case 'd': case 'u': case 'b': case 'B': case 'o': case 'x': case 'X': case 'p': { + // u, b, B, o, x, X and p conversion specifiers imply the value is unsigned; // d implies a signed value // 0 if numeric argument is zero (or if pointer is NULL for 'p'), @@ -3399,7 +3399,8 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs) // leave negative numbers for sprintf to handle, to // avoid handling tricky cases like (short int)-32768 } else if (alternate_form) { - if (arg_sign != 0 && (fmt_spec == 'x' || fmt_spec == 'X') ) { + if (arg_sign != 0 && (fmt_spec == 'x' || fmt_spec == 'X' || + fmt_spec == 'b' || fmt_spec == 'B')) { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = fmt_spec; } @@ -3411,7 +3412,7 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs) precision = 1; // default precision is 1 if (precision == 0 && arg_sign == 0) { // when zero value is formatted with an explicit precision 0, - // resulting formatted string is empty (d, i, u, o, x, X, p) + // resulting formatted string is empty (d, i, u, b, B, o, x, X, p) } else { char f[5]; int f_l = 0; @@ -3441,6 +3442,36 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs) case '2': str_arg_l += sprintf(tmp + str_arg_l, f, long_long_arg); break; } + } else if (fmt_spec == 'b' || fmt_spec == 'B') { + //binary + size_t bits = 0; + switch (length_modifier) { + case '\0': + case 'h': for (bits = sizeof(unsigned) * 8; bits > 0; bits--) + if ((uint_arg >> (bits - 1)) & 0x1) break; + + while (bits > 0) + tmp[str_arg_l++] = ((uint_arg >> --bits) & 0x1) ? '1' : '0'; + break; + case 'l': for (bits = sizeof(unsigned long) * 8; bits > 0; bits--) + if ((ulong_arg >> (bits - 1)) & 0x1) break; + + while (bits > 0) + tmp[str_arg_l++] = ((ulong_arg >> --bits) & 0x1) ? '1' : '0'; + break; + case '2': for (bits = sizeof(unsigned long long) * 8; bits > 0; bits--) + if ((ulong_long_arg >> (bits - 1)) & 0x1) break; + + while (bits > 0) + tmp[str_arg_l++] = ((ulong_long_arg >> --bits) & 0x1) ? '1' : '0'; + break; + case 'z': for (bits = sizeof(size_t) * 8; bits > 0; bits--) + if ((size_t_arg >> (bits - 1)) & 0x1) break; + + while (bits > 0) + tmp[str_arg_l++] = ((size_t_arg >> --bits) & 0x1) ? '1' : '0'; + break; + } } else { // unsigned switch (length_modifier) { @@ -3464,7 +3495,9 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs) if (zero_padding_insertion_ind + 1 < str_arg_l && tmp[zero_padding_insertion_ind] == '0' && (tmp[zero_padding_insertion_ind + 1] == 'x' - || tmp[zero_padding_insertion_ind + 1] == 'X')) + || tmp[zero_padding_insertion_ind + 1] == 'X' + || tmp[zero_padding_insertion_ind + 1] == 'b' + || tmp[zero_padding_insertion_ind + 1] == 'B')) zero_padding_insertion_ind += 2; } diff --git a/src/nvim/ops.c b/src/nvim/ops.c index c3d968ca51..ee86f8fe7a 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -4197,7 +4197,7 @@ int do_addsub(int command, linenr_T Prenum1) int col; char_u *buf1; char_u buf2[NUMBUFLEN]; - int hex; /* 'X' or 'x': hex; '0': octal */ + int pre; /* 'X' or 'x': hex; '0': octal; 'B' or 'b': bin */ static int hexupper = FALSE; /* 0xABC */ unsigned long n, oldn; char_u *ptr; @@ -4206,6 +4206,7 @@ int do_addsub(int command, linenr_T Prenum1) int todel; int dohex; int dooct; + int dobin; int doalp; int firstdigit; int negative; @@ -4213,6 +4214,7 @@ int do_addsub(int command, linenr_T Prenum1) dohex = (vim_strchr(curbuf->b_p_nf, 'x') != NULL); /* "heX" */ dooct = (vim_strchr(curbuf->b_p_nf, 'o') != NULL); /* "Octal" */ + dobin = (vim_strchr(curbuf->b_p_nf, 'b') != NULL); /* "Bin" */ doalp = (vim_strchr(curbuf->b_p_nf, 'p') != NULL); /* "alPha" */ ptr = get_cursor_line_ptr(); @@ -4222,19 +4224,44 @@ int do_addsub(int command, linenr_T Prenum1) * First check if we are on a hexadecimal number, after the "0x". */ col = curwin->w_cursor.col; + + if (dobin) + while (col > 0 && ascii_isbdigit(ptr[col])) + --col; + if (dohex) while (col > 0 && ascii_isxdigit(ptr[col])) --col; - if ( dohex - && col > 0 + if ( dobin + && dohex + && ! ((col > 0 && (ptr[col] == 'X' || ptr[col] == 'x') && ptr[col - 1] == '0' - && ascii_isxdigit(ptr[col + 1])) { - /* - * Found hexadecimal number, move to its start. - */ - --col; + && ascii_isxdigit(ptr[col + 1])))) { + + /* In case of binary/hexadecimal pattern overlap match, rescan */ + + col = curwin->w_cursor.col; + + while (col > 0 && ascii_isdigit(ptr[col])) + col--; + } + + if (( dohex + && col > 0 + && (ptr[col] == 'X' + || ptr[col] == 'x') + && ptr[col - 1] == '0' + && ascii_isxdigit(ptr[col + 1])) || + ( dobin + && col > 0 + && (ptr[col] == 'B' + || ptr[col] == 'b') + && ptr[col - 1] == '0' + && ascii_isbdigit(ptr[col + 1]))) { + /* Found hexadecimal or binary number, move to its start. */ + --col; } else { /* * Search forward and then backward to find the start of number. @@ -4297,10 +4324,10 @@ int do_addsub(int command, linenr_T Prenum1) } /* get the number value (unsigned) */ - vim_str2nr(ptr + col, &hex, &length, dooct, dohex, NULL, &n); + vim_str2nr(ptr + col, &pre, &length, dobin, dooct, dohex, NULL, &n); - /* ignore leading '-' for hex and octal numbers */ - if (hex && negative) { + /* ignore leading '-' for hex, octal and bin numbers */ + if (pre && negative) { ++col; --length; negative = FALSE; @@ -4320,7 +4347,7 @@ int do_addsub(int command, linenr_T Prenum1) n += (unsigned long)Prenum1; /* handle wraparound for decimal numbers */ - if (!hex) { + if (!pre) { if (subtract) { if (n > oldn) { n = 1 + (n ^ (unsigned long)-1); @@ -4370,23 +4397,38 @@ int do_addsub(int command, linenr_T Prenum1) if (negative) { *ptr++ = '-'; } - if (hex) { + if (pre) { *ptr++ = '0'; --length; } - if (hex == 'x' || hex == 'X') { - *ptr++ = hex; + if (pre == 'b' || pre == 'B' + || pre == 'x' || pre == 'X') { + *ptr++ = pre; --length; } /* * Put the number characters in buf2[]. */ - if (hex == 0) + if (pre == 'b' || pre == 'B') { + + size_t bits = 0; + size_t pos = 0; + + /* leading zeros */ + for (bits = 8 * sizeof(unsigned long); bits > 0; bits--) + if ((n >> (bits - 1)) & 0x1) break; + + while (bits > 0) + buf2[pos++] = ((n >> --bits) & 0x1) ? '1' : '0'; + + buf2[pos] = '\0'; + + } else if (pre == 0) sprintf((char *)buf2, "%" PRIu64, (uint64_t)n); - else if (hex == '0') + else if (pre == '0') sprintf((char *)buf2, "%" PRIo64, (uint64_t)n); - else if (hex && hexupper) + else if (pre && hexupper) sprintf((char *)buf2, "%" PRIX64, (uint64_t)n); else sprintf((char *)buf2, "%" PRIx64, (uint64_t)n); @@ -4398,7 +4440,7 @@ int do_addsub(int command, linenr_T Prenum1) * Don't do this when * the result may look like an octal number. */ - if (firstdigit == '0' && !(dooct && hex == 0)) + if (firstdigit == '0' && !(dooct && pre == 0)) while (length-- > 0) *ptr++ = '0'; *ptr = NUL; diff --git a/src/nvim/option.c b/src/nvim/option.c index 2ac1abeeba..4ba5c4deeb 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -260,7 +260,7 @@ typedef struct vimoption { static char *(p_ambw_values[]) = {"single", "double", NULL}; static char *(p_bg_values[]) = {"light", "dark", NULL}; -static char *(p_nf_values[]) = {"octal", "hex", "alpha", NULL}; +static char *(p_nf_values[]) = {"bin", "octal", "hex", "alpha", NULL}; static char *(p_ff_values[]) = {FF_UNIX, FF_DOS, FF_MAC, NULL}; static char *(p_wop_values[]) = {"tagfile", NULL}; static char *(p_wak_values[]) = {"yes", "menu", "no", NULL}; @@ -1431,7 +1431,7 @@ do_set ( } else if (*arg == '-' || ascii_isdigit(*arg)) { // Allow negative (for 'undolevels'), octal and // hex numbers. - vim_str2nr(arg, NULL, &i, true, true, &value, NULL); + vim_str2nr(arg, NULL, &i, true, true, true, &value, NULL); if (arg[i] != NUL && !ascii_iswhite(arg[i])) { errmsg = e_invarg; goto skip; diff --git a/src/nvim/options.lua b/src/nvim/options.lua index 0eccf63e15..3dd37cb5dc 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -1599,7 +1599,7 @@ return { deny_duplicates=true, alloced=true, varname='p_nf', - defaults={if_true={vi="octal,hex", vim="hex"}} + defaults={if_true={vi="bin,octal,hex", vim="bin,hex"}} }, { full_name='number', abbreviation='nu', diff --git a/src/nvim/spell.c b/src/nvim/spell.c index 420e8e2b70..794ae91a19 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -1095,7 +1095,9 @@ spell_check ( // 0X99FF. But always do check spelling to find "3GPP" and "11 // julifeest". if (*ptr >= '0' && *ptr <= '9') { - if (*ptr == '0' && (ptr[1] == 'x' || ptr[1] == 'X')) + if (*ptr == '0' && (ptr[1] == 'b' || ptr[1] == 'B')) + mi.mi_end = skipbin(ptr + 2); + else if (*ptr == '0' && (ptr[1] == 'x' || ptr[1] == 'X')) mi.mi_end = skiphex(ptr + 2); else mi.mi_end = skipdigits(ptr); diff --git a/src/nvim/vim.h b/src/nvim/vim.h index 71d7556880..51ff0b8df9 100644 --- a/src/nvim/vim.h +++ b/src/nvim/vim.h @@ -35,7 +35,7 @@ Error: configure did not run properly.Check auto/config.log. #include "nvim/os/os_defs.h" /* bring lots of system header files */ -#define NUMBUFLEN 30 /* length of a buffer to store a number in ASCII */ +#define NUMBUFLEN 65 /* length of a buffer to store a number in ASCII */ #define MAX_TYPENR 65535 |