blob: b4fcba1dd7971ff730f6d189753a706b6bb5cafb [file] [log] [blame]
Lev Walkin12984672004-09-24 21:00:15 +00001/*-
Lev Walkin2655eb32013-03-25 19:09:04 -07002 * Copyright (c) 2003, 2004, 2005, 2006, 2013
Lev Walkinc0d04912005-02-25 12:52:27 +00003 * Lev Walkin <vlm@lionet.info>. All rights reserved.
Lev Walkin12984672004-09-24 21:00:15 +00004 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $Id$
27 */
Lev Walkinf15320b2004-06-03 03:38:44 +000028/*
29 * This is the program that connects the libasn1* libraries together.
30 * It uses them in turn to parse, fix and then compile or print the ASN.1 tree.
31 */
Lev Walkinc0d04912005-02-25 12:52:27 +000032#include "sys-common.h"
Lev Walkinf15320b2004-06-03 03:38:44 +000033
Lev Walkinfb872bd2006-03-18 06:53:11 +000034#undef COPYRIGHT
35#define COPYRIGHT \
36 "Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin <vlm@lionet.info>\n"
37
Lev Walkinf15320b2004-06-03 03:38:44 +000038#include <asn1parser.h> /* Parse the ASN.1 file and build a tree */
39#include <asn1fix.h> /* Fix the ASN.1 tree */
40#include <asn1print.h> /* Print the ASN.1 tree */
41#include <asn1compiler.h> /* Compile the ASN.1 tree */
42
Lev Walkin79f54952004-08-13 16:58:19 +000043#include <asn1c_compat.h> /* Portable basename(3) and dirname(3) */
44
Lev Walkin93659562010-11-20 09:47:13 -080045#ifdef _WIN32
Lev Walkin46499872006-03-06 13:05:34 +000046#include <io.h>
47#include <direct.h>
48#else
49#include <dirent.h>
50#endif
51
Lev Walkinc0d04912005-02-25 12:52:27 +000052static void usage(const char *av0); /* Print the Usage screen and exit */
Lev Walkin46499872006-03-06 13:05:34 +000053static int importStandardModules(asn1p_t *asn, const char *skeletons_dir);
Lev Walkincbf218f2004-08-20 13:24:38 +000054
Lev Walkinf15320b2004-06-03 03:38:44 +000055int
56main(int ac, char **av) {
Lev Walkin7415bff2004-08-16 11:38:13 +000057 enum asn1p_flags asn1_parser_flags = A1P_NOFLAGS;
58 enum asn1f_flags asn1_fixer_flags = A1F_NOFLAGS;
Lev Walkincbf218f2004-08-20 13:24:38 +000059 enum asn1c_flags asn1_compiler_flags= A1C_NO_C99;
Lev Walkinab4bb292004-08-18 04:52:48 +000060 enum asn1print_flags asn1_printer_flags = APF_NOFLAGS;
Lev Walkinf15320b2004-06-03 03:38:44 +000061 int print_arg__print_out = 0; /* Don't compile, just print parsed */
62 int print_arg__fix_n_print = 0; /* Fix and print */
Lev Walkinf15320b2004-06-03 03:38:44 +000063 int warnings_as_errors = 0; /* Treat warnings as errors */
64 char *skeletons_dir = NULL; /* Directory with supplementary stuff */
65 asn1p_t *asn = 0; /* An ASN.1 parsed tree */
66 int ret; /* Return value from misc functions */
67 int ch; /* Command line character */
68 int i; /* Index in some loops */
69
70 /*
71 * Process command-line options.
72 */
Lev Walkin59b176e2005-11-26 11:25:14 +000073 while((ch = getopt(ac, av, "EFf:g:hLPp:RS:vW:X")) != -1)
Lev Walkinf15320b2004-06-03 03:38:44 +000074 switch(ch) {
75 case 'E':
76 print_arg__print_out = 1;
77 break;
78 case 'F':
79 print_arg__fix_n_print = 1;
80 break;
81 case 'f':
Lev Walkindd32b592004-09-06 08:07:29 +000082 if(strcmp(optarg, "all-defs-global") == 0) {
83 asn1_compiler_flags |= A1C_ALL_DEFS_GLOBAL;
84 } else if(strcmp(optarg, "bless-SIZE") == 0) {
85 asn1_fixer_flags |= A1F_EXTENDED_SizeConstraint;
Lev Walkin21d00002005-03-04 08:48:53 +000086 } else if(strcmp(optarg, "compound-names") == 0) {
87 asn1_compiler_flags |= A1C_COMPOUND_NAMES;
Lev Walkin72a0f5a2005-07-24 08:28:39 +000088 } else if(strcmp(optarg, "indirect-choice") == 0) {
89 asn1_compiler_flags |= A1C_INDIRECT_CHOICE;
Lev Walkin5555d532004-06-28 21:21:45 +000090 } else if(strncmp(optarg, "known-extern-type=", 18) == 0) {
91 char *known_type = optarg + 18;
92 ret = asn1f_make_known_external_type(known_type);
93 assert(ret == 0 || errno == EEXIST);
Lev Walkin46499872006-03-06 13:05:34 +000094 } else if(strcmp(optarg, "native-types") == 0) {
Lev Walkin2a744a72013-03-27 01:56:23 -070095 fprintf(stderr, "-f%s: Deprecated option\n", optarg);
96 asn1_compiler_flags &= ~A1C_USE_WIDE_TYPES;
97 } else if(strcmp(optarg, "wide-types") == 0) {
98 asn1_compiler_flags |= A1C_USE_WIDE_TYPES;
Lev Walkin4e940a02004-09-26 13:13:13 +000099 } else if(strcmp(optarg, "no-constraints") == 0) {
100 asn1_compiler_flags |= A1C_NO_CONSTRAINTS;
Lev Walkinb9b8b952005-03-05 00:33:27 +0000101 } else if(strcmp(optarg, "no-include-deps") == 0) {
102 asn1_compiler_flags |= A1C_NO_INCLUDE_DEPS;
Lev Walkin34944f22010-10-07 08:25:37 +0000103 } else if(strcmp(optarg, "includes-quoted") == 0) {
104 asn1_compiler_flags |= A1C_INCLUDES_QUOTED;
Lev Walkindd32b592004-09-06 08:07:29 +0000105 } else if(strcmp(optarg, "unnamed-unions") == 0) {
106 asn1_compiler_flags |= A1C_UNNAMED_UNIONS;
Lev Walkin2655eb32013-03-25 19:09:04 -0700107 } else if(strcmp(optarg, "skeletons-copy") == 0) {
108 fprintf(stderr, "-f%s: Deprecated option\n", optarg);
Lev Walkin2a744a72013-03-27 01:56:23 -0700109 asn1_compiler_flags &= ~A1C_LINK_SKELETONS;
Lev Walkin2655eb32013-03-25 19:09:04 -0700110 } else if(strcmp(optarg, "link-skeletons") == 0) {
111 asn1_compiler_flags |= A1C_LINK_SKELETONS;
Lev Walkinf15320b2004-06-03 03:38:44 +0000112 } else {
113 fprintf(stderr, "-f%s: Invalid argument\n", optarg);
114 exit(EX_USAGE);
115 }
116 break;
Lev Walkin59b176e2005-11-26 11:25:14 +0000117 case 'g':
118 if(strcmp(optarg, "en-PER") == 0) {
119 asn1_compiler_flags |= A1C_GEN_PER;
120 } else {
121 fprintf(stderr, "-g%s: Invalid argument\n", optarg);
122 exit(EX_USAGE);
123 }
124 break;
Lev Walkincbf218f2004-08-20 13:24:38 +0000125 case 'h':
126 usage(av[0]);
Lev Walkinf15320b2004-06-03 03:38:44 +0000127 case 'P':
128 asn1_compiler_flags |= A1C_PRINT_COMPILED;
Lev Walkincbf218f2004-08-20 13:24:38 +0000129 asn1_compiler_flags &= ~A1C_NO_C99;
Lev Walkinf15320b2004-06-03 03:38:44 +0000130 break;
Lev Walkinab4bb292004-08-18 04:52:48 +0000131 case 'p':
Lev Walkin59b176e2005-11-26 11:25:14 +0000132 if(strncmp(optarg, "du=", 3) == 0) {
133 char *pduname = optarg + 3;
Lev Walkin66adab42006-09-23 02:52:12 +0000134 if(strcmp(pduname, "all") == 0) {
135 asn1_compiler_flags |= A1C_PDU_ALL;
136 } else if(strcmp(pduname, "auto") == 0) {
137 asn1_compiler_flags |= A1C_PDU_AUTO;
138 } else if(pduname[0] >= 'A' && pduname[0] <= 'Z') {
139 asn1c__add_pdu_type(pduname);
140 asn1_compiler_flags |= A1C_PDU_TYPE;
141 } else {
142 fprintf(stderr, "-pdu=%s"
143 ": expected -pdu={all|auto|Type}\n",
Lev Walkin59b176e2005-11-26 11:25:14 +0000144 pduname);
145 exit(EX_USAGE);
146 }
Lev Walkind370e9f2006-03-16 10:03:35 +0000147 } else if(strcmp(optarg, "rint-class-matrix") == 0) {
148 asn1_printer_flags |= APF_PRINT_CLASS_MATRIX;
Lev Walkin59b176e2005-11-26 11:25:14 +0000149 } else if(strcmp(optarg, "rint-constraints") == 0) {
Lev Walkind370e9f2006-03-16 10:03:35 +0000150 asn1_printer_flags |= APF_PRINT_CONSTRAINTS;
Lev Walkincbf218f2004-08-20 13:24:38 +0000151 } else if(strcmp(optarg, "rint-lines") == 0) {
152 asn1_printer_flags |= APF_LINE_COMMENTS;
Lev Walkinab4bb292004-08-18 04:52:48 +0000153 } else {
154 fprintf(stderr, "-p%s: Invalid argument\n", optarg);
155 exit(EX_USAGE);
156 }
157 break;
Lev Walkinf15320b2004-06-03 03:38:44 +0000158 case 'R':
159 asn1_compiler_flags |= A1C_OMIT_SUPPORT_CODE;
160 break;
161 case 'S':
162 skeletons_dir = optarg;
163 break;
Lev Walkincbf218f2004-08-20 13:24:38 +0000164 case 'v':
165 fprintf(stderr, "ASN.1 Compiler, v" VERSION "\n" COPYRIGHT);
166 exit(0);
167 break;
Lev Walkinf15320b2004-06-03 03:38:44 +0000168 case 'W':
169 if(strcmp(optarg, "error") == 0) {
170 warnings_as_errors = 1;
171 break;
172 } else if(strcmp(optarg, "debug-lexer") == 0) {
173 asn1_parser_flags |= A1P_LEXER_DEBUG;
174 break;
175 } else if(strcmp(optarg, "debug-fixer") == 0) {
176 asn1_fixer_flags |= A1F_DEBUG;
177 break;
178 } else if(strcmp(optarg, "debug-compiler") == 0) {
179 asn1_compiler_flags |= A1C_DEBUG;
180 break;
181 } else {
182 fprintf(stderr, "-W%s: Invalid argument\n", optarg);
183 exit(EX_USAGE);
184 }
185 break;
Lev Walkinf7484512004-10-13 09:13:56 +0000186 case 'X':
187 print_arg__print_out = 1; /* Implicit -E */
188 print_arg__fix_n_print = 1; /* Implicit -F */
189 asn1_printer_flags |= APF_PRINT_XML_DTD;
190 break;
Lev Walkinf15320b2004-06-03 03:38:44 +0000191 default:
192 usage(av[0]);
193 }
194
195 /*
196 * Validate the options combination.
197 */
198 if(!print_arg__print_out) {
199 if(print_arg__fix_n_print) {
200 fprintf(stderr, "Error: -F requires -E\n");
201 exit(EX_USAGE);
202 }
Lev Walkinab4bb292004-08-18 04:52:48 +0000203 if(asn1_printer_flags) {
204 fprintf(stderr, "Error: "
Lev Walkincbf218f2004-08-20 13:24:38 +0000205 "-print-... arguments require -E\n");
Lev Walkinab4bb292004-08-18 04:52:48 +0000206 exit(EX_USAGE);
207 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000208 }
209
210 /*
211 * Ensure that there are some input files present.
212 */
213 if(ac > optind) {
214 ac -= optind;
215 av += optind;
216 } else {
Lev Walkinbf430382005-11-05 12:28:16 +0000217 char *bin_name = a1c_basename(av[0]);
218 fprintf(stderr, "%s: No input files specified. "
219 "Try '%s -h' for more information\n",
220 bin_name, bin_name);
Lev Walkinf15320b2004-06-03 03:38:44 +0000221 exit(1);
222 }
223
224 /*
Lev Walkin46499872006-03-06 13:05:34 +0000225 * Make sure the skeleton directory is out there.
226 */
227 if(skeletons_dir == NULL) {
228 struct stat sb;
229 skeletons_dir = DATADIR;
230 if((av[-optind][0] == '.' || av[-optind][1] == '/')
231 && stat(skeletons_dir, &sb)) {
232 /*
233 * The default skeletons directory does not exist,
234 * compute it from my file name:
235 * ./asn1c/asn1c -> ./skeletons
236 */
237 char *p;
238 size_t len;
239
240 p = a1c_dirname(av[-optind]);
241
242 len = strlen(p) + sizeof("/../skeletons");
243 skeletons_dir = malloc(len);
244 assert(skeletons_dir);
245 snprintf(skeletons_dir, len, "%s/../skeletons", p);
246 if(stat(skeletons_dir, &sb)) {
247 fprintf(stderr,
248 "WARNING: skeletons are neither in "
249 "\"%s\" nor in \"%s\"!\n",
250 DATADIR, skeletons_dir);
251 if(warnings_as_errors)
252 exit(EX_OSFILE);
253 }
254 }
255 }
256
257 /*
Lev Walkinf15320b2004-06-03 03:38:44 +0000258 * Iterate over input files and parse each.
259 * All syntax trees from all files will be bundled together.
260 */
261 for(i = 0; i < ac; i++) {
262 asn1p_t *new_asn;
263
264 new_asn = asn1p_parse_file(av[i], asn1_parser_flags);
265 if(new_asn == NULL) {
266 fprintf(stderr, "Cannot parse \"%s\"\n", av[i]);
267 exit(EX_DATAERR);
268 }
269
270 /*
271 * Bundle the parsed tree with existing one.
272 */
273 if(asn) {
274 asn1p_module_t *mod;
275 while((mod = TQ_REMOVE(&(new_asn->modules), mod_next)))
276 TQ_ADD(&(asn->modules), mod, mod_next);
Lev Walkinf6fc04b2006-09-12 05:22:12 +0000277 asn1p_delete(new_asn);
Lev Walkinf15320b2004-06-03 03:38:44 +0000278 } else {
279 asn = new_asn;
280 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000281 }
282
Lev Walkin46499872006-03-06 13:05:34 +0000283 /* These are mostly notes for the human readers */
284 assert(asn);
285 assert(skeletons_dir);
286
Lev Walkinf15320b2004-06-03 03:38:44 +0000287 /*
Lev Walkin7415bff2004-08-16 11:38:13 +0000288 * Dump the parsed ASN.1 tree if -E specified and -F is NOT given.
Lev Walkinf15320b2004-06-03 03:38:44 +0000289 */
290 if(print_arg__print_out && !print_arg__fix_n_print) {
Lev Walkinab4bb292004-08-18 04:52:48 +0000291 if(asn1print(asn, asn1_printer_flags))
Lev Walkinf15320b2004-06-03 03:38:44 +0000292 exit(EX_SOFTWARE);
293 return 0;
294 }
295
Lev Walkin46499872006-03-06 13:05:34 +0000296 /*
297 * Read in the files from skeletons/standard-modules
298 */
299 if(importStandardModules(asn, skeletons_dir)) {
300 if(warnings_as_errors)
301 exit(EX_DATAERR);
302 }
Lev Walkinf15320b2004-06-03 03:38:44 +0000303
304 /*
305 * Process the ASN.1 specification: perform semantic checks,
306 * expand references, etc, etc.
307 * This function will emit necessary warnings and error messages.
308 */
309 ret = asn1f_process(asn, asn1_fixer_flags,
310 NULL /* default fprintf(stderr) */);
311 switch(ret) {
312 case 1:
313 if(!warnings_as_errors)
314 /* Fall through */
315 case 0:
316 break; /* All clear */
317 case -1:
318 exit(EX_DATAERR); /* Fatal failure */
319 }
320
321 /*
322 * Dump the parsed ASN.1 tree if -E specified and -F is given.
323 */
324 if(print_arg__print_out && print_arg__fix_n_print) {
Lev Walkinab4bb292004-08-18 04:52:48 +0000325 if(asn1print(asn, asn1_printer_flags))
Lev Walkinf15320b2004-06-03 03:38:44 +0000326 exit(EX_SOFTWARE);
327 return 0;
328 }
329
330 /*
Lev Walkinf15320b2004-06-03 03:38:44 +0000331 * Compile the ASN.1 tree into a set of source files
332 * of another language.
333 */
Lev Walkin866cff12005-03-05 00:50:53 +0000334 if(asn1_compile(asn, skeletons_dir, asn1_compiler_flags,
Lev Walkin8253ea92006-03-17 01:47:57 +0000335 ac + optind, optind - 1, av - optind)) {
Lev Walkinf15320b2004-06-03 03:38:44 +0000336 exit(EX_SOFTWARE);
337 }
338
Lev Walkincbad2512005-03-24 16:27:02 +0000339 return 0;
Lev Walkinf15320b2004-06-03 03:38:44 +0000340}
341
342/*
Lev Walkin46499872006-03-06 13:05:34 +0000343 * Parse and import *.asn1 from skeletons/standard-modules
344 */
345static int
346importStandardModules(asn1p_t *asn, const char *skeletons_dir) {
347 asn1p_t *new_asn;
348 asn1p_module_t *mod;
349 const char *filename;
Lev Walkin20a7bf42006-03-17 00:20:52 +0000350 char *fullname;
Lev Walkin46499872006-03-06 13:05:34 +0000351 char *target_dir;
352 int target_dir_len;
353 int len;
Lev Walkin93659562010-11-20 09:47:13 -0800354#ifdef _WIN32
Lev Walkin46499872006-03-06 13:05:34 +0000355 intptr_t dir;
356 struct _finddata_t c_file;
357 char *pattern;
358#else
359 struct dirent *dp;
360 DIR *dir;
361#endif
362 int ret = 0;
363
364 /* Notes for the human reader */
365 assert(asn);
366 assert(skeletons_dir);
367
368 /*
369 * Figure out the standard-modules directory.
370 */
371 target_dir_len = strlen(skeletons_dir)
372 + sizeof("/standard-modules") - 1;
373 target_dir = malloc(target_dir_len + 1);
374 assert(target_dir);
375 snprintf(target_dir, target_dir_len + 1, "%s/standard-modules",
376 skeletons_dir);
377
Lev Walkin93659562010-11-20 09:47:13 -0800378#ifdef _WIN32
Lev Walkinc4b2be52006-03-16 22:23:57 +0000379 len = target_dir_len + sizeof("/*.asn1");
Lev Walkin46499872006-03-06 13:05:34 +0000380 pattern = malloc(len);
381 assert(pattern);
382 snprintf(pattern, len, "%s/*.asn1", target_dir);
383 dir = _findfirst(pattern, &c_file);
Lev Walkin20a7bf42006-03-17 00:20:52 +0000384 if(dir == -1L) {
Lev Walkin46499872006-03-06 13:05:34 +0000385#else
386 dir = opendir(target_dir);
387 if(!dir) {
388#endif
389 fprintf(stderr,
390 "WARNING: Cannot find standard modules in %s\n",
391 target_dir);
392 return -1;
393 }
394
Lev Walkin93659562010-11-20 09:47:13 -0800395#ifdef _WIN32
Lev Walkin46499872006-03-06 13:05:34 +0000396 do {
397 filename = c_file.name;
398#else
399 while((dp = readdir(dir))) {
Lev Walkin46499872006-03-06 13:05:34 +0000400 filename = dp->d_name;
Lev Walkin20a7bf42006-03-17 00:20:52 +0000401#endif
Lev Walkin46499872006-03-06 13:05:34 +0000402 len = strlen(filename);
403 if(len <= 5 || strcmp(filename + len - 5, ".asn1"))
404 continue;
405 len = target_dir_len + 1 + len + 1;
406 fullname = malloc(len);
407 if(!fullname) continue; /* Just skip it, no big deal */
408 snprintf(fullname, len, "%s/%s", target_dir, filename);
409 filename = fullname;
Lev Walkin46499872006-03-06 13:05:34 +0000410
411 new_asn = asn1p_parse_file(filename, A1P_NOFLAGS);
412 if(new_asn == NULL) {
413 fprintf(stderr, "WARNING: Cannot parse standard module \"%s\"\n", filename);
414 ret = -1;
415 continue;
416 }
417
418 /* Import these modules and mark them as "standard" */
419 while((mod = TQ_REMOVE(&(new_asn->modules), mod_next))) {
420 mod->_tags |= MT_STANDARD_MODULE;
421 TQ_ADD(&(asn->modules), mod, mod_next);
422 }
Lev Walkinf6fc04b2006-09-12 05:22:12 +0000423 asn1p_delete(new_asn);
Lev Walkin46499872006-03-06 13:05:34 +0000424
Lev Walkin93659562010-11-20 09:47:13 -0800425#ifdef _WIN32
Lev Walkin46499872006-03-06 13:05:34 +0000426 } while(_findnext(dir, &c_file) == 0);
427 _findclose(dir);
428#else
429 free(fullname);
430 } /* while(readdir()) */
431 closedir(dir);
432#endif
433
434 return ret;
435}
436
437/*
Lev Walkinf15320b2004-06-03 03:38:44 +0000438 * Print the usage screen and exit(EX_USAGE).
439 */
440static void
Lev Walkin06b8d7a2004-09-23 22:06:02 +0000441usage(const char *av0) {
Lev Walkinf15320b2004-06-03 03:38:44 +0000442 fprintf(stderr,
Lev Walkincbf218f2004-08-20 13:24:38 +0000443"ASN.1 Compiler, v" VERSION "\n" COPYRIGHT
Lev Walkin06b8d7a2004-09-23 22:06:02 +0000444"Usage: %s [options] file ...\n"
445"Options:\n"
Lev Walkincbf218f2004-08-20 13:24:38 +0000446" -E Run only the ASN.1 parser and print out the tree\n"
447" -F During -E operation, also perform tree fixing\n"
448"\n"
449" -P Concatenate and print the compiled text\n"
450" -R Restrict output (tables only, no support code)\n"
451" -S <dir> Directory with support (skeleton?) files\n"
452" (Default is \"%s\")\n"
Lev Walkinf7484512004-10-13 09:13:56 +0000453" -X Generate and print the XML DTD\n"
Lev Walkincbf218f2004-08-20 13:24:38 +0000454"\n"
455
Lev Walkincbf218f2004-08-20 13:24:38 +0000456" -Werror Treat warnings as errors; abort if any warning\n"
457" -Wdebug-lexer Enable verbose debugging output from lexer\n"
458" -Wdebug-fixer --//-- semantics processor\n"
459" -Wdebug-compiler --//-- compiler\n"
460"\n"
461
462" -fbless-SIZE Allow SIZE() constraint for INTEGER etc (non-std.)\n"
Lev Walkin21d00002005-03-04 08:48:53 +0000463" -fcompound-names Disambiguate C's struct NAME's inside top-level types\n"
Lev Walkin72a0f5a2005-07-24 08:28:39 +0000464" -findirect-choice Compile members of CHOICE as indirect pointers\n"
Lev Walkin34944f22010-10-07 08:25:37 +0000465" -fincludes-quoted Generate #includes in \"double\" instead of <angle> quotes\n"
Lev Walkin7c655122005-06-05 09:42:42 +0000466" -fknown-extern-type=<name> Pretend the specified type is known\n"
Lev Walkin4e940a02004-09-26 13:13:13 +0000467" -fno-constraints Do not generate constraint checking code\n"
Lev Walkinb9b8b952005-03-05 00:33:27 +0000468" -fno-include-deps Do not generate courtesy #includes for dependencies\n"
Lev Walkincbf218f2004-08-20 13:24:38 +0000469" -funnamed-unions Enable unnamed unions in structures\n"
Lev Walkin2a744a72013-03-27 01:56:23 -0700470" -fwide-types Use INTEGER_t instead of \"long\" by default, etc.\n"
Lev Walkin59b176e2005-11-26 11:25:14 +0000471"\n"
472
473" -gen-PER Generate PER support code\n"
Lev Walkin66adab42006-09-23 02:52:12 +0000474" -pdu={all|auto|Type} Generate PDU table (discover PDUs automatically)\n"
Lev Walkincbf218f2004-08-20 13:24:38 +0000475"\n"
476
Lev Walkind370e9f2006-03-16 10:03:35 +0000477" -print-class-matrix Print out the collected object class matrix (debug)\n"
Lev Walkindafd95d2006-03-18 06:13:57 +0000478" -print-constraints Explain subtype constraints (debug)\n"
Lev Walkincbf218f2004-08-20 13:24:38 +0000479" -print-lines Generate \"-- #line\" comments in -E output\n"
480
Lev Walkinab4bb292004-08-18 04:52:48 +0000481 ,
482 a1c_basename(av0), DATADIR
Lev Walkinf15320b2004-06-03 03:38:44 +0000483 );
484 exit(EX_USAGE);
485}
486