147106Sbostic/*- 260709Sbostic * Copyright (c) 1991, 1993 360709Sbostic * The Regents of the University of California. 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*69273Schristos * @(#)nodes.c.pat 8.2 (Berkeley) 05/04/95 1147106Sbostic */ 1247106Sbostic 13*69273Schristos#include <stdlib.h> 1447106Sbostic/* 1547106Sbostic * Routine for dealing with parsed shell commands. 1647106Sbostic */ 1747106Sbostic 1847106Sbostic#include "shell.h" 1947106Sbostic#include "nodes.h" 2047106Sbostic#include "memalloc.h" 2147106Sbostic#include "machdep.h" 2247106Sbostic#include "mystring.h" 2347106Sbostic 2447106Sbostic 25*69273Schristosint funcblocksize; /* size of structures in function */ 26*69273Schristosint funcstringsize; /* size of strings in node */ 2747106Sbosticpointer funcblock; /* block to allocate function from */ 28*69273Schristoschar *funcstring; /* block to allocate strings from */ 2947106Sbostic 3047106Sbostic%SIZES 3147106Sbostic 3247106Sbostic 33*69273SchristosSTATIC void calcsize __P((union node *)); 34*69273SchristosSTATIC void sizenodelist __P((struct nodelist *)); 35*69273SchristosSTATIC union node *copynode __P((union node *)); 36*69273SchristosSTATIC struct nodelist *copynodelist __P((struct nodelist *)); 37*69273SchristosSTATIC char *nodesavestr __P((char *)); 3847106Sbostic 3947106Sbostic 4047106Sbostic 4147106Sbostic/* 4247106Sbostic * Make a copy of a parse tree. 4347106Sbostic */ 4447106Sbostic 4547106Sbosticunion node * 4647106Sbosticcopyfunc(n) 47*69273Schristos union node *n; 48*69273Schristos{ 49*69273Schristos if (n == NULL) 50*69273Schristos return NULL; 51*69273Schristos funcblocksize = 0; 52*69273Schristos funcstringsize = 0; 53*69273Schristos calcsize(n); 54*69273Schristos funcblock = ckmalloc(funcblocksize + funcstringsize); 55*69273Schristos funcstring = funcblock + funcblocksize; 56*69273Schristos return copynode(n); 5747106Sbostic} 5847106Sbostic 5947106Sbostic 6047106Sbostic 6147106SbosticSTATIC void 6247106Sbosticcalcsize(n) 63*69273Schristos union node *n; 64*69273Schristos{ 65*69273Schristos %CALCSIZE 6647106Sbostic} 6747106Sbostic 6847106Sbostic 6947106Sbostic 7047106SbosticSTATIC void 7147106Sbosticsizenodelist(lp) 72*69273Schristos struct nodelist *lp; 73*69273Schristos{ 74*69273Schristos while (lp) { 75*69273Schristos funcblocksize += ALIGN(sizeof(struct nodelist)); 76*69273Schristos calcsize(lp->n); 77*69273Schristos lp = lp->next; 78*69273Schristos } 7947106Sbostic} 8047106Sbostic 8147106Sbostic 8247106Sbostic 8347106SbosticSTATIC union node * 8447106Sbosticcopynode(n) 85*69273Schristos union node *n; 86*69273Schristos{ 87*69273Schristos union node *new; 8847106Sbostic 89*69273Schristos %COPY 90*69273Schristos return new; 9147106Sbostic} 9247106Sbostic 9347106Sbostic 9447106SbosticSTATIC struct nodelist * 9547106Sbosticcopynodelist(lp) 96*69273Schristos struct nodelist *lp; 97*69273Schristos{ 98*69273Schristos struct nodelist *start; 99*69273Schristos struct nodelist **lpp; 10047106Sbostic 101*69273Schristos lpp = &start; 102*69273Schristos while (lp) { 103*69273Schristos *lpp = funcblock; 104*69273Schristos funcblock += ALIGN(sizeof(struct nodelist)); 105*69273Schristos (*lpp)->n = copynode(lp->n); 106*69273Schristos lp = lp->next; 107*69273Schristos lpp = &(*lpp)->next; 108*69273Schristos } 109*69273Schristos *lpp = NULL; 110*69273Schristos return start; 11147106Sbostic} 11247106Sbostic 11347106Sbostic 11447106Sbostic 11547106SbosticSTATIC char * 11647106Sbosticnodesavestr(s) 117*69273Schristos char *s; 118*69273Schristos{ 119*69273Schristos register char *p = s; 120*69273Schristos register char *q = funcstring; 121*69273Schristos char *rtn = funcstring; 12247106Sbostic 123*69273Schristos while ((*q++ = *p++) != '\0') 124*69273Schristos continue; 125*69273Schristos funcstring = q; 126*69273Schristos return rtn; 12747106Sbostic} 12847106Sbostic 12947106Sbostic 13047106Sbostic 13147106Sbostic/* 13247106Sbostic * Free a parse tree. 13347106Sbostic */ 13447106Sbostic 13547106Sbosticvoid 13647106Sbosticfreefunc(n) 137*69273Schristos union node *n; 138*69273Schristos{ 139*69273Schristos if (n) 140*69273Schristos ckfree(n); 14147106Sbostic} 142