OSDN Git Service

attempted font system added
[proj16/16.git] / 16 / v2 / source / verge / VCC / PREPROC.C
1 /*\r
2 Copyright (C) 1998 BJ Eirich (aka vecna)\r
3 This program is free software; you can redistribute it and/or\r
4 modify it under the terms of the GNU General Public License\r
5 as published by the Free Software Foundation; either version 2\r
6 of the License, or (at your option) any later version.\r
7 This program is distributed in the hope that it will be useful,\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
10 See the GNU General Public Lic\r
11 See the GNU General Public License for more details.\r
12 You should have received a copy of the GNU General Public License\r
13 along with this program; if not, write to the Free Software\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
15 */\r
16 \r
17 // ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
18 // ³                  The VergeC Compiler version 2.01                   ³\r
19 // ³              Copyright (C)1998 BJ Eirich (aka vecna)                ³\r
20 // ³                        Pre Processor module                         ³\r
21 // ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
22 \r
23 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
24 // CHANGELOG:\r
25 // <aen, may 14>\r
26 // + fixed incorrect file markers and last character omission.\r
27 // + one more incorrect file marker fix; was not restoring correctly after\r
28 //   #included files.\r
29 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
30 \r
31 #ifdef __WATCOMC__\r
32 #include <io.h>\r
33 #endif\r
34 \r
35 #include <stdio.h>\r
36 #include <stdlib.h>\r
37 #include <string.h>\r
38 #include <stdarg.h>\r
39 #include <ctype.h>\r
40 \r
41 #include "vcc.h"\r
42 #include "lexical.h"\r
43 \r
44 int pp_dump;\r
45 int pp_nomark;\r
46 static int pp_tempct = 0;\r
47 \r
48 typedef struct\r
49   {\r
50     char *sym;\r
51     int sym_len;\r
52 \r
53     char *resolve;\r
54     int resolve_len;\r
55 \r
56   } pp_def;\r
57 \r
58 typedef struct\r
59   {\r
60     char *filename;\r
61     char *data;\r
62 \r
63   } pp_include;\r
64 \r
65 void Process(char *filename);\r
66 char *pp_token(char *p);\r
67 \r
68 ////////////////////////////////////////////////////////////////////////////\r
69 // DATA ////////////////////////////////////////////////////////////////////\r
70 ////////////////////////////////////////////////////////////////////////////\r
71 \r
72 pp_def *pp_defarr         = NULL;\r
73 \r
74 int     pp_num_defs       = 0;\r
75 int     pp_defs_allocated = 0;\r
76 int     PP_DEFS_BLOCK     = 25;\r
77 \r
78 pp_include pp_incarr[100];\r
79 //pp_include *pp_icur       = NULL; // get rid of this\r
80 char *cur_filename=0;\r
81 char *last_filename=0;\r
82 \r
83 int     pp_num_includes   = 0;\r
84 \r
85 int     pp_line           = 0;\r
86 int     pp_total_lines    = 0;\r
87 \r
88 const  int     EOF_CHAR          = 0x00;\r
89 \r
90 char    pp_chr_table[256];\r
91 \r
92 enum\r
93   {\r
94     PP_ERROR,\r
95     PP_WHITE,\r
96     PP_PUNC,\r
97     PP_DIGIT,\r
98     PP_LETTER,\r
99     PP_QUOTE,\r
100     PP_DIRECTIVE,\r
101     PP_NEWLINE,\r
102     PP_EOF\r
103   };\r
104 \r
105 FILE   *pp_out            = NULL;\r
106 \r
107 char    pp_tok[1024];\r
108 int     pp_toktype        = 0;\r
109 \r
110 int     pp_last_delim     = 1;\r
111 \r
112 ////////////////////////////////////////////////////////////////////////////\r
113 // CODE ////////////////////////////////////////////////////////////////////\r
114 ////////////////////////////////////////////////////////////////////////////\r
115 \r
116 int logging=1;\r
117 void log(char *str)\r
118 {\r
119   if (logging)\r
120   {\r
121     FILE *fp = fopen("error.log", "a");\r
122     fprintf(fp, str);\r
123     fflush(fp);\r
124     fclose(fp);\r
125   }\r
126 }\r
127 \r
128 void init_pp_chr_table()\r
129 {\r
130   int x;\r
131 \r
132   memset(pp_chr_table, PP_ERROR, 256);\r
133 \r
134   pp_chr_table[EOF_CHAR] = PP_EOF;\r
135 \r
136   for (x='A'; x<='Z'; x++) pp_chr_table[x] = PP_LETTER;\r
137   for (x='a'; x<='z'; x++) pp_chr_table[x] = PP_LETTER;\r
138   pp_chr_table['_'] = PP_LETTER;\r
139   pp_chr_table['.'] = PP_LETTER;\r
140 \r
141   for (x='0'; x<='9'; x++) pp_chr_table[x] = PP_DIGIT;\r
142   pp_chr_table['$'] = PP_DIGIT;\r
143   pp_chr_table['\''] = PP_DIGIT;\r
144 \r
145   pp_chr_table['+'] = pp_chr_table['-'] = PP_PUNC;\r
146   pp_chr_table['*'] = pp_chr_table['/'] = PP_PUNC;\r
147   pp_chr_table['%'] = PP_PUNC;\r
148   pp_chr_table['|'] = pp_chr_table['&'] = PP_PUNC;\r
149   pp_chr_table['='] = pp_chr_table['^'] = PP_PUNC;\r
150   pp_chr_table[','] = PP_PUNC;\r
151   pp_chr_table['<'] = pp_chr_table['>'] = PP_PUNC;\r
152   pp_chr_table['('] = pp_chr_table[')'] = PP_PUNC;\r
153   pp_chr_table['['] = pp_chr_table[']'] = PP_PUNC;\r
154   pp_chr_table['{'] = pp_chr_table['}'] = PP_PUNC;\r
155   pp_chr_table[':'] = pp_chr_table[';'] = PP_PUNC;\r
156   pp_chr_table['\\'] = pp_chr_table['!'] = PP_PUNC;\r
157 \r
158   pp_chr_table[' '] = pp_chr_table['\t'] = PP_WHITE;\r
159   pp_chr_table['\r'] = PP_WHITE;\r
160 \r
161   pp_chr_table['\n'] = PP_NEWLINE;\r
162 \r
163   pp_chr_table['\"'] = PP_QUOTE;\r
164 \r
165   pp_chr_table['#'] = PP_DIRECTIVE;\r
166 }\r
167 \r
168 void pp_line_marker()\r
169 {\r
170   if (pp_nomark) return;\r
171 \r
172   fputc(2, pp_out);\r
173   fwrite(&pp_line, 1, 4, pp_out);\r
174 }\r
175 \r
176 void pp_file_marker()\r
177 {\r
178   if (pp_nomark) return;\r
179 \r
180   fputc(1, pp_out);\r
181   fwrite(cur_filename, 1, strlen(cur_filename)+1, pp_out);\r
182 }\r
183 \r
184 void pp_error(const char *error, ...)\r
185 {\r
186   va_list  lst;\r
187   char     string[1024];\r
188 \r
189   va_start (lst, error);\r
190   vsprintf (string, error, lst);\r
191   va_end   (lst);\r
192 \r
193   printf   ("*preproc error* ");\r
194   err      (string);\r
195 }\r
196 \r
197 void pp_line_error(const char *error, ...)\r
198 {\r
199   va_list  lst;\r
200   char     string[1024];\r
201 \r
202   va_start (lst, error);\r
203   vsprintf (string, error, lst);\r
204   va_end   (lst);\r
205 \r
206   printf   ("%s(%d) ", cur_filename, pp_line);\r
207   pp_error (string);\r
208 }\r
209 \r
210 int pp_is_punc(int c)\r
211   { return (PP_PUNC == pp_chr_table[c]); }\r
212 \r
213 int pp_is_letter(int c)\r
214   { return (PP_LETTER == pp_chr_table[c]); }\r
215 \r
216 int pp_is_digit(int c)\r
217   { return (PP_DIGIT == pp_chr_table[c]); }\r
218 \r
219 int pp_is_ident(int c)\r
220   { return (pp_is_letter(c) || pp_is_digit(c)); }\r
221 \r
222 int pp_is_white(int c)\r
223   { return (PP_WHITE == pp_chr_table[c]); }\r
224 \r
225 int pp_is_directive(int c)\r
226   { return (PP_DIRECTIVE == pp_chr_table[c]); }\r
227 \r
228 int pp_is_eof(int c)\r
229   { return (PP_EOF == pp_chr_table[c]); }\r
230 \r
231 pp_def *pp_def_add(char *sym, char *resolve)\r
232 {\r
233   pp_def *pp = NULL;\r
234   pp_def *p = NULL;\r
235 \r
236   if (!(pp_defs_allocated % PP_DEFS_BLOCK))\r
237   {\r
238     pp_defs_allocated += PP_DEFS_BLOCK;\r
239 \r
240     p = (pp_def *)realloc(\r
241       pp_defarr, pp_defs_allocated * sizeof(pp_def));\r
242     if (!p) pp_error("unable to grow #define list");\r
243 \r
244     pp_defarr = p;\r
245   }\r
246 \r
247   pp = &pp_defarr[pp_num_defs];\r
248   ++pp_num_defs;\r
249 \r
250   pp->sym = (char *)malloc(strlen(sym) +1);\r
251   if (!pp->sym)\r
252     pp_error("memory exhausted");\r
253   strcpy(pp->sym, sym);\r
254   pp->sym_len = strlen(sym);\r
255 \r
256   pp->resolve = (char *)malloc(strlen(resolve) +1);\r
257   if (!pp->resolve)\r
258     pp_error("memory exhausted");\r
259   strcpy(pp->resolve, resolve);\r
260   pp->resolve_len = strlen(resolve);\r
261 \r
262   return pp;\r
263 }\r
264 \r
265 pp_include *pp_include_add(char *filename)\r
266 {\r
267   FILE       *in = NULL;\r
268   pp_include *pp = NULL;\r
269   int         z  = 0;\r
270 \r
271   if (pp_num_includes)\r
272   {\r
273     int i;\r
274     for (i=0; i<pp_num_includes; i++)\r
275     {\r
276       if (!stricmp(pp_incarr[i].filename, pp_tok))\r
277         pp_error("circular dependencies");\r
278     }\r
279   }\r
280 \r
281   // alias\r
282   pp = &pp_incarr[pp_num_includes++];\r
283 \r
284   in = fopen(filename, "rb");\r
285   if (!in) pp_error("unable to open %s", filename);\r
286 \r
287   // filelength\r
288   fseek(in, 0, SEEK_END);\r
289   z = ftell(in);\r
290   fseek(in, 0, SEEK_SET);\r
291 \r
292   // cache file\r
293   pp->data = (char *)malloc((z +2) * sizeof(char));\r
294   if (!pp->data) pp_error("memory exhausted");\r
295   fread(pp->data, 1, z, in);\r
296   fclose(in);\r
297 \r
298   pp->data[z++] = 32; // <aen, may 12>\r
299   pp->data[z] = EOF_CHAR;\r
300 \r
301   pp->filename = (char *)malloc(strlen(filename) +1);\r
302   if (!pp->filename) pp_error("memory exhausted");\r
303   strcpy(pp->filename, filename);\r
304   cur_filename=pp->filename;\r
305 \r
306   return pp;\r
307 }\r
308 \r
309 char *pp_skip_c_comment(char *p)\r
310 {\r
311   p += 2;\r
312   while (*p && ('*' != *p || '/' != p[1]))\r
313   {\r
314     if ('\n' == *p)\r
315     {\r
316       ++pp_line;\r
317       pp_line_marker();\r
318     }\r
319     if ('/' == *p && '*' == p[1])\r
320       p = pp_skip_c_comment(p);\r
321     else ++p;\r
322   }\r
323   if (*p) p += 2;\r
324 \r
325   return p;\r
326 }\r
327 \r
328 char *pp_skip_cpp_comment(char *p)\r
329 {\r
330   p += 2;\r
331   while (*p && '\n' != *p)\r
332     ++p;\r
333   if (*p)\r
334   {\r
335     ++p;\r
336 \r
337     ++pp_line;\r
338     pp_line_marker();\r
339   }\r
340 \r
341   return p;\r
342 }\r
343 \r
344 char *pp_skipwhite(char *p)\r
345 {\r
346   for (;;)\r
347   {\r
348     while (*p && PP_WHITE == pp_chr_table[(int) *p])\r
349       ++p;\r
350 \r
351     if ('\n' == *p)\r
352     {\r
353       ++p;\r
354 \r
355       ++pp_line;\r
356       pp_line_marker();\r
357       continue;\r
358     }\r
359 \r
360     // skip comments\r
361     if ('/' == *p)\r
362     {\r
363       switch (p[1])\r
364       {\r
365         case '/': p = pp_skip_cpp_comment(p); continue;\r
366         case '*': p = pp_skip_c_comment(p);   continue;\r
367       }\r
368     }\r
369 \r
370     break;\r
371   }\r
372 \r
373   return p;\r
374 }\r
375 \r
376 char *pp_token_punc(char *p)\r
377 {\r
378   char *s = pp_tok;\r
379 \r
380   do {\r
381     *s++ = *p++;\r
382   } while (*p && pp_is_punc(*p));\r
383   *s = 0;\r
384 \r
385   return p;\r
386 }\r
387 \r
388 /*\r
389 int is_hex(int c)\r
390 {\r
391   return (\r
392      (c >= '0' && c <= '9')\r
393   || (c >= 'A' && c <= 'F')\r
394   || (c >= 'a' && c <= 'f'));\r
395 }\r
396 */\r
397 \r
398 char *pp_token_digit(char *p)\r
399 {\r
400   char *s = pp_tok;\r
401 \r
402   if ('\'' == *p)\r
403   {\r
404     *s++ = *p++;\r
405     if (!*p) return NULL;\r
406     *s++ = *p++;\r
407     if (!*p) return NULL;\r
408     *s++ = *p++;\r
409     if (!*p) return NULL;\r
410     *s = 0;\r
411   }\r
412   else\r
413   {\r
414     do {\r
415       *s++ = *p++;\r
416     } while (*p && pp_is_digit(*p));\r
417     if (*p) *s = 0;\r
418   }\r
419 \r
420   return p;\r
421 }\r
422 \r
423 char *pp_token_letter(char *p)\r
424 {\r
425   char *s = pp_tok;\r
426 \r
427   do {\r
428     *s++ = *p++;\r
429   } while (*p && pp_is_ident(*p));\r
430   if (*p) *s = 0;\r
431 \r
432   return p;\r
433 }\r
434 \r
435 char *pp_token_directive(char *p)\r
436 {\r
437   char *s = pp_tok;\r
438 \r
439   ++p; // skip #\r
440 \r
441   // directive name\r
442   do {\r
443     *s++ = *p++;\r
444   } while (pp_is_ident(*p));\r
445   *s = 0;\r
446 \r
447   // #include\r
448   if (!strcmp(pp_tok, "include"))\r
449   {\r
450     // boogly boogly boogly!\r
451     int l = 0;\r
452     char *e = NULL;\r
453 \r
454     //printf("#include detected \n");\r
455 \r
456     // any whitespace after 'include'\r
457     p = pp_skipwhite(p);\r
458 \r
459     // skip, but don't expect, a "\r
460     if ('\"' == *p) ++p;\r
461 \r
462     // grab the filename\r
463     e = pp_tok;\r
464     while (*p && '\"' != *p)\r
465       *e++ = *p++;\r
466     // if we didn't hit eof...?\r
467     if (*p)\r
468     {\r
469       // zero term filename\r
470       *e = 0;\r
471       // skip closing "\r
472       ++p;\r
473 \r
474       last_filename=cur_filename; // <aen, may 14>\r
475       l = pp_line;      // save\r
476       Process(pp_tok);\r
477       pp_line = l;      // restore\r
478       cur_filename=last_filename; // <aen, may 14>\r
479       // reset file marker\r
480       pp_file_marker();\r
481 \r
482       // disregard rest of line\r
483       while (*p && '\n' != *p)\r
484         ++p;\r
485       // if we didn't hit eof...?\r
486       if (*p)\r
487       {\r
488         // skip newline char\r
489         ++p;\r
490 \r
491         // update line\r
492         ++pp_line;\r
493         pp_line_marker();\r
494 \r
495         // dump null token... writes nothing i think...\r
496         pp_tok[0]='\0';\r
497       }\r
498       //else pp_error("screw you!");\r
499     }\r
500   }\r
501   // #define\r
502   else if (!strcmp(pp_tok, "define"))\r
503   {\r
504     char *e = NULL;\r
505     char sym[256];\r
506     char resolve[1024];\r
507 \r
508     // find start of symbol\r
509     while (' ' == *p || '\t' == *p)\r
510       ++p;\r
511 \r
512     // parse symbol\r
513     e = sym;\r
514     while (pp_is_ident(*p))\r
515       { *e++ = *p++; }\r
516     *e = 0;\r
517 \r
518     // check for duplicate #defines\r
519     if (pp_num_defs)\r
520     {\r
521       int i;\r
522       int z = strlen(sym);\r
523       for (i=0; i<pp_num_defs; i++)\r
524       {\r
525         if (z == pp_defarr[i].sym_len)\r
526         {\r
527           if (!stricmp(pp_defarr[i].sym, sym))\r
528             pp_error("duplicate #define symbol");\r
529         }\r
530       }\r
531     }\r
532 \r
533     // find start of argument list (if any), or resolve\r
534     while (' ' == *p || '\t' == *p)\r
535       ++p;\r
536 \r
537     // found argument list; discard for now\r
538     if ('(' == *p)\r
539     {\r
540       ++p;\r
541       while (')' != *p)\r
542         ++p;\r
543       ++p;\r
544 \r
545       // find start of resolve\r
546       while (' ' == *p || '\t' == *p)\r
547         ++p;\r
548     }\r
549 \r
550     pp_last_delim = 1;\r
551     e = resolve;\r
552     // parse resolve\r
553     while ('\n' != *p)\r
554     {\r
555       // whitespace\r
556       if (' ' == *p || '\t' == *p)\r
557       {\r
558         do {\r
559           ++p;\r
560         } while (' ' == *p || '\t' == *p);\r
561       }\r
562 \r
563       // continuation? (multiple lines)\r
564       if ('\\' == *p)\r
565       {\r
566         ++p;\r
567         while (*p && '\n' != *p)\r
568           ++p;\r
569         // if not eof\r
570         if (*p)\r
571         {\r
572           ++p;\r
573 \r
574           ++pp_line;\r
575           pp_line_marker();\r
576         }\r
577         continue;\r
578       }\r
579 \r
580       // special case for 'x' chars\r
581       if ('\'' == *p)\r
582       {\r
583         *e++ = *p++;\r
584         do {\r
585           *e++ = *p++;\r
586         } while (*p && '\'' != *p);\r
587         *e++ = *p++;\r
588 \r
589         pp_last_delim = 1;\r
590         continue;\r
591       }\r
592 \r
593       // special case for string literals\r
594       if ('\"' == *p)\r
595       {\r
596         do {\r
597           *e++ = *p++;\r
598         } while (*p && '\"' != *p);\r
599         if (*p)\r
600           *e++ = *p++;\r
601 \r
602         pp_last_delim = 1;\r
603         continue;\r
604       }\r
605 \r
606       // this is just the preprocessor, so i don't need\r
607       // to get punctuation or digits in their correct form, i just\r
608       // have to copy them over as i see them.\r
609       if (pp_is_punc(*p) || pp_is_digit(*p))\r
610       {\r
611         do {\r
612           // d'oh!\r
613           if ('\'' == *p || '\\' == *p)\r
614             break;\r
615 \r
616           *e++ = *p++;\r
617         } while (pp_is_punc(*p) || pp_is_digit(*p));\r
618 \r
619         pp_last_delim = 1;\r
620         continue;\r
621       }\r
622 \r
623       if (pp_is_letter(*p))\r
624       {\r
625         if (!pp_last_delim)\r
626           *e++ = ' ';\r
627 \r
628         do {\r
629           *e++ = *p++;\r
630         } while (pp_is_ident(*p));\r
631 \r
632         pp_last_delim = 0;\r
633         continue;\r
634       }\r
635 \r
636       ++p; // unknown?\r
637     }\r
638     *e = 0;\r
639 \r
640     // update define list\r
641     pp_def_add(sym, resolve);\r
642 \r
643     pp_tok[0]='\0';\r
644   }\r
645   // #???\r
646   else pp_error("unknown preprocessor directive");\r
647 \r
648   return p;\r
649 }\r
650 \r
651 char *pp_token_quote(char *p)\r
652 {\r
653   char *s = pp_tok;\r
654 \r
655   *s++ = *p++;\r
656 \r
657   while (*p && '\"' != *p)\r
658     *s++ = *p++;\r
659   // if not eof\r
660   if (*p)\r
661   {\r
662     *s++ = *p++;\r
663     *s   = 0;\r
664   }\r
665 \r
666   return p;\r
667 }\r
668 \r
669 char *pp_token(char *p)\r
670 {\r
671   p = pp_skipwhite(p);\r
672   if (!*p)\r
673   {\r
674     pp_tok[0] = '\0'; // gotta have this! (fixes last sym replication bug)\r
675     return p;\r
676   }\r
677 \r
678   pp_toktype = pp_chr_table[(int) *p];\r
679 \r
680   switch (pp_toktype)\r
681   {\r
682     case PP_PUNC:    p = pp_token_punc(p);   break;\r
683     case PP_DIGIT:   p = pp_token_digit(p);  break;\r
684     case PP_LETTER:  p = pp_token_letter(p); break;\r
685 \r
686     case PP_QUOTE:   p = pp_token_quote(p);  break;\r
687 \r
688     case PP_DIRECTIVE:\r
689       p = pp_token_directive(p);\r
690       break;\r
691 \r
692     case PP_EOF:\r
693       break;\r
694 \r
695     case PP_ERROR:\r
696       pp_line_error("unknown character <%c:%i>", *p, *p);\r
697   }\r
698 \r
699   return p;\r
700 }\r
701 \r
702 void Process(char *filename)\r
703 {\r
704   char *s = NULL;\r
705   pp_include *ppi  = NULL;\r
706 \r
707   // starts fresh for each #include file\r
708   pp_line = 1;\r
709   //pp_line_marker(); // hmm... did this kill the wat ver? i forget..\r
710 \r
711   // push file\r
712   ppi = pp_include_add(filename);\r
713   s   = ppi->data;\r
714 \r
715   pp_file_marker();\r
716 \r
717   pp_last_delim = 1;\r
718   s = pp_token(s);\r
719 \r
720   // loop until we hit an EOF token\r
721   while (*s && PP_EOF != pp_toktype)\r
722   {\r
723     // for compactor; this is absolutely required for the parsing to\r
724     // work correctly for hex numbers\r
725     if (PP_LETTER == pp_toktype || PP_DIGIT == pp_toktype)\r
726     {\r
727       if (!pp_last_delim)\r
728         fputc(' ', pp_out);\r
729     }\r
730 \r
731     if (pp_num_defs)\r
732     {\r
733       // #define replacement\r
734       if (PP_LETTER == pp_toktype)\r
735       {\r
736         pp_def *ppd = NULL;\r
737         int pp_token_len = strlen(pp_tok);\r
738         int i = 0;\r
739 \r
740         for (i=0; i<pp_num_defs; i++)\r
741         {\r
742           ppd = pp_defarr + i;\r
743           // first see if the lengths match, for possible quick discard\r
744           if (ppd->sym_len == pp_token_len)\r
745           {\r
746             // lengths match, compare bytes\r
747             if (!stricmp(pp_tok, ppd->sym))\r
748             {\r
749               // match! overwrite token with resolve\r
750               memcpy(pp_tok, ppd->resolve, strlen(ppd->resolve)+1);\r
751               break;\r
752             }\r
753           }\r
754         }\r
755       }\r
756     }\r
757 \r
758     // write whatever we got\r
759     fwrite(pp_tok, 1, strlen(pp_tok), pp_out);\r
760 \r
761     pp_last_delim = (PP_LETTER != pp_toktype);\r
762     s = pp_token(s);\r
763   }\r
764 \r
765   // pop file\r
766   free(ppi->data);\r
767   free(ppi->filename);\r
768   --pp_num_includes;\r
769   //pp_icur = &pp_incarr[pp_num_includes]; // oops! :-)\r
770 \r
771   pp_total_lines += pp_line;\r
772 }\r
773 \r
774 void pp_dump_output()\r
775 {\r
776   char strx[1024];\r
777 \r
778   sprintf(strx, "copy vcctemp.$$$ vcc%i.$$$", pp_tempct);\r
779   ++pp_tempct;\r
780 \r
781   system(strx);\r
782 }\r
783 \r
784 void PreProcess(char *filename)\r
785 {\r
786   pp_num_includes = 0;\r
787   init_pp_chr_table();\r
788 \r
789   pp_out = fopen("VCCTEMP.$$$", "wb");\r
790   if (!pp_out) pp_error("unable to open VCCTEMP.$$$");\r
791 \r
792   Process(filename);\r
793 \r
794   fclose(pp_out);\r
795 \r
796   // dump preproc output?\r
797   if (0 != pp_dump)\r
798     pp_dump_output();\r
799 }\r