sh: Remove global state from nodes.c.

No functional change is intended.
This commit is contained in:
Jilles Tjoelker 2015-11-24 22:47:19 +00:00
parent 2a8a46b161
commit a83f6e1ad9
2 changed files with 46 additions and 38 deletions

View File

@ -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;

View File

@ -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;
}