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

📄 sh.h

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 H
📖 第 1 页 / 共 2 页
字号:
EXTERN	pid_t	kshpid;		/* $$, shell pid */EXTERN	pid_t	procpid;	/* pid of executing process */EXTERN	int	ksheuid;	/* effective uid of shell */EXTERN	int	exstat;		/* exit status */EXTERN	int	subst_exstat;	/* exit status of last $(..)/`..` */EXTERN	const char *safe_prompt; /* safe prompt if PS1 substitution fails *//* * Area-based allocation built on malloc/free */typedef struct Area {	struct Block *freelist;	/* free list */} Area;EXTERN	Area	aperm;		/* permanent object space */#define	APERM	&aperm#define	ATEMP	&e->area#ifdef MEM_DEBUG# include "chmem.h" /* a debugging front end for malloc et. al. */#endif /* MEM_DEBUG */#ifdef KSH_DEBUG# define kshdebug_init()	kshdebug_init_()# define kshdebug_printf(a)	kshdebug_printf_ a# define kshdebug_dump(a)	kshdebug_dump_ a#else /* KSH_DEBUG */# define kshdebug_init()# define kshdebug_printf(a)# define kshdebug_dump(a)#endif /* KSH_DEBUG *//* * parsing & execution environment */EXTERN	struct env {	short	type;			/* enviroment type - see below */	short	flags;			/* EF_* */	Area	area;			/* temporary allocation area */	struct	block *loc;		/* local variables and functions */	short  *savefd;			/* original redirected fd's */	struct	env *oenv;		/* link to previous enviroment */	ksh_jmp_buf jbuf;		/* long jump back to env creator */	struct temp *temps;		/* temp files */} *e;/* struct env.type values */#define	E_NONE	0		/* dummy enviroment */#define	E_PARSE	1		/* parsing command # */#define	E_FUNC	2		/* executing function # */#define	E_INCL	3		/* including a file via . # */#define	E_EXEC	4		/* executing command tree */#define	E_LOOP	5		/* executing for/while # */#define	E_ERRH	6		/* general error handler # *//* # indicates env has valid jbuf (see unwind()) *//* struct env.flag values */#define EF_FUNC_PARSE	BIT(0)	/* function being parsed */#define EF_BRKCONT_PASS	BIT(1)	/* set if E_LOOP must pass break/continue on */#define EF_FAKE_SIGDIE	BIT(2)	/* hack to get info from unwind to quitenv *//* Do breaks/continues stop at env type e? */#define STOP_BRKCONT(t)	((t) == E_NONE || (t) == E_PARSE \			 || (t) == E_FUNC || (t) == E_INCL)/* Do returns stop at env type e? */#define STOP_RETURN(t)	((t) == E_FUNC || (t) == E_INCL)/* values for ksh_siglongjmp(e->jbuf, 0) */#define LRETURN	1		/* return statement */#define	LEXIT	2		/* exit statement */#define LERROR	3		/* errorf() called */#define LLEAVE	4		/* untrappable exit/error */#define LINTR	5		/* ^C noticed */#define	LBREAK	6		/* break statement */#define	LCONTIN	7		/* continue statement */#define LSHELL	8		/* return to interactive shell() */#define LAEXPR	9		/* error in arithmetic expression *//* option processing */#define OF_CMDLINE	0x01	/* command line */#define OF_SET		0x02	/* set builtin */#define OF_SPECIAL	0x04	/* a special variable changing */#define OF_INTERNAL	0x08	/* set internally by shell */#define OF_ANY		(OF_CMDLINE | OF_SET | OF_SPECIAL | OF_INTERNAL)struct option {    const char	*name;	/* long name of option */    char	c;	/* character flag (if any) */    short	flags;	/* OF_* */};extern const struct option options[];/* * flags (the order of these enums MUST match the order in misc.c(options[])) */enum sh_flag {	FEXPORT = 0,	/* -a: export all */#ifdef BRACE_EXPAND	FBRACEEXPAND,	/* enable {} globbing */#endif	FBGNICE,	/* bgnice */	FCOMMAND,	/* -c: (invocation) execute specified command */#ifdef EMACS	FEMACS,		/* emacs command editing */#endif	FERREXIT,	/* -e: quit on error */#ifdef EMACS	FGMACS,		/* gmacs command editing */#endif	FIGNOREEOF,	/* eof does not exit */	FTALKING,	/* -i: interactive */	FKEYWORD,	/* -k: name=value anywere */	FLOGIN,		/* -l: a login shell */	FMARKDIRS,	/* mark dirs with / in file name completion */	FMONITOR,	/* -m: job control monitoring */	FNOCLOBBER,	/* -C: don't overwrite existing files */	FNOEXEC,	/* -n: don't execute any commands */	FNOGLOB,	/* -f: don't do file globbing */	FNOHUP,		/* -H: don't kill running jobs when login shell exits */	FNOTTALKING,	/* -I: don't be interactive */	FNOLOG,		/* don't save functions in history (ignored) */#ifdef	JOBS	FNOTIFY,	/* -b: asynchronous job completion notification */#endif	FNOUNSET,	/* -u: using an unset var is an error */	FPHYSICAL,	/* -o physical: don't do logical cd's/pwd's */	FPOSIX,		/* -o posix: be posixly correct */	FPRIVILEGED,	/* -p: use suid_profile */	FRESTRICTED,	/* -r: restricted shell */	FSTDIN,		/* -s: (invocation) parse stdin */	FTRACKALL,	/* -h: create tracked aliases for all commands */	FVERBOSE,	/* -v: echo input */#ifdef VI	FVI,		/* vi command editing */	FVIRAW,		/* always read in raw mode (ignored) */	FVISHOW8,	/* display chars with 8th bit set as is (versus M-) */	FVITABCOMPLETE,	/* enable tab as file name completion char */	FVIESCCOMPLETE,	/* enable ESC as file name completion in command mode */#endif	FXTRACE,	/* -x: execution trace */	FTALKING_I,	/* (internal): initial shell was interactive */	FNFLAGS /* (place holder: how many flags are there) */};#define Flag(f)	(shell_flags[(int) (f)])EXTERN	char shell_flags [FNFLAGS];EXTERN	char	null [] I__("");	/* null value for variable */EXTERN	char	space [] I__(" ");EXTERN	char	newline [] I__("\n");EXTERN	char	slash [] I__("/");enum temp_type {    TT_HEREDOC_EXP,	/* expanded heredoc */    TT_HIST_EDIT	/* temp file used for history editing (fc -e) */};typedef enum temp_type Temp_type;/* temp/heredoc files.  The file is removed when the struct is freed. */struct temp {	struct temp	*next;	struct shf	*shf;	int		pid;		/* pid of process parsed here-doc */	Temp_type	type;	char		*name;};/* * stdio and our IO routines */#define shl_spare	(&shf_iob[0])	/* for c_read()/c_print() */#define shl_stdout	(&shf_iob[1])#define shl_out		(&shf_iob[2])EXTERN int shl_stdout_ok;/* * trap handlers */typedef struct trap {	int	signal;		/* signal number */	const char *name;	/* short name */	const char *mess;	/* descriptive name */	char   *trap;		/* trap command */	int	volatile set;	/* trap pending */	int	flags;		/* TF_* */	handler_t cursig;	/* current handler (valid if TF_ORIG_* set) */	handler_t shtrap;	/* shell signal handler */} Trap;/* values for Trap.flags */#define TF_SHELL_USES	BIT(0)	/* shell uses signal, user can't change */#define TF_USER_SET	BIT(1)	/* user has (tried to) set trap */#define TF_ORIG_IGN	BIT(2)	/* original action was SIG_IGN */#define TF_ORIG_DFL	BIT(3)	/* original action was SIG_DFL */#define TF_EXEC_IGN	BIT(4)	/* restore SIG_IGN just before exec */#define TF_EXEC_DFL	BIT(5)	/* restore SIG_DFL just before exec */#define TF_DFL_INTR	BIT(6)	/* when received, default action is LINTR */#define TF_TTY_INTR	BIT(7)	/* tty generated signal (see j_waitj) */#define TF_CHANGED	BIT(8)	/* used by runtrap() to detect trap changes */#define TF_FATAL	BIT(9)	/* causes termination if not trapped *//* values for setsig()/setexecsig() flags argument */#define SS_RESTORE_MASK	0x3	/* how to restore a signal before an exec() */#define SS_RESTORE_CURR	0	/* leave current handler in place */#define SS_RESTORE_ORIG	1	/* restore original handler */#define SS_RESTORE_DFL	2	/* restore to SIG_DFL */#define SS_RESTORE_IGN	3	/* restore to SIG_IGN */#define SS_FORCE	BIT(3)	/* set signal even if original signal ignored */#define SS_USER		BIT(4)	/* user is doing the set (ie, trap command) */#define SS_SHTRAP	BIT(5)	/* trap for internal use (CHLD,ALRM,WINCH) */#define SIGEXIT_	0	/* for trap EXIT */#define SIGERR_		SIGNALS	/* for trap ERR */EXTERN	int volatile trap;	/* traps pending? */EXTERN	int volatile intrsig;	/* pending trap interrupts executing command */EXTERN	int volatile fatal_trap;/* received a fatal signal */#ifndef FROM_TRAP_C/* Kludge to avoid bogus re-declaration of sigtraps[] error on AIX 3.2.5 */extern	Trap	sigtraps[SIGNALS+1];#endif /* !FROM_TRAP_C */#ifdef KSH/* * TMOUT support *//* values for ksh_tmout_state */enum tmout_enum {		TMOUT_EXECUTING	= 0,	/* executing commands */		TMOUT_READING,		/* waiting for input */		TMOUT_LEAVING		/* have timed out */	};EXTERN unsigned int ksh_tmout;EXTERN enum tmout_enum ksh_tmout_state I__(TMOUT_EXECUTING);#endif /* KSH *//* For "You have stopped jobs" message */EXTERN int really_exit;/* * fast character classes */#define	C_ALPHA	 BIT(0)		/* a-z_A-Z */#define	C_DIGIT	 BIT(1)		/* 0-9 */#define	C_LEX1	 BIT(2)		/* \0 \t\n|&;<>() */#define	C_VAR1	 BIT(3)		/* *@#!$-? */#define	C_IFSWS	 BIT(4)		/* \t \n (IFS white space) */#define	C_SUBOP1 BIT(5)		/* "=-+?" */#define	C_SUBOP2 BIT(6)		/* "#%" */#define	C_IFS	 BIT(7)		/* $IFS */#define	C_QUOTE	 BIT(8)		/*  \n\t"#$&'()*;<>?[\`| (needing quoting) */extern	short ctypes [];#define	ctype(c, t)	!!(ctypes[(unsigned char)(c)]&(t))#define	letter(c)	ctype(c, C_ALPHA)#define	digit(c)	ctype(c, C_DIGIT)#define	letnum(c)	ctype(c, C_ALPHA|C_DIGIT)EXTERN int ifs0 I__(' ');	/* for "$*" *//* Argument parsing for built-in commands and getopts command *//* Values for Getopt.flags */#define GF_ERROR	BIT(0)	/* call errorf() if there is an error */#define GF_PLUSOPT	BIT(1)	/* allow +c as an option */#define GF_NONAME	BIT(2)	/* don't print argv[0] in errors *//* Values for Getopt.info */#define GI_MINUS	BIT(0)	/* an option started with -... */#define GI_PLUS		BIT(1)	/* an option started with +... */#define GI_MINUSMINUS	BIT(2)	/* arguments were ended with -- */typedef struct {	int		optind;	int		uoptind;/* what user sees in $OPTIND */	char		*optarg;	int		flags;	/* see GF_* */	int		info;	/* see GI_* */	unsigned int	p;	/* 0 or index into argv[optind - 1] */	char		buf[2];	/* for bad option OPTARG value */} Getopt;EXTERN Getopt builtin_opt;	/* for shell builtin commands */EXTERN Getopt user_opt;		/* parsing state for getopts builtin command */#ifdef KSH/* This for co-processes */typedef INT32 Coproc_id; /* something that won't (realisticly) wrap */struct coproc {	int	read;		/* pipe from co-process's stdout */	int	readw;		/* other side of read (saved temporarily) */	int	write;		/* pipe to co-process's stdin */	Coproc_id id;		/* id of current output pipe */	int	njobs;		/* number of live jobs using output pipe */	void    *job;           /* 0 or job of co-process using input pipe */};EXTERN struct coproc coproc;#endif /* KSH *//* Used in jobs.c and by coprocess stuff in exec.c */#ifdef JOB_SIGSEXTERN sigset_t		sm_default, sm_sigchld;#endif /* JOB_SIGS */extern const char ksh_version[];/* name of called builtin function (used by error functions) */EXTERN char	*builtin_argv0;EXTERN Tflag	builtin_flag;	/* flags of called builtin (SPEC_BI, etc.) *//* current working directory, and size of memory allocated for same */EXTERN char	*current_wd;EXTERN int	current_wd_size;#ifdef EDIT/* Minimium required space to work with on a line - if the prompt leaves less * space than this on a line, the prompt is truncated. */# define MIN_EDIT_SPACE	7/* Minimium allowed value for x_cols: 2 for prompt, 3 for " < " at end of line */# define MIN_COLS	(2 + MIN_EDIT_SPACE + 3)EXTERN	int	x_cols I__(80);	/* tty columns */#else# define x_cols 80		/* for pr_menu(exec.c) */#endif/* These to avoid bracket matching problems */#define OPAREN	'('#define CPAREN	')'#define OBRACK	'['#define CBRACK	']'#define OBRACE	'{'#define CBRACE	'}'/* Determine the location of the system (common) profile */#ifndef KSH_SYSTEM_PROFILE# ifdef __NeXT#  define KSH_SYSTEM_PROFILE "/etc/profile.std"# else /* __NeXT */#  define KSH_SYSTEM_PROFILE "/etc/profile"# endif /* __NeXT */#endif /* KSH_SYSTEM_PROFILE *//* Used by v_evaluate() and setstr() to control action when error occurs */#define KSH_UNWIND_ERROR	0	/* unwind the stack (longjmp) */#define KSH_RETURN_ERROR	1	/* return 1/0 for success/failure */#include "shf.h"#include "table.h"#include "tree.h"#include "expand.h"#include "lex.h"#include "proto.h"/* be sure not to interfere with anyone else's idea about EXTERN */#ifdef EXTERN_DEFINED# undef EXTERN_DEFINED# undef EXTERN#endif#undef I__

⌨️ 快捷键说明

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