home *** CD-ROM | disk | FTP | other *** search
- To: vim_dev@googlegroups.com
- Subject: Patch 7.3.1039
- Fcc: outbox
- From: Bram Moolenaar <Bram@moolenaar.net>
- Mime-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ------------
-
- Patch 7.3.1039
- Problem: New regexp engine does not support \%23c, \%<23c and the like.
- Solution: Implement them. (partly by Yasuhiro Matsumoto)
- Files: src/regexp.h, src/regexp_nfa.c, src/testdir/test64.in,
- src/testdir/test64.ok
-
-
- *** ../vim-7.3.1038/src/regexp.h 2013-05-28 22:03:13.000000000 +0200
- --- src/regexp.h 2013-05-29 20:35:35.000000000 +0200
- ***************
- *** 72,77 ****
- --- 72,78 ----
- int id;
- int lastlist;
- int negated;
- + int val;
- };
-
- /*
- *** ../vim-7.3.1038/src/regexp_nfa.c 2013-05-29 18:45:07.000000000 +0200
- --- src/regexp_nfa.c 2013-05-29 20:59:34.000000000 +0200
- ***************
- *** 117,122 ****
- --- 117,134 ----
- NFA_NLOWER, /* Match non-lowercase char */
- NFA_UPPER, /* Match uppercase char */
- NFA_NUPPER, /* Match non-uppercase char */
- +
- + NFA_CURSOR, /* Match cursor pos */
- + NFA_LNUM, /* Match line number */
- + NFA_LNUM_GT, /* Match > line number */
- + NFA_LNUM_LT, /* Match < line number */
- + NFA_COL, /* Match cursor column */
- + NFA_COL_GT, /* Match > cursor column */
- + NFA_COL_LT, /* Match < cursor column */
- + NFA_VCOL, /* Match cursor virtual column */
- + NFA_VCOL_GT, /* Match > cursor virtual column */
- + NFA_VCOL_LT, /* Match < cursor virtual column */
- +
- NFA_FIRST_NL = NFA_ANY + ADD_NL,
- NFA_LAST_NL = NFA_NUPPER + ADD_NL,
-
- ***************
- *** 205,214 ****
- static nfa_state_T *post2nfa __ARGS((int *postfix, int *end, int nfa_calc_size));
- static int check_char_class __ARGS((int class, int c));
- static void st_error __ARGS((int *postfix, int *end, int *p));
- static void nfa_save_listids __ARGS((nfa_state_T *start, int *list));
- static void nfa_restore_listids __ARGS((nfa_state_T *start, int *list));
- ! static void nfa_set_null_listids __ARGS((nfa_state_T *start));
- ! static void nfa_set_neg_listids __ARGS((nfa_state_T *start));
- static long nfa_regtry __ARGS((nfa_state_T *start, colnr_T col));
- static long nfa_regexec_both __ARGS((char_u *line, colnr_T col));
- static regprog_T *nfa_regcomp __ARGS((char_u *expr, int re_flags));
- --- 217,227 ----
- static nfa_state_T *post2nfa __ARGS((int *postfix, int *end, int nfa_calc_size));
- static int check_char_class __ARGS((int class, int c));
- static void st_error __ARGS((int *postfix, int *end, int *p));
- + static void nfa_set_neg_listids __ARGS((nfa_state_T *start));
- + static void nfa_set_null_listids __ARGS((nfa_state_T *start));
- static void nfa_save_listids __ARGS((nfa_state_T *start, int *list));
- static void nfa_restore_listids __ARGS((nfa_state_T *start, int *list));
- ! static int nfa_re_num_cmp __ARGS((long_u val, int op, long_u pos));
- static long nfa_regtry __ARGS((nfa_state_T *start, colnr_T col));
- static long nfa_regexec_both __ARGS((char_u *line, colnr_T col));
- static regprog_T *nfa_regcomp __ARGS((char_u *expr, int re_flags));
- ***************
- *** 831,838 ****
- break;
-
- case '#':
- ! /* TODO: not supported yet */
- ! return FAIL;
- break;
-
- case 'V':
- --- 844,850 ----
- break;
-
- case '#':
- ! EMIT(NFA_CURSOR);
- break;
-
- case 'V':
- ***************
- *** 844,866 ****
- /* TODO: \%[abc] not supported yet */
- return FAIL;
-
- - case '0':
- - case '1':
- - case '2':
- - case '3':
- - case '4':
- - case '5':
- - case '6':
- - case '7':
- - case '8':
- - case '9':
- - case '<':
- - case '>':
- - case '\'':
- - /* TODO: not supported yet */
- - return FAIL;
- -
- default:
- syntax_error = TRUE;
- EMSGN(_("E867: (NFA) Unknown operator '\\%%%c'"),
- no_Magic(c));
- --- 856,891 ----
- /* TODO: \%[abc] not supported yet */
- return FAIL;
-
- default:
- + {
- + long_u n = 0;
- + int cmp = c;
- +
- + if (c == '<' || c == '>')
- + c = getchr();
- + while (VIM_ISDIGIT(c))
- + {
- + n = n * 10 + (c - '0');
- + c = getchr();
- + }
- + if (c == 'l' || c == 'c' || c == 'v')
- + {
- + EMIT(n);
- + if (c == 'l')
- + EMIT(cmp == '<' ? NFA_LNUM_LT :
- + cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
- + else if (c == 'c')
- + EMIT(cmp == '<' ? NFA_COL_LT :
- + cmp == '>' ? NFA_COL_GT : NFA_COL);
- + else
- + EMIT(cmp == '<' ? NFA_VCOL_LT :
- + cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);
- + break;
- + }
- + else if (c == '\'')
- + /* TODO: \%'m not supported yet */
- + return FAIL;
- + }
- syntax_error = TRUE;
- EMSGN(_("E867: (NFA) Unknown operator '\\%%%c'"),
- no_Magic(c));
- ***************
- *** 1679,1684 ****
- --- 1704,1711 ----
-
- case NFA_PREV_ATOM_NO_WIDTH:
- STRCPY(code, "NFA_PREV_ATOM_NO_WIDTH"); break;
- + case NFA_PREV_ATOM_NO_WIDTH_NEG:
- + STRCPY(code, "NFA_PREV_ATOM_NO_WIDTH_NEG"); break;
- case NFA_NOPEN: STRCPY(code, "NFA_MOPEN_INVISIBLE"); break;
- case NFA_NCLOSE: STRCPY(code, "NFA_MCLOSE_INVISIBLE"); break;
- case NFA_START_INVISIBLE: STRCPY(code, "NFA_START_INVISIBLE"); break;
- ***************
- *** 2444,2449 ****
- --- 2471,2498 ----
- PUSH(frag(s, list1(&s1->out)));
- break;
-
- + case NFA_LNUM:
- + case NFA_LNUM_GT:
- + case NFA_LNUM_LT:
- + case NFA_VCOL:
- + case NFA_VCOL_GT:
- + case NFA_VCOL_LT:
- + case NFA_COL:
- + case NFA_COL_GT:
- + case NFA_COL_LT:
- + if (nfa_calc_size == TRUE)
- + {
- + nstate += 1;
- + break;
- + }
- + e1 = POP();
- + s = new_state(*p, NULL, NULL);
- + if (s == NULL)
- + goto theend;
- + s->val = e1.start->c;
- + PUSH(frag(s, list1(&s->out)));
- + break;
- +
- case NFA_ZSTART:
- case NFA_ZEND:
- default:
- ***************
- *** 3076,3081 ****
- --- 3125,3141 ----
- }
- }
-
- + static int
- + nfa_re_num_cmp(val, op, pos)
- + long_u val;
- + int op;
- + long_u pos;
- + {
- + if (op == 1) return pos > val;
- + if (op == 2) return pos < val;
- + return val == pos;
- + }
- +
- static int nfa_regmatch __ARGS((nfa_state_T *start, regsub_T *submatch, regsub_T *m));
-
- /*
- ***************
- *** 3791,3796 ****
- --- 3851,3895 ----
- /* TODO: should not happen? */
- break;
-
- + case NFA_LNUM:
- + case NFA_LNUM_GT:
- + case NFA_LNUM_LT:
- + result = (REG_MULTI &&
- + nfa_re_num_cmp(t->state->val, t->state->c - NFA_LNUM,
- + (long_u)(reglnum + reg_firstlnum)));
- + if (result)
- + addstate_here(thislist, t->state->out, &t->sub, &listidx);
- + break;
- +
- + case NFA_COL:
- + case NFA_COL_GT:
- + case NFA_COL_LT:
- + result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_COL,
- + (long_u)(reginput - regline) + 1);
- + if (result)
- + addstate_here(thislist, t->state->out, &t->sub, &listidx);
- + break;
- +
- + case NFA_VCOL:
- + case NFA_VCOL_GT:
- + case NFA_VCOL_LT:
- + result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_VCOL,
- + (long_u)win_linetabsize(
- + reg_win == NULL ? curwin : reg_win,
- + regline, (colnr_T)(reginput - regline)) + 1);
- + if (result)
- + addstate_here(thislist, t->state->out, &t->sub, &listidx);
- + break;
- +
- + case NFA_CURSOR:
- + result = (reg_win != NULL
- + && (reglnum + reg_firstlnum == reg_win->w_cursor.lnum)
- + && ((colnr_T)(reginput - regline)
- + == reg_win->w_cursor.col));
- + if (result)
- + addstate_here(thislist, t->state->out, &t->sub, &listidx);
- + break;
- +
- default: /* regular character */
- {
- int c = t->state->c;
- *** ../vim-7.3.1038/src/testdir/test64.in 2013-05-29 18:45:07.000000000 +0200
- --- src/testdir/test64.in 2013-05-29 21:02:52.000000000 +0200
- ***************
- *** 413,425 ****
- :.yank
- y$Gop:"
- :"
- - :"
- :" Check a pattern with a look beind crossing a line boundary
- /^Behind:
- /\(<\_[xy]\+\)\@3<=start
- :.yank
- Gop:"
- :"
- :/\%#=1^Results/,$wq! test.out
- ENDTEST
-
- --- 413,452 ----
- :.yank
- y$Gop:"
- :"
- :" Check a pattern with a look beind crossing a line boundary
- /^Behind:
- /\(<\_[xy]\+\)\@3<=start
- :.yank
- Gop:"
- :"
- + :" Check patterns matching cursor position.
- + :func! Postest()
- + new
- + call setline(1, ['ffooooo', 'boboooo', 'zoooooo', 'koooooo', 'moooooo', "\t\t\tfoo", 'abababababababfoo', 'bababababababafoo', '********_'])
- + call setpos('.', [0, 1, 0, 0])
- + s/\%>3c.//g
- + call setpos('.', [0, 2, 4, 0])
- + s/\%#.*$//g
- + call setpos('.', [0, 3, 0, 0])
- + s/\%<3c./_/g
- + %s/\%4l\%>5c./_/g
- + %s/\%6l\%>25v./_/g
- + %s/\%>6l\%3c./!/g
- + %s/\%>7l\%12c./?/g
- + %s/\%>7l\%<9l\%>5v\%<8v./#/g
- + 1,$yank
- + quit!
- + endfunc
- + Go-0-:set re=0
- + :call Postest()
- + :put
- + o-1-:set re=1
- + :call Postest()
- + :put
- + o-2-:set re=2
- + :call Postest()
- + :put
- + :"
- :/\%#=1^Results/,$wq! test.out
- ENDTEST
-
- *** ../vim-7.3.1038/src/testdir/test64.ok 2013-05-29 18:45:07.000000000 +0200
- --- src/testdir/test64.ok 2013-05-29 21:02:49.000000000 +0200
- ***************
- *** 740,742 ****
- --- 740,772 ----
- ghi
-
- xxxstart3
- + -0-
- + ffo
- + bob
- + __ooooo
- + koooo__
- + moooooo
- + f__
- + ab!babababababfoo
- + ba!ab##abab?bafoo
- + **!*****_
- + -1-
- + ffo
- + bob
- + __ooooo
- + koooo__
- + moooooo
- + f__
- + ab!babababababfoo
- + ba!ab##abab?bafoo
- + **!*****_
- + -2-
- + ffo
- + bob
- + __ooooo
- + koooo__
- + moooooo
- + f__
- + ab!babababababfoo
- + ba!ab##abab?bafoo
- + **!*****_
- *** ../vim-7.3.1038/src/version.c 2013-05-29 19:17:55.000000000 +0200
- --- src/version.c 2013-05-29 21:11:47.000000000 +0200
- ***************
- *** 730,731 ****
- --- 730,733 ----
- { /* Add new patch number below this line */
- + /**/
- + 1039,
- /**/
-
- --
- hundred-and-one symptoms of being an internet addict:
- 16. You step out of your room and realize that your parents have moved and
- you don't have a clue when it happened.
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
- /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
- \\\ an exciting new programming language -- http://www.Zimbu.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
-