Patch 8.1.0772
Problem:    The sign_define_by_name() function is too long.
Solution:   Split it into smaller functions. (Yegappan Lakshmanan,
            closes #3819)
Files:      src/sign.c


*** ../vim-8.1.0771/src/sign.c  2019-01-17 17:36:42.495509219 +0100
--- src/sign.c  2019-01-18 22:00:14.645875627 +0100
***************
*** 727,732 ****
--- 727,866 ----
  }
  
  /*
+  * Allocate a new sign
+  */
+     static sign_T *
+ alloc_new_sign(char_u *name)
+ {
+     sign_T    *sp;
+     sign_T    *lp;
+     int       start = next_sign_typenr;
+ 
+     // Allocate a new sign.
+     sp = (sign_T *)alloc_clear_id((unsigned)sizeof(sign_T),
+           aid_sign_define_by_name);
+     if (sp == NULL)
+       return NULL;
+ 
+     // Check that next_sign_typenr is not already being used.
+     // This only happens after wrapping around.  Hopefully
+     // another one got deleted and we can use its number.
+     for (lp = first_sign; lp != NULL; )
+     {
+       if (lp->sn_typenr == next_sign_typenr)
+       {
+           ++next_sign_typenr;
+           if (next_sign_typenr == MAX_TYPENR)
+               next_sign_typenr = 1;
+           if (next_sign_typenr == start)
+           {
+               vim_free(sp);
+               emsg(_("E612: Too many signs defined"));
+               return NULL;
+           }
+           lp = first_sign;  // start all over
+           continue;
+       }
+       lp = lp->sn_next;
+     }
+ 
+     sp->sn_typenr = next_sign_typenr;
+     if (++next_sign_typenr == MAX_TYPENR)
+       next_sign_typenr = 1; // wrap around
+ 
+     sp->sn_name = vim_strsave(name);
+     if (sp->sn_name == NULL)  // out of memory
+     {
+       vim_free(sp);
+       return NULL;
+     }
+ 
+     return sp;
+ }
+ 
+ /*
+  * Initialize the icon information for a new sign
+  */
+     static void
+ sign_define_init_icon(sign_T *sp, char_u *icon)
+ {
+     vim_free(sp->sn_icon);
+     sp->sn_icon = vim_strsave(icon);
+     backslash_halve(sp->sn_icon);
+ # ifdef FEAT_SIGN_ICONS
+     if (gui.in_use)
+     {
+       out_flush();
+       if (sp->sn_image != NULL)
+           gui_mch_destroy_sign(sp->sn_image);
+       sp->sn_image = gui_mch_register_sign(sp->sn_icon);
+     }
+ # endif
+ }
+ 
+ /*
+  * Initialize the text for a new sign
+  */
+     static int
+ sign_define_init_text(sign_T *sp, char_u *text)
+ {
+     char_u    *s;
+     char_u    *endp;
+     int               cells;
+     int               len;
+ 
+     endp = text + (int)STRLEN(text);
+ 
+     // Remove backslashes so that it is possible to use a space.
+     for (s = text; s + 1 < endp; ++s)
+       if (*s == '\\')
+       {
+           STRMOVE(s, s + 1);
+           --endp;
+       }
+ 
+     // Count cells and check for non-printable chars
+ # ifdef FEAT_MBYTE
+     if (has_mbyte)
+     {
+       cells = 0;
+       for (s = text; s < endp; s += (*mb_ptr2len)(s))
+       {
+           if (!vim_isprintc((*mb_ptr2char)(s)))
+               break;
+           cells += (*mb_ptr2cells)(s);
+       }
+     }
+     else
+ # endif
+     {
+       for (s = text; s < endp; ++s)
+           if (!vim_isprintc(*s))
+               break;
+       cells = (int)(s - text);
+     }
+ 
+     // Currently sign text must be one or two display cells
+     if (s != endp || cells < 1 || cells > 2)
+     {
+       semsg(_("E239: Invalid sign text: %s"), text);
+       return FAIL;
+     }
+ 
+     vim_free(sp->sn_text);
+     // Allocate one byte more if we need to pad up
+     // with a space.
+     len = (int)(endp - text + ((cells == 1) ? 1 : 0));
+     sp->sn_text = vim_strnsave(text, len);
+ 
+     // For single character sign text, pad with a space.
+     if (sp->sn_text != NULL && cells == 1)
+       STRCPY(sp->sn_text + len - 1, " ");
+ 
+     return OK;
+ }
+ 
+ /*
   * Define a new sign or update an existing sign
   */
      int
