Annotation of coherent/b/bin/sh.420/sh.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * sh/sh.h
        !             3:  * Bourne shell.
        !             4:  */
        !             5: 
        !             6: #include <stdio.h>
        !             7: #include <setjmp.h>
        !             8: #include <string.h>
        !             9: 
        !            10: #define STRSIZE        2000                    /* Maximum length of single token */
        !            11: #define IALSIZE        8                       /* Initial argument list size */
        !            12: #define        DSTACKN 30                      /* Directory stack depth */
        !            13: #define NOTREACHED     return
        !            14: 
        !            15: 
        !            16: /*
        !            17:  * Masks for looking up lextab.
        !            18:  */
        !            19: 
        !            20: #define MNQUO  0x01            /* Special in argument */
        !            21: #define MDQUO  0x02            /* Special in double quotes */
        !            22: #define MHERE  0x04            /* Special in here document */
        !            23: #define MRVAR  (MBVAR | MDIGI) /* Valid in regular variable name */
        !            24: /* 0x08 was MSVAR, now is spare */
        !            25: #define MDIGI  0x10            /* Is an ascii digit */
        !            26: #define MBVAR  0x20            /* Valid 1st char in regular var name */
        !            27: #define MNAME  0x40            /* Does not start a name */
        !            28: #define MGLOB  0x80            /* Must call glob */
        !            29: 
        !            30: #define        SPECIAL_VAR_CHARS       "!#$*-0123456789?@"
        !            31: 
        !            32: 
        !            33: /*
        !            34:  * Determine if a character is a member of the given class.
        !            35:  * (This depends of the fact that EOF == -1).
        !            36:  */
        !            37: 
        !            38: #define class(c, m)    ((unsigned) (c - EOF) <= (unsigned) (0x7F - EOF) && \
        !            39:                         (lextab [c - EOF] & m) != 0)
        !            40: 
        !            41: /*
        !            42:  * Types of nodes.
        !            43:  */
        !            44: 
        !            45: #define NNULL  0                       /* Null */
        !            46: #define NFOR   1                       /* For */
        !            47: #define NCASE  2                       /* Case */
        !            48: #define NWHILE 3                       /* While */
        !            49: #define NUNTIL 4                       /* Until */
        !            50: #define NIF    5                       /* If */
        !            51: #define NELSE  6                       /* Else */
        !            52: #define NCOMS  7                       /* Command sequence */
        !            53: #define NLIST  8                       /* Command list */
        !            54: #define NBACK  9                       /* Background process */
        !            55: #define NPIPE  10                      /* Pipe */
        !            56: #define NPARN  11                      /* New shell */
        !            57: #define NBRAC  12                      /* Command group */
        !            58: #define NANDF  13                      /* Logical and operator */
        !            59: #define NORF   14                      /* Logical or operator */
        !            60: #define NARGS  15                      /* Argument string */
        !            61: #define NIORS  16                      /* Redirection of io */
        !            62: #define NASSG  17                      /* Assignment keyword */
        !            63: #define NFOR2  18                      /* Second part for, in list scan */
        !            64: #define NCASE2 19                      /* Second part case, command */
        !            65: #define NCASE3 20                      /* Third part case, pattern */
        !            66: #define NCTRL  21                      /* Control statement in list */
        !            67: #define NRPIPE 22                      /* Named pipe for read */
        !            68: #define NWPIPE 23                      /* Named pipe for write */
        !            69: #define        NFUNC   24                      /* Shell function */
        !            70: #define        NRET    25                      /* Return */
        !            71: 
        !            72: 
        !            73: /*
        !            74:  * Node.
        !            75:  */
        !            76: 
        !            77: typedef        struct  node {
        !            78:        int     n_type;                 /* Type of node */
        !            79:        struct  node *n_next;           /* Pointer to next */
        !            80:        union {
        !            81:                struct  node *nu_auxp;  /* Auxiliary pointer */
        !            82:                char    *nu_strp;       /* Pointer to string */
        !            83:        } n_u;
        !            84: } NODE;
        !            85: #define        n_auxp  n_u.nu_auxp
        !            86: #define        n_strp  n_u.nu_strp
        !            87: 
        !            88: 
        !            89: /*
        !            90:  * Flags in variables.
        !            91:  */
        !            92: 
        !            93: #define VEXP   001                     /* Variable is exported */
        !            94: #define VRDO   002                     /* Read only */
        !            95: #define VSET   004                     /* Variable is used by shell */
        !            96: 
        !            97: 
        !            98: /*
        !            99:  * Enviroment list and variable structure.
        !           100:  */
        !           101: 
        !           102: typedef        struct  var {
        !           103:        int     v_flag;                 /* Flags */
        !           104:        struct  var *v_next;            /* Pointer to next entry */
        !           105:        char    *v_strp;                /* Pointer to string */
        !           106: } VAR;
        !           107: 
        !           108: 
        !           109: /*
        !           110:  * Buffer structure.
        !           111:  */
        !           112: 
        !           113: typedef        struct  buf {
        !           114:        struct  buf *b_next;            /* Pointer to next */
        !           115:        int     b_size;                 /* Size of buffer */
        !           116: } BUF;
        !           117: 
        !           118: 
        !           119: /*
        !           120:  * NB: Here-document processing in shell functions places extra demands on
        !           121:  * the management of temporary files. When a shell function is interned, any
        !           122:  * here documents created within the function are turned into temporary
        !           123:  * files which must persist for the life of the function (ie, until the
        !           124:  * shell exits or the function is removed via "unset -f").
        !           125:  *
        !           126:  * The following data structure is intended to allow the temporary-file
        !           127:  * context to be managed in the manner required. A pointer to a list of these
        !           128:  * structures is stored in the function definition, taken from the global
        !           129:  * list of temporary files when a function is defined.
        !           130:  *
        !           131:  * Related functions:
        !           132:  *     def_sh_fn (nodep)
        !           133:  *             Captures the current temporary-file context and attaches it
        !           134:  *             to the shell function being defined.
        !           135:  *     remember_temp (filename)
        !           136:  *             Adds a filename to the current global list of temporary
        !           137:  *             files (copies filename to private buffer).
        !           138:  *     capture_temp ()
        !           139:  *             Detaches the global list of temporary files and returns
        !           140:  *             the list to the caller.
        !           141:  *     unlink_temp (templist)
        !           142:  *             Walks over the list of temporary files, unlinking the files
        !           143:  *             and deallocating the list nodes.
        !           144:  *     forget_temp (templist)
        !           145:  *             Deallocates the memory for the list of temporary files.
        !           146:  */
        !           147: 
        !           148: typedef struct temp_file TEMP_FILE;
        !           149: 
        !           150: struct temp_file {
        !           151:        TEMP_FILE     * tf_next;
        !           152:        char          * tf_name;
        !           153: };
        !           154: 
        !           155: 
        !           156: /*
        !           157:  * Per executing command data structure.
        !           158:  * Used for break/continue.
        !           159:  */
        !           160: 
        !           161: typedef        struct  con {
        !           162:        struct  con *c_next;            /* Pointer to next */
        !           163:        NODE    *c_node;                /* Node which created this control */
        !           164:        BUF     **c_bpp;                /* Current free buffer */
        !           165:        jmp_buf c_envl;                 /* Enviroment list */
        !           166:        TEMP_FILE     * c_temp;         /* temporary files */
        !           167: } CON;
        !           168: 
        !           169: #define        DESTROY_CON(cp) (freebuf ((cp)->c_bpp), \
        !           170:                         (cp)->c_temp != NULL ? unlink_temp ((cp)->c_temp) : \
        !           171:                                                (void) 0)
        !           172: 
        !           173: /*
        !           174:  * Shell functions.
        !           175:  */
        !           176: 
        !           177: typedef struct shfunc {
        !           178:        struct  shfunc  *fn_link;
        !           179:        int             fn_hash;
        !           180:        char            *fn_name;
        !           181:        NODE            *fn_body;
        !           182:        TEMP_FILE     * fn_temp;
        !           183: } SHFUNC;
        !           184: 
        !           185: 
        !           186: /*
        !           187:  * Session types.
        !           188:  */
        !           189: 
        !           190: #define SINIT  0       /* Initial session */
        !           191: #define SARGS  1       /* String */
        !           192: #define SARGV  2       /* Vector of strings */
        !           193: #define SFILE  3       /* File name */
        !           194: #define SSTR   4       /* Open stream */
        !           195: 
        !           196: 
        !           197: /*
        !           198:  * Per session information structure.
        !           199:  */
        !           200: 
        !           201: typedef struct ses {
        !           202:        struct  ses     *s_next;
        !           203:        int             s_type;
        !           204:        int             s_flag;
        !           205:        NODE            *s_node;
        !           206:        CON             *s_con;
        !           207:        BUF             **s_bpp;
        !           208:        jmp_buf         s_envl;
        !           209:        char            *s_strp;
        !           210:        char            **s_argv;
        !           211:        FILE            *s_ifp;
        !           212: } SES;
        !           213: 
        !           214: 
        !           215: /*
        !           216:  * Session long jump codes
        !           217:  */
        !           218: 
        !           219: #define RSET   0       /* Initial setjmp call */
        !           220: #define REOF   1       /* parse matched start */
        !           221: #define RCMD   2       /* parse matched command line */
        !           222: #define RERR   3       /* parse matched error */
        !           223: #define RINT   4       /* Interrupt recovery */
        !           224: #define RNOSBRK        5       /* no more memory from alloc */
        !           225: #define RSYSER 6       /* system returned -1 */
        !           226: #define RUABORT        7       /* user requested error abort */
        !           227: #define RUEXITS        8       /* user requested exit command */
        !           228: #define RBRKCON        9       /* break or continue beyond program */
        !           229: #define RNOWAY 10      /* Shell assertion failed */
        !           230: 
        !           231: 
        !           232: /*
        !           233:  * Interrupt recovery and set contexts.
        !           234:  * Used to determine recovery action and default signals.
        !           235:  */
        !           236: 
        !           237: #define IRDY   0       /* In session */
        !           238: #define        ILEX    1       /* Parse in progress */
        !           239: #define ICMD   2       /* Prior to next command execution */
        !           240: #define IEVAL  3       /* Command evaluation in progress */
        !           241: #define IBACK  4       /* Background process */
        !           242: #define IFORK  5       /* Child after fork */
        !           243: #define IPROF  6       /* Reading /etc/profile for login */
        !           244: 
        !           245: 
        !           246: /*
        !           247:  * Evaluation contexts.
        !           248:  */
        !           249: 
        !           250: #define EWORD  0       /* Evaluate $N, `cmd`, strip quotes */
        !           251: #define EHERE  1       /* Evaluate $N, `cmd`, ignore quotes */
        !           252: #define EARGS  2       /* Evaluete $N, `cmd`, strip quotes, *?[, blanks */
        !           253: #define EPATT  3       /* Evaluate for pattern match */
        !           254: 
        !           255: 
        !           256: /*
        !           257:  * NB : The shell is required to permit redirections of built-ins and special
        !           258:  * built-in operations in such a way that they are not run in subshells (since
        !           259:  * they have to affect the top-level environment). To permit this, the
        !           260:  * redirection code makes duplicates of file descriptors it overwrites and
        !           261:  * records all the information necessary to reverse the effect of the
        !           262:  * redirections on the global environment. This structure holds the "undo"
        !           263:  * information. Note that "ru_newfd" may be set to -1 if the fd that was
        !           264:  * redirected did not originally refer to an open file.
        !           265:  *
        !           266:  * Related functions:
        !           267:  *     redirect (iovp, undo)
        !           268:  *             The "undo" argument is an optional pointer to the head of a
        !           269:  *             list of REDIR_UNDO entries.
        !           270:  *     redirundo (undo)
        !           271:  *             Processes a list of REDIR_UNDO entries.
        !           272:  */
        !           273: 
        !           274: typedef struct redir_undo REDIR_UNDO;
        !           275: 
        !           276: struct redir_undo {
        !           277:        REDIR_UNDO    * ru_next;        /* link to next undo item */
        !           278:        int             ru_oldfd;       /* fd changed by redirection */
        !           279:        int             ru_newfd;       /* duplicate of original fd */
        !           280: };
        !           281: 
        !           282: 
        !           283: /*
        !           284:  * Flags for controlling collect () in lex.c
        !           285:  */
        !           286: 
        !           287: enum {
        !           288:        CONSUME_BACKSLASH,      /*
        !           289:                                 * Allow back-slash quoting of anything and
        !           290:                                 * consume the backslashes.
        !           291:                                 */
        !           292:        BACKSLASH_END,          /*
        !           293:                                 * Recognise backslash-quoting of the end
        !           294:                                 * character, but retain the backslash.
        !           295:                                 */
        !           296:        NO_BACKSLASH,           /* backslashes are ordinary */
        !           297:        NO_ERRORS               /* backslashes are ordinary, silent errors */
        !           298: };
        !           299:                                
        !           300: 
        !           301: /*
        !           302:  * Global variables.
        !           303:  *     Run time and set time flags.
        !           304:  */
        !           305: 
        !           306: extern         char    shflags[];              /* Flag array */
        !           307: extern char    shfnams[];              /* Flag name array */
        !           308: 
        !           309: #define eflag  shflags[0]              /* Exit on non-zero status */
        !           310: #define kflag  shflags[1]              /* All assignments into environ */
        !           311: #define nflag  shflags[2]              /* Do not execute commands */
        !           312: #define pflag  shflags[3]              /* Unknown */
        !           313: #define tflag  shflags[4]              /* Exit after read/exec one command */
        !           314: #define uflag  shflags[5]              /* Unset variables are errors */
        !           315: #define vflag  shflags[6]              /* Print input as read */
        !           316: #define xflag  shflags[7]              /* Print commands as executed */
        !           317: 
        !           318: #define cflag  shflags[8]              /* Execute argument as command */
        !           319: #define iflag  shflags[9]              /* Be interactive shell */
        !           320: #define rflag  shflags[10]             /* Restricted shell */
        !           321: #define sflag  shflags[11]             /* input<&0, output>&2 */
        !           322: 
        !           323: #define lgnflag        shflags[12]             /* Login shell */
        !           324: #define no1flag        shflags[13]             /* Invoked shell */
        !           325: #define bckflag        shflags[14]             /* Background process */
        !           326: #define nllflag shflags[15]            /* Forked shell */
        !           327: #define cmdflag        shflags[16]             /* Command file processor */
        !           328: 
        !           329: 
        !           330: /* Shell status housekeeping */
        !           331: 
        !           332: extern jmp_buf restart;                /* Restart execution context */
        !           333: extern SHFUNC  *sh_fnp;                /* User-defined shell function list */
        !           334: extern int     in_sh_fn;               /* Executing shell function */
        !           335: extern int     ret_done;               /* "return" executed */
        !           336: extern int     sargc;                  /* Argument count to shell */
        !           337: extern char    *sarg0;                 /* Name shell called with */
        !           338: extern char    **sargv;                /* Argument vector to shell */
        !           339: extern char    **senvp;                /* Environment vector to shell */
        !           340: extern char    **sargp;                /* Current argument to shell */
        !           341: extern char    *scmdp;                 /* Path/filename of command file */
        !           342: extern int     nargc;                  /* New argument count, for command */
        !           343: extern char    **nargv;                /* New argument vector, for command */
        !           344: extern char    **nenvp;                /* New environment, for command */
        !           345: extern char    **niovp;                /* Io redirection, for command */
        !           346: extern NODE     *nctlp;                /* Control node, for command */
        !           347: extern SES     *sesp;                  /* Current session structure */
        !           348: extern int     yyline;                 /* Yacc command line counter */
        !           349: extern int     shpid;                  /* Shell's process id */
        !           350: extern int     slret;                  /* Exit status of last command */
        !           351: extern int     sback;                  /* Pid of last background command */
        !           352: extern int     spipe;                  /* Pid of last pipe process */
        !           353: extern int     ufmask;                 /* File creation mask */
        !           354: 
        !           355: /* Other internal flags. */
        !           356: 
        !           357: extern int     comflag;                /* Command line is complete?? */
        !           358: extern int     errflag;                /* Set by call to printe */
        !           359: extern int     keyflag;                /* Look for keyword in next word */
        !           360: extern int     noeflag;                /* Turn off errors */
        !           361: extern int     prpflag;                /* Do prompt before next read */
        !           362: extern int     readflag;               /* Doing read command? */
        !           363: 
        !           364: /* Parameters used by shell. */
        !           365: 
        !           366: extern char    *vhome;                 /* Home directory */
        !           367: extern char    *vpath;                 /* Search pathname */
        !           368: extern char    *vmail;                 /* Mail file */
        !           369: extern char    *vps1;                  /* Prompt string 1 */
        !           370: extern char    *vps2;                  /* Prompt string 2 */
        !           371: extern char    *vifs;                  /* Internal field seperators */
        !           372: extern char    *vshell;                /* Shell to use */
        !           373: 
        !           374: /* Shell data */
        !           375: 
        !           376: extern char    strt[STRSIZE];          /* String buffer */
        !           377: extern char    *strp;                  /* Pointer in string buffer */
        !           378: extern VAR     *varp;                  /* Pointer to shell variables */
        !           379: extern char    *dstack[DSTACKN];       /* Directory stack */
        !           380: extern int     dstkp;                  /* Directory stack pointer */
        !           381: 
        !           382: /* Tables */
        !           383: 
        !           384: extern unsigned char   lextab[];               /* Character type table */
        !           385: 
        !           386: /* Data external to shell */
        !           387: 
        !           388: extern int     errno;                  /* System call error number */
        !           389: extern char    *signame[];             /* Wait status message table */
        !           390: 
        !           391: 
        !           392: /*
        !           393:  * Functions.
        !           394:  */
        !           395: 
        !           396: extern char    *shtmp();               /* in main.c */
        !           397: extern char    *salloc();              /* in alloc.c */
        !           398: extern char    *balloc();              /* in alloc.c */
        !           399: extern char    *duplstr();             /* in alloc.c */
        !           400: extern char    **makargl();            /* in alloc.c */
        !           401: extern char    **addargl();            /* in alloc.c */
        !           402: extern BUF     **savebuf();            /* in alloc.c */
        !           403: extern char    **vdupl();              /* in alloc.c */
        !           404: extern char    *gany();                /* in glob.c */
        !           405: extern void    sigintr();              /* in trap.c */
        !           406: extern VAR     *findvar();             /* in var.c */
        !           407: extern VAR     *setsvar();             /* in var.c */
        !           408: extern VAR     *flagvar();             /* in var.c */
        !           409: extern VAR     *assnvar();             /* in var.c */
        !           410: extern char    *convvar();             /* in var.c */
        !           411: extern char    **envlvar();            /* in var.c */
        !           412: extern char    *_getwd();              /* in /lib/libc.a */
        !           413: 
        !           414: 
        !           415: /* NB: new stuff for shell functions */
        !           416: 
        !           417: extern TEMP_FILE     * capture_temp ();        /* main.c */
        !           418: extern void            unlink_temp ();         /* main.c */
        !           419: extern void            cleanup_shell_fns ();   /* exec3.c */
        !           420: 
        !           421: #ifdef ALLOC_DEBUG
        !           422: struct alloc_debug {
        !           423:        char          * name;
        !           424:        int             count;
        !           425:        int             maxcount;
        !           426: };
        !           427: # define       ALLOC_COUNT(x)          struct alloc_debug x##debug = { #x };
        !           428: # define       ALLOC_ALLOC(x)          alloc_alloc (& x##debug);
        !           429: # define       ALLOC_FREE(x)           x##debug.count --;
        !           430: #
        !           431: #else
        !           432: # define       ALLOC_COUNT(x)
        !           433: # define       ALLOC_ALLOC(x)
        !           434: # define       ALLOC_FREE(x)
        !           435: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.