• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 
5 #include "globals.h"
6 #include "parse.h"
7 #include "dfa.h"
8 #include "mbo_getopt.h"
9 
10 const char *fileName = 0;
11 char *outputFileName = 0;
12 int sFlag = 0;
13 int bFlag = 0;
14 int dFlag = 0;
15 int iFlag = 0;
16 int bUsedYYAccept = 0;
17 unsigned int oline = 1;
18 unsigned int maxFill = 1;
19 int vFillIndexes = -1;
20 unsigned char *vUsedLabels;
21 unsigned int vUsedLabelAlloc = 1000;
22 
23 static char *opt_arg = NULL;
24 static int opt_ind = 1;
25 
26 static const mbo_opt_struct OPTIONS[] = {
27 	{'?', 0, "help"},
28 	{'b', 0, "bit-vectors"},
29 	{'d', 0, "debug-output"},
30 	{'e', 0, "ecb"},
31 	{'f', 0, "storable-state"},
32 	{'h', 0, "help"},
33 	{'i', 0, "no-debug-info"},
34 	{'o', 1, "output"},
35 	{'s', 0, "nested-ifs"},
36 	{'v', 0, "version"},
37         {'-', 0, NULL} /* end of args */
38 };
39 
usage()40 static void usage()
41 {
42     fprintf(stderr,
43 	"usage: re2c [-esbvhd] file\n"
44 	"\n"
45 	"-? -h   --help          Display this info.\n"
46 	"\n"
47 	"-b      --bit-vectors   Implies -s. Use bit vectors as well in the attempt to\n"
48 	"                        coax better code out of the compiler. Most useful for\n");
49     fprintf(stderr,
50 	"                        specifications with more than a few keywords (e.g. for\n"
51 	"                        most programming languages).\n"
52 	"\n"
53 	"-e      --ecb           Cross-compile from an ASCII platform to\n"
54 	"                        an EBCDIC one.\n"
55 	"\n");
56     fprintf(stderr,
57 	"-s      --nested-ifs    Generate nested ifs for some switches. Many compilers\n"
58 	"                        need this assist to generate better code.\n"
59 	"\n"
60 	"-f      --storable-state Generate a scanner with support for storable state\n"
61 	"\n"
62 	"-o      --output=output Specify the output file instead of stdout\n"
63 	"\n");
64     fprintf(stderr,
65 	"-d      --debug-output  Creates a parser that dumps information during\n"
66 	"                        about the current position and in which state the\n"
67 	"                        parser is.\n"
68 	"\n"
69 	"-i      --no-debug-info Do not generate '#line' info (usefull for versioning).\n"
70 	"\n"
71 	"-v      --version       Show version information.\n"
72 	"-V      --vernum        Show version as one number.\n");
73 }
74 
75 char *
mystrdup(const char * str)76 mystrdup(const char *str)
77 {
78 	size_t len;
79 	char *copy;
80 
81 	len = strlen(str) + 1;
82 	copy = malloc(len);
83 	memcpy(copy, str, len);
84 	return (copy);
85 }
86 
main(int argc,char * argv[])87 int main(int argc, char *argv[])
88 {
89     int c;
90     FILE *f, *output;
91 
92     fileName = NULL;
93 
94     if(argc == 1) {
95 	usage();
96 	return 2;
97     }
98 
99     while ((c = mbo_getopt(argc, argv, OPTIONS, &opt_arg, &opt_ind, 0))!=-1) {
100 	switch (c) {
101 	    case 'b':
102 		sFlag = 1;
103 		bFlag = 1;
104 		break;
105 	    case 'e':
106 		xlat = asc2ebc;
107 		talx = ebc2asc;
108 		break;
109 	    case 's':
110 		sFlag = 1;
111 		break;
112 	    case 'd':
113 		dFlag = 1;
114 		break;
115 	    case 'f':
116 		vFillIndexes = 0;
117 		break;
118 	    case 'i':
119 		iFlag = 1;
120 		break;
121 	    case 'o':
122 		outputFileName = opt_arg;
123 		break;
124 	    case 'v':
125 		fputs("re2c " PACKAGE_VERSION "\n", stdout);
126 		break;
127 	    case 'V': {
128 		int v1, v2, v3;
129 		sscanf(PACKAGE_VERSION, "%d.%d.%d", &v1, &v2, &v3);
130 		fprintf(stdout, "%02d%02d%02d\n", v1, v2, v3);
131 		return 2;
132 	    }
133 	    case 'h':
134 	    case '?':
135 	    default:
136 		usage();
137 		return 2;
138  	}
139     }
140 
141     if (argc == opt_ind + 1) {
142 	fileName = argv[opt_ind];
143     } else {
144 	usage();
145 	return 2;
146     }
147 
148     vUsedLabels = calloc(vUsedLabelAlloc, 1);
149     if (!vUsedLabels) {
150 	fputs("Out of memory.\n", stderr);
151 	return 1;
152     }
153 
154     /* set up the input stream */
155     if(fileName[0] == '-' && fileName[1] == '\0'){
156 	fileName = "<stdin>";
157 	f = stdin;
158     } else {
159 	if((f = fopen(fileName, "rt")) == NULL){
160 	    fprintf(stderr, "can't open %s\n", fileName);
161 	    return 1;
162 	}
163     }
164 
165     /* set up the output stream */
166     if (outputFileName == 0 || (fileName[0] == '-' && fileName[1] == '\0')) {
167 	outputFileName = mystrdup("<stdout>");
168 	output = stdout;
169     } else {
170 	int len;
171 	char *src, *dst, *tmp;
172 
173 	output = fopen(outputFileName, "wt");
174 	if (!output) {
175 	    fprintf(stderr, "can't open %s\n", outputFileName);
176 	    return 1;
177 	}
178 
179 	len = strlen(outputFileName);
180 	tmp = (char*)malloc((len+1)*2);
181 
182 	for (src = outputFileName, dst = tmp; *src; ++src)
183 	{
184 	    if (*src == '\\')
185 		*dst++ = *src;
186 	    *dst++ = *src;
187 	}
188 	*dst = '\0';
189 
190 	outputFileName = tmp;
191     }
192 
193     parse(f, output);
194     free(outputFileName);
195     return 0;
196 }
197