nodes.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This file was generated by mknodes.sh
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*	$NetBSD: nodes.c.pat,v 1.12 2004/06/15 22:57:27 dsl Exp $	*/
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*-
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 1991, 1993
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This code is derived from software contributed to Berkeley by
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Kenneth Almquist.
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met:
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    documentation and/or other materials provided with the distribution.
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    may be used to endorse or promote products derived from this software
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    without specific prior written permission.
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE.
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *	@(#)nodes.c.pat	8.2 (Berkeley) 5/4/95
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Routine for dealing with parsed shell commands.
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "shell.h"
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "nodes.h"
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "memalloc.h"
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "machdep.h"
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "mystring.h"
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint     funcblocksize;		/* size of structures in function */
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint     funcstringsize;		/* size of strings in node */
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectpointer funcblock;		/* block to allocate function from */
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar   *funcstring;		/* block to allocate strings from */
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const short nodesize[26] = {
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nbinary)),
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct ncmd)),
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct npipe)),
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nredir)),
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nredir)),
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nredir)),
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nbinary)),
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nbinary)),
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nif)),
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nbinary)),
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nbinary)),
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nfor)),
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct ncase)),
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nclist)),
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct narg)),
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct narg)),
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nfile)),
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nfile)),
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nfile)),
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nfile)),
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nfile)),
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct ndup)),
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct ndup)),
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nhere)),
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nhere)),
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      SHELL_ALIGN(sizeof (struct nnot)),
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void calcsize(union node *);
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void sizenodelist(struct nodelist *);
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC union node *copynode(union node *);
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC struct nodelist *copynodelist(struct nodelist *);
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC char *nodesavestr(char *);
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Make a copy of a parse tree.
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectunion node *
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectcopyfunc(n)
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	union node *n;
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (n == NULL)
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		return NULL;
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	funcblocksize = 0;
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	funcstringsize = 0;
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	calcsize(n);
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	funcblock = ckmalloc(funcblocksize + funcstringsize);
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	funcstring = (char *) funcblock + funcblocksize;
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return copynode(n);
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectcalcsize(n)
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	union node *n;
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      if (n == NULL)
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    return;
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      funcblocksize += nodesize[n->type];
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      switch (n->type) {
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NSEMI:
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NAND:
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NOR:
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NWHILE:
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NUNTIL:
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nbinary.ch2);
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nbinary.ch1);
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NCMD:
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->ncmd.redirect);
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->ncmd.args);
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NPIPE:
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    sizenodelist(n->npipe.cmdlist);
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NREDIR:
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NBACKGND:
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NSUBSHELL:
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nredir.redirect);
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nredir.n);
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NIF:
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nif.elsepart);
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nif.ifpart);
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nif.test);
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NFOR:
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    funcstringsize += strlen(n->nfor.var) + 1;
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nfor.body);
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nfor.args);
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NCASE:
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->ncase.cases);
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->ncase.expr);
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NCLIST:
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nclist.body);
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nclist.pattern);
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nclist.next);
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NDEFUN:
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NARG:
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    sizenodelist(n->narg.backquote);
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    funcstringsize += strlen(n->narg.text) + 1;
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->narg.next);
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NTO:
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NCLOBBER:
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NFROM:
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NFROMTO:
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NAPPEND:
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nfile.fname);
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nfile.next);
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NTOFD:
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NFROMFD:
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->ndup.vname);
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->ndup.next);
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NHERE:
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NXHERE:
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nhere.doc);
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nhere.next);
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NNOT:
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    calcsize(n->nnot.com);
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      };
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsizenodelist(lp)
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct nodelist *lp;
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while (lp) {
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		funcblocksize += SHELL_ALIGN(sizeof(struct nodelist));
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		calcsize(lp->n);
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		lp = lp->next;
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC union node *
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectcopynode(n)
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	union node *n;
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	union node *new;
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      if (n == NULL)
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    return NULL;
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      new = funcblock;
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      funcblock = (char *) funcblock + nodesize[n->type];
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      switch (n->type) {
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NSEMI:
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NAND:
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NOR:
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NWHILE:
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NUNTIL:
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nbinary.ch2 = copynode(n->nbinary.ch2);
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nbinary.ch1 = copynode(n->nbinary.ch1);
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NCMD:
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->ncmd.redirect = copynode(n->ncmd.redirect);
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->ncmd.args = copynode(n->ncmd.args);
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->ncmd.backgnd = n->ncmd.backgnd;
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NPIPE:
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->npipe.cmdlist = copynodelist(n->npipe.cmdlist);
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->npipe.backgnd = n->npipe.backgnd;
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NREDIR:
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NBACKGND:
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NSUBSHELL:
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nredir.redirect = copynode(n->nredir.redirect);
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nredir.n = copynode(n->nredir.n);
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NIF:
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nif.elsepart = copynode(n->nif.elsepart);
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nif.ifpart = copynode(n->nif.ifpart);
246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nif.test = copynode(n->nif.test);
247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NFOR:
249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nfor.var = nodesavestr(n->nfor.var);
250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nfor.body = copynode(n->nfor.body);
251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nfor.args = copynode(n->nfor.args);
252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NCASE:
254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->ncase.cases = copynode(n->ncase.cases);
255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->ncase.expr = copynode(n->ncase.expr);
256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NCLIST:
258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nclist.body = copynode(n->nclist.body);
259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nclist.pattern = copynode(n->nclist.pattern);
260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nclist.next = copynode(n->nclist.next);
261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NDEFUN:
263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NARG:
264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->narg.backquote = copynodelist(n->narg.backquote);
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->narg.text = nodesavestr(n->narg.text);
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->narg.next = copynode(n->narg.next);
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NTO:
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NCLOBBER:
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NFROM:
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NFROMTO:
272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NAPPEND:
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nfile.fname = copynode(n->nfile.fname);
274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nfile.fd = n->nfile.fd;
275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nfile.next = copynode(n->nfile.next);
276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NTOFD:
278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NFROMFD:
279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->ndup.vname = copynode(n->ndup.vname);
280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->ndup.dupfd = n->ndup.dupfd;
281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->ndup.fd = n->ndup.fd;
282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->ndup.next = copynode(n->ndup.next);
283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NHERE:
285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NXHERE:
286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nhere.doc = copynode(n->nhere.doc);
287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nhere.fd = n->nhere.fd;
288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nhere.next = copynode(n->nhere.next);
289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      case NNOT:
291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    new->nnot.com = copynode(n->nnot.com);
292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	    break;
293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      };
294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project      new->type = n->type;
295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return new;
296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC struct nodelist *
300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectcopynodelist(lp)
301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct nodelist *lp;
302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct nodelist *start;
304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct nodelist **lpp;
305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	lpp = &start;
307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while (lp) {
308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		*lpp = funcblock;
309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		funcblock = (char *) funcblock +
310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    SHELL_ALIGN(sizeof(struct nodelist));
311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		(*lpp)->n = copynode(lp->n);
312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		lp = lp->next;
313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		lpp = &(*lpp)->next;
314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	*lpp = NULL;
316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return start;
317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC char *
322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnodesavestr(s)
323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char   *s;
324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	register char *p = s;
326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	register char *q = funcstring;
327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char   *rtn = funcstring;
328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while ((*q++ = *p++) != 0)
330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		continue;
331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	funcstring = q;
332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return rtn;
333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Free a parse tree.
339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfreefunc(n)
343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	union node *n;
344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (n)
346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		ckfree(n);
347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
348