xref: /csrg-svn/bin/sh/nodes.c.pat (revision 60709)
147106Sbostic/*-
2*60709Sbostic * Copyright (c) 1991, 1993
3*60709Sbostic *	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*60709Sbostic *	@(#)nodes.c.pat	8.1 (Berkeley) 05/31/93
1147106Sbostic */
1247106Sbostic
1347106Sbostic/*
1447106Sbostic * Routine for dealing with parsed shell commands.
1547106Sbostic */
1647106Sbostic
1747106Sbostic#include "shell.h"
1847106Sbostic#include "nodes.h"
1947106Sbostic#include "memalloc.h"
2047106Sbostic#include "machdep.h"
2147106Sbostic#include "mystring.h"
2247106Sbostic
2347106Sbostic
2447106Sbosticint funcblocksize;		/* size of structures in function */
2547106Sbosticint funcstringsize;		/* size of strings in node */
2647166Sbostic#ifdef __STDC__
2747106Sbosticpointer funcblock;		/* block to allocate function from */
2847166Sbostic#else
2947166Sbosticchar *funcblock;		/* block to allocate function from */
3047166Sbostic#endif
3147106Sbosticchar *funcstring;		/* block to allocate strings from */
3247106Sbostic
3347106Sbostic%SIZES
3447106Sbostic
3547106Sbostic
3647106Sbostic#ifdef __STDC__
3747106SbosticSTATIC void calcsize(union node *);
3847106SbosticSTATIC void sizenodelist(struct nodelist *);
3947106SbosticSTATIC union node *copynode(union node *);
4047106SbosticSTATIC struct nodelist *copynodelist(struct nodelist *);
4147106SbosticSTATIC char *nodesavestr(char *);
4247106Sbostic#else
4347106SbosticSTATIC void calcsize();
4447106SbosticSTATIC void sizenodelist();
4547106SbosticSTATIC union node *copynode();
4647106SbosticSTATIC struct nodelist *copynodelist();
4747106SbosticSTATIC char *nodesavestr();
4847106Sbostic#endif
4947106Sbostic
5047106Sbostic
5147106Sbostic
5247106Sbostic/*
5347106Sbostic * Make a copy of a parse tree.
5447106Sbostic */
5547106Sbostic
5647106Sbosticunion node *
5747106Sbosticcopyfunc(n)
5847106Sbostic      union node *n;
5947106Sbostic      {
6047106Sbostic      if (n == NULL)
6147106Sbostic	    return NULL;
6247106Sbostic      funcblocksize = 0;
6347106Sbostic      funcstringsize = 0;
6447106Sbostic      calcsize(n);
6547106Sbostic      funcblock = ckmalloc(funcblocksize + funcstringsize);
6647106Sbostic      funcstring = funcblock + funcblocksize;
6747106Sbostic      return copynode(n);
6847106Sbostic}
6947106Sbostic
7047106Sbostic
7147106Sbostic
7247106SbosticSTATIC void
7347106Sbosticcalcsize(n)
7447106Sbostic      union node *n;
7547106Sbostic      {
7647106Sbostic      %CALCSIZE
7747106Sbostic}
7847106Sbostic
7947106Sbostic
8047106Sbostic
8147106SbosticSTATIC void
8247106Sbosticsizenodelist(lp)
8347106Sbostic      struct nodelist *lp;
8447106Sbostic      {
8547106Sbostic      while (lp) {
8647106Sbostic	    funcblocksize += ALIGN(sizeof (struct nodelist));
8747106Sbostic	    calcsize(lp->n);
8847106Sbostic	    lp = lp->next;
8947106Sbostic      }
9047106Sbostic}
9147106Sbostic
9247106Sbostic
9347106Sbostic
9447106SbosticSTATIC union node *
9547106Sbosticcopynode(n)
9647106Sbostic      union node *n;
9747106Sbostic      {
9847106Sbostic      union node *new;
9947106Sbostic
10047106Sbostic      %COPY
10147106Sbostic      return new;
10247106Sbostic}
10347106Sbostic
10447106Sbostic
10547106SbosticSTATIC struct nodelist *
10647106Sbosticcopynodelist(lp)
10747106Sbostic      struct nodelist *lp;
10847106Sbostic      {
10947106Sbostic      struct nodelist *start;
11047106Sbostic      struct nodelist **lpp;
11147106Sbostic
11247106Sbostic      lpp = &start;
11347106Sbostic      while (lp) {
11447106Sbostic	    *lpp = funcblock;
11547106Sbostic	    funcblock += ALIGN(sizeof (struct nodelist));
11647106Sbostic	    (*lpp)->n = copynode(lp->n);
11747106Sbostic	    lp = lp->next;
11847106Sbostic	    lpp = &(*lpp)->next;
11947106Sbostic      }
12047106Sbostic      *lpp = NULL;
12147106Sbostic      return start;
12247106Sbostic}
12347106Sbostic
12447106Sbostic
12547106Sbostic
12647106SbosticSTATIC char *
12747106Sbosticnodesavestr(s)
12847106Sbostic      char *s;
12947106Sbostic      {
13047106Sbostic      register char *p = s;
13147106Sbostic      register char *q = funcstring;
13247106Sbostic      char *rtn = funcstring;
13347106Sbostic
13447106Sbostic      while (*q++ = *p++);
13547106Sbostic      funcstring = q;
13647106Sbostic      return rtn;
13747106Sbostic}
13847106Sbostic
13947106Sbostic
14047106Sbostic
14147106Sbostic/*
14247106Sbostic * Free a parse tree.
14347106Sbostic */
14447106Sbostic
14547106Sbosticvoid
14647106Sbosticfreefunc(n)
14747106Sbostic      union node *n;
14847106Sbostic      {
14947106Sbostic      if (n)
15047106Sbostic	    ckfree(n);
15147106Sbostic}
152