Mercurial > vim
comparison src/regexp_nfa.c @ 4732:0798b096bab3 v7.3.1113
updated for version 7.3.1113
Problem: New regexp engine: \%'m not supported.
Solution: Implement \%'m. Add tests.
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Tue, 04 Jun 2013 21:27:38 +0200 |
parents | 749e2b2755d5 |
children | 532c31f9e92f |
comparison
equal
deleted
inserted
replaced
4731:7c1a130ad754 | 4732:0798b096bab3 |
---|---|
176 NFA_COL_GT, /* Match > cursor column */ | 176 NFA_COL_GT, /* Match > cursor column */ |
177 NFA_COL_LT, /* Match < cursor column */ | 177 NFA_COL_LT, /* Match < cursor column */ |
178 NFA_VCOL, /* Match cursor virtual column */ | 178 NFA_VCOL, /* Match cursor virtual column */ |
179 NFA_VCOL_GT, /* Match > cursor virtual column */ | 179 NFA_VCOL_GT, /* Match > cursor virtual column */ |
180 NFA_VCOL_LT, /* Match < cursor virtual column */ | 180 NFA_VCOL_LT, /* Match < cursor virtual column */ |
181 NFA_MARK, /* Match mark */ | |
182 NFA_MARK_GT, /* Match > mark */ | |
183 NFA_MARK_LT, /* Match < mark */ | |
181 NFA_VISUAL, /* Match Visual area */ | 184 NFA_VISUAL, /* Match Visual area */ |
182 | 185 |
183 NFA_FIRST_NL = NFA_ANY + ADD_NL, | 186 NFA_FIRST_NL = NFA_ANY + ADD_NL, |
184 NFA_LAST_NL = NFA_NUPPER + ADD_NL, | 187 NFA_LAST_NL = NFA_NUPPER + ADD_NL, |
185 | 188 |
982 } | 985 } |
983 if (c == 'l' || c == 'c' || c == 'v') | 986 if (c == 'l' || c == 'c' || c == 'v') |
984 { | 987 { |
985 EMIT(n); | 988 EMIT(n); |
986 if (c == 'l') | 989 if (c == 'l') |
990 /* \%{n}l \%{n}<l \%{n}>l */ | |
987 EMIT(cmp == '<' ? NFA_LNUM_LT : | 991 EMIT(cmp == '<' ? NFA_LNUM_LT : |
988 cmp == '>' ? NFA_LNUM_GT : NFA_LNUM); | 992 cmp == '>' ? NFA_LNUM_GT : NFA_LNUM); |
989 else if (c == 'c') | 993 else if (c == 'c') |
994 /* \%{n}c \%{n}<c \%{n}>c */ | |
990 EMIT(cmp == '<' ? NFA_COL_LT : | 995 EMIT(cmp == '<' ? NFA_COL_LT : |
991 cmp == '>' ? NFA_COL_GT : NFA_COL); | 996 cmp == '>' ? NFA_COL_GT : NFA_COL); |
992 else | 997 else |
998 /* \%{n}v \%{n}<v \%{n}>v */ | |
993 EMIT(cmp == '<' ? NFA_VCOL_LT : | 999 EMIT(cmp == '<' ? NFA_VCOL_LT : |
994 cmp == '>' ? NFA_VCOL_GT : NFA_VCOL); | 1000 cmp == '>' ? NFA_VCOL_GT : NFA_VCOL); |
995 break; | 1001 break; |
996 } | 1002 } |
997 else if (c == '\'') | 1003 else if (c == '\'' && n == 0) |
998 /* TODO: \%'m not supported yet */ | 1004 { |
999 return FAIL; | 1005 /* \%'m \%<'m \%>'m */ |
1006 EMIT(getchr()); | |
1007 EMIT(cmp == '<' ? NFA_MARK_LT : | |
1008 cmp == '>' ? NFA_MARK_GT : NFA_MARK); | |
1009 break; | |
1010 } | |
1000 } | 1011 } |
1001 syntax_error = TRUE; | 1012 syntax_error = TRUE; |
1002 EMSGN(_("E867: (NFA) Unknown operator '\\%%%c'"), | 1013 EMSGN(_("E867: (NFA) Unknown operator '\\%%%c'"), |
1003 no_Magic(c)); | 1014 no_Magic(c)); |
1004 return FAIL; | 1015 return FAIL; |
1929 case NFA_BOL: STRCPY(code, "NFA_BOL "); break; | 1940 case NFA_BOL: STRCPY(code, "NFA_BOL "); break; |
1930 case NFA_EOW: STRCPY(code, "NFA_EOW "); break; | 1941 case NFA_EOW: STRCPY(code, "NFA_EOW "); break; |
1931 case NFA_BOW: STRCPY(code, "NFA_BOW "); break; | 1942 case NFA_BOW: STRCPY(code, "NFA_BOW "); break; |
1932 case NFA_EOF: STRCPY(code, "NFA_EOF "); break; | 1943 case NFA_EOF: STRCPY(code, "NFA_EOF "); break; |
1933 case NFA_BOF: STRCPY(code, "NFA_BOF "); break; | 1944 case NFA_BOF: STRCPY(code, "NFA_BOF "); break; |
1945 case NFA_LNUM: STRCPY(code, "NFA_LNUM "); break; | |
1946 case NFA_LNUM_GT: STRCPY(code, "NFA_LNUM_GT "); break; | |
1947 case NFA_LNUM_LT: STRCPY(code, "NFA_LNUM_LT "); break; | |
1948 case NFA_COL: STRCPY(code, "NFA_COL "); break; | |
1949 case NFA_COL_GT: STRCPY(code, "NFA_COL_GT "); break; | |
1950 case NFA_COL_LT: STRCPY(code, "NFA_COL_LT "); break; | |
1951 case NFA_VCOL: STRCPY(code, "NFA_VCOL "); break; | |
1952 case NFA_VCOL_GT: STRCPY(code, "NFA_VCOL_GT "); break; | |
1953 case NFA_VCOL_LT: STRCPY(code, "NFA_VCOL_LT "); break; | |
1954 case NFA_MARK: STRCPY(code, "NFA_MARK "); break; | |
1955 case NFA_MARK_GT: STRCPY(code, "NFA_MARK_GT "); break; | |
1956 case NFA_MARK_LT: STRCPY(code, "NFA_MARK_LT "); break; | |
1957 case NFA_CURSOR: STRCPY(code, "NFA_CURSOR "); break; | |
1958 case NFA_VISUAL: STRCPY(code, "NFA_VISUAL "); break; | |
1959 | |
1934 case NFA_STAR: STRCPY(code, "NFA_STAR "); break; | 1960 case NFA_STAR: STRCPY(code, "NFA_STAR "); break; |
1935 case NFA_STAR_NONGREEDY: STRCPY(code, "NFA_STAR_NONGREEDY "); break; | 1961 case NFA_STAR_NONGREEDY: STRCPY(code, "NFA_STAR_NONGREEDY "); break; |
1936 case NFA_QUEST: STRCPY(code, "NFA_QUEST"); break; | 1962 case NFA_QUEST: STRCPY(code, "NFA_QUEST"); break; |
1937 case NFA_QUEST_NONGREEDY: STRCPY(code, "NFA_QUEST_NON_GREEDY"); break; | 1963 case NFA_QUEST_NONGREEDY: STRCPY(code, "NFA_QUEST_NON_GREEDY"); break; |
1938 case NFA_NOT: STRCPY(code, "NFA_NOT "); break; | 1964 case NFA_NOT: STRCPY(code, "NFA_NOT "); break; |
2713 case NFA_VCOL_GT: | 2739 case NFA_VCOL_GT: |
2714 case NFA_VCOL_LT: | 2740 case NFA_VCOL_LT: |
2715 case NFA_COL: | 2741 case NFA_COL: |
2716 case NFA_COL_GT: | 2742 case NFA_COL_GT: |
2717 case NFA_COL_LT: | 2743 case NFA_COL_LT: |
2744 case NFA_MARK: | |
2745 case NFA_MARK_GT: | |
2746 case NFA_MARK_LT: | |
2718 if (nfa_calc_size == TRUE) | 2747 if (nfa_calc_size == TRUE) |
2719 { | 2748 { |
2720 nstate += 1; | 2749 nstate += 1; |
2721 break; | 2750 break; |
2722 } | 2751 } |
2723 e1 = POP(); | 2752 e1 = POP(); |
2724 s = alloc_state(*p, NULL, NULL); | 2753 s = alloc_state(*p, NULL, NULL); |
2725 if (s == NULL) | 2754 if (s == NULL) |
2726 goto theend; | 2755 goto theend; |
2727 s->val = e1.start->c; | 2756 s->val = e1.start->c; /* lnum, col or mark name */ |
2728 PUSH(frag(s, list1(&s->out))); | 2757 PUSH(frag(s, list1(&s->out))); |
2729 break; | 2758 break; |
2730 | 2759 |
2731 case NFA_ZSTART: | 2760 case NFA_ZSTART: |
2732 case NFA_ZEND: | 2761 case NFA_ZEND: |
4720 regline, (colnr_T)(reginput - regline)) + 1); | 4749 regline, (colnr_T)(reginput - regline)) + 1); |
4721 if (result) | 4750 if (result) |
4722 addstate_here(thislist, t->state->out, &t->subs, | 4751 addstate_here(thislist, t->state->out, &t->subs, |
4723 t->pim, &listidx); | 4752 t->pim, &listidx); |
4724 break; | 4753 break; |
4754 | |
4755 case NFA_MARK: | |
4756 case NFA_MARK_GT: | |
4757 case NFA_MARK_LT: | |
4758 { | |
4759 pos_T *pos = getmark_buf(reg_buf, t->state->val, FALSE); | |
4760 | |
4761 /* Compare the mark position to the match position. */ | |
4762 result = (pos != NULL /* mark doesn't exist */ | |
4763 && pos->lnum > 0 /* mark isn't set in reg_buf */ | |
4764 && (pos->lnum == reglnum + reg_firstlnum | |
4765 ? (pos->col == (colnr_T)(reginput - regline) | |
4766 ? t->state->c == NFA_MARK | |
4767 : (pos->col < (colnr_T)(reginput - regline) | |
4768 ? t->state->c == NFA_MARK_GT | |
4769 : t->state->c == NFA_MARK_LT)) | |
4770 : (pos->lnum < reglnum + reg_firstlnum | |
4771 ? t->state->c == NFA_MARK_GT | |
4772 : t->state->c == NFA_MARK_LT))); | |
4773 if (result) | |
4774 addstate_here(thislist, t->state->out, &t->subs, | |
4775 t->pim, &listidx); | |
4776 break; | |
4777 } | |
4725 | 4778 |
4726 case NFA_CURSOR: | 4779 case NFA_CURSOR: |
4727 result = (reg_win != NULL | 4780 result = (reg_win != NULL |
4728 && (reglnum + reg_firstlnum == reg_win->w_cursor.lnum) | 4781 && (reglnum + reg_firstlnum == reg_win->w_cursor.lnum) |
4729 && ((colnr_T)(reginput - regline) | 4782 && ((colnr_T)(reginput - regline) |