home *** CD-ROM | disk | FTP | other *** search
- #include "config.h"
- #include "proto.h"
-
- /* datatypes */
-
- /* braindamaged IBM header files #define true and false */
- #undef FALSE
- #undef TRUE
-
- #include <stdarg.h>
-
- typedef void builtin_t(char **);
- typedef struct Block Block;
- typedef struct Dup Dup;
- typedef struct Estack Estack;
- typedef struct Function Function;
- typedef struct Hq Hq;
- typedef struct Htab Htab;
- typedef struct Jbwrap Jbwrap;
- typedef struct List List;
- typedef struct Node Node;
- typedef struct Pipe Pipe;
- typedef struct Redir Redir;
- typedef struct Rq Rq;
- typedef struct Variable Variable;
- typedef struct Word Word;
- typedef struct Format Format;
- typedef union Edata Edata;
-
- typedef enum nodetype {
- nAndalso, nAssign, nBackq, nBang, nBody, nCbody, nNowait, nBrace, nConcat,
- nCount, nElse, nFlat, nDup, nEpilog, nNewfn, nForin, nIf, nQword,
- nOrelse, nPipe, nPre, nRedir, nRmfn, nArgs, nSubshell, nCase,
- nSwitch, nMatch, nVar, nVarsub, nWhile, nWord, nLappend, nNmpipe
- } nodetype;
-
- typedef enum ecodes {
- eError, eBreak, eReturn, eVarstack, eArena, eFifo, eFd
- } ecodes;
-
- typedef enum bool {
- FALSE, TRUE
- } bool;
-
- typedef enum inputtype {
- iFd, iString
- } inputtype;
-
- typedef enum redirtype {
- rFrom, rCreate, rAppend, rHeredoc, rHerestring
- } redirtype;
-
- typedef bool (*Conv)(Format *, int);
-
- union Edata {
- Jbwrap *jb;
- Block *b;
- char *name;
- int fd;
- };
-
- struct Estack {
- ecodes e;
- bool interactive;
- Edata data;
- Estack *prev;
- };
-
- struct List {
- char *w, *m;
- List *n;
- };
-
- struct Node {
- nodetype type;
- union {
- char *s;
- int i;
- Node *p;
- } u[4];
- };
-
- struct Pipe {
- int left, right;
- };
-
- struct Dup {
- redirtype type;
- int left, right;
- };
-
- struct Redir {
- redirtype type;
- int fd;
- };
-
- struct Word {
- char *w, *m;
- };
-
- struct Rq {
- Node *r;
- struct Rq *n;
- };
-
- struct Function {
- Node *def;
- char *extdef;
- };
-
- struct Variable {
- List *def;
- char *extdef;
- Variable *n;
- };
-
- struct Htab {
- char *name;
- void *p;
- };
-
- struct Format {
- /* for the formatting routines */
- va_list args;
- long flags, f1, f2;
- /* for the buffer maintainence routines */
- char *buf, *bufbegin, *bufend;
- int flushed;
- void (*grow)(Format *, SIZE_T);
- union { int n; void *p; } u;
- };
-
- /* Format->flags values */
- enum {
- FMT_long = 1, /* %l */
- FMT_short = 2, /* %h */
- FMT_unsigned = 4, /* %u */
- FMT_zeropad = 8, /* %0 */
- FMT_leftside = 16, /* %- */
- FMT_altform = 32, /* %# */
- FMT_f1set = 64, /* %<n> */
- FMT_f2set = 128 /* %.<n> */
- };
-
- /* macros */
- #define EOF (-1)
- #ifndef NULL
- #define NULL 0
- #endif
- #define a2u(x) n2u(x, 10)
- #define o2u(x) n2u(x, 8)
- #define arraysize(a) ((int)(sizeof(a)/sizeof(*a)))
- #define enew(x) ((x *) ealloc(sizeof(x)))
- #define ecpy(x) strcpy((char *) ealloc(strlen(x) + 1), x)
- #define lookup_fn(s) ((Function *) lookup(s, fp))
- #define lookup_var(s) ((Variable *) lookup(s, vp))
- #define nnew(x) ((x *) nalloc(sizeof(x)))
- #define ncpy(x) (strcpy((char *) nalloc(strlen(x) + 1), x))
- #ifndef offsetof
- #define offsetof(t, m) ((SIZE_T) (((char *) &((t *) 0)->m) - (char *)0))
- #endif
- #define streq(x, y) (*(x) == *(y) && strcmp(x, y) == 0)
- #define conststrlen(x) (sizeof (x) - 1)
-
- /* rc prototypes */
-
- /* main.c */
- extern char *prompt, *prompt2;
- extern Rq *redirq;
- extern bool dashdee, dashee, dashvee, dashex, dashell,
- dasheye, dashen, dashpee, interactive;
- extern int rc_pid;
- extern int lineno;
-
- /* builtins.c */
- extern builtin_t *isbuiltin(char *);
- extern void b_exec(char **), funcall(char **), b_dot(char **), b_builtin(char **);
- extern char *which(char *, bool);
-
- /* except.c */
- extern bool nl_on_intr;
- extern bool outstanding_cmdarg(void);
- extern void pop_cmdarg(bool);
- extern void rc_raise(ecodes);
- extern void except(ecodes, Edata, Estack *);
- extern void unexcept(void);
- extern void rc_error(char *);
- extern void sigint(int);
-
- /* exec.c */
- extern void exec(List *, bool);
- extern void doredirs(void);
-
- /* footobar.c */
- extern char *fun2str(char *, Node *);
- extern char *list2str(char *, List *);
- extern char **list2array(List *, bool);
- extern char *get_name(char *);
- extern List *parse_var(char *, char *);
- extern Node *parse_fn(char *, char *);
- extern void initprint(void);
- extern void rc_exit(int); /* here for odd reasons; user-defined signal handlers are kept in fn.c */
-
- /* getopt.c */
- extern int rc_getopt(int, char **, char *);
-
- extern int rc_optind, rc_opterr, rc_optopt;
- extern char *rc_optarg;
-
- /* glob.c */
- extern bool lmatch(List *, List *);
- extern List *glob(List *);
-
- /* glom.c */
- extern void assign(List *, List *, bool);
- extern void qredir(Node *);
- extern List *append(List *, List*);
- extern List *flatten(List *);
- extern List *glom(Node *);
- extern List *concat(List *, List *);
- extern List *varsub(List *, List *);
- extern List *word(char *, char *);
-
- /* hash.c */
- extern Htab *fp, *vp;
- extern void *lookup(char *, Htab *);
- extern Function *get_fn_place(char *);
- extern List *varlookup(char *);
- extern Node *fnlookup(char *);
- extern Variable *get_var_place(char *, bool);
- extern bool varassign_string(char *);
- extern char **makeenv(void);
- extern char *fnlookup_string(char *);
- extern char *varlookup_string(char *);
- extern void alias(char *, List *, bool);
- extern void starassign(char *, char **, bool);
- extern void delete_fn(char *);
- extern void delete_var(char *, bool);
- extern void fnassign(char *, Node *);
- extern void fnassign_string(char *);
- extern void fnrm(char *);
- extern void initenv(char **);
- extern void inithash(void);
- extern void setsigdefaults(bool);
- extern void inithandler(void);
- extern void varassign(char *, List *, bool);
- extern void varrm(char *, bool);
- extern void whatare_all_vars(void);
- extern void whatare_all_signals(void);
- extern void prettyprint_var(int, char *, List *);
- extern void prettyprint_fn(int, char *, Node *);
-
- /* heredoc.c */
- extern int heredoc(int);
- extern int qdoc(Node *, Node *);
- extern Hq *hq;
-
- /* input.c */
- extern void initinput(void);
- extern Node *parseline(char *);
- extern int gchar(void);
- extern void ugchar(int);
- extern Node *doit(bool);
- extern void flushu(void);
- extern void pushfd(int);
- extern void pushstring(char **, bool);
- extern void popinput(void);
- extern void closefds(void);
- extern int last;
- extern bool rcrc;
-
- /* lex.c */
- extern int yylex(void);
- extern void inityy(void);
- extern void yyerror(const char *);
- extern void scanerror(char *);
- extern void print_prompt2(void);
- extern const char nw[], dnw[];
-
- /* list.c */
- extern void listfree(List *);
- extern List *listcpy(List *, void *(*)(SIZE_T));
- extern SIZE_T listlen(List *);
- extern int listnel(List *);
-
- /* match.c */
- extern bool match(char *, char *, char *);
-
- /* alloc.c */
- extern void *ealloc(SIZE_T);
- extern void *erealloc(void *, SIZE_T);
- extern void efree(void *);
- extern Block *newblock(void);
- extern void *nalloc(SIZE_T);
- extern void nfree(void);
- extern void restoreblock(Block *);
-
- /* open.c */
- extern int rc_open(const char *, redirtype);
-
- /* print.c */
- /*
- The following prototype should be:
- extern Conv fmtinstall(int, Conv);
- but this freaks out SGI's compiler under IRIX3.3.2
- */
- extern bool (*fmtinstall(int, bool (*)(Format *, int)))(Format *, int);
- extern int printfmt(Format *, const char *);
- extern int fmtprint(Format *, const char *,...);
- extern void fmtappend(Format *, const char *, SIZE_T);
- extern void fmtcat(Format *, const char *);
- extern int fprint(int fd, const char *fmt,...);
- extern char *mprint(const char *fmt,...);
- extern char *nprint(const char *fmt,...);
- /*
- the following macro should by rights be coded as an expression, not
- a statement, but certain compilers (notably DEC) have trouble with
- void expressions inside the ?: operator. (sheesh, give me a break!)
- */
- #define fmtputc(f, c) {\
- if ((f)->buf >= (f)->bufend)\
- (*(f)->grow)((f), (SIZE_T)1);\
- *(f)->buf++ = (c);\
- }
-
- /* y.tab.c (parse.y) */
- extern Node *parsetree;
- extern int yyparse(void);
- extern void initparse(void);
-
- /* redir.c */
- extern void doredirs(void);
-
- /* signal.c */
- extern void initsignal(void);
- extern void catcher(int);
- extern void sigchk(void);
- extern void (*rc_signal(int, void (*)(int)))(int);
- extern void (*sighandlers[])(int);
- extern volatile SIG_ATOMIC_T slow, interrupt_happened;
- #define SIGCHK sigchk()
-
- /* status.c */
- extern int istrue(void);
- extern int getstatus(void);
- extern void set(bool);
- extern void setstatus(int, int);
- extern List *sgetstatus(void);
- extern void setpipestatus(int [], int);
- extern void statprint(int, int);
- extern void ssetstatus(char **);
-
- /* tree.c */
- extern Node *mk(int /*nodetype*/,...);
- extern Node *treecpy(Node *, void *(*)(SIZE_T));
- extern void treefree(Node *);
-
- /* utils.c */
- extern bool isabsolute(char *);
- extern int n2u(char *, unsigned int);
- extern int rc_read(int, char *, SIZE_T);
- extern int mvfd(int, int);
- extern int starstrcmp(const void *, const void *);
- extern void pr_error(char *);
- extern char *clear(char *, SIZE_T);
- extern void panic(char *);
- extern void uerror(char *);
- extern void writeall(int, char *, SIZE_T);
-
- /* wait.c */
- extern int rc_fork(void);
- extern int rc_wait4(int, int *, bool);
- extern List *sgetapids(void);
- extern void waitforall(void);
- extern bool forked;
-
- /* walk.c */
- extern bool walk(Node *, bool);
- extern bool cond;
-
-