1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 26 /* All Rights Reserved */ 27 28 #ifndef _MODE_H 29 #define _MODE_H 30 31 /* 32 * UNIX shell 33 */ 34 35 #include <unistd.h> 36 37 #ifdef pdp11 38 typedef char BOOL; 39 #else 40 typedef short BOOL; 41 #endif 42 43 #define BYTESPERWORD (sizeof (char *)) 44 #define ALIGNSIZ (sizeof (double)) 45 #define NIL ((char *)0) 46 47 48 /* 49 * the following nonsense is required 50 * because casts turn an Lvalue 51 * into an Rvalue so two cheats 52 * are necessary, one for each context. 53 */ 54 #define Rcheat(a) ((int)(a)) 55 56 57 /* address puns for storage allocation */ 58 typedef union 59 { 60 struct forknod *_forkptr; 61 struct comnod *_comptr; 62 struct fndnod *_fndptr; 63 struct parnod *_parptr; 64 struct ifnod *_ifptr; 65 struct whnod *_whptr; 66 struct fornod *_forptr; 67 struct lstnod *_lstptr; 68 struct blk *_blkptr; 69 struct namnod *_namptr; 70 char *_bytptr; 71 } address; 72 73 74 /* heap storage */ 75 struct blk 76 { 77 struct blk *word; 78 char pad[ALIGNSIZ - sizeof (struct blk *)]; 79 }; 80 81 /* 82 * largefile converson hack note. 83 * the shell uses the *fnxt and *fend pointers when 84 * parsing a script. However, it was also using the 85 * difference between them when doing lseeks. Because 86 * that doesn't work in the largefile world, I have 87 * added a parallel set of offset counters that need to 88 * be updated whenever the "buffer" offsets the shell 89 * uses get changed. Most of this code is in word.c. 90 * If you change it, have fun... 91 */ 92 93 #define BUFFERSIZE 128 94 struct fileblk 95 { 96 int fdes; 97 unsigned flin; 98 BOOL feof; 99 unsigned char fsiz; 100 unsigned char *fnxt; 101 unsigned char *fend; 102 off_t nxtoff; /* file offset */ 103 off_t endoff; /* file offset */ 104 unsigned char **feval; 105 struct fileblk *fstak; 106 unsigned char fbuf[BUFFERSIZE]; 107 }; 108 109 struct tempblk 110 { 111 int fdes; 112 struct tempblk *fstak; 113 }; 114 115 116 /* for files not used with file descriptors */ 117 struct filehdr 118 { 119 int fdes; 120 unsigned flin; 121 BOOL feof; 122 unsigned char fsiz; 123 unsigned char *fnxt; 124 unsigned char *fend; 125 off_t nxtoff; /* file offset */ 126 off_t endoff; /* file offset */ 127 unsigned char **feval; 128 struct fileblk *fstak; 129 unsigned char _fbuf[1]; 130 }; 131 132 struct sysnod 133 { 134 char *sysnam; 135 int sysval; 136 }; 137 138 /* this node is a proforma for those that follow */ 139 struct trenod 140 { 141 int tretyp; 142 struct ionod *treio; 143 }; 144 145 /* dummy for access only */ 146 struct argnod 147 { 148 struct argnod *argnxt; 149 unsigned char argval[1]; 150 }; 151 152 struct dolnod 153 { 154 struct dolnod *dolnxt; 155 int doluse; 156 unsigned char **dolarg; 157 }; 158 159 struct forknod 160 { 161 int forktyp; 162 struct ionod *forkio; 163 struct trenod *forktre; 164 }; 165 166 struct comnod 167 { 168 int comtyp; 169 struct ionod *comio; 170 struct argnod *comarg; 171 struct argnod *comset; 172 }; 173 174 struct fndnod 175 { 176 int fndtyp; 177 unsigned char *fndnam; 178 struct trenod *fndval; 179 int fndref; 180 }; 181 182 struct ifnod 183 { 184 int iftyp; 185 struct trenod *iftre; 186 struct trenod *thtre; 187 struct trenod *eltre; 188 }; 189 190 struct whnod 191 { 192 int whtyp; 193 struct trenod *whtre; 194 struct trenod *dotre; 195 }; 196 197 struct fornod 198 { 199 int fortyp; 200 struct trenod *fortre; 201 unsigned char *fornam; 202 struct comnod *forlst; 203 }; 204 205 struct swnod 206 { 207 int swtyp; 208 unsigned char *swarg; 209 struct regnod *swlst; 210 }; 211 212 struct regnod 213 { 214 struct argnod *regptr; 215 struct trenod *regcom; 216 struct regnod *regnxt; 217 }; 218 219 struct parnod 220 { 221 int partyp; 222 struct trenod *partre; 223 }; 224 225 struct lstnod 226 { 227 int lsttyp; 228 struct trenod *lstlef; 229 struct trenod *lstrit; 230 }; 231 232 struct ionod 233 { 234 int iofile; 235 char *ioname; 236 char *iolink; 237 struct ionod *ionxt; 238 struct ionod *iolst; 239 }; 240 241 struct fdsave 242 { 243 int org_fd; 244 int dup_fd; 245 }; 246 247 248 #define fndptr(x) ((struct fndnod *)x) 249 #define comptr(x) ((struct comnod *)x) 250 #define forkptr(x) ((struct forknod *)x) 251 #define parptr(x) ((struct parnod *)x) 252 #define lstptr(x) ((struct lstnod *)x) 253 #define forptr(x) ((struct fornod *)x) 254 #define whptr(x) ((struct whnod *)x) 255 #define ifptr(x) ((struct ifnod *)x) 256 #define swptr(x) ((struct swnod *)x) 257 258 #endif /* _MODE_H */ 259