add copyright notices, SCCS headers, yank to 8.1
[unix-history] / usr / src / bin / sh / nodes.c.pat
CommitLineData
e83ac6ec
KB
1/*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Kenneth Almquist.
7 *
8 * %sccs.include.redist.c%
9 *
b775bf58 10 * @(#)nodes.c.pat 5.2 (Berkeley) %G%
e83ac6ec
KB
11 */
12
13/*
14 * Routine for dealing with parsed shell commands.
15 */
16
17#include "shell.h"
18#include "nodes.h"
19#include "memalloc.h"
20#include "machdep.h"
21#include "mystring.h"
22
23
24int funcblocksize; /* size of structures in function */
25int funcstringsize; /* size of strings in node */
b775bf58 26#ifdef __STDC__
e83ac6ec 27pointer funcblock; /* block to allocate function from */
b775bf58
KB
28#else
29char *funcblock; /* block to allocate function from */
30#endif
e83ac6ec
KB
31char *funcstring; /* block to allocate strings from */
32
33%SIZES
34
35
36#ifdef __STDC__
37STATIC void calcsize(union node *);
38STATIC void sizenodelist(struct nodelist *);
39STATIC union node *copynode(union node *);
40STATIC struct nodelist *copynodelist(struct nodelist *);
41STATIC char *nodesavestr(char *);
42#else
43STATIC void calcsize();
44STATIC void sizenodelist();
45STATIC union node *copynode();
46STATIC struct nodelist *copynodelist();
47STATIC char *nodesavestr();
48#endif
49
50
51
52/*
53 * Make a copy of a parse tree.
54 */
55
56union node *
57copyfunc(n)
58 union node *n;
59 {
60 if (n == NULL)
61 return NULL;
62 funcblocksize = 0;
63 funcstringsize = 0;
64 calcsize(n);
65 funcblock = ckmalloc(funcblocksize + funcstringsize);
66 funcstring = funcblock + funcblocksize;
67 return copynode(n);
68}
69
70
71
72STATIC void
73calcsize(n)
74 union node *n;
75 {
76 %CALCSIZE
77}
78
79
80
81STATIC void
82sizenodelist(lp)
83 struct nodelist *lp;
84 {
85 while (lp) {
86 funcblocksize += ALIGN(sizeof (struct nodelist));
87 calcsize(lp->n);
88 lp = lp->next;
89 }
90}
91
92
93
94STATIC union node *
95copynode(n)
96 union node *n;
97 {
98 union node *new;
99
100 %COPY
101 return new;
102}
103
104
105STATIC struct nodelist *
106copynodelist(lp)
107 struct nodelist *lp;
108 {
109 struct nodelist *start;
110 struct nodelist **lpp;
111
112 lpp = &start;
113 while (lp) {
114 *lpp = funcblock;
115 funcblock += ALIGN(sizeof (struct nodelist));
116 (*lpp)->n = copynode(lp->n);
117 lp = lp->next;
118 lpp = &(*lpp)->next;
119 }
120 *lpp = NULL;
121 return start;
122}
123
124
125
126STATIC char *
127nodesavestr(s)
128 char *s;
129 {
130 register char *p = s;
131 register char *q = funcstring;
132 char *rtn = funcstring;
133
134 while (*q++ = *p++);
135 funcstring = q;
136 return rtn;
137}
138
139
140
141/*
142 * Free a parse tree.
143 */
144
145void
146freefunc(n)
147 union node *n;
148 {
149 if (n)
150 ckfree(n);
151}