147106Sbostic/*- 247106Sbostic * Copyright (c) 1991 The Regents of the University of California. 347106Sbostic * All rights reserved. 447106Sbostic * 547106Sbostic * This code is derived from software contributed to Berkeley by 647106Sbostic * Kenneth Almquist. 747106Sbostic * 847106Sbostic * %sccs.include.redist.c% 947106Sbostic * 10*47166Sbostic * @(#)nodes.c.pat 5.2 (Berkeley) 03/08/91 1147106Sbostic */ 1247106Sbostic 1347106Sbostic/* 1447106Sbostic * Routine for dealing with parsed shell commands. 1547106Sbostic */ 1647106Sbostic 1747106Sbostic#include "shell.h" 1847106Sbostic#include "nodes.h" 1947106Sbostic#include "memalloc.h" 2047106Sbostic#include "machdep.h" 2147106Sbostic#include "mystring.h" 2247106Sbostic 2347106Sbostic 2447106Sbosticint funcblocksize; /* size of structures in function */ 2547106Sbosticint funcstringsize; /* size of strings in node */ 26*47166Sbostic#ifdef __STDC__ 2747106Sbosticpointer funcblock; /* block to allocate function from */ 28*47166Sbostic#else 29*47166Sbosticchar *funcblock; /* block to allocate function from */ 30*47166Sbostic#endif 3147106Sbosticchar *funcstring; /* block to allocate strings from */ 3247106Sbostic 3347106Sbostic%SIZES 3447106Sbostic 3547106Sbostic 3647106Sbostic#ifdef __STDC__ 3747106SbosticSTATIC void calcsize(union node *); 3847106SbosticSTATIC void sizenodelist(struct nodelist *); 3947106SbosticSTATIC union node *copynode(union node *); 4047106SbosticSTATIC struct nodelist *copynodelist(struct nodelist *); 4147106SbosticSTATIC char *nodesavestr(char *); 4247106Sbostic#else 4347106SbosticSTATIC void calcsize(); 4447106SbosticSTATIC void sizenodelist(); 4547106SbosticSTATIC union node *copynode(); 4647106SbosticSTATIC struct nodelist *copynodelist(); 4747106SbosticSTATIC char *nodesavestr(); 4847106Sbostic#endif 4947106Sbostic 5047106Sbostic 5147106Sbostic 5247106Sbostic/* 5347106Sbostic * Make a copy of a parse tree. 5447106Sbostic */ 5547106Sbostic 5647106Sbosticunion node * 5747106Sbosticcopyfunc(n) 5847106Sbostic union node *n; 5947106Sbostic { 6047106Sbostic if (n == NULL) 6147106Sbostic return NULL; 6247106Sbostic funcblocksize = 0; 6347106Sbostic funcstringsize = 0; 6447106Sbostic calcsize(n); 6547106Sbostic funcblock = ckmalloc(funcblocksize + funcstringsize); 6647106Sbostic funcstring = funcblock + funcblocksize; 6747106Sbostic return copynode(n); 6847106Sbostic} 6947106Sbostic 7047106Sbostic 7147106Sbostic 7247106SbosticSTATIC void 7347106Sbosticcalcsize(n) 7447106Sbostic union node *n; 7547106Sbostic { 7647106Sbostic %CALCSIZE 7747106Sbostic} 7847106Sbostic 7947106Sbostic 8047106Sbostic 8147106SbosticSTATIC void 8247106Sbosticsizenodelist(lp) 8347106Sbostic struct nodelist *lp; 8447106Sbostic { 8547106Sbostic while (lp) { 8647106Sbostic funcblocksize += ALIGN(sizeof (struct nodelist)); 8747106Sbostic calcsize(lp->n); 8847106Sbostic lp = lp->next; 8947106Sbostic } 9047106Sbostic} 9147106Sbostic 9247106Sbostic 9347106Sbostic 9447106SbosticSTATIC union node * 9547106Sbosticcopynode(n) 9647106Sbostic union node *n; 9747106Sbostic { 9847106Sbostic union node *new; 9947106Sbostic 10047106Sbostic %COPY 10147106Sbostic return new; 10247106Sbostic} 10347106Sbostic 10447106Sbostic 10547106SbosticSTATIC struct nodelist * 10647106Sbosticcopynodelist(lp) 10747106Sbostic struct nodelist *lp; 10847106Sbostic { 10947106Sbostic struct nodelist *start; 11047106Sbostic struct nodelist **lpp; 11147106Sbostic 11247106Sbostic lpp = &start; 11347106Sbostic while (lp) { 11447106Sbostic *lpp = funcblock; 11547106Sbostic funcblock += ALIGN(sizeof (struct nodelist)); 11647106Sbostic (*lpp)->n = copynode(lp->n); 11747106Sbostic lp = lp->next; 11847106Sbostic lpp = &(*lpp)->next; 11947106Sbostic } 12047106Sbostic *lpp = NULL; 12147106Sbostic return start; 12247106Sbostic} 12347106Sbostic 12447106Sbostic 12547106Sbostic 12647106SbosticSTATIC char * 12747106Sbosticnodesavestr(s) 12847106Sbostic char *s; 12947106Sbostic { 13047106Sbostic register char *p = s; 13147106Sbostic register char *q = funcstring; 13247106Sbostic char *rtn = funcstring; 13347106Sbostic 13447106Sbostic while (*q++ = *p++); 13547106Sbostic funcstring = q; 13647106Sbostic return rtn; 13747106Sbostic} 13847106Sbostic 13947106Sbostic 14047106Sbostic 14147106Sbostic/* 14247106Sbostic * Free a parse tree. 14347106Sbostic */ 14447106Sbostic 14547106Sbosticvoid 14647106Sbosticfreefunc(n) 14747106Sbostic union node *n; 14847106Sbostic { 14947106Sbostic if (n) 15047106Sbostic ckfree(n); 15147106Sbostic} 152