comparison src/regexp_nfa.c @ 5511:dd7d1a86b311 v7.4.104

updated for version 7.4.104 Problem: ":help s/\_" reports an internal error. (John Beckett) Solution: Check for NUL and invalid character classes.
author Bram Moolenaar <bram@vim.org>
date Thu, 28 Nov 2013 14:20:17 +0100
parents 5ad60cd88339
children 50dbef5e774a
comparison
equal deleted inserted replaced
5510:d7d7bac1a163 5511:dd7d1a86b311
237 NFA_WORD, NFA_NWORD, NFA_HEAD, NFA_NHEAD, 237 NFA_WORD, NFA_NWORD, NFA_HEAD, NFA_NHEAD,
238 NFA_ALPHA, NFA_NALPHA, NFA_LOWER, NFA_NLOWER, 238 NFA_ALPHA, NFA_NALPHA, NFA_LOWER, NFA_NLOWER,
239 NFA_UPPER, NFA_NUPPER 239 NFA_UPPER, NFA_NUPPER
240 }; 240 };
241 241
242 static char_u e_nul_found[] = N_("E865: (NFA) Regexp end encountered prematurely");
242 static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c"); 243 static char_u e_misplaced[] = N_("E866: (NFA regexp) Misplaced %c");
244 static char_u e_ill_char_class[] = N_("E877: (NFA regexp) Invalid character class: %ld");
243 245
244 /* NFA regexp \ze operator encountered. */ 246 /* NFA regexp \ze operator encountered. */
245 static int nfa_has_zend; 247 static int nfa_has_zend;
246 248
247 /* NFA regexp \1 .. \9 encountered. */ 249 /* NFA regexp \1 .. \9 encountered. */
1135 1137
1136 c = getchr(); 1138 c = getchr();
1137 switch (c) 1139 switch (c)
1138 { 1140 {
1139 case NUL: 1141 case NUL:
1140 EMSG_RET_FAIL(_("E865: (NFA) Regexp end encountered prematurely")); 1142 EMSG_RET_FAIL(_(e_nul_found));
1141 1143
1142 case Magic('^'): 1144 case Magic('^'):
1143 EMIT(NFA_BOL); 1145 EMIT(NFA_BOL);
1144 break; 1146 break;
1145 1147
1158 EMIT(NFA_EOW); 1160 EMIT(NFA_EOW);
1159 break; 1161 break;
1160 1162
1161 case Magic('_'): 1163 case Magic('_'):
1162 c = no_Magic(getchr()); 1164 c = no_Magic(getchr());
1165 if (c == NUL)
1166 EMSG_RET_FAIL(_(e_nul_found));
1167
1163 if (c == '^') /* "\_^" is start-of-line */ 1168 if (c == '^') /* "\_^" is start-of-line */
1164 { 1169 {
1165 EMIT(NFA_BOL); 1170 EMIT(NFA_BOL);
1166 break; 1171 break;
1167 } 1172 }
1214 case Magic('u'): 1219 case Magic('u'):
1215 case Magic('U'): 1220 case Magic('U'):
1216 p = vim_strchr(classchars, no_Magic(c)); 1221 p = vim_strchr(classchars, no_Magic(c));
1217 if (p == NULL) 1222 if (p == NULL)
1218 { 1223 {
1224 if (extra == NFA_ADD_NL)
1225 {
1226 EMSGN(_(e_ill_char_class), c);
1227 rc_did_emsg = TRUE;
1228 return FAIL;
1229 }
1219 EMSGN("INTERNAL: Unknown character class char: %ld", c); 1230 EMSGN("INTERNAL: Unknown character class char: %ld", c);
1220 return FAIL; 1231 return FAIL;
1221 } 1232 }
1222 #ifdef FEAT_MBYTE 1233 #ifdef FEAT_MBYTE
1223 /* When '.' is followed by a composing char ignore the dot, so that 1234 /* When '.' is followed by a composing char ignore the dot, so that
4731 return OK; 4742 return OK;
4732 break; 4743 break;
4733 4744
4734 default: 4745 default:
4735 /* should not be here :P */ 4746 /* should not be here :P */
4736 EMSGN("E877: (NFA regexp) Invalid character class: %ld", class); 4747 EMSGN(_(e_ill_char_class), class);
4737 return FAIL; 4748 return FAIL;
4738 } 4749 }
4739 return FAIL; 4750 return FAIL;
4740 } 4751 }
4741 4752