awk.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /*
  2. Copyright (c) Lucent Technologies 1997
  3. All Rights Reserved
  4. */
  5. typedef double Awkfloat;
  6. /* unsigned char is more trouble than it's worth */
  7. typedef unsigned char uschar;
  8. #define xfree(a) { if ((a) != NULL) { free((char *) a); a = NULL; } }
  9. #define DEBUG
  10. #ifdef DEBUG
  11. /* uses have to be doubly parenthesized */
  12. # define dprintf(x) if (dbg) printf x
  13. #else
  14. # define dprintf(x)
  15. #endif
  16. extern char errbuf[];
  17. extern int compile_time; /* 1 if compiling, 0 if running */
  18. extern int safe; /* 0 => unsafe, 1 => safe */
  19. #define RECSIZE (8 * 1024) /* sets limit on records, fields, etc., etc. */
  20. extern int recsize; /* size of current record, orig RECSIZE */
  21. extern char **FS;
  22. extern char **RS;
  23. extern char **ORS;
  24. extern char **OFS;
  25. extern char **OFMT;
  26. extern Awkfloat *NR;
  27. extern Awkfloat *FNR;
  28. extern Awkfloat *NF;
  29. extern char **FILENAME;
  30. extern char **SUBSEP;
  31. extern Awkfloat *RSTART;
  32. extern Awkfloat *RLENGTH;
  33. extern char *record; /* points to $0 */
  34. extern int lineno; /* line number in awk program */
  35. extern int errorflag; /* 1 if error has occurred */
  36. extern int donefld; /* 1 if record broken into fields */
  37. extern int donerec; /* 1 if record is valid (no fld has changed */
  38. extern char inputFS[]; /* FS at time of input, for field splitting */
  39. extern int dbg;
  40. extern char *patbeg; /* beginning of pattern matched */
  41. extern int patlen; /* length of pattern matched. set in b.c */
  42. /* Cell: all information about a variable or constant */
  43. typedef struct Cell {
  44. uschar ctype; /* OCELL, OBOOL, OJUMP, etc. */
  45. uschar csub; /* CCON, CTEMP, CFLD, etc. */
  46. char *nval; /* name, for variables only */
  47. char *sval; /* string value */
  48. Awkfloat fval; /* value as number */
  49. int tval; /* type info: STR|NUM|ARR|FCN|FLD|CON|DONTFREE */
  50. struct Cell *cnext; /* ptr to next if chained */
  51. } Cell;
  52. typedef struct Array { /* symbol table array */
  53. int nelem; /* elements in table right now */
  54. int size; /* size of tab */
  55. Cell **tab; /* hash table pointers */
  56. } Array;
  57. #define NSYMTAB 50 /* initial size of a symbol table */
  58. extern Array *symtab;
  59. extern Cell *nrloc; /* NR */
  60. extern Cell *fnrloc; /* FNR */
  61. extern Cell *nfloc; /* NF */
  62. extern Cell *rstartloc; /* RSTART */
  63. extern Cell *rlengthloc; /* RLENGTH */
  64. /* Cell.tval values: */
  65. #define NUM 01 /* number value is valid */
  66. #define STR 02 /* string value is valid */
  67. #define DONTFREE 04 /* string space is not freeable */
  68. #define CON 010 /* this is a constant */
  69. #define ARR 020 /* this is an array */
  70. #define FCN 040 /* this is a function name */
  71. #define FLD 0100 /* this is a field $1, $2, ... */
  72. #define REC 0200 /* this is $0 */
  73. /* function types */
  74. #define FLENGTH 1
  75. #define FSQRT 2
  76. #define FEXP 3
  77. #define FLOG 4
  78. #define FINT 5
  79. #define FSYSTEM 6
  80. #define FRAND 7
  81. #define FSRAND 8
  82. #define FSIN 9
  83. #define FCOS 10
  84. #define FATAN 11
  85. #define FTOUPPER 12
  86. #define FTOLOWER 13
  87. #define FFLUSH 14
  88. #define FUTF 15
  89. /* Node: parse tree is made of nodes, with Cell's at bottom */
  90. typedef struct Node {
  91. int ntype;
  92. struct Node *nnext;
  93. int lineno;
  94. int nobj;
  95. struct Node *narg[1]; /* variable: actual size set by calling malloc */
  96. } Node;
  97. #define NIL ((Node *) 0)
  98. extern Node *winner;
  99. extern Node *nullstat;
  100. extern Node *nullnode;
  101. /* ctypes */
  102. #define OCELL 1
  103. #define OBOOL 2
  104. #define OJUMP 3
  105. /* Cell subtypes: csub */
  106. #define CFREE 7
  107. #define CCOPY 6
  108. #define CCON 5
  109. #define CTEMP 4
  110. #define CNAME 3
  111. #define CVAR 2
  112. #define CFLD 1
  113. #define CUNK 0
  114. /* bool subtypes */
  115. #define BTRUE 11
  116. #define BFALSE 12
  117. /* jump subtypes */
  118. #define JEXIT 21
  119. #define JNEXT 22
  120. #define JBREAK 23
  121. #define JCONT 24
  122. #define JRET 25
  123. #define JNEXTFILE 26
  124. /* node types */
  125. #define NVALUE 1
  126. #define NSTAT 2
  127. #define NEXPR 3
  128. extern int pairstack[], paircnt;
  129. #define notlegal(n) (n <= FIRSTTOKEN || n >= LASTTOKEN || proctab[n-FIRSTTOKEN] == nullproc)
  130. #define isvalue(n) ((n)->ntype == NVALUE)
  131. #define isexpr(n) ((n)->ntype == NEXPR)
  132. #define isjump(n) ((n)->ctype == OJUMP)
  133. #define isexit(n) ((n)->csub == JEXIT)
  134. #define isbreak(n) ((n)->csub == JBREAK)
  135. #define iscont(n) ((n)->csub == JCONT)
  136. #define isnext(n) ((n)->csub == JNEXT)
  137. #define isnextfile(n) ((n)->csub == JNEXTFILE)
  138. #define isret(n) ((n)->csub == JRET)
  139. #define isrec(n) ((n)->tval & REC)
  140. #define isfld(n) ((n)->tval & FLD)
  141. #define isstr(n) ((n)->tval & STR)
  142. #define isnum(n) ((n)->tval & NUM)
  143. #define isarr(n) ((n)->tval & ARR)
  144. #define isfcn(n) ((n)->tval & FCN)
  145. #define istrue(n) ((n)->csub == BTRUE)
  146. #define istemp(n) ((n)->csub == CTEMP)
  147. #define isargument(n) ((n)->nobj == ARG)
  148. /* #define freeable(p) (!((p)->tval & DONTFREE)) */
  149. #define freeable(p) ( ((p)->tval & (STR|DONTFREE)) == STR )
  150. #include "proto.h"