about summary refs log tree commit diff
path: root/Src/pattern.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-10-18 09:57:00 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-10-18 09:57:00 +0000
commit910dc80a58cf3bcf91c51a72f117a46a7c9f77cf (patch)
tree35b972869c1275dc47aa6400a09fac4a60fa9c4c /Src/pattern.c
parent2246999a843ba1e6cf34e41228228609e23e650a (diff)
downloadzsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar.gz
zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar.xz
zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.zip
zsh-workers/8319
Diffstat (limited to 'Src/pattern.c')
-rw-r--r--Src/pattern.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/Src/pattern.c b/Src/pattern.c
index 3b226c92f..6b503e36d 100644
--- a/Src/pattern.c
+++ b/Src/pattern.c
@@ -427,8 +427,13 @@ patcompile(char *exp, int inflags, char **endexp)
      * The pattern was compiled in a fixed buffer:  unless told otherwise,
      * we stick the compiled pattern on the heap.  This is necessary
      * for files where we will often be compiling multiple segments at once.
+     * But if we get the ZDUP flag w always put it in zalloc()ed memory.
      */
-    if (!(patflags & PAT_STATIC)) {
+    if (patflags & PAT_ZDUP) {
+	Patprog newp = (Patprog)zalloc(patsize);
+	memcpy((char *)newp, (char *)p, patsize);
+	p = newp;
+    } else if (!(patflags & PAT_STATIC)) {
 	Patprog newp = (Patprog)zhalloc(patsize);
 	memcpy((char *)newp, (char *)p, patsize);
 	p = newp;
@@ -2188,6 +2193,32 @@ static int patrepeat(Upat p)
     return count;
 }
 
+/* Duplicate a patprog. */
+
+/**/
+Patprog
+duppatprog(Patprog prog)
+{
+    if (prog && prog != dummy_patprog1 && prog != dummy_patprog2) {
+	Patprog ret = (Patprog) alloc(prog->size);
+
+	memcpy(ret, prog, prog->size);
+
+	return ret;
+    }
+    return prog;
+}
+
+/* Free a patprog. */
+
+/**/
+void
+freepatprog(Patprog prog)
+{
+    if (prog && prog != dummy_patprog1 && prog != dummy_patprog2)
+	zfree(prog, prog->size);
+}
+
 /**/
 #ifdef ZSH_PAT_DEBUG