summaryrefslogtreecommitdiffstats
path: root/bin/sh
diff options
context:
space:
mode:
Diffstat (limited to 'bin/sh')
-rw-r--r--bin/sh/mknodes.c18
-rw-r--r--bin/sh/nodes.c.pat66
2 files changed, 46 insertions, 38 deletions
diff --git a/bin/sh/mknodes.c b/bin/sh/mknodes.c
index cb88301..81f42a2 100644
--- a/bin/sh/mknodes.c
+++ b/bin/sh/mknodes.c
@@ -296,10 +296,10 @@ outfunc(FILE *cfile, int calcsize)
else
fputs(" return NULL;\n", cfile);
if (calcsize)
- fputs(" funcblocksize += nodesize[n->type];\n", cfile);
+ fputs(" result->blocksize += nodesize[n->type];\n", cfile);
else {
- fputs(" new = funcblock;\n", cfile);
- fputs(" funcblock = (char *)funcblock + nodesize[n->type];\n", cfile);
+ fputs(" new = state->block;\n", cfile);
+ fputs(" state->block = (char *)state->block + nodesize[n->type];\n", cfile);
}
fputs(" switch (n->type) {\n", cfile);
for (sp = str ; sp < &str[nstr] ; sp++) {
@@ -313,33 +313,33 @@ outfunc(FILE *cfile, int calcsize)
case T_NODE:
if (calcsize) {
indent(12, cfile);
- fprintf(cfile, "calcsize(n->%s.%s);\n",
+ fprintf(cfile, "calcsize(n->%s.%s, result);\n",
sp->tag, fp->name);
} else {
indent(12, cfile);
- fprintf(cfile, "new->%s.%s = copynode(n->%s.%s);\n",
+ fprintf(cfile, "new->%s.%s = copynode(n->%s.%s, state);\n",
sp->tag, fp->name, sp->tag, fp->name);
}
break;
case T_NODELIST:
if (calcsize) {
indent(12, cfile);
- fprintf(cfile, "sizenodelist(n->%s.%s);\n",
+ fprintf(cfile, "sizenodelist(n->%s.%s, result);\n",
sp->tag, fp->name);
} else {
indent(12, cfile);
- fprintf(cfile, "new->%s.%s = copynodelist(n->%s.%s);\n",
+ fprintf(cfile, "new->%s.%s = copynodelist(n->%s.%s, state);\n",
sp->tag, fp->name, sp->tag, fp->name);
}
break;
case T_STRING:
if (calcsize) {
indent(12, cfile);
- fprintf(cfile, "funcstringsize += strlen(n->%s.%s) + 1;\n",
+ fprintf(cfile, "result->stringsize += strlen(n->%s.%s) + 1;\n",
sp->tag, fp->name);
} else {
indent(12, cfile);
- fprintf(cfile, "new->%s.%s = nodesavestr(n->%s.%s);\n",
+ fprintf(cfile, "new->%s.%s = nodesavestr(n->%s.%s, state);\n",
sp->tag, fp->name, sp->tag, fp->name);
}
break;
diff --git a/bin/sh/nodes.c.pat b/bin/sh/nodes.c.pat
index e99e3ab..cefe730 100644
--- a/bin/sh/nodes.c.pat
+++ b/bin/sh/nodes.c.pat
@@ -46,19 +46,24 @@
#include "mystring.h"
-static int funcblocksize; /* size of structures in function */
-static int funcstringsize; /* size of strings in node */
-static pointer funcblock; /* block to allocate function from */
-static char *funcstring; /* block to allocate strings from */
+struct nodesize {
+ int blocksize; /* size of structures in function */
+ int stringsize; /* size of strings in node */
+};
+
+struct nodecopystate {
+ pointer block; /* block to allocate function from */
+ char *string; /* block to allocate strings from */
+};
%SIZES
-static void calcsize(union node *);
-static void sizenodelist(struct nodelist *);
-static union node *copynode(union node *);
-static struct nodelist *copynodelist(struct nodelist *);
-static char *nodesavestr(const char *);
+static void calcsize(union node *, struct nodesize *);
+static void sizenodelist(struct nodelist *, struct nodesize *);
+static union node *copynode(union node *, struct nodecopystate *);
+static struct nodelist *copynodelist(struct nodelist *, struct nodecopystate *);
+static char *nodesavestr(const char *, struct nodecopystate *);
struct funcdef {
@@ -73,18 +78,20 @@ struct funcdef {
struct funcdef *
copyfunc(union node *n)
{
+ struct nodesize sz;
+ struct nodecopystate st;
struct funcdef *fn;
if (n == NULL)
return NULL;
- funcblocksize = offsetof(struct funcdef, n);
- funcstringsize = 0;
- calcsize(n);
- fn = ckmalloc(funcblocksize + funcstringsize);
+ sz.blocksize = offsetof(struct funcdef, n);
+ sz.stringsize = 0;
+ calcsize(n, &sz);
+ fn = ckmalloc(sz.blocksize + sz.stringsize);
fn->refcount = 1;
- funcblock = (char *)fn + offsetof(struct funcdef, n);
- funcstring = (char *)fn + funcblocksize;
- copynode(n);
+ st.block = (char *)fn + offsetof(struct funcdef, n);
+ st.string = (char *)fn + sz.blocksize;
+ copynode(n, &st);
return fn;
}
@@ -97,7 +104,7 @@ getfuncnode(struct funcdef *fn)
static void
-calcsize(union node *n)
+calcsize(union node *n, struct nodesize *result)
{
%CALCSIZE
}
@@ -105,11 +112,11 @@ calcsize(union node *n)
static void
-sizenodelist(struct nodelist *lp)
+sizenodelist(struct nodelist *lp, struct nodesize *result)
{
while (lp) {
- funcblocksize += ALIGN(sizeof(struct nodelist));
- calcsize(lp->n);
+ result->blocksize += ALIGN(sizeof(struct nodelist));
+ calcsize(lp->n, result);
lp = lp->next;
}
}
@@ -117,7 +124,7 @@ sizenodelist(struct nodelist *lp)
static union node *
-copynode(union node *n)
+copynode(union node *n, struct nodecopystate *state)
{
union node *new;
@@ -127,16 +134,17 @@ copynode(union node *n)
static struct nodelist *
-copynodelist(struct nodelist *lp)
+copynodelist(struct nodelist *lp, struct nodecopystate *state)
{
struct nodelist *start;
struct nodelist **lpp;
lpp = &start;
while (lp) {
- *lpp = funcblock;
- funcblock = (char *)funcblock + ALIGN(sizeof(struct nodelist));
- (*lpp)->n = copynode(lp->n);
+ *lpp = state->block;
+ state->block = (char *)state->block +
+ ALIGN(sizeof(struct nodelist));
+ (*lpp)->n = copynode(lp->n, state);
lp = lp->next;
lpp = &(*lpp)->next;
}
@@ -147,15 +155,15 @@ copynodelist(struct nodelist *lp)
static char *
-nodesavestr(const char *s)
+nodesavestr(const char *s, struct nodecopystate *state)
{
const char *p = s;
- char *q = funcstring;
- char *rtn = funcstring;
+ char *q = state->string;
+ char *rtn = state->string;
while ((*q++ = *p++) != '\0')
continue;
- funcstring = q;
+ state->string = q;
return rtn;
}
OpenPOWER on IntegriCloud