Changeset 5522 for trunk/tools/wrc/preproc.h
- Timestamp:
- Apr 16, 2001, 7:11:03 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/wrc/preproc.h
r882 r5522 7 7 #define __WRC_PREPROC_H 8 8 9 struct pp_entry { 9 struct pp_entry; /* forward */ 10 /* 11 * Include logic 12 * A stack of files which are already included and 13 * are protected in the #ifndef/#endif way. 14 */ 15 typedef struct includelogicentry { 16 struct includelogicentry *next; 17 struct includelogicentry *prev; 18 struct pp_entry *ppp; /* The define which protects the file */ 19 char *filename; /* The filename of the include */ 20 } includelogicentry_t; 21 22 /* 23 * The arguments of a macrodefinition 24 */ 25 typedef enum { 26 arg_single, 27 arg_list 28 } def_arg_t; 29 30 typedef struct marg { 31 def_arg_t type; /* Normal or ... argument */ 32 char *arg; /* The textual argument */ 33 int nnl; /* Number of newlines in the text to subst */ 34 } marg_t; 35 36 /* 37 * The expansiontext of a macro 38 */ 39 typedef enum { 40 exp_text, /* Simple text substitution */ 41 exp_concat, /* Concat (##) operator requested */ 42 exp_stringize, /* Stringize (#) operator requested */ 43 exp_subst /* Substitute argument */ 44 } def_exp_t; 45 46 typedef struct mtext { 47 struct mtext *next; 48 struct mtext *prev; 49 def_exp_t type; 50 union { 51 char *text; 52 int argidx; /* For exp_subst and exp_stringize reference */ 53 } subst; 54 } mtext_t; 55 56 /* 57 * The define descriptor 58 */ 59 typedef enum { 60 def_none, /* Not-a-define; used as return value */ 61 def_define, /* Simple defines */ 62 def_macro, /* Macro defines */ 63 def_special /* Special expansions like __LINE__ and __FILE__ */ 64 } def_type_t; 65 66 typedef struct pp_entry { 10 67 struct pp_entry *next; 11 68 struct pp_entry *prev; 12 char *ident; 13 char *subst; 14 int expanding; 15 }; 69 def_type_t type; /* Define or macro */ 70 char *ident; /* The key */ 71 marg_t **margs; /* Macro arguments array or NULL if none */ 72 int nargs; 73 union { 74 mtext_t *mtext; /* The substitution sequence or NULL if none */ 75 char *text; 76 } subst; 77 int expanding; /* Set when feeding substitution into the input */ 78 char *filename; /* Filename where it was defined */ 79 int linenumber; /* Linenumber where it was defined */ 80 includelogicentry_t *iep; /* Points to the include it protects */ 81 } pp_entry_t; 16 82 17 struct if_state {18 int current;19 int hasbeentrue;20 int nevertrue;21 };22 83 23 struct pp_entry *pp_lookup(char *ident); 24 void set_define(char *name); 84 /* 85 * If logic 86 */ 87 #define MAXIFSTACK 64 /* If this isn't enough you should alter the source... */ 88 89 typedef enum { 90 if_false, 91 if_true, 92 if_elif, 93 if_elsefalse, 94 if_elsetrue, 95 if_ignore 96 } if_state_t; 97 98 /* 99 * I assume that 'long long' exists in the compiler when it has a size 100 * of 8 or bigger. If not, then we revert to a simple 'long' for now. 101 * This should prevent most unexpected things with other compilers than 102 * gcc and egcs for now. 103 * In the future it should be possible to use another way, like a 104 * structure, so that we can emulate the MS compiler. 105 */ 106 #if defined(SIZEOF_LONGLONG) && SIZEOF_LONGLONG >= 8 107 typedef long long wrc_sll_t; 108 typedef unsigned long long wrc_ull_t; 109 #else 110 typedef long wrc_sll_t; 111 typedef unsigned long wrc_ull_t; 112 #endif 113 114 #define SIZE_CHAR 1 115 #define SIZE_SHORT 2 116 #define SIZE_INT 3 117 #define SIZE_LONG 4 118 #define SIZE_LONGLONG 5 119 #define SIZE_MASK 0x00ff 120 #define FLAG_SIGNED 0x0100 121 122 typedef enum { 123 #if 0 124 cv_schar = SIZE_CHAR + FLAG_SIGNED, 125 cv_uchar = SIZE_CHAR, 126 cv_sshort = SIZE_SHORT + FLAG_SIGNED, 127 cv_ushort = SIZE_SHORT, 128 #endif 129 cv_sint = SIZE_INT + FLAG_SIGNED, 130 cv_uint = SIZE_INT, 131 cv_slong = SIZE_LONG + FLAG_SIGNED, 132 cv_ulong = SIZE_LONG, 133 cv_sll = SIZE_LONGLONG + FLAG_SIGNED, 134 cv_ull = SIZE_LONGLONG 135 } ctype_t; 136 137 typedef struct cval { 138 ctype_t type; 139 union { 140 #if 0 141 signed char sc; /* Explicitely signed because compilers are stupid */ 142 unsigned char uc; 143 short ss; 144 unsigned short us; 145 #endif 146 int si; 147 unsigned int ui; 148 long sl; 149 unsigned long ul; 150 wrc_sll_t sll; 151 wrc_ull_t ull; 152 } val; 153 } cval_t; 154 155 156 157 pp_entry_t *pplookup(char *ident); 158 pp_entry_t *add_define(char *def, char *text); 159 pp_entry_t *add_cmdline_define(char *set); 160 pp_entry_t *add_special_define(char *id); 161 pp_entry_t *add_macro(char *ident, marg_t *args[], int nargs, mtext_t *exp); 25 162 void del_define(char *name); 26 void add_define(char *text); 27 void add_cmdline_define(char *set); 28 FILE *open_include(const char *name, int search); 163 FILE *open_include(const char *name, int search, char **newpath); 29 164 void add_include_path(char *path); 30 void push_if(int truecase, int wastrue, int nevertrue); 31 int pop_if(void); 32 int isnevertrue_if(void); 165 void push_if(if_state_t s); 166 void next_if_state(int); 167 if_state_t pop_if(void); 168 if_state_t if_state(void); 169 int get_if_depth(void); 170 171 /* 172 * From ppl.l 173 */ 174 extern FILE *ppin; 175 extern FILE *ppout; 176 extern char *pptext; 177 extern int pp_flex_debug; 178 int pplex(void); 179 180 void do_include(char *fname, int type); 181 void push_ignore_state(void); 182 void pop_ignore_state(void); 183 184 extern int include_state; 185 extern char *include_ppp; 186 extern char *include_filename; 187 extern int include_ifdepth; 188 extern int seen_junk; 189 extern includelogicentry_t *includelogiclist; 190 191 /* 192 * From ppy.y 193 */ 194 int ppparse(void); 195 extern int ppdebug; 33 196 34 197 #endif
Note:
See TracChangeset
for help on using the changeset viewer.