Mercurial > vim
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 |