1*47106Sbostic/*- 2*47106Sbostic * Copyright (c) 1991 The Regents of the University of California. 3*47106Sbostic * All rights reserved. 4*47106Sbostic * 5*47106Sbostic * This code is derived from software contributed to Berkeley by 6*47106Sbostic * Kenneth Almquist. 7*47106Sbostic * 8*47106Sbostic * %sccs.include.redist.c% 9*47106Sbostic * 10*47106Sbostic * @(#)nodes.c.pat 5.1 (Berkeley) 03/07/91 11*47106Sbostic */ 12*47106Sbostic 13*47106Sbostic/* 14*47106Sbostic * Routine for dealing with parsed shell commands. 15*47106Sbostic */ 16*47106Sbostic 17*47106Sbostic#include "shell.h" 18*47106Sbostic#include "nodes.h" 19*47106Sbostic#include "memalloc.h" 20*47106Sbostic#include "machdep.h" 21*47106Sbostic#include "mystring.h" 22*47106Sbostic 23*47106Sbostic 24*47106Sbosticint funcblocksize; /* size of structures in function */ 25*47106Sbosticint funcstringsize; /* size of strings in node */ 26*47106Sbosticpointer funcblock; /* block to allocate function from */ 27*47106Sbosticchar *funcstring; /* block to allocate strings from */ 28*47106Sbostic 29*47106Sbostic%SIZES 30*47106Sbostic 31*47106Sbostic 32*47106Sbostic#ifdef __STDC__ 33*47106SbosticSTATIC void calcsize(union node *); 34*47106SbosticSTATIC void sizenodelist(struct nodelist *); 35*47106SbosticSTATIC union node *copynode(union node *); 36*47106SbosticSTATIC struct nodelist *copynodelist(struct nodelist *); 37*47106SbosticSTATIC char *nodesavestr(char *); 38*47106Sbostic#else 39*47106SbosticSTATIC void calcsize(); 40*47106SbosticSTATIC void sizenodelist(); 41*47106SbosticSTATIC union node *copynode(); 42*47106SbosticSTATIC struct nodelist *copynodelist(); 43*47106SbosticSTATIC char *nodesavestr(); 44*47106Sbostic#endif 45*47106Sbostic 46*47106Sbostic 47*47106Sbostic 48*47106Sbostic/* 49*47106Sbostic * Make a copy of a parse tree. 50*47106Sbostic */ 51*47106Sbostic 52*47106Sbosticunion node * 53*47106Sbosticcopyfunc(n) 54*47106Sbostic union node *n; 55*47106Sbostic { 56*47106Sbostic if (n == NULL) 57*47106Sbostic return NULL; 58*47106Sbostic funcblocksize = 0; 59*47106Sbostic funcstringsize = 0; 60*47106Sbostic calcsize(n); 61*47106Sbostic funcblock = ckmalloc(funcblocksize + funcstringsize); 62*47106Sbostic funcstring = funcblock + funcblocksize; 63*47106Sbostic return copynode(n); 64*47106Sbostic} 65*47106Sbostic 66*47106Sbostic 67*47106Sbostic 68*47106SbosticSTATIC void 69*47106Sbosticcalcsize(n) 70*47106Sbostic union node *n; 71*47106Sbostic { 72*47106Sbostic %CALCSIZE 73*47106Sbostic} 74*47106Sbostic 75*47106Sbostic 76*47106Sbostic 77*47106SbosticSTATIC void 78*47106Sbosticsizenodelist(lp) 79*47106Sbostic struct nodelist *lp; 80*47106Sbostic { 81*47106Sbostic while (lp) { 82*47106Sbostic funcblocksize += ALIGN(sizeof (struct nodelist)); 83*47106Sbostic calcsize(lp->n); 84*47106Sbostic lp = lp->next; 85*47106Sbostic } 86*47106Sbostic} 87*47106Sbostic 88*47106Sbostic 89*47106Sbostic 90*47106SbosticSTATIC union node * 91*47106Sbosticcopynode(n) 92*47106Sbostic union node *n; 93*47106Sbostic { 94*47106Sbostic union node *new; 95*47106Sbostic 96*47106Sbostic %COPY 97*47106Sbostic return new; 98*47106Sbostic} 99*47106Sbostic 100*47106Sbostic 101*47106SbosticSTATIC struct nodelist * 102*47106Sbosticcopynodelist(lp) 103*47106Sbostic struct nodelist *lp; 104*47106Sbostic { 105*47106Sbostic struct nodelist *start; 106*47106Sbostic struct nodelist **lpp; 107*47106Sbostic 108*47106Sbostic lpp = &start; 109*47106Sbostic while (lp) { 110*47106Sbostic *lpp = funcblock; 111*47106Sbostic funcblock += ALIGN(sizeof (struct nodelist)); 112*47106Sbostic (*lpp)->n = copynode(lp->n); 113*47106Sbostic lp = lp->next; 114*47106Sbostic lpp = &(*lpp)->next; 115*47106Sbostic } 116*47106Sbostic *lpp = NULL; 117*47106Sbostic return start; 118*47106Sbostic} 119*47106Sbostic 120*47106Sbostic 121*47106Sbostic 122*47106SbosticSTATIC char * 123*47106Sbosticnodesavestr(s) 124*47106Sbostic char *s; 125*47106Sbostic { 126*47106Sbostic register char *p = s; 127*47106Sbostic register char *q = funcstring; 128*47106Sbostic char *rtn = funcstring; 129*47106Sbostic 130*47106Sbostic while (*q++ = *p++); 131*47106Sbostic funcstring = q; 132*47106Sbostic return rtn; 133*47106Sbostic} 134*47106Sbostic 135*47106Sbostic 136*47106Sbostic 137*47106Sbostic/* 138*47106Sbostic * Free a parse tree. 139*47106Sbostic */ 140*47106Sbostic 141*47106Sbosticvoid 142*47106Sbosticfreefunc(n) 143*47106Sbostic union node *n; 144*47106Sbostic { 145*47106Sbostic if (n) 146*47106Sbostic ckfree(n); 147*47106Sbostic} 148