# # # patch "grep.cc" # from [eead365196620a945d5e037eba4bac53804362c3] # to [5cd119b4d61791c2aa43f955e8ce4be8c334582c] # # patch "mangle.cc" # from [0eb62d97918c594ab0f1797f036a8986eac7359c] # to [6973b0438fd7c6180d6bb78fabdd46d4b290fb03] # ============================================================ --- grep.cc eead365196620a945d5e037eba4bac53804362c3 +++ grep.cc 5cd119b4d61791c2aa43f955e8ce4be8c334582c @@ -31,6 +31,7 @@ struct stanza_matcher { boost::regex re; + stanza_matcher(){} stanza_matcher(string const &s); bool match(stanza const &s); }; @@ -78,13 +79,22 @@ if (vm.count("help") || !vm.count("pattern") || !vm.count("delim")) { - cout << desc << "\n"; - cout << "--pattern must be given once, " + cerr << desc << "\n"; + cerr << "--pattern must be given once, " << "and --delim must be given at least once.\n"; return 1; } - stanza_matcher sm(vm["pattern"].as()); + stanza_matcher sm; + try + { + sm = stanza_matcher(vm["pattern"].as()); + } + catch (boost::regex_error &e) + { + cerr << "Invalid pattern: " << e.what() << "\n"; + return 1; + } bool inverse(false); if (vm.count("reverse")) ============================================================ --- mangle.cc 0eb62d97918c594ab0f1797f036a8986eac7359c +++ mangle.cc 6973b0438fd7c6180d6bb78fabdd46d4b290fb03 @@ -24,6 +24,7 @@ using std::vector; using std::cin; using std::cout; +using std::cerr; using std::pair; using std::make_pair; using basic_io::stanza; @@ -48,11 +49,11 @@ if (vm.count("help") || !vm.count("pattern") || !vm.count("delim")) { - cout << desc << "\n"; - cout << "--pattern is required, " + cerr << desc << "\n"; + cerr << "--pattern is required, " << "and --delim must be given at least once.\n"; - cout << "field 0 is the key name\n"; - cout << "other fields are numberd 1 to n, and -n to -1\n"; + cerr << "field 0 is the key name\n"; + cerr << "other fields are numberd 1 to n, and -n to -1\n"; return 1; } string sep(" "); @@ -85,16 +86,17 @@ } vector > fields; - { - vector f = vm["field"].as >(); - for (vector::iterator i = f.begin(); i != f.end(); ++i) - { - unsigned int n = i->rfind(','); - string key = i->substr(0, n); - int pos = lexical_cast(i->substr(n+1)); - fields.push_back(make_pair(key, pos)); - } - } + if (vm.count("field")) + { + vector f = vm["field"].as >(); + for (vector::iterator i = f.begin(); i != f.end(); ++i) + { + unsigned int n = i->rfind(','); + string key = i->substr(0, n); + int pos = lexical_cast(i->substr(n+1)); + fields.push_back(make_pair(key, pos)); + } + } stanza st; stanza_reader sr(cin, vm["delim"].as >()); @@ -122,8 +124,24 @@ s += j->values[i->second-1].parsed; } } - f % s; + try + { + f % s; + } + catch (boost::io::too_many_args &) + { + cerr << "Bad format string: fewer %-substitutions than specified fields\n"; + return 1; + } } - cout<