diff options
Diffstat (limited to 'src/nvim/regexp.c')
-rw-r--r-- | src/nvim/regexp.c | 107 |
1 files changed, 66 insertions, 41 deletions
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c index 886a48e7c5..6613d284d7 100644 --- a/src/nvim/regexp.c +++ b/src/nvim/regexp.c @@ -59,7 +59,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/garray.h" #include "nvim/strings.h" @@ -1389,6 +1388,10 @@ int vim_regcomp_had_eol(void) return had_eol; } +// variables for parsing reginput +static int at_start; // True when on the first character +static int prev_at_start; // True when on the second character + /* * Parse regular expression, i.e. main body or parenthesized thing. * @@ -1768,6 +1771,7 @@ static char_u *regatom(int *flagp) int c; char_u *p; int extra = 0; + int save_prev_at_start = prev_at_start; *flagp = WORST; /* Tentatively. */ @@ -2143,17 +2147,21 @@ static char_u *regatom(int *flagp) } break; } else if (c == 'l' || c == 'c' || c == 'v') { - if (c == 'l') + if (c == 'l') { ret = regnode(RE_LNUM); - else if (c == 'c') + if (save_prev_at_start) { + at_start = true; + } + } else if (c == 'c') { ret = regnode(RE_COL); - else + } else { ret = regnode(RE_VCOL); - if (ret == JUST_CALC_SIZE) + } + if (ret == JUST_CALC_SIZE) { regsize += 5; - else { - /* put the number and the optional - * comparator after the opcode */ + } else { + // put the number and the optional + // comparator after the opcode regcode = re_put_uint32(regcode, n); *regcode++ = cmp; } @@ -2301,48 +2309,64 @@ collection: } break; case CLASS_ALNUM: - for (cu = 1; cu <= 255; cu++) - if (isalnum(cu)) - regc(cu); + for (cu = 1; cu < 128; cu++) { + if (isalnum(cu)) { + regmbc(cu); + } + } break; case CLASS_ALPHA: - for (cu = 1; cu <= 255; cu++) - if (isalpha(cu)) - regc(cu); + for (cu = 1; cu < 128; cu++) { + if (isalpha(cu)) { + regmbc(cu); + } + } break; case CLASS_BLANK: regc(' '); regc('\t'); break; case CLASS_CNTRL: - for (cu = 1; cu <= 255; cu++) - if (iscntrl(cu)) - regc(cu); + for (cu = 1; cu <= 255; cu++) { + if (iscntrl(cu)) { + regmbc(cu); + } + } break; case CLASS_DIGIT: - for (cu = 1; cu <= 255; cu++) - if (ascii_isdigit(cu)) - regc(cu); + for (cu = 1; cu <= 255; cu++) { + if (ascii_isdigit(cu)) { + regmbc(cu); + } + } break; case CLASS_GRAPH: - for (cu = 1; cu <= 255; cu++) - if (isgraph(cu)) - regc(cu); + for (cu = 1; cu <= 255; cu++) { + if (isgraph(cu)) { + regmbc(cu); + } + } break; case CLASS_LOWER: - for (cu = 1; cu <= 255; cu++) - if (vim_islower(cu)) - regc(cu); + for (cu = 1; cu <= 255; cu++) { + if (vim_islower(cu) && cu != 170 && cu != 186) { + regmbc(cu); + } + } break; case CLASS_PRINT: - for (cu = 1; cu <= 255; cu++) - if (vim_isprintc(cu)) - regc(cu); + for (cu = 1; cu <= 255; cu++) { + if (vim_isprintc(cu)) { + regmbc(cu); + } + } break; case CLASS_PUNCT: - for (cu = 1; cu <= 255; cu++) - if (ispunct(cu)) - regc(cu); + for (cu = 1; cu < 128; cu++) { + if (ispunct(cu)) { + regmbc(cu); + } + } break; case CLASS_SPACE: for (cu = 9; cu <= 13; cu++) @@ -2350,14 +2374,18 @@ collection: regc(' '); break; case CLASS_UPPER: - for (cu = 1; cu <= 255; cu++) - if (vim_isupper(cu)) - regc(cu); + for (cu = 1; cu <= 255; cu++) { + if (vim_isupper(cu)) { + regmbc(cu); + } + } break; case CLASS_XDIGIT: - for (cu = 1; cu <= 255; cu++) - if (ascii_isxdigit(cu)) - regc(cu); + for (cu = 1; cu <= 255; cu++) { + if (ascii_isxdigit(cu)) { + regmbc(cu); + } + } break; case CLASS_TAB: regc('\t'); @@ -2679,9 +2707,6 @@ static void regoptail(char_u *p, char_u *val) * Functions for getting characters from the regexp input. */ -static int at_start; /* True when on the first character */ -static int prev_at_start; /* True when on the second character */ - /* * Start parsing at "str". */ |