Hi Bram, The description of "bin" is not added to :help 'nrformats'
Regards, -- thinca <[email protected]> 2016-01-03 1:56 GMT+09:00 Bram Moolenaar <[email protected]>: > > Patch 7.4.1027 > Problem: No support for binary numbers. > Solution: Add "bin" to nrformats. (Jason Schulz) > Files: runtime/doc/change.txt, runtime/doc/eval.txt, > runtime/doc/version7.txt, src/charset.c, src/eval.c, > src/ex_cmds.c, src/ex_getln.c, src/misc2.c, src/ops.c, > src/option.c, src/proto/charset.pro, src/spell.c, > src/testdir/test57.in, src/testdir/test57.ok, > src/testdir/test58.in, src/testdir/test58.ok, > src/testdir/test_increment.in, src/testdir/test_increment.ok, > src/vim.h > > > > *** ../vim-7.4.1026/runtime/doc/change.txt 2015-06-25 13:57:20.025431155 > +0200 > --- runtime/doc/change.txt 2016-01-02 16:43:24.925363296 +0100 > *************** > *** 416,424 **** > additional [count] (so effectively creating a [count] > decrementing sequence). {not in Vi} > > ! The CTRL-A and CTRL-X commands work for (signed) decimal numbers, unsigned > ! octal and hexadecimal numbers and alphabetic characters. This depends on > the > ! 'nrformats' option. > - When 'nrformats' includes "octal", Vim considers numbers starting with a > '0' > to be octal, unless the number includes a '8' or '9'. Other numbers are > decimal and may have a preceding minus sign. > --- 416,429 ---- > additional [count] (so effectively creating a [count] > decrementing sequence). {not in Vi} > > ! The CTRL-A and CTRL-X commands can work for: > ! - signed and unsigned decimal numbers > ! - unsigned binary, octal and hexadecimal numbers > ! - alphabetic characters > ! > ! This depends on the 'nrformats' option: > ! - When 'nrformats' includes "bin", Vim assumes numbers starting with '0b' or > ! '0B' are binary. > - When 'nrformats' includes "octal", Vim considers numbers starting with a > '0' > to be octal, unless the number includes a '8' or '9'. Other numbers are > decimal and may have a preceding minus sign. > *************** > *** 433,439 **** > index. > > For decimals a leading negative sign is considered for incrementing/ > ! decrementing, for octal and hey values, it won't be considered. > > For numbers with leading zeros (including all octal and hexadecimal > numbers), > Vim preserves the number of characters in the number when possible. CTRL-A > on > --- 438,445 ---- > index. > > For decimals a leading negative sign is considered for incrementing/ > ! decrementing, for binary, octal and hex values, it won't be considered. To > ! ignore the sign Visually select the number before using CTRL-A or CTRL-X. > > For numbers with leading zeros (including all octal and hexadecimal > numbers), > Vim preserves the number of characters in the number when possible. CTRL-A > on > *************** > *** 446,451 **** > --- 452,461 ---- > Note that when 'nrformats' includes "octal", decimal numbers with leading > zeros cause mistakes, because they can be confused with octal numbers. > > + Note similarly, when 'nrformats' includes "bin", binary numbers with a > leading > + '0x' or '0X' can be interpreted as hexadecimal rather than binary since '0b' > + are valid hexadecimal digits. > + > The CTRL-A command is very useful in a macro. Example: Use the following > steps to make a numbered list. > > *************** > *** 1703,1709 **** > found here: |sort()|, |uniq()|. > > *:sor* *:sort* > ! :[range]sor[t][!] [i][u][r][n][x][o] [/{pattern}/] > Sort lines in [range]. When no range is given all > lines are sorted. > > --- 1745,1751 ---- > found here: |sort()|, |uniq()|. > > *:sor* *:sort* > ! :[range]sor[t][!] [i][u][r][n][x][o][b] [/{pattern}/] > Sort lines in [range]. When no range is given all > lines are sorted. > > *************** > *** 1723,1728 **** > --- 1765,1773 ---- > With [o] sorting is done on the first octal number in > the line (after or inside a {pattern} match). > > + With [b] sorting is done on the first binary number in > + the line (after or inside a {pattern} match). > + > With [u] only keep the first of a sequence of > identical lines (ignoring case when [i] is used). > Without this flag, a sequence of identical lines > *** ../vim-7.4.1026/runtime/doc/eval.txt 2015-12-28 19:19:41.550241796 > +0100 > --- runtime/doc/eval.txt 2016-01-02 16:44:20.928761810 +0100 > *************** > *** 4942,4948 **** > separated with CR will result in a single long line (unless a > NL appears somewhere). > All NUL characters are replaced with a NL character. > ! When {binary} is equal to "b" binary mode is used: > - When the last line ends in a NL an extra empty list item is > added. > - No CR characters are removed. > --- 4984,4990 ---- > separated with CR will result in a single long line (unless a > NL appears somewhere). > All NUL characters are replaced with a NL character. > ! When {binary} contains "b" binary mode is used: > - When the last line ends in a NL an extra empty list item is > added. > - No CR characters are removed. > *** ../vim-7.4.1026/runtime/doc/version7.txt 2014-03-25 18:23:27.058087691 > +0100 > --- runtime/doc/version7.txt 2016-01-02 16:33:15.963895938 +0100 > *************** > *** 931,937 **** > |spellbadword()| get a badly spelled word > |spellsuggest()| get suggestions for correct spelling > |split()| split a String into a List > ! |str2nr()| convert a string to a number, base 8, 10 or 16 > |stridx()| extra argument: start position > |strridx()| extra argument: start position > |string()| string representation of a List or Dictionary > --- 931,937 ---- > |spellbadword()| get a badly spelled word > |spellsuggest()| get suggestions for correct spelling > |split()| split a String into a List > ! |str2nr()| convert a string to a number, base 2, 8, 10 or 16 > |stridx()| extra argument: start position > |strridx()| extra argument: start position > |string()| string representation of a List or Dictionary > *** ../vim-7.4.1026/src/charset.c 2015-09-01 18:51:35.126294303 +0200 > --- src/charset.c 2016-01-02 17:32:19.537827357 +0100 > *************** > *** 1570,1575 **** > --- 1570,1589 ---- > > #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) || defined(PROTO) > /* > + * skip over binary digits > + */ > + char_u * > + skipbin(q) > + char_u *q; > + { > + char_u *p = q; > + > + while (vim_isbdigit(*p)) /* skip to next non-digit */ > + ++p; > + return p; > + } > + > + /* > * skip over digits and hex characters > */ > char_u * > *************** > *** 1586,1591 **** > --- 1600,1619 ---- > > #if defined(FEAT_EX_EXTRA) || defined(PROTO) > /* > + * skip to bin digit (or NUL after the string) > + */ > + char_u * > + skiptobin(q) > + char_u *q; > + { > + char_u *p = q; > + > + while (*p != NUL && !vim_isbdigit(*p)) /* skip to next digit */ > + ++p; > + return p; > + } > + > + /* > * skip to digit (or NUL after the string) > */ > char_u * > *************** > *** 1641,1646 **** > --- 1669,1685 ---- > || (c >= 'A' && c <= 'F'); > } > > + /* > + * Corollary of vim_isdigit and vim_isxdigit() that can handle > + * characters > 0x100. > + */ > + int > + vim_isbdigit(c) > + int c; > + { > + return (c == '0' || c == '1'); > + } > + > #if defined(FEAT_MBYTE) || defined(PROTO) > /* > * Vim's own character class functions. These exist because many library > *************** > *** 1822,1856 **** > > /* > * 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: > * 0 decimal > * '0' octal > * '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 "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. > * If maxlen > 0, check at a maximum maxlen chars > */ > void > ! vim_str2nr(start, hexp, len, dooct, dohex, nptr, unptr, maxlen) > char_u *start; > ! int *hexp; /* return: type of number 0 = > decimal, 'x' > ! or 'X' is hex, '0' = octal */ > int *len; /* return: detected length of > number */ > ! int dooct; /* recognize octal number */ > ! int dohex; /* recognize hex number */ > long *nptr; /* return: signed result */ > unsigned long *unptr; /* return: unsigned result */ > int maxlen; /* max length of string to check > */ > { > char_u *ptr = start; > ! int hex = 0; /* default is decimal */ > int negative = FALSE; > unsigned long un = 0; > int n; > --- 1861,1897 ---- > > /* > * Convert a string into a long and/or unsigned long, taking care of > ! * 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 "what" contains STR2NR_BIN recognize binary numbers > ! * If "what" contains STR2NR_OCT recognize octal numbers > ! * If "what" contains STR2NR_HEX recognize hex numbers > ! * If "what" contains STR2NR_FORCE always assume bin/oct/hex. > * If maxlen > 0, check at a maximum maxlen chars > */ > void > ! vim_str2nr(start, prep, len, what, nptr, unptr, maxlen) > char_u *start; > ! int *prep; /* return: type of number 0 = > decimal, 'x' > ! or 'X' is hex, '0' = octal, 'b' or 'B' > ! is bin */ > int *len; /* return: detected length of > number */ > ! int what; /* what numbers to recognize */ > long *nptr; /* return: signed result */ > unsigned long *unptr; /* return: unsigned result */ > int maxlen; /* max length of string to check > */ > { > char_u *ptr = start; > ! int pre = 0; /* default is decimal */ > int negative = FALSE; > unsigned long un = 0; > int n; > *************** > *** 1861,1889 **** > ++ptr; > } > > ! /* Recognize hex and octal. */ > if (ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9' > && (maxlen == 0 || maxlen > 1)) > { > ! hex = ptr[1]; > ! if (dohex && (hex == 'X' || hex == 'x') && vim_isxdigit(ptr[2]) > ! && (maxlen == 0 || maxlen > 2)) > ! ptr += 2; /* hexadecimal */ > else > { > ! hex = 0; /* default is decimal */ > ! if (dooct) > { > /* Don't interpret "0", "08" or "0129" as octal. */ > for (n = 1; VIM_ISDIGIT(ptr[n]); ++n) > { > if (ptr[n] > '7') > { > ! hex = 0; /* can't be octal */ > break; > } > if (ptr[n] >= '0') > ! hex = '0'; /* assume octal */ > if (n == maxlen) > break; > } > --- 1902,1938 ---- > ++ptr; > } > > ! /* Recognize hex, octal, and bin. */ > if (ptr[0] == '0' && ptr[1] != '8' && ptr[1] != '9' > && (maxlen == 0 || maxlen > 1)) > { > ! pre = ptr[1]; > ! if ((what & STR2NR_HEX) > ! && (pre == 'X' || pre == 'x') && vim_isxdigit(ptr[2]) > ! && (maxlen == 0 || maxlen > 2)) > ! /* hexadecimal */ > ! ptr += 2; > ! else if ((what & STR2NR_BIN) > ! && (pre == 'B' || pre == 'b') && vim_isbdigit(ptr[2]) > ! && (maxlen == 0 || maxlen > 2)) > ! /* binary */ > ! ptr += 2; > else > { > ! /* decimal or octal, default is decimal */ > ! pre = 0; > ! if (what & STR2NR_OCT) > { > /* Don't interpret "0", "08" or "0129" as octal. */ > for (n = 1; VIM_ISDIGIT(ptr[n]); ++n) > { > if (ptr[n] > '7') > { > ! pre = 0; /* can't be octal */ > break; > } > if (ptr[n] >= '0') > ! pre = '0'; /* assume octal */ > if (n == maxlen) > break; > } > *************** > *** 1892,1901 **** > } > > /* > ! * Do the string-to-numeric conversion "manually" to avoid sscanf > quirks. > ! */ > n = 1; > ! if (hex == '0' || dooct > 1) > { > /* octal */ > while ('0' <= *ptr && *ptr <= '7') > --- 1941,1963 ---- > } > > /* > ! * Do the string-to-numeric conversion "manually" to avoid sscanf quirks. > ! */ > n = 1; > ! if (pre == 'B' || pre == 'b' || what == STR2NR_BIN + STR2NR_FORCE) > ! { > ! /* bin */ > ! if (pre != 0) > ! n += 2; /* skip over "0b" */ > ! while ('0' <= *ptr && *ptr <= '1') > ! { > ! un = 2 * un + (unsigned long)(*ptr - '0'); > ! ++ptr; > ! if (n++ == maxlen) > ! break; > ! } > ! } > ! else if (pre == '0' || what == STR2NR_OCT + STR2NR_FORCE) > { > /* octal */ > while ('0' <= *ptr && *ptr <= '7') > *************** > *** 1906,1915 **** > break; > } > } > ! else if (hex != 0 || dohex > 1) > { > /* hex */ > ! if (hex != 0) > n += 2; /* skip over "0x" */ > while (vim_isxdigit(*ptr)) > { > --- 1968,1977 ---- > break; > } > } > ! else if (pre != 0 || what == STR2NR_HEX + STR2NR_FORCE) > { > /* hex */ > ! if (pre != 0) > n += 2; /* skip over "0x" */ > while (vim_isxdigit(*ptr)) > { > *************** > *** 1931,1938 **** > } > } > > ! if (hexp != NULL) > ! *hexp = hex; > if (len != NULL) > *len = (int)(ptr - start); > if (nptr != NULL) > --- 1993,2000 ---- > } > } > > ! if (prep != NULL) > ! *prep = pre; > if (len != NULL) > *len = (int)(ptr - start); > if (nptr != NULL) > *** ../vim-7.4.1026/src/eval.c 2015-12-31 22:11:40.263983436 +0100 > --- src/eval.c 2016-01-02 17:01:38.645613231 +0100 > *************** > *** 1625,1631 **** > len = 0; > else > /* Recognize a number argument, the others must be strings. */ > ! vim_str2nr(argv[i], NULL, &len, TRUE, TRUE, &n, NULL, 0); > if (len != 0 && len == (int)STRLEN(argv[i])) > { > argvars[i].v_type = VAR_NUMBER; > --- 1625,1631 ---- > len = 0; > else > /* Recognize a number argument, the others must be strings. */ > ! vim_str2nr(argv[i], NULL, &len, STR2NR_ALL, &n, NULL, 0); > if (len != 0 && len == (int)STRLEN(argv[i])) > { > argvars[i].v_type = VAR_NUMBER; > *************** > *** 5139,5145 **** > else > #endif > { > ! vim_str2nr(*arg, NULL, &len, TRUE, TRUE, &n, NULL, 0); > *arg += len; > if (evaluate) > { > --- 5139,5145 ---- > else > #endif > { > ! vim_str2nr(*arg, NULL, &len, STR2NR_ALL, &n, NULL, 0); > *arg += len; > if (evaluate) > { > *************** > *** 18529,18539 **** > int base = 10; > char_u *p; > long n; > > if (argvars[1].v_type != VAR_UNKNOWN) > { > base = get_tv_number(&argvars[1]); > ! if (base != 8 && base != 10 && base != 16) > { > EMSG(_(e_invarg)); > return; > --- 18529,18540 ---- > int base = 10; > char_u *p; > long n; > + int what; > > if (argvars[1].v_type != VAR_UNKNOWN) > { > base = get_tv_number(&argvars[1]); > ! if (base != 2 && base != 8 && base != 10 && base != 16) > { > EMSG(_(e_invarg)); > return; > *************** > *** 18543,18549 **** > 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, 0); > rettv->vval.v_number = n; > } > > --- 18544,18557 ---- > p = skipwhite(get_tv_string(&argvars[0])); > if (*p == '+') > p = skipwhite(p + 1); > ! switch (base) > ! { > ! case 2: what = STR2NR_BIN + STR2NR_FORCE; break; > ! case 8: what = STR2NR_OCT + STR2NR_FORCE; break; > ! case 16: what = STR2NR_HEX + STR2NR_FORCE; break; > ! default: what = 0; > ! } > ! vim_str2nr(p, NULL, NULL, what, &n, NULL, 0); > rettv->vval.v_number = n; > } > > *************** > *** 21349,21355 **** > case VAR_STRING: > if (varp->vval.v_string != NULL) > vim_str2nr(varp->vval.v_string, NULL, NULL, > ! TRUE, TRUE, &n, NULL, 0); > return n; > case VAR_LIST: > EMSG(_("E745: Using a List as a Number")); > --- 21357,21363 ---- > case VAR_STRING: > if (varp->vval.v_string != NULL) > vim_str2nr(varp->vval.v_string, NULL, NULL, > ! STR2NR_ALL, &n, NULL, 0); > return n; > case VAR_LIST: > EMSG(_("E745: Using a List as a Number")); > *** ../vim-7.4.1026/src/ex_cmds.c 2015-12-31 20:46:34.703494577 +0100 > --- src/ex_cmds.c 2016-01-02 17:37:11.258689916 +0100 > *************** > *** 365,372 **** > long deleted; > colnr_T start_col; > colnr_T end_col; > ! int sort_oct; /* sort on octal number */ > ! int sort_hex; /* sort on hex number */ > > /* Sorting one line is really quick! */ > if (count <= 1) > --- 365,372 ---- > long deleted; > colnr_T start_col; > colnr_T end_col; > ! int sort_what = 0; > ! int format_found = 0; > > /* Sorting one line is really quick! */ > if (count <= 1) > *************** > *** 381,387 **** > if (nrs == NULL) > goto sortend; > > ! sort_abort = sort_ic = sort_rx = sort_nr = sort_oct = sort_hex = 0; > > for (p = eap->arg; *p != NUL; ++p) > { > --- 381,387 ---- > if (nrs == NULL) > goto sortend; > > ! sort_abort = sort_ic = sort_rx = sort_nr = 0; > > for (p = eap->arg; *p != NUL; ++p) > { > *************** > *** 392,402 **** > else if (*p == 'r') > sort_rx = TRUE; > else if (*p == 'n') > sort_nr = 2; > else if (*p == 'o') > ! sort_oct = 2; > else if (*p == 'x') > ! sort_hex = 2; > else if (*p == 'u') > unique = TRUE; > else if (*p == '"') /* comment start */ > --- 392,416 ---- > else if (*p == 'r') > sort_rx = TRUE; > else if (*p == 'n') > + { > sort_nr = 2; > + ++format_found; > + } > + else if (*p == 'b') > + { > + sort_what = STR2NR_BIN + STR2NR_FORCE; > + ++format_found; > + } > else if (*p == 'o') > ! { > ! sort_what = STR2NR_OCT + STR2NR_FORCE; > ! ++format_found; > ! } > else if (*p == 'x') > ! { > ! sort_what = STR2NR_HEX + STR2NR_FORCE; > ! ++format_found; > ! } > else if (*p == 'u') > unique = TRUE; > else if (*p == '"') /* comment start */ > *************** > *** 439,453 **** > } > } > > ! /* Can only have one of 'n', 'o' and 'x'. */ > ! if (sort_nr + 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; > > /* > * Make an array with all line numbers. This avoids having to copy all > --- 453,467 ---- > } > } > > ! /* Can only have one of 'n', 'b', 'o' and 'x'. */ > ! if (format_found > 1) > { > EMSG(_(e_invarg)); > goto sortend; > } > > /* From here on "sort_nr" is used as a flag for any number sorting. */ > ! sort_nr += sort_what; > > /* > * Make an array with all line numbers. This avoids having to copy all > *************** > *** 489,496 **** > *s2 = NUL; > /* Sorting on number: Store the number itself. */ > p = s + start_col; > ! if (sort_hex) > s = skiptohex(p); > else > s = skiptodigit(p); > if (s > p && s[-1] == '-') > --- 503,512 ---- > *s2 = NUL; > /* Sorting on number: Store the number itself. */ > p = s + start_col; > ! if (sort_what & STR2NR_HEX) > s = skiptohex(p); > + else if (sort_what & STR2NR_BIN) > + s = skiptobin(p); > else > s = skiptodigit(p); > if (s > p && s[-1] == '-') > *************** > *** 499,506 **** > /* 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, > ! &nrs[lnum - eap->line1].start_col_nr, NULL, > 0); > *s2 = c; > } > else > --- 515,522 ---- > /* empty line should sort before any number */ > nrs[lnum - eap->line1].start_col_nr = -MAXLNUM; > else > ! vim_str2nr(s, NULL, NULL, sort_what, > ! &nrs[lnum - eap->line1].start_col_nr, NULL, 0); > *s2 = c; > } > else > *** ../vim-7.4.1026/src/ex_getln.c 2015-12-31 19:06:56.048081908 +0100 > --- src/ex_getln.c 2016-01-02 17:12:20.654712743 +0100 > *************** > *** 5935,5941 **** > *str = skipwhite(*str); > if (**str == '-' || vim_isdigit(**str)) /* parse "from" part of range > */ > { > ! vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL, 0); > *str += len; > *num1 = (int)num; > first = TRUE; > --- 5935,5941 ---- > *str = skipwhite(*str); > if (**str == '-' || vim_isdigit(**str)) /* parse "from" part of range > */ > { > ! vim_str2nr(*str, NULL, &len, 0, &num, NULL, 0); > *str += len; > *num1 = (int)num; > first = TRUE; > *************** > *** 5944,5950 **** > if (**str == ',') /* parse "to" part of range */ > { > *str = skipwhite(*str + 1); > ! vim_str2nr(*str, NULL, &len, FALSE, FALSE, &num, NULL, 0); > if (len > 0) > { > *num2 = (int)num; > --- 5944,5950 ---- > if (**str == ',') /* parse "to" part of range */ > { > *str = skipwhite(*str + 1); > ! vim_str2nr(*str, NULL, &len, 0, &num, NULL, 0); > if (len > 0) > { > *num2 = (int)num; > *** ../vim-7.4.1026/src/misc2.c 2015-12-31 19:06:56.052081865 +0100 > --- src/misc2.c 2016-01-02 17:12:40.398500540 +0100 > *************** > *** 2780,2786 **** > 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, 0); > bp += l + 5; > break; > } > --- 2780,2786 ---- > bp += 3; /* skip t_xx, xx may be '-' or '>' */ > else if (STRNICMP(bp, "char-", 5) == 0) > { > ! vim_str2nr(bp + 5, NULL, &l, STR2NR_ALL, NULL, NULL, 0); > bp += l + 5; > break; > } > *************** > *** 2812,2818 **** > && VIM_ISDIGIT(last_dash[6])) > { > /* <Char-123> or <Char-033> or <Char-0x33> */ > ! vim_str2nr(last_dash + 6, NULL, NULL, TRUE, TRUE, NULL, &n, > 0); > key = (int)n; > } > else > --- 2812,2818 ---- > && VIM_ISDIGIT(last_dash[6])) > { > /* <Char-123> or <Char-033> or <Char-0x33> */ > ! vim_str2nr(last_dash + 6, NULL, NULL, STR2NR_ALL, NULL, &n, > 0); > key = (int)n; > } > else > *** ../vim-7.4.1026/src/ops.c 2015-12-17 14:04:20.341240206 +0100 > --- src/ops.c 2016-01-02 17:38:53.653588702 +0100 > *************** > *** 5379,5385 **** > int col; > char_u *buf1; > char_u buf2[NUMBUFLEN]; > ! int hex; /* 'X' or 'x': hex; '0': octal */ > static int hexupper = FALSE; /* 0xABC */ > unsigned long n; > unsigned long offset = 0; /* line offset for Ctrl_V mode */ > --- 5379,5385 ---- > int col; > char_u *buf1; > char_u buf2[NUMBUFLEN]; > ! int pre; /* 'X'/'x': hex; '0': octal; 'B'/'b': > bin */ > static int hexupper = FALSE; /* 0xABC */ > unsigned long n; > unsigned long offset = 0; /* line offset for Ctrl_V mode */ > *************** > *** 5390,5395 **** > --- 5390,5396 ---- > int todel; > int dohex; > int dooct; > + int dobin; > int doalp; > int firstdigit; > int subtract; > *************** > *** 5403,5411 **** > --- 5404,5416 ---- > int did_change = FALSE; > pos_T t = curwin->w_cursor; > int maxlen = 0; > + int pos = 0; > + int bit = 0; > + int bits = sizeof(unsigned long) * 8; > > 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" */ > > /* > *************** > *** 5454,5470 **** > ptr = ml_get_curline(); > RLADDSUBFIX(ptr); > > if (dohex) > while (col > 0 && vim_isxdigit(ptr[col])) > --col; > ! if ( dohex > && col > 0 > && (ptr[col] == 'X' > || ptr[col] == 'x') > && ptr[col - 1] == '0' > ! && vim_isxdigit(ptr[col + 1])) > { > ! /* Found hexadecimal number, move to its start. */ > --col; > } > else > --- 5459,5503 ---- > ptr = ml_get_curline(); > RLADDSUBFIX(ptr); > > + if (dobin) > + while (col > 0 && vim_isbdigit(ptr[col])) > + --col; > + > if (dohex) > while (col > 0 && vim_isxdigit(ptr[col])) > --col; > ! > ! if ( dobin > ! && dohex > ! && ! ((col > 0 > ! && (ptr[col] == 'X' > ! || ptr[col] == 'x') > ! && ptr[col - 1] == '0' > ! && vim_isxdigit(ptr[col + 1])))) > ! { > ! > ! /* In case of binary/hexadecimal pattern overlap match, rescan */ > ! > ! col = curwin->w_cursor.col; > ! > ! while (col > 0 && vim_isdigit(ptr[col])) > ! col--; > ! } > ! > ! if (( dohex > && col > 0 > && (ptr[col] == 'X' > || ptr[col] == 'x') > && ptr[col - 1] == '0' > ! && vim_isxdigit(ptr[col + 1])) || > ! ( dobin > ! && col > 0 > ! && (ptr[col] == 'B' > ! || ptr[col] == 'b') > ! && ptr[col - 1] == '0' > ! && vim_isbdigit(ptr[col + 1]))) > { > ! /* Found hexadecimal or binary number, move to its start. */ > --col; > } > else > *************** > *** 5609,5619 **** > : curwin->w_cursor.col - col + 1); > } > > ! vim_str2nr(ptr + col, &hex, &length, dooct, dohex, NULL, &n, > ! maxlen); > > ! /* ignore leading '-' for hex and octal numbers */ > ! if (hex && negative) > { > ++col; > --length; > --- 5642,5655 ---- > : curwin->w_cursor.col - col + 1); > } > > ! vim_str2nr(ptr + col, &pre, &length, > ! 0 + (dobin ? STR2NR_BIN : 0) > ! + (dooct ? STR2NR_OCT : 0) > ! + (dohex ? STR2NR_HEX : 0), > ! NULL, &n, maxlen); > > ! /* ignore leading '-' for hex and octal and bin numbers */ > ! if (pre && negative) > { > ++col; > --length; > *************** > *** 5634,5640 **** > n += (unsigned long)Prenum1; > > /* handle wraparound for decimal numbers */ > ! if (!hex) > { > if (subtract) > { > --- 5670,5676 ---- > n += (unsigned long)Prenum1; > > /* handle wraparound for decimal numbers */ > ! if (!pre) > { > if (subtract) > { > *************** > *** 5706,5730 **** > { > *ptr++ = '-'; > } > ! if (hex) > { > *ptr++ = '0'; > --length; > } > ! if (hex == 'x' || hex == 'X') > { > ! *ptr++ = hex; > --length; > } > > /* > * Put the number characters in buf2[]. > */ > ! if (hex == 0) > sprintf((char *)buf2, "%lu", n); > ! else if (hex == '0') > sprintf((char *)buf2, "%lo", n); > ! else if (hex && hexupper) > sprintf((char *)buf2, "%lX", n); > else > sprintf((char *)buf2, "%lx", n); > --- 5742,5778 ---- > { > *ptr++ = '-'; > } > ! if (pre) > { > *ptr++ = '0'; > --length; > } > ! if (pre == 'b' || pre == 'B' || > ! pre == 'x' || pre == 'X') > { > ! *ptr++ = pre; > --length; > } > > /* > * Put the number characters in buf2[]. > */ > ! if (pre == 'b' || pre == 'B') > ! { > ! /* leading zeros */ > ! for (bit = bits; bit > 0; bit--) > ! if ((n >> (bit - 1)) & 0x1) break; > ! > ! for (pos = 0; bit > 0; bit--) > ! buf2[pos++] = ((n >> (bit - 1)) & 0x1) ? '1' : '0'; > ! > ! buf2[pos] = '\0'; > ! } > ! else if (pre == 0) > sprintf((char *)buf2, "%lu", n); > ! else if (pre == '0') > sprintf((char *)buf2, "%lo", n); > ! else if (pre && hexupper) > sprintf((char *)buf2, "%lX", n); > else > sprintf((char *)buf2, "%lx", n); > *************** > *** 5736,5742 **** > * Don't do this when > * the result may look like an octal number. > */ > ! if (firstdigit == '0' && !(dooct && hex == 0)) > while (length-- > 0) > *ptr++ = '0'; > *ptr = NUL; > --- 5784,5790 ---- > * Don't do this when > * the result may look like an octal number. > */ > ! if (firstdigit == '0' && !(dooct && pre == 0)) > while (length-- > 0) > *ptr++ = '0'; > *ptr = NUL; > *************** > *** 6359,6365 **** > #endif > > if (regname != NUL && !valid_yank_reg(regname, FALSE)) > ! return MAUTO; > > get_yank_register(regname, FALSE); > > --- 6407,6413 ---- > #endif > > if (regname != NUL && !valid_yank_reg(regname, FALSE)) > ! return MAUTO; > > get_yank_register(regname, FALSE); > > *** ../vim-7.4.1026/src/option.c 2016-01-01 14:48:00.646893076 +0100 > --- src/option.c 2016-01-02 17:15:26.476715574 +0100 > *************** > *** 1940,1946 **** > {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, > {"nrformats", "nf", P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP, > (char_u *)&p_nf, PV_NF, > ! {(char_u *)"octal,hex", (char_u *)0L} > SCRIPTID_INIT}, > {"number", "nu", P_BOOL|P_VI_DEF|P_RWIN, > (char_u *)VAR_WIN, PV_NU, > --- 1940,1946 ---- > {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, > {"nrformats", "nf", P_STRING|P_ALLOCED|P_VI_DEF|P_ONECOMMA|P_NODUP, > (char_u *)&p_nf, PV_NF, > ! {(char_u *)"bin,octal,hex", (char_u *)0L} > SCRIPTID_INIT}, > {"number", "nu", P_BOOL|P_VI_DEF|P_RWIN, > (char_u *)VAR_WIN, PV_NU, > *************** > *** 3031,3037 **** > static char *(p_ambw_values[]) = {"single", "double", NULL}; > #endif > static char *(p_bg_values[]) = {"light", "dark", NULL}; > ! static char *(p_nf_values[]) = {"octal", "hex", "alpha", NULL}; > static char *(p_ff_values[]) = {FF_UNIX, FF_DOS, FF_MAC, NULL}; > #ifdef FEAT_CRYPT > static char *(p_cm_values[]) = {"zip", "blowfish", "blowfish2", NULL}; > --- 3031,3037 ---- > static char *(p_ambw_values[]) = {"single", "double", NULL}; > #endif > static char *(p_bg_values[]) = {"light", "dark", NULL}; > ! static char *(p_nf_values[]) = {"bin", "octal", "hex", "alpha", NULL}; > static char *(p_ff_values[]) = {FF_UNIX, FF_DOS, FF_MAC, NULL}; > #ifdef FEAT_CRYPT > static char *(p_cm_values[]) = {"zip", "blowfish", "blowfish2", NULL}; > *************** > *** 4579,4585 **** > { > /* Allow negative (for 'undolevels'), octal and > * hex numbers. */ > ! vim_str2nr(arg, NULL, &i, TRUE, TRUE, &value, > NULL, 0); > if (arg[i] != NUL && !vim_iswhite(arg[i])) > { > errmsg = e_invarg; > --- 4579,4586 ---- > { > /* Allow negative (for 'undolevels'), octal and > * hex numbers. */ > ! vim_str2nr(arg, NULL, &i, STR2NR_ALL, > ! &value, NULL, 0); > if (arg[i] != NUL && !vim_iswhite(arg[i])) > { > errmsg = e_invarg; > *** ../vim-7.4.1026/src/proto/charset.pro 2015-07-17 13:03:42.108357465 > +0200 > --- src/proto/charset.pro 2016-01-02 17:15:43.000537982 +0100 > *************** > *** 36,46 **** > --- 36,49 ---- > void getvcols __ARGS((win_T *wp, pos_T *pos1, pos_T *pos2, colnr_T *left, > colnr_T *right)); > char_u *skipwhite __ARGS((char_u *q)); > char_u *skipdigits __ARGS((char_u *q)); > + char_u *skipbin __ARGS((char_u *q)); > char_u *skiphex __ARGS((char_u *q)); > + char_u *skiptobin __ARGS((char_u *q)); > char_u *skiptodigit __ARGS((char_u *q)); > char_u *skiptohex __ARGS((char_u *q)); > int vim_isdigit __ARGS((int c)); > int vim_isxdigit __ARGS((int c)); > + int vim_isbdigit __ARGS((int c)); > int vim_islower __ARGS((int c)); > int vim_isupper __ARGS((int c)); > int vim_toupper __ARGS((int c)); > *************** > *** 49,55 **** > char_u *skiptowhite_esc __ARGS((char_u *p)); > long getdigits __ARGS((char_u **pp)); > int vim_isblankline __ARGS((char_u *lbuf)); > ! void vim_str2nr __ARGS((char_u *start, int *hexp, int *len, int dooct, int > dohex, long *nptr, unsigned long *unptr, int strlen)); > int hex2nr __ARGS((int c)); > int hexhex2nr __ARGS((char_u *p)); > int rem_backslash __ARGS((char_u *str)); > --- 52,58 ---- > char_u *skiptowhite_esc __ARGS((char_u *p)); > long getdigits __ARGS((char_u **pp)); > int vim_isblankline __ARGS((char_u *lbuf)); > ! void vim_str2nr __ARGS((char_u *start, int *prep, int *len, int what, long > *nptr, unsigned long *unptr, int maxlen)); > int hex2nr __ARGS((int c)); > int hexhex2nr __ARGS((char_u *p)); > int rem_backslash __ARGS((char_u *str)); > *** ../vim-7.4.1026/src/spell.c 2015-07-21 17:53:11.585527913 +0200 > --- src/spell.c 2016-01-02 17:42:40.063153829 +0100 > *************** > *** 1047,1053 **** > * julifeest". */ > if (*ptr >= '0' && *ptr <= '9') > { > ! if (*ptr == '0' && (ptr[1] == 'x' || ptr[1] == 'X')) > mi.mi_end = skiphex(ptr + 2); > else > mi.mi_end = skipdigits(ptr); > --- 1047,1055 ---- > * julifeest". */ > if (*ptr >= '0' && *ptr <= '9') > { > ! 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); > *************** > *** 15612,15618 **** > > /* enable spelling locally in the new window */ > set_option_value((char_u*)"spell", TRUE, (char_u*)"", OPT_LOCAL); > ! set_option_value((char_u*)"spl", dummy, spl, OPT_LOCAL); > vim_free(spl); > > if (!bufempty() || !buf_valid(curbuf)) > --- 15614,15620 ---- > > /* enable spelling locally in the new window */ > set_option_value((char_u*)"spell", TRUE, (char_u*)"", OPT_LOCAL); > ! set_option_value((char_u*)"spl", dummy, spl, OPT_LOCAL); > vim_free(spl); > > if (!bufempty() || !buf_valid(curbuf)) > *** ../vim-7.4.1026/src/testdir/test57.in 2010-10-15 20:12:23.000000000 > +0200 > --- src/testdir/test57.in 2016-01-02 16:33:15.975895809 +0100 > *************** > *** 30,35 **** > --- 30,37 ---- > :/^t25:/+1,/^t26/-1sort/\d\d/rn > :/^t26:/+1,/^t27/-1sort/\d\d/rx > :/^t27:/+1,/^t28/-1sort no > + :/^t28:/+1,/^t29/-1sort b > + :/^t29:/+1,/^t30/-1sort b > :/^t01:/,$wq! test.out > ENDTEST > > *************** > *** 494,500 **** > b322b > b321 > b321b > > > ! t28: done > ! > --- 496,533 ---- > b322b > b321 > b321b > + t28: binary > > > ! 0b111000 > ! 0b101100 > ! 0b101001 > ! 0b101001 > ! 0b101000 > ! 0b000000 > ! 0b001000 > ! 0b010000 > ! 0b101000 > ! 0b100000 > ! 0b101010 > ! 0b100010 > ! 0b100100 > ! 0b100010 > ! t29: binary with leading characters > ! > ! > ! 0b100010 > ! 0b010000 > ! 0b101001 > ! b0b101100 > ! 0b100010 > ! 0b100100 > ! a0b001000 > ! 0b101000 > ! 0b101000 > ! a0b101001 > ! ab0b100000 > ! 0b101010 > ! 0b000000 > ! b0b111000 > ! t30: done > *** ../vim-7.4.1026/src/testdir/test57.ok 2010-10-15 20:11:42.000000000 > +0200 > --- src/testdir/test57.ok 2016-01-02 16:33:15.975895809 +0100 > *************** > *** 453,459 **** > b322b > b321 > b321b > > > ! t28: done > > --- 453,490 ---- > b322b > b321 > b321b > + t28: binary > > > ! 0b000000 > ! 0b001000 > ! 0b010000 > ! 0b100000 > ! 0b100010 > ! 0b100010 > ! 0b100100 > ! 0b101000 > ! 0b101000 > ! 0b101001 > ! 0b101001 > ! 0b101010 > ! 0b101100 > ! 0b111000 > ! t29: binary with leading characters > > + > + 0b000000 > + a0b001000 > + 0b010000 > + ab0b100000 > + 0b100010 > + 0b100010 > + 0b100100 > + 0b101000 > + 0b101000 > + 0b101001 > + a0b101001 > + 0b101010 > + b0b101100 > + b0b111000 > + t30: done > *** ../vim-7.4.1026/src/testdir/test58.in 2013-07-17 17:27:42.000000000 > +0200 > --- src/testdir/test58.in 2016-01-02 16:33:15.975895809 +0100 > *************** > *** 104,109 **** > --- 104,111 ---- > :" > :" NOSLITSUGS > :call TestOne('8', '8') > + :" Numbers > + :call TestOne('9', '9') > :" > :" clean up for valgrind > :delfunc TestOne > *************** > *** 636,639 **** > --- 638,656 ---- > badend > > > + Test Numbers > + > + 9affstart > + 9affend > + > + 9dicstart > + 1234 > + foo > + bar > + 9dicend > + > + 9good: 0b1011 0777 1234 0x01ff > + badend > + > + > test output: > *** ../vim-7.4.1026/src/testdir/test58.ok 2010-05-15 13:04:10.000000000 > +0200 > --- src/testdir/test58.ok 2016-01-02 16:33:15.975895809 +0100 > *************** > *** 281,283 **** > --- 281,289 ---- > ['faabar', 'foo bar', 'bar'] > barfoo > ['bar foo', 'bar', 'foo'] > + > + test 9-9 > + # file: Xtest.latin1.spl > + bar > + foo > + ------- > *** ../vim-7.4.1026/src/testdir/test_increment.in 2015-09-01 > 18:51:35.126294303 +0200 > --- src/testdir/test_increment.in 2016-01-02 16:33:15.975895809 +0100 > *************** > *** 286,291 **** > --- 286,334 ---- > 1) Ctrl-V f3 <ctrl-a> > 0x124456 > > + 22) Block increment on 0b0 > + Text: > + 0b1 > + 0b1 > + Expected: > + 1) Ctrl-A on visually block selected region (cursor at beginning): > + 0b10 > + 0b10 > + 2) Ctrl-A on visually block selected region (cursor at end) > + 0b10 > + 0b10 > + > + 23) block-wise increment on part of binary > + Text: > + 0b1001 > + > + Expected: > + 1) Ctrl-V 5l <ctrl-a> > + 0b1011 > + > + 24) increment hexadecimal > + Text: > + 0x0b1001 > + > + Expected: > + 1) <ctrl-a> > + 0x0b1002 > + > + 25) increment binary with nrformats including alpha > + Text: > + 0b1001a > + > + Expected: > + 1) <ctrl-a> > + 0b1010a > + > + 26) increment binary with 64 bits > + Text: > + 0b1111111111111111111111111111111111111111111111111111111111111110 > + > + Expected: > + 1) <ctrl-a> > + 0b1111111111111111111111111111111111111111111111111111111111111111 > > > STARTTEST > *************** > *** 415,420 **** > --- 458,495 ---- > :set nrformats&vim > f3 > > + :" Test 22 > + :/^S22=/+,/^E22=/-y a > + :/^E22=/+put a > + k j$ j:.+put a > + k$ + > + > + :" Test 23 > + :/^S23=/+,/^E23=/-y a > + :/^E23=/+put a > + :set nrformats&vim > + 4l > + > + :" Test 24 > + :/^S24=/+,/^E24=/-y a > + :/^E24=/+put a > + :set nrformats&vim > + $ > + > + :" Test 25 > + :set nrformats+=alpha > + :/^S25=/+,/^E25=/-y a > + :/^E25=/+put a > + k$ > + :set nrformats&vim > + > + :" Test 26 > + :set nrformats+=alpha > + :/^S26=/+,/^E26=/-y a > + :/^E26=/+put a > + k$ > + :set nrformats&vim > + > :" Save the report > :/^# Test 1/,$w! test.out > :qa! > *************** > *** 615,620 **** > --- 690,734 ---- > > > > + # Test 22 > + S22==== > + 0b1 > + 0b1 > + E22==== > + > + > + > + > + # Test 23 > + S23==== > + 0b1001 > + E23==== > + > + > + > + > + # Test 24 > + S24==== > + 0x0b1001 > + E24==== > + > + > + > + > + # Test 25 > + S25==== > + 0b1001a > + E25==== > + > + > + > + > + # Test 26 > + S26==== > + 0b1111111111111111111111111111111111111111111111111111111111111110 > + E26==== > + > + > > ENDTEST > > *** ../vim-7.4.1026/src/testdir/test_increment.ok 2015-09-01 > 18:51:35.126294303 +0200 > --- src/testdir/test_increment.ok 2016-01-02 16:33:15.975895809 +0100 > *************** > *** 288,293 **** > --- 288,340 ---- > 0x124456 > > > + # Test 22 > + S22==== > + 0b1 > + 0b1 > + E22==== > + > + 0b10 > + 0b10 > + > + 0b10 > + 0b10 > + > + > + # Test 23 > + S23==== > + 0b1001 > + E23==== > + > + 0b1011 > + > + > + > + # Test 24 > + S24==== > + 0x0b1001 > + E24==== > + > + 0x0b1002 > + > + > + > + # Test 25 > + S25==== > + 0b1001a > + E25==== > + > + 0b1010a > + > + > + > + # Test 26 > + S26==== > + 0b1111111111111111111111111111111111111111111111111111111111111110 > + E26==== > + > + 0b1111111111111111111111111111111111111111111111111111111111111111 > + > > ENDTEST > > *** ../vim-7.4.1026/src/vim.h 2015-12-31 19:06:56.040081995 +0100 > --- src/vim.h 2016-01-02 17:06:14.334649984 +0100 > *************** > *** 392,398 **** > # endif > #endif > > ! #define NUMBUFLEN 30 /* length of a buffer to store a number in ASCII > */ > > /* > * Shorthand for unsigned variables. Many systems, but not all, have u_char > --- 392,406 ---- > # endif > #endif > > ! /* length of a buffer to store a number in ASCII (64 bits binary + NUL) */ > ! #define NUMBUFLEN 65 > ! > ! /* flags for vim_str2nr() */ > ! #define STR2NR_BIN 1 > ! #define STR2NR_OCT 2 > ! #define STR2NR_HEX 4 > ! #define STR2NR_ALL (STR2NR_BIN + STR2NR_OCT + STR2NR_HEX) > ! #define STR2NR_FORCE 8 /* only when ONE of the above is used */ > > /* > * Shorthand for unsigned variables. Many systems, but not all, have u_char > *** ../vim-7.4.1026/src/version.c 2016-01-02 16:00:15.893121887 +0100 > --- src/version.c 2016-01-02 17:24:59.438557762 +0100 > *************** > *** 743,744 **** > --- 743,746 ---- > { /* Add new patch number below this line */ > + /**/ > + 1027, > /**/ > > -- > TIM: But follow only if you are men of valour. For the entrance to this cave > is guarded by a monster, a creature so foul and cruel that no man yet has > fought with it and lived. Bones of full fifty men lie strewn about its > lair ... > "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD > > /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\ > /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ > \\\ an exciting new programming language -- http://www.Zimbu.org /// > \\\ help me help AIDS victims -- http://ICCF-Holland.org /// > > -- > -- > You received this message from the "vim_dev" maillist. > Do not top-post! Type your reply below the text you are replying to. > For more information, visit http://www.vim.org/maillist.php > > --- > You received this message because you are subscribed to the Google Groups > "vim_dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
