From 6bce133f730f850d96904fd072b03e4e7091a8a7 Mon Sep 17 00:00:00 2001 From: thurston Date: Tue, 15 Apr 2008 20:19:17 +0000 Subject: [PATCH] Applied a patch from Andrei Polushin for setting the error message format. --error-format=gnu (default) --error-fromat=msvc Switched from strcasecmp to strcmp for testing long arguments. Changed ParamCheck::parameterArg -> paramArg. git-svn-id: http://svn.complang.org/ragel/trunk@434 052ea7fc-9027-0410-9066-f65837a77df0 --- common/common.cpp | 12 ++--- common/config.h.in | 1 - common/pcheck.h | 2 +- doc/ragel.1.in | 6 +++ ragel/main.cpp | 123 ++++++++++++++++++++++++++++++++++++++------------ ragel/ragel.h | 10 ++++ ragel/rlparse.kl | 2 +- ragel/rlscan.rl | 2 +- rlgen-cd/main.cpp | 32 ++++++------- rlgen-csharp/main.cpp | 32 ++++++------- rlgen-dot/main.cpp | 10 ++-- rlgen-java/main.cpp | 10 ++-- rlgen-ruby/main.cpp | 38 ++++++++-------- 13 files changed, 179 insertions(+), 101 deletions(-) diff --git a/common/common.cpp b/common/common.cpp index e15ff34..40b392b 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -191,7 +191,7 @@ bool ParamCheck::check() argv[iCurArg][0] != '-' || /* Not a param. */ argv[iCurArg][1] == 0 ) { /* Only a dash. */ parameter = 0; - parameterArg = 0; + paramArg = 0; iCurArg += 1; state = noparam; @@ -230,7 +230,7 @@ bool ParamCheck::check() /* We are the last arg so there * cannot be a parameter to it. */ parameter = argChar; - parameterArg = 0; + paramArg = 0; iCurArg += 1; argOffset = 0; state = invalid; @@ -239,7 +239,7 @@ bool ParamCheck::check() else { /* the parameter to the arg is the next arg. */ parameter = pSpecChar; - parameterArg = argv[iCurArg + 1]; + paramArg = argv[iCurArg + 1]; iCurArg += 2; argOffset = 0; state = match; @@ -249,7 +249,7 @@ bool ParamCheck::check() else { /* The param for the arg is built in. */ parameter = pSpecChar; - parameterArg = argOffset + 1; + paramArg = argOffset + 1; iCurArg += 1; argOffset = 0; state = match; @@ -260,7 +260,7 @@ bool ParamCheck::check() /* Good, we matched the parm and no * arg is required. */ parameter = pSpecChar; - parameterArg = 0; + paramArg = 0; argOffset += 1; state = match; return true; @@ -270,7 +270,7 @@ bool ParamCheck::check() /* We did not find a match. Bad Argument. */ parameter = argChar; - parameterArg = 0; + paramArg = 0; argOffset += 1; state = invalid; return true; diff --git a/common/config.h.in b/common/config.h.in index 0e58d79..eaacfb3 100644 --- a/common/config.h.in +++ b/common/config.h.in @@ -33,7 +33,6 @@ #undef GMCS #ifdef _MSC_VER -#define strcasecmp _stricmp #define strtoll _strtoi64 #pragma warning( disable: 4244 4250 4355 4800 ) #endif diff --git a/common/pcheck.h b/common/pcheck.h index 7d36a83..70a7ce4 100644 --- a/common/pcheck.h +++ b/common/pcheck.h @@ -29,7 +29,7 @@ public: bool check(); - char *parameterArg; /* The argument to the parameter. */ + char *paramArg; /* The argument to the parameter. */ char parameter; /* The parameter matched. */ enum { match, invalid, noparam } state; diff --git a/doc/ragel.1.in b/doc/ragel.1.in index 6593701..68142e2 100644 --- a/doc/ragel.1.in +++ b/doc/ragel.1.in @@ -67,6 +67,12 @@ is used (.c, .cpp, .m, .dot) .B \-s Print some statistics on standard error. .TP +.B \--error-format=gnu +Print error messages using the format "file:line:column:" (default) +.TP +.B \--error-format=msvc +Print error messages using the format "file(line,column):" +.TP .B \-d Do not remove duplicate actions from action lists. .TP diff --git a/ragel/main.cpp b/ragel/main.cpp index 09c9060..6d0303f 100644 --- a/ragel/main.cpp +++ b/ragel/main.cpp @@ -90,6 +90,9 @@ void usage() " -d Do not remove duplicates from action lists\n" " -I Add to the list of directories to search\n" " for included an imported files\n" +"error reporting format:\n" +" --error-format=gnu file:line:column: message (default)\n" +" --error-format=msvc file(line,column): message\n" "fsm minimization:\n" " -n Do not perform minimization\n" " -m Minimize at the end of the compilation\n" @@ -121,13 +124,45 @@ void usage() " -G2 Really fast goto-driven FSM\n" " -P N-Way Split really fast goto-driven FSM\n" ; + + exit(0); } -/* Print version information. */ +/* Print version information and exit. */ void version() { cout << "Ragel State Machine Compiler version " VERSION << " " PUBDATE << endl << "Copyright (c) 2001-2007 by Adrian Thurston" << endl; + exit(0); +} + +/* Error reporting format. */ +ErrorFormat errorFormat = ErrorFormatGNU; + +InputLoc makeInputLoc( const char *fileName, int line, int col) +{ + InputLoc loc = { fileName, line, col }; + return loc; +} + +ostream &operator<<( ostream &out, const InputLoc &loc ) +{ + assert( loc.fileName != 0 ); + switch ( errorFormat ) { + case ErrorFormatMSVC: + out << loc.fileName << "(" << loc.line; + if ( loc.col ) + out << "," << loc.col; + out << ")"; + break; + + default: + out << loc.fileName << ":" << loc.line; + if ( loc.col ) + out << ":" << loc.col; + break; + } + return out; } /* Total error count. */ @@ -136,9 +171,7 @@ int gblErrorCount = 0; /* Print the opening to a warning in the input, then return the error ostream. */ ostream &warning( const InputLoc &loc ) { - assert( loc.fileName != 0 ); - cerr << loc.fileName << ":" << loc.line << ":" << - loc.col << ": warning: "; + cerr << loc << ": warning: "; return cerr; } @@ -153,8 +186,7 @@ ostream &error() ostream &error( const InputLoc &loc ) { gblErrorCount += 1; - assert( loc.fileName != 0 ); - cerr << loc.fileName << ":" << loc.line << ": "; + cerr << loc << ": "; return cerr; } @@ -186,13 +218,13 @@ void processArgs( int argc, char **argv, char *&inputFileName, char *&outputFile /* Output. */ case 'o': - if ( *pc.parameterArg == 0 ) + if ( *pc.paramArg == 0 ) error() << "a zero length output file name was given" << endl; else if ( outputFileName != 0 ) error() << "more than one output file name was given" << endl; else { /* Ok, remember the output file name. */ - outputFileName = pc.parameterArg; + outputFileName = pc.paramArg; } break; @@ -238,42 +270,56 @@ void processArgs( int argc, char **argv, char *&inputFileName, char *&outputFile /* Machine spec. */ case 'S': - if ( *pc.parameterArg == 0 ) + 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.parameterArg; + machineSpec = pc.paramArg; frontendArgs.append( "-S" ); - frontendArgs.append( pc.parameterArg ); + frontendArgs.append( pc.paramArg ); } break; /* Machine path. */ case 'M': - if ( *pc.parameterArg == 0 ) + 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.parameterArg; + machineName = pc.paramArg; frontendArgs.append( "-M" ); - frontendArgs.append( pc.parameterArg ); + frontendArgs.append( pc.paramArg ); } break; case 'I': - if ( *pc.parameterArg == 0 ) + if ( *pc.paramArg == 0 ) error() << "please specify an argument to -I" << endl; else { - includePaths.append( pc.parameterArg ); + includePaths.append( pc.paramArg ); frontendArgs.append( "-I" ); - frontendArgs.append( pc.parameterArg ); + frontendArgs.append( pc.paramArg ); } break; + /* Error reporting format. */ + case 'E': + if ( pc.paramArg[0] == '0' ) + errorFormat = ErrorFormatGNU; + else if ( pc.paramArg[0] == '1' ) + errorFormat = ErrorFormatMSVC; + else { + error() << "-E" << pc.paramArg[0] << + " is an invalid argument" << endl; + } + frontendArgs.append( "-E" ); + frontendArgs.append( pc.paramArg ); + break; + /* Host language types. */ case 'C': hostLang = &hostLangC; @@ -299,44 +345,61 @@ void processArgs( int argc, char **argv, char *&inputFileName, char *&outputFile /* Version and help. */ case 'v': version(); - exit(0); + break; case 'H': case 'h': case '?': usage(); - exit(0); + break; case 's': printStatistics = true; frontendArgs.append( "-s" ); break; - case '-': - if ( strcasecmp(pc.parameterArg, "help") == 0 ) { + case '-': { + char *eq = strchr( pc.paramArg, '=' ); + + if ( eq != 0 ) + *eq++ = 0; + + if ( strcmp( pc.paramArg, "help" ) == 0 ) usage(); - exit(0); - } - else if ( strcasecmp(pc.parameterArg, "version") == 0 ) { + else if ( strcmp( pc.paramArg, "version" ) == 0 ) version(); - exit(0); + else if ( strcmp( pc.paramArg, "error-format" ) == 0 ) { + if ( eq == 0 ) + error() << "expecting '=value' for error-format" << endl; + else if ( strcmp( eq, "gnu" ) == 0 ) { + errorFormat = ErrorFormatGNU; + frontendArgs.append( "--error-format=gnu" ); + } + else if ( strcmp( eq, "msvc" ) == 0 ) { + errorFormat = ErrorFormatMSVC; + frontendArgs.append( "--error-format=msvc" ); + } + else { + error() << "invalid value for error-format" << endl; + } } else { - error() << "--" << pc.parameterArg << + error() << "--" << pc.paramArg << " is an invalid argument" << endl; } + } /* Passthrough args. */ case 'T': backendArgs.append( "-T" ); - backendArgs.append( pc.parameterArg ); + backendArgs.append( pc.paramArg ); break; case 'F': backendArgs.append( "-F" ); - backendArgs.append( pc.parameterArg ); + backendArgs.append( pc.paramArg ); break; case 'G': backendArgs.append( "-G" ); - backendArgs.append( pc.parameterArg ); + backendArgs.append( pc.paramArg ); break; case 'P': backendArgs.append( "-P" ); - backendArgs.append( pc.parameterArg ); + backendArgs.append( pc.paramArg ); break; case 'p': backendArgs.append( "-p" ); diff --git a/ragel/ragel.h b/ragel/ragel.h index bbb2e93..dc9b2f4 100644 --- a/ragel/ragel.h +++ b/ragel/ragel.h @@ -53,6 +53,13 @@ extern char *machineSpec, *machineName; extern bool printStatistics; extern bool wantDupsRemoved; +/* Error reporting format. */ +enum ErrorFormat { + ErrorFormatGNU, + ErrorFormatMSVC, +}; + +extern ErrorFormat errorFormat; extern int gblErrorCount; extern char mainMachine[]; @@ -64,6 +71,9 @@ struct InputLoc int col; }; +InputLoc makeInputLoc( const char *fileName, int line = 0, int col = 0 ); +std::ostream &operator<<( std::ostream &out, const InputLoc &loc ); + /* Error reporting. */ std::ostream &error(); std::ostream &error( const InputLoc &loc ); diff --git a/ragel/rlparse.kl b/ragel/rlparse.kl index 782208e..42d9732 100644 --- a/ragel/rlparse.kl +++ b/ragel/rlparse.kl @@ -1475,7 +1475,7 @@ ostream &Parser::parse_error( int tokId, Token &token ) /* Maintain the error count. */ gblErrorCount += 1; - cerr << token.loc.fileName << ":" << token.loc.line << ":" << token.loc.col << ": "; + cerr << token.loc << ": "; cerr << "at token "; if ( tokId < 128 ) cerr << "\"" << Parser_lelNames[tokId] << "\""; diff --git a/ragel/rlscan.rl b/ragel/rlscan.rl index c2e332c..341cb8b 100644 --- a/ragel/rlscan.rl +++ b/ragel/rlscan.rl @@ -242,7 +242,7 @@ ostream &Scanner::scan_error() { /* Maintain the error count. */ gblErrorCount += 1; - cerr << fileName << ":" << line << ":" << column << ": "; + cerr << makeInputLoc( fileName, line, column ) << ": "; return cerr; } diff --git a/rlgen-cd/main.cpp b/rlgen-cd/main.cpp index 7cd5fa6..13ed991 100644 --- a/rlgen-cd/main.cpp +++ b/rlgen-cd/main.cpp @@ -248,13 +248,13 @@ int main(int argc, char **argv) switch ( pc.parameter ) { /* Output. */ case 'o': - if ( *pc.parameterArg == 0 ) + if ( *pc.paramArg == 0 ) error() << "a zero length output file name was given" << endl; else if ( outputFileName != 0 ) error() << "more than one output file name was given" << endl; else { /* Ok, remember the output file name. */ - outputFileName = pc.parameterArg; + outputFileName = pc.paramArg; } break; @@ -264,43 +264,43 @@ int main(int argc, char **argv) /* Code style. */ case 'T': - if ( pc.parameterArg[0] == '0' ) + if ( pc.paramArg[0] == '0' ) codeStyle = GenTables; - else if ( pc.parameterArg[0] == '1' ) + else if ( pc.paramArg[0] == '1' ) codeStyle = GenFTables; else { - error() << "-T" << pc.parameterArg[0] << + error() << "-T" << pc.paramArg[0] << " is an invalid argument" << endl; exit(1); } break; case 'F': - if ( pc.parameterArg[0] == '0' ) + if ( pc.paramArg[0] == '0' ) codeStyle = GenFlat; - else if ( pc.parameterArg[0] == '1' ) + else if ( pc.paramArg[0] == '1' ) codeStyle = GenFFlat; else { - error() << "-F" << pc.parameterArg[0] << + error() << "-F" << pc.paramArg[0] << " is an invalid argument" << endl; exit(1); } break; case 'G': - if ( pc.parameterArg[0] == '0' ) + if ( pc.paramArg[0] == '0' ) codeStyle = GenGoto; - else if ( pc.parameterArg[0] == '1' ) + else if ( pc.paramArg[0] == '1' ) codeStyle = GenFGoto; - else if ( pc.parameterArg[0] == '2' ) + else if ( pc.paramArg[0] == '2' ) codeStyle = GenIpGoto; else { - error() << "-G" << pc.parameterArg[0] << + error() << "-G" << pc.paramArg[0] << " is an invalid argument" << endl; exit(1); } break; case 'P': codeStyle = GenSplit; - numSplitPartitions = atoi( pc.parameterArg ); + numSplitPartitions = atoi( pc.paramArg ); break; /* Version and help. */ @@ -311,16 +311,16 @@ int main(int argc, char **argv) usage(); exit(0); case '-': - if ( strcasecmp(pc.parameterArg, "help") == 0 ) { + if ( strcmp(pc.paramArg, "help") == 0 ) { usage(); exit(0); } - else if ( strcasecmp(pc.parameterArg, "version") == 0 ) { + else if ( strcmp(pc.paramArg, "version") == 0 ) { version(); exit(0); } else { - error() << "--" << pc.parameterArg << + error() << "--" << pc.paramArg << " is an invalid argument" << endl; break; } diff --git a/rlgen-csharp/main.cpp b/rlgen-csharp/main.cpp index be4d568..0b52c0a 100644 --- a/rlgen-csharp/main.cpp +++ b/rlgen-csharp/main.cpp @@ -206,13 +206,13 @@ int main(int argc, char **argv) switch ( pc.parameter ) { /* Output. */ case 'o': - if ( *pc.parameterArg == 0 ) + if ( *pc.paramArg == 0 ) error() << "a zero length output file name was given" << endl; else if ( outputFileName != 0 ) error() << "more than one output file name was given" << endl; else { /* Ok, remember the output file name. */ - outputFileName = pc.parameterArg; + outputFileName = pc.paramArg; } break; @@ -222,43 +222,43 @@ int main(int argc, char **argv) /* Code style. */ case 'T': - if ( pc.parameterArg[0] == '0' ) + if ( pc.paramArg[0] == '0' ) codeStyle = GenTables; - else if ( pc.parameterArg[0] == '1' ) + else if ( pc.paramArg[0] == '1' ) codeStyle = GenFTables; else { - error() << "-T" << pc.parameterArg[0] << + error() << "-T" << pc.paramArg[0] << " is an invalid argument" << endl; exit(1); } break; case 'F': - if ( pc.parameterArg[0] == '0' ) + if ( pc.paramArg[0] == '0' ) codeStyle = GenFlat; - else if ( pc.parameterArg[0] == '1' ) + else if ( pc.paramArg[0] == '1' ) codeStyle = GenFFlat; else { - error() << "-F" << pc.parameterArg[0] << + error() << "-F" << pc.paramArg[0] << " is an invalid argument" << endl; exit(1); } break; case 'G': - if ( pc.parameterArg[0] == '0' ) + if ( pc.paramArg[0] == '0' ) codeStyle = GenGoto; - else if ( pc.parameterArg[0] == '1' ) + else if ( pc.paramArg[0] == '1' ) codeStyle = GenFGoto; - else if ( pc.parameterArg[0] == '2' ) + else if ( pc.paramArg[0] == '2' ) codeStyle = GenIpGoto; else { - error() << "-G" << pc.parameterArg[0] << + error() << "-G" << pc.paramArg[0] << " is an invalid argument" << endl; exit(1); } break; case 'P': codeStyle = GenSplit; - numSplitPartitions = atoi( pc.parameterArg ); + numSplitPartitions = atoi( pc.paramArg ); break; /* Version and help. */ @@ -269,16 +269,16 @@ int main(int argc, char **argv) usage(); exit(0); case '-': - if ( strcasecmp(pc.parameterArg, "help") == 0 ) { + if ( strcmp(pc.paramArg, "help") == 0 ) { usage(); exit(0); } - else if ( strcasecmp(pc.parameterArg, "version") == 0 ) { + else if ( strcmp(pc.paramArg, "version") == 0 ) { version(); exit(0); } else { - error() << "--" << pc.parameterArg << + error() << "--" << pc.paramArg << " is an invalid argument" << endl; break; } diff --git a/rlgen-dot/main.cpp b/rlgen-dot/main.cpp index d5bd5f3..d5b1618 100644 --- a/rlgen-dot/main.cpp +++ b/rlgen-dot/main.cpp @@ -142,13 +142,13 @@ int main(int argc, char **argv) switch ( pc.parameter ) { /* Output. */ case 'o': - if ( *pc.parameterArg == 0 ) + if ( *pc.paramArg == 0 ) error() << "a zero length output file name was given" << endl; else if ( outputFileName != 0 ) error() << "more than one output file name was given" << endl; else { /* Ok, remember the output file name. */ - outputFileName = pc.parameterArg; + outputFileName = pc.paramArg; } break; @@ -164,16 +164,16 @@ int main(int argc, char **argv) usage(); exit(0); case '-': - if ( strcasecmp(pc.parameterArg, "help") == 0 ) { + if ( strcmp(pc.paramArg, "help") == 0 ) { usage(); exit(0); } - else if ( strcasecmp(pc.parameterArg, "version") == 0 ) { + else if ( strcmp(pc.paramArg, "version") == 0 ) { version(); exit(0); } else { - error() << "--" << pc.parameterArg << + error() << "--" << pc.paramArg << " is an invalid argument" << endl; break; } diff --git a/rlgen-java/main.cpp b/rlgen-java/main.cpp index da8abd4..0585ecb 100644 --- a/rlgen-java/main.cpp +++ b/rlgen-java/main.cpp @@ -154,13 +154,13 @@ int main(int argc, char **argv) switch ( pc.parameter ) { /* Output. */ case 'o': - if ( *pc.parameterArg == 0 ) + if ( *pc.paramArg == 0 ) error() << "a zero length output file name was given" << endl; else if ( outputFileName != 0 ) error() << "more than one output file name was given" << endl; else { /* Ok, remember the output file name. */ - outputFileName = pc.parameterArg; + outputFileName = pc.paramArg; } break; @@ -172,16 +172,16 @@ int main(int argc, char **argv) usage(); exit(0); case '-': - if ( strcasecmp(pc.parameterArg, "help") == 0 ) { + if ( strcmp(pc.paramArg, "help") == 0 ) { usage(); exit(0); } - else if ( strcasecmp(pc.parameterArg, "version") == 0 ) { + else if ( strcmp(pc.paramArg, "version") == 0 ) { version(); exit(0); } else { - error() << "--" << pc.parameterArg << + error() << "--" << pc.paramArg << " is an invalid argument" << endl; break; } diff --git a/rlgen-ruby/main.cpp b/rlgen-ruby/main.cpp index 137773c..33ac682 100644 --- a/rlgen-ruby/main.cpp +++ b/rlgen-ruby/main.cpp @@ -201,55 +201,55 @@ int main(int argc, char **argv) switch ( pc.parameter ) { /* Output. */ case 'o': - if ( *pc.parameterArg == 0 ) + if ( *pc.paramArg == 0 ) error() << "a zero length output file name was given" << endl; else if ( outputFileName != 0 ) error() << "more than one output file name was given" << endl; else { /* Ok, remember the output file name. */ - outputFileName = pc.parameterArg; + outputFileName = pc.paramArg; } break; /* Code style. */ case 'T': - if ( pc.parameterArg[0] == '0' ) + if ( pc.paramArg[0] == '0' ) codeStyle = GenTables; - else if ( pc.parameterArg[0] == '1' ) + else if ( pc.paramArg[0] == '1' ) codeStyle = GenFTables; else { - error() << "-T" << pc.parameterArg[0] << + error() << "-T" << pc.paramArg[0] << " is an invalid argument" << endl; exit(1); } break; case 'F': - if ( pc.parameterArg[0] == '0' ) + if ( pc.paramArg[0] == '0' ) codeStyle = GenFlat; - else if ( pc.parameterArg[0] == '1' ) + else if ( pc.paramArg[0] == '1' ) codeStyle = GenFFlat; else { - error() << "-F" << pc.parameterArg[0] << + error() << "-F" << pc.paramArg[0] << " is an invalid argument" << endl; exit(1); } break; case 'G': - if ( pc.parameterArg[0] == '0' ) + if ( pc.paramArg[0] == '0' ) codeStyle = GenGoto; - else if ( pc.parameterArg[0] == '1' ) + else if ( pc.paramArg[0] == '1' ) codeStyle = GenFGoto; - else if ( pc.parameterArg[0] == '2' ) + else if ( pc.paramArg[0] == '2' ) codeStyle = GenIpGoto; else { - error() << "-G" << pc.parameterArg[0] << + error() << "-G" << pc.paramArg[0] << " is an invalid argument" << endl; exit(1); } break; case 'P': codeStyle = GenSplit; - numSplitPartitions = atoi( pc.parameterArg ); + numSplitPartitions = atoi( pc.paramArg ); break; case 'x': @@ -265,19 +265,19 @@ int main(int argc, char **argv) exit(0); case '-': - if ( strcasecmp(pc.parameterArg, "help") == 0 ) { + if ( strcmp(pc.paramArg, "help") == 0 ) { usage(); exit(0); } - else if ( strcasecmp(pc.parameterArg, "version") == 0 ) { + else if ( strcmp(pc.paramArg, "version") == 0 ) { version(); exit(0); } - else if ( strcasecmp(pc.parameterArg, "rbx") == 0 ) { - rubyImpl = Rubinius; - } + else if ( strcmp(pc.paramArg, "rbx") == 0 ) { + rubyImpl = Rubinius; + } else { - error() << "--" << pc.parameterArg << + error() << "--" << pc.paramArg << " is an invalid argument" << endl; break; } -- 2.7.4