summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.cc40
-rw-r--r--valexpr.h33
2 files changed, 58 insertions, 15 deletions
diff --git a/main.cc b/main.cc
index 5b4de2f0..661feb25 100644
--- a/main.cc
+++ b/main.cc
@@ -581,13 +581,45 @@ int main(int argc, char * argv[])
// Compile the sorting string
- if (! sort_string.empty())
- sort_order.reset(parse_value_expr(sort_string));
+ if (! sort_string.empty()) {
+ try {
+ std::istringstream stream(sort_string);
+ sort_order.reset(parse_value_expr(stream));
+ if (! stream.eof()) {
+ std::ostringstream err;
+ err << "Unexpected character '" << char(stream.peek()) << "'";
+ throw value_expr_error(err.str());
+ }
+ else if (! sort_order.get()) {
+ std::cerr << "Failed to parse sort criteria!" << std::endl;
+ return 1;
+ }
+ }
+ catch (const value_expr_error& err) {
+ std::cerr << "Error in sort criteria: " << err.what() << std::endl;
+ return 1;
+ }
+ }
// Setup the meaning of %t and %T, used in format strings
- format_t::value_expr.reset(parse_value_expr(value_expr));
- format_t::total_expr.reset(parse_value_expr(total_expr));
+ try {
+ format_t::value_expr.reset(parse_value_expr(value_expr));
+ }
+ catch (const value_expr_error& err) {
+ std::cerr << "Error in amount (-t) specifier: " << err.what()
+ << std::endl;
+ return 1;
+ }
+
+ try {
+ format_t::total_expr.reset(parse_value_expr(total_expr));
+ }
+ catch (const value_expr_error& err) {
+ std::cerr << "Error in total (-T) specifier: " << err.what()
+ << std::endl;
+ return 1;
+ }
// Now handle the command that was identified above.
diff --git a/valexpr.h b/valexpr.h
index 26746130..d5a73e32 100644
--- a/valexpr.h
+++ b/valexpr.h
@@ -2,6 +2,7 @@
#define _EXPR_H
#include "ledger.h"
+#include "error.h"
namespace ledger {
@@ -128,19 +129,29 @@ class item_predicate
const value_expr_t * predicate;
public:
- item_predicate(const std::string& _predicate)
- : predicate(_predicate.empty() ?
- NULL : parse_value_expr(_predicate)) {
-#ifdef DEBUG_ENABLED
- DEBUG_CLASS("valexpr.predicate.parse");
+ item_predicate(const std::string& _predicate) {
+ predicate = NULL;
+ if (! _predicate.empty()) {
+ try {
+ DEBUG_CLASS("valexpr.predicate.parse");
- DEBUG_PRINT_("parsing: '" << _predicate << "'");
- if (DEBUG_() && ledger::debug_stream) {
- *ledger::debug_stream << "dump: ";
- dump_value_expr(*ledger::debug_stream, predicate);
- *ledger::debug_stream << std::endl;
- }
+ DEBUG_PRINT_("parsing: '" << _predicate << "'");
+ predicate = parse_value_expr(_predicate);
+
+#ifdef DEBUG_ENABLED
+ if (DEBUG_() && ledger::debug_stream) {
+ *ledger::debug_stream << "dump: ";
+ dump_value_expr(*ledger::debug_stream, predicate);
+ *ledger::debug_stream << std::endl;
+ }
#endif
+ }
+ catch (const value_expr_error& err) {
+ std::cerr << "Error in predicate '" << _predicate << "': "
+ << err.what() << std::endl;
+ std::exit(1);
+ }
+ }
}
item_predicate(const value_expr_t * _predicate)
: predicate(_predicate) {}