diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 12:35:31 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 12:35:31 +0300 |
commit | 8ceb5f934787eb7be5fb452fb39179df66119954 (patch) | |
tree | 56a80fc5c118f7c2ebad7ab44bd8be048b2f7ec2 /re.c | |
parent | 2f83a4e72166e811a9f0b4726c19a3d5a0b17dcb (diff) | |
download | egawk-8ceb5f934787eb7be5fb452fb39179df66119954.tar.gz egawk-8ceb5f934787eb7be5fb452fb39179df66119954.tar.bz2 egawk-8ceb5f934787eb7be5fb452fb39179df66119954.zip |
Move to gawk-2.15.6.
Diffstat (limited to 're.c')
-rw-r--r-- | re.c | 20 |
1 files changed, 15 insertions, 5 deletions
@@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1991, 1992, 1993 the Free Software Foundation, Inc. + * Copyright (C) 1991-1995 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Progamming Language. @@ -101,6 +101,9 @@ int dfa; len = dest - temp; if ((rerr = re_compile_pattern(temp, len, &(rp->pat))) != NULL) fatal("%s: /%s/", rerr, temp); + + /* gack. this must be done *after* re_compile_pattern */ + rp->pat.newline_anchor = 0; /* don't get \n in middle of string */ if (dfa && !ignorecase) { dfacomp(temp, len, &(rp->dfareg), 1); rp->dfa = 1; @@ -136,10 +139,13 @@ int need_start; str[start+len] = save; } if (ret) { - if (need_start || rp->dfa == 0) - return re_search(&(rp->pat), str, start+len, start, - len, &(rp->regs)); - else + if (need_start || rp->dfa == 0) { + int result = re_search(&(rp->pat), str, start+len, + start, len, &(rp->regs)); + /* recover any space from C based alloca */ + (void) alloca(0); + return result; + } else return 1; } else return -1; @@ -151,6 +157,10 @@ Regexp *rp; { free(rp->pat.buffer); free(rp->pat.fastmap); + if (rp->regs.start) + free(rp->regs.start); + if (rp->regs.end) + free(rp->regs.end); if (rp->dfa) dfafree(&(rp->dfareg)); free(rp); |