c118600f22
- fix #222531: Replace dist by ?dist - Resolves: rhbz#222531
256 lines
6.1 KiB
Diff
256 lines
6.1 KiB
Diff
--- gawk-3.1.5/field.c.freewstr 2007-01-15 11:02:51.000000000 +0100
|
|
+++ gawk-3.1.5/field.c 2007-01-15 11:21:56.000000000 +0100
|
|
@@ -155,6 +155,7 @@
|
|
ofs = force_string(OFS_node->var_value);
|
|
ofslen = ofs->stlen;
|
|
for (i = NF; i > 0; i--) {
|
|
+ free_wstr(fields_arr[i]);
|
|
tmp = fields_arr[i];
|
|
tmp = force_string(tmp);
|
|
tlen += tmp->stlen;
|
|
@@ -922,7 +923,7 @@
|
|
FIELDWIDTHS[0] = 0;
|
|
for (i = 1; ; i++) {
|
|
unsigned long int tmp;
|
|
- if (i >= fw_alloc) {
|
|
+ if (i + 1 >= fw_alloc) {
|
|
fw_alloc *= 2;
|
|
erealloc(FIELDWIDTHS, int *, fw_alloc * sizeof(int), "set_FIELDWIDTHS");
|
|
}
|
|
--- gawk-3.1.5/builtin.c.freewstr 2005-07-26 20:07:43.000000000 +0200
|
|
+++ gawk-3.1.5/builtin.c 2007-01-15 11:12:52.000000000 +0100
|
|
@@ -2089,9 +2089,9 @@
|
|
}
|
|
|
|
free(buf);
|
|
- if (wc_indices != NULL)
|
|
- free(wc_indices);
|
|
}
|
|
+ if (wc_indices != NULL)
|
|
+ free(wc_indices);
|
|
} else { /* match failed */
|
|
rstart = 0;
|
|
rlength = -1;
|
|
@@ -2462,6 +2462,8 @@
|
|
free(t->stptr);
|
|
t->stptr = buf;
|
|
t->stlen = textlen;
|
|
+ free_wstr(t);
|
|
+ t->flags &= ~(NUMCUR|NUMBER);
|
|
|
|
free_temp(s);
|
|
if (matches > 0 && lhs) {
|
|
@@ -2471,7 +2473,6 @@
|
|
}
|
|
if (after_assign != NULL)
|
|
(*after_assign)();
|
|
- t->flags &= ~(NUMCUR|NUMBER);
|
|
}
|
|
if (mb_indices != NULL)
|
|
free(mb_indices);
|
|
--- gawk-3.1.5/awk.h.freewstr 2005-07-26 20:07:43.000000000 +0200
|
|
+++ gawk-3.1.5/awk.h 2007-01-15 11:02:51.000000000 +0100
|
|
@@ -1166,6 +1166,9 @@
|
|
#define force_wstring(n) str2wstr(n, NULL)
|
|
extern const wchar_t *wstrstr P((const wchar_t *haystack, size_t hs_len, const wchar_t *needle, size_t needle_len));
|
|
extern const wchar_t *wcasestrstr P((const wchar_t *haystack, size_t hs_len, const wchar_t *needle, size_t needle_len));
|
|
+extern void free_wstr P((NODE *n));
|
|
+#else
|
|
+#define free_wstr(NODE) /* empty */
|
|
#endif
|
|
/* re.c */
|
|
extern Regexp *make_regexp P((const char *s, size_t len, int ignorecase, int dfa));
|
|
--- gawk-3.1.5/node.c.freewstr 2007-01-15 11:02:51.000000000 +0100
|
|
+++ gawk-3.1.5/node.c 2007-01-15 11:33:44.000000000 +0100
|
|
@@ -96,6 +96,7 @@
|
|
if (! do_traditional && isnondecimal(cp, TRUE)) {
|
|
n->numbr = nondec2awknum(cp, cpend - cp);
|
|
n->flags |= NUMCUR;
|
|
+ ptr = cpend;
|
|
goto finish;
|
|
}
|
|
}
|
|
@@ -218,15 +219,7 @@
|
|
no_malloc:
|
|
s->stref = 1;
|
|
s->flags |= STRCUR;
|
|
-#if defined MBS_SUPPORT
|
|
- if ((s->flags & WSTRCUR) != 0) {
|
|
- assert(s->wstptr != NULL);
|
|
- free(s->wstptr);
|
|
- s->wstptr = NULL;
|
|
- s->wstlen = 0;
|
|
- s->flags &= ~WSTRCUR;
|
|
- }
|
|
-#endif
|
|
+ free_wstr(s);
|
|
return s;
|
|
}
|
|
|
|
@@ -289,8 +282,14 @@
|
|
*r = *n;
|
|
r->flags &= ~(PERM|TEMP|FIELD);
|
|
r->flags |= MALLOC;
|
|
-#if defined MBS_SUPPORT
|
|
+#ifdef MBS_SUPPORT
|
|
+ /*
|
|
+ * DON'T call free_wstr(r) here!
|
|
+ * r->wstptr still points at n->wstptr's value, and we
|
|
+ * don't want to free it!
|
|
+ */
|
|
r->wstptr = NULL;
|
|
+ r->wstlen = 0;
|
|
#endif /* defined MBS_SUPPORT */
|
|
if (n->type == Node_val && (n->flags & STRCUR) != 0) {
|
|
r->stref = 1;
|
|
@@ -346,11 +345,7 @@
|
|
r->stref = 1;
|
|
r->stptr = NULL;
|
|
r->stlen = 0;
|
|
-#if defined MBS_SUPPORT
|
|
- r->wstptr = NULL;
|
|
- r->wstlen = 0;
|
|
- r->flags &= ~WSTRCUR;
|
|
-#endif /* MBS_SUPPORT */
|
|
+ free_wstr(r);
|
|
#endif /* GAWKDEBUG */
|
|
return r;
|
|
}
|
|
@@ -365,10 +360,11 @@
|
|
getnode(r);
|
|
r->type = Node_val;
|
|
r->flags = (STRING|STRCUR|MALLOC);
|
|
-#if defined MBS_SUPPORT
|
|
+#ifdef MBS_SUPPORT
|
|
r->wstptr = NULL;
|
|
r->wstlen = 0;
|
|
-#endif
|
|
+#endif /* defined MBS_SUPPORT */
|
|
+
|
|
if (flags & ALREADY_MALLOCED)
|
|
r->stptr = s;
|
|
else {
|
|
@@ -512,20 +508,13 @@
|
|
return;
|
|
}
|
|
free(tmp->stptr);
|
|
-#if defined MBS_SUPPORT
|
|
- if (tmp->wstptr != NULL) {
|
|
- assert((tmp->flags & WSTRCUR) != 0);
|
|
- free(tmp->wstptr);
|
|
- }
|
|
- tmp->flags &= ~WSTRCUR;
|
|
- tmp->wstptr = NULL;
|
|
- tmp->wstlen = 0;
|
|
-#endif
|
|
+ free_wstr(tmp);
|
|
}
|
|
freenode(tmp);
|
|
return;
|
|
}
|
|
if ((tmp->flags & FIELD) != 0) {
|
|
+ free_wstr(tmp);
|
|
freenode(tmp);
|
|
return;
|
|
}
|
|
@@ -706,12 +695,8 @@
|
|
return n;
|
|
/* otherwise
|
|
fall through and recompute to fill in the array */
|
|
- }
|
|
-
|
|
- if (n->wstptr != NULL) {
|
|
- free(n->wstptr);
|
|
- n->wstptr = NULL;
|
|
- n->wstlen = 0;
|
|
+ if (n->wstptr != NULL)
|
|
+ free_wstr(n);
|
|
}
|
|
|
|
/*
|
|
@@ -752,8 +737,8 @@
|
|
case (size_t) -2:
|
|
case (size_t) -1:
|
|
case 0:
|
|
- goto done;
|
|
-
|
|
+ count = 1;
|
|
+ /* fall through */
|
|
default:
|
|
*wsp++ = wc;
|
|
src_count -= count;
|
|
@@ -777,6 +762,20 @@
|
|
return n;
|
|
}
|
|
|
|
+/* free_wstr --- release the wide string part of a node */
|
|
+
|
|
+void
|
|
+free_wstr(NODE *n)
|
|
+{
|
|
+ if ((n->flags & WSTRCUR) != 0) {
|
|
+ assert(n->wstptr != NULL);
|
|
+ free(n->wstptr);
|
|
+ }
|
|
+ n->wstptr = NULL;
|
|
+ n->wstlen = 0;
|
|
+ n->flags &= ~WSTRCUR;
|
|
+}
|
|
+
|
|
#if 0
|
|
static void
|
|
dump_wstr(FILE *fp, const wchar_t *str, size_t len)
|
|
--- gawk-3.1.5/dfa.c.freewstr 2007-01-15 11:13:19.000000000 +0100
|
|
+++ gawk-3.1.5/dfa.c 2007-01-15 11:17:44.000000000 +0100
|
|
@@ -516,7 +516,6 @@
|
|
|
|
work_mbc->nchars = work_mbc->nranges = work_mbc->nch_classes = 0;
|
|
work_mbc->nequivs = work_mbc->ncoll_elems = 0;
|
|
- work_mbc->chars = NULL;
|
|
work_mbc->ch_classes = NULL;
|
|
work_mbc->range_sts = work_mbc->range_ends = NULL;
|
|
work_mbc->equivs = work_mbc->coll_elems = NULL;
|
|
@@ -1602,8 +1601,8 @@
|
|
d->states[i].constraint = 0;
|
|
d->states[i].first_end = 0;
|
|
#ifdef MBS_SUPPORT
|
|
- if (MB_CUR_MAX > 1)
|
|
- d->states[i].mbps.nelem = 0;
|
|
+ d->states[i].mbps.nelem = 0;
|
|
+ d->states[i].mbps.elems = NULL;
|
|
#endif
|
|
for (j = 0; j < s->nelem; ++j)
|
|
if (d->tokens[s->elems[j].index] < 0)
|
|
@@ -3136,8 +3135,13 @@
|
|
}
|
|
#endif /* MBS_SUPPORT */
|
|
|
|
- for (i = 0; i < d->sindex; ++i)
|
|
+ for (i = 0; i < d->sindex; ++i) {
|
|
free((ptr_t) d->states[i].elems.elems);
|
|
+#ifdef MBS_SUPPORT
|
|
+ if (d->states[i].mbps.nelem > 0)
|
|
+ free((ptr_t) d->states[i].mbps.elems);
|
|
+#endif /* MBS_SUPPORT */
|
|
+ }
|
|
free((ptr_t) d->states);
|
|
for (i = 0; i < d->tindex; ++i)
|
|
if (d->follows[i].elems)
|
|
--- gawk-3.1.5/eval.c.freewstr 2007-01-15 11:02:51.000000000 +0100
|
|
+++ gawk-3.1.5/eval.c 2007-01-15 11:02:51.000000000 +0100
|
|
@@ -1176,13 +1176,7 @@
|
|
memcpy(l->stptr + l->stlen, r->stptr, r->stlen);
|
|
l->stlen += r->stlen;
|
|
l->stptr[l->stlen] = '\0';
|
|
-#if defined MBS_SUPPORT
|
|
- if (r->wstptr != NULL)
|
|
- free(r->wstptr);
|
|
- r->wstptr = NULL;
|
|
- r->wstlen = 0;
|
|
- r->flags &= ~WSTRCUR;
|
|
-#endif /* MBS_SUPPORT */
|
|
+ free_wstr(l);
|
|
} else {
|
|
char *nval;
|
|
size_t nlen = l->stlen + r->stlen + 2;
|