⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc.h

📁 早期freebsd实现
💻 H
字号:
/* headers */#include <sys/types.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <stdarg.h>/* defines */#ifndef ALIGN_Ttypedef long ALIGN_T;#endif#ifndef SIG_ATOMIC_T#define SIG_ATOMIC_T int#endif#define DEFAULTPATH "", "/bin", "/usr/bin"/* datatypes */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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -