1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* $NetBSD: nodes.c.pat,v 1.12 2004/06/15 22:57:27 dsl Exp $ */ 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*- 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 1991, 1993 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The Regents of the University of California. All rights reserved. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This code is derived from software contributed to Berkeley by 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Kenneth Almquist. 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met: 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * documentation and/or other materials provided with the distribution. 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * may be used to endorse or promote products derived from this software 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * without specific prior written permission. 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE. 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * @(#)nodes.c.pat 8.2 (Berkeley) 5/4/95 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Routine for dealing with parsed shell commands. 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "shell.h" 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "nodes.h" 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "memalloc.h" 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "machdep.h" 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "mystring.h" 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint funcblocksize; /* size of structures in function */ 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint funcstringsize; /* size of strings in node */ 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectpointer funcblock; /* block to allocate function from */ 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *funcstring; /* block to allocate strings from */ 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project%SIZES 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void calcsize(union node *); 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void sizenodelist(struct nodelist *); 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC union node *copynode(union node *); 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC struct nodelist *copynodelist(struct nodelist *); 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC char *nodesavestr(char *); 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Make a copy of a parse tree. 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectunion node * 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectcopyfunc(n) 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project union node *n; 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (n == NULL) 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return NULL; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project funcblocksize = 0; 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project funcstringsize = 0; 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project calcsize(n); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project funcblock = ckmalloc(funcblocksize + funcstringsize); 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project funcstring = (char *) funcblock + funcblocksize; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return copynode(n); 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectcalcsize(n) 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project union node *n; 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project %CALCSIZE 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsizenodelist(lp) 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct nodelist *lp; 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (lp) { 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project funcblocksize += SHELL_ALIGN(sizeof(struct nodelist)); 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project calcsize(lp->n); 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lp = lp->next; 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC union node * 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectcopynode(n) 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project union node *n; 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project union node *new; 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project %COPY 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return new; 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC struct nodelist * 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectcopynodelist(lp) 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct nodelist *lp; 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct nodelist *start; 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct nodelist **lpp; 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpp = &start; 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (lp) { 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *lpp = funcblock; 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project funcblock = (char *) funcblock + 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project SHELL_ALIGN(sizeof(struct nodelist)); 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (*lpp)->n = copynode(lp->n); 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lp = lp->next; 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lpp = &(*lpp)->next; 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *lpp = NULL; 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return start; 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC char * 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnodesavestr(s) 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *s; 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project register char *p = s; 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project register char *q = funcstring; 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *rtn = funcstring; 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while ((*q++ = *p++) != 0) 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project funcstring = q; 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return rtn; 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Free a parse tree. 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfreefunc(n) 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project union node *n; 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (n) 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ckfree(n); 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 167