[augeas-devel] augeas: master - * src/regexp.c (regexp_escape): fix stripping of enclosing parens

David Lutterkort lutter at fedoraproject.org
Fri Nov 13 19:26:52 UTC 2009


Gitweb:        http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=f6568ba916e08707e6bb6050eb7c643958fb1c4b
Commit:        f6568ba916e08707e6bb6050eb7c643958fb1c4b
Parent:        adfc3c0082139324d458b1f5ebbb46b1c5492049
Author:        David Lutterkort <lutter at redhat.com>
AuthorDate:    Wed Nov 11 16:05:12 2009 -0800
Committer:     David Lutterkort <lutter at redhat.com>
CommitterDate: Fri Nov 13 10:45:05 2009 -0800

* src/regexp.c (regexp_escape): fix stripping of enclosing parens

Only strip them if they belong together, and not for something like /(a)(b)/
---
 src/regexp.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/regexp.c b/src/regexp.c
index 795e6f0..15a73af 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -68,9 +68,21 @@ char *regexp_escape(const struct regexp *r) {
         }
     }
 
-    if (pat[0] == '(' && pat[strlen(pat)-1] == ')')
-        memmove(pat, pat+1, strlen(pat+1)+1);
-    pat[strlen(pat)] = '\0';
+    if (pat[0] == '(' && pat[strlen(pat)-1] == ')') {
+        int level = 1;
+        for (int i=1; i < strlen(pat)-1; i++) {
+            if (pat[i] == '(')
+                level += 1;
+            if (pat[i] == ')')
+                level -= 1;
+            if (level == 0)
+                break;
+        }
+        if (level == 1) {
+            memmove(pat, pat+1, strlen(pat+1)+1);
+            pat[strlen(pat)-1] = '\0';
+        }
+    }
 
     return pat;
 }




More information about the augeas-devel mailing list