755cf74115624e057d46cc05ea2bbb05b14c2bd3
[henge/webcc.git] / src / bin / tools / testapc.c
1 /*!@file
2 \brief APC test driver
3 \details This driver does what APC does, but in staggered stages with
4 additional debugging information
5 \author Jordan Lavatai
6 \date Aug 2016
7 ----------------------------------------------------------------------------*/
8 /* Standard */
9 #include <stdio.h> //print
10 #include <errno.h> //errors
11 #include <string.h> //strnlen
12 /* Posix */
13 #include <stdlib.h> //exit
14 #include <unistd.h> //getopt
15 /* Internal */
16 #include <apc/parser.tab.h> //bison
17 #include <apc/ir.h> //ir
18
19 /* Import apc.c but redefine its primary symbols for jumping */
20 #define main apc_main
21 #define yyparse testapc_yyparse
22 #include <bin/tools/apc.c>
23 #undef yyparse
24 #undef main
25
26 int main(int, char*[]);
27 int testapc_yyparse(void);
28
29 extern //bison
30 int yyparse(void);
31 extern //lexer.c
32 int lexer_init(void);
33 extern //apc.c
34 const char* cargs['Z'];
35
36 extern //apc/parser.tab.c
37 YYSTYPE yylval;
38 extern //lexer.c
39 int lexer(void);
40
41 /* Ansi Term Colors */
42 #define RED "\x1b[31m"
43 #define GREEN "\x1b[32m"
44 #define YELLOW "\x1b[33m"
45 #define BLUE "\x1b[34m"
46 #define MAGENTA "\x1b[35m"
47 #define CYAN "\x1b[36m"
48 #define CLRC "\x1b[0m" //clear current color
49
50 /* Main entry from terminal
51 parses debugging options for testing apc, and calls apc_main
52 */
53 int main
54 ( int argc,
55 char* argv[]
56 )
57 { apc_main(argc, argv);
58 printf(GREEN "PASS\n");
59 exit(EXIT_SUCCESS);
60 }
61
62 #define MAX_TOK 1024
63 char tok_lval[MAX_TOK];
64
65 /* yyparse intercept */
66 int testapc_yyparse
67 ()
68 { int i, tok;
69 static char tok_pattern[] = "[" RED " %5i " CLRC "][" CYAN " %-12i " CLRC "]";
70 for (i = 0; i < 1000; i++)
71 { switch (tok = lexer())
72 #define OFFS 27
73 { case STR:
74 case NAME:
75 tok_pattern[OFFS] = 's';
76 break;
77 case REF:
78 case FPTR:
79 tok_pattern[OFFS] = 'x';
80 break;
81 case NUM:
82 case SS:
83 case SSD:
84 default:
85 tok_pattern[OFFS] = 'i';
86 break;
87 case 0:
88 printf(";\n" GREEN "Done" CLRC ".\n");
89 return 0;
90 }
91 printf(tok_pattern, tok, yylval.val);
92 if (i % 4 == 0 || yylval.val == 1)
93 printf(";\n");
94 }
95 printf("\n" CLRC);
96 }