Patch 8.1.0741
Problem:    Viminfo with Blob is not tested.
Solution:   Extend the viminfo test.  Fix reading a blob.  Fixed storing a
            special variable value.
Files:      src/testdir/test_viminfo.vim, src/eval.c, src/blob.c,
            src/proto/blob.pro


*** ../vim-8.1.0740/src/testdir/test_viminfo.vim        2017-08-30 
20:45:28.000000000 +0200
--- src/testdir/test_viminfo.vim        2019-01-13 17:13:36.651426379 +0100
***************
*** 39,52 ****
--- 39,74 ----
    " store a really long list, so line wrapping will occur in viminfo file
    let test_list = range(1,100)
    let g:MY_GLOBAL_LIST = test_list
+   let test_blob = 0z00112233445566778899aabbccddeeff
+   let g:MY_GLOBAL_BLOB = test_blob
+   let test_false = v:false
+   let g:MY_GLOBAL_FALSE = test_false
+   let test_true = v:true
+   let g:MY_GLOBAL_TRUE = test_true
+   let test_null = v:null
+   let g:MY_GLOBAL_NULL = test_null
+   let test_none = v:none
+   let g:MY_GLOBAL_NONE = test_none
+ 
    set viminfo='100,<50,s10,h,!,nviminfo
    wv! Xviminfo
+ 
    unlet g:MY_GLOBAL_DICT
    unlet g:MY_GLOBAL_LIST
+   unlet g:MY_GLOBAL_BLOB
+   unlet g:MY_GLOBAL_FALSE
+   unlet g:MY_GLOBAL_TRUE
+   unlet g:MY_GLOBAL_NULL
+   unlet g:MY_GLOBAL_NONE
  
    rv! Xviminfo
    call assert_equal(test_dict, g:MY_GLOBAL_DICT)
    call assert_equal(test_list, g:MY_GLOBAL_LIST)
+   call assert_equal(test_blob, g:MY_GLOBAL_BLOB)
+   call assert_equal(test_false, g:MY_GLOBAL_FALSE)
+   call assert_equal(test_true, g:MY_GLOBAL_TRUE)
+   call assert_equal(test_null, g:MY_GLOBAL_NULL)
+   call assert_equal(test_none, g:MY_GLOBAL_NONE)
  
    call delete('Xviminfo')
    set viminfo-=!
*** ../vim-8.1.0740/src/eval.c  2019-01-13 16:46:18.807309467 +0100
--- src/eval.c  2019-01-13 17:45:45.167029149 +0100
***************
*** 5882,5914 ****
            }
  
        case VAR_BLOB:
!           if (tv->vval.v_blob == NULL)
!           {
!               *tofree = NULL;
!               r = (char_u *)"[]";
!           }
!           else
!           {
!               blob_T      *b;
!               int         i;
!               garray_T    ga;
! 
!               // Store bytes in the growarray.
!               ga_init2(&ga, 1, 4000);
!               b = tv->vval.v_blob;
!               ga_append(&ga, '[');
!               for (i = 0; i < blob_len(b); i++)
!               {
!                   if (i > 0)
!                       ga_concat(&ga, (char_u *)",");
!                   vim_snprintf((char *)numbuf, NUMBUFLEN, "0x%02X",
!                           (int)blob_get(b, i));
!                   ga_concat(&ga, numbuf);
!               }
!               ga_append(&ga, ']');
!               *tofree = ga.ga_data;
!               r = *tofree;
!           }
            break;
  
        case VAR_LIST:
--- 5882,5888 ----
            }
  
        case VAR_BLOB:
!           r = blob2string(tv->vval.v_blob, tofree, numbuf);
            break;
  
        case VAR_LIST:
***************
*** 8948,8955 ****
            if (tab != NULL)
            {
                tv.v_type = type;
!               if (type == VAR_STRING || type == VAR_DICT ||
!                       type == VAR_LIST || type == VAR_BLOB)
                    tv.vval.v_string = viminfo_readstring(virp,
                                       (int)(tab - virp->vir_line + 1), TRUE);
  #ifdef FEAT_FLOAT
--- 8922,8929 ----
            if (tab != NULL)
            {
                tv.v_type = type;
!               if (type == VAR_STRING || type == VAR_DICT
!                       || type == VAR_LIST || type == VAR_BLOB)
                    tv.vval.v_string = viminfo_readstring(virp,
                                       (int)(tab - virp->vir_line + 1), TRUE);
  #ifdef FEAT_FLOAT
***************
*** 8958,8964 ****
  #endif
                else
                    tv.vval.v_number = atol((char *)tab + 1);
!               if (type == VAR_DICT || type == VAR_LIST || type == VAR_BLOB)
                {
                    typval_T *etv = eval_expr(tv.vval.v_string, NULL);
  
--- 8932,8938 ----
  #endif
                else
                    tv.vval.v_number = atol((char *)tab + 1);
!               if (type == VAR_DICT || type == VAR_LIST)
                {
                    typval_T *etv = eval_expr(tv.vval.v_string, NULL);
  
***************
*** 8973,8978 ****
--- 8947,8966 ----
                        vim_free(etv);
                    }
                }
+               else if (type == VAR_BLOB)
+               {
+                   blob_T *blob = string2blob(tv.vval.v_string);
+ 
+                   if (blob == NULL)
+                       // Failed to parse back the blob, use it as a string.
+                       tv.v_type = VAR_STRING;
+                   else
+                   {
+                       vim_free(tv.vval.v_string);
+                       tv.v_type = VAR_BLOB;
+                       tv.vval.v_blob = blob;
+                   }
+               }
  
                /* when in a function use global variables */
                save_funccal(&funccal_entry);
***************
*** 9037,9043 ****
                                     continue;
                }
                fprintf(fp, "!%s\t%s\t", this_var->di_key, s);
!               p = echo_string(&this_var->di_tv, &tofree, numbuf, 0);
                if (p != NULL)
                    viminfo_writestring(fp, p);
                vim_free(tofree);
--- 9025,9039 ----
                                     continue;
                }
                fprintf(fp, "!%s\t%s\t", this_var->di_key, s);
