Loading ...
Sorry, an error occurred while loading the content.

Patch 7.3.1087

Expand Messages
  • Bram Moolenaar
    Patch 7.3.1087 Problem: A leading star is not seen as a normal char when {} follows. Solution: Save and restore the parse state properly. Files:
    Message 1 of 1 , Jun 1, 2013
    • 0 Attachment
      Patch 7.3.1087
      Problem: A leading star is not seen as a normal char when \{} follows.
      Solution: Save and restore the parse state properly.
      Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
      src/testdir/test64.ok


      *** ../vim-7.3.1086/src/regexp.c 2013-05-29 18:45:07.000000000 +0200
      --- src/regexp.c 2013-06-01 14:33:26.000000000 +0200
      ***************
      *** 665,674 ****
      --- 665,689 ----
      #define REG_ZPAREN 2 /* \z(\) */
      #define REG_NPAREN 3 /* \%(\) */

      + typedef struct
      + {
      + char_u *regparse;
      + int prevchr_len;
      + int curchr;
      + int prevchr;
      + int prevprevchr;
      + int nextchr;
      + int at_start;
      + int prev_at_start;
      + int regnpar;
      + } parse_state_T;
      +
      /*
      * Forward declarations for vim_regcomp()'s friends.
      */
      static void initchr __ARGS((char_u *));
      + static void save_parse_state __ARGS((parse_state_T *ps));
      + static void restore_parse_state __ARGS((parse_state_T *ps));
      static int getchr __ARGS((void));
      static void skipchr_keepstart __ARGS((void));
      static int peekchr __ARGS((void));
      ***************
      *** 2951,2956 ****
      --- 2966,3009 ----
      }

      /*
      + * Save the current parse state, so that it can be restored and parsing
      + * starts in the same state again.
      + */
      + static void
      + save_parse_state(ps)
      + parse_state_T *ps;
      + {
      + ps->regparse = regparse;
      + ps->prevchr_len = prevchr_len;
      + ps->curchr = curchr;
      + ps->prevchr = prevchr;
      + ps->prevprevchr = prevprevchr;
      + ps->nextchr = nextchr;
      + ps->at_start = at_start;
      + ps->prev_at_start = prev_at_start;
      + ps->regnpar = regnpar;
      + }
      +
      + /*
      + * Restore a previously saved parse state.
      + */
      + static void
      + restore_parse_state(ps)
      + parse_state_T *ps;
      + {
      + regparse = ps->regparse;
      + prevchr_len = ps->prevchr_len;
      + curchr = ps->curchr;
      + prevchr = ps->prevchr;
      + prevprevchr = ps->prevprevchr;
      + nextchr = ps->nextchr;
      + at_start = ps->at_start;
      + prev_at_start = ps->prev_at_start;
      + regnpar = ps->regnpar;
      + }
      +
      +
      + /*
      * Get the next character without advancing.
      */
      static int
      *** ../vim-7.3.1086/src/regexp_nfa.c 2013-06-01 13:24:19.000000000 +0200
      --- src/regexp_nfa.c 2013-06-01 14:30:27.000000000 +0200
      ***************
      *** 1318,1336 ****
      int ret;
      long minval, maxval;
      int greedy = TRUE; /* Braces are prefixed with '-' ? */
      ! char_u *old_regparse, *new_regparse;
      int c2;
      int old_post_pos;
      int my_post_start;
      - int old_regnpar;
      int quest;

      ! /* Save the current position in the regexp, so that we can use it if
      ! * <atom>{m,n} is next. */
      ! old_regparse = regparse;
      ! /* Save current number of open parenthesis, so we can use it if
      ! * <atom>{m,n} is next */
      ! old_regnpar = regnpar;
      /* store current pos in the postfix form, for \{m,n} involving 0s */
      my_post_start = (int)(post_ptr - post_start);

      --- 1318,1334 ----
      int ret;
      long minval, maxval;
      int greedy = TRUE; /* Braces are prefixed with '-' ? */
      ! parse_state_T old_state;
      ! parse_state_T new_state;
      int c2;
      int old_post_pos;
      int my_post_start;
      int quest;

      ! /* Save the current parse state, so that we can use it if <atom>{m,n} is
      ! * next. */
      ! save_parse_state(&old_state);
      !
      /* store current pos in the postfix form, for \{m,n} involving 0s */
      my_post_start = (int)(post_ptr - post_start);

      ***************
      *** 1361,1368 ****
      * In order to be consistent with the old engine, we replace
      * <atom>+ with <atom><atom>*
      */
      ! regnpar = old_regnpar;
      ! regparse = old_regparse;
      curchr = -1;
      if (nfa_regatom() == FAIL)
      return FAIL;
      --- 1359,1365 ----
      * In order to be consistent with the old engine, we replace
      * <atom>+ with <atom><atom>*
      */
      ! restore_parse_state(&old_state);
      curchr = -1;
      if (nfa_regatom() == FAIL)
      return FAIL;
      ***************
      *** 1452,1468 ****

      /* Ignore previous call to nfa_regatom() */
      post_ptr = post_start + my_post_start;
      ! /* Save pos after the repeated atom and the \{} */
      ! new_regparse = regparse;

      quest = (greedy == TRUE? NFA_QUEST : NFA_QUEST_NONGREEDY);
      for (i = 0; i < maxval; i++)
      {
      /* Goto beginning of the repeated atom */
      ! regparse = old_regparse;
      ! curchr = -1;
      ! /* Restore count of parenthesis */
      ! regnpar = old_regnpar;
      old_post_pos = (int)(post_ptr - post_start);
      if (nfa_regatom() == FAIL)
      return FAIL;
      --- 1449,1462 ----

      /* Ignore previous call to nfa_regatom() */
      post_ptr = post_start + my_post_start;
      ! /* Save parse state after the repeated atom and the \{} */
      ! save_parse_state(&new_state);

      quest = (greedy == TRUE? NFA_QUEST : NFA_QUEST_NONGREEDY);
      for (i = 0; i < maxval; i++)
      {
      /* Goto beginning of the repeated atom */
      ! restore_parse_state(&old_state);
      old_post_pos = (int)(post_ptr - post_start);
      if (nfa_regatom() == FAIL)
      return FAIL;
      ***************
      *** 1486,1492 ****
      }

      /* Go to just after the repeated atom and the \{} */
      ! regparse = new_regparse;
      curchr = -1;

      break;
      --- 1480,1486 ----
      }

      /* Go to just after the repeated atom and the \{} */
      ! restore_parse_state(&new_state);
      curchr = -1;

      break;
      *** ../vim-7.3.1086/src/testdir/test64.in 2013-06-01 13:24:19.000000000 +0200
      --- src/testdir/test64.in 2013-06-01 14:36:15.000000000 +0200
      ***************
      *** 188,193 ****
      --- 188,197 ----
      :call add(tl, [2, 'a\{,0}', 'oidfguih iuhi hiu aaaa', ''])
      :call add(tl, [2, 'a\{,5}', 'abcd', 'a'])
      :call add(tl, [2, 'a\{,5}', 'aaaaaaaaaa', 'aaaaa'])
      + :" leading star as normal char when \{} follows
      + :call add(tl, [2, '^*\{4,}$', '***'])
      + :call add(tl, [2, '^*\{4,}$', '****', '****'])
      + :call add(tl, [2, '^*\{4,}$', '*****', '*****'])
      :" same thing as 'a*'
      :call add(tl, [2, 'a\{}', 'bbbcddiuhfcd', ''])
      :call add(tl, [2, 'a\{}', 'aaaaioudfh coisf jda', 'aaaa'])
      *** ../vim-7.3.1086/src/testdir/test64.ok 2013-06-01 13:24:19.000000000 +0200
      --- src/testdir/test64.ok 2013-06-01 14:36:39.000000000 +0200
      ***************
      *** 407,412 ****
      --- 407,421 ----
      OK 0 - a\{,5}
      OK 1 - a\{,5}
      OK 2 - a\{,5}
      + OK 0 - ^*\{4,}$
      + OK 1 - ^*\{4,}$
      + OK 2 - ^*\{4,}$
      + OK 0 - ^*\{4,}$
      + OK 1 - ^*\{4,}$
      + OK 2 - ^*\{4,}$
      + OK 0 - ^*\{4,}$
      + OK 1 - ^*\{4,}$
      + OK 2 - ^*\{4,}$
      OK 0 - a\{}
      OK 1 - a\{}
      OK 2 - a\{}
      *** ../vim-7.3.1086/src/version.c 2013-06-01 13:24:19.000000000 +0200
      --- src/version.c 2013-06-01 14:37:37.000000000 +0200
      ***************
      *** 730,731 ****
      --- 730,733 ----
      { /* Add new patch number below this line */
      + /**/
      + 1087,
      /**/

      --
      Change is inevitable, except from a vending machine.

      /// Bram Moolenaar -- Bram@... -- 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 ///

      --
      --
      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 vim_dev+unsubscribe@....
      For more options, visit https://groups.google.com/groups/opt_out.
    Your message has been successfully submitted and would be delivered to recipients shortly.