#!/bin/sh -
#
# Copyright (c) 1991 The Regents of the University of California.
# All rights reserved.
#
# This code is derived from software contributed to Berkeley by
# Kenneth Almquist.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
#    must display the following acknowledgement:
#	This product includes software developed by the University of
#	California, Berkeley and its contributors.
# 4. Neither the name of the University nor the names of its contributors
#    may be used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#	@(#)nodetypes	5.1 (Berkeley) 3/7/91
#
#	/b/source/CVS/src/bin/sh/nodetypes,v 1.3 1993/03/23 00:28:58 cgd Exp

# This file describes the nodes used in parse trees.  Unindented lines
# contain a node type followed by a structure tag.  Subsequent indented
# lines specify the fields of the structure.  Several node types can share
# the same structure, in which case the fields of the structure should be
# specified only once.
#
# A field of a structure is described by the name of the field followed
# by a type.  The currently implemented types are:
#	nodeptr - a pointer to a node
#	nodelist - a pointer to a list of nodes
#	string - a pointer to a nul terminated string
#	int - an integer
#	other - any type that can be copied by assignment
#	temp - a field that doesn't have to be copied when the node is copied
# The last two types should be followed by the text of a C declaration for
# the field.

NSEMI nbinary			# two commands separated by a semicolon
	type	  int
	ch1	  nodeptr		# the first child
	ch2	  nodeptr		# the second child

NCMD ncmd			# a simple command
	type	  int
	backgnd	  int			# set to run command in background
	args	  nodeptr		# the arguments
	redirect  nodeptr		# list of file redirections

NPIPE npipe			# a pipeline
	type	  int
	backgnd	  int			# set to run pipeline in background
	cmdlist	  nodelist		# the commands in the pipeline

NREDIR nredir			# redirection (of a compex command)
	type	  int
	n	  nodeptr		# the command
	redirect  nodeptr		# list of file redirections

NBACKGND nredir			# run command in background
NSUBSHELL nredir		# run command in a subshell

NAND nbinary			# the && operator
NOR nbinary			# the || operator

NIF nif				# the if statement.  Elif clauses are handled
	type	  int		    # using multiple if nodes.
	test	  nodeptr		# if test
	ifpart	  nodeptr		# then ifpart
	elsepart  nodeptr		# else elsepart

NWHILE nbinary			# the while statement.  First child is the test
NUNTIL nbinary			# the until statement

NFOR nfor			# the for statement
	type	  int
	args	  nodeptr		# for var in args
	body	  nodeptr		# do body; done
	var	  string		# the for variable

NCASE ncase			# a case statement
	type	  int
	expr	  nodeptr		# the word to switch on
	cases	  nodeptr		# the list of cases (NCLIST nodes)

NCLIST nclist			# a case
	type	  int
	next	  nodeptr		# the next case in list
	pattern	  nodeptr		# list of patterns for this case
	body	  nodeptr		# code to execute for this case


NDEFUN narg			# define a function.  The "next" field contains
				# the body of the function.

NARG narg			# represents a word
	type	  int
	next	  nodeptr		# next word in list
	text	  string		# the text of the word
	backquote nodelist		# list of commands in back quotes

NTO nfile			# fd> fname
NFROM nfile			# fd< fname
NAPPEND nfile			# fd>> fname
	type	  int
	next	  nodeptr		# next redirection in list
	fd	  int			# file descriptor being redirected
	fname	  nodeptr		# file name, in a NARG node
	expfname  temp	char *expfname	# actual file name

NTOFD ndup			# fd<&dupfd
NFROMFD ndup			# fd>&dupfd
	type	  int
	next	  nodeptr		# next redirection in list
	fd	  int			# file descriptor being redirected
	dupfd	  int			# file descriptor to duplicate

NHERE nhere			# fd<<\!
NXHERE nhere			# fd<<!
	type	  int
	next	  nodeptr		# next redirection in list
	fd	  int			# file descriptor being redirected
	doc	  nodeptr		# input to command (NARG node)
