Patch 7.4.2221
Problem:    printf() does not support binary format.
Solution:   Add %b and %B. (Ozaki Kiichi)
Files:      runtime/doc/eval.txt, src/message.c, src/testdir/test_expr.vim


*** ../vim-7.4.2220/runtime/doc/eval.txt        2016-08-16 21:30:49.605848229 
+0200
--- runtime/doc/eval.txt        2016-08-16 21:49:46.143645192 +0200
***************
*** 5855,5860 ****
--- 5884,5890 ----
                  %04x  hex number padded with zeros to at least 4 characters
                  %X    hex number using upper case letters
                  %o    octal number
+                 %08b  binary number padded with zeros to at least 8 chars
                  %f    floating point number in the form 123.456
                  %e    floating point number in the form 1.234e3
                  %E    floating point number in the form 1.234E3
***************
*** 5881,5886 ****
--- 5911,5919 ----
                              character of the output string to a zero (except
                              if a zero value is printed with an explicit
                              precision of zero).
+                             For b and B conversions, a non-zero result has
+                             the string "0b" (or "0B" for B conversions)
+                             prepended to it.
                              For x and X conversions, a non-zero result has
                              the string "0x" (or "0X" for X conversions)
                              prepended to it.
***************
*** 5888,5895 ****
                    0 (zero)  Zero padding.  For all conversions the converted
                              value is padded on the left with zeros rather
                              than blanks.  If a precision is given with a
!                             numeric conversion (d, o, x, and X), the 0 flag
!                             is ignored.
  
                    -         A negative field width flag; the converted value
                              is to be left adjusted on the field boundary.
--- 5921,5928 ----
                    0 (zero)  Zero padding.  For all conversions the converted
                              value is padded on the left with zeros rather
                              than blanks.  If a precision is given with a
!                             numeric conversion (d, b, B, o, x, and X), the 0
!                             flag is ignored.
  
                    -         A negative field width flag; the converted value
                              is to be left adjusted on the field boundary.
***************
*** 5901,5907 ****
                              number produced by a signed conversion (d).
  
                    +         A sign must always be placed before a number
!                             produced by a signed conversion.  A + overrides
                              a space if both are used.
  
                field-width
--- 5934,5940 ----
                              number produced by a signed conversion (d).
  
                    +         A sign must always be placed before a number
!                             produced by a signed conversion.  A + overrides
                              a space if both are used.
  
                field-width
***************
*** 5927,5933 ****
  
                A field width or precision, or both, may be indicated by an
                asterisk '*' instead of a digit string.  In this case, a
!               Number argument supplies the field width or precision.  A
                negative field width is treated as a left adjustment flag
                followed by a positive field width; a negative precision is
                treated as though it were missing.  Example: >
--- 5960,5966 ----
  
                A field width or precision, or both, may be indicated by an
                asterisk '*' instead of a digit string.  In this case, a
!               Number argument supplies the field width or precision.  A
                negative field width is treated as a left adjustment flag
                followed by a positive field width; a negative precision is
                treated as though it were missing.  Example: >
***************
*** 5937,5948 ****
  
                The conversion specifiers and their meanings are:
  
!                               *printf-d* *printf-o* *printf-x* *printf-X*
!               doxX    The Number argument is converted to signed decimal
!                       (d), unsigned octal (o), or unsigned hexadecimal (x
!                       and X) notation.  The letters "abcdef" are used for
!                       x conversions; the letters "ABCDEF" are used for X
!                       conversions.
                        The precision, if any, gives the minimum number of
                        digits that must appear; if the converted value
                        requires fewer digits, it is padded on the left with
--- 5970,5982 ----
  
                The conversion specifiers and their meanings are:
  
!                               *printf-d* *printf-b* *printf-B* *printf-o*
!                               *printf-x* *printf-X*
!               dbBoxX  The Number argument is converted to signed decimal
!                       (d), unsigned binary (b and B), unsigned octal (o), or
!                       unsigned hexadecimal (x and X) notation.  The letters
!                       "abcdef" are used for x conversions; the letters
!                       "ABCDEF" are used for X conversions.
                        The precision, if any, gives the minimum number of
                        digits that must appear; if the converted value
                        requires fewer digits, it is padded on the left with
*** ../vim-7.4.2220/src/message.c       2016-08-16 21:30:49.605848229 +0200
--- src/message.c       2016-08-16 21:52:08.594366092 +0200
***************
*** 4091,4102 ****
            char    length_modifier = '\0';
  
            /* temporary buffer for simple numeric->string conversion */
! # ifdef FEAT_FLOAT
  #  define TMP_LEN 350 /* On my system 1e308 is the biggest number possible.
                         * That sounds reasonable to use as the maximum
                         * printable. */
  # else
! #  define TMP_LEN 32
  # endif
            char    tmp[TMP_LEN];
  
--- 4091,4104 ----
            char    length_modifier = '\0';
  
            /* temporary buffer for simple numeric->string conversion */
! # if defined(FEAT_FLOAT)
  #  define TMP_LEN 350 /* On my system 1e308 is the biggest number possible.
                         * That sounds reasonable to use as the maximum
                         * printable. */
+ # elif defined(FEAT_NUM64)
+ #  define TMP_LEN 66
  # else
! #  define TMP_LEN 34
  # endif
            char    tmp[TMP_LEN];
  
***************
*** 4343,4351 ****
                }
                break;
  