!               if (this_var->di_tv.v_type == VAR_SPECIAL)
!               {
!                   sprintf((char *)numbuf, "%ld",
!                                         (long)this_var->di_tv.vval.v_number);
!                   p = numbuf;
!                   tofree = NULL;
!               }
!               else
!                   p = echo_string(&this_var->di_tv, &tofree, numbuf, 0);
                if (p != NULL)
                    viminfo_writestring(fp, p);
                vim_free(tofree);
*** ../vim-8.1.0740/src/blob.c  2019-01-13 15:15:54.392762879 +0100
--- src/blob.c  2019-01-13 17:42:19.000391564 +0100
***************
*** 167,170 ****
--- 167,237 ----
      return OK;
  }
  
+ /*
+  * Convert a blob to a readable form: "[0x11,0x34]"
+  */
+     char_u *
+ blob2string(blob_T *blob, char_u **tofree, char_u *numbuf)
+ {
+     int               i;
+     garray_T    ga;
+ 
+     if (blob == NULL)
+     {
+       *tofree = NULL;
+       return (char_u *)"[]";
+     }
+ 
+     // Store bytes in the growarray.
+     ga_init2(&ga, 1, 4000);
+     ga_append(&ga, '[');
+     for (i = 0; i < blob_len(blob); i++)
+     {
+       if (i > 0)
+           ga_concat(&ga, (char_u *)",");
+       vim_snprintf((char *)numbuf, NUMBUFLEN, "0x%02X", (int)blob_get(blob, 
i));
+       ga_concat(&ga, numbuf);
+     }
+     ga_append(&ga, ']');
+     *tofree = ga.ga_data;
+     return *tofree;
+ }
+ 
+ /*
+  * Convert a string variable, in the format of blob2string(), to a blob.
+  * Return NULL when conversion failed.
+  */
+     blob_T *
+ string2blob(char_u *str)
+ {
+     blob_T  *blob = blob_alloc();
+     char_u  *s = str;
+ 
+     if (*s != '[')
+       goto failed;
+     s = skipwhite(s + 1);
+     while (*s != ']')
+     {
+       if (s[0] != '0' || s[1] != 'x'
+                                || !vim_isxdigit(s[2]) || !vim_isxdigit(s[3]))
+           goto failed;
+       ga_append(&blob->bv_ga, (hex2nr(s[2]) << 4) + hex2nr(s[3]));
+       s += 4;
+       if (*s == ',')
+           s = skipwhite(s + 1);
+       else if (*s != ']')
+           goto failed;
+     }
+     s = skipwhite(s + 1);
+     if (*s != NUL)
+       goto failed;  // text after final ']'
+ 
+     ++blob->bv_refcount;
+     return blob;
+ 
+ failed:
+     blob_free(blob);
+     return NULL;
+ }
+ 
  #endif /* defined(FEAT_EVAL) */
*** ../vim-8.1.0740/src/proto/blob.pro  2019-01-12 22:47:01.264088074 +0100
--- src/proto/blob.pro  2019-01-13 17:34:42.075344422 +0100
***************
*** 10,13 ****
--- 10,15 ----
  int blob_equal(blob_T *b1, blob_T *b2);
  int read_blob(FILE *fd, blob_T *blob);
  int write_blob(FILE *fd, blob_T *blob);
+ char_u *blob2string(blob_T *blob, char_u **tofree, char_u *numbuf);
+ blob_T *string2blob(char_u *str);
  /* vim: set ft=c : */
*** ../vim-8.1.0740/src/version.c       2019-01-13 16:46:18.807309467 +0100
--- src/version.c       2019-01-13 17:47:30.098331505 +0100
***************
*** 797,798 ****
--- 797,800 ----
  {   /* Add new patch number below this line */
+ /**/
+     741,
  /**/

-- 
What is the difference between a professional and an amateur?
The ark was built by an amateur; professionals gave us the Titanic.

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