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)