xref: /csrg-svn/bin/sh/nodes.c.pat (revision 69273)
147106Sbostic/*-
260709Sbostic * Copyright (c) 1991, 1993
360709Sbostic *	The Regents of the University of California.  All rights reserved.
447106Sbostic *
547106Sbostic * This code is derived from software contributed to Berkeley by
647106Sbostic * Kenneth Almquist.
747106Sbostic *
847106Sbostic * %sccs.include.redist.c%
947106Sbostic *
10*69273Schristos *	@(#)nodes.c.pat	8.2 (Berkeley) 05/04/95
1147106Sbostic */
1247106Sbostic
13*69273Schristos#include <stdlib.h>
1447106Sbostic/*
1547106Sbostic * Routine for dealing with parsed shell commands.
1647106Sbostic */
1747106Sbostic
1847106Sbostic#include "shell.h"
1947106Sbostic#include "nodes.h"
2047106Sbostic#include "memalloc.h"
2147106Sbostic#include "machdep.h"
2247106Sbostic#include "mystring.h"
2347106Sbostic
2447106Sbostic
25*69273Schristosint     funcblocksize;		/* size of structures in function */
26*69273Schristosint     funcstringsize;		/* size of strings in node */
2747106Sbosticpointer funcblock;		/* block to allocate function from */
28*69273Schristoschar   *funcstring;		/* block to allocate strings from */
2947106Sbostic
3047106Sbostic%SIZES
3147106Sbostic
3247106Sbostic
33*69273SchristosSTATIC void calcsize __P((union node *));
34*69273SchristosSTATIC void sizenodelist __P((struct nodelist *));
35*69273SchristosSTATIC union node *copynode __P((union node *));
36*69273SchristosSTATIC struct nodelist *copynodelist __P((struct nodelist *));
37*69273SchristosSTATIC char *nodesavestr __P((char *));
3847106Sbostic
3947106Sbostic
4047106Sbostic
4147106Sbostic/*
4247106Sbostic * Make a copy of a parse tree.
4347106Sbostic */
4447106Sbostic
4547106Sbosticunion node *
4647106Sbosticcopyfunc(n)
47*69273Schristos	union node *n;
48*69273Schristos{
49*69273Schristos	if (n == NULL)
50*69273Schristos		return NULL;
51*69273Schristos	funcblocksize = 0;
52*69273Schristos	funcstringsize = 0;
53*69273Schristos	calcsize(n);
54*69273Schristos	funcblock = ckmalloc(funcblocksize + funcstringsize);
55*69273Schristos	funcstring = funcblock + funcblocksize;
56*69273Schristos	return copynode(n);
5747106Sbostic}
5847106Sbostic
5947106Sbostic
6047106Sbostic
6147106SbosticSTATIC void
6247106Sbosticcalcsize(n)
63*69273Schristos	union node *n;
64*69273Schristos{
65*69273Schristos	%CALCSIZE
6647106Sbostic}
6747106Sbostic
6847106Sbostic
6947106Sbostic
7047106SbosticSTATIC void
7147106Sbosticsizenodelist(lp)
72*69273Schristos	struct nodelist *lp;
73*69273Schristos{
74*69273Schristos	while (lp) {
75*69273Schristos		funcblocksize += ALIGN(sizeof(struct nodelist));
76*69273Schristos		calcsize(lp->n);
77*69273Schristos		lp = lp->next;
78*69273Schristos	}
7947106Sbostic}
8047106Sbostic
8147106Sbostic
8247106Sbostic
8347106SbosticSTATIC union node *
8447106Sbosticcopynode(n)
85*69273Schristos	union node *n;
86*69273Schristos{
87*69273Schristos	union node *new;
8847106Sbostic
89*69273Schristos	%COPY
90*69273Schristos	return new;
9147106Sbostic}
9247106Sbostic
9347106Sbostic
9447106SbosticSTATIC struct nodelist *
9547106Sbosticcopynodelist(lp)
96*69273Schristos	struct nodelist *lp;
97*69273Schristos{
98*69273Schristos	struct nodelist *start;
99*69273Schristos	struct nodelist **lpp;
10047106Sbostic
101*69273Schristos	lpp = &start;
102*69273Schristos	while (lp) {
103*69273Schristos		*lpp = funcblock;
104*69273Schristos		funcblock += ALIGN(sizeof(struct nodelist));
105*69273Schristos		(*lpp)->n = copynode(lp->n);
106*69273Schristos		lp = lp->next;
107*69273Schristos		lpp = &(*lpp)->next;
108*69273Schristos	}
109*69273Schristos	*lpp = NULL;
110*69273Schristos	return start;
11147106Sbostic}
11247106Sbostic
11347106Sbostic
11447106Sbostic
11547106SbosticSTATIC char *
11647106Sbosticnodesavestr(s)
117*69273Schristos	char   *s;
118*69273Schristos{
119*69273Schristos	register char *p = s;
120*69273Schristos	register char *q = funcstring;
121*69273Schristos	char   *rtn = funcstring;
12247106Sbostic
123*69273Schristos	while ((*q++ = *p++) != '\0')
124*69273Schristos		continue;
125*69273Schristos	funcstring = q;
126*69273Schristos	return rtn;
12747106Sbostic}
12847106Sbostic
12947106Sbostic
13047106Sbostic
13147106Sbostic/*
13247106Sbostic * Free a parse tree.
13347106Sbostic */
13447106Sbostic
13547106Sbosticvoid
13647106Sbosticfreefunc(n)
137*69273Schristos	union node *n;
138*69273Schristos{
139*69273Schristos	if (n)
140*69273Schristos		ckfree(n);
14147106Sbostic}
142