home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / awk / awk320sr.zip / AWK.H < prev    next >
C/C++ Source or Header  |  1991-05-22  |  9KB  |  434 lines

  1. /*
  2.  * global definitions for AWK
  3.  *
  4.  * Copyright (C) 1988, 1989, 1990, 1991 by Rob Duff
  5.  * All rights reserved
  6.  *
  7.  * Distribution of this program is permitted provided that
  8.  * it is not done for direct commercial gain.
  9.  */
  10.  
  11. #include <stdio.h>
  12.  
  13. #define FLOATER
  14.  
  15. typedef char far *FSTR;
  16.  
  17. /*
  18.  * Array sizes
  19.  */
  20. #define MAXFILE 12
  21. #define MAXNAME 100
  22. #define MAXCODE 2002
  23. #define MAXLINE 2002
  24. #define MAXLEVEL 100
  25. #define MAXFIELD 101
  26. #define MAXLABEL 256
  27. #define MAXSTACK 500
  28.  
  29. /*
  30.  * Regular Expression opcodes
  31.  */
  32. #define R_END     0
  33. #define R_BOL     1
  34. #define R_EOL     2
  35. #define R_ANY     3
  36. #define R_BAR     4
  37. #define R_CHAR    5
  38. #define R_STAR    6
  39. #define R_PLUS    7
  40. #define R_QUEST   8
  41. #define R_CLASS   9
  42. #define R_NCLAS  10
  43. #define R_RANGE  11
  44.  
  45. /*
  46.  * Pseudo machine opcodes
  47.  */
  48. #define C_END     0
  49. #define C_EQ      1
  50. #define C_NE      2
  51. #define C_LT      3
  52. #define C_GT      4
  53. #define C_LE      5
  54. #define C_GE      6
  55. #define C_MUL     7
  56. #define C_DIV     8
  57. #define C_MOD     9
  58. #define C_ADD    10
  59. #define C_SUB    11
  60. #define C_NEG    12
  61. #define C_NOT    13
  62. #define C_NUM    14
  63. #define C__PRE   15
  64. #define C_PRE    16
  65. #define C__POST  17       
  66. #define C_POST   18       
  67. #define C_IS     19
  68. #define C_IN     20
  69. #define C_MAT    21
  70. #define C_CAT    22
  71. #define C_RAND   23
  72. #define C_SYS    24
  73. #define C_LEN    25
  74. #define C_COS    26
  75. #define C_EXP    27
  76. #define C_INT    28
  77. #define C_LOG    29
  78. #define C_SIN    30
  79. #define C_SQRT   31
  80. #define C_ATAN2  32
  81. #define C_POW    33
  82. #define C_DOLAR  34
  83. #define C_FIELD  35
  84. #define C_PLUCK  36
  85. #define C_ADDR   37
  86. #define C_FETCH  38
  87. #define C_AUTO   39
  88. #define C_BUILT  40
  89. #define C_SELECT 41
  90. #define C_LOAD   42
  91. #define C__STORE 43
  92. #define C_STORE  44
  93. #define C__COPY  45
  94. #define C_COPY   46
  95. #define C_DUP    47
  96. #define C_SWAP   48
  97. #define C_UNDER  49
  98. #define C_DROP   50
  99. #define C_CALL   51
  100. #define C_USER   52
  101. #define C_RETURN 53
  102. #define C_JUMP   54
  103. #define C_FJMP   55
  104. #define C_TJMP   56
  105. #define C_AJMP   57
  106. #define C_OJMP   58
  107. #define C_IJMP   59
  108. #define C_CCON   60
  109. #define C_ICON   61
  110. #define C_LCON   62
  111. #define C_DCON   63
  112. #define C_SCON   64
  113. #define C_RCON   65
  114. #define C_FCON   66
  115. #define C_LINE   67
  116. #define C_UPR    68
  117. #define C_LWR    69
  118. /*                 
  119.  * Standard procedures
  120.  */
  121. #define P_NEXT    1
  122. #define P_EXIT    2
  123. #define P_PRINT   3
  124. #define P_PRINTF  4
  125. #define P_GETLINE 5
  126. #define P_SRAND   6
  127. #define P_GSUB    7
  128. #define P_LSUB    8
  129. #define P_JOIN    9
  130. #define P_SPLIT   10
  131. #define P_DELETE  11
  132. #define P_INDEX   12
  133. #define P_MATCH   13
  134. #define P_SUBSTR  14
  135. #define P_SPRINTF 15
  136. #define P_OPEN    16
  137. #define P_CREATE  17
  138. #define P_APPEND  18
  139. #define P_CLOSE   19
  140.  
  141. /*
  142.  * Storage classes
  143.  */
  144. #define ACTUAL  0
  145. #define FORMAL  1
  146.  
  147. /*
  148.  * Storage types
  149.  */
  150. #define S_SHORT    0
  151. #define S_LONG     1
  152. #define S_DOUBLE   2
  153. #define S_NUMBER   3
  154. #define S_STRING   4
  155. #define S_REGEXP   5
  156. #define S_ARRAY    6
  157. #define S_STACK    7
  158. #define S_FILES    8
  159. #define S_FIELD    9
  160. #define S_SIMPLE  10
  161. #define S_BUILT   11
  162.  
  163. /*
  164.  * string types
  165.  */
  166.  #define ZSTR '\200'    /* not allocated */
  167.  #define ESTR '\375'    /* final use count */
  168.  #define TSTR '\376'    /* temporary */
  169.  #define LSTR '\377'    /* literal */
  170.  
  171. /*
  172.  * special label tags
  173.  */
  174. #define L_NORMAL   0
  175. #define L_CONTINUE 1
  176. #define L_BREAK    2
  177. #define L_DONE     3
  178. #define L_MARK     4
  179. #define L_FOR      5
  180. #define L_ELSE     6
  181. #define L_WHILE    7
  182.  
  183. /*
  184.  * Value
  185.  */
  186. typedef union DATUM {
  187.     short       ival;
  188.     long        lval;
  189.     double      dval;
  190.     char        *cptr;
  191.     struct FYLE *fptr;
  192.     struct ITEM *sptr;
  193.     struct ELEMENT *aptr;
  194. } DATUM;
  195.  
  196. /*
  197.  * Value Stack
  198.  */
  199. typedef struct ITEM {
  200.     int         sclass;
  201.     int         stype;
  202.     FSTR        sstr;
  203.     DATUM       svalue;
  204. } ITEM;
  205.  
  206. /*
  207.  * Array Value
  208.  */
  209. typedef struct ELEMENT {
  210.     int         aclass;
  211.     int         atype;
  212.     FSTR        astr;
  213.     DATUM       avalue;
  214.     FSTR        aindex;
  215.     struct ELEMENT *anext;
  216. } ELEMENT;
  217.  
  218. /*
  219.  * Symbol Table
  220.  */
  221. typedef struct IDENT {
  222.     void        *vitem;
  223.     char        *vname;
  224.     struct FUNC *vfunc;
  225.     struct IDENT *vnext;
  226. } IDENT;
  227.  
  228. /*
  229.  * parameter list
  230.  */
  231. typedef struct LIST {
  232.     IDENT       *litem;
  233.     struct LIST *lnext;
  234. } LIST;
  235.  
  236. /*
  237.  * Label storage
  238.  */
  239. typedef struct {
  240.     short       label;
  241.     short       where;
  242. } LABLE;
  243.  
  244. /*
  245.  *
  246.  */
  247. typedef struct FUNC {
  248.     int         psize;
  249.     char        *pcode;
  250.     LIST        *plist;
  251. } FUNC;
  252.  
  253. /*
  254.  * code list link
  255.  */
  256. typedef struct LINK {
  257.     char        *ccode;
  258.     struct LINK *cnext;
  259. } LINK;
  260. /*
  261.  * File structure
  262.  */
  263. typedef struct FYLE {
  264.     FSTR        fname;
  265.     char        *fmode;
  266.     FILE        *ffyle;
  267. } FYLE;
  268.  
  269. /*
  270.  * Rules structure
  271.  */
  272. typedef struct RULE {
  273.     char         *start;
  274.     char         *stop;
  275.     char         seen;
  276.     char         flag;
  277.     char         *action;
  278.     struct RULE  *next;
  279. } RULE;
  280.  
  281. /*
  282.  * AWK input file name list
  283.  */
  284. typedef struct NAME {
  285.     char    *name;
  286.     struct NAME *next;
  287. } NAME;
  288.  
  289. /*
  290.  * code fetch trick
  291.  */
  292. typedef union {
  293.     short       ival;
  294.     long        lval;
  295.     double      dval;
  296.     FSTR        fstr;
  297.     unsigned int uval;
  298.     unsigned char cval;
  299.     void        *vptr;
  300.     char        *sptr;
  301.     void        *fptr;
  302.     char        sval[8];
  303. } TRIX;
  304.  
  305. /*
  306.  * Global variables
  307.  */
  308.  
  309. extern short awkline;
  310. extern NAME *awklist;
  311. extern char *awkstdin;
  312.  
  313. extern ITEM *nextvar;
  314. extern ITEM vartab[MAXNAME];
  315. extern ITEM fieldtab[MAXFIELD];
  316. extern ITEM stackbot[MAXSTACK];
  317. extern ITEM *stackptr, *stacktop;
  318. extern FYLE *nextfile;
  319. extern FYLE files[MAXFILE];
  320. extern RULE *rules, *rulep;
  321.  
  322. extern LINK *beginact;
  323. extern LINK *beginend;
  324. extern LINK *endact;
  325. extern LINK *endend;
  326.  
  327. extern char fmtstr[66];
  328. extern char ofmtstr[66];
  329. extern char code[MAXCODE];
  330. extern char buffer[MAXCODE];
  331. extern char linebuf[MAXLINE];
  332.  
  333. extern FSTR awkfs;
  334. extern FSTR nullstr;
  335. extern FSTR lineptr;
  336. extern FSTR blankfs;
  337. extern FSTR fieldbuf;
  338.  
  339. extern short aline;
  340. extern short builtin;
  341. extern short modfield;
  342. extern short modrecord;
  343. extern short status, awkeof, rlength, rstart, rcount;
  344.  
  345. extern int yyline;
  346. extern char *yyname;
  347. extern char *awkfre, *blankre;
  348.  
  349.  
  350. extern IDENT *ident;
  351. extern LABLE labels[MAXLABEL];
  352.  
  353. extern ITEM *fn, *nf, *nr, *fs, *rs;
  354. extern ITEM *nul, *ofs, *ors, *ofmt;
  355. extern ITEM *ac, *av, *fnr, *rl, *rst, *subsep;
  356.  
  357. extern FILE *awkfile;
  358. /*
  359.  * Global procedures
  360.  */
  361.  
  362. extern void parse(void);
  363. extern void unparse(void);
  364. extern void deparse(void);
  365. extern void free_item(ITEM*);
  366. extern void error(char*, ...);
  367. extern void clear_array(ITEM*);
  368. extern void match(FSTR, char*);
  369. extern void index(ITEM*, ITEM*, ITEM*);
  370.  
  371. extern ELEMENT *add_element(ELEMENT*, ITEM*);
  372.  
  373. extern FSTR getstr(FSTR);
  374. extern FSTR newstr(FSTR);
  375. extern FSTR uprstr(FSTR);
  376. extern FSTR lwrstr(FSTR);
  377. extern FSTR catstr(FSTR, FSTR);
  378. extern void *allawk(unsigned);
  379.  
  380. extern FSTR matchp(FSTR, FSTR, char*);
  381. extern char *subst(int, FSTR, FSTR, char*);
  382.  
  383. extern char *print_re(char*);
  384. extern char *print_op(char*, char*);
  385.  
  386. extern void print_item(ITEM*);
  387. extern void print_value(ITEM*);
  388. extern void print_one(char*, ITEM*);
  389. extern void print_code(char *);
  390. extern void print_two(char*, ITEM*, ITEM*);
  391. extern void print_element(char*, ELEMENT*);
  392. extern void print_label(char *str, int label);
  393.  
  394. extern FYLE *tofyle(ITEM*);
  395. extern FYLE *getfile(ITEM*, int);
  396.  
  397. extern long tolong(ITEM*);
  398. extern int tointeger(ITEM*);
  399. extern char *toregexp(ITEM*);
  400. extern FSTR tostring(ITEM*);
  401. extern FSTR onestring(ITEM*);
  402. extern double todouble(ITEM*);
  403. extern ITEM *tovariable(ITEM*, int);
  404.  
  405. extern IDENT *lookup(char*);
  406. extern IDENT *lookfor(ITEM*);
  407.  
  408. extern int isnumber(FSTR);
  409. extern FSTR isname(FSTR);
  410.  
  411. extern void setfs(void);
  412. extern void setfile(FSTR);
  413. extern void setargv(int, char*, char**);
  414.  
  415. extern int awkexec(char *);
  416. extern void awkclose(void);
  417. extern char *awkfind(char*, char*, int);
  418.  
  419. extern void getargs(NAME*);
  420. extern char *getargv(void);
  421. extern int getrecord(void);
  422. extern int getline(FYLE*, ITEM*);
  423.  
  424. extern void dfunc1(int, ITEM*, ITEM*);
  425. extern void dfunc2(int, ITEM*, ITEM*, ITEM*);
  426. extern void compare(int, ITEM*, ITEM*, ITEM*);
  427. extern void arithmetic(int, ITEM*, ITEM*, ITEM*);
  428.  
  429. extern char *regexp(int);
  430.  
  431. extern int yyparse(void);
  432. extern void yyinit(void);
  433.  
  434.