home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / patches / 7.3 / 7.3.1039 < prev    next >
Encoding:
Internet Message Format  |  2013-05-28  |  9.9 KB

  1. To: vim_dev@googlegroups.com
  2. Subject: Patch 7.3.1039
  3. Fcc: outbox
  4. From: Bram Moolenaar <Bram@moolenaar.net>
  5. Mime-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. ------------
  9.  
  10. Patch 7.3.1039
  11. Problem:    New regexp engine does not support \%23c, \%<23c and the like. 
  12. Solution:   Implement them. (partly by Yasuhiro Matsumoto)
  13. Files:        src/regexp.h, src/regexp_nfa.c, src/testdir/test64.in,
  14.         src/testdir/test64.ok
  15.  
  16.  
  17. *** ../vim-7.3.1038/src/regexp.h    2013-05-28 22:03:13.000000000 +0200
  18. --- src/regexp.h    2013-05-29 20:35:35.000000000 +0200
  19. ***************
  20. *** 72,77 ****
  21. --- 72,78 ----
  22.       int            id;
  23.       int            lastlist;
  24.       int            negated;
  25. +     int            val;
  26.   };
  27.   
  28.   /*
  29. *** ../vim-7.3.1038/src/regexp_nfa.c    2013-05-29 18:45:07.000000000 +0200
  30. --- src/regexp_nfa.c    2013-05-29 20:59:34.000000000 +0200
  31. ***************
  32. *** 117,122 ****
  33. --- 117,134 ----
  34.       NFA_NLOWER,        /*    Match non-lowercase char */
  35.       NFA_UPPER,        /*    Match uppercase char */
  36.       NFA_NUPPER,        /*    Match non-uppercase char */
  37. +     NFA_CURSOR,        /*    Match cursor pos */
  38. +     NFA_LNUM,        /*    Match line number */
  39. +     NFA_LNUM_GT,    /*    Match > line number */
  40. +     NFA_LNUM_LT,    /*    Match < line number */
  41. +     NFA_COL,        /*    Match cursor column */
  42. +     NFA_COL_GT,        /*    Match > cursor column */
  43. +     NFA_COL_LT,        /*    Match < cursor column */
  44. +     NFA_VCOL,        /*    Match cursor virtual column */
  45. +     NFA_VCOL_GT,    /*    Match > cursor virtual column */
  46. +     NFA_VCOL_LT,    /*    Match < cursor virtual column */
  47.       NFA_FIRST_NL = NFA_ANY + ADD_NL,
  48.       NFA_LAST_NL = NFA_NUPPER + ADD_NL,
  49.   
  50. ***************
  51. *** 205,214 ****
  52.   static nfa_state_T *post2nfa __ARGS((int *postfix, int *end, int nfa_calc_size));
  53.   static int check_char_class __ARGS((int class, int c));
  54.   static void st_error __ARGS((int *postfix, int *end, int *p));
  55.   static void nfa_save_listids __ARGS((nfa_state_T *start, int *list));
  56.   static void nfa_restore_listids __ARGS((nfa_state_T *start, int *list));
  57. ! static void nfa_set_null_listids __ARGS((nfa_state_T *start));
  58. ! static void nfa_set_neg_listids __ARGS((nfa_state_T *start));
  59.   static long nfa_regtry __ARGS((nfa_state_T *start, colnr_T col));
  60.   static long nfa_regexec_both __ARGS((char_u *line, colnr_T col));
  61.   static regprog_T *nfa_regcomp __ARGS((char_u *expr, int re_flags));
  62. --- 217,227 ----
  63.   static nfa_state_T *post2nfa __ARGS((int *postfix, int *end, int nfa_calc_size));
  64.   static int check_char_class __ARGS((int class, int c));
  65.   static void st_error __ARGS((int *postfix, int *end, int *p));
  66. + static void nfa_set_neg_listids __ARGS((nfa_state_T *start));
  67. + static void nfa_set_null_listids __ARGS((nfa_state_T *start));
  68.   static void nfa_save_listids __ARGS((nfa_state_T *start, int *list));
  69.   static void nfa_restore_listids __ARGS((nfa_state_T *start, int *list));
  70. ! static int nfa_re_num_cmp __ARGS((long_u val, int op, long_u pos));
  71.   static long nfa_regtry __ARGS((nfa_state_T *start, colnr_T col));
  72.   static long nfa_regexec_both __ARGS((char_u *line, colnr_T col));
  73.   static regprog_T *nfa_regcomp __ARGS((char_u *expr, int re_flags));
  74. ***************
  75. *** 831,838 ****
  76.               break;
  77.   
  78.           case '#':
  79. !             /* TODO: not supported yet */
  80. !             return FAIL;
  81.               break;
  82.   
  83.           case 'V':
  84. --- 844,850 ----
  85.               break;
  86.   
  87.           case '#':
  88. !             EMIT(NFA_CURSOR);
  89.               break;
  90.   
  91.           case 'V':
  92. ***************
  93. *** 844,866 ****
  94.               /* TODO: \%[abc] not supported yet */
  95.               return FAIL;
  96.   
  97. -         case '0':
  98. -         case '1':
  99. -         case '2':
  100. -         case '3':
  101. -         case '4':
  102. -         case '5':
  103. -         case '6':
  104. -         case '7':
  105. -         case '8':
  106. -         case '9':
  107. -         case '<':
  108. -         case '>':
  109. -         case '\'':
  110. -             /* TODO: not supported yet */
  111. -             return FAIL;
  112.           default:
  113.               syntax_error = TRUE;
  114.               EMSGN(_("E867: (NFA) Unknown operator '\\%%%c'"),
  115.                                    no_Magic(c));
  116. --- 856,891 ----
  117.               /* TODO: \%[abc] not supported yet */
  118.               return FAIL;
  119.   
  120.           default:
  121. +             {
  122. +             long_u    n = 0;
  123. +             int    cmp = c;
  124. +             if (c == '<' || c == '>')
  125. +                 c = getchr();
  126. +             while (VIM_ISDIGIT(c))
  127. +             {
  128. +                 n = n * 10 + (c - '0');
  129. +                 c = getchr();
  130. +             }
  131. +             if (c == 'l' || c == 'c' || c == 'v')
  132. +             {
  133. +                 EMIT(n);
  134. +                 if (c == 'l')
  135. +                 EMIT(cmp == '<' ? NFA_LNUM_LT :
  136. +                     cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
  137. +                 else if (c == 'c')
  138. +                 EMIT(cmp == '<' ? NFA_COL_LT :
  139. +                     cmp == '>' ? NFA_COL_GT : NFA_COL);
  140. +                 else
  141. +                 EMIT(cmp == '<' ? NFA_VCOL_LT :
  142. +                     cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);
  143. +                 break;
  144. +             }
  145. +             else if (c == '\'')
  146. +                 /* TODO: \%'m not supported yet */
  147. +                 return FAIL;
  148. +             }
  149.               syntax_error = TRUE;
  150.               EMSGN(_("E867: (NFA) Unknown operator '\\%%%c'"),
  151.                                    no_Magic(c));
  152. ***************
  153. *** 1679,1684 ****
  154. --- 1704,1711 ----
  155.   
  156.       case NFA_PREV_ATOM_NO_WIDTH:
  157.                   STRCPY(code, "NFA_PREV_ATOM_NO_WIDTH"); break;
  158. +     case NFA_PREV_ATOM_NO_WIDTH_NEG:
  159. +                 STRCPY(code, "NFA_PREV_ATOM_NO_WIDTH_NEG"); break;
  160.       case NFA_NOPEN:            STRCPY(code, "NFA_MOPEN_INVISIBLE"); break;
  161.       case NFA_NCLOSE:        STRCPY(code, "NFA_MCLOSE_INVISIBLE"); break;
  162.       case NFA_START_INVISIBLE:   STRCPY(code, "NFA_START_INVISIBLE"); break;
  163. ***************
  164. *** 2444,2449 ****
  165. --- 2471,2498 ----
  166.           PUSH(frag(s, list1(&s1->out)));
  167.           break;
  168.   
  169. +     case NFA_LNUM:
  170. +     case NFA_LNUM_GT:
  171. +     case NFA_LNUM_LT:
  172. +     case NFA_VCOL:
  173. +     case NFA_VCOL_GT:
  174. +     case NFA_VCOL_LT:
  175. +     case NFA_COL:
  176. +     case NFA_COL_GT:
  177. +     case NFA_COL_LT:
  178. +         if (nfa_calc_size == TRUE)
  179. +         {
  180. +         nstate += 1;
  181. +         break;
  182. +         }
  183. +         e1 = POP();
  184. +         s = new_state(*p, NULL, NULL);
  185. +         if (s == NULL)
  186. +         goto theend;
  187. +         s->val = e1.start->c;
  188. +         PUSH(frag(s, list1(&s->out)));
  189. +         break;
  190.       case NFA_ZSTART:
  191.       case NFA_ZEND:
  192.       default:
  193. ***************
  194. *** 3076,3081 ****
  195. --- 3125,3141 ----
  196.       }
  197.   }
  198.   
  199. +     static int
  200. + nfa_re_num_cmp(val, op, pos)
  201. +     long_u    val;
  202. +     int        op;
  203. +     long_u    pos;
  204. + {
  205. +     if (op == 1) return pos > val;
  206. +     if (op == 2) return pos < val;
  207. +     return val == pos;
  208. + }
  209.   static int nfa_regmatch __ARGS((nfa_state_T *start, regsub_T *submatch, regsub_T *m));
  210.   
  211.   /*
  212. ***************
  213. *** 3791,3796 ****
  214. --- 3851,3895 ----
  215.           /* TODO: should not happen? */
  216.           break;
  217.   
  218. +         case NFA_LNUM:
  219. +         case NFA_LNUM_GT:
  220. +         case NFA_LNUM_LT:
  221. +         result = (REG_MULTI &&
  222. +             nfa_re_num_cmp(t->state->val, t->state->c - NFA_LNUM,
  223. +                 (long_u)(reglnum + reg_firstlnum)));
  224. +         if (result)
  225. +             addstate_here(thislist, t->state->out, &t->sub, &listidx);
  226. +         break;
  227. +         case NFA_COL:
  228. +         case NFA_COL_GT:
  229. +         case NFA_COL_LT:
  230. +         result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_COL,
  231. +             (long_u)(reginput - regline) + 1);
  232. +         if (result)
  233. +             addstate_here(thislist, t->state->out, &t->sub, &listidx);
  234. +         break;
  235. +         case NFA_VCOL:
  236. +         case NFA_VCOL_GT:
  237. +         case NFA_VCOL_LT:
  238. +         result = nfa_re_num_cmp(t->state->val, t->state->c - NFA_VCOL,
  239. +             (long_u)win_linetabsize(
  240. +                 reg_win == NULL ? curwin : reg_win,
  241. +                 regline, (colnr_T)(reginput - regline)) + 1);
  242. +         if (result)
  243. +             addstate_here(thislist, t->state->out, &t->sub, &listidx);
  244. +         break;
  245. +         case NFA_CURSOR:
  246. +         result = (reg_win != NULL
  247. +             && (reglnum + reg_firstlnum == reg_win->w_cursor.lnum)
  248. +             && ((colnr_T)(reginput - regline)
  249. +                            == reg_win->w_cursor.col));
  250. +         if (result)
  251. +             addstate_here(thislist, t->state->out, &t->sub, &listidx);
  252. +         break;
  253.           default:    /* regular character */
  254.             {
  255.           int c = t->state->c;
  256. *** ../vim-7.3.1038/src/testdir/test64.in    2013-05-29 18:45:07.000000000 +0200
  257. --- src/testdir/test64.in    2013-05-29 21:02:52.000000000 +0200
  258. ***************
  259. *** 413,425 ****
  260.   :.yank
  261.   y$Gop:"
  262.   :"
  263. - :"
  264.   :" Check a pattern with a look beind crossing a line boundary
  265.   /^Behind:
  266.   /\(<\_[xy]\+\)\@3<=start
  267.   :.yank
  268.   Gop:"
  269.   :"
  270.   :/\%#=1^Results/,$wq! test.out
  271.   ENDTEST
  272.   
  273. --- 413,452 ----
  274.   :.yank
  275.   y$Gop:"
  276.   :"
  277.   :" Check a pattern with a look beind crossing a line boundary
  278.   /^Behind:
  279.   /\(<\_[xy]\+\)\@3<=start
  280.   :.yank
  281.   Gop:"
  282.   :"
  283. + :" Check patterns matching cursor position.
  284. + :func! Postest()
  285. +  new
  286. +  call setline(1, ['ffooooo', 'boboooo', 'zoooooo', 'koooooo', 'moooooo', "\t\t\tfoo", 'abababababababfoo', 'bababababababafoo', '********_'])
  287. +  call setpos('.', [0, 1, 0, 0])
  288. +  s/\%>3c.//g
  289. +  call setpos('.', [0, 2, 4, 0])
  290. +  s/\%#.*$//g
  291. +  call setpos('.', [0, 3, 0, 0])
  292. +  s/\%<3c./_/g
  293. +  %s/\%4l\%>5c./_/g
  294. +  %s/\%6l\%>25v./_/g
  295. +  %s/\%>6l\%3c./!/g
  296. +  %s/\%>7l\%12c./?/g
  297. +  %s/\%>7l\%<9l\%>5v\%<8v./#/g
  298. +  1,$yank
  299. +  quit!
  300. + endfunc
  301. + Go-0-:set re=0
  302. + :call Postest()
  303. + :put
  304. + o-1-:set re=1
  305. + :call Postest()
  306. + :put
  307. + o-2-:set re=2
  308. + :call Postest()
  309. + :put
  310. + :"
  311.   :/\%#=1^Results/,$wq! test.out
  312.   ENDTEST
  313.   
  314. *** ../vim-7.3.1038/src/testdir/test64.ok    2013-05-29 18:45:07.000000000 +0200
  315. --- src/testdir/test64.ok    2013-05-29 21:02:49.000000000 +0200
  316. ***************
  317. *** 740,742 ****
  318. --- 740,772 ----
  319.   ghi
  320.   
  321.   xxxstart3
  322. + -0-
  323. + ffo
  324. + bob
  325. + __ooooo
  326. + koooo__
  327. + moooooo
  328. +             f__
  329. + ab!babababababfoo
  330. + ba!ab##abab?bafoo
  331. + **!*****_
  332. + -1-
  333. + ffo
  334. + bob
  335. + __ooooo
  336. + koooo__
  337. + moooooo
  338. +             f__
  339. + ab!babababababfoo
  340. + ba!ab##abab?bafoo
  341. + **!*****_
  342. + -2-
  343. + ffo
  344. + bob
  345. + __ooooo
  346. + koooo__
  347. + moooooo
  348. +             f__
  349. + ab!babababababfoo
  350. + ba!ab##abab?bafoo
  351. + **!*****_
  352. *** ../vim-7.3.1038/src/version.c    2013-05-29 19:17:55.000000000 +0200
  353. --- src/version.c    2013-05-29 21:11:47.000000000 +0200
  354. ***************
  355. *** 730,731 ****
  356. --- 730,733 ----
  357.   {   /* Add new patch number below this line */
  358. + /**/
  359. +     1039,
  360.   /**/
  361.  
  362. -- 
  363. hundred-and-one symptoms of being an internet addict:
  364. 16. You step out of your room and realize that your parents have moved and
  365.     you don't have a clue when it happened.
  366.  
  367.  /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
  368. ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
  369. \\\  an exciting new programming language -- http://www.Zimbu.org        ///
  370.  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
  371.