cpp.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #define INS 32768 /* input buffer */
  10. #define OBS 4096 /* outbut buffer */
  11. #define NARG 128 /* Max number arguments to a macro */
  12. #define NINCLUDE 64 /* Max number of include directories (-I) */
  13. #define NIF 32 /* depth of nesting of #if */
  14. #ifndef EOF
  15. #define EOF (-1)
  16. #endif
  17. #ifndef NULL
  18. #define NULL 0
  19. #endif
  20. enum toktype { END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP,
  21. EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS,
  22. ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS,
  23. TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST,
  24. COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET,
  25. ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH,
  26. ASRSH, ASOR, ASAND, ELLIPS,
  27. DSHARP1, NAME1, DEFINED, UMINUS };
  28. enum kwtype { KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KDEFINE,
  29. KUNDEF, KLINE, KERROR, KWARNING, KPRAGMA, KDEFINED,
  30. KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL };
  31. #define ISDEFINED 01 /* has #defined value */
  32. #define ISKW 02 /* is PP keyword */
  33. #define ISUNCHANGE 04 /* can't be #defined in PP */
  34. #define ISMAC 010 /* builtin macro, e.g. __LINE__ */
  35. #define ISVARMAC 020 /* variadic macro */
  36. #define EOB 0xFE /* sentinel for end of input buffer */
  37. #define EOFC 0xFD /* sentinel for end of input file */
  38. #define XPWS 1 /* token flag: white space to assure token sep. */
  39. enum { Notinmacro, Inmacro };
  40. typedef struct token {
  41. unsigned char type;
  42. unsigned char flag;
  43. unsigned short hideset;
  44. unsigned int wslen;
  45. unsigned int len;
  46. uchar *t;
  47. } Token;
  48. typedef struct tokenrow {
  49. Token *tp; /* current one to scan */
  50. Token *bp; /* base (allocated value) */
  51. Token *lp; /* last+1 token used */
  52. int max; /* number allocated */
  53. } Tokenrow;
  54. typedef struct source {
  55. char *filename; /* name of file of the source */
  56. int line; /* current line number */
  57. int lineinc; /* adjustment for \\n lines */
  58. uchar *inb; /* input buffer */
  59. uchar *inp; /* input pointer */
  60. uchar *inl; /* end of input */
  61. int ins; /* input buffer size */
  62. int fd; /* input source */
  63. int ifdepth; /* conditional nesting in include */
  64. struct source *next; /* stack for #include */
  65. } Source;
  66. typedef struct nlist {
  67. struct nlist *next;
  68. uchar *name;
  69. int len;
  70. Tokenrow *vp; /* value as macro */
  71. Tokenrow *ap; /* list of argument names, if any */
  72. char val; /* value as preprocessor name */
  73. char flag; /* is defined, is pp name */
  74. } Nlist;
  75. typedef struct includelist {
  76. char deleted;
  77. char always;
  78. char *file;
  79. } Includelist;
  80. #define new(t) (t *)domalloc(sizeof(t))
  81. #define quicklook(a,b) (namebit[(a)&077] & (1<<((b)&037)))
  82. #define quickset(a,b) namebit[(a)&077] |= (1<<((b)&037))
  83. extern unsigned long namebit[077+1];
  84. enum errtype { WARNING, ERROR, FATAL };
  85. void expandlex(void);
  86. void fixlex(void);
  87. void setup(int, char **);
  88. #define gettokens cpp_gettokens
  89. int gettokens(Tokenrow *, int);
  90. int comparetokens(Tokenrow *, Tokenrow *);
  91. Source *setsource(char *, int, char *);
  92. void unsetsource(void);
  93. void puttokens(Tokenrow *);
  94. void process(Tokenrow *);
  95. void *dorealloc(void *, int);
  96. void *domalloc(int);
  97. void dofree(void *);
  98. void error(enum errtype, char *, ...);
  99. void flushout(void);
  100. int fillbuf(Source *);
  101. int trigraph(Source *);
  102. int foldline(Source *);
  103. Nlist *lookup(Token *, int);
  104. void control(Tokenrow *);
  105. void dodefine(Tokenrow *);
  106. void doadefine(Tokenrow *, int);
  107. void doinclude(Tokenrow *);
  108. void doif(Tokenrow *, enum kwtype);
  109. void expand(Tokenrow *, Nlist *, int);
  110. void builtin(Tokenrow *, int);
  111. int gatherargs(Tokenrow *, Tokenrow **, int, int *);
  112. void substargs(Nlist *, Tokenrow *, Tokenrow **);
  113. void expandrow(Tokenrow *, char *, int);
  114. void maketokenrow(int, Tokenrow *);
  115. Tokenrow *copytokenrow(Tokenrow *, Tokenrow *);
  116. Token *growtokenrow(Tokenrow *);
  117. Tokenrow *normtokenrow(Tokenrow *);
  118. void adjustrow(Tokenrow *, int);
  119. void movetokenrow(Tokenrow *, Tokenrow *);
  120. void insertrow(Tokenrow *, int, Tokenrow *);
  121. void peektokens(Tokenrow *, char *);
  122. void doconcat(Tokenrow *);
  123. Tokenrow *stringify(Tokenrow *);
  124. int lookuparg(Nlist *, Token *);
  125. long eval(Tokenrow *, int);
  126. void genline(void);
  127. void setempty(Tokenrow *);
  128. void makespace(Tokenrow *);
  129. char *outnum(char *, int);
  130. int digit(int);
  131. uchar *newstring(uchar *, int, int);
  132. int checkhideset(int, Nlist *);
  133. void prhideset(int);
  134. int newhideset(int, Nlist *);
  135. int unionhideset(int, int);
  136. void iniths(void);
  137. void setobjname(char *);
  138. void clearwstab(void);
  139. #define rowlen(tokrow) ((tokrow)->lp - (tokrow)->bp)
  140. extern char *outp;
  141. extern Token nltoken;
  142. extern Source *cursource;
  143. extern char *curtime;
  144. extern int incdepth;
  145. extern int ifdepth;
  146. extern int ifsatisfied[NIF];
  147. extern int Mflag;
  148. extern int nolineinfo;
  149. extern int skipping;
  150. extern int verbose;
  151. extern int Cplusplus;
  152. extern Nlist *kwdefined;
  153. extern Includelist includelist[NINCLUDE];
  154. extern char wd[];