***************
*** 743,790 ****
      sp = sign_find(name, &sp_prev);
      if (sp == NULL)
      {
!       sign_T  *lp;
!       int     start = next_sign_typenr;
! 
!       // Allocate a new sign.
!       sp = (sign_T *)alloc_clear_id((unsigned)sizeof(sign_T),
!                                               aid_sign_define_by_name);
        if (sp == NULL)
            return FAIL;
  
-       // Check that next_sign_typenr is not already being used.
-       // This only happens after wrapping around.  Hopefully
-       // another one got deleted and we can use its number.
-       for (lp = first_sign; lp != NULL; )
-       {
-           if (lp->sn_typenr == next_sign_typenr)
-           {
-               ++next_sign_typenr;
-               if (next_sign_typenr == MAX_TYPENR)
-                   next_sign_typenr = 1;
-               if (next_sign_typenr == start)
-               {
-                   vim_free(sp);
-                   emsg(_("E612: Too many signs defined"));
-                   return FAIL;
-               }
-               lp = first_sign;  // start all over
-               continue;
-           }
-           lp = lp->sn_next;
-       }
- 
-       sp->sn_typenr = next_sign_typenr;
-       if (++next_sign_typenr == MAX_TYPENR)
-           next_sign_typenr = 1; // wrap around
- 
-       sp->sn_name = vim_strsave(name);
-       if (sp->sn_name == NULL)  // out of memory
-       {
-           vim_free(sp);
-           return FAIL;
-       }
- 
        // add the new sign to the list of signs
        if (sp_prev == NULL)
            first_sign = sp;
--- 877,886 ----
      sp = sign_find(name, &sp_prev);
      if (sp == NULL)
      {
!       sp = alloc_new_sign(name);
        if (sp == NULL)
            return FAIL;
  
        // add the new sign to the list of signs
        if (sp_prev == NULL)
            first_sign = sp;
***************
*** 794,866 ****
  
      // set values for a defined sign.
      if (icon != NULL)
!     {
!       vim_free(sp->sn_icon);
!       sp->sn_icon = vim_strsave(icon);
!       backslash_halve(sp->sn_icon);
! # ifdef FEAT_SIGN_ICONS
!       if (gui.in_use)
!       {
!           out_flush();
!           if (sp->sn_image != NULL)
!               gui_mch_destroy_sign(sp->sn_image);
!           sp->sn_image = gui_mch_register_sign(sp->sn_icon);
!       }
! # endif
!     }
  
!     if (text != NULL)
!     {
!       char_u  *s;
!       char_u  *endp;
!       int     cells;
!       int     len;
! 
!       endp = text + (int)STRLEN(text);
!       for (s = text; s + 1 < endp; ++s)
!           if (*s == '\\')
!           {
!               // Remove a backslash, so that it is possible
!               // to use a space.
!               STRMOVE(s, s + 1);
!               --endp;
!           }
! # ifdef FEAT_MBYTE
!       // Count cells and check for non-printable chars
!       if (has_mbyte)
!       {
!           cells = 0;
!           for (s = text; s < endp; s += (*mb_ptr2len)(s))
!           {
!               if (!vim_isprintc((*mb_ptr2char)(s)))
!                   break;
!               cells += (*mb_ptr2cells)(s);
!           }
!       }
!       else
! # endif
!       {
!           for (s = text; s < endp; ++s)
!               if (!vim_isprintc(*s))
!                   break;
!           cells = (int)(s - text);
!       }
!       // Currently must be one or two display cells
!       if (s != endp || cells < 1 || cells > 2)
!       {
!           semsg(_("E239: Invalid sign text: %s"), text);
!           return FAIL;
!       }
! 
!       vim_free(sp->sn_text);
!       // Allocate one byte more if we need to pad up
!       // with a space.
!       len = (int)(endp - text + ((cells == 1) ? 1 : 0));
!       sp->sn_text = vim_strnsave(text, len);
! 
!       if (sp->sn_text != NULL && cells == 1)
!           STRCPY(sp->sn_text + len - 1, " ");
!     }
  
      if (linehl != NULL)
        sp->sn_line_hl = syn_check_group(linehl, (int)STRLEN(linehl));
--- 890,899 ----
  
      // set values for a defined sign.
      if (icon != NULL)
!       sign_define_init_icon(sp, icon);
  
!     if (text != NULL && (sign_define_init_text(sp, text) == FAIL))
!       return FAIL;
  
      if (linehl != NULL)
        sp->sn_line_hl = syn_check_group(linehl, (int)STRLEN(linehl));
*** ../vim-8.1.0771/src/version.c       2019-01-18 21:45:14.593232311 +0100
--- src/version.c       2019-01-18 21:59:53.034047592 +0100
***************
*** 793,794 ****
--- 793,796 ----
  {   /* Add new patch number below this line */
+ /**/
+     772,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
246. You use up your free 1 Gbyte in two days.

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