Fix a bug in Regex with brackets
authorMikko Rasa <tdb@tdb.fi>
Fri, 10 Aug 2007 19:43:55 +0000 (19:43 +0000)
committerMikko Rasa <tdb@tdb.fi>
Fri, 10 Aug 2007 19:43:55 +0000 (19:43 +0000)
Make the disassembly output of grep optional

grep.cpp
source/regex.cpp
source/regex.h

index 8c369a56f0c2fb3834c9d3ba5b0eed998ed92e67..eaf1663e7cf1098b42aabd4b9dc454b5f09f61e6 100644 (file)
--- a/grep.cpp
+++ b/grep.cpp
@@ -1,6 +1,7 @@
 /* $Id$ */
 #include <iostream>
 #include <string>
+#include <msp/core/getopt.h>
 #include "regex.h"
 
 using namespace std;
@@ -8,21 +9,27 @@ using namespace Msp;
 
 int main(int argc, char **argv)
 {
-       if(argc<2)
+       bool debug=false;
+       GetOpt getopt;
+       getopt.add_option('d', "debug", debug, GetOpt::NO_ARG);
+       getopt(argc, argv);
+
+       const list<string> &args=getopt.get_args();
+
+       if(args.empty())
        {
                cerr<<"Usage: "<<argv[0]<<" <regex>\n";
                return 1;
        }
 
        Regex regex(argv[1]);
-       cout<<regex.disassemble();
+       if(debug)
+               cout<<regex.disassemble();
        string line;
        while(getline(cin, line))
        {
                if(RegMatch match=regex.match(line))
-               {
                        cout<<line<<'\n';
-               }
        }
 
        return 0;
index ae3576ce5423930c4cfb225a51fbe42f649d3141..320705e8e33dc1cecbca03a26adab78e9d498805 100644 (file)
@@ -11,8 +11,6 @@ Distributed under the LGPL
 
 using namespace std;
 
-#include <iostream>
-
 namespace {
 
 /**
@@ -309,14 +307,14 @@ Regex::Code Regex::parse_brackets(const string &str, string::const_iterator &ite
        }
 
        string::const_iterator end=iter;
-       for(; (end!=str.end() && *end!=']'); ++end);
+       for(; (end!=str.end() && (end==iter || *end!=']')); ++end);
        if(end==str.end())
                throw InvalidParameterValue("Unmatched '['");
 
        uint8_t mask[32]={0};
        unsigned type=0;
        bool range=false;
-       unsigned char first, last;
+       unsigned char first=0, last=0;
        for(string::const_iterator i=iter; i!=end; ++i)
        {
                unsigned char c=*i;
@@ -502,7 +500,7 @@ bool Regex::group_compare(const RegMatch::Group &g1, const RegMatch::Group &g2)
 {
        if(!g1.match)
                return false;
-       
+
        // Any match is better than no match
        if(!g2.match)
                return true;
index 31b66d205eccee0c5d29f1eae2791d19750a9dec..3750025331e73a7601a76bb6b08a5176cc9c9379 100644 (file)
@@ -54,7 +54,7 @@ the input string, respectively.  They do not consume input.
 
 The MATCH_CHAR instruction consumes the input character and matches it against
 a single character.  Since regexes often match sequences of printable character,
-a match for such a character may be encoded as the character itself.
+a match for a non-opcode character may be encoded as the character itself.
 
 The MATCH_RANGE instruction consumes the input character and matches it against
 an inclusive character range.