Date: Wed, 8 Jun 1994 09:52:32 -0400 From: emory!cc.gatech.edu!arnold (Arnold Robbins) Subject: unofficial fix for string concatenation bug in gawk *** eval.c.orig Tue May 10 21:58:13 1994 --- eval.c Tue Jun 7 18:30:46 1994 *************** *** 499,512 **** case Node_concat: { ! #define STACKSIZE 10 ! NODE *treelist[STACKSIZE+1]; ! NODE *strlist[STACKSIZE+1]; register NODE **treep; register NODE **strp; register size_t len; char *str; register char *dest; /* * This is an efficiency hack for multiple adjacent string --- 499,513 ---- case Node_concat: { ! NODE **treelist; ! NODE **strlist; ! NODE *save_tree; register NODE **treep; register NODE **strp; register size_t len; char *str; register char *dest; + int count; /* * This is an efficiency hack for multiple adjacent string *************** *** 516,527 **** * descend to lowest (first) node, accumulating nodes * to evaluate to strings as we go. */ treep = treelist; ! while (tree->type == Node_concat) { *treep++ = tree->rnode; tree = tree->lnode; - if (treep == &treelist[STACKSIZE]) - break; } *treep = tree; /* --- 517,542 ---- * descend to lowest (first) node, accumulating nodes * to evaluate to strings as we go. */ + + /* + * But first, no arbitrary limits. Count the number of + * nodes and malloc the treelist and strlist arrays. + * There will be count + 1 items to concatenate. We + * also leave room for an extra pointer at the end to + * use as a sentinel. Thus, start count at 2. + */ + save_tree = tree; + for (count = 2; tree && tree->type == Node_concat; tree = tree->lnode) + count++; + tree = save_tree; + emalloc(treelist, NODE **, sizeof(NODE *) * count, "tree_eval"); + emalloc(strlist, NODE **, sizeof(NODE *) * count, "tree_eval"); + + /* Now, here we go. */ treep = treelist; ! while (tree && tree->type == Node_concat) { *treep++ = tree->rnode; tree = tree->lnode; } *treep = tree; /* *************** *** 549,554 **** --- 564,572 ---- } r = make_str_node(str, len, ALREADY_MALLOCED); r->flags |= TEMP; + + free(strlist); + free(treelist); } return r;