From 79afbacfd2ce5c5b25bd38b9247977faf2cf5e34 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Wed, 12 Jun 2024 15:14:17 +0200 Subject: fix exception error messages --- Exception.cpp | 41 +++++++++++++++++++++++++++++++---------- Exception.h | 10 +++++++--- Parser.cpp | 4 +--- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/Exception.cpp b/Exception.cpp index c6dd60b..371aaa7 100644 --- a/Exception.cpp +++ b/Exception.cpp @@ -4,16 +4,6 @@ #include #include -Exception::Exception(const char * fmt, ...) { - va_list args; - va_start(args, fmt); - size_t sz = vsnprintf(NULL, 0, fmt, args) + 1; - if (error != NULL) free(error); - error = (char *) malloc(sz); - vsnprintf(error, sz, fmt, args); - va_end(args); -} - Exception::~Exception() { if (error != NULL) free(error); @@ -22,3 +12,34 @@ Exception::~Exception() { const char * Exception::what() { return error; } + +void Exception::va_format(va_list args, const char * fmt) { + va_list args_copy; + va_copy(args_copy, args); + + size_t sz = vsnprintf(NULL, 0, fmt, args_copy) + 1; + if (error != NULL) free(error); + error = (char *) malloc(sz); + va_end(args_copy); + + vsnprintf(error, sz, fmt, args); +} + +Exception::Exception(const char * fmt, ...) { + va_list args; + va_start(args, fmt); + va_format(args, fmt); + va_end(args); +} +CircuitException::CircuitException(const char * fmt, ...) { + va_list args; + va_start(args, fmt); + va_format(args, fmt); + va_end(args); +} +ParserException::ParserException(const char * fmt, ...) { + va_list args; + va_start(args, fmt); + va_format(args, fmt); + va_end(args); +} diff --git a/Exception.h b/Exception.h index ef45522..8f4ba4f 100644 --- a/Exception.h +++ b/Exception.h @@ -1,5 +1,6 @@ #pragma once +#include #include class Exception : public std::exception { @@ -8,16 +9,19 @@ public: virtual ~Exception(); virtual const char * what(); -private: +protected: + Exception() = default; + void va_format(va_list args, const char * fmt); char * error = NULL; }; class ParserException : public Exception { public: - ParserException(const char * fmt, ...) : Exception(fmt) {} + ParserException(const char * fmt, ...); }; class CircuitException : public Exception { public: - CircuitException(const char * fmt, ...) : Exception(fmt) {} + CircuitException(const char * fmt, ...); }; + diff --git a/Parser.cpp b/Parser.cpp index 50833d8..08ff2b0 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -5,7 +5,6 @@ using std::getline; - size_t Parser::filter(char * input) { size_t len = strlen(input), @@ -64,12 +63,11 @@ void Parser::parse(istream & input) { try { circuit->create(label, nodes); } catch(CircuitException & c) { - throw ParserException("Circuit error on line %u: %s", linenum, c.what()); + throw ParserException("line %u: %s", linenum, c.what()); } } } - istream & operator >> (istream & s, Parser & parser) { parser.parse(s); return s; -- cgit v1.2.3