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
00027 #ifndef OBITERR_H
00028 #define OBITERR_H
00029 #include <glib.h>
00030
00031
00057
00062 enum ObitErrCode {
00064 OBIT_None = 0,
00066 OBIT_InfoErr,
00068 OBIT_InfoWarn,
00070 OBIT_Traceback,
00072 OBIT_MildError,
00074 OBIT_Error,
00076 OBIT_StrongError,
00078 OBIT_Fatal
00079 };
00083 typedef enum ObitErrCode ObitErrCode;
00084
00086 #define OBITERRBUFSIZE 120
00087
00088
00096 #define Obit_log_error(err,errCode,format...) G_STMT_START{ \
00097 g_snprintf (err->buffer, OBITERRBUFSIZE, format); \
00098 ObitErrPush (err, errCode, err->buffer); \
00099 if (errCode>OBIT_Traceback) { \
00100 g_snprintf (err->buffer, OBITERRBUFSIZE, \
00101 " This occured at file %s: line %d (%s)", \
00102 __FILE__, __LINE__, __PRETTY_FUNCTION__); \
00103 ObitErrPush (err, OBIT_Error, err->buffer); \
00104 } \
00105 }G_STMT_END
00106
00114 #define Obit_log_error_no_trace(err,errCode,format...) G_STMT_START{ \
00115 g_snprintf (err->buffer, OBITERRBUFSIZE, format); \
00116 ObitErrPush (err, errCode, err->buffer); \
00117 }G_STMT_END
00118
00127 #define Obit_return_if_fail(expr,err,format...) G_STMT_START{ \
00128 if (expr) { } else { \
00129 g_snprintf (err->buffer, OBITERRBUFSIZE, format); \
00130 ObitErrPush (err, OBIT_Error, err->buffer); \
00131 g_snprintf (err->buffer, OBITERRBUFSIZE, \
00132 " Occured at file %s: line %d (%s)", \
00133 __FILE__, __LINE__, __PRETTY_FUNCTION__); \
00134 ObitErrPush (err, OBIT_Error, err->buffer); \
00135 return; \
00136 } }G_STMT_END
00137
00148 #define Obit_retval_if_fail(expr,err,out,format...) G_STMT_START{ \
00149 if (expr) { } else { \
00150 g_snprintf (err->buffer, OBITERRBUFSIZE, format); \
00151 ObitErrPush (err, OBIT_Error, err->buffer); \
00152 g_snprintf (err->buffer, OBITERRBUFSIZE, \
00153 " Occured at file %s: line %d (%s)", \
00154 __FILE__, __LINE__, __PRETTY_FUNCTION__); \
00155 ObitErrPush (err, OBIT_Error, err->buffer); \
00156 return out; \
00157 } }G_STMT_END
00158
00166 #define Obit_traceback_msg(err,me,name) G_STMT_START{ \
00167 g_snprintf (err->buffer, OBITERRBUFSIZE, \
00168 "Traceback: routine %s: object %s", me, name); \
00169 ObitErrPush (err, OBIT_Traceback, err->buffer); \
00170 g_snprintf (err->buffer, OBITERRBUFSIZE, \
00171 " Occured at file %s: line %d (%s)", \
00172 __FILE__, __LINE__, __PRETTY_FUNCTION__); \
00173 ObitErrPush (err, OBIT_Traceback, err->buffer); \
00174 return; \
00175 }G_STMT_END
00176
00185 #define Obit_traceback_val(err,me,name,out) G_STMT_START{ \
00186 g_snprintf (err->buffer, OBITERRBUFSIZE, \
00187 "Traceback: routine %s: object %s", me, name); \
00188 ObitErrPush (err, OBIT_Traceback, err->buffer); \
00189 g_snprintf (err->buffer, OBITERRBUFSIZE, \
00190 " at file %s: line %d (%s)", \
00191 __FILE__, __LINE__, __PRETTY_FUNCTION__); \
00192 ObitErrPush (err, OBIT_Traceback, err->buffer); \
00193 return out; \
00194 }G_STMT_END
00195
00201 #define Obit_cfitsio_error(err) G_STMT_START{ \
00202 while (fits_read_errmsg(err->buffer)) \
00203 ObitErrPush (err, OBIT_Error, err->buffer); \
00204 fits_clear_errmsg(); }G_STMT_END
00205
00206
00208 typedef struct {
00210 gchar *className;
00212 gint16 number;
00214 gboolean error;
00216 GQueue *stack;
00218 gint32 ReferenceCount;
00220 gchar buffer[OBITERRBUFSIZE+1];
00221 } ObitErr;
00222
00224 typedef struct {
00226 ObitErrCode errLevel;
00228 gchar *errMsg;
00229 } ObitErrElem;
00230
00231
00232
00233
00235 ObitErr* newObitErr (void);
00236
00238 ObitErr* ObitErrRef (ObitErr* in);
00239
00241 ObitErr* ObitErrUnref (ObitErr* in);
00242
00244 void ObitErrClear (ObitErr* in);
00245
00247 void ObitErrClearErr (ObitErr* in);
00248
00250 void ObitErrPush (ObitErr *in, ObitErrCode errLevel, gchar *errMsg);
00251
00253 void ObitErrPop (ObitErr *in, ObitErrCode *errLevel, gchar **errMsg);
00254
00256 void ObitErrLog (ObitErr *in);
00257
00259 gboolean ObitErrIsA (ObitErr* in);
00260
00261 #endif
00262