]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.1025 v7.3.1025
authorBram Moolenaar <Bram@vim.org>
Sun, 26 May 2013 15:45:49 +0000 (17:45 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 26 May 2013 15:45:49 +0000 (17:45 +0200)
Problem:    New regexp: not matching newline in string. (Marc Weber)
Solution:   Check for "\n" character.

src/regexp_nfa.c
src/testdir/test64.in
src/testdir/test64.ok
src/version.c

index 2ef13a81145327feb6ade74726eadc76234fddcf..df5be1100ff0cd92eaa155ee672ff896cd62612c 100644 (file)
@@ -165,9 +165,9 @@ static int *post_start;  /* holds the postfix form of r.e. */
 static int *post_end;
 static int *post_ptr;
 
-static int nstate;     /* Number of states in the NFA. */
+static int nstate;     /* Number of states in the NFA. Also used when
+                        * executing. */
 static int istate;     /* Index in the state vector, used in new_state() */
-static int nstate_max; /* Upper bound of estimated number of states. */
 
 
 static int nfa_regcomp_start __ARGS((char_u*expr, int re_flags));
@@ -219,10 +219,11 @@ nfa_regcomp_start(expr, re_flags)
     int                re_flags;           /* see vim_regcomp() */
 {
     size_t     postfix_size;
+    int                nstate_max;
 
     nstate = 0;
     istate = 0;
-    /* A reasonable estimation for size */
+    /* A reasonable estimation for maximum size */
     nstate_max = (int)(STRLEN(expr) + 1) * NFA_POSTFIX_MULTIPLIER;
 
     /* Some items blow up in size, such as [A-z].  Add more space for that.
@@ -1968,10 +1969,20 @@ new_state(c, out, out1)
  * Frag_T.out is a list of places that need to be set to the
  * next state for this fragment.
  */
+
+/* Since the out pointers in the list are always
+ * uninitialized, we use the pointers themselves
+ * as storage for the Ptrlists. */
 typedef union Ptrlist Ptrlist;
+union Ptrlist
+{
+    Ptrlist    *next;
+    nfa_state_T        *s;
+};
+
 struct Frag
 {
-    nfa_state_T   *start;
+    nfa_state_T *start;
     Ptrlist    *out;
 };
 typedef struct Frag Frag_T;
@@ -1998,17 +2009,6 @@ frag(start, out)
     return n;
 }
 
-/*
- * Since the out pointers in the list are always
- * uninitialized, we use the pointers themselves
- * as storage for the Ptrlists.
- */
-union Ptrlist
-{
-    Ptrlist    *next;
-    nfa_state_T        *s;
-};
-
 /*
  * Create singleton list containing just outp.
  */
@@ -3358,8 +3358,8 @@ nfa_regmatch(start, submatch, m)
 #endif
 
            case NFA_NEWL:
-               if (!reg_line_lbr && REG_MULTI
-                                    && curc == NUL && reglnum <= reg_maxline)
+               if (curc == NUL && !reg_line_lbr && REG_MULTI
+                                                   && reglnum <= reg_maxline)
                {
                    go_to_nextline = TRUE;
                    /* Pass -1 for the offset, which means taking the position
@@ -3367,6 +3367,12 @@ nfa_regmatch(start, submatch, m)
                    addstate(nextlist, t->state->out, &t->sub, -1,
                                                          listid + 1, &match);
                }
+               else if (curc == '\n' && reg_line_lbr)
+               {
+                   /* match \n as if it is an ordinary character */
+                   addstate(nextlist, t->state->out, &t->sub, 1,
+                                                         listid + 1, &match);
+               }
                break;
 
            case NFA_CLASS_ALNUM:
@@ -3832,7 +3838,12 @@ nfa_regcomp(expr, re_flags)
      * (and count its size). */
     postfix = re2post();
     if (postfix == NULL)
+    {
+       /* TODO: only give this error for debugging? */
+       if (post_ptr >= post_end)
+           EMSGN("Internal error: estimated max number of states insufficient: %ld", post_end - post_start);
        goto fail;          /* Cascaded (syntax?) error */
+    }
 
     /*
      * In order to build the NFA, we parse the input regexp twice:
index 1ad33d9309ad9b8d1fd3ab6e8fe3f68dec7415bd..8d0f53597ebdf77ac5d3fb08ef3fdf250090e2d4 100644 (file)
@@ -250,6 +250,9 @@ STARTTEST
 :call add(tl, [2, 'abc[0-9]*ddd', 'adf abc44482ddd oijs', 'abc44482ddd'])
 :call add(tl, [2, '\_[0-9]\+', 'asfi9888u', '9888'])
 :call add(tl, [2, '[0-9\n]\+', 'asfi9888u', '9888'])
+:call add(tl, [2, '\_[0-9]\+', "asfi\n9888u", "\n9888"])
+:call add(tl, [2, '\_f', "  \na ", "\n"])
+:call add(tl, [2, '\_f\+', "  \na ", "\na"])
 :"
 :"
 :"""" Test recognition of some character classes
index 31052fb46b785943d3ea01a88f475362dd8fc04a..40b02cdfac430803ba3eb84c28dadd5e2f145923 100644 (file)
@@ -576,6 +576,15 @@ OK 2 - \_[0-9]\+
 OK 0 - [0-9\n]\+
 OK 1 - [0-9\n]\+
 OK 2 - [0-9\n]\+
+OK 0 - \_[0-9]\+
+OK 1 - \_[0-9]\+
+OK 2 - \_[0-9]\+
+OK 0 - \_f
+OK 1 - \_f
+OK 2 - \_f
+OK 0 - \_f\+
+OK 1 - \_f\+
+OK 2 - \_f\+
 OK 0 - [0-9]
 OK 1 - [0-9]
 OK 2 - [0-9]
index f1201496f1c48a1968cc0ab0ee5175397c83d850..a44b1e298eae2495fc9f9c9072eb7c66e4c11be8 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1025,
 /**/
     1024,
 /**/