00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00035 #include <fstream>
00036 #include <sstream>
00037
00038 #include <stdio.h>
00039 #include <stdlib.h>
00040 #include <stdarg.h>
00041 #include <string.h>
00042
00043 #include "avrerror.h"
00044 #include "helper.h"
00045
00046
00047 #include "config.h"
00048
00049 #ifdef _MSC_VER
00050 # define snprintf _snprintf
00051 #endif
00052
00053 SystemConsoleHandler::SystemConsoleHandler() {
00054 useExitAndAbort = true;
00055 nullStream = new std::ostream(0);
00056 msgStream = &std::cout;
00057 wrnStream = &std::cerr;
00058 traceStream = nullStream;
00059 traceEnabled = false;
00060 }
00061
00062 SystemConsoleHandler::~SystemConsoleHandler() {
00063 StopTrace();
00064 delete nullStream;
00065 }
00066
00067 void SystemConsoleHandler::SetUseExit(bool useExit) {
00068 useExitAndAbort = useExit;
00069 }
00070
00071 void SystemConsoleHandler::SetMessageStream(std::ostream *s) {
00072 msgStream = s;
00073 }
00074
00075 void SystemConsoleHandler::SetWarningStream(std::ostream *s) {
00076 wrnStream = s;
00077 }
00078
00079 void SystemConsoleHandler::SetTraceFile(const char *name, unsigned int maxlines) {
00080 StopTrace();
00081 std::ofstream* os = new std::ofstream();
00082 os->open(name);
00083 traceFilename = name;
00084 traceStream = os;
00085 traceFileCount = 1;
00086 traceLinesOnFile = maxlines;
00087 traceLines = 0;
00088 traceEnabled = true;
00089 traceToFile = true;
00090 }
00091
00092 void SystemConsoleHandler::SetTraceStream(std::ostream *s) {
00093 StopTrace();
00094 traceStream = s;
00095 traceEnabled = true;
00096 traceToFile = false;
00097 }
00098
00099 void SystemConsoleHandler::StopTrace(void) {
00100 if(!traceEnabled)
00101 return;
00102 if(traceToFile)
00103 ((std::ofstream *)traceStream)->close();
00104 traceStream = nullStream;
00105 traceEnabled = false;
00106 }
00107
00108 void SystemConsoleHandler::TraceNextLine(void) {
00109 if(!traceEnabled || !traceToFile)
00110 return;
00111
00112 traceLines++;
00113 if(traceLines >= traceLinesOnFile) {
00114 traceFileCount++;
00115 traceLines = 0;
00116
00117 ((std::ofstream *)traceStream)->close();
00118 delete traceStream;
00119
00120 std::ostringstream n;
00121 int idx = traceFilename.rfind('.');
00122 n << traceFilename.substr(0, idx) << "_" << traceFileCount << traceFilename.substr(idx);
00123 std::ofstream* os = new std::ofstream();
00124 os->open(n.str().c_str());
00125
00126 traceStream = os;
00127 }
00128 }
00129
00130 void SystemConsoleHandler::vfmessage(const char *file, int line, const char *fmt, ...) {
00131 va_list ap;
00132 char *mfmt = getFormatString("MESSAGE", file, line, fmt);
00133 va_start(ap, fmt);
00134 vsnprintf(messageStringBuffer, sizeof(messageStringBuffer), mfmt, ap);
00135 va_end(ap);
00136 if(fmt[strlen(fmt) - 1] != '\n')
00137 *wrnStream << std::endl;
00138 *msgStream << messageStringBuffer;
00139 }
00140
00141 void SystemConsoleHandler::vfwarning(const char *file, int line, const char *fmt, ...) {
00142 va_list ap;
00143 char *mfmt = getFormatString("WARNING", file, line, fmt);
00144 va_start(ap, fmt);
00145 vsnprintf(messageStringBuffer, sizeof(messageStringBuffer), mfmt, ap);
00146 va_end(ap);
00147 *wrnStream << messageStringBuffer;
00148 if(fmt[strlen(fmt) - 1] != '\n')
00149 *wrnStream << std::endl;
00150 wrnStream->flush();
00151 }
00152
00153 void SystemConsoleHandler::vferror(const char *file, int line, const char *fmt, ...) {
00154 va_list ap;
00155 char *mfmt = getFormatString("ERROR", file, line, fmt);
00156 va_start(ap, fmt);
00157 vsnprintf(messageStringBuffer, sizeof(messageStringBuffer), mfmt, ap);
00158 va_end(ap);
00159 *wrnStream << messageStringBuffer;
00160 if(fmt[strlen(fmt) - 1] != '\n')
00161 *wrnStream << std::endl;
00162 wrnStream->flush();
00163 }
00164
00165 void SystemConsoleHandler::vffatal(const char *file, int line, const char *fmt, ...) {
00166 va_list ap;
00167 char *mfmt = getFormatString("FATAL", file, line, fmt);
00168 va_start(ap, fmt);
00169 vsnprintf(messageStringBuffer, sizeof(messageStringBuffer), mfmt, ap);
00170 va_end(ap);
00171 if(useExitAndAbort) {
00172 *wrnStream << "\n" << messageStringBuffer << "\n" << std::endl;
00173 exit(1);
00174 } else {
00175 throw (char const*)messageStringBuffer;
00176 }
00177 }
00178
00179 void SystemConsoleHandler::AbortApplication(int code) {
00180 if(useExitAndAbort) {
00181 #if defined(HAVE_SYS_MINGW) || defined(_MSC_VER)
00182
00183
00184
00185 exit(3);
00186 #else
00187 abort();
00188 #endif
00189 } else {
00190 throw -code;
00191 }
00192 }
00193
00194 void SystemConsoleHandler::ExitApplication(int code) {
00195 if(useExitAndAbort) {
00196 exit(code);
00197 } else {
00198 throw code;
00199 }
00200 }
00201
00202 char* SystemConsoleHandler::getFormatString(const char *prefix,
00203 const char *file,
00204 int line,
00205 const char *fmtstr) {
00206 snprintf(formatStringBuffer,
00207 sizeof(formatStringBuffer),
00208 "%s: file %s: line %d: %s",
00209 prefix,
00210 file,
00211 line,
00212 fmtstr);
00213 formatStringBuffer[sizeof(formatStringBuffer) - 1] = '\0';
00214 return formatStringBuffer;
00215 }
00216
00217
00218 SystemConsoleHandler sysConHandler;
00219
00220 int global_verbose_on = 0;
00221
00222 void trioaccess(const char *t, unsigned char val) {
00223 sysConHandler.traceOutStream() << t << "=" << HexChar(val) << " ";
00224 }
00225
00226