mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	patch 9.1.0652: too many strlen() calls in syntax.c
Problem:  too many strlen() calls in syntax.c
Solution: refactor code to reduce the number or strlen() calls,
          get rid of un-used SYN_NAMELEN macro
          (John Marriott)
closes: #15368
Signed-off-by: John Marriott <basilisk@internode.on.net>
Signed-off-by: Christian Brabandt <cb@256bit.org>
			
			
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							0214680a8e
						
					
				
				
					commit
					b4ea77185c
				
			
							
								
								
									
										115
									
								
								src/syntax.c
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								src/syntax.c
									
									
									
									
									
								
							| @@ -15,8 +15,6 @@ | |||||||
|  |  | ||||||
| #if defined(FEAT_SYN_HL) || defined(PROTO) | #if defined(FEAT_SYN_HL) || defined(PROTO) | ||||||
|  |  | ||||||
| #define SYN_NAMELEN	50		// maximum length of a syntax name |  | ||||||
|  |  | ||||||
| // different types of offsets that are possible | // different types of offsets that are possible | ||||||
| #define SPO_MS_OFF	0	// match  start offset | #define SPO_MS_OFF	0	// match  start offset | ||||||
| #define SPO_ME_OFF	1	// match  end	offset | #define SPO_ME_OFF	1	// match  end	offset | ||||||
| @@ -323,6 +321,7 @@ static void limit_pos_zero(lpos_T *pos, lpos_T *limit); | |||||||
| static void syn_add_end_off(lpos_T *result, regmmatch_T *regmatch, synpat_T *spp, int idx, int extra); | static void syn_add_end_off(lpos_T *result, regmmatch_T *regmatch, synpat_T *spp, int idx, int extra); | ||||||
| static void syn_add_start_off(lpos_T *result, regmmatch_T *regmatch, synpat_T *spp, int idx, int extra); | static void syn_add_start_off(lpos_T *result, regmmatch_T *regmatch, synpat_T *spp, int idx, int extra); | ||||||
| static char_u *syn_getcurline(void); | static char_u *syn_getcurline(void); | ||||||
|  | static colnr_T syn_getcurline_len(void); | ||||||
| static int syn_regexec(regmmatch_T *rmp, linenr_T lnum, colnr_T col, syn_time_T *st); | static int syn_regexec(regmmatch_T *rmp, linenr_T lnum, colnr_T col, syn_time_T *st); | ||||||
| static int check_keyword_id(char_u *line, int startcol, int *endcol, long *flags, short **next_list, stateitem_T *cur_si, int *ccharp); | static int check_keyword_id(char_u *line, int startcol, int *endcol, long *flags, short **next_list, stateitem_T *cur_si, int *ccharp); | ||||||
| static void syn_remove_pattern(synblock_T *block, int idx); | static void syn_remove_pattern(synblock_T *block, int idx); | ||||||
| @@ -2692,7 +2691,7 @@ update_si_end( | |||||||
| 	    // a "oneline" never continues in the next line | 	    // a "oneline" never continues in the next line | ||||||
| 	    sip->si_ends = TRUE; | 	    sip->si_ends = TRUE; | ||||||
| 	    sip->si_m_endpos.lnum = current_lnum; | 	    sip->si_m_endpos.lnum = current_lnum; | ||||||
| 	    sip->si_m_endpos.col = (colnr_T)STRLEN(syn_getcurline()); | 	    sip->si_m_endpos.col = syn_getcurline_len(); | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| @@ -3129,6 +3128,15 @@ syn_getcurline(void) | |||||||
|     return ml_get_buf(syn_buf, current_lnum, FALSE); |     return ml_get_buf(syn_buf, current_lnum, FALSE); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Get length of current line in syntax buffer. | ||||||
|  |  */ | ||||||
|  |     static colnr_T | ||||||
|  | syn_getcurline_len(void) | ||||||
|  | { | ||||||
|  |     return ml_get_buf_len(syn_buf, current_lnum); | ||||||
|  | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Call vim_regexec() to find a match with "rmp" in "syn_buf". |  * Call vim_regexec() to find a match with "rmp" in "syn_buf". | ||||||
|  * Returns TRUE when there is a match. |  * Returns TRUE when there is a match. | ||||||
| @@ -3935,13 +3943,7 @@ syn_match_msg(void) | |||||||
|  |  | ||||||
| static int  last_matchgroup; | static int  last_matchgroup; | ||||||
|  |  | ||||||
| struct name_list | static void syn_list_flags(keyvalue_T *nlist, int nr_entries, int flags, int attr); | ||||||
| { |  | ||||||
|     int		flag; |  | ||||||
|     char	*name; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| static void syn_list_flags(struct name_list *nl, int flags, int attr); |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * List one syntax item, for ":syntax" or "syntax list syntax_name". |  * List one syntax item, for ":syntax" or "syntax list syntax_name". | ||||||
| @@ -3956,28 +3958,27 @@ syn_list_one( | |||||||
|     int		idx; |     int		idx; | ||||||
|     int		did_header = FALSE; |     int		did_header = FALSE; | ||||||
|     synpat_T	*spp; |     synpat_T	*spp; | ||||||
|     static struct name_list namelist1[] = |     static keyvalue_T namelist1[] = | ||||||
| 		{ | 		{ | ||||||
| 		    {HL_DISPLAY, "display"}, | 		    KEYVALUE_ENTRY(HL_DISPLAY, "display"), | ||||||
| 		    {HL_CONTAINED, "contained"}, | 		    KEYVALUE_ENTRY(HL_CONTAINED, "contained"), | ||||||
| 		    {HL_ONELINE, "oneline"}, | 		    KEYVALUE_ENTRY(HL_ONELINE, "oneline"), | ||||||
| 		    {HL_KEEPEND, "keepend"}, | 		    KEYVALUE_ENTRY(HL_KEEPEND, "keepend"), | ||||||
| 		    {HL_EXTEND, "extend"}, | 		    KEYVALUE_ENTRY(HL_EXTEND, "extend"), | ||||||
| 		    {HL_EXCLUDENL, "excludenl"}, | 		    KEYVALUE_ENTRY(HL_EXCLUDENL, "excludenl"), | ||||||
| 		    {HL_TRANSP, "transparent"}, | 		    KEYVALUE_ENTRY(HL_TRANSP, "transparent"), | ||||||
| 		    {HL_FOLD, "fold"}, | 		    KEYVALUE_ENTRY(HL_FOLD, "fold") | ||||||
| #ifdef FEAT_CONCEAL | #ifdef FEAT_CONCEAL | ||||||
| 		    {HL_CONCEAL, "conceal"}, | 		    , | ||||||
| 		    {HL_CONCEALENDS, "concealends"}, | 		    KEYVALUE_ENTRY(HL_CONCEAL, "conceal"), | ||||||
|  | 		    KEYVALUE_ENTRY(HL_CONCEALENDS, "concealends") | ||||||
| #endif | #endif | ||||||
| 		    {0, NULL} |  | ||||||
| 		}; | 		}; | ||||||
|     static struct name_list namelist2[] = |     static keyvalue_T namelist2[] = | ||||||
| 		{ | 		{ | ||||||
| 		    {HL_SKIPWHITE, "skipwhite"}, | 		    KEYVALUE_ENTRY(HL_SKIPWHITE, "skipwhite"), | ||||||
| 		    {HL_SKIPNL, "skipnl"}, | 		    KEYVALUE_ENTRY(HL_SKIPNL, "skipnl"), | ||||||
| 		    {HL_SKIPEMPTY, "skipempty"}, | 		    KEYVALUE_ENTRY(HL_SKIPEMPTY, "skipempty") | ||||||
| 		    {0, NULL} |  | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
|     attr = HL_ATTR(HLF_D);		// highlight like directories |     attr = HL_ATTR(HLF_D);		// highlight like directories | ||||||
| @@ -4017,7 +4018,7 @@ syn_list_one( | |||||||
| 	    --idx; | 	    --idx; | ||||||
| 	    msg_putchar(' '); | 	    msg_putchar(' '); | ||||||
| 	} | 	} | ||||||
| 	syn_list_flags(namelist1, spp->sp_flags, attr); | 	syn_list_flags(namelist1, (int)ARRAY_LENGTH(namelist1), spp->sp_flags, attr); | ||||||
|  |  | ||||||
| 	if (spp->sp_cont_list != NULL) | 	if (spp->sp_cont_list != NULL) | ||||||
| 	    put_id_list((char_u *)"contains", spp->sp_cont_list, attr); | 	    put_id_list((char_u *)"contains", spp->sp_cont_list, attr); | ||||||
| @@ -4029,7 +4030,7 @@ syn_list_one( | |||||||
| 	if (spp->sp_next_list != NULL) | 	if (spp->sp_next_list != NULL) | ||||||
| 	{ | 	{ | ||||||
| 	    put_id_list((char_u *)"nextgroup", spp->sp_next_list, attr); | 	    put_id_list((char_u *)"nextgroup", spp->sp_next_list, attr); | ||||||
| 	    syn_list_flags(namelist2, spp->sp_flags, attr); | 	    syn_list_flags(namelist2, (int)ARRAY_LENGTH(namelist2), spp->sp_flags, attr); | ||||||
| 	} | 	} | ||||||
| 	if (spp->sp_flags & (HL_SYNC_HERE|HL_SYNC_THERE)) | 	if (spp->sp_flags & (HL_SYNC_HERE|HL_SYNC_THERE)) | ||||||
| 	{ | 	{ | ||||||
| @@ -4058,14 +4059,14 @@ syn_list_one( | |||||||
| } | } | ||||||
|  |  | ||||||
|     static void |     static void | ||||||
| syn_list_flags(struct name_list *nlist, int flags, int attr) | syn_list_flags(keyvalue_T *nlist, int nr_entries, int flags, int attr) | ||||||
| { | { | ||||||
|     int		i; |     int		i; | ||||||
|  |  | ||||||
|     for (i = 0; nlist[i].flag != 0; ++i) |     for (i = 0; i < nr_entries; ++i) | ||||||
| 	if (flags & nlist[i].flag) | 	if (flags & nlist[i].key) | ||||||
| 	{ | 	{ | ||||||
| 	    msg_puts_attr(nlist[i].name, attr); | 	    msg_puts_attr(nlist[i].value, attr); | ||||||
| 	    msg_putchar(' '); | 	    msg_putchar(' '); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -4393,6 +4394,7 @@ clear_keywtab(hashtab_T *ht) | |||||||
|     static void |     static void | ||||||
| add_keyword( | add_keyword( | ||||||
|     char_u	*name,	    // name of keyword |     char_u	*name,	    // name of keyword | ||||||
|  |     size_t	namelen,    // length of keyword (excluding the NUL) | ||||||
|     int		id,	    // group ID for this keyword |     int		id,	    // group ID for this keyword | ||||||
|     int		flags,	    // flags for this keyword |     int		flags,	    // flags for this keyword | ||||||
|     short	*cont_in_list, // containedin for this keyword |     short	*cont_in_list, // containedin for this keyword | ||||||
| @@ -4403,15 +4405,22 @@ add_keyword( | |||||||
|     hashtab_T	*ht; |     hashtab_T	*ht; | ||||||
|     hashitem_T	*hi; |     hashitem_T	*hi; | ||||||
|     char_u	*name_ic; |     char_u	*name_ic; | ||||||
|  |     size_t	name_iclen; | ||||||
|     long_u	hash; |     long_u	hash; | ||||||
|     char_u	name_folded[MAXKEYWLEN + 1]; |     char_u	name_folded[MAXKEYWLEN + 1]; | ||||||
|  |  | ||||||
|     if (curwin->w_s->b_syn_ic) |     if (curwin->w_s->b_syn_ic) | ||||||
| 	name_ic = str_foldcase(name, (int)STRLEN(name), |     { | ||||||
|  | 	name_ic = str_foldcase(name, (int)namelen, | ||||||
| 						 name_folded, MAXKEYWLEN + 1); | 						 name_folded, MAXKEYWLEN + 1); | ||||||
|  | 	name_iclen = STRLEN(name_ic); | ||||||
|  |     } | ||||||
|     else |     else | ||||||
|  |     { | ||||||
| 	name_ic = name; | 	name_ic = name; | ||||||
|     kp = alloc(offsetof(keyentry_T, keyword) + STRLEN(name_ic) + 1); | 	name_iclen = namelen; | ||||||
|  |     } | ||||||
|  |     kp = alloc(offsetof(keyentry_T, keyword) + name_iclen + 1); | ||||||
|     if (kp == NULL) |     if (kp == NULL) | ||||||
| 	return; | 	return; | ||||||
|     STRCPY(kp->keyword, name_ic); |     STRCPY(kp->keyword, name_ic); | ||||||
| @@ -4828,19 +4837,26 @@ syn_cmd_keyword(exarg_T *eap, int syncing UNUSED) | |||||||
|  |  | ||||||
| 	    if (!eap->skip) | 	    if (!eap->skip) | ||||||
| 	    { | 	    { | ||||||
|  | 		size_t	kwlen = 0; | ||||||
|  |  | ||||||
| 		// Adjust flags for use of ":syn include". | 		// Adjust flags for use of ":syn include". | ||||||
| 		syn_incl_toplevel(syn_id, &syn_opt_arg.flags); | 		syn_incl_toplevel(syn_id, &syn_opt_arg.flags); | ||||||
|  |  | ||||||
| 		/* | 		/* | ||||||
| 		 * 2: Add an entry for each keyword. | 		 * 2: Add an entry for each keyword. | ||||||
| 		 */ | 		 */ | ||||||
| 		for (kw = keyword_copy; --cnt >= 0; kw += STRLEN(kw) + 1) | 		for (kw = keyword_copy; --cnt >= 0; kw += kwlen + 1) | ||||||
| 		{ | 		{ | ||||||
| 		    for (p = vim_strchr(kw, '['); ; ) | 		    for (p = vim_strchr(kw, '['); ; ) | ||||||
| 		    { | 		    { | ||||||
| 			if (p != NULL) | 			if (p == NULL) | ||||||
|  | 			    kwlen = STRLEN(kw); | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
| 			    *p = NUL; | 			    *p = NUL; | ||||||
| 			add_keyword(kw, syn_id, syn_opt_arg.flags, | 			    kwlen = (size_t)(p - kw); | ||||||
|  | 			} | ||||||
|  | 			add_keyword(kw, kwlen, syn_id, syn_opt_arg.flags, | ||||||
| 				syn_opt_arg.cont_in_list, | 				syn_opt_arg.cont_in_list, | ||||||
| 					 syn_opt_arg.next_list, conceal_char); | 					 syn_opt_arg.next_list, conceal_char); | ||||||
| 			if (p == NULL) | 			if (p == NULL) | ||||||
| @@ -4859,6 +4875,7 @@ syn_cmd_keyword(exarg_T *eap, int syncing UNUSED) | |||||||
| 				goto error; | 				goto error; | ||||||
| 			    } | 			    } | ||||||
| 			    kw = p + 1;		// skip over the "]" | 			    kw = p + 1;		// skip over the "]" | ||||||
|  | 			    kwlen = 1; | ||||||
| 			    break; | 			    break; | ||||||
| 			} | 			} | ||||||
| 			if (has_mbyte) | 			if (has_mbyte) | ||||||
| @@ -6229,8 +6246,7 @@ static struct subcommand subcommands[] = | |||||||
|     {"reset",		syn_cmd_reset}, |     {"reset",		syn_cmd_reset}, | ||||||
|     {"spell",		syn_cmd_spell}, |     {"spell",		syn_cmd_spell}, | ||||||
|     {"sync",		syn_cmd_sync}, |     {"sync",		syn_cmd_sync}, | ||||||
|     {"",		syn_cmd_list}, |     {"",		syn_cmd_list} | ||||||
|     {NULL, NULL} |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -6257,13 +6273,8 @@ ex_syntax(exarg_T *eap) | |||||||
|  |  | ||||||
|     if (eap->skip)		// skip error messages for all subcommands |     if (eap->skip)		// skip error messages for all subcommands | ||||||
| 	++emsg_skip; | 	++emsg_skip; | ||||||
|     for (i = 0; ; ++i) |     for (i = 0; i < (int)ARRAY_LENGTH(subcommands); ++i) | ||||||
|     { |     { | ||||||
| 	if (subcommands[i].name == NULL) |  | ||||||
| 	{ |  | ||||||
| 	    semsg(_(e_invalid_syntax_subcommand_str), subcmd_name); |  | ||||||
| 	    break; |  | ||||||
| 	} |  | ||||||
| 	if (STRCMP(subcmd_name, (char_u *)subcommands[i].name) == 0) | 	if (STRCMP(subcmd_name, (char_u *)subcommands[i].name) == 0) | ||||||
| 	{ | 	{ | ||||||
| 	    eap->arg = skipwhite(subcmd_end); | 	    eap->arg = skipwhite(subcmd_end); | ||||||
| @@ -6271,6 +6282,10 @@ ex_syntax(exarg_T *eap) | |||||||
| 	    break; | 	    break; | ||||||
| 	} | 	} | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (i == (int)ARRAY_LENGTH(subcommands)) | ||||||
|  | 	semsg(_(e_invalid_syntax_subcommand_str), subcmd_name); | ||||||
|  |  | ||||||
|     vim_free(subcmd_name); |     vim_free(subcmd_name); | ||||||
|     if (eap->skip) |     if (eap->skip) | ||||||
| 	--emsg_skip; | 	--emsg_skip; | ||||||
| @@ -6424,6 +6439,8 @@ get_syntax_name(expand_T *xp, int idx) | |||||||
|     switch (expand_what) |     switch (expand_what) | ||||||
|     { |     { | ||||||
| 	case EXP_SUBCMD: | 	case EXP_SUBCMD: | ||||||
|  | 	    if (idx < 0 || idx >= (int)ARRAY_LENGTH(subcommands)) | ||||||
|  | 		return NULL; | ||||||
| 	    return (char_u *)subcommands[idx].name; | 	    return (char_u *)subcommands[idx].name; | ||||||
| 	case EXP_CASE: | 	case EXP_CASE: | ||||||
| 	{ | 	{ | ||||||
| @@ -6697,6 +6714,7 @@ syntime_report(void) | |||||||
|     proftime_T	tm; |     proftime_T	tm; | ||||||
| # endif | # endif | ||||||
|     int		len; |     int		len; | ||||||
|  |     int		patlen; | ||||||
|     proftime_T	total_total; |     proftime_T	total_total; | ||||||
|     int		total_count = 0; |     int		total_count = 0; | ||||||
|     garray_T    ga; |     garray_T    ga; | ||||||
| @@ -6768,8 +6786,9 @@ syntime_report(void) | |||||||
| 	    len = 20; // will wrap anyway | 	    len = 20; // will wrap anyway | ||||||
| 	else | 	else | ||||||
| 	    len = Columns - 70; | 	    len = Columns - 70; | ||||||
| 	if (len > (int)STRLEN(p->pattern)) | 	patlen = (int)STRLEN(p->pattern); | ||||||
| 	    len = (int)STRLEN(p->pattern); | 	if (len > patlen) | ||||||
|  | 	    len = patlen; | ||||||
| 	msg_outtrans_len(p->pattern, len); | 	msg_outtrans_len(p->pattern, len); | ||||||
| 	msg_puts("\n"); | 	msg_puts("\n"); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -704,6 +704,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     652, | ||||||
| /**/ | /**/ | ||||||
|     651, |     651, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user