1*7e382390SJung-uk Kim /* flex - tool to generate fast lexical analyzers */ 2*7e382390SJung-uk Kim 3*7e382390SJung-uk Kim /* Copyright (c) 1990 The Regents of the University of California. */ 4*7e382390SJung-uk Kim /* All rights reserved. */ 5*7e382390SJung-uk Kim 6*7e382390SJung-uk Kim /* This code is derived from software contributed to Berkeley by */ 7*7e382390SJung-uk Kim /* Vern Paxson. */ 8*7e382390SJung-uk Kim 9*7e382390SJung-uk Kim /* The United States Government has rights in this work pursuant */ 10*7e382390SJung-uk Kim /* to contract no. DE-AC03-76SF00098 between the United States */ 11*7e382390SJung-uk Kim /* Department of Energy and the University of California. */ 12*7e382390SJung-uk Kim 13*7e382390SJung-uk Kim /* This file is part of flex. */ 14*7e382390SJung-uk Kim 15*7e382390SJung-uk Kim /* Redistribution and use in source and binary forms, with or without */ 16*7e382390SJung-uk Kim /* modification, are permitted provided that the following conditions */ 17*7e382390SJung-uk Kim /* are met: */ 18*7e382390SJung-uk Kim 19*7e382390SJung-uk Kim /* 1. Redistributions of source code must retain the above copyright */ 20*7e382390SJung-uk Kim /* notice, this list of conditions and the following disclaimer. */ 21*7e382390SJung-uk Kim /* 2. Redistributions in binary form must reproduce the above copyright */ 22*7e382390SJung-uk Kim /* notice, this list of conditions and the following disclaimer in the */ 23*7e382390SJung-uk Kim /* documentation and/or other materials provided with the distribution. */ 24*7e382390SJung-uk Kim 25*7e382390SJung-uk Kim /* Neither the name of the University nor the names of its contributors */ 26*7e382390SJung-uk Kim /* may be used to endorse or promote products derived from this software */ 27*7e382390SJung-uk Kim /* without specific prior written permission. */ 28*7e382390SJung-uk Kim 29*7e382390SJung-uk Kim /* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ 30*7e382390SJung-uk Kim /* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ 31*7e382390SJung-uk Kim /* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ 32*7e382390SJung-uk Kim /* PURPOSE. */ 33*7e382390SJung-uk Kim 34*7e382390SJung-uk Kim 35*7e382390SJung-uk Kim #include "flexdef.h" 36*7e382390SJung-uk Kim #include "version.h" 37*7e382390SJung-uk Kim #include "options.h" 38*7e382390SJung-uk Kim #include "tables.h" 39*7e382390SJung-uk Kim #include "parse.h" 40*7e382390SJung-uk Kim 41*7e382390SJung-uk Kim static char flex_version[] = FLEX_VERSION; 42*7e382390SJung-uk Kim 43*7e382390SJung-uk Kim /* declare functions that have forward references */ 44*7e382390SJung-uk Kim 45*7e382390SJung-uk Kim void flexinit(int, char **); 46*7e382390SJung-uk Kim void readin(void); 47*7e382390SJung-uk Kim void set_up_initial_allocations(void); 48*7e382390SJung-uk Kim 49*7e382390SJung-uk Kim 50*7e382390SJung-uk Kim /* these globals are all defined and commented in flexdef.h */ 51*7e382390SJung-uk Kim int printstats, syntaxerror, eofseen, ddebug, trace, nowarn, spprdflt; 52*7e382390SJung-uk Kim int interactive, lex_compat, posix_compat, do_yylineno, 53*7e382390SJung-uk Kim useecs, fulltbl, usemecs; 54*7e382390SJung-uk Kim int fullspd, gen_line_dirs, performance_report, backing_up_report; 55*7e382390SJung-uk Kim int C_plus_plus, long_align, use_read, yytext_is_array, do_yywrap, 56*7e382390SJung-uk Kim csize; 57*7e382390SJung-uk Kim int reentrant, bison_bridge_lval, bison_bridge_lloc; 58*7e382390SJung-uk Kim int yymore_used, reject, real_reject, continued_action, in_rule; 59*7e382390SJung-uk Kim int yymore_really_used, reject_really_used; 60*7e382390SJung-uk Kim int trace_hex = 0; 61*7e382390SJung-uk Kim int datapos, dataline, linenum; 62*7e382390SJung-uk Kim FILE *skelfile = NULL; 63*7e382390SJung-uk Kim int skel_ind = 0; 64*7e382390SJung-uk Kim char *action_array; 65*7e382390SJung-uk Kim int action_size, defs1_offset, prolog_offset, action_offset, 66*7e382390SJung-uk Kim action_index; 67*7e382390SJung-uk Kim char *infilename = NULL, *outfilename = NULL, *headerfilename = NULL; 68*7e382390SJung-uk Kim int did_outfilename; 69*7e382390SJung-uk Kim char *prefix, *yyclass, *extra_type = NULL; 70*7e382390SJung-uk Kim int do_stdinit, use_stdout; 71*7e382390SJung-uk Kim int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE]; 72*7e382390SJung-uk Kim int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; 73*7e382390SJung-uk Kim int maximum_mns, current_mns, current_max_rules; 74*7e382390SJung-uk Kim int num_rules, num_eof_rules, default_rule, lastnfa; 75*7e382390SJung-uk Kim int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2; 76*7e382390SJung-uk Kim int *accptnum, *assoc_rule, *state_type; 77*7e382390SJung-uk Kim int *rule_type, *rule_linenum, *rule_useful; 78*7e382390SJung-uk Kim int current_state_type; 79*7e382390SJung-uk Kim int variable_trailing_context_rules; 80*7e382390SJung-uk Kim int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP]; 81*7e382390SJung-uk Kim int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE]; 82*7e382390SJung-uk Kim int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs, 83*7e382390SJung-uk Kim tecfwd[CSIZE + 1]; 84*7e382390SJung-uk Kim int tecbck[CSIZE + 1]; 85*7e382390SJung-uk Kim int lastsc, *scset, *scbol, *scxclu, *sceof; 86*7e382390SJung-uk Kim int current_max_scs; 87*7e382390SJung-uk Kim char **scname; 88*7e382390SJung-uk Kim int current_max_dfa_size, current_max_xpairs; 89*7e382390SJung-uk Kim int current_max_template_xpairs, current_max_dfas; 90*7e382390SJung-uk Kim int lastdfa, *nxt, *chk, *tnxt; 91*7e382390SJung-uk Kim int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz; 92*7e382390SJung-uk Kim union dfaacc_union *dfaacc; 93*7e382390SJung-uk Kim int *accsiz, *dhash, numas; 94*7e382390SJung-uk Kim int numsnpairs, jambase, jamstate; 95*7e382390SJung-uk Kim int lastccl, *cclmap, *ccllen, *cclng, cclreuse; 96*7e382390SJung-uk Kim int current_maxccls, current_max_ccl_tbl_size; 97*7e382390SJung-uk Kim unsigned char *ccltbl; 98*7e382390SJung-uk Kim char nmstr[MAXLINE]; 99*7e382390SJung-uk Kim int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; 100*7e382390SJung-uk Kim int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; 101*7e382390SJung-uk Kim int num_backing_up, bol_needed; 102*7e382390SJung-uk Kim FILE *backing_up_file; 103*7e382390SJung-uk Kim int end_of_buffer_state; 104*7e382390SJung-uk Kim char **input_files; 105*7e382390SJung-uk Kim int num_input_files; 106*7e382390SJung-uk Kim jmp_buf flex_main_jmp_buf; 107*7e382390SJung-uk Kim bool *rule_has_nl, *ccl_has_nl; 108*7e382390SJung-uk Kim int nlch = '\n'; 109*7e382390SJung-uk Kim 110*7e382390SJung-uk Kim bool tablesext, tablesverify, gentables; 111*7e382390SJung-uk Kim char *tablesfilename=0,*tablesname=0; 112*7e382390SJung-uk Kim struct yytbl_writer tableswr; 113*7e382390SJung-uk Kim 114*7e382390SJung-uk Kim /* Make sure program_name is initialized so we don't crash if writing 115*7e382390SJung-uk Kim * out an error message before getting the program name from argv[0]. 116*7e382390SJung-uk Kim */ 117*7e382390SJung-uk Kim char *program_name = "flex"; 118*7e382390SJung-uk Kim 119*7e382390SJung-uk Kim static const char outfile_template[] = "lex.%s.%s"; 120*7e382390SJung-uk Kim static const char backing_name[] = "lex.backup"; 121*7e382390SJung-uk Kim static const char tablesfile_template[] = "lex.%s.tables"; 122*7e382390SJung-uk Kim 123*7e382390SJung-uk Kim /* From scan.l */ 124*7e382390SJung-uk Kim extern FILE* yyout; 125*7e382390SJung-uk Kim 126*7e382390SJung-uk Kim static char outfile_path[MAXLINE]; 127*7e382390SJung-uk Kim static int outfile_created = 0; 128*7e382390SJung-uk Kim static char *skelname = NULL; 129*7e382390SJung-uk Kim static int _stdout_closed = 0; /* flag to prevent double-fclose() on stdout. */ 130*7e382390SJung-uk Kim const char *escaped_qstart = "]]M4_YY_NOOP[M4_YY_NOOP[M4_YY_NOOP[["; 131*7e382390SJung-uk Kim const char *escaped_qend = "]]M4_YY_NOOP]M4_YY_NOOP]M4_YY_NOOP[["; 132*7e382390SJung-uk Kim 133*7e382390SJung-uk Kim /* For debugging. The max number of filters to apply to skeleton. */ 134*7e382390SJung-uk Kim static int preproc_level = 1000; 135*7e382390SJung-uk Kim 136*7e382390SJung-uk Kim int flex_main (int argc, char *argv[]); 137*7e382390SJung-uk Kim 138*7e382390SJung-uk Kim int flex_main (int argc, char *argv[]) 139*7e382390SJung-uk Kim { 140*7e382390SJung-uk Kim int i, exit_status, child_status; 141*7e382390SJung-uk Kim 142*7e382390SJung-uk Kim /* Set a longjmp target. Yes, I know it's a hack, but it gets worse: The 143*7e382390SJung-uk Kim * return value of setjmp, if non-zero, is the desired exit code PLUS ONE. 144*7e382390SJung-uk Kim * For example, if you want 'main' to return with code '2', then call 145*7e382390SJung-uk Kim * longjmp() with an argument of 3. This is because it is invalid to 146*7e382390SJung-uk Kim * specify a value of 0 to longjmp. FLEX_EXIT(n) should be used instead of 147*7e382390SJung-uk Kim * exit(n); 148*7e382390SJung-uk Kim */ 149*7e382390SJung-uk Kim exit_status = setjmp (flex_main_jmp_buf); 150*7e382390SJung-uk Kim if (exit_status){ 151*7e382390SJung-uk Kim if (stdout && !_stdout_closed && !ferror(stdout)){ 152*7e382390SJung-uk Kim fflush(stdout); 153*7e382390SJung-uk Kim fclose(stdout); 154*7e382390SJung-uk Kim } 155*7e382390SJung-uk Kim while (wait(&child_status) > 0){ 156*7e382390SJung-uk Kim if (!WIFEXITED (child_status) 157*7e382390SJung-uk Kim || WEXITSTATUS (child_status) != 0){ 158*7e382390SJung-uk Kim /* report an error of a child 159*7e382390SJung-uk Kim */ 160*7e382390SJung-uk Kim if( exit_status <= 1 ) 161*7e382390SJung-uk Kim exit_status = 2; 162*7e382390SJung-uk Kim 163*7e382390SJung-uk Kim } 164*7e382390SJung-uk Kim } 165*7e382390SJung-uk Kim return exit_status - 1; 166*7e382390SJung-uk Kim } 167*7e382390SJung-uk Kim 168*7e382390SJung-uk Kim flexinit (argc, argv); 169*7e382390SJung-uk Kim 170*7e382390SJung-uk Kim readin (); 171*7e382390SJung-uk Kim 172*7e382390SJung-uk Kim skelout (); 173*7e382390SJung-uk Kim /* %% [1.5] DFA */ 174*7e382390SJung-uk Kim ntod (); 175*7e382390SJung-uk Kim 176*7e382390SJung-uk Kim for (i = 1; i <= num_rules; ++i) 177*7e382390SJung-uk Kim if (!rule_useful[i] && i != default_rule) 178*7e382390SJung-uk Kim line_warning (_("rule cannot be matched"), 179*7e382390SJung-uk Kim rule_linenum[i]); 180*7e382390SJung-uk Kim 181*7e382390SJung-uk Kim if (spprdflt && !reject && rule_useful[default_rule]) 182*7e382390SJung-uk Kim line_warning (_ 183*7e382390SJung-uk Kim ("-s option given but default rule can be matched"), 184*7e382390SJung-uk Kim rule_linenum[default_rule]); 185*7e382390SJung-uk Kim 186*7e382390SJung-uk Kim /* Generate the C state transition tables from the DFA. */ 187*7e382390SJung-uk Kim make_tables (); 188*7e382390SJung-uk Kim 189*7e382390SJung-uk Kim /* Note, flexend does not return. It exits with its argument 190*7e382390SJung-uk Kim * as status. 191*7e382390SJung-uk Kim */ 192*7e382390SJung-uk Kim flexend (0); 193*7e382390SJung-uk Kim 194*7e382390SJung-uk Kim return 0; /* keep compilers/lint happy */ 195*7e382390SJung-uk Kim } 196*7e382390SJung-uk Kim 197*7e382390SJung-uk Kim /* Wrapper around flex_main, so flex_main can be built as a library. */ 198*7e382390SJung-uk Kim int main (int argc, char *argv[]) 199*7e382390SJung-uk Kim { 200*7e382390SJung-uk Kim #if ENABLE_NLS 201*7e382390SJung-uk Kim #if HAVE_LOCALE_H 202*7e382390SJung-uk Kim setlocale (LC_MESSAGES, ""); 203*7e382390SJung-uk Kim setlocale (LC_CTYPE, ""); 204*7e382390SJung-uk Kim textdomain (PACKAGE); 205*7e382390SJung-uk Kim bindtextdomain (PACKAGE, LOCALEDIR); 206*7e382390SJung-uk Kim #endif 207*7e382390SJung-uk Kim #endif 208*7e382390SJung-uk Kim 209*7e382390SJung-uk Kim return flex_main (argc, argv); 210*7e382390SJung-uk Kim } 211*7e382390SJung-uk Kim 212*7e382390SJung-uk Kim /* check_options - check user-specified options */ 213*7e382390SJung-uk Kim 214*7e382390SJung-uk Kim void check_options (void) 215*7e382390SJung-uk Kim { 216*7e382390SJung-uk Kim int i; 217*7e382390SJung-uk Kim const char * m4 = NULL; 218*7e382390SJung-uk Kim 219*7e382390SJung-uk Kim if (lex_compat) { 220*7e382390SJung-uk Kim if (C_plus_plus) 221*7e382390SJung-uk Kim flexerror (_("Can't use -+ with -l option")); 222*7e382390SJung-uk Kim 223*7e382390SJung-uk Kim if (fulltbl || fullspd) 224*7e382390SJung-uk Kim flexerror (_("Can't use -f or -F with -l option")); 225*7e382390SJung-uk Kim 226*7e382390SJung-uk Kim if (reentrant || bison_bridge_lval) 227*7e382390SJung-uk Kim flexerror (_ 228*7e382390SJung-uk Kim ("Can't use --reentrant or --bison-bridge with -l option")); 229*7e382390SJung-uk Kim 230*7e382390SJung-uk Kim yytext_is_array = true; 231*7e382390SJung-uk Kim do_yylineno = true; 232*7e382390SJung-uk Kim use_read = false; 233*7e382390SJung-uk Kim } 234*7e382390SJung-uk Kim 235*7e382390SJung-uk Kim 236*7e382390SJung-uk Kim #if 0 237*7e382390SJung-uk Kim /* This makes no sense whatsoever. I'm removing it. */ 238*7e382390SJung-uk Kim if (do_yylineno) 239*7e382390SJung-uk Kim /* This should really be "maintain_backup_tables = true" */ 240*7e382390SJung-uk Kim reject_really_used = true; 241*7e382390SJung-uk Kim #endif 242*7e382390SJung-uk Kim 243*7e382390SJung-uk Kim if (csize == unspecified) { 244*7e382390SJung-uk Kim if ((fulltbl || fullspd) && !useecs) 245*7e382390SJung-uk Kim csize = DEFAULT_CSIZE; 246*7e382390SJung-uk Kim else 247*7e382390SJung-uk Kim csize = CSIZE; 248*7e382390SJung-uk Kim } 249*7e382390SJung-uk Kim 250*7e382390SJung-uk Kim if (interactive == unspecified) { 251*7e382390SJung-uk Kim if (fulltbl || fullspd) 252*7e382390SJung-uk Kim interactive = false; 253*7e382390SJung-uk Kim else 254*7e382390SJung-uk Kim interactive = true; 255*7e382390SJung-uk Kim } 256*7e382390SJung-uk Kim 257*7e382390SJung-uk Kim if (fulltbl || fullspd) { 258*7e382390SJung-uk Kim if (usemecs) 259*7e382390SJung-uk Kim flexerror (_ 260*7e382390SJung-uk Kim ("-Cf/-CF and -Cm don't make sense together")); 261*7e382390SJung-uk Kim 262*7e382390SJung-uk Kim if (interactive) 263*7e382390SJung-uk Kim flexerror (_("-Cf/-CF and -I are incompatible")); 264*7e382390SJung-uk Kim 265*7e382390SJung-uk Kim if (lex_compat) 266*7e382390SJung-uk Kim flexerror (_ 267*7e382390SJung-uk Kim ("-Cf/-CF are incompatible with lex-compatibility mode")); 268*7e382390SJung-uk Kim 269*7e382390SJung-uk Kim 270*7e382390SJung-uk Kim if (fulltbl && fullspd) 271*7e382390SJung-uk Kim flexerror (_ 272*7e382390SJung-uk Kim ("-Cf and -CF are mutually exclusive")); 273*7e382390SJung-uk Kim } 274*7e382390SJung-uk Kim 275*7e382390SJung-uk Kim if (C_plus_plus && fullspd) 276*7e382390SJung-uk Kim flexerror (_("Can't use -+ with -CF option")); 277*7e382390SJung-uk Kim 278*7e382390SJung-uk Kim if (C_plus_plus && yytext_is_array) { 279*7e382390SJung-uk Kim lwarn (_("%array incompatible with -+ option")); 280*7e382390SJung-uk Kim yytext_is_array = false; 281*7e382390SJung-uk Kim } 282*7e382390SJung-uk Kim 283*7e382390SJung-uk Kim if (C_plus_plus && (reentrant)) 284*7e382390SJung-uk Kim flexerror (_("Options -+ and --reentrant are mutually exclusive.")); 285*7e382390SJung-uk Kim 286*7e382390SJung-uk Kim if (C_plus_plus && bison_bridge_lval) 287*7e382390SJung-uk Kim flexerror (_("bison bridge not supported for the C++ scanner.")); 288*7e382390SJung-uk Kim 289*7e382390SJung-uk Kim 290*7e382390SJung-uk Kim if (useecs) { /* Set up doubly-linked equivalence classes. */ 291*7e382390SJung-uk Kim 292*7e382390SJung-uk Kim /* We loop all the way up to csize, since ecgroup[csize] is 293*7e382390SJung-uk Kim * the position used for NUL characters. 294*7e382390SJung-uk Kim */ 295*7e382390SJung-uk Kim ecgroup[1] = NIL; 296*7e382390SJung-uk Kim 297*7e382390SJung-uk Kim for (i = 2; i <= csize; ++i) { 298*7e382390SJung-uk Kim ecgroup[i] = i - 1; 299*7e382390SJung-uk Kim nextecm[i - 1] = i; 300*7e382390SJung-uk Kim } 301*7e382390SJung-uk Kim 302*7e382390SJung-uk Kim nextecm[csize] = NIL; 303*7e382390SJung-uk Kim } 304*7e382390SJung-uk Kim 305*7e382390SJung-uk Kim else { 306*7e382390SJung-uk Kim /* Put everything in its own equivalence class. */ 307*7e382390SJung-uk Kim for (i = 1; i <= csize; ++i) { 308*7e382390SJung-uk Kim ecgroup[i] = i; 309*7e382390SJung-uk Kim nextecm[i] = BAD_SUBSCRIPT; /* to catch errors */ 310*7e382390SJung-uk Kim } 311*7e382390SJung-uk Kim } 312*7e382390SJung-uk Kim 313*7e382390SJung-uk Kim if (extra_type) 314*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_EXTRA_TYPE_DEFS", extra_type); 315*7e382390SJung-uk Kim 316*7e382390SJung-uk Kim if (!use_stdout) { 317*7e382390SJung-uk Kim FILE *prev_stdout; 318*7e382390SJung-uk Kim 319*7e382390SJung-uk Kim if (!did_outfilename) { 320*7e382390SJung-uk Kim char *suffix; 321*7e382390SJung-uk Kim 322*7e382390SJung-uk Kim if (C_plus_plus) 323*7e382390SJung-uk Kim suffix = "cc"; 324*7e382390SJung-uk Kim else 325*7e382390SJung-uk Kim suffix = "c"; 326*7e382390SJung-uk Kim 327*7e382390SJung-uk Kim snprintf (outfile_path, sizeof(outfile_path), outfile_template, 328*7e382390SJung-uk Kim prefix, suffix); 329*7e382390SJung-uk Kim 330*7e382390SJung-uk Kim outfilename = outfile_path; 331*7e382390SJung-uk Kim } 332*7e382390SJung-uk Kim 333*7e382390SJung-uk Kim prev_stdout = freopen (outfilename, "w+", stdout); 334*7e382390SJung-uk Kim 335*7e382390SJung-uk Kim if (prev_stdout == NULL) 336*7e382390SJung-uk Kim lerr (_("could not create %s"), outfilename); 337*7e382390SJung-uk Kim 338*7e382390SJung-uk Kim outfile_created = 1; 339*7e382390SJung-uk Kim } 340*7e382390SJung-uk Kim 341*7e382390SJung-uk Kim 342*7e382390SJung-uk Kim /* Setup the filter chain. */ 343*7e382390SJung-uk Kim output_chain = filter_create_int(NULL, filter_tee_header, headerfilename); 344*7e382390SJung-uk Kim if ( !(m4 = getenv("M4"))) { 345*7e382390SJung-uk Kim char *slash; 346*7e382390SJung-uk Kim m4 = M4; 347*7e382390SJung-uk Kim if ((slash = strrchr(M4, '/')) != NULL) { 348*7e382390SJung-uk Kim m4 = slash+1; 349*7e382390SJung-uk Kim /* break up $PATH */ 350*7e382390SJung-uk Kim const char *path = getenv("PATH"); 351*7e382390SJung-uk Kim if (!path) { 352*7e382390SJung-uk Kim m4 = M4; 353*7e382390SJung-uk Kim } else { 354*7e382390SJung-uk Kim int m4_length = strlen(m4); 355*7e382390SJung-uk Kim do { 356*7e382390SJung-uk Kim size_t length = strlen(path); 357*7e382390SJung-uk Kim struct stat sbuf; 358*7e382390SJung-uk Kim 359*7e382390SJung-uk Kim const char *endOfDir = strchr(path, ':'); 360*7e382390SJung-uk Kim if (!endOfDir) 361*7e382390SJung-uk Kim endOfDir = path+length; 362*7e382390SJung-uk Kim 363*7e382390SJung-uk Kim { 364*7e382390SJung-uk Kim char *m4_path = calloc(endOfDir-path + 1 + m4_length + 1, 1); 365*7e382390SJung-uk Kim 366*7e382390SJung-uk Kim memcpy(m4_path, path, endOfDir-path); 367*7e382390SJung-uk Kim m4_path[endOfDir-path] = '/'; 368*7e382390SJung-uk Kim memcpy(m4_path + (endOfDir-path) + 1, m4, m4_length + 1); 369*7e382390SJung-uk Kim if (stat(m4_path, &sbuf) == 0 && 370*7e382390SJung-uk Kim (S_ISREG(sbuf.st_mode)) && sbuf.st_mode & S_IXUSR) { 371*7e382390SJung-uk Kim m4 = m4_path; 372*7e382390SJung-uk Kim break; 373*7e382390SJung-uk Kim } 374*7e382390SJung-uk Kim free(m4_path); 375*7e382390SJung-uk Kim } 376*7e382390SJung-uk Kim path = endOfDir+1; 377*7e382390SJung-uk Kim } while (path[0]); 378*7e382390SJung-uk Kim if (!path[0]) 379*7e382390SJung-uk Kim m4 = M4; 380*7e382390SJung-uk Kim } 381*7e382390SJung-uk Kim } 382*7e382390SJung-uk Kim } 383*7e382390SJung-uk Kim filter_create_ext(output_chain, m4, "-gP", 0); 384*7e382390SJung-uk Kim filter_create_int(output_chain, filter_fix_linedirs, NULL); 385*7e382390SJung-uk Kim 386*7e382390SJung-uk Kim /* For debugging, only run the requested number of filters. */ 387*7e382390SJung-uk Kim if (preproc_level > 0) { 388*7e382390SJung-uk Kim filter_truncate(output_chain, preproc_level); 389*7e382390SJung-uk Kim filter_apply_chain(output_chain); 390*7e382390SJung-uk Kim } 391*7e382390SJung-uk Kim yyout = stdout; 392*7e382390SJung-uk Kim 393*7e382390SJung-uk Kim 394*7e382390SJung-uk Kim /* always generate the tablesverify flag. */ 395*7e382390SJung-uk Kim buf_m4_define (&m4defs_buf, "M4_YY_TABLES_VERIFY", tablesverify ? "1" : "0"); 396*7e382390SJung-uk Kim if (tablesext) 397*7e382390SJung-uk Kim gentables = false; 398*7e382390SJung-uk Kim 399*7e382390SJung-uk Kim if (tablesverify) 400*7e382390SJung-uk Kim /* force generation of C tables. */ 401*7e382390SJung-uk Kim gentables = true; 402*7e382390SJung-uk Kim 403*7e382390SJung-uk Kim 404*7e382390SJung-uk Kim if (tablesext) { 405*7e382390SJung-uk Kim FILE *tablesout; 406*7e382390SJung-uk Kim struct yytbl_hdr hdr; 407*7e382390SJung-uk Kim char *pname = 0; 408*7e382390SJung-uk Kim size_t nbytes = 0; 409*7e382390SJung-uk Kim 410*7e382390SJung-uk Kim buf_m4_define (&m4defs_buf, "M4_YY_TABLES_EXTERNAL", NULL); 411*7e382390SJung-uk Kim 412*7e382390SJung-uk Kim if (!tablesfilename) { 413*7e382390SJung-uk Kim nbytes = strlen (prefix) + strlen (tablesfile_template) + 2; 414*7e382390SJung-uk Kim tablesfilename = pname = calloc(nbytes, 1); 415*7e382390SJung-uk Kim snprintf (pname, nbytes, tablesfile_template, prefix); 416*7e382390SJung-uk Kim } 417*7e382390SJung-uk Kim 418*7e382390SJung-uk Kim if ((tablesout = fopen (tablesfilename, "w")) == NULL) 419*7e382390SJung-uk Kim lerr (_("could not create %s"), tablesfilename); 420*7e382390SJung-uk Kim free(pname); 421*7e382390SJung-uk Kim tablesfilename = 0; 422*7e382390SJung-uk Kim 423*7e382390SJung-uk Kim yytbl_writer_init (&tableswr, tablesout); 424*7e382390SJung-uk Kim 425*7e382390SJung-uk Kim nbytes = strlen (prefix) + strlen ("tables") + 2; 426*7e382390SJung-uk Kim tablesname = calloc(nbytes, 1); 427*7e382390SJung-uk Kim snprintf (tablesname, nbytes, "%stables", prefix); 428*7e382390SJung-uk Kim yytbl_hdr_init (&hdr, flex_version, tablesname); 429*7e382390SJung-uk Kim 430*7e382390SJung-uk Kim if (yytbl_hdr_fwrite (&tableswr, &hdr) <= 0) 431*7e382390SJung-uk Kim flexerror (_("could not write tables header")); 432*7e382390SJung-uk Kim } 433*7e382390SJung-uk Kim 434*7e382390SJung-uk Kim if (skelname && (skelfile = fopen (skelname, "r")) == NULL) 435*7e382390SJung-uk Kim lerr (_("can't open skeleton file %s"), skelname); 436*7e382390SJung-uk Kim 437*7e382390SJung-uk Kim if (reentrant) { 438*7e382390SJung-uk Kim buf_m4_define (&m4defs_buf, "M4_YY_REENTRANT", NULL); 439*7e382390SJung-uk Kim if (yytext_is_array) 440*7e382390SJung-uk Kim buf_m4_define (&m4defs_buf, "M4_YY_TEXT_IS_ARRAY", NULL); 441*7e382390SJung-uk Kim } 442*7e382390SJung-uk Kim 443*7e382390SJung-uk Kim if ( bison_bridge_lval) 444*7e382390SJung-uk Kim buf_m4_define (&m4defs_buf, "M4_YY_BISON_LVAL", NULL); 445*7e382390SJung-uk Kim 446*7e382390SJung-uk Kim if ( bison_bridge_lloc) 447*7e382390SJung-uk Kim buf_m4_define (&m4defs_buf, "<M4_YY_BISON_LLOC>", NULL); 448*7e382390SJung-uk Kim 449*7e382390SJung-uk Kim if (strchr(prefix, '[') || strchr(prefix, ']')) 450*7e382390SJung-uk Kim flexerror(_("Prefix cannot include '[' or ']'")); 451*7e382390SJung-uk Kim buf_m4_define(&m4defs_buf, "M4_YY_PREFIX", prefix); 452*7e382390SJung-uk Kim 453*7e382390SJung-uk Kim if (did_outfilename) 454*7e382390SJung-uk Kim line_directive_out (stdout, 0); 455*7e382390SJung-uk Kim 456*7e382390SJung-uk Kim if (do_yylineno) 457*7e382390SJung-uk Kim buf_m4_define (&m4defs_buf, "M4_YY_USE_LINENO", NULL); 458*7e382390SJung-uk Kim 459*7e382390SJung-uk Kim /* Create the alignment type. */ 460*7e382390SJung-uk Kim buf_strdefine (&userdef_buf, "YY_INT_ALIGNED", 461*7e382390SJung-uk Kim long_align ? "long int" : "short int"); 462*7e382390SJung-uk Kim 463*7e382390SJung-uk Kim /* Define the start condition macros. */ 464*7e382390SJung-uk Kim { 465*7e382390SJung-uk Kim struct Buf tmpbuf; 466*7e382390SJung-uk Kim buf_init(&tmpbuf, sizeof(char)); 467*7e382390SJung-uk Kim for (i = 1; i <= lastsc; i++) { 468*7e382390SJung-uk Kim char *str, *fmt = "#define %s %d\n"; 469*7e382390SJung-uk Kim size_t strsz; 470*7e382390SJung-uk Kim 471*7e382390SJung-uk Kim strsz = strlen(fmt) + strlen(scname[i]) + NUMCHARLINES + 2; 472*7e382390SJung-uk Kim str = malloc(strsz); 473*7e382390SJung-uk Kim if (!str) 474*7e382390SJung-uk Kim flexfatal(_("allocation of macro definition failed")); 475*7e382390SJung-uk Kim snprintf(str, strsz, fmt, scname[i], i - 1); 476*7e382390SJung-uk Kim buf_strappend(&tmpbuf, str); 477*7e382390SJung-uk Kim free(str); 478*7e382390SJung-uk Kim } 479*7e382390SJung-uk Kim buf_m4_define(&m4defs_buf, "M4_YY_SC_DEFS", tmpbuf.elts); 480*7e382390SJung-uk Kim buf_destroy(&tmpbuf); 481*7e382390SJung-uk Kim } 482*7e382390SJung-uk Kim 483*7e382390SJung-uk Kim /* This is where we begin writing to the file. */ 484*7e382390SJung-uk Kim 485*7e382390SJung-uk Kim /* Dump the %top code. */ 486*7e382390SJung-uk Kim if( top_buf.elts) 487*7e382390SJung-uk Kim outn((char*) top_buf.elts); 488*7e382390SJung-uk Kim 489*7e382390SJung-uk Kim /* Dump the m4 definitions. */ 490*7e382390SJung-uk Kim buf_print_strings(&m4defs_buf, stdout); 491*7e382390SJung-uk Kim m4defs_buf.nelts = 0; /* memory leak here. */ 492*7e382390SJung-uk Kim 493*7e382390SJung-uk Kim /* Place a bogus line directive, it will be fixed in the filter. */ 494*7e382390SJung-uk Kim if (gen_line_dirs) 495*7e382390SJung-uk Kim outn("#line 0 \"M4_YY_OUTFILE_NAME\"\n"); 496*7e382390SJung-uk Kim 497*7e382390SJung-uk Kim /* Dump the user defined preproc directives. */ 498*7e382390SJung-uk Kim if (userdef_buf.elts) 499*7e382390SJung-uk Kim outn ((char *) (userdef_buf.elts)); 500*7e382390SJung-uk Kim 501*7e382390SJung-uk Kim skelout (); 502*7e382390SJung-uk Kim /* %% [1.0] */ 503*7e382390SJung-uk Kim } 504*7e382390SJung-uk Kim 505*7e382390SJung-uk Kim /* flexend - terminate flex 506*7e382390SJung-uk Kim * 507*7e382390SJung-uk Kim * note 508*7e382390SJung-uk Kim * This routine does not return. 509*7e382390SJung-uk Kim */ 510*7e382390SJung-uk Kim 511*7e382390SJung-uk Kim void flexend (int exit_status) 512*7e382390SJung-uk Kim { 513*7e382390SJung-uk Kim static int called_before = -1; /* prevent infinite recursion. */ 514*7e382390SJung-uk Kim int tblsiz; 515*7e382390SJung-uk Kim 516*7e382390SJung-uk Kim if (++called_before) 517*7e382390SJung-uk Kim FLEX_EXIT (exit_status); 518*7e382390SJung-uk Kim 519*7e382390SJung-uk Kim if (skelfile != NULL) { 520*7e382390SJung-uk Kim if (ferror (skelfile)) 521*7e382390SJung-uk Kim lerr (_("input error reading skeleton file %s"), 522*7e382390SJung-uk Kim skelname); 523*7e382390SJung-uk Kim 524*7e382390SJung-uk Kim else if (fclose (skelfile)) 525*7e382390SJung-uk Kim lerr (_("error closing skeleton file %s"), 526*7e382390SJung-uk Kim skelname); 527*7e382390SJung-uk Kim } 528*7e382390SJung-uk Kim 529*7e382390SJung-uk Kim #if 0 530*7e382390SJung-uk Kim fprintf (header_out, 531*7e382390SJung-uk Kim "#ifdef YY_HEADER_EXPORT_START_CONDITIONS\n"); 532*7e382390SJung-uk Kim fprintf (header_out, 533*7e382390SJung-uk Kim "/* Beware! Start conditions are not prefixed. */\n"); 534*7e382390SJung-uk Kim 535*7e382390SJung-uk Kim /* Special case for "INITIAL" */ 536*7e382390SJung-uk Kim fprintf (header_out, 537*7e382390SJung-uk Kim "#undef INITIAL\n#define INITIAL 0\n"); 538*7e382390SJung-uk Kim for (i = 2; i <= lastsc; i++) 539*7e382390SJung-uk Kim fprintf (header_out, "#define %s %d\n", scname[i], i - 1); 540*7e382390SJung-uk Kim fprintf (header_out, 541*7e382390SJung-uk Kim "#endif /* YY_HEADER_EXPORT_START_CONDITIONS */\n\n"); 542*7e382390SJung-uk Kim 543*7e382390SJung-uk Kim /* Kill ALL flex-related macros. This is so the user 544*7e382390SJung-uk Kim * can #include more than one generated header file. */ 545*7e382390SJung-uk Kim fprintf (header_out, "#ifndef YY_HEADER_NO_UNDEFS\n"); 546*7e382390SJung-uk Kim fprintf (header_out, 547*7e382390SJung-uk Kim "/* Undefine all internal macros, etc., that do no belong in the header. */\n\n"); 548*7e382390SJung-uk Kim 549*7e382390SJung-uk Kim { 550*7e382390SJung-uk Kim const char * undef_list[] = { 551*7e382390SJung-uk Kim 552*7e382390SJung-uk Kim "BEGIN", 553*7e382390SJung-uk Kim "ECHO", 554*7e382390SJung-uk Kim "EOB_ACT_CONTINUE_SCAN", 555*7e382390SJung-uk Kim "EOB_ACT_END_OF_FILE", 556*7e382390SJung-uk Kim "EOB_ACT_LAST_MATCH", 557*7e382390SJung-uk Kim "FLEX_SCANNER", 558*7e382390SJung-uk Kim "REJECT", 559*7e382390SJung-uk Kim "YYFARGS0", 560*7e382390SJung-uk Kim "YYFARGS1", 561*7e382390SJung-uk Kim "YYFARGS2", 562*7e382390SJung-uk Kim "YYFARGS3", 563*7e382390SJung-uk Kim "YYLMAX", 564*7e382390SJung-uk Kim "YYSTATE", 565*7e382390SJung-uk Kim "YY_AT_BOL", 566*7e382390SJung-uk Kim "YY_BREAK", 567*7e382390SJung-uk Kim "YY_BUFFER_EOF_PENDING", 568*7e382390SJung-uk Kim "YY_BUFFER_NEW", 569*7e382390SJung-uk Kim "YY_BUFFER_NORMAL", 570*7e382390SJung-uk Kim "YY_BUF_SIZE", 571*7e382390SJung-uk Kim "M4_YY_CALL_LAST_ARG", 572*7e382390SJung-uk Kim "M4_YY_CALL_ONLY_ARG", 573*7e382390SJung-uk Kim "YY_CURRENT_BUFFER", 574*7e382390SJung-uk Kim "YY_DECL", 575*7e382390SJung-uk Kim "M4_YY_DECL_LAST_ARG", 576*7e382390SJung-uk Kim "M4_YY_DEF_LAST_ARG", 577*7e382390SJung-uk Kim "M4_YY_DEF_ONLY_ARG", 578*7e382390SJung-uk Kim "YY_DO_BEFORE_ACTION", 579*7e382390SJung-uk Kim "YY_END_OF_BUFFER", 580*7e382390SJung-uk Kim "YY_END_OF_BUFFER_CHAR", 581*7e382390SJung-uk Kim "YY_EXIT_FAILURE", 582*7e382390SJung-uk Kim "YY_EXTRA_TYPE", 583*7e382390SJung-uk Kim "YY_FATAL_ERROR", 584*7e382390SJung-uk Kim "YY_FLEX_DEFINED_ECHO", 585*7e382390SJung-uk Kim "YY_FLEX_LEX_COMPAT", 586*7e382390SJung-uk Kim "YY_FLEX_MAJOR_VERSION", 587*7e382390SJung-uk Kim "YY_FLEX_MINOR_VERSION", 588*7e382390SJung-uk Kim "YY_FLEX_SUBMINOR_VERSION", 589*7e382390SJung-uk Kim "YY_FLUSH_BUFFER", 590*7e382390SJung-uk Kim "YY_G", 591*7e382390SJung-uk Kim "YY_INPUT", 592*7e382390SJung-uk Kim "YY_INTERACTIVE", 593*7e382390SJung-uk Kim "YY_INT_ALIGNED", 594*7e382390SJung-uk Kim "YY_LAST_ARG", 595*7e382390SJung-uk Kim "YY_LESS_LINENO", 596*7e382390SJung-uk Kim "YY_LEX_ARGS", 597*7e382390SJung-uk Kim "YY_LEX_DECLARATION", 598*7e382390SJung-uk Kim "YY_LEX_PROTO", 599*7e382390SJung-uk Kim "YY_MAIN", 600*7e382390SJung-uk Kim "YY_MORE_ADJ", 601*7e382390SJung-uk Kim "YY_NEED_STRLEN", 602*7e382390SJung-uk Kim "YY_NEW_FILE", 603*7e382390SJung-uk Kim "YY_NULL", 604*7e382390SJung-uk Kim "YY_NUM_RULES", 605*7e382390SJung-uk Kim "YY_ONLY_ARG", 606*7e382390SJung-uk Kim "YY_PARAMS", 607*7e382390SJung-uk Kim "YY_PROTO", 608*7e382390SJung-uk Kim "M4_YY_PROTO_LAST_ARG", 609*7e382390SJung-uk Kim "M4_YY_PROTO_ONLY_ARG void", 610*7e382390SJung-uk Kim "YY_READ_BUF_SIZE", 611*7e382390SJung-uk Kim "YY_REENTRANT", 612*7e382390SJung-uk Kim "YY_RESTORE_YY_MORE_OFFSET", 613*7e382390SJung-uk Kim "YY_RULE_SETUP", 614*7e382390SJung-uk Kim "YY_SC_TO_UI", 615*7e382390SJung-uk Kim "YY_SKIP_YYWRAP", 616*7e382390SJung-uk Kim "YY_START", 617*7e382390SJung-uk Kim "YY_START_STACK_INCR", 618*7e382390SJung-uk Kim "YY_STATE_EOF", 619*7e382390SJung-uk Kim "YY_STDINIT", 620*7e382390SJung-uk Kim "YY_TRAILING_HEAD_MASK", 621*7e382390SJung-uk Kim "YY_TRAILING_MASK", 622*7e382390SJung-uk Kim "YY_USER_ACTION", 623*7e382390SJung-uk Kim "YY_USE_CONST", 624*7e382390SJung-uk Kim "YY_USE_PROTOS", 625*7e382390SJung-uk Kim "unput", 626*7e382390SJung-uk Kim "yyTABLES_NAME", 627*7e382390SJung-uk Kim "yy_create_buffer", 628*7e382390SJung-uk Kim "yy_delete_buffer", 629*7e382390SJung-uk Kim "yy_flex_debug", 630*7e382390SJung-uk Kim "yy_flush_buffer", 631*7e382390SJung-uk Kim "yy_init_buffer", 632*7e382390SJung-uk Kim "yy_load_buffer_state", 633*7e382390SJung-uk Kim "yy_new_buffer", 634*7e382390SJung-uk Kim "yy_scan_buffer", 635*7e382390SJung-uk Kim "yy_scan_bytes", 636*7e382390SJung-uk Kim "yy_scan_string", 637*7e382390SJung-uk Kim "yy_set_bol", 638*7e382390SJung-uk Kim "yy_set_interactive", 639*7e382390SJung-uk Kim "yy_switch_to_buffer", 640*7e382390SJung-uk Kim "yypush_buffer_state", 641*7e382390SJung-uk Kim "yypop_buffer_state", 642*7e382390SJung-uk Kim "yyensure_buffer_stack", 643*7e382390SJung-uk Kim "yyalloc", 644*7e382390SJung-uk Kim "const", 645*7e382390SJung-uk Kim "yyextra", 646*7e382390SJung-uk Kim "yyfree", 647*7e382390SJung-uk Kim "yyget_debug", 648*7e382390SJung-uk Kim "yyget_extra", 649*7e382390SJung-uk Kim "yyget_in", 650*7e382390SJung-uk Kim "yyget_leng", 651*7e382390SJung-uk Kim "yyget_lineno", 652*7e382390SJung-uk Kim "yyget_lloc", 653*7e382390SJung-uk Kim "yyget_lval", 654*7e382390SJung-uk Kim "yyget_out", 655*7e382390SJung-uk Kim "yyget_text", 656*7e382390SJung-uk Kim "yyin", 657*7e382390SJung-uk Kim "yyleng", 658*7e382390SJung-uk Kim "yyless", 659*7e382390SJung-uk Kim "yylex", 660*7e382390SJung-uk Kim "yylex_destroy", 661*7e382390SJung-uk Kim "yylex_init", 662*7e382390SJung-uk Kim "yylex_init_extra", 663*7e382390SJung-uk Kim "yylineno", 664*7e382390SJung-uk Kim "yylloc", 665*7e382390SJung-uk Kim "yylval", 666*7e382390SJung-uk Kim "yymore", 667*7e382390SJung-uk Kim "yyout", 668*7e382390SJung-uk Kim "yyrealloc", 669*7e382390SJung-uk Kim "yyrestart", 670*7e382390SJung-uk Kim "yyset_debug", 671*7e382390SJung-uk Kim "yyset_extra", 672*7e382390SJung-uk Kim "yyset_in", 673*7e382390SJung-uk Kim "yyset_lineno", 674*7e382390SJung-uk Kim "yyset_lloc", 675*7e382390SJung-uk Kim "yyset_lval", 676*7e382390SJung-uk Kim "yyset_out", 677*7e382390SJung-uk Kim "yytables_destroy", 678*7e382390SJung-uk Kim "yytables_fload", 679*7e382390SJung-uk Kim "yyterminate", 680*7e382390SJung-uk Kim "yytext", 681*7e382390SJung-uk Kim "yytext_ptr", 682*7e382390SJung-uk Kim "yywrap", 683*7e382390SJung-uk Kim 684*7e382390SJung-uk Kim /* must be null-terminated */ 685*7e382390SJung-uk Kim NULL}; 686*7e382390SJung-uk Kim 687*7e382390SJung-uk Kim 688*7e382390SJung-uk Kim for (i=0; undef_list[i] != NULL; i++) 689*7e382390SJung-uk Kim fprintf (header_out, "#undef %s\n", undef_list[i]); 690*7e382390SJung-uk Kim } 691*7e382390SJung-uk Kim 692*7e382390SJung-uk Kim /* undef any of the auto-generated symbols. */ 693*7e382390SJung-uk Kim for (i = 0; i < defs_buf.nelts; i++) { 694*7e382390SJung-uk Kim 695*7e382390SJung-uk Kim /* don't undef start conditions */ 696*7e382390SJung-uk Kim if (sclookup (((char **) defs_buf.elts)[i]) > 0) 697*7e382390SJung-uk Kim continue; 698*7e382390SJung-uk Kim fprintf (header_out, "#undef %s\n", 699*7e382390SJung-uk Kim ((char **) defs_buf.elts)[i]); 700*7e382390SJung-uk Kim } 701*7e382390SJung-uk Kim 702*7e382390SJung-uk Kim fprintf (header_out, 703*7e382390SJung-uk Kim "#endif /* !YY_HEADER_NO_UNDEFS */\n"); 704*7e382390SJung-uk Kim fprintf (header_out, "\n"); 705*7e382390SJung-uk Kim fprintf (header_out, "#undef %sIN_HEADER\n", prefix); 706*7e382390SJung-uk Kim fprintf (header_out, "#endif /* %sHEADER_H */\n", prefix); 707*7e382390SJung-uk Kim 708*7e382390SJung-uk Kim if (ferror (header_out)) 709*7e382390SJung-uk Kim lerr (_("error creating header file %s"), 710*7e382390SJung-uk Kim headerfilename); 711*7e382390SJung-uk Kim fflush (header_out); 712*7e382390SJung-uk Kim fclose (header_out); 713*7e382390SJung-uk Kim #endif 714*7e382390SJung-uk Kim 715*7e382390SJung-uk Kim if (exit_status != 0 && outfile_created) { 716*7e382390SJung-uk Kim if (ferror (stdout)) 717*7e382390SJung-uk Kim lerr (_("error writing output file %s"), 718*7e382390SJung-uk Kim outfilename); 719*7e382390SJung-uk Kim 720*7e382390SJung-uk Kim else if ((_stdout_closed = 1) && fclose (stdout)) 721*7e382390SJung-uk Kim lerr (_("error closing output file %s"), 722*7e382390SJung-uk Kim outfilename); 723*7e382390SJung-uk Kim 724*7e382390SJung-uk Kim else if (unlink (outfilename)) 725*7e382390SJung-uk Kim lerr (_("error deleting output file %s"), 726*7e382390SJung-uk Kim outfilename); 727*7e382390SJung-uk Kim } 728*7e382390SJung-uk Kim 729*7e382390SJung-uk Kim 730*7e382390SJung-uk Kim if (backing_up_report && backing_up_file) { 731*7e382390SJung-uk Kim if (num_backing_up == 0) 732*7e382390SJung-uk Kim fprintf (backing_up_file, _("No backing up.\n")); 733*7e382390SJung-uk Kim else if (fullspd || fulltbl) 734*7e382390SJung-uk Kim fprintf (backing_up_file, 735*7e382390SJung-uk Kim _ 736*7e382390SJung-uk Kim ("%d backing up (non-accepting) states.\n"), 737*7e382390SJung-uk Kim num_backing_up); 738*7e382390SJung-uk Kim else 739*7e382390SJung-uk Kim fprintf (backing_up_file, 740*7e382390SJung-uk Kim _("Compressed tables always back up.\n")); 741*7e382390SJung-uk Kim 742*7e382390SJung-uk Kim if (ferror (backing_up_file)) 743*7e382390SJung-uk Kim lerr (_("error writing backup file %s"), 744*7e382390SJung-uk Kim backing_name); 745*7e382390SJung-uk Kim 746*7e382390SJung-uk Kim else if (fclose (backing_up_file)) 747*7e382390SJung-uk Kim lerr (_("error closing backup file %s"), 748*7e382390SJung-uk Kim backing_name); 749*7e382390SJung-uk Kim } 750*7e382390SJung-uk Kim 751*7e382390SJung-uk Kim if (printstats) { 752*7e382390SJung-uk Kim fprintf (stderr, _("%s version %s usage statistics:\n"), 753*7e382390SJung-uk Kim program_name, flex_version); 754*7e382390SJung-uk Kim 755*7e382390SJung-uk Kim fprintf (stderr, _(" scanner options: -")); 756*7e382390SJung-uk Kim 757*7e382390SJung-uk Kim if (C_plus_plus) 758*7e382390SJung-uk Kim putc ('+', stderr); 759*7e382390SJung-uk Kim if (backing_up_report) 760*7e382390SJung-uk Kim putc ('b', stderr); 761*7e382390SJung-uk Kim if (ddebug) 762*7e382390SJung-uk Kim putc ('d', stderr); 763*7e382390SJung-uk Kim if (sf_case_ins()) 764*7e382390SJung-uk Kim putc ('i', stderr); 765*7e382390SJung-uk Kim if (lex_compat) 766*7e382390SJung-uk Kim putc ('l', stderr); 767*7e382390SJung-uk Kim if (posix_compat) 768*7e382390SJung-uk Kim putc ('X', stderr); 769*7e382390SJung-uk Kim if (performance_report > 0) 770*7e382390SJung-uk Kim putc ('p', stderr); 771*7e382390SJung-uk Kim if (performance_report > 1) 772*7e382390SJung-uk Kim putc ('p', stderr); 773*7e382390SJung-uk Kim if (spprdflt) 774*7e382390SJung-uk Kim putc ('s', stderr); 775*7e382390SJung-uk Kim if (reentrant) 776*7e382390SJung-uk Kim fputs ("--reentrant", stderr); 777*7e382390SJung-uk Kim if (bison_bridge_lval) 778*7e382390SJung-uk Kim fputs ("--bison-bridge", stderr); 779*7e382390SJung-uk Kim if (bison_bridge_lloc) 780*7e382390SJung-uk Kim fputs ("--bison-locations", stderr); 781*7e382390SJung-uk Kim if (use_stdout) 782*7e382390SJung-uk Kim putc ('t', stderr); 783*7e382390SJung-uk Kim if (printstats) 784*7e382390SJung-uk Kim putc ('v', stderr); /* always true! */ 785*7e382390SJung-uk Kim if (nowarn) 786*7e382390SJung-uk Kim putc ('w', stderr); 787*7e382390SJung-uk Kim if (interactive == false) 788*7e382390SJung-uk Kim putc ('B', stderr); 789*7e382390SJung-uk Kim if (interactive == true) 790*7e382390SJung-uk Kim putc ('I', stderr); 791*7e382390SJung-uk Kim if (!gen_line_dirs) 792*7e382390SJung-uk Kim putc ('L', stderr); 793*7e382390SJung-uk Kim if (trace) 794*7e382390SJung-uk Kim putc ('T', stderr); 795*7e382390SJung-uk Kim 796*7e382390SJung-uk Kim if (csize == unspecified) 797*7e382390SJung-uk Kim /* We encountered an error fairly early on, so csize 798*7e382390SJung-uk Kim * never got specified. Define it now, to prevent 799*7e382390SJung-uk Kim * bogus table sizes being written out below. 800*7e382390SJung-uk Kim */ 801*7e382390SJung-uk Kim csize = 256; 802*7e382390SJung-uk Kim 803*7e382390SJung-uk Kim if (csize == 128) 804*7e382390SJung-uk Kim putc ('7', stderr); 805*7e382390SJung-uk Kim else 806*7e382390SJung-uk Kim putc ('8', stderr); 807*7e382390SJung-uk Kim 808*7e382390SJung-uk Kim fprintf (stderr, " -C"); 809*7e382390SJung-uk Kim 810*7e382390SJung-uk Kim if (long_align) 811*7e382390SJung-uk Kim putc ('a', stderr); 812*7e382390SJung-uk Kim if (fulltbl) 813*7e382390SJung-uk Kim putc ('f', stderr); 814*7e382390SJung-uk Kim if (fullspd) 815*7e382390SJung-uk Kim putc ('F', stderr); 816*7e382390SJung-uk Kim if (useecs) 817*7e382390SJung-uk Kim putc ('e', stderr); 818*7e382390SJung-uk Kim if (usemecs) 819*7e382390SJung-uk Kim putc ('m', stderr); 820*7e382390SJung-uk Kim if (use_read) 821*7e382390SJung-uk Kim putc ('r', stderr); 822*7e382390SJung-uk Kim 823*7e382390SJung-uk Kim if (did_outfilename) 824*7e382390SJung-uk Kim fprintf (stderr, " -o%s", outfilename); 825*7e382390SJung-uk Kim 826*7e382390SJung-uk Kim if (skelname) 827*7e382390SJung-uk Kim fprintf (stderr, " -S%s", skelname); 828*7e382390SJung-uk Kim 829*7e382390SJung-uk Kim if (strcmp (prefix, "yy")) 830*7e382390SJung-uk Kim fprintf (stderr, " -P%s", prefix); 831*7e382390SJung-uk Kim 832*7e382390SJung-uk Kim putc ('\n', stderr); 833*7e382390SJung-uk Kim 834*7e382390SJung-uk Kim fprintf (stderr, _(" %d/%d NFA states\n"), 835*7e382390SJung-uk Kim lastnfa, current_mns); 836*7e382390SJung-uk Kim fprintf (stderr, _(" %d/%d DFA states (%d words)\n"), 837*7e382390SJung-uk Kim lastdfa, current_max_dfas, totnst); 838*7e382390SJung-uk Kim fprintf (stderr, _(" %d rules\n"), 839*7e382390SJung-uk Kim num_rules + num_eof_rules - 840*7e382390SJung-uk Kim 1 /* - 1 for def. rule */ ); 841*7e382390SJung-uk Kim 842*7e382390SJung-uk Kim if (num_backing_up == 0) 843*7e382390SJung-uk Kim fprintf (stderr, _(" No backing up\n")); 844*7e382390SJung-uk Kim else if (fullspd || fulltbl) 845*7e382390SJung-uk Kim fprintf (stderr, 846*7e382390SJung-uk Kim _ 847*7e382390SJung-uk Kim (" %d backing-up (non-accepting) states\n"), 848*7e382390SJung-uk Kim num_backing_up); 849*7e382390SJung-uk Kim else 850*7e382390SJung-uk Kim fprintf (stderr, 851*7e382390SJung-uk Kim _ 852*7e382390SJung-uk Kim (" Compressed tables always back-up\n")); 853*7e382390SJung-uk Kim 854*7e382390SJung-uk Kim if (bol_needed) 855*7e382390SJung-uk Kim fprintf (stderr, 856*7e382390SJung-uk Kim _(" Beginning-of-line patterns used\n")); 857*7e382390SJung-uk Kim 858*7e382390SJung-uk Kim fprintf (stderr, _(" %d/%d start conditions\n"), lastsc, 859*7e382390SJung-uk Kim current_max_scs); 860*7e382390SJung-uk Kim fprintf (stderr, 861*7e382390SJung-uk Kim _ 862*7e382390SJung-uk Kim (" %d epsilon states, %d double epsilon states\n"), 863*7e382390SJung-uk Kim numeps, eps2); 864*7e382390SJung-uk Kim 865*7e382390SJung-uk Kim if (lastccl == 0) 866*7e382390SJung-uk Kim fprintf (stderr, _(" no character classes\n")); 867*7e382390SJung-uk Kim else 868*7e382390SJung-uk Kim fprintf (stderr, 869*7e382390SJung-uk Kim _ 870*7e382390SJung-uk Kim (" %d/%d character classes needed %d/%d words of storage, %d reused\n"), 871*7e382390SJung-uk Kim lastccl, current_maxccls, 872*7e382390SJung-uk Kim cclmap[lastccl] + ccllen[lastccl], 873*7e382390SJung-uk Kim current_max_ccl_tbl_size, cclreuse); 874*7e382390SJung-uk Kim 875*7e382390SJung-uk Kim fprintf (stderr, _(" %d state/nextstate pairs created\n"), 876*7e382390SJung-uk Kim numsnpairs); 877*7e382390SJung-uk Kim fprintf (stderr, 878*7e382390SJung-uk Kim _(" %d/%d unique/duplicate transitions\n"), 879*7e382390SJung-uk Kim numuniq, numdup); 880*7e382390SJung-uk Kim 881*7e382390SJung-uk Kim if (fulltbl) { 882*7e382390SJung-uk Kim tblsiz = lastdfa * numecs; 883*7e382390SJung-uk Kim fprintf (stderr, _(" %d table entries\n"), 884*7e382390SJung-uk Kim tblsiz); 885*7e382390SJung-uk Kim } 886*7e382390SJung-uk Kim 887*7e382390SJung-uk Kim else { 888*7e382390SJung-uk Kim tblsiz = 2 * (lastdfa + numtemps) + 2 * tblend; 889*7e382390SJung-uk Kim 890*7e382390SJung-uk Kim fprintf (stderr, 891*7e382390SJung-uk Kim _(" %d/%d base-def entries created\n"), 892*7e382390SJung-uk Kim lastdfa + numtemps, current_max_dfas); 893*7e382390SJung-uk Kim fprintf (stderr, 894*7e382390SJung-uk Kim _ 895*7e382390SJung-uk Kim (" %d/%d (peak %d) nxt-chk entries created\n"), 896*7e382390SJung-uk Kim tblend, current_max_xpairs, peakpairs); 897*7e382390SJung-uk Kim fprintf (stderr, 898*7e382390SJung-uk Kim _ 899*7e382390SJung-uk Kim (" %d/%d (peak %d) template nxt-chk entries created\n"), 900*7e382390SJung-uk Kim numtemps * nummecs, 901*7e382390SJung-uk Kim current_max_template_xpairs, 902*7e382390SJung-uk Kim numtemps * numecs); 903*7e382390SJung-uk Kim fprintf (stderr, _(" %d empty table entries\n"), 904*7e382390SJung-uk Kim nummt); 905*7e382390SJung-uk Kim fprintf (stderr, _(" %d protos created\n"), 906*7e382390SJung-uk Kim numprots); 907*7e382390SJung-uk Kim fprintf (stderr, 908*7e382390SJung-uk Kim _(" %d templates created, %d uses\n"), 909*7e382390SJung-uk Kim numtemps, tmpuses); 910*7e382390SJung-uk Kim } 911*7e382390SJung-uk Kim 912*7e382390SJung-uk Kim if (useecs) { 913*7e382390SJung-uk Kim tblsiz = tblsiz + csize; 914*7e382390SJung-uk Kim fprintf (stderr, 915*7e382390SJung-uk Kim _ 916*7e382390SJung-uk Kim (" %d/%d equivalence classes created\n"), 917*7e382390SJung-uk Kim numecs, csize); 918*7e382390SJung-uk Kim } 919*7e382390SJung-uk Kim 920*7e382390SJung-uk Kim if (usemecs) { 921*7e382390SJung-uk Kim tblsiz = tblsiz + numecs; 922*7e382390SJung-uk Kim fprintf (stderr, 923*7e382390SJung-uk Kim _ 924*7e382390SJung-uk Kim (" %d/%d meta-equivalence classes created\n"), 925*7e382390SJung-uk Kim nummecs, csize); 926*7e382390SJung-uk Kim } 927*7e382390SJung-uk Kim 928*7e382390SJung-uk Kim fprintf (stderr, 929*7e382390SJung-uk Kim _ 930*7e382390SJung-uk Kim (" %d (%d saved) hash collisions, %d DFAs equal\n"), 931*7e382390SJung-uk Kim hshcol, hshsave, dfaeql); 932*7e382390SJung-uk Kim fprintf (stderr, _(" %d sets of reallocations needed\n"), 933*7e382390SJung-uk Kim num_reallocs); 934*7e382390SJung-uk Kim fprintf (stderr, _(" %d total table entries needed\n"), 935*7e382390SJung-uk Kim tblsiz); 936*7e382390SJung-uk Kim } 937*7e382390SJung-uk Kim 938*7e382390SJung-uk Kim FLEX_EXIT (exit_status); 939*7e382390SJung-uk Kim } 940*7e382390SJung-uk Kim 941*7e382390SJung-uk Kim 942*7e382390SJung-uk Kim /* flexinit - initialize flex */ 943*7e382390SJung-uk Kim 944*7e382390SJung-uk Kim void flexinit (int argc, char **argv) 945*7e382390SJung-uk Kim { 946*7e382390SJung-uk Kim int i, sawcmpflag, rv, optind; 947*7e382390SJung-uk Kim char *arg; 948*7e382390SJung-uk Kim scanopt_t sopt; 949*7e382390SJung-uk Kim 950*7e382390SJung-uk Kim printstats = syntaxerror = trace = spprdflt = false; 951*7e382390SJung-uk Kim lex_compat = posix_compat = C_plus_plus = backing_up_report = 952*7e382390SJung-uk Kim ddebug = fulltbl = false; 953*7e382390SJung-uk Kim fullspd = long_align = nowarn = yymore_used = continued_action = 954*7e382390SJung-uk Kim false; 955*7e382390SJung-uk Kim do_yylineno = yytext_is_array = in_rule = reject = do_stdinit = 956*7e382390SJung-uk Kim false; 957*7e382390SJung-uk Kim yymore_really_used = reject_really_used = unspecified; 958*7e382390SJung-uk Kim interactive = csize = unspecified; 959*7e382390SJung-uk Kim do_yywrap = gen_line_dirs = usemecs = useecs = true; 960*7e382390SJung-uk Kim reentrant = bison_bridge_lval = bison_bridge_lloc = false; 961*7e382390SJung-uk Kim performance_report = 0; 962*7e382390SJung-uk Kim did_outfilename = 0; 963*7e382390SJung-uk Kim prefix = "yy"; 964*7e382390SJung-uk Kim yyclass = 0; 965*7e382390SJung-uk Kim use_read = use_stdout = false; 966*7e382390SJung-uk Kim tablesext = tablesverify = false; 967*7e382390SJung-uk Kim gentables = true; 968*7e382390SJung-uk Kim tablesfilename = tablesname = NULL; 969*7e382390SJung-uk Kim 970*7e382390SJung-uk Kim sawcmpflag = false; 971*7e382390SJung-uk Kim 972*7e382390SJung-uk Kim /* Initialize dynamic array for holding the rule actions. */ 973*7e382390SJung-uk Kim action_size = 2048; /* default size of action array in bytes */ 974*7e382390SJung-uk Kim action_array = allocate_character_array (action_size); 975*7e382390SJung-uk Kim defs1_offset = prolog_offset = action_offset = action_index = 0; 976*7e382390SJung-uk Kim action_array[0] = '\0'; 977*7e382390SJung-uk Kim 978*7e382390SJung-uk Kim /* Initialize any buffers. */ 979*7e382390SJung-uk Kim buf_init (&userdef_buf, sizeof (char)); /* one long string */ 980*7e382390SJung-uk Kim buf_init (&defs_buf, sizeof (char *)); /* list of strings */ 981*7e382390SJung-uk Kim buf_init (&yydmap_buf, sizeof (char)); /* one long string */ 982*7e382390SJung-uk Kim buf_init (&top_buf, sizeof (char)); /* one long string */ 983*7e382390SJung-uk Kim 984*7e382390SJung-uk Kim { 985*7e382390SJung-uk Kim const char * m4defs_init_str[] = {"m4_changequote\n", 986*7e382390SJung-uk Kim "m4_changequote([[, ]])\n"}; 987*7e382390SJung-uk Kim buf_init (&m4defs_buf, sizeof (char *)); 988*7e382390SJung-uk Kim buf_append (&m4defs_buf, &m4defs_init_str, 2); 989*7e382390SJung-uk Kim } 990*7e382390SJung-uk Kim 991*7e382390SJung-uk Kim sf_init (); 992*7e382390SJung-uk Kim 993*7e382390SJung-uk Kim /* initialize regex lib */ 994*7e382390SJung-uk Kim flex_init_regex(); 995*7e382390SJung-uk Kim 996*7e382390SJung-uk Kim /* Enable C++ if program name ends with '+'. */ 997*7e382390SJung-uk Kim program_name = basename (argv[0]); 998*7e382390SJung-uk Kim 999*7e382390SJung-uk Kim if (program_name != NULL && 1000*7e382390SJung-uk Kim program_name[strlen (program_name) - 1] == '+') 1001*7e382390SJung-uk Kim C_plus_plus = true; 1002*7e382390SJung-uk Kim 1003*7e382390SJung-uk Kim /* read flags */ 1004*7e382390SJung-uk Kim sopt = scanopt_init (flexopts, argc, argv, 0); 1005*7e382390SJung-uk Kim if (!sopt) { 1006*7e382390SJung-uk Kim /* This will only happen when flexopts array is altered. */ 1007*7e382390SJung-uk Kim fprintf (stderr, 1008*7e382390SJung-uk Kim _("Internal error. flexopts are malformed.\n")); 1009*7e382390SJung-uk Kim FLEX_EXIT (1); 1010*7e382390SJung-uk Kim } 1011*7e382390SJung-uk Kim 1012*7e382390SJung-uk Kim while ((rv = scanopt (sopt, &arg, &optind)) != 0) { 1013*7e382390SJung-uk Kim 1014*7e382390SJung-uk Kim if (rv < 0) { 1015*7e382390SJung-uk Kim /* Scanopt has already printed an option-specific error message. */ 1016*7e382390SJung-uk Kim fprintf (stderr, 1017*7e382390SJung-uk Kim _ 1018*7e382390SJung-uk Kim ("Try `%s --help' for more information.\n"), 1019*7e382390SJung-uk Kim program_name); 1020*7e382390SJung-uk Kim FLEX_EXIT (1); 1021*7e382390SJung-uk Kim } 1022*7e382390SJung-uk Kim 1023*7e382390SJung-uk Kim switch ((enum flexopt_flag_t) rv) { 1024*7e382390SJung-uk Kim case OPT_CPLUSPLUS: 1025*7e382390SJung-uk Kim C_plus_plus = true; 1026*7e382390SJung-uk Kim break; 1027*7e382390SJung-uk Kim 1028*7e382390SJung-uk Kim case OPT_BATCH: 1029*7e382390SJung-uk Kim interactive = false; 1030*7e382390SJung-uk Kim break; 1031*7e382390SJung-uk Kim 1032*7e382390SJung-uk Kim case OPT_BACKUP: 1033*7e382390SJung-uk Kim backing_up_report = true; 1034*7e382390SJung-uk Kim break; 1035*7e382390SJung-uk Kim 1036*7e382390SJung-uk Kim case OPT_DONOTHING: 1037*7e382390SJung-uk Kim break; 1038*7e382390SJung-uk Kim 1039*7e382390SJung-uk Kim case OPT_COMPRESSION: 1040*7e382390SJung-uk Kim if (!sawcmpflag) { 1041*7e382390SJung-uk Kim useecs = false; 1042*7e382390SJung-uk Kim usemecs = false; 1043*7e382390SJung-uk Kim fulltbl = false; 1044*7e382390SJung-uk Kim sawcmpflag = true; 1045*7e382390SJung-uk Kim } 1046*7e382390SJung-uk Kim 1047*7e382390SJung-uk Kim for (i = 0; arg && arg[i] != '\0'; i++) 1048*7e382390SJung-uk Kim switch (arg[i]) { 1049*7e382390SJung-uk Kim case 'a': 1050*7e382390SJung-uk Kim long_align = true; 1051*7e382390SJung-uk Kim break; 1052*7e382390SJung-uk Kim 1053*7e382390SJung-uk Kim case 'e': 1054*7e382390SJung-uk Kim useecs = true; 1055*7e382390SJung-uk Kim break; 1056*7e382390SJung-uk Kim 1057*7e382390SJung-uk Kim case 'F': 1058*7e382390SJung-uk Kim fullspd = true; 1059*7e382390SJung-uk Kim break; 1060*7e382390SJung-uk Kim 1061*7e382390SJung-uk Kim case 'f': 1062*7e382390SJung-uk Kim fulltbl = true; 1063*7e382390SJung-uk Kim break; 1064*7e382390SJung-uk Kim 1065*7e382390SJung-uk Kim case 'm': 1066*7e382390SJung-uk Kim usemecs = true; 1067*7e382390SJung-uk Kim break; 1068*7e382390SJung-uk Kim 1069*7e382390SJung-uk Kim case 'r': 1070*7e382390SJung-uk Kim use_read = true; 1071*7e382390SJung-uk Kim break; 1072*7e382390SJung-uk Kim 1073*7e382390SJung-uk Kim default: 1074*7e382390SJung-uk Kim lerr (_ 1075*7e382390SJung-uk Kim ("unknown -C option '%c'"), 1076*7e382390SJung-uk Kim arg[i]); 1077*7e382390SJung-uk Kim break; 1078*7e382390SJung-uk Kim } 1079*7e382390SJung-uk Kim break; 1080*7e382390SJung-uk Kim 1081*7e382390SJung-uk Kim case OPT_DEBUG: 1082*7e382390SJung-uk Kim ddebug = true; 1083*7e382390SJung-uk Kim break; 1084*7e382390SJung-uk Kim 1085*7e382390SJung-uk Kim case OPT_NO_DEBUG: 1086*7e382390SJung-uk Kim ddebug = false; 1087*7e382390SJung-uk Kim break; 1088*7e382390SJung-uk Kim 1089*7e382390SJung-uk Kim case OPT_FULL: 1090*7e382390SJung-uk Kim useecs = usemecs = false; 1091*7e382390SJung-uk Kim use_read = fulltbl = true; 1092*7e382390SJung-uk Kim break; 1093*7e382390SJung-uk Kim 1094*7e382390SJung-uk Kim case OPT_FAST: 1095*7e382390SJung-uk Kim useecs = usemecs = false; 1096*7e382390SJung-uk Kim use_read = fullspd = true; 1097*7e382390SJung-uk Kim break; 1098*7e382390SJung-uk Kim 1099*7e382390SJung-uk Kim case OPT_HELP: 1100*7e382390SJung-uk Kim usage (); 1101*7e382390SJung-uk Kim FLEX_EXIT (0); 1102*7e382390SJung-uk Kim 1103*7e382390SJung-uk Kim case OPT_INTERACTIVE: 1104*7e382390SJung-uk Kim interactive = true; 1105*7e382390SJung-uk Kim break; 1106*7e382390SJung-uk Kim 1107*7e382390SJung-uk Kim case OPT_CASE_INSENSITIVE: 1108*7e382390SJung-uk Kim sf_set_case_ins(true); 1109*7e382390SJung-uk Kim break; 1110*7e382390SJung-uk Kim 1111*7e382390SJung-uk Kim case OPT_LEX_COMPAT: 1112*7e382390SJung-uk Kim lex_compat = true; 1113*7e382390SJung-uk Kim break; 1114*7e382390SJung-uk Kim 1115*7e382390SJung-uk Kim case OPT_POSIX_COMPAT: 1116*7e382390SJung-uk Kim posix_compat = true; 1117*7e382390SJung-uk Kim break; 1118*7e382390SJung-uk Kim 1119*7e382390SJung-uk Kim case OPT_PREPROC_LEVEL: 1120*7e382390SJung-uk Kim preproc_level = (int) strtol(arg,NULL,0); 1121*7e382390SJung-uk Kim break; 1122*7e382390SJung-uk Kim 1123*7e382390SJung-uk Kim case OPT_MAIN: 1124*7e382390SJung-uk Kim buf_strdefine (&userdef_buf, "YY_MAIN", "1"); 1125*7e382390SJung-uk Kim do_yywrap = false; 1126*7e382390SJung-uk Kim break; 1127*7e382390SJung-uk Kim 1128*7e382390SJung-uk Kim case OPT_NO_MAIN: 1129*7e382390SJung-uk Kim buf_strdefine (&userdef_buf, "YY_MAIN", "0"); 1130*7e382390SJung-uk Kim break; 1131*7e382390SJung-uk Kim 1132*7e382390SJung-uk Kim case OPT_NO_LINE: 1133*7e382390SJung-uk Kim gen_line_dirs = false; 1134*7e382390SJung-uk Kim break; 1135*7e382390SJung-uk Kim 1136*7e382390SJung-uk Kim case OPT_OUTFILE: 1137*7e382390SJung-uk Kim outfilename = arg; 1138*7e382390SJung-uk Kim did_outfilename = 1; 1139*7e382390SJung-uk Kim break; 1140*7e382390SJung-uk Kim 1141*7e382390SJung-uk Kim case OPT_PREFIX: 1142*7e382390SJung-uk Kim prefix = arg; 1143*7e382390SJung-uk Kim break; 1144*7e382390SJung-uk Kim 1145*7e382390SJung-uk Kim case OPT_PERF_REPORT: 1146*7e382390SJung-uk Kim ++performance_report; 1147*7e382390SJung-uk Kim break; 1148*7e382390SJung-uk Kim 1149*7e382390SJung-uk Kim case OPT_BISON_BRIDGE: 1150*7e382390SJung-uk Kim bison_bridge_lval = true; 1151*7e382390SJung-uk Kim break; 1152*7e382390SJung-uk Kim 1153*7e382390SJung-uk Kim case OPT_BISON_BRIDGE_LOCATIONS: 1154*7e382390SJung-uk Kim bison_bridge_lval = bison_bridge_lloc = true; 1155*7e382390SJung-uk Kim break; 1156*7e382390SJung-uk Kim 1157*7e382390SJung-uk Kim case OPT_REENTRANT: 1158*7e382390SJung-uk Kim reentrant = true; 1159*7e382390SJung-uk Kim break; 1160*7e382390SJung-uk Kim 1161*7e382390SJung-uk Kim case OPT_NO_REENTRANT: 1162*7e382390SJung-uk Kim reentrant = false; 1163*7e382390SJung-uk Kim break; 1164*7e382390SJung-uk Kim 1165*7e382390SJung-uk Kim case OPT_SKEL: 1166*7e382390SJung-uk Kim skelname = arg; 1167*7e382390SJung-uk Kim break; 1168*7e382390SJung-uk Kim 1169*7e382390SJung-uk Kim case OPT_DEFAULT: 1170*7e382390SJung-uk Kim spprdflt = false; 1171*7e382390SJung-uk Kim break; 1172*7e382390SJung-uk Kim 1173*7e382390SJung-uk Kim case OPT_NO_DEFAULT: 1174*7e382390SJung-uk Kim spprdflt = true; 1175*7e382390SJung-uk Kim break; 1176*7e382390SJung-uk Kim 1177*7e382390SJung-uk Kim case OPT_STDOUT: 1178*7e382390SJung-uk Kim use_stdout = true; 1179*7e382390SJung-uk Kim break; 1180*7e382390SJung-uk Kim 1181*7e382390SJung-uk Kim case OPT_NO_UNISTD_H: 1182*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_UNISTD_H", "1"); 1183*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_UNISTD_H",0); 1184*7e382390SJung-uk Kim break; 1185*7e382390SJung-uk Kim 1186*7e382390SJung-uk Kim case OPT_TABLES_FILE: 1187*7e382390SJung-uk Kim tablesext = true; 1188*7e382390SJung-uk Kim tablesfilename = arg; 1189*7e382390SJung-uk Kim break; 1190*7e382390SJung-uk Kim 1191*7e382390SJung-uk Kim case OPT_TABLES_VERIFY: 1192*7e382390SJung-uk Kim tablesverify = true; 1193*7e382390SJung-uk Kim break; 1194*7e382390SJung-uk Kim 1195*7e382390SJung-uk Kim case OPT_TRACE: 1196*7e382390SJung-uk Kim trace = true; 1197*7e382390SJung-uk Kim break; 1198*7e382390SJung-uk Kim 1199*7e382390SJung-uk Kim case OPT_VERBOSE: 1200*7e382390SJung-uk Kim printstats = true; 1201*7e382390SJung-uk Kim break; 1202*7e382390SJung-uk Kim 1203*7e382390SJung-uk Kim case OPT_VERSION: 1204*7e382390SJung-uk Kim printf (_("%s %s\n"), program_name, flex_version); 1205*7e382390SJung-uk Kim FLEX_EXIT (0); 1206*7e382390SJung-uk Kim 1207*7e382390SJung-uk Kim case OPT_WARN: 1208*7e382390SJung-uk Kim nowarn = false; 1209*7e382390SJung-uk Kim break; 1210*7e382390SJung-uk Kim 1211*7e382390SJung-uk Kim case OPT_NO_WARN: 1212*7e382390SJung-uk Kim nowarn = true; 1213*7e382390SJung-uk Kim break; 1214*7e382390SJung-uk Kim 1215*7e382390SJung-uk Kim case OPT_7BIT: 1216*7e382390SJung-uk Kim csize = 128; 1217*7e382390SJung-uk Kim break; 1218*7e382390SJung-uk Kim 1219*7e382390SJung-uk Kim case OPT_8BIT: 1220*7e382390SJung-uk Kim csize = CSIZE; 1221*7e382390SJung-uk Kim break; 1222*7e382390SJung-uk Kim 1223*7e382390SJung-uk Kim case OPT_ALIGN: 1224*7e382390SJung-uk Kim long_align = true; 1225*7e382390SJung-uk Kim break; 1226*7e382390SJung-uk Kim 1227*7e382390SJung-uk Kim case OPT_NO_ALIGN: 1228*7e382390SJung-uk Kim long_align = false; 1229*7e382390SJung-uk Kim break; 1230*7e382390SJung-uk Kim 1231*7e382390SJung-uk Kim case OPT_ALWAYS_INTERACTIVE: 1232*7e382390SJung-uk Kim buf_m4_define (&m4defs_buf, "M4_YY_ALWAYS_INTERACTIVE", 0); 1233*7e382390SJung-uk Kim break; 1234*7e382390SJung-uk Kim 1235*7e382390SJung-uk Kim case OPT_NEVER_INTERACTIVE: 1236*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NEVER_INTERACTIVE", 0); 1237*7e382390SJung-uk Kim break; 1238*7e382390SJung-uk Kim 1239*7e382390SJung-uk Kim case OPT_ARRAY: 1240*7e382390SJung-uk Kim yytext_is_array = true; 1241*7e382390SJung-uk Kim break; 1242*7e382390SJung-uk Kim 1243*7e382390SJung-uk Kim case OPT_POINTER: 1244*7e382390SJung-uk Kim yytext_is_array = false; 1245*7e382390SJung-uk Kim break; 1246*7e382390SJung-uk Kim 1247*7e382390SJung-uk Kim case OPT_ECS: 1248*7e382390SJung-uk Kim useecs = true; 1249*7e382390SJung-uk Kim break; 1250*7e382390SJung-uk Kim 1251*7e382390SJung-uk Kim case OPT_NO_ECS: 1252*7e382390SJung-uk Kim useecs = false; 1253*7e382390SJung-uk Kim break; 1254*7e382390SJung-uk Kim 1255*7e382390SJung-uk Kim case OPT_HEADER_FILE: 1256*7e382390SJung-uk Kim headerfilename = arg; 1257*7e382390SJung-uk Kim break; 1258*7e382390SJung-uk Kim 1259*7e382390SJung-uk Kim case OPT_META_ECS: 1260*7e382390SJung-uk Kim usemecs = true; 1261*7e382390SJung-uk Kim break; 1262*7e382390SJung-uk Kim 1263*7e382390SJung-uk Kim case OPT_NO_META_ECS: 1264*7e382390SJung-uk Kim usemecs = false; 1265*7e382390SJung-uk Kim break; 1266*7e382390SJung-uk Kim 1267*7e382390SJung-uk Kim case OPT_PREPROCDEFINE: 1268*7e382390SJung-uk Kim { 1269*7e382390SJung-uk Kim /* arg is "symbol" or "symbol=definition". */ 1270*7e382390SJung-uk Kim char *def; 1271*7e382390SJung-uk Kim 1272*7e382390SJung-uk Kim for (def = arg; 1273*7e382390SJung-uk Kim *def != '\0' && *def != '='; ++def) ; 1274*7e382390SJung-uk Kim 1275*7e382390SJung-uk Kim buf_strappend (&userdef_buf, "#define "); 1276*7e382390SJung-uk Kim if (*def == '\0') { 1277*7e382390SJung-uk Kim buf_strappend (&userdef_buf, arg); 1278*7e382390SJung-uk Kim buf_strappend (&userdef_buf, 1279*7e382390SJung-uk Kim " 1\n"); 1280*7e382390SJung-uk Kim } 1281*7e382390SJung-uk Kim else { 1282*7e382390SJung-uk Kim buf_strnappend (&userdef_buf, arg, 1283*7e382390SJung-uk Kim (int) (def - arg)); 1284*7e382390SJung-uk Kim buf_strappend (&userdef_buf, " "); 1285*7e382390SJung-uk Kim buf_strappend (&userdef_buf, 1286*7e382390SJung-uk Kim def + 1); 1287*7e382390SJung-uk Kim buf_strappend (&userdef_buf, "\n"); 1288*7e382390SJung-uk Kim } 1289*7e382390SJung-uk Kim } 1290*7e382390SJung-uk Kim break; 1291*7e382390SJung-uk Kim 1292*7e382390SJung-uk Kim case OPT_READ: 1293*7e382390SJung-uk Kim use_read = true; 1294*7e382390SJung-uk Kim break; 1295*7e382390SJung-uk Kim 1296*7e382390SJung-uk Kim case OPT_STACK: 1297*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_STACK_USED", "1"); 1298*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_STACK_USED",0); 1299*7e382390SJung-uk Kim break; 1300*7e382390SJung-uk Kim 1301*7e382390SJung-uk Kim case OPT_STDINIT: 1302*7e382390SJung-uk Kim do_stdinit = true; 1303*7e382390SJung-uk Kim break; 1304*7e382390SJung-uk Kim 1305*7e382390SJung-uk Kim case OPT_NO_STDINIT: 1306*7e382390SJung-uk Kim do_stdinit = false; 1307*7e382390SJung-uk Kim break; 1308*7e382390SJung-uk Kim 1309*7e382390SJung-uk Kim case OPT_YYCLASS: 1310*7e382390SJung-uk Kim yyclass = arg; 1311*7e382390SJung-uk Kim break; 1312*7e382390SJung-uk Kim 1313*7e382390SJung-uk Kim case OPT_YYLINENO: 1314*7e382390SJung-uk Kim do_yylineno = true; 1315*7e382390SJung-uk Kim break; 1316*7e382390SJung-uk Kim 1317*7e382390SJung-uk Kim case OPT_NO_YYLINENO: 1318*7e382390SJung-uk Kim do_yylineno = false; 1319*7e382390SJung-uk Kim break; 1320*7e382390SJung-uk Kim 1321*7e382390SJung-uk Kim case OPT_YYWRAP: 1322*7e382390SJung-uk Kim do_yywrap = true; 1323*7e382390SJung-uk Kim break; 1324*7e382390SJung-uk Kim 1325*7e382390SJung-uk Kim case OPT_NO_YYWRAP: 1326*7e382390SJung-uk Kim do_yywrap = false; 1327*7e382390SJung-uk Kim break; 1328*7e382390SJung-uk Kim 1329*7e382390SJung-uk Kim case OPT_YYMORE: 1330*7e382390SJung-uk Kim yymore_really_used = true; 1331*7e382390SJung-uk Kim break; 1332*7e382390SJung-uk Kim 1333*7e382390SJung-uk Kim case OPT_NO_YYMORE: 1334*7e382390SJung-uk Kim yymore_really_used = false; 1335*7e382390SJung-uk Kim break; 1336*7e382390SJung-uk Kim 1337*7e382390SJung-uk Kim case OPT_REJECT: 1338*7e382390SJung-uk Kim reject_really_used = true; 1339*7e382390SJung-uk Kim break; 1340*7e382390SJung-uk Kim 1341*7e382390SJung-uk Kim case OPT_NO_REJECT: 1342*7e382390SJung-uk Kim reject_really_used = false; 1343*7e382390SJung-uk Kim break; 1344*7e382390SJung-uk Kim 1345*7e382390SJung-uk Kim case OPT_NO_YY_PUSH_STATE: 1346*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_PUSH_STATE", "1"); 1347*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_PUSH_STATE",0); 1348*7e382390SJung-uk Kim break; 1349*7e382390SJung-uk Kim case OPT_NO_YY_POP_STATE: 1350*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_POP_STATE", "1"); 1351*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_POP_STATE",0); 1352*7e382390SJung-uk Kim break; 1353*7e382390SJung-uk Kim case OPT_NO_YY_TOP_STATE: 1354*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_TOP_STATE", "1"); 1355*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_TOP_STATE",0); 1356*7e382390SJung-uk Kim break; 1357*7e382390SJung-uk Kim case OPT_NO_UNPUT: 1358*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_UNPUT", "1"); 1359*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_UNPUT",0); 1360*7e382390SJung-uk Kim break; 1361*7e382390SJung-uk Kim case OPT_NO_YY_SCAN_BUFFER: 1362*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_SCAN_BUFFER", "1"); 1363*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_BUFFER",0); 1364*7e382390SJung-uk Kim break; 1365*7e382390SJung-uk Kim case OPT_NO_YY_SCAN_BYTES: 1366*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_SCAN_BYTES", "1"); 1367*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_BYTES",0); 1368*7e382390SJung-uk Kim break; 1369*7e382390SJung-uk Kim case OPT_NO_YY_SCAN_STRING: 1370*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_SCAN_STRING", "1"); 1371*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_STRING",0); 1372*7e382390SJung-uk Kim break; 1373*7e382390SJung-uk Kim case OPT_NO_YYGET_EXTRA: 1374*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_GET_EXTRA", "1"); 1375*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_EXTRA",0); 1376*7e382390SJung-uk Kim break; 1377*7e382390SJung-uk Kim case OPT_NO_YYSET_EXTRA: 1378*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_SET_EXTRA", "1"); 1379*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_EXTRA",0); 1380*7e382390SJung-uk Kim break; 1381*7e382390SJung-uk Kim case OPT_NO_YYGET_LENG: 1382*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_GET_LENG", "1"); 1383*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LENG",0); 1384*7e382390SJung-uk Kim break; 1385*7e382390SJung-uk Kim case OPT_NO_YYGET_TEXT: 1386*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_GET_TEXT", "1"); 1387*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_TEXT",0); 1388*7e382390SJung-uk Kim break; 1389*7e382390SJung-uk Kim case OPT_NO_YYGET_LINENO: 1390*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_GET_LINENO", "1"); 1391*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LINENO",0); 1392*7e382390SJung-uk Kim break; 1393*7e382390SJung-uk Kim case OPT_NO_YYSET_LINENO: 1394*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_SET_LINENO", "1"); 1395*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LINENO",0); 1396*7e382390SJung-uk Kim break; 1397*7e382390SJung-uk Kim case OPT_NO_YYGET_IN: 1398*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_GET_IN", "1"); 1399*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_IN",0); 1400*7e382390SJung-uk Kim break; 1401*7e382390SJung-uk Kim case OPT_NO_YYSET_IN: 1402*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_SET_IN", "1"); 1403*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_IN",0); 1404*7e382390SJung-uk Kim break; 1405*7e382390SJung-uk Kim case OPT_NO_YYGET_OUT: 1406*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_GET_OUT", "1"); 1407*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_OUT",0); 1408*7e382390SJung-uk Kim break; 1409*7e382390SJung-uk Kim case OPT_NO_YYSET_OUT: 1410*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_SET_OUT", "1"); 1411*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_OUT",0); 1412*7e382390SJung-uk Kim break; 1413*7e382390SJung-uk Kim case OPT_NO_YYGET_LVAL: 1414*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_GET_LVAL", "1"); 1415*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LVAL",0); 1416*7e382390SJung-uk Kim break; 1417*7e382390SJung-uk Kim case OPT_NO_YYSET_LVAL: 1418*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_SET_LVAL", "1"); 1419*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LVAL",0); 1420*7e382390SJung-uk Kim break; 1421*7e382390SJung-uk Kim case OPT_NO_YYGET_LLOC: 1422*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_GET_LLOC", "1"); 1423*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LLOC",0); 1424*7e382390SJung-uk Kim break; 1425*7e382390SJung-uk Kim case OPT_NO_YYSET_LLOC: 1426*7e382390SJung-uk Kim //buf_strdefine (&userdef_buf, "YY_NO_SET_LLOC", "1"); 1427*7e382390SJung-uk Kim buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LLOC",0); 1428*7e382390SJung-uk Kim break; 1429*7e382390SJung-uk Kim case OPT_HEX: 1430*7e382390SJung-uk Kim trace_hex = 1; 1431*7e382390SJung-uk Kim break; 1432*7e382390SJung-uk Kim case OPT_NO_SECT3_ESCAPE: 1433*7e382390SJung-uk Kim no_section3_escape = true; 1434*7e382390SJung-uk Kim break; 1435*7e382390SJung-uk Kim } /* switch */ 1436*7e382390SJung-uk Kim } /* while scanopt() */ 1437*7e382390SJung-uk Kim 1438*7e382390SJung-uk Kim scanopt_destroy (sopt); 1439*7e382390SJung-uk Kim 1440*7e382390SJung-uk Kim num_input_files = argc - optind; 1441*7e382390SJung-uk Kim input_files = argv + optind; 1442*7e382390SJung-uk Kim set_input_file (num_input_files > 0 ? input_files[0] : NULL); 1443*7e382390SJung-uk Kim 1444*7e382390SJung-uk Kim lastccl = lastsc = lastdfa = lastnfa = 0; 1445*7e382390SJung-uk Kim num_rules = num_eof_rules = default_rule = 0; 1446*7e382390SJung-uk Kim numas = numsnpairs = tmpuses = 0; 1447*7e382390SJung-uk Kim numecs = numeps = eps2 = num_reallocs = hshcol = dfaeql = totnst = 1448*7e382390SJung-uk Kim 0; 1449*7e382390SJung-uk Kim numuniq = numdup = hshsave = eofseen = datapos = dataline = 0; 1450*7e382390SJung-uk Kim num_backing_up = onesp = numprots = 0; 1451*7e382390SJung-uk Kim variable_trailing_context_rules = bol_needed = false; 1452*7e382390SJung-uk Kim 1453*7e382390SJung-uk Kim linenum = sectnum = 1; 1454*7e382390SJung-uk Kim firstprot = NIL; 1455*7e382390SJung-uk Kim 1456*7e382390SJung-uk Kim /* Used in mkprot() so that the first proto goes in slot 1 1457*7e382390SJung-uk Kim * of the proto queue. 1458*7e382390SJung-uk Kim */ 1459*7e382390SJung-uk Kim lastprot = 1; 1460*7e382390SJung-uk Kim 1461*7e382390SJung-uk Kim set_up_initial_allocations (); 1462*7e382390SJung-uk Kim } 1463*7e382390SJung-uk Kim 1464*7e382390SJung-uk Kim 1465*7e382390SJung-uk Kim /* readin - read in the rules section of the input file(s) */ 1466*7e382390SJung-uk Kim 1467*7e382390SJung-uk Kim void readin (void) 1468*7e382390SJung-uk Kim { 1469*7e382390SJung-uk Kim static char yy_stdinit[] = "FILE *yyin = stdin, *yyout = stdout;"; 1470*7e382390SJung-uk Kim static char yy_nostdinit[] = 1471*7e382390SJung-uk Kim "FILE *yyin = NULL, *yyout = NULL;"; 1472*7e382390SJung-uk Kim 1473*7e382390SJung-uk Kim line_directive_out(NULL, 1); 1474*7e382390SJung-uk Kim 1475*7e382390SJung-uk Kim if (yyparse ()) { 1476*7e382390SJung-uk Kim pinpoint_message (_("fatal parse error")); 1477*7e382390SJung-uk Kim flexend (1); 1478*7e382390SJung-uk Kim } 1479*7e382390SJung-uk Kim 1480*7e382390SJung-uk Kim if (syntaxerror) 1481*7e382390SJung-uk Kim flexend (1); 1482*7e382390SJung-uk Kim 1483*7e382390SJung-uk Kim /* If the user explicitly requested posix compatibility by specifing the 1484*7e382390SJung-uk Kim * posix-compat option, then we check for conflicting options. However, if 1485*7e382390SJung-uk Kim * the POSIXLY_CORRECT variable is set, then we quietly make flex as 1486*7e382390SJung-uk Kim * posix-compatible as possible. This is the recommended behavior 1487*7e382390SJung-uk Kim * according to the GNU Coding Standards. 1488*7e382390SJung-uk Kim * 1489*7e382390SJung-uk Kim * Note: The posix option was added to flex to provide the posix behavior 1490*7e382390SJung-uk Kim * of the repeat operator in regular expressions, e.g., `ab{3}' 1491*7e382390SJung-uk Kim */ 1492*7e382390SJung-uk Kim if (posix_compat) { 1493*7e382390SJung-uk Kim /* TODO: This is where we try to make flex behave according to 1494*7e382390SJung-uk Kim * posiz, AND check for conflicting options. How far should we go 1495*7e382390SJung-uk Kim * with this? Should we disable all the neat-o flex features? 1496*7e382390SJung-uk Kim */ 1497*7e382390SJung-uk Kim /* Update: Estes says no, since other flex features don't violate posix. */ 1498*7e382390SJung-uk Kim } 1499*7e382390SJung-uk Kim 1500*7e382390SJung-uk Kim if (getenv ("POSIXLY_CORRECT")) { 1501*7e382390SJung-uk Kim posix_compat = true; 1502*7e382390SJung-uk Kim } 1503*7e382390SJung-uk Kim 1504*7e382390SJung-uk Kim if (backing_up_report) { 1505*7e382390SJung-uk Kim backing_up_file = fopen (backing_name, "w"); 1506*7e382390SJung-uk Kim if (backing_up_file == NULL) 1507*7e382390SJung-uk Kim lerr (_ 1508*7e382390SJung-uk Kim ("could not create backing-up info file %s"), 1509*7e382390SJung-uk Kim backing_name); 1510*7e382390SJung-uk Kim } 1511*7e382390SJung-uk Kim 1512*7e382390SJung-uk Kim else 1513*7e382390SJung-uk Kim backing_up_file = NULL; 1514*7e382390SJung-uk Kim 1515*7e382390SJung-uk Kim if (yymore_really_used == true) 1516*7e382390SJung-uk Kim yymore_used = true; 1517*7e382390SJung-uk Kim else if (yymore_really_used == false) 1518*7e382390SJung-uk Kim yymore_used = false; 1519*7e382390SJung-uk Kim 1520*7e382390SJung-uk Kim if (reject_really_used == true) 1521*7e382390SJung-uk Kim reject = true; 1522*7e382390SJung-uk Kim else if (reject_really_used == false) 1523*7e382390SJung-uk Kim reject = false; 1524*7e382390SJung-uk Kim 1525*7e382390SJung-uk Kim if (performance_report > 0) { 1526*7e382390SJung-uk Kim if (lex_compat) { 1527*7e382390SJung-uk Kim fprintf (stderr, 1528*7e382390SJung-uk Kim _ 1529*7e382390SJung-uk Kim ("-l AT&T lex compatibility option entails a large performance penalty\n")); 1530*7e382390SJung-uk Kim fprintf (stderr, 1531*7e382390SJung-uk Kim _ 1532*7e382390SJung-uk Kim (" and may be the actual source of other reported performance penalties\n")); 1533*7e382390SJung-uk Kim } 1534*7e382390SJung-uk Kim 1535*7e382390SJung-uk Kim else if (do_yylineno) { 1536*7e382390SJung-uk Kim fprintf (stderr, 1537*7e382390SJung-uk Kim _ 1538*7e382390SJung-uk Kim ("%%option yylineno entails a performance penalty ONLY on rules that can match newline characters\n")); 1539*7e382390SJung-uk Kim } 1540*7e382390SJung-uk Kim 1541*7e382390SJung-uk Kim if (performance_report > 1) { 1542*7e382390SJung-uk Kim if (interactive) 1543*7e382390SJung-uk Kim fprintf (stderr, 1544*7e382390SJung-uk Kim _ 1545*7e382390SJung-uk Kim ("-I (interactive) entails a minor performance penalty\n")); 1546*7e382390SJung-uk Kim 1547*7e382390SJung-uk Kim if (yymore_used) 1548*7e382390SJung-uk Kim fprintf (stderr, 1549*7e382390SJung-uk Kim _ 1550*7e382390SJung-uk Kim ("yymore() entails a minor performance penalty\n")); 1551*7e382390SJung-uk Kim } 1552*7e382390SJung-uk Kim 1553*7e382390SJung-uk Kim if (reject) 1554*7e382390SJung-uk Kim fprintf (stderr, 1555*7e382390SJung-uk Kim _ 1556*7e382390SJung-uk Kim ("REJECT entails a large performance penalty\n")); 1557*7e382390SJung-uk Kim 1558*7e382390SJung-uk Kim if (variable_trailing_context_rules) 1559*7e382390SJung-uk Kim fprintf (stderr, 1560*7e382390SJung-uk Kim _ 1561*7e382390SJung-uk Kim ("Variable trailing context rules entail a large performance penalty\n")); 1562*7e382390SJung-uk Kim } 1563*7e382390SJung-uk Kim 1564*7e382390SJung-uk Kim if (reject) 1565*7e382390SJung-uk Kim real_reject = true; 1566*7e382390SJung-uk Kim 1567*7e382390SJung-uk Kim if (variable_trailing_context_rules) 1568*7e382390SJung-uk Kim reject = true; 1569*7e382390SJung-uk Kim 1570*7e382390SJung-uk Kim if ((fulltbl || fullspd) && reject) { 1571*7e382390SJung-uk Kim if (real_reject) 1572*7e382390SJung-uk Kim flexerror (_ 1573*7e382390SJung-uk Kim ("REJECT cannot be used with -f or -F")); 1574*7e382390SJung-uk Kim else if (do_yylineno) 1575*7e382390SJung-uk Kim flexerror (_ 1576*7e382390SJung-uk Kim ("%option yylineno cannot be used with REJECT")); 1577*7e382390SJung-uk Kim else 1578*7e382390SJung-uk Kim flexerror (_ 1579*7e382390SJung-uk Kim ("variable trailing context rules cannot be used with -f or -F")); 1580*7e382390SJung-uk Kim } 1581*7e382390SJung-uk Kim 1582*7e382390SJung-uk Kim if (reject){ 1583*7e382390SJung-uk Kim out_m4_define( "M4_YY_USES_REJECT", NULL); 1584*7e382390SJung-uk Kim //outn ("\n#define YY_USES_REJECT"); 1585*7e382390SJung-uk Kim } 1586*7e382390SJung-uk Kim 1587*7e382390SJung-uk Kim if (!do_yywrap) { 1588*7e382390SJung-uk Kim if (!C_plus_plus) { 1589*7e382390SJung-uk Kim if (reentrant) 1590*7e382390SJung-uk Kim out_str ("\n#define %swrap(yyscanner) (/*CONSTCOND*/1)\n", prefix); 1591*7e382390SJung-uk Kim else 1592*7e382390SJung-uk Kim out_str ("\n#define %swrap() (/*CONSTCOND*/1)\n", prefix); 1593*7e382390SJung-uk Kim } 1594*7e382390SJung-uk Kim outn ("#define YY_SKIP_YYWRAP"); 1595*7e382390SJung-uk Kim } 1596*7e382390SJung-uk Kim 1597*7e382390SJung-uk Kim if (ddebug) 1598*7e382390SJung-uk Kim outn ("\n#define FLEX_DEBUG"); 1599*7e382390SJung-uk Kim 1600*7e382390SJung-uk Kim OUT_BEGIN_CODE (); 1601*7e382390SJung-uk Kim outn ("typedef flex_uint8_t YY_CHAR;"); 1602*7e382390SJung-uk Kim OUT_END_CODE (); 1603*7e382390SJung-uk Kim 1604*7e382390SJung-uk Kim if (C_plus_plus) { 1605*7e382390SJung-uk Kim outn ("#define yytext_ptr yytext"); 1606*7e382390SJung-uk Kim 1607*7e382390SJung-uk Kim if (interactive) 1608*7e382390SJung-uk Kim outn ("#define YY_INTERACTIVE"); 1609*7e382390SJung-uk Kim } 1610*7e382390SJung-uk Kim 1611*7e382390SJung-uk Kim else { 1612*7e382390SJung-uk Kim OUT_BEGIN_CODE (); 1613*7e382390SJung-uk Kim /* In reentrant scanner, stdinit is handled in flex.skl. */ 1614*7e382390SJung-uk Kim if (do_stdinit) { 1615*7e382390SJung-uk Kim if (reentrant){ 1616*7e382390SJung-uk Kim outn ("#ifdef VMS"); 1617*7e382390SJung-uk Kim outn ("#ifdef __VMS_POSIX"); 1618*7e382390SJung-uk Kim outn ("#define YY_STDINIT"); 1619*7e382390SJung-uk Kim outn ("#endif"); 1620*7e382390SJung-uk Kim outn ("#else"); 1621*7e382390SJung-uk Kim outn ("#define YY_STDINIT"); 1622*7e382390SJung-uk Kim outn ("#endif"); 1623*7e382390SJung-uk Kim } 1624*7e382390SJung-uk Kim 1625*7e382390SJung-uk Kim outn ("#ifdef VMS"); 1626*7e382390SJung-uk Kim outn ("#ifndef __VMS_POSIX"); 1627*7e382390SJung-uk Kim outn (yy_nostdinit); 1628*7e382390SJung-uk Kim outn ("#else"); 1629*7e382390SJung-uk Kim outn (yy_stdinit); 1630*7e382390SJung-uk Kim outn ("#endif"); 1631*7e382390SJung-uk Kim outn ("#else"); 1632*7e382390SJung-uk Kim outn (yy_stdinit); 1633*7e382390SJung-uk Kim outn ("#endif"); 1634*7e382390SJung-uk Kim } 1635*7e382390SJung-uk Kim 1636*7e382390SJung-uk Kim else { 1637*7e382390SJung-uk Kim if(!reentrant) 1638*7e382390SJung-uk Kim outn (yy_nostdinit); 1639*7e382390SJung-uk Kim } 1640*7e382390SJung-uk Kim OUT_END_CODE (); 1641*7e382390SJung-uk Kim } 1642*7e382390SJung-uk Kim 1643*7e382390SJung-uk Kim OUT_BEGIN_CODE (); 1644*7e382390SJung-uk Kim if (fullspd) 1645*7e382390SJung-uk Kim outn ("typedef const struct yy_trans_info *yy_state_type;"); 1646*7e382390SJung-uk Kim else if (!C_plus_plus) 1647*7e382390SJung-uk Kim outn ("typedef int yy_state_type;"); 1648*7e382390SJung-uk Kim OUT_END_CODE (); 1649*7e382390SJung-uk Kim 1650*7e382390SJung-uk Kim if (lex_compat) 1651*7e382390SJung-uk Kim outn ("#define YY_FLEX_LEX_COMPAT"); 1652*7e382390SJung-uk Kim 1653*7e382390SJung-uk Kim if (!C_plus_plus && !reentrant) { 1654*7e382390SJung-uk Kim outn ("extern int yylineno;"); 1655*7e382390SJung-uk Kim OUT_BEGIN_CODE (); 1656*7e382390SJung-uk Kim outn ("int yylineno = 1;"); 1657*7e382390SJung-uk Kim OUT_END_CODE (); 1658*7e382390SJung-uk Kim } 1659*7e382390SJung-uk Kim 1660*7e382390SJung-uk Kim if (C_plus_plus) { 1661*7e382390SJung-uk Kim outn ("\n#include <FlexLexer.h>"); 1662*7e382390SJung-uk Kim 1663*7e382390SJung-uk Kim if (!do_yywrap) { 1664*7e382390SJung-uk Kim outn("\nint yyFlexLexer::yywrap() { return 1; }"); 1665*7e382390SJung-uk Kim } 1666*7e382390SJung-uk Kim 1667*7e382390SJung-uk Kim if (yyclass) { 1668*7e382390SJung-uk Kim outn ("int yyFlexLexer::yylex()"); 1669*7e382390SJung-uk Kim outn ("\t{"); 1670*7e382390SJung-uk Kim outn ("\tLexerError( \"yyFlexLexer::yylex invoked but %option yyclass used\" );"); 1671*7e382390SJung-uk Kim outn ("\treturn 0;"); 1672*7e382390SJung-uk Kim outn ("\t}"); 1673*7e382390SJung-uk Kim 1674*7e382390SJung-uk Kim out_str ("\n#define YY_DECL int %s::yylex()\n", 1675*7e382390SJung-uk Kim yyclass); 1676*7e382390SJung-uk Kim } 1677*7e382390SJung-uk Kim } 1678*7e382390SJung-uk Kim 1679*7e382390SJung-uk Kim else { 1680*7e382390SJung-uk Kim 1681*7e382390SJung-uk Kim /* Watch out: yytext_ptr is a variable when yytext is an array, 1682*7e382390SJung-uk Kim * but it's a macro when yytext is a pointer. 1683*7e382390SJung-uk Kim */ 1684*7e382390SJung-uk Kim if (yytext_is_array) { 1685*7e382390SJung-uk Kim if (!reentrant) 1686*7e382390SJung-uk Kim outn ("extern char yytext[];\n"); 1687*7e382390SJung-uk Kim } 1688*7e382390SJung-uk Kim else { 1689*7e382390SJung-uk Kim if (reentrant) { 1690*7e382390SJung-uk Kim outn ("#define yytext_ptr yytext_r"); 1691*7e382390SJung-uk Kim } 1692*7e382390SJung-uk Kim else { 1693*7e382390SJung-uk Kim outn ("extern char *yytext;"); 1694*7e382390SJung-uk Kim 1695*7e382390SJung-uk Kim outn("#ifdef yytext_ptr"); 1696*7e382390SJung-uk Kim outn("#undef yytext_ptr"); 1697*7e382390SJung-uk Kim outn("#endif"); 1698*7e382390SJung-uk Kim outn ("#define yytext_ptr yytext"); 1699*7e382390SJung-uk Kim } 1700*7e382390SJung-uk Kim } 1701*7e382390SJung-uk Kim 1702*7e382390SJung-uk Kim if (yyclass) 1703*7e382390SJung-uk Kim flexerror (_ 1704*7e382390SJung-uk Kim ("%option yyclass only meaningful for C++ scanners")); 1705*7e382390SJung-uk Kim } 1706*7e382390SJung-uk Kim 1707*7e382390SJung-uk Kim if (useecs) 1708*7e382390SJung-uk Kim numecs = cre8ecs (nextecm, ecgroup, csize); 1709*7e382390SJung-uk Kim else 1710*7e382390SJung-uk Kim numecs = csize; 1711*7e382390SJung-uk Kim 1712*7e382390SJung-uk Kim /* Now map the equivalence class for NUL to its expected place. */ 1713*7e382390SJung-uk Kim ecgroup[0] = ecgroup[csize]; 1714*7e382390SJung-uk Kim NUL_ec = ABS (ecgroup[0]); 1715*7e382390SJung-uk Kim 1716*7e382390SJung-uk Kim if (useecs) 1717*7e382390SJung-uk Kim ccl2ecl (); 1718*7e382390SJung-uk Kim } 1719*7e382390SJung-uk Kim 1720*7e382390SJung-uk Kim 1721*7e382390SJung-uk Kim /* set_up_initial_allocations - allocate memory for internal tables */ 1722*7e382390SJung-uk Kim 1723*7e382390SJung-uk Kim void set_up_initial_allocations (void) 1724*7e382390SJung-uk Kim { 1725*7e382390SJung-uk Kim maximum_mns = (long_align ? MAXIMUM_MNS_LONG : MAXIMUM_MNS); 1726*7e382390SJung-uk Kim current_mns = INITIAL_MNS; 1727*7e382390SJung-uk Kim firstst = allocate_integer_array (current_mns); 1728*7e382390SJung-uk Kim lastst = allocate_integer_array (current_mns); 1729*7e382390SJung-uk Kim finalst = allocate_integer_array (current_mns); 1730*7e382390SJung-uk Kim transchar = allocate_integer_array (current_mns); 1731*7e382390SJung-uk Kim trans1 = allocate_integer_array (current_mns); 1732*7e382390SJung-uk Kim trans2 = allocate_integer_array (current_mns); 1733*7e382390SJung-uk Kim accptnum = allocate_integer_array (current_mns); 1734*7e382390SJung-uk Kim assoc_rule = allocate_integer_array (current_mns); 1735*7e382390SJung-uk Kim state_type = allocate_integer_array (current_mns); 1736*7e382390SJung-uk Kim 1737*7e382390SJung-uk Kim current_max_rules = INITIAL_MAX_RULES; 1738*7e382390SJung-uk Kim rule_type = allocate_integer_array (current_max_rules); 1739*7e382390SJung-uk Kim rule_linenum = allocate_integer_array (current_max_rules); 1740*7e382390SJung-uk Kim rule_useful = allocate_integer_array (current_max_rules); 1741*7e382390SJung-uk Kim rule_has_nl = allocate_bool_array (current_max_rules); 1742*7e382390SJung-uk Kim 1743*7e382390SJung-uk Kim current_max_scs = INITIAL_MAX_SCS; 1744*7e382390SJung-uk Kim scset = allocate_integer_array (current_max_scs); 1745*7e382390SJung-uk Kim scbol = allocate_integer_array (current_max_scs); 1746*7e382390SJung-uk Kim scxclu = allocate_integer_array (current_max_scs); 1747*7e382390SJung-uk Kim sceof = allocate_integer_array (current_max_scs); 1748*7e382390SJung-uk Kim scname = allocate_char_ptr_array (current_max_scs); 1749*7e382390SJung-uk Kim 1750*7e382390SJung-uk Kim current_maxccls = INITIAL_MAX_CCLS; 1751*7e382390SJung-uk Kim cclmap = allocate_integer_array (current_maxccls); 1752*7e382390SJung-uk Kim ccllen = allocate_integer_array (current_maxccls); 1753*7e382390SJung-uk Kim cclng = allocate_integer_array (current_maxccls); 1754*7e382390SJung-uk Kim ccl_has_nl = allocate_bool_array (current_maxccls); 1755*7e382390SJung-uk Kim 1756*7e382390SJung-uk Kim current_max_ccl_tbl_size = INITIAL_MAX_CCL_TBL_SIZE; 1757*7e382390SJung-uk Kim ccltbl = allocate_Character_array (current_max_ccl_tbl_size); 1758*7e382390SJung-uk Kim 1759*7e382390SJung-uk Kim current_max_dfa_size = INITIAL_MAX_DFA_SIZE; 1760*7e382390SJung-uk Kim 1761*7e382390SJung-uk Kim current_max_xpairs = INITIAL_MAX_XPAIRS; 1762*7e382390SJung-uk Kim nxt = allocate_integer_array (current_max_xpairs); 1763*7e382390SJung-uk Kim chk = allocate_integer_array (current_max_xpairs); 1764*7e382390SJung-uk Kim 1765*7e382390SJung-uk Kim current_max_template_xpairs = INITIAL_MAX_TEMPLATE_XPAIRS; 1766*7e382390SJung-uk Kim tnxt = allocate_integer_array (current_max_template_xpairs); 1767*7e382390SJung-uk Kim 1768*7e382390SJung-uk Kim current_max_dfas = INITIAL_MAX_DFAS; 1769*7e382390SJung-uk Kim base = allocate_integer_array (current_max_dfas); 1770*7e382390SJung-uk Kim def = allocate_integer_array (current_max_dfas); 1771*7e382390SJung-uk Kim dfasiz = allocate_integer_array (current_max_dfas); 1772*7e382390SJung-uk Kim accsiz = allocate_integer_array (current_max_dfas); 1773*7e382390SJung-uk Kim dhash = allocate_integer_array (current_max_dfas); 1774*7e382390SJung-uk Kim dss = allocate_int_ptr_array (current_max_dfas); 1775*7e382390SJung-uk Kim dfaacc = allocate_dfaacc_union (current_max_dfas); 1776*7e382390SJung-uk Kim 1777*7e382390SJung-uk Kim nultrans = NULL; 1778*7e382390SJung-uk Kim } 1779*7e382390SJung-uk Kim 1780*7e382390SJung-uk Kim 1781*7e382390SJung-uk Kim void usage (void) 1782*7e382390SJung-uk Kim { 1783*7e382390SJung-uk Kim FILE *f = stdout; 1784*7e382390SJung-uk Kim 1785*7e382390SJung-uk Kim if (!did_outfilename) { 1786*7e382390SJung-uk Kim snprintf (outfile_path, sizeof(outfile_path), outfile_template, 1787*7e382390SJung-uk Kim prefix, C_plus_plus ? "cc" : "c"); 1788*7e382390SJung-uk Kim outfilename = outfile_path; 1789*7e382390SJung-uk Kim } 1790*7e382390SJung-uk Kim 1791*7e382390SJung-uk Kim fprintf (f, _("Usage: %s [OPTIONS] [FILE]...\n"), program_name); 1792*7e382390SJung-uk Kim fprintf (f, 1793*7e382390SJung-uk Kim _ 1794*7e382390SJung-uk Kim ("Generates programs that perform pattern-matching on text.\n" 1795*7e382390SJung-uk Kim "\n" "Table Compression:\n" 1796*7e382390SJung-uk Kim " -Ca, --align trade off larger tables for better memory alignment\n" 1797*7e382390SJung-uk Kim " -Ce, --ecs construct equivalence classes\n" 1798*7e382390SJung-uk Kim " -Cf do not compress tables; use -f representation\n" 1799*7e382390SJung-uk Kim " -CF do not compress tables; use -F representation\n" 1800*7e382390SJung-uk Kim " -Cm, --meta-ecs construct meta-equivalence classes\n" 1801*7e382390SJung-uk Kim " -Cr, --read use read() instead of stdio for scanner input\n" 1802*7e382390SJung-uk Kim " -f, --full generate fast, large scanner. Same as -Cfr\n" 1803*7e382390SJung-uk Kim " -F, --fast use alternate table representation. Same as -CFr\n" 1804*7e382390SJung-uk Kim " -Cem default compression (same as --ecs --meta-ecs)\n" 1805*7e382390SJung-uk Kim "\n" "Debugging:\n" 1806*7e382390SJung-uk Kim " -d, --debug enable debug mode in scanner\n" 1807*7e382390SJung-uk Kim " -b, --backup write backing-up information to %s\n" 1808*7e382390SJung-uk Kim " -p, --perf-report write performance report to stderr\n" 1809*7e382390SJung-uk Kim " -s, --nodefault suppress default rule to ECHO unmatched text\n" 1810*7e382390SJung-uk Kim " -T, --trace %s should run in trace mode\n" 1811*7e382390SJung-uk Kim " -w, --nowarn do not generate warnings\n" 1812*7e382390SJung-uk Kim " -v, --verbose write summary of scanner statistics to stdout\n" 1813*7e382390SJung-uk Kim " --hex use hexadecimal numbers instead of octal in debug outputs\n" 1814*7e382390SJung-uk Kim "\n" "Files:\n" 1815*7e382390SJung-uk Kim " -o, --outfile=FILE specify output filename\n" 1816*7e382390SJung-uk Kim " -S, --skel=FILE specify skeleton file\n" 1817*7e382390SJung-uk Kim " -t, --stdout write scanner on stdout instead of %s\n" 1818*7e382390SJung-uk Kim " --yyclass=NAME name of C++ class\n" 1819*7e382390SJung-uk Kim " --header-file=FILE create a C header file in addition to the scanner\n" 1820*7e382390SJung-uk Kim " --tables-file[=FILE] write tables to FILE\n" "\n" 1821*7e382390SJung-uk Kim "Scanner behavior:\n" 1822*7e382390SJung-uk Kim " -7, --7bit generate 7-bit scanner\n" 1823*7e382390SJung-uk Kim " -8, --8bit generate 8-bit scanner\n" 1824*7e382390SJung-uk Kim " -B, --batch generate batch scanner (opposite of -I)\n" 1825*7e382390SJung-uk Kim " -i, --case-insensitive ignore case in patterns\n" 1826*7e382390SJung-uk Kim " -l, --lex-compat maximal compatibility with original lex\n" 1827*7e382390SJung-uk Kim " -X, --posix-compat maximal compatibility with POSIX lex\n" 1828*7e382390SJung-uk Kim " -I, --interactive generate interactive scanner (opposite of -B)\n" 1829*7e382390SJung-uk Kim " --yylineno track line count in yylineno\n" 1830*7e382390SJung-uk Kim "\n" "Generated code:\n" 1831*7e382390SJung-uk Kim " -+, --c++ generate C++ scanner class\n" 1832*7e382390SJung-uk Kim " -Dmacro[=defn] #define macro defn (default defn is '1')\n" 1833*7e382390SJung-uk Kim " -L, --noline suppress #line directives in scanner\n" 1834*7e382390SJung-uk Kim " -P, --prefix=STRING use STRING as prefix instead of \"yy\"\n" 1835*7e382390SJung-uk Kim " -R, --reentrant generate a reentrant C scanner\n" 1836*7e382390SJung-uk Kim " --bison-bridge scanner for bison pure parser.\n" 1837*7e382390SJung-uk Kim " --bison-locations include yylloc support.\n" 1838*7e382390SJung-uk Kim " --stdinit initialize yyin/yyout to stdin/stdout\n" 1839*7e382390SJung-uk Kim " --nounistd do not include <unistd.h>\n" 1840*7e382390SJung-uk Kim " --noFUNCTION do not generate a particular FUNCTION\n" 1841*7e382390SJung-uk Kim "\n" "Miscellaneous:\n" 1842*7e382390SJung-uk Kim " -c do-nothing POSIX option\n" 1843*7e382390SJung-uk Kim " -n do-nothing POSIX option\n" 1844*7e382390SJung-uk Kim " -?\n" 1845*7e382390SJung-uk Kim " -h, --help produce this help message\n" 1846*7e382390SJung-uk Kim " -V, --version report %s version\n"), 1847*7e382390SJung-uk Kim backing_name, program_name, outfile_path, program_name); 1848*7e382390SJung-uk Kim 1849*7e382390SJung-uk Kim } 1850