home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume30 / rc / part05 / rc.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-30  |  8.8 KB  |  381 lines

  1. #include "config.h"
  2. #include "proto.h"
  3.  
  4. /* datatypes */
  5.  
  6. /* braindamaged IBM header files #define true and false */
  7. #undef FALSE
  8. #undef TRUE
  9.  
  10. #include <stdarg.h>
  11.  
  12. typedef void builtin_t(char **);
  13. typedef struct Block Block;
  14. typedef struct Dup Dup;
  15. typedef struct Estack Estack;
  16. typedef struct Function Function;
  17. typedef struct Hq Hq;
  18. typedef struct Htab Htab;
  19. typedef struct Jbwrap Jbwrap;
  20. typedef struct List List;
  21. typedef struct Node Node;
  22. typedef struct Pipe Pipe;
  23. typedef struct Redir Redir;
  24. typedef struct Rq Rq;
  25. typedef struct Variable Variable;
  26. typedef struct Word Word;
  27. typedef struct Format Format;
  28. typedef union Edata Edata;
  29.  
  30. typedef enum nodetype {
  31.     nAndalso, nAssign, nBackq, nBang, nBody, nCbody, nNowait, nBrace, nConcat,
  32.     nCount, nElse, nFlat, nDup, nEpilog, nNewfn, nForin, nIf, nQword,
  33.     nOrelse, nPipe, nPre, nRedir, nRmfn, nArgs, nSubshell, nCase,
  34.     nSwitch, nMatch, nVar, nVarsub, nWhile, nWord, nLappend, nNmpipe
  35. } nodetype;
  36.  
  37. typedef enum ecodes {
  38.     eError, eBreak, eReturn, eVarstack, eArena, eFifo, eFd
  39. } ecodes;
  40.  
  41. typedef enum bool {
  42.     FALSE, TRUE
  43. } bool;
  44.  
  45. typedef enum inputtype {
  46.     iFd, iString
  47. } inputtype;
  48.  
  49. typedef enum redirtype {
  50.     rFrom, rCreate, rAppend, rHeredoc, rHerestring
  51. } redirtype;
  52.  
  53. typedef bool (*Conv)(Format *, int);
  54.  
  55. union Edata {
  56.     Jbwrap *jb;
  57.     Block *b;
  58.     char *name;
  59.     int fd;
  60. };
  61.  
  62. struct Estack {
  63.     ecodes e;
  64.     bool interactive;
  65.     Edata data;
  66.     Estack *prev;
  67. };
  68.  
  69. struct List {
  70.     char *w, *m;
  71.     List *n;
  72. };
  73.  
  74. struct Node {
  75.     nodetype type;
  76.     union {
  77.         char *s;
  78.         int i;
  79.         Node *p;
  80.     } u[4];
  81. };
  82.  
  83. struct Pipe {
  84.     int left, right;
  85. };
  86.  
  87. struct Dup {
  88.     redirtype type;
  89.     int left, right;
  90. };
  91.  
  92. struct Redir {
  93.     redirtype type;
  94.     int fd;
  95. };
  96.  
  97. struct Word {
  98.     char *w, *m;
  99. };
  100.  
  101. struct Rq {
  102.     Node *r;
  103.     struct Rq *n;
  104. };
  105.  
  106. struct Function {
  107.     Node *def;
  108.     char *extdef;
  109. };
  110.  
  111. struct Variable {
  112.     List *def;
  113.     char *extdef;
  114.     Variable *n;
  115. };
  116.  
  117. struct Htab {
  118.     char *name;
  119.     void *p;
  120. };
  121.  
  122. struct Format {
  123.     /* for the formatting routines */
  124.     va_list args;
  125.     long flags, f1, f2;
  126.     /* for the buffer maintainence routines */
  127.     char *buf, *bufbegin, *bufend;
  128.     int flushed;
  129.     void (*grow)(Format *, SIZE_T);
  130.     union { int n; void *p; } u;
  131. };
  132.  
  133. /* Format->flags values */
  134. enum {
  135.     FMT_long    = 1,        /* %l */
  136.     FMT_short    = 2,        /* %h */
  137.     FMT_unsigned    = 4,        /* %u */
  138.     FMT_zeropad    = 8,        /* %0 */
  139.     FMT_leftside    = 16,        /* %- */
  140.     FMT_altform    = 32,        /* %# */
  141.     FMT_f1set    = 64,        /* %<n> */
  142.     FMT_f2set    = 128        /* %.<n> */
  143. };
  144.  
  145. /* macros */
  146. #define EOF (-1)
  147. #ifndef NULL
  148. #define NULL 0
  149. #endif
  150. #define a2u(x) n2u(x, 10)
  151. #define o2u(x) n2u(x, 8)
  152. #define arraysize(a) ((int)(sizeof(a)/sizeof(*a)))
  153. #define enew(x) ((x *) ealloc(sizeof(x)))
  154. #define ecpy(x) strcpy((char *) ealloc(strlen(x) + 1), x)
  155. #define lookup_fn(s) ((Function *) lookup(s, fp))
  156. #define lookup_var(s) ((Variable *) lookup(s, vp))
  157. #define nnew(x) ((x *) nalloc(sizeof(x)))
  158. #define ncpy(x) (strcpy((char *) nalloc(strlen(x) + 1), x))
  159. #ifndef offsetof
  160. #define offsetof(t, m) ((SIZE_T) (((char *) &((t *) 0)->m) - (char *)0))
  161. #endif
  162. #define streq(x, y) (*(x) == *(y) && strcmp(x, y) == 0)
  163. #define conststrlen(x) (sizeof (x) - 1)
  164.  
  165. /* rc prototypes */
  166.  
  167. /* main.c */
  168. extern char *prompt, *prompt2;
  169. extern Rq *redirq;
  170. extern bool dashdee, dashee, dashvee, dashex, dashell,
  171.     dasheye, dashen, dashpee, interactive;
  172. extern int rc_pid;
  173. extern int lineno;
  174.  
  175. /* builtins.c */
  176. extern builtin_t *isbuiltin(char *);
  177. extern void b_exec(char **), funcall(char **), b_dot(char **), b_builtin(char **);
  178. extern char *which(char *, bool);
  179.  
  180. /* except.c */
  181. extern bool nl_on_intr;
  182. extern bool outstanding_cmdarg(void);
  183. extern void pop_cmdarg(bool);
  184. extern void rc_raise(ecodes);
  185. extern void except(ecodes, Edata, Estack *);
  186. extern void unexcept(void);
  187. extern void rc_error(char *);
  188. extern void sigint(int);
  189.  
  190. /* exec.c */
  191. extern void exec(List *, bool);
  192. extern void doredirs(void);
  193.  
  194. /* footobar.c */
  195. extern char *fun2str(char *, Node *);
  196. extern char *list2str(char *, List *);
  197. extern char **list2array(List *, bool);
  198. extern char *get_name(char *);
  199. extern List *parse_var(char *, char *);
  200. extern Node *parse_fn(char *, char *);
  201. extern void initprint(void);
  202. extern void rc_exit(int); /* here for odd reasons; user-defined signal handlers are kept in fn.c */
  203.  
  204. /* getopt.c */
  205. extern int rc_getopt(int, char **, char *);
  206.  
  207. extern int rc_optind, rc_opterr, rc_optopt;
  208. extern char *rc_optarg;
  209.  
  210. /* glob.c */
  211. extern bool lmatch(List *, List *);
  212. extern List *glob(List *);
  213.  
  214. /* glom.c */
  215. extern void assign(List *, List *, bool);
  216. extern void qredir(Node *);
  217. extern List *append(List *, List*);
  218. extern List *flatten(List *);
  219. extern List *glom(Node *);
  220. extern List *concat(List *, List *);
  221. extern List *varsub(List *, List *);
  222. extern List *word(char *, char *);
  223.  
  224. /* hash.c */
  225. extern Htab *fp, *vp;
  226. extern void *lookup(char *, Htab *);
  227. extern Function *get_fn_place(char *);
  228. extern List *varlookup(char *);
  229. extern Node *fnlookup(char *);
  230. extern Variable *get_var_place(char *, bool);
  231. extern bool varassign_string(char *);
  232. extern char **makeenv(void);
  233. extern char *fnlookup_string(char *);
  234. extern char *varlookup_string(char *);
  235. extern void alias(char *, List *, bool);
  236. extern void starassign(char *, char **, bool);
  237. extern void delete_fn(char *);
  238. extern void delete_var(char *, bool);
  239. extern void fnassign(char *, Node *);
  240. extern void fnassign_string(char *);
  241. extern void fnrm(char *);
  242. extern void initenv(char **);
  243. extern void inithash(void);
  244. extern void setsigdefaults(bool);
  245. extern void inithandler(void);
  246. extern void varassign(char *, List *, bool);
  247. extern void varrm(char *, bool);
  248. extern void whatare_all_vars(void);
  249. extern void whatare_all_signals(void);
  250. extern void prettyprint_var(int, char *, List *);
  251. extern void prettyprint_fn(int, char *, Node *);
  252.  
  253. /* heredoc.c */
  254. extern int heredoc(int);
  255. extern int qdoc(Node *, Node *);
  256. extern Hq *hq;
  257.  
  258. /* input.c */
  259. extern void initinput(void);
  260. extern Node *parseline(char *);
  261. extern int gchar(void);
  262. extern void ugchar(int);
  263. extern Node *doit(bool);
  264. extern void flushu(void);
  265. extern void pushfd(int);
  266. extern void pushstring(char **, bool);
  267. extern void popinput(void);
  268. extern void closefds(void);
  269. extern int last;
  270. extern bool rcrc;
  271.  
  272. /* lex.c */
  273. extern int yylex(void);
  274. extern void inityy(void);
  275. extern void yyerror(const char *);
  276. extern void scanerror(char *);
  277. extern void print_prompt2(void);
  278. extern const char nw[], dnw[];
  279.  
  280. /* list.c */
  281. extern void listfree(List *);
  282. extern List *listcpy(List *, void *(*)(SIZE_T));
  283. extern SIZE_T listlen(List *);
  284. extern int listnel(List *);
  285.  
  286. /* match.c */
  287. extern bool match(char *, char *, char *);
  288.  
  289. /* alloc.c */
  290. extern void *ealloc(SIZE_T);
  291. extern void *erealloc(void *, SIZE_T);
  292. extern void efree(void *);
  293. extern Block *newblock(void);
  294. extern void *nalloc(SIZE_T);
  295. extern void nfree(void);
  296. extern void restoreblock(Block *);
  297.  
  298. /* open.c */
  299. extern int rc_open(const char *, redirtype);
  300.  
  301. /* print.c */
  302. /*
  303.    The following prototype should be:
  304. extern Conv fmtinstall(int, Conv);
  305.    but this freaks out SGI's compiler under IRIX3.3.2
  306. */
  307. extern bool (*fmtinstall(int, bool (*)(Format *, int)))(Format *, int);
  308. extern int printfmt(Format *, const char *);
  309. extern int fmtprint(Format *, const char *,...);
  310. extern void fmtappend(Format *, const char *, SIZE_T);
  311. extern void fmtcat(Format *, const char *);
  312. extern int fprint(int fd, const char *fmt,...);
  313. extern char *mprint(const char *fmt,...);
  314. extern char *nprint(const char *fmt,...);
  315. /*
  316.    the following macro should by rights be coded as an expression, not
  317.    a statement, but certain compilers (notably DEC) have trouble with
  318.    void expressions inside the ?: operator. (sheesh, give me a break!)
  319. */
  320. #define    fmtputc(f, c) {\
  321.     if ((f)->buf >= (f)->bufend)\
  322.         (*(f)->grow)((f), (SIZE_T)1);\
  323.     *(f)->buf++ = (c);\
  324. }
  325.  
  326. /* y.tab.c (parse.y) */
  327. extern Node *parsetree;
  328. extern int yyparse(void);
  329. extern void initparse(void);
  330.  
  331. /* redir.c */
  332. extern void doredirs(void);
  333.  
  334. /* signal.c */
  335. extern void initsignal(void);
  336. extern void catcher(int);
  337. extern void sigchk(void);
  338. extern void (*rc_signal(int, void (*)(int)))(int);
  339. extern void (*sighandlers[])(int);
  340. extern volatile SIG_ATOMIC_T slow, interrupt_happened;
  341. #define SIGCHK sigchk()
  342.  
  343. /* status.c */
  344. extern int istrue(void);
  345. extern int getstatus(void);
  346. extern void set(bool);
  347. extern void setstatus(int, int);
  348. extern List *sgetstatus(void);
  349. extern void setpipestatus(int [], int);
  350. extern void statprint(int, int);
  351. extern void ssetstatus(char **);
  352.  
  353. /* tree.c */
  354. extern Node *mk(int /*nodetype*/,...);
  355. extern Node *treecpy(Node *, void *(*)(SIZE_T));
  356. extern void treefree(Node *);
  357.  
  358. /* utils.c */
  359. extern bool isabsolute(char *);
  360. extern int n2u(char *, unsigned int);
  361. extern int rc_read(int, char *, SIZE_T);
  362. extern int mvfd(int, int);
  363. extern int starstrcmp(const void *, const void *);
  364. extern void pr_error(char *);
  365. extern char *clear(char *, SIZE_T);
  366. extern void panic(char *);
  367. extern void uerror(char *);
  368. extern void writeall(int, char *, SIZE_T);
  369.  
  370. /* wait.c */
  371. extern int rc_fork(void);
  372. extern int rc_wait4(int, int *, bool);
  373. extern List *sgetapids(void);
  374. extern void waitforall(void);
  375. extern bool forked;
  376.  
  377. /* walk.c */
  378. extern bool walk(Node *, bool);
  379. extern bool cond;
  380.  
  381.