@@ -156,7 +156,7 @@ static void au_show_for_event(int group, event_T event, const char *pat)
156156 // Empty pattern shows all autocommands for this event
157157 int patlen = 0 ;
158158 if (* pat != NUL ) {
159- patlen = (int )aucmd_pattern_length ( pat );
159+ patlen = (int )aucmd_span_pattern ( pat , & pat );
160160 if (patlen == 0 ) { // Don't show if it contains only commas
161161 return ;
162162 }
@@ -279,8 +279,7 @@ static void au_show_for_event(int group, event_T event, const char *pat)
279279 }
280280 }
281281
282- pat = aucmd_next_pattern (endpat , 0 );
283- patlen = (int )aucmd_pattern_length (pat );
282+ patlen = (int )aucmd_span_pattern (endpat , & pat );
284283 } while (patlen );
285284}
286285
@@ -906,7 +905,7 @@ int do_autocmd_event(event_T event, const char *pat, bool once, int nested, cons
906905 }
907906
908907 // Loop through all the specified patterns.
909- int patlen = (int )aucmd_pattern_length ( pat );
908+ int patlen = (int )aucmd_span_pattern ( pat , & pat );
910909 while (patlen ) {
911910 const char * endpat = pat + patlen ;
912911
@@ -952,8 +951,7 @@ int do_autocmd_event(event_T event, const char *pat, bool once, int nested, cons
952951 autocmd_register (0 , event , pat , patlen , group , once , nested , NULL , cmd , & handler_fn );
953952 }
954953
955- pat = aucmd_next_pattern (endpat , 0 );
956- patlen = (int )aucmd_pattern_length (pat );
954+ patlen = (int )aucmd_span_pattern (endpat , & pat );
957955 }
958956
959957 au_cleanup (); // may really delete removed patterns/commands now
@@ -1091,46 +1089,28 @@ int autocmd_register(int64_t id, event_T event, const char *pat, int patlen, int
10911089 return OK ;
10921090}
10931091
1094- size_t aucmd_pattern_length (const char * pat )
1095- FUNC_ATTR_PURE
1092+ size_t aucmd_span_pattern (const char * pat , const char * * start )
1093+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
10961094{
1097- if (* pat == NUL ) {
1098- return 0 ;
1095+ // Skip leading commas.
1096+ while (* pat == ',' ) {
1097+ pat ++ ;
10991098 }
11001099
1101- const char * endpat ;
1102-
1103- for (; * pat ; pat = endpat + 1 ) {
1104- // Find end of the pattern.
1105- // Watch out for a comma in braces, like "*.\{obj,o\}".
1106- endpat = pat ;
1107- // ignore single comma
1108- if (* endpat == ', ' ) {
1109- continue ;
1100+ // Find end of the pattern.
1101+ // Watch out for a comma in braces, like "*.\{obj,o\}".
1102+ const char * p = pat ;
1103+ int brace_level = 0 ;
1104+ for (; * p && ( * p != ',' || brace_level || ( p > pat && p [ -1 ] == '\\' )); p ++ ) {
1105+ if ( * p == '{' ) {
1106+ brace_level ++ ;
1107+ } else if (* p == '} ' ) {
1108+ brace_level -- ;
11101109 }
1111- int brace_level = 0 ;
1112- for (; * endpat && (* endpat != ',' || brace_level || endpat [-1 ] == '\\' ); endpat ++ ) {
1113- if (* endpat == '{' ) {
1114- brace_level ++ ;
1115- } else if (* endpat == '}' ) {
1116- brace_level -- ;
1117- }
1118- }
1119-
1120- return (size_t )(endpat - pat );
11211110 }
11221111
1123- return strlen (pat );
1124- }
1125-
1126- const char * aucmd_next_pattern (const char * pat , size_t patlen )
1127- FUNC_ATTR_PURE
1128- {
1129- pat = pat + patlen ;
1130- if (* pat == ',' ) {
1131- pat = pat + 1 ;
1132- }
1133- return pat ;
1112+ * start = pat ;
1113+ return (size_t )(p - pat );
11341114}
11351115
11361116/// Implementation of ":doautocmd [group] event [fname]".
0 commit comments