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 #ifndef SIM_AVRERROR_H
00027 #define SIM_AVRERROR_H
00028
00029 #include <iostream>
00030
00031 #if defined(_MSC_VER) && !defined(SWIG)
00032 #define ATTRIBUTE_NORETURN __declspec(noreturn)
00033 #define ATTRIBUTE_PRINTF(string_arg, first_arg)
00034 #elif defined(__GNUC__)
00035 #define ATTRIBUTE_NORETURN __attribute__((noreturn))
00036 #define ATTRIBUTE_PRINTF(string_arg, first_arg) __attribute__ ((format (printf, string_arg, first_arg)))
00037 #else
00038 #define ATTRIBUTE_NORETURN
00039 #define ATTRIBUTE_PRINTF(string_arg, first_arg)
00040 #endif
00041
00043 class SystemConsoleHandler {
00044
00045 public:
00047
00049 SystemConsoleHandler();
00050 ~SystemConsoleHandler();
00051
00053 void SetUseExit(bool useExit = true);
00055 void SetMessageStream(std::ostream *s);
00057 void SetWarningStream(std::ostream *s);
00058
00060 void SetTraceFile(const char *name, unsigned int maxlines = 0);
00062 void SetTraceStream(std::ostream *s);
00064 void StopTrace(void);
00066 bool GetTraceState(void) { return traceEnabled; }
00068 std::ostream &traceOutStream(void) { return *traceStream; }
00070 void TraceNextLine(void);
00071
00073 void vfmessage(const char *file, int line, const char *fmt, ...)
00074 ATTRIBUTE_PRINTF(4, 5);
00076 void vfwarning(const char *file, int line, const char *fmt, ...)
00077 ATTRIBUTE_PRINTF(4, 5);
00079 void vferror(const char *file, int line, const char *fmt, ...)
00080 ATTRIBUTE_PRINTF(4, 5);
00082 ATTRIBUTE_NORETURN
00083 void vffatal(const char *file, int line, const char *fmt, ...)
00084 ATTRIBUTE_PRINTF(4, 5);
00085
00087 ATTRIBUTE_NORETURN
00088 void AbortApplication(int code);
00090 ATTRIBUTE_NORETURN
00091 void ExitApplication(int code);
00092
00093 protected:
00094 bool useExitAndAbort;
00095 char formatStringBuffer[128];
00096 char messageStringBuffer[512];
00097 std::ostream *msgStream;
00098 std::ostream *wrnStream;
00099 std::ostream *traceStream;
00100 std::ostream *nullStream;
00101 bool traceEnabled;
00102 bool traceToFile;
00103 std::string traceFilename;
00104 unsigned int traceLinesOnFile;
00105 unsigned int traceLines;
00106 int traceFileCount;
00107
00109 char *getFormatString(const char *prefix, const char *file, int line, const char *fmtstr);
00110 };
00111
00113 extern SystemConsoleHandler sysConHandler;
00114
00115
00116 #define traceOut sysConHandler.traceOutStream()
00117
00118
00120 extern int global_verbose_on;
00121
00122
00124 void trioaccess(const char *t, unsigned char val);
00125
00126 #define avr_message(fmt, ...) sysConHandler.vfmessage(__FILE__, __LINE__, fmt, ## __VA_ARGS__)
00127 #define avr_warning(fmt, ...) sysConHandler.vfwarning(__FILE__, __LINE__, fmt, ## __VA_ARGS__)
00128 #define avr_failure(fmt, ...) sysConHandler.vferror(__FILE__, __LINE__, fmt, ## __VA_ARGS__)
00129 #define avr_error(fmt, ...) sysConHandler.vffatal(__FILE__, __LINE__, fmt, ## __VA_ARGS__)
00130
00131 #endif