nodes.c.pat revision 50471
1184588Sdfr/*- 2184588Sdfr * Copyright (c) 1991, 1993 3184588Sdfr * The Regents of the University of California. All rights reserved. 4184588Sdfr * 5184588Sdfr * This code is derived from software contributed to Berkeley by 6184588Sdfr * Kenneth Almquist. 7184588Sdfr * 8184588Sdfr * Redistribution and use in source and binary forms, with or without 9184588Sdfr * modification, are permitted provided that the following conditions 10184588Sdfr * are met: 11184588Sdfr * 1. Redistributions of source code must retain the above copyright 12184588Sdfr * notice, this list of conditions and the following disclaimer. 13184588Sdfr * 2. Redistributions in binary form must reproduce the above copyright 14184588Sdfr * notice, this list of conditions and the following disclaimer in the 15184588Sdfr * documentation and/or other materials provided with the distribution. 16184588Sdfr * 3. All advertising materials mentioning features or use of this software 17184588Sdfr * must display the following acknowledgement: 18184588Sdfr * This product includes software developed by the University of 19184588Sdfr * California, Berkeley and its contributors. 20184588Sdfr * 4. Neither the name of the University nor the names of its contributors 21184588Sdfr * may be used to endorse or promote products derived from this software 22184588Sdfr * without specific prior written permission. 23184588Sdfr * 24184588Sdfr * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25184588Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26184588Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27184588Sdfr * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28184588Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29184588Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30184588Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31184588Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32184588Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33184588Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34244370Srmacklem * SUCH DAMAGE. 35184588Sdfr * 36244370Srmacklem * @(#)nodes.c.pat 8.2 (Berkeley) 5/4/95 37184588Sdfr * $FreeBSD: head/bin/sh/nodes.c.pat 50471 1999-08-27 23:15:48Z peter $ 38184588Sdfr */ 39184588Sdfr 40184588Sdfr#include <stdlib.h> 41184588Sdfr/* 42184588Sdfr * Routine for dealing with parsed shell commands. 43184588Sdfr */ 44184588Sdfr 45184588Sdfr#include "shell.h" 46184588Sdfr#include "nodes.h" 47184588Sdfr#include "memalloc.h" 48184588Sdfr#include "machdep.h" 49184588Sdfr#include "mystring.h" 50244370Srmacklem 51184588Sdfr 52244370Srmacklemint funcblocksize; /* size of structures in function */ 53244370Srmacklemint funcstringsize; /* size of strings in node */ 54184588Sdfrpointer funcblock; /* block to allocate function from */ 55184588Sdfrchar *funcstring; /* block to allocate strings from */ 56184588Sdfr 57184588Sdfr%SIZES 58184588Sdfr 59184588Sdfr 60184588SdfrSTATIC void calcsize __P((union node *)); 61244370SrmacklemSTATIC void sizenodelist __P((struct nodelist *)); 62244370SrmacklemSTATIC union node *copynode __P((union node *)); 63244370SrmacklemSTATIC struct nodelist *copynodelist __P((struct nodelist *)); 64244370SrmacklemSTATIC char *nodesavestr __P((char *)); 65244370Srmacklem 66184588Sdfr 67184588Sdfr 68184588Sdfr/* 69184588Sdfr * Make a copy of a parse tree. 70184588Sdfr */ 71184588Sdfr 72184588Sdfrunion node * 73184588Sdfrcopyfunc(n) 74184588Sdfr union node *n; 75184588Sdfr{ 76184588Sdfr if (n == NULL) 77184588Sdfr return NULL; 78184588Sdfr funcblocksize = 0; 79184588Sdfr funcstringsize = 0; 80184588Sdfr calcsize(n); 81184588Sdfr funcblock = ckmalloc(funcblocksize + funcstringsize); 82 funcstring = (char *)funcblock + funcblocksize; 83 return copynode(n); 84} 85 86 87 88STATIC void 89calcsize(n) 90 union node *n; 91{ 92 %CALCSIZE 93} 94 95 96 97STATIC void 98sizenodelist(lp) 99 struct nodelist *lp; 100{ 101 while (lp) { 102 funcblocksize += ALIGN(sizeof(struct nodelist)); 103 calcsize(lp->n); 104 lp = lp->next; 105 } 106} 107 108 109 110STATIC union node * 111copynode(n) 112 union node *n; 113{ 114 union node *new; 115 116 %COPY 117 return new; 118} 119 120 121STATIC struct nodelist * 122copynodelist(lp) 123 struct nodelist *lp; 124{ 125 struct nodelist *start; 126 struct nodelist **lpp; 127 128 lpp = &start; 129 while (lp) { 130 *lpp = funcblock; 131 funcblock = (char *)funcblock + ALIGN(sizeof(struct nodelist)); 132 (*lpp)->n = copynode(lp->n); 133 lp = lp->next; 134 lpp = &(*lpp)->next; 135 } 136 *lpp = NULL; 137 return start; 138} 139 140 141 142STATIC char * 143nodesavestr(s) 144 char *s; 145{ 146 char *p = s; 147 char *q = funcstring; 148 char *rtn = funcstring; 149 150 while ((*q++ = *p++) != '\0') 151 continue; 152 funcstring = q; 153 return rtn; 154} 155 156 157 158/* 159 * Free a parse tree. 160 */ 161 162void 163freefunc(n) 164 union node *n; 165{ 166 if (n) 167 ckfree(n); 168} 169