rc

[fork] interactive rc shell
Log | Files | Refs | README | LICENSE

commit 5a539887ea0a5d591d66f86aca830b19ac98a2b1
parent ed998daafc3b46899a4c59419a9ac584d3a5e883
Author: tim <tim>
Date:   Mon, 19 May 1997 16:44:38 +0000

Initial revision

Diffstat:
Arc.h | 378+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 378 insertions(+), 0 deletions(-)

diff --git a/rc.h b/rc.h @@ -0,0 +1,378 @@ +#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 memzero(s, n) memset(s, 0, n) +#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 **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(bool, bool); +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; + +/* 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 **); +extern char *strstatus(int s); + +/* 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 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; +