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