Changeset 6097 for trunk/tools
- Timestamp:
- Jun 25, 2001, 4:15:50 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/wrc/preproc.c
r5524 r6097 16 16 17 17 18 extern void set_pp_ignore(int); 19 20 #define HASHKEY 18 extern void set_pp_ignore(int); /* From parser.l */ 19 20 #define HASHKEY 2039 21 21 static pp_entry_t *pp_defines[HASHKEY]; 22 22 23 #define MAXIFSTACK 23 #define MAXIFSTACK 64 24 24 static if_state_t if_stack[MAXIFSTACK]; 25 25 static int if_stack_idx = 0; … … 29 29 void pp_status(void) 30 30 { 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 31 int i; 32 int sum; 33 int total = 0; 34 pp_entry_t *ppp; 35 36 fprintf(stderr, "Defines statistics:\n"); 37 for(i = 0; i < HASHKEY; i++) 38 { 39 sum = 0; 40 for(ppp = pp_defines[i]; ppp; ppp = ppp->next) 41 sum++; 42 total += sum; 43 fprintf(stderr, "%4d, %3d\n", i, sum); 44 } 45 fprintf(stderr, "Total defines: %d\n", total); 46 46 } 47 47 #endif … … 50 50 int pphash(char *str) 51 51 { 52 53 54 55 52 int sum = 0; 53 while(*str) 54 sum += *str++; 55 return sum % HASHKEY; 56 56 } 57 57 58 58 pp_entry_t *pplookup(char *ident) 59 59 { 60 61 62 63 64 65 66 67 68 60 int idx = pphash(ident); 61 pp_entry_t *ppp; 62 63 for(ppp = pp_defines[idx]; ppp; ppp = ppp->next) 64 { 65 if(!strcmp(ident, ppp->ident)) 66 return ppp; 67 } 68 return NULL; 69 69 } 70 70 71 71 void del_define(char *name) 72 72 { 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 73 int idx; 74 pp_entry_t *ppp; 75 76 if((ppp = pplookup(name)) == NULL) 77 { 78 if(pedantic) 79 yywarning("%s was not defined", name); 80 return; 81 } 82 83 if(ppp->iep) 84 { 85 if(debuglevel & DEBUGLEVEL_PPMSG) 86 fprintf(stderr, "del_define: %s:%d: includelogic removed, include_ppp='%s', file=%s\n", input_name, line_number, name, ppp->iep->filename); 87 if(ppp->iep == includelogiclist) 88 { 89 includelogiclist = ppp->iep->next; 90 if(includelogiclist) 91 includelogiclist->prev = NULL; 92 } 93 else 94 { 95 ppp->iep->prev->next = ppp->iep->next; 96 if(ppp->iep->next) 97 ppp->iep->next->prev = ppp->iep->prev; 98 } 99 free(ppp->iep->filename); 100 free(ppp->iep); 101 } 102 103 idx = pphash(name); 104 if(pp_defines[idx] == ppp) 105 { 106 pp_defines[idx] = ppp->next; 107 if(pp_defines[idx]) 108 pp_defines[idx]->prev = NULL; 109 } 110 else 111 { 112 ppp->prev->next = ppp->next; 113 if(ppp->next) 114 ppp->next->prev = ppp->prev; 115 } 116 117 free(ppp); 118 119 if(debuglevel & DEBUGLEVEL_PPMSG) 120 printf("Deleted (%s, %d) <%s>\n", input_name, line_number, name); 121 121 } 122 122 123 123 pp_entry_t *add_define(char *def, char *text) 124 124 { 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 125 int len; 126 char *cptr; 127 int idx = pphash(def); 128 pp_entry_t *ppp; 129 130 if((ppp = pplookup(def)) != NULL) 131 { 132 if(pedantic) 133 yywarning("Redefinition of %s\n\tPrevious definition: %s:%d", def, ppp->filename, ppp->linenumber); 134 del_define(def); 135 } 136 ppp = (pp_entry_t *)xmalloc(sizeof(pp_entry_t)); 137 ppp->ident = def; 138 ppp->type = def_define; 139 ppp->subst.text = text; 140 ppp->filename = input_name ? xstrdup(input_name) : "<internal or cmdline>"; 141 ppp->linenumber = input_name ? line_number : 0; 142 ppp->next = pp_defines[idx]; 143 pp_defines[idx] = ppp; 144 if(ppp->next) 145 ppp->next->prev = ppp; 146 if(text) 147 { 148 /* Strip trailing white space from subst text */ 149 len = strlen(text); 150 while(len && strchr(" \t\r\n", text[len-1])) 151 { 152 text[--len] = '\0'; 153 } 154 /* Strip leading white space from subst text */ 155 for(cptr = text; *cptr && strchr(" \t\r", *cptr); cptr++) 156 ; 157 if(text != cptr) 158 memmove(text, cptr, strlen(cptr)+1); 159 } 160 if(debuglevel & DEBUGLEVEL_PPMSG) 161 printf("Added define (%s, %d) <%s> to <%s>\n", input_name, line_number, ppp->ident, text ? text : "(null)"); 162 163 return ppp; 164 164 } 165 165 166 166 pp_entry_t *add_cmdline_define(char *set) 167 167 { 168 char *cpy = xstrdup(set);/* Because gcc passes a R/O string */169 170 171 172 168 char *cpy = xstrdup(set); /* Because gcc passes a R/O string */ 169 char *cptr = strchr(cpy, '='); 170 if(cptr) 171 *cptr = '\0'; 172 return add_define(cpy, xstrdup(cptr ? cptr+1 : "")); 173 173 } 174 174 175 175 pp_entry_t *add_special_define(char *id) 176 176 { 177 178 179 177 pp_entry_t *ppp = add_define(xstrdup(id), xstrdup("")); 178 ppp->type = def_special; 179 return ppp; 180 180 } 181 181 182 182 pp_entry_t *add_macro(char *id, marg_t *args[], int nargs, mtext_t *exp) 183 183 { 184 185 186 187 188 189 190 191 192 193 194 ppp->ident= id;195 ppp->type= def_macro;196 ppp->margs= args;197 ppp->nargs= nargs;198 199 200 201 ppp->next= pp_defines[idx];202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 184 int idx = pphash(id); 185 pp_entry_t *ppp; 186 187 if((ppp = pplookup(id)) != NULL) 188 { 189 if(pedantic) 190 yywarning("Redefinition of %s\n\tPrevious definition: %s:%d", id, ppp->filename, ppp->linenumber); 191 del_define(id); 192 } 193 ppp = (pp_entry_t *)xmalloc(sizeof(pp_entry_t)); 194 ppp->ident = id; 195 ppp->type = def_macro; 196 ppp->margs = args; 197 ppp->nargs = nargs; 198 ppp->subst.mtext= exp; 199 ppp->filename = input_name ? xstrdup(input_name) : "<internal or cmdline>"; 200 ppp->linenumber = input_name ? line_number : 0; 201 ppp->next = pp_defines[idx]; 202 pp_defines[idx] = ppp; 203 if(ppp->next) 204 ppp->next->prev = ppp; 205 206 if(debuglevel & DEBUGLEVEL_PPMSG) 207 { 208 fprintf(stderr, "Added macro (%s, %d) <%s(%d)> to <", input_name, line_number, ppp->ident, nargs); 209 for(; exp; exp = exp->next) 210 { 211 switch(exp->type) 212 { 213 case exp_text: 214 fprintf(stderr, " \"%s\" ", exp->subst.text); 215 break; 216 case exp_stringize: 217 fprintf(stderr, " #(%d) ", exp->subst.argidx); 218 break; 219 case exp_concat: 220 fprintf(stderr, "##"); 221 break; 222 case exp_subst: 223 fprintf(stderr, " <%d> ", exp->subst.argidx); 224 break; 225 } 226 } 227 fprintf(stderr, ">\n"); 228 } 229 return ppp; 230 230 } 231 231 … … 236 236 *------------------------------------------------------------------------- 237 237 */ 238 #if defined(_Windows) || defined(__MSDOS__) 239 #define INCLUDESEPARATOR 238 #if defined(_Windows) || defined(__MSDOS__) || defined(__SEMICOLON__) 239 #define INCLUDESEPARATOR ";" 240 240 #else 241 #define INCLUDESEPARATOR 241 #define INCLUDESEPARATOR ":" 242 242 #endif 243 243 … … 247 247 void add_include_path(char *path) 248 248 { 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 249 char *tok; 250 char *cpy = xstrdup(path); 251 252 tok = strtok(cpy, INCLUDESEPARATOR); 253 while(tok) 254 { 255 char *dir; 256 char *cptr; 257 if(strlen(tok) == 0) 258 continue; 259 dir = xstrdup(tok); 260 for(cptr = dir; *cptr; cptr++) 261 { 262 /* Convert to forward slash */ 263 if(*cptr == '\\') 264 *cptr = '/'; 265 } 266 /* Kill eventual trailing '/' */ 267 if(*(cptr = dir + strlen(dir)-1) == '/') 268 *cptr = '\0'; 269 270 /* Add to list */ 271 nincludepath++; 272 includepath = (char **)xrealloc(includepath, nincludepath * sizeof(*includepath)); 273 includepath[nincludepath-1] = dir; 274 tok = strtok(NULL, INCLUDESEPARATOR); 275 } 276 free(cpy); 277 277 } 278 278 279 279 FILE *open_include(const char *name, int search, char **newpath) 280 280 { 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 281 char *cpy = xstrdup(name); 282 char *cptr; 283 FILE *fp; 284 int i; 285 286 for(cptr = cpy; *cptr; cptr++) 287 { 288 /* kill double backslash */ 289 if(*cptr == '\\' && *(cptr+1) == '\\') 290 memmove(cptr, cptr+1, strlen(cptr)); 291 /* Convert to forward slash */ 292 if(*cptr == '\\') 293 *cptr = '/'; 294 } 295 296 if(search) 297 { 298 /* Search current dir and then -I path */ 299 299 #ifdef __EMX__ 300 300 fp = fopen(cpy, "rb"); 301 301 #else 302 302 fp = fopen(cpy, "rt"); 303 303 #endif 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 304 if(fp) 305 { 306 if(debuglevel & DEBUGLEVEL_PPMSG) 307 printf("Going to include <%s>\n", name); 308 if(newpath) 309 *newpath = cpy; 310 else 311 free(cpy); 312 return fp; 313 } 314 } 315 /* Search -I path */ 316 for(i = 0; i < nincludepath; i++) 317 { 318 char *path; 319 path = (char *)xmalloc(strlen(includepath[i]) + strlen(cpy) + 2); 320 strcpy(path, includepath[i]); 321 strcat(path, "/"); 322 strcat(path, cpy); 323 323 #ifdef __EMX__ 324 324 fp = fopen(path, "rb"); 325 325 #else 326 326 fp = fopen(path, "rt"); 327 327 #endif 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 328 if(fp && (debuglevel & DEBUGLEVEL_PPMSG)) 329 printf("Going to include <%s>\n", path); 330 if(fp) 331 { 332 if(newpath) 333 *newpath = path; 334 else 335 free(path); 336 free(cpy); 337 return fp; 338 } 339 free(path); 340 } 341 free(cpy); 342 if(newpath) 343 *newpath = NULL; 344 return NULL; 345 345 } 346 346 … … 359 359 * 360 360 * The states mean: 361 * if_true 362 * if_false 363 * if_ignore 364 * if_elif 365 * if_elsefalse 366 * if_elsettrue 361 * if_true Process input to output 362 * if_false Process input but no output 363 * if_ignore Process input but no output 364 * if_elif Process input but no output 365 * if_elsefalse Process input but no output 366 * if_elsettrue Process input to output 367 367 * 368 368 * The possible state-sequences are [state(stack depth)] (rest can be deduced): 369 * TOS #if 1 #else#endif370 * if_true(n) if_true(n+1)if_elsefalse(n+1)371 * if_false(n) if_ignore(n+1)if_ignore(n+1)372 * if_elsetrue(n) if_true(n+1)if_elsefalse(n+1)373 * if_elsefalse(n) if_ignore(n+1)if_ignore(n+1)374 * if_elif(n) if_ignore(n+1)if_ignore(n+1)375 * if_ignore(n) if_ignore(n+1)if_ignore(n+1)376 * 377 * TOS #if 1 #elif 0 #else#endif378 * if_true(n) if_true(n+1) if_elif(n+1)if_elif(n+1)379 * if_false(n) if_ignore(n+1) if_ignore(n+1)if_ignore(n+1)380 * if_elsetrue(n) if_true(n+1) if_elif(n+1)if_elif(n+1)381 * if_elsefalse(n) if_ignore(n+1) if_ignore(n+1)if_ignore(n+1)382 * if_elif(n) if_ignore(n+1) if_ignore(n+1)if_ignore(n+1)383 * if_ignore(n) if_ignore(n+1) if_ignore(n+1)if_ignore(n+1)384 * 385 * TOS #if 0 #elif 1 #else#endif386 * if_true(n) if_false(n+1) if_true(n+1)if_elsefalse(n+1)387 * if_false(n) if_ignore(n+1) if_ignore(n+1)if_ignore(n+1)388 * if_elsetrue(n) if_false(n+1) if_true(n+1)if_elsefalse(n+1)389 * if_elsefalse(n) if_ignore(n+1) if_ignore(n+1)if_ignore(n+1)390 * if_elif(n) if_ignore(n+1) if_ignore(n+1)if_ignore(n+1)391 * if_ignore(n) if_ignore(n+1) if_ignore(n+1)if_ignore(n+1)369 * TOS #if 1 #else #endif 370 * if_true(n) if_true(n+1) if_elsefalse(n+1) 371 * if_false(n) if_ignore(n+1) if_ignore(n+1) 372 * if_elsetrue(n) if_true(n+1) if_elsefalse(n+1) 373 * if_elsefalse(n) if_ignore(n+1) if_ignore(n+1) 374 * if_elif(n) if_ignore(n+1) if_ignore(n+1) 375 * if_ignore(n) if_ignore(n+1) if_ignore(n+1) 376 * 377 * TOS #if 1 #elif 0 #else #endif 378 * if_true(n) if_true(n+1) if_elif(n+1) if_elif(n+1) 379 * if_false(n) if_ignore(n+1) if_ignore(n+1) if_ignore(n+1) 380 * if_elsetrue(n) if_true(n+1) if_elif(n+1) if_elif(n+1) 381 * if_elsefalse(n) if_ignore(n+1) if_ignore(n+1) if_ignore(n+1) 382 * if_elif(n) if_ignore(n+1) if_ignore(n+1) if_ignore(n+1) 383 * if_ignore(n) if_ignore(n+1) if_ignore(n+1) if_ignore(n+1) 384 * 385 * TOS #if 0 #elif 1 #else #endif 386 * if_true(n) if_false(n+1) if_true(n+1) if_elsefalse(n+1) 387 * if_false(n) if_ignore(n+1) if_ignore(n+1) if_ignore(n+1) 388 * if_elsetrue(n) if_false(n+1) if_true(n+1) if_elsefalse(n+1) 389 * if_elsefalse(n) if_ignore(n+1) if_ignore(n+1) if_ignore(n+1) 390 * if_elif(n) if_ignore(n+1) if_ignore(n+1) if_ignore(n+1) 391 * if_ignore(n) if_ignore(n+1) if_ignore(n+1) if_ignore(n+1) 392 392 * 393 393 *------------------------------------------------------------------------- 394 394 */ 395 395 static char *if_state_str[] = { 396 397 398 399 400 401 396 "if_false", 397 "if_true", 398 "if_elif", 399 "if_elsefalse", 400 "if_elsetrue", 401 "if_ignore" 402 402 }; 403 403 404 404 void push_if(if_state_t s) 405 405 { 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 406 if(if_stack_idx >= MAXIFSTACK) 407 internal_error(__FILE__, __LINE__, "#if-stack overflow; #{if,ifdef,ifndef} nested too deeply (> %d)", MAXIFSTACK); 408 409 if(debuglevel & DEBUGLEVEL_PPLEX) 410 fprintf(stderr, "Push if %s:%d: %s(%d) -> %s(%d)\n", input_name, line_number, if_state_str[if_state()], if_stack_idx, if_state_str[s], if_stack_idx+1); 411 412 if_stack[if_stack_idx++] = s; 413 414 switch(s) 415 { 416 case if_true: 417 case if_elsetrue: 418 break; 419 case if_false: 420 case if_elsefalse: 421 case if_elif: 422 case if_ignore: 423 push_ignore_state(); 424 break; 425 } 426 426 } 427 427 428 428 if_state_t pop_if(void) 429 429 { 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 430 if(if_stack_idx <= 0) 431 yyerror("#{endif,else,elif} without #{if,ifdef,ifndef} (#if-stack underflow)"); 432 433 switch(if_state()) 434 { 435 case if_true: 436 case if_elsetrue: 437 break; 438 case if_false: 439 case if_elsefalse: 440 case if_elif: 441 case if_ignore: 442 pop_ignore_state(); 443 break; 444 } 445 446 if(debuglevel & DEBUGLEVEL_PPLEX) 447 fprintf(stderr, "Pop if %s:%d: %s(%d) -> %s(%d)\n", 448 input_name, 449 line_number, 450 if_state_str[if_state()], 451 if_stack_idx, 452 if_state_str[if_stack[if_stack_idx <= 1 ? if_true : if_stack_idx-2]], 453 if_stack_idx-1); 454 455 return if_stack[--if_stack_idx]; 456 456 } 457 457 458 458 if_state_t if_state(void) 459 459 { 460 461 462 463 460 if(!if_stack_idx) 461 return if_true; 462 else 463 return if_stack[if_stack_idx-1]; 464 464 } 465 465 … … 467 467 void next_if_state(int i) 468 468 { 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 469 switch(if_state()) 470 { 471 case if_true: 472 case if_elsetrue: 473 push_if(i ? if_true : if_false); 474 break; 475 case if_false: 476 case if_elsefalse: 477 case if_elif: 478 case if_ignore: 479 push_if(if_ignore); 480 break; 481 default: 482 internal_error(__FILE__, __LINE__, "Invalid if_state (%d) in #{if,ifdef,ifndef} directive", (int)if_state()); 483 } 484 484 } 485 485 486 486 int get_if_depth(void) 487 487 { 488 489 } 490 488 return if_stack_idx; 489 } 490
Note:
See TracChangeset
for help on using the changeset viewer.