# HG changeset patch # User Bram Moolenaar # Date 1369512263 -7200 # Node ID 08ac4698095359c3a888b34074548435e9775973 # Parent c02661ad95f87d171ea734114983467060f50e6b updated for version 7.3.1019 Problem: These do not work with the new regexp engine: \%o123, \%x123, \%d123, \%u123 and \%U123. Solution: Implement these items. diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -604,7 +604,6 @@ nfa_regatom() char_u *endp; #ifdef FEAT_MBYTE char_u *old_regparse = regparse; - int clen; int i; #endif int extra = 0; @@ -623,15 +622,12 @@ nfa_regatom() cpo_bsl = vim_strchr(p_cpo, CPO_BACKSL) != NULL; c = getchr(); - -#ifdef FEAT_MBYTE - /* clen has the length of the current char, without composing chars */ - clen = (*mb_char2len)(c); - if (has_mbyte && clen > 1) - goto nfa_do_multibyte; -#endif switch (c) { + case NUL: + syntax_error = TRUE; + EMSG_RET_FAIL(_("E865: (NFA) Regexp end encountered prematurely")); + case Magic('^'): EMIT(NFA_BOL); break; @@ -747,10 +743,6 @@ nfa_regatom() return FAIL; /* cascaded error */ break; - case NUL: - syntax_error = TRUE; - EMSG_RET_FAIL(_("E865: (NFA) Regexp end encountered prematurely")); - case Magic('|'): case Magic('&'): case Magic(')'): @@ -834,11 +826,26 @@ nfa_regatom() case 'x': /* %xab hex 2 */ case 'u': /* %uabcd hex 4 */ case 'U': /* %U1234abcd hex 8 */ - /* Not yet supported */ - return FAIL; - - c = coll_get_char(); - EMIT(c); + { + int i; + + switch (c) + { + case 'd': i = getdecchrs(); break; + case 'o': i = getoctchrs(); break; + case 'x': i = gethexchrs(2); break; + case 'u': i = gethexchrs(4); break; + case 'U': i = gethexchrs(8); break; + default: i = -1; break; + } + + if (i < 0) + EMSG2_RET_FAIL( + _("E678: Invalid character after %s%%[dxouU]"), + reg_magic == MAGIC_ALL); + /* TODO: what if a composing character follows? */ + EMIT(i); + } break; /* Catch \%^ and \%$ regardless of where they appear in the @@ -1217,9 +1224,10 @@ collection: int plen; nfa_do_multibyte: - /* Length of current char with composing chars. */ - if (enc_utf8 && (clen != (plen = (*mb_ptr2len)(old_regparse)) - || utf_iscomposing(c))) + /* plen is length of current char with composing chars */ + if (enc_utf8 && ((*mb_char2len)(c) + != (plen = (*mb_ptr2len)(old_regparse)) + || utf_iscomposing(c))) { /* A base character plus composing characters, or just one * or more composing characters. diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1019, +/**/ 1018, /**/ 1017,