diff options
-rw-r--r-- | Exception.cpp | 41 | ||||
-rw-r--r-- | Exception.h | 10 | ||||
-rw-r--r-- | 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 <cstdio> #include <cstdlib> -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 <cstdarg> #include <exception> 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, ...); }; + @@ -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; |