aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/ascii.h8
-rw-r--r--src/nvim/charset.c85
-rw-r--r--src/nvim/eval.c10
-rw-r--r--src/nvim/ex_cmds.c15
-rw-r--r--src/nvim/ex_getln.c4
-rw-r--r--src/nvim/keymap.c4
-rw-r--r--src/nvim/message.c45
-rw-r--r--src/nvim/ops.c80
-rw-r--r--src/nvim/option.c4
-rw-r--r--src/nvim/options.lua2
-rw-r--r--src/nvim/spell.c4
-rw-r--r--src/nvim/vim.h2
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