#define DEFAULTPATH "", "/bin", "/usr/bin"
typedef void builtin_t(char **);
typedef struct Block Block
;
typedef struct Estack Estack
;
typedef struct Function Function
;
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 Variable Variable
;
typedef struct Word Word
;
typedef struct Format Format
;
typedef union Edata Edata
;
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
eError
, eBreak
, eReturn
, eVarstack
, eArena
, eFifo
, eFd
rFrom
, rCreate
, rAppend
, rHeredoc
, rHerestring
typedef bool (*Conv
)(Format
*, int);
/* for the formatting routines */
/* for the buffer maintainence routines */
char *buf
, *bufbegin
, *bufend
;
void (*grow
)(Format
*, size_t);
union { int n
; void *p
; } u
;
/* Format->flags values */
FMT_unsigned
= 4, /* %u */
FMT_zeropad
= 8, /* %0 */
FMT_leftside
= 16, /* %- */
FMT_altform
= 32, /* %# */
FMT_f1set
= 64, /* %<n> */
FMT_f2set
= 128 /* %.<n> */
#define a2u(x) n2u(x, 10)
#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))
#define offsetof(t, m) ((size_t) (((char *) &((t *) 0)->m) - (char *)0))
#define streq(x, y) (*(x) == *(y) && strcmp(x, y) == 0)
#define conststrlen(x) (sizeof (x) - 1)
extern char *prompt
, *prompt2
;
extern bool dashdee
, dashee
, dashvee
, dashex
, dashell
,
dasheye
, dashen
, dashpee
, interactive
;
extern builtin_t
*isbuiltin(char *);
extern void b_exec(char **), funcall(char **), b_dot(char **), b_builtin(char **);
extern char *which(char *, bool);
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 exec(List
*, bool);
extern void doredirs(void);
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 */
extern int rc_getopt(int, char **, char *);
extern int rc_optind
, rc_opterr
, rc_optopt
;
extern bool lmatch(List
*, List
*);
extern List
*glob(List
*);
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 *);
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
*);
extern int qdoc(Node
*, Node
*);
extern void initinput(void);
extern Node
*parseline(char *);
extern void flushu(void);
extern void pushstring(char **, bool);
extern void popinput(void);
extern void closefds(void);
extern void inityy(void);
extern void yyerror(const char *);
extern void scanerror(char *);
extern void print_prompt2(void);
extern const char nw
[], dnw
[];
extern void listfree(List
*);
extern List
*listcpy(List
*, void *(*)(size_t));
extern size_t listlen(List
*);
extern int listnel(List
*);
extern bool match(char *, char *, char *);
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 restoreblock(Block
*);
extern int rc_open(const char *, redirtype
);
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!)
if ((f)->buf >= (f)->bufend)\
(*(f)->grow)((f), (size_t)1);\
extern int yyparse(void);
extern void initparse(void);
extern void doredirs(void);
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
;
extern int getstatus(void);
extern void setstatus(int, int);
extern List
*sgetstatus(void);
extern void setpipestatus(int [], int);
extern void statprint(int, int);
extern void ssetstatus(char **);
extern Node
*mk(int /*nodetype*/,...);
extern Node
*treecpy(Node
*, void *(*)(size_t));
extern void treefree(Node
*);
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);
extern int rc_fork(void);
extern int rc_wait4(int, int *, bool);
extern List
*sgetapids(void);
extern void waitforall(void);
extern bool walk(Node
*, bool);