📄 sh.h
字号:
#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fcntl.h>/* Need a way to have void used for ANSI, nothing for K&R. */#ifndef _ANSI#undef _VOID#define _VOID#endif/* -------- sh.h -------- *//* * shell */#define LINELIM 2100#define NPUSH 8 /* limit to input nesting */#define NOFILE 20 /* Number of open files */#define NUFILE 10 /* Number of user-accessible files */#define FDBASE 10 /* First file usable by Shell *//* * values returned by wait */#define WAITSIG(s) ((s)&0177)#define WAITVAL(s) (((s)>>8)&0377)#define WAITCORE(s) (((s)&0200)!=0)/* * library and system defintions */#ifdef __STDC__typedef void xint; /* base type of jmp_buf, for not broken compilers */#elsetypedef char * xint; /* base type of jmp_buf, for broken compilers */#endif/* * shell components *//* #include "area.h" *//* #include "word.h" *//* #include "io.h" *//* #include "var.h" */#define QUOTE 0200#define NOBLOCK ((struct op *)NULL)#define NOWORD ((char *)NULL)#define NOWORDS ((char **)NULL)#define NOPIPE ((int *)NULL)/* * Description of a command or an operation on commands. * Might eventually use a union. */struct op { int type; /* operation type, see below */ char **words; /* arguments to a command */ struct ioword **ioact; /* IO actions (eg, < > >>) */ struct op *left; struct op *right; char *str; /* identifier for case and for */};#define TCOM 1 /* command */#define TPAREN 2 /* (c-list) */#define TPIPE 3 /* a | b */#define TLIST 4 /* a [&;] b */#define TOR 5 /* || */#define TAND 6 /* && */#define TFOR 7#define TDO 8#define TCASE 9#define TIF 10#define TWHILE 11#define TUNTIL 12#define TELIF 13#define TPAT 14 /* pattern in case */#define TBRACE 15 /* {c-list} */#define TASYNC 16 /* c & *//* * actions determining the environment of a process */#define BIT(i) (1<<(i))#define FEXEC BIT(0) /* execute without forking *//* * flags to control evaluation of words */#define DOSUB 1 /* interpret $, `, and quotes */#define DOBLANK 2 /* perform blank interpretation */#define DOGLOB 4 /* interpret [?* */#define DOKEY 8 /* move words with `=' to 2nd arg. list */#define DOTRIM 16 /* trim resulting string */#define DOALL (DOSUB|DOBLANK|DOGLOB|DOKEY|DOTRIM)Extern char **dolv;Extern int dolc;Extern int exstat;Extern char gflg;Extern int talking; /* interactive (talking-type wireless) */Extern int execflg;Extern int multiline; /* \n changed to ; */Extern struct op *outtree; /* result from parser */Extern xint *failpt;Extern xint *errpt;struct brkcon { jmp_buf brkpt; struct brkcon *nextlev;} ;Extern struct brkcon *brklist;Extern int isbreak;/* * redirection */struct ioword { short io_unit; /* unit affected */ short io_flag; /* action (below) */ char *io_name; /* file name */};#define IOREAD 1 /* < */#define IOHERE 2 /* << (here file) */#define IOWRITE 4 /* > */#define IOCAT 8 /* >> */#define IOXHERE 16 /* ${}, ` in << */#define IODUP 32 /* >&digit */#define IOCLOSE 64 /* >&- */#define IODEFAULT (-1) /* token for default IO unit */Extern struct wdblock *wdlist;Extern struct wdblock *iolist;/* * parsing & execution environment */extern struct env { char *linep; struct io *iobase; struct io *iop; xint *errpt; int iofd; struct env *oenv;} e;/* * flags: * -e: quit on error * -k: look for name=value everywhere on command line * -n: no execution * -t: exit after reading and executing one command * -v: echo as read * -x: trace * -u: unset variables net diagnostic */extern char *flag;extern char *null; /* null value for variable */extern int intr; /* interrupt pending */Extern char *trap[_NSIG+1];Extern char ourtrap[_NSIG+1];Extern int trapset; /* trap pending */extern int heedint; /* heed interrupt signals */Extern int yynerrs; /* yacc */Extern char line[LINELIM];extern char *elinep;/* * other functions */#ifdef __STDC__int (*inbuilt(char *s ))(void);#elseint (*inbuilt())();#endif_PROTOTYPE(char *rexecve , (char *c , char **v , char **envp ));_PROTOTYPE(char *space , (int n ));_PROTOTYPE(char *strsave , (char *s , int a ));_PROTOTYPE(char *evalstr , (char *cp , int f ));_PROTOTYPE(char *putn , (int n ));_PROTOTYPE(char *itoa , (unsigned u , int n ));_PROTOTYPE(char *unquote , (char *as ));_PROTOTYPE(struct var *lookup , (char *n ));_PROTOTYPE(int rlookup , (char *n ));_PROTOTYPE(struct wdblock *glob , (char *cp , struct wdblock *wb ));_PROTOTYPE(int subgetc , (int ec , int quoted ));_PROTOTYPE(char **makenv , (void));_PROTOTYPE(char **eval , (char **ap , int f ));_PROTOTYPE(int setstatus , (int s ));_PROTOTYPE(int waitfor , (int lastpid , int canintr ));_PROTOTYPE(void onintr , (int s )); /* SIGINT handler */_PROTOTYPE(int newenv , (int f ));_PROTOTYPE(void quitenv , (void));_PROTOTYPE(void err , (char *s ));_PROTOTYPE(int anys , (char *s1 , char *s2 ));_PROTOTYPE(int any , (int c , char *s ));_PROTOTYPE(void next , (int f ));_PROTOTYPE(void setdash , (void));_PROTOTYPE(void onecommand , (void));_PROTOTYPE(void runtrap , (int i ));_PROTOTYPE(void xfree , (char *s ));_PROTOTYPE(int letter , (int c ));_PROTOTYPE(int digit , (int c ));_PROTOTYPE(int letnum , (int c ));_PROTOTYPE(int gmatch , (char *s , char *p ));/* * error handling */_PROTOTYPE(void leave , (void)); /* abort shell (or fail in subshell) */_PROTOTYPE(void fail , (void)); /* fail but return to process next command */_PROTOTYPE(void warn , (char *s ));_PROTOTYPE(void sig , (int i )); /* default signal handler *//* -------- var.h -------- */struct var { char *value; char *name; struct var *next; char status;};#define COPYV 1 /* flag to setval, suggesting copy */#define RONLY 01 /* variable is read-only */#define EXPORT 02 /* variable is to be exported */#define GETCELL 04 /* name & value space was got with getcell */Extern struct var *vlist; /* dictionary */Extern struct var *homedir; /* home directory */Extern struct var *prompt; /* main prompt */Extern struct var *cprompt; /* continuation prompt */Extern struct var *path; /* search path for commands */Extern struct var *shell; /* shell to interpret command files */Extern struct var *ifs; /* field separators */_PROTOTYPE(int yyparse , (void));_PROTOTYPE(struct var *lookup , (char *n ));_PROTOTYPE(void setval , (struct var *vp , char *val ));_PROTOTYPE(void nameval , (struct var *vp , char *val , char *name ));_PROTOTYPE(void export , (struct var *vp ));_PROTOTYPE(void ronly , (struct var *vp ));_PROTOTYPE(int isassign , (char *s ));_PROTOTYPE(int checkname , (char *cp ));_PROTOTYPE(int assign , (char *s , int cf ));_PROTOTYPE(void putvlist , (int f , int out ));_PROTOTYPE(int eqname , (char *n1 , char *n2 ));_PROTOTYPE(int execute , (struct op *t , int *pin , int *pout , int act ));/* -------- io.h -------- *//* io buffer */struct iobuf { unsigned id; /* buffer id */ char buf[512]; /* buffer */ char *bufp; /* pointer into buffer */ char *ebufp; /* pointer to end of buffer */};/* possible arguments to an IO function */struct ioarg { char *aword; char **awordlist; int afile; /* file descriptor */ unsigned afid; /* buffer id */ long afpos; /* file position */ struct iobuf *afbuf; /* buffer for this file */};Extern struct ioarg ioargstack[NPUSH];#define AFID_NOBUF (~0)#define AFID_ID 0/* an input generator's state */struct io { int (*iofn)(_VOID); struct ioarg *argp; int peekc; char prev; /* previous character read by readc() */ char nlcount; /* for `'s */ char xchar; /* for `'s */ char task; /* reason for pushed IO */};Extern struct io iostack[NPUSH];#define XOTHER 0 /* none of the below */#define XDOLL 1 /* expanding ${} */#define XGRAVE 2 /* expanding `'s */#define XIO 3 /* file IO *//* in substitution */#define INSUB() (e.iop->task == XGRAVE || e.iop->task == XDOLL)/* * input generators for IO structure */_PROTOTYPE(int nlchar , (struct ioarg *ap ));_PROTOTYPE(int strchar , (struct ioarg *ap ));_PROTOTYPE(int qstrchar , (struct ioarg *ap ));_PROTOTYPE(int filechar , (struct ioarg *ap ));_PROTOTYPE(int herechar , (struct ioarg *ap ));_PROTOTYPE(int linechar , (struct ioarg *ap ));_PROTOTYPE(int gravechar , (struct ioarg *ap , struct io *iop ));_PROTOTYPE(int qgravechar , (struct ioarg *ap , struct io *iop ));_PROTOTYPE(int dolchar , (struct ioarg *ap ));_PROTOTYPE(int wdchar , (struct ioarg *ap ));_PROTOTYPE(void scraphere , (void));_PROTOTYPE(void freehere , (int area ));_PROTOTYPE(void gethere , (void));_PROTOTYPE(void markhere , (char *s , struct ioword *iop ));_PROTOTYPE(int herein , (char *hname , int xdoll ));_PROTOTYPE(int run , (struct ioarg *argp , int (*f)(_VOID)));/* * IO functions */_PROTOTYPE(int eofc , (void));_PROTOTYPE(int getc , (int ec ));_PROTOTYPE(int readc , (void));_PROTOTYPE(void unget , (int c ));_PROTOTYPE(void ioecho , (int c ));_PROTOTYPE(void prs , (char *s ));_PROTOTYPE(void putc , (int c ));_PROTOTYPE(void prn , (unsigned u ));_PROTOTYPE(void closef , (int i ));_PROTOTYPE(void closeall , (void));/* * IO control */_PROTOTYPE(void pushio , (struct ioarg *argp , int (*fn)(_VOID)));_PROTOTYPE(int remap , (int fd ));_PROTOTYPE(int openpipe , (int *pv ));_PROTOTYPE(void closepipe , (int *pv ));_PROTOTYPE(struct io *setbase , (struct io *ip ));extern struct ioarg temparg; /* temporary for PUSHIO */#define PUSHIO(what,arg,gen) ((temparg.what = (arg)),pushio(&temparg,(gen)))#define RUN(what,arg,gen) ((temparg.what = (arg)), run(&temparg,(gen)))/* -------- word.h -------- */#ifndef WORD_H#define WORD_H 1struct wdblock { short w_bsize; short w_nword; /* bounds are arbitrary */ char *w_words[1];};_PROTOTYPE(struct wdblock *addword , (char *wd , struct wdblock *wb ));_PROTOTYPE(struct wdblock *newword , (int nw ));_PROTOTYPE(char **getwords , (struct wdblock *wb ));#endif/* -------- area.h -------- *//* * storage allocation */_PROTOTYPE(char *getcell , (unsigned nbytes ));_PROTOTYPE(void garbage , (void));_PROTOTYPE(void setarea , (char *cp , int a ));_PROTOTYPE(int getarea , (char *cp ));_PROTOTYPE(void freearea , (int a ));_PROTOTYPE(void freecell , (char *cp ));Extern int areanum; /* current allocation area */#define NEW(type) (type *)getcell(sizeof(type))#define DELETE(obj) freecell((char *)obj)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -