1#         $NetBSD: nodetypes,v 1.20 2021/11/22 05:17:43 kre Exp $
2# Copyright (c) 1991, 1993
3#         The Regents of the University of California.  All rights reserved.
4#
5# This code is derived from software contributed to Berkeley by
6# Kenneth Almquist.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11# 1. Redistributions of source code must retain the above copyright
12#    notice, this list of conditions and the following disclaimer.
13# 2. Redistributions in binary form must reproduce the above copyright
14#    notice, this list of conditions and the following disclaimer in the
15#    documentation and/or other materials provided with the distribution.
16# 3. Neither the name of the University nor the names of its contributors
17#    may be used to endorse or promote products derived from this software
18#    without specific prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30# SUCH DAMAGE.
31#
32#         @(#)nodetypes       8.2 (Berkeley) 5/4/95
33
34# This file describes the nodes used in parse trees.  Unindented lines
35# contain a node type followed by a structure tag.  Subsequent indented
36# lines specify the fields of the structure.  Several node types can share
37# the same structure, in which case the fields of the structure should be
38# specified only once.
39#
40# A field of a structure is described by the name of the field followed
41# by a type.  The currently implemented types are:
42#         nodeptr - a pointer to a node
43#         nodelist - a pointer to a list of nodes
44#         string - a pointer to a nul terminated string
45#         int - an integer
46#         other - any type that can be copied by assignment
47#         temp - a field that doesn't have to be copied when the node is copied
48# The last two types should be followed by the text of a C declaration for
49# the field.
50
51NSEMI nbinary                           # two commands separated by a semicolon
52          type        int
53          ch1         nodeptr           # the first child
54          ch2         nodeptr           # the second child
55
56NCMD ncmd                     # a simple command
57          type        int
58          backgnd     int                         # set to run command in background
59          args        nodeptr           # the arguments
60          redirect  nodeptr             # list of file redirections
61          lineno      int
62
63NPIPE npipe                             # a pipeline
64          type        int
65          backgnd     int                         # set to run pipeline in background
66          cmdlist     nodelist                    # the commands in the pipeline
67
68NREDIR nredir                           # redirection (of a complex command)
69          type        int
70          n           nodeptr           # the command
71          redirect  nodeptr             # list of file redirections
72
73NBACKGND nredir                         # run command in background
74NSUBSHELL nredir              # run command in a subshell
75
76NAND nbinary                            # the && operator
77NOR nbinary                             # the || operator
78
79NIF nif                                 # the if statement.  Elif clauses are handled
80          type        int                   # using multiple if nodes.
81          test        nodeptr           # if test
82          ifpart      nodeptr           # then ifpart
83          elsepart  nodeptr             # else elsepart
84
85NWHILE nbinary                          # the while statement.  First child is the test
86NUNTIL nbinary                          # the until statement
87
88NFOR nfor                     # the for statement
89          type        int
90          args        nodeptr           # for var in args
91          body        nodeptr           # do body; done
92          var         string            # the for variable
93          lineno      int
94
95NCASE ncase                             # a case statement
96          type        int
97          expr        nodeptr           # the word to switch on
98          cases       nodeptr           # the list of cases (NCLIST nodes)
99          lineno      int
100
101NCLISTCONT nclist             # a case terminated by ';&' (fall through)
102NCLIST nclist                           # a case
103          type        int
104          next        nodeptr           # the next case in list
105          pattern     nodeptr           # list of patterns for this case
106          body        nodeptr           # code to execute for this case
107          lineno      int
108
109
110NDEFUN narg                             # define a function.  The "next" field contains
111                                        # the body of the function.
112
113NARG narg                     # represents a word
114          type        int
115          next        nodeptr           # next word in list
116          text        string            # the text of the word
117          backquote nodelist            # list of commands in back quotes
118          lineno      int
119
120NTO nfile                     # fd> fname
121NCLOBBER nfile                          # fd>| fname
122NFROM nfile                             # fd< fname
123NFROMTO nfile                           # fd<> fname
124NAPPEND nfile                           # fd>> fname
125          type        int
126          next        nodeptr           # next redirection in list
127          fd          int                         # file descriptor being redirected
128          fname       nodeptr           # file name, in a NARG node
129          expfname  temp      char *expfname      # actual file name
130
131NTOFD ndup                              # fd<&dupfd
132NFROMFD ndup                            # fd>&dupfd
133          type        int
134          next        nodeptr           # next redirection in list
135          fd          int                         # file descriptor being redirected
136          dupfd       int                         # file descriptor to duplicate
137          vname       nodeptr           # file name if fd>&$var
138
139
140NHERE nhere                             # fd<<\!
141NXHERE nhere                            # fd<<!
142          type        int
143          next        nodeptr           # next redirection in list
144          fd          int                         # file descriptor being redirected
145          doc         nodeptr           # input to command (NARG node)
146          text        temp  char *text  # expanded heredoc content
147
148NNOT nnot                     # ! command  (actually pipeline)
149NDNOT nnot                              # ! ! pipeline (optimisation)
150          type        int
151          com         nodeptr
152