!           case 'd': case 'u': case 'o': case 'x': case 'X': case 'p':
                {
!                   /* NOTE: the u, o, x, X and p conversion specifiers
                     * imply the value is unsigned;  d implies a signed
                     * value */
  
--- 4345,4357 ----
                }
                break;
  
!           case 'd': case 'u':
!           case 'b': case 'B':
!           case 'o':
!           case 'x': case 'X':
!           case 'p':
                {
!                   /* NOTE: the u, b, o, x, X and p conversion specifiers
                     * imply the value is unsigned;  d implies a signed
                     * value */
  
***************
*** 4370,4375 ****
--- 4376,4384 ----
                    uvarnumber_T ullong_arg = 0;
  # endif
  
+                   /* only defined for b convertion */
+                   uvarnumber_T bin_arg = 0;
+ 
                    /* pointer argument value -only defined for p
                     * conversion */
                    void *ptr_arg = NULL;
***************
*** 4386,4391 ****
--- 4395,4411 ----
                        if (ptr_arg != NULL)
                            arg_sign = 1;
                    }
+                   else if (fmt_spec == 'b' || fmt_spec == 'B')
+                   {
+                       bin_arg =
+ # if defined(FEAT_EVAL)
+                                   tvs != NULL ?
+                                          (uvarnumber_T)tv_nr(tvs, &arg_idx) :
+ # endif
+                                       va_arg(ap, uvarnumber_T);
+                       if (bin_arg != 0)
+                           arg_sign = 1;
+                   }
                    else if (fmt_spec == 'd')
                    {
                        /* signed */
***************
*** 4492,4498 ****
                    else if (alternate_form)
                    {
                        if (arg_sign != 0
!                                    && (fmt_spec == 'x' || fmt_spec == 'X') )
                        {
                            tmp[str_arg_l++] = '0';
                            tmp[str_arg_l++] = fmt_spec;
--- 4512,4519 ----
                    else if (alternate_form)
                    {
                        if (arg_sign != 0
!                                    && (fmt_spec == 'b' || fmt_spec == 'B'
!                                     || fmt_spec == 'x' || fmt_spec == 'X') )
                        {
                            tmp[str_arg_l++] = '0';
                            tmp[str_arg_l++] = fmt_spec;
***************
*** 4508,4514 ****
                    {
                        /* When zero value is formatted with an explicit
                         * precision 0, the resulting formatted string is
!                        * empty (d, i, u, o, x, X, p).   */
                    }
                    else
                    {
--- 4529,4535 ----
                    {
                        /* When zero value is formatted with an explicit
                         * precision 0, the resulting formatted string is
!                        * empty (d, i, u, b, B, o, x, X, p).   */
                    }
                    else
                    {
***************
*** 4541,4546 ****
--- 4562,4583 ----
  
                        if (fmt_spec == 'p')
                            str_arg_l += sprintf(tmp + str_arg_l, f, ptr_arg);
+                       else if (fmt_spec == 'b' || fmt_spec == 'B')
+                       {
+                           char            b[8 * sizeof(uvarnumber_T)];
+                           size_t          b_l = 0;
+                           uvarnumber_T    bn = bin_arg;
+ 
+                           do
+                           {
+                               b[sizeof(b) - ++b_l] = '0' + (bn & 0x1);
+                               bn >>= 1;
+                           }
+                           while (bn != 0);
+ 
+                           memcpy(tmp + str_arg_l, b + sizeof(b) - b_l, b_l);
+                           str_arg_l += b_l;
+                       }
                        else if (fmt_spec == 'd')
                        {
                            /* signed */
*** ../vim-7.4.2220/src/testdir/test_expr.vim   2016-08-16 21:30:49.605848229 
+0200
--- src/testdir/test_expr.vim   2016-08-16 21:53:35.041589606 +0200
***************
*** 163,168 ****
--- 163,185 ----
    call assert_equal(string(function('printf', ['%s'])), printf('%s', 
function('printf', ['%s'])))
  endfunc
  
+ function Test_printf_spec_b()
+   call assert_equal("0", printf('%b', 0))
+   call assert_equal("00001100", printf('%08b', 12))
+   call assert_equal("11111111", printf('%08b', 0xff))
+   call assert_equal("   1111011", printf('%10b', 123))
+   call assert_equal("0001111011", printf('%010b', 123))
+   call assert_equal(" 0b1111011", printf('%#10b', 123))
+   call assert_equal("0B01111011", printf('%#010B', 123))
+   call assert_equal("1001001100101100000001011010010", printf('%b', 
1234567890))
+   if has('num64')
+     call assert_equal("11100000100100010000110000011011101111101111001", 
printf('%b', 123456789012345))
+     call 
assert_equal("1111111111111111111111111111111111111111111111111111111111111111",
 printf('%b', -1))
+   else
+     call assert_equal("11111111111111111111111111111111", printf('%b', -1))
+   endif
+ endfunc
+ 
  func Test_substitute_expr()
    let g:val = 'XXX'
    call assert_equal('XXX', substitute('yyy', 'y*', '\=g:val', ''))
*** ../vim-7.4.2220/src/version.c       2016-08-16 21:30:49.605848229 +0200
--- src/version.c       2016-08-16 21:47:18.536970024 +0200
***************
*** 765,766 ****
--- 765,768 ----
  {   /* Add new patch number below this line */
+ /**/
+     2221,
  /**/

-- 
How To Keep A Healthy Level Of Insanity:
14. Put mosquito netting around your work area. Play a tape of jungle
    sounds all day.

 /// 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.

Raspunde prin e-mail lui