in ragel/src/ragel/main.cpp [218:446]
void processArgs( int argc, const char **argv, InputData &id )
{
ParamCheck pc("xo:dnmleabjkS:M:I:CDEJZRAOvHh?-:sT:F:G:P:LpV", argc, argv);
/* FIXME: Need to check code styles VS langauge. */
while ( pc.check() ) {
switch ( pc.state ) {
case ParamCheck::match:
switch ( pc.parameter ) {
case 'V':
generateDot = true;
break;
case 'x':
generateXML = true;
break;
/* Output. */
case 'o':
if ( *pc.paramArg == 0 )
error() << "a zero length output file name was given" << endl;
else if ( id.outputFileName != 0 )
error() << "more than one output file name was given" << endl;
else {
/* Ok, remember the output file name. */
id.outputFileName = pc.paramArg;
}
break;
/* Flag for turning off duplicate action removal. */
case 'd':
wantDupsRemoved = false;
break;
/* Minimization, mostly hidden options. */
case 'n':
minimizeOpt = MinimizeNone;
break;
case 'm':
minimizeOpt = MinimizeEnd;
break;
case 'l':
minimizeOpt = MinimizeMostOps;
break;
case 'e':
minimizeOpt = MinimizeEveryOp;
break;
case 'a':
minimizeLevel = MinimizeApprox;
break;
case 'b':
minimizeLevel = MinimizeStable;
break;
case 'j':
minimizeLevel = MinimizePartition1;
break;
case 'k':
minimizeLevel = MinimizePartition2;
break;
/* Machine spec. */
case 'S':
if ( *pc.paramArg == 0 )
error() << "please specify an argument to -S" << endl;
else if ( machineSpec != 0 )
error() << "more than one -S argument was given" << endl;
else {
/* Ok, remember the path to the machine to generate. */
machineSpec = pc.paramArg;
}
break;
/* Machine path. */
case 'M':
if ( *pc.paramArg == 0 )
error() << "please specify an argument to -M" << endl;
else if ( machineName != 0 )
error() << "more than one -M argument was given" << endl;
else {
/* Ok, remember the machine name to generate. */
machineName = pc.paramArg;
}
break;
case 'I':
if ( *pc.paramArg == 0 )
error() << "please specify an argument to -I" << endl;
else {
id.includePaths.append( pc.paramArg );
}
break;
/* Host language types. */
case 'C':
hostLang = &hostLangC;
break;
case 'D':
hostLang = &hostLangD;
break;
case 'E':
hostLang = &hostLangD2;
break;
case 'Z':
hostLang = &hostLangGo;
break;
case 'J':
hostLang = &hostLangJava;
break;
case 'R':
hostLang = &hostLangRuby;
break;
case 'A':
hostLang = &hostLangCSharp;
break;
case 'O':
hostLang = &hostLangOCaml;
break;
/* Version and help. */
case 'v':
version();
break;
case 'H': case 'h': case '?':
usage();
break;
case 's':
printStatistics = true;
break;
case '-': {
char *arg = strdup( pc.paramArg );
char *eq = strchr( arg, '=' );
if ( eq != 0 )
*eq++ = 0;
if ( strcmp( arg, "help" ) == 0 )
usage();
else if ( strcmp( arg, "version" ) == 0 )
version();
else if ( strcmp( arg, "error-format" ) == 0 ) {
if ( eq == 0 )
error() << "expecting '=value' for error-format" << endl;
else if ( strcmp( eq, "gnu" ) == 0 )
errorFormat = ErrorFormatGNU;
else if ( strcmp( eq, "msvc" ) == 0 )
errorFormat = ErrorFormatMSVC;
else
error() << "invalid value for error-format" << endl;
}
else if ( strcmp( arg, "rbx" ) == 0 )
rubyImpl = Rubinius;
else {
error() << "--" << pc.paramArg <<
" is an invalid argument" << endl;
}
free( arg );
break;
}
/* Passthrough args. */
case 'T':
if ( pc.paramArg[0] == '0' )
codeStyle = GenTables;
else if ( pc.paramArg[0] == '1' )
codeStyle = GenFTables;
else {
error() << "-T" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'F':
if ( pc.paramArg[0] == '0' )
codeStyle = GenFlat;
else if ( pc.paramArg[0] == '1' )
codeStyle = GenFFlat;
else {
error() << "-F" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'G':
if ( pc.paramArg[0] == '0' )
codeStyle = GenGoto;
else if ( pc.paramArg[0] == '1' )
codeStyle = GenFGoto;
else if ( pc.paramArg[0] == '2' )
codeStyle = GenIpGoto;
else {
error() << "-G" << pc.paramArg[0] <<
" is an invalid argument" << endl;
exit(1);
}
break;
case 'P':
codeStyle = GenSplit;
numSplitPartitions = atoi( pc.paramArg );
break;
case 'p':
displayPrintables = true;
break;
case 'L':
noLineDirectives = true;
break;
}
break;
case ParamCheck::invalid:
error() << "-" << pc.parameter << " is an invalid argument" << endl;
break;
case ParamCheck::noparam:
/* It is interpreted as an input file. */
if ( *pc.curArg == 0 )
error() << "a zero length input file name was given" << endl;
else if ( id.inputFileName != 0 )
error() << "more than one input file name was given" << endl;
else {
/* OK, Remember the filename. */
id.inputFileName = pc.curArg;
}
break;
}
}
}