On Thu, May 30, 2013 at 2:15 AM, Bram Moolenaar <[email protected]> wrote:
>
> 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$Go p:"
>   :"
> - :"
>   :" Check a pattern with a look beind crossing a line boundary
>   /^Behind:
>   /\(<\_[xy]\+\)\@3<=start
>   :.yank
>   Go p:"
>   :"
>   :/\%#=1^Results/,$wq! test.out
>   ENDTEST
>
> --- 413,452 ----
>   :.yank
>   y$Go p:"
>   :"
>   :" Check a pattern with a look beind crossing a line boundary
>   /^Behind:
>   /\(<\_[xy]\+\)\@3<=start
>   :.yank
>   Go p:"
>   :"
> + :" 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,
>   /**/

This patch causes compile error:

...\vim\src\regexp_nfa.c(3879) : error C2198: 'win_linetabsize' : too
few arguments for call

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Raspunde prin e-mail lui