summaryrefslogtreecommitdiffstats
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
parentzsh-workers/8317 (diff)
downloadzsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar
zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar.gz
zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar.bz2
zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar.lz
zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar.xz
zsh-910dc80a58cf3bcf91c51a72f117a46a7c9f77cf.tar.zst
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