edt_error.c

Go to the documentation of this file.
00001 
00009 #include "edt_utils.h"
00010 #include "edt_error.h"
00011 
00012 #include <stdlib.h>
00013 #include <string.h>
00014 
00015 #include <stdarg.h>
00016 
00017 #ifdef WIN32
00018 
00019 #include <windows.h>
00020 #include <process.h>
00021 
00022 #else
00023 
00024 #ifndef VXWORKS
00025 #include <sys/errno.h>
00026 #endif
00027 
00028 #endif
00029 
00030 
00031 
00032 #define MAX_MESSAGE 512
00033 
00034 #ifdef PDV
00035 #define EDT_DEFAULT_MSG_LEVEL     EDTAPP_MSG_FATAL \
00036     | EDTAPP_MSG_WARNING \
00037     | EDTLIB_MSG_FATAL \
00038     | EDTLIB_MSG_WARNING \
00039     | PDVLIB_MSG_FATAL \
00040     | PDVLIB_MSG_WARNING
00041 #else
00042 #define EDT_DEFAULT_MSG_LEVEL     EDTAPP_MSG_FATAL \
00043     | EDTAPP_MSG_WARNING \
00044     | EDTLIB_MSG_FATAL \
00045     | EDTLIB_MSG_WARNING 
00046 #endif
00047 
00048 static char edt_last_error_message[MAX_MESSAGE];
00049 
00050 EdtMsgHandler edt_default_msg;
00051 static int edt_default_msg_initialized = 0;
00052 
00053 static int 
00054 edt_msg_printf(void *f_p, int level, char *message)
00055 {
00056     FILE *f = (FILE *) f_p;
00057 
00058 
00059     if (f)
00060         return fprintf(f, message);
00061 
00062     else
00063         return -1;
00064 
00065 }
00066 
00067 static void 
00068 edt_msg_close_file(EdtMsgHandler *msg_p)
00069 
00070 {
00071     if (msg_p->own_file && msg_p->file)
00072         fclose(msg_p->file);
00073 
00074     if (msg_p->target == msg_p->file)
00075         msg_p->target = NULL;
00076 
00077     msg_p->file = NULL;
00078     msg_p->own_file = 0;
00079 
00080 }
00081 
00082 
00083 /* copied from libedt.c, so we don't need to link to that just for this function
00084 */
00085 static unsigned 
00086 edt_err_num(void)
00087 {
00088 #ifdef _NT_
00089     return GetLastError();
00090 #else 
00091     extern int errno;
00092     return errno;
00093 #endif
00094 }
00095 
00096 static int
00097 edt_msg_output_vprintf_perror(EdtMsgHandler *msg_p,  int level, char *format, va_list ap)
00098 {
00099 
00100     char *fullmsg; /* callers message + perror message */
00101     int success = -1;
00102     /* copy of last errno so no problem if it changes while executing this func. */
00103     unsigned error = edt_err_num(); 
00104 
00105 #ifdef _NT_
00106     LPVOID *  lpMsgBuf;
00107 #else
00108     char *errstr; /* perror message */
00109     extern int errno;
00110 #endif
00111 
00112     if (msg_p == &edt_default_msg)
00113     {
00114         if (!edt_default_msg_initialized)
00115             edt_msg_init(msg_p);
00116     }
00117 
00118     if (!(level & msg_p->level))
00119         return 0;
00120 
00121 
00122     /* get caller's string...  */ 
00123 
00124     vsprintf(edt_last_error_message, format, ap);
00125 
00126     /* ... then add system error string to it. */
00127 #ifdef _NT_
00128 
00129     FormatMessage(
00130         FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
00131         NULL,
00132         error,
00133         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),      /* Default language */
00134         (LPTSTR) & lpMsgBuf,
00135         0,
00136         NULL
00137         );
00138     /* add three for \n and ": " chars. */
00139     fullmsg = (char *)malloc(strlen(edt_last_error_message) + strlen( (char*)lpMsgBuf ) + 3*sizeof(char) +1);
00140     sprintf(fullmsg, "%s: %s\n", edt_last_error_message, (char*)lpMsgBuf);
00141     LocalFree(lpMsgBuf);
00142 #else
00143     errstr = strerror(error);
00144     /* add three for \n and ": " chars. */
00145     fullmsg = (char *)malloc(strlen(edt_last_error_message) + strlen(errstr) + 3*sizeof(char));
00146     sprintf(fullmsg, "%s: %s\n", edt_last_error_message, errstr);
00147 #endif
00148 
00149 
00150     if (msg_p->func) {
00151         success = msg_p->func(msg_p->target, level, fullmsg);
00152     }
00153 
00154     free(fullmsg);
00155     return success;
00156 }
00157 
00158 
00159 
00176 void 
00177 edt_msg_init(EdtMsgHandler *msg_p)
00178 
00179 {
00180     if (msg_p)
00181     {
00182         msg_p->file = stderr;
00183         msg_p->own_file = 0;
00184         msg_p->level = EDT_DEFAULT_MSG_LEVEL;
00185         msg_p->func = edt_msg_printf;
00186         msg_p->target = msg_p->file;
00187     }
00188 
00189     if (msg_p == &edt_default_msg)
00190         edt_default_msg_initialized = 1;
00191 }
00192 
00193 
00203 void 
00204 edt_msg_init_names(EdtMsgHandler *msg_p, char *file, int level)
00205 
00206 {
00207     edt_msg_init(msg_p);
00208     edt_msg_set_name(msg_p, file);
00209     edt_msg_set_level(msg_p, level);
00210 
00211 }
00212 
00223 void 
00224 edt_msg_init_files(EdtMsgHandler *msg_p, FILE *file, int level)
00225 
00226 {
00227     edt_msg_init(msg_p);
00228     edt_msg_set_file(msg_p, file);
00229     edt_msg_set_level(msg_p, level);
00230 }
00231 
00232 
00233 
00248 void 
00249 edt_msg_close(EdtMsgHandler *msg_p)
00250 
00251 {
00252     edt_msg_close_file(msg_p);
00253 }
00254 
00255 
00256 
00281 int
00282 edt_msg(int level, char *format, ...)
00283 {
00284     va_list     stack;
00285 
00286     if (!edt_default_msg_initialized)
00287         edt_msg_init(&edt_default_msg);
00288 
00289     if (!(level & edt_default_msg.level))
00290         return 0;
00291 
00292     va_start(stack,     format);
00293 
00294     vsprintf(edt_last_error_message, format, stack);
00295 
00296     if (edt_default_msg.func)
00297         return edt_default_msg.func(edt_default_msg.target, level, edt_last_error_message);
00298     return -1;
00299 
00300 }
00301 
00302 
00303 
00346 int
00347 edt_msg_output(EdtMsgHandler *msg_p,  int level, char *format, ...)
00348 {
00349 
00350     va_list     stack;
00351 
00352 
00353     if (msg_p == &edt_default_msg)
00354     {
00355         if (!edt_default_msg_initialized)
00356             edt_msg_init(msg_p);
00357     }
00358 
00359     if (!(level & msg_p->level))
00360         return 0;
00361 
00362     va_start(stack,     format);
00363 
00364     vsprintf(edt_last_error_message, format, stack);
00365 
00366     if (msg_p->func)
00367         return msg_p->func(msg_p->target, level, edt_last_error_message);
00368 
00369     return -1;
00370 }
00371 
00372 
00373 
00374 
00391 void 
00392 edt_msg_set_level(EdtMsgHandler *msg_p, int newlevel)
00393 
00394 {
00395     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00396         edt_msg_init(&edt_default_msg);
00397 
00398     msg_p->level  = newlevel;
00399 
00400 }
00401 
00409 int 
00410 edt_msg_get_level(EdtMsgHandler *msg_p) 
00411 {
00412     return msg_p->level;
00413 }
00414 
00415 
00423 void 
00424 edt_msg_add_level(EdtMsgHandler *msg_p, int level) 
00425 {
00426     edt_msg_set_level(msg_p, edt_msg_get_level(msg_p) | level);
00427 }
00428 
00429 
00443 void 
00444 edt_msg_set_function(EdtMsgHandler *msg_p, EdtMsgFunction f)
00445 
00446 {
00447     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00448         edt_msg_init(&edt_default_msg);
00449 
00450     msg_p->func = f;
00451 }
00452 
00479 void 
00480 edt_msg_set_file(EdtMsgHandler *msg_p, FILE *fp)
00481 
00482 {
00483     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00484         edt_msg_init(&edt_default_msg);
00485 
00486     edt_msg_close_file(msg_p);
00487 
00488     msg_p->file = fp; 
00489 
00490     msg_p->own_file = 0;
00491 }
00492 
00493 
00501 void 
00502 edt_msg_set_name(EdtMsgHandler *msg_p, char *name)
00503 
00504 {
00505     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00506         edt_msg_init(&edt_default_msg);
00507 
00508     edt_msg_close_file(msg_p);
00509 
00510     msg_p->file = fopen(name, "wb");
00511 
00512     msg_p->own_file = (msg_p->file != NULL);
00513     edt_msg_set_target(msg_p, msg_p->file);
00514 
00515 }
00516 
00526 void 
00527 edt_msg_set_target(EdtMsgHandler *msg_p, void *target)
00528 
00529 {
00530     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00531         edt_msg_init(&edt_default_msg);
00532 
00533     msg_p->target = target;
00534 }
00535 
00536 
00556 int
00557 edt_msg_perror(int level, const char *msg)
00558 
00559 {
00561     char message[MAX_MESSAGE];
00562 
00563 #ifdef _NT_
00564     LPVOID *  lpMsgBuf;
00565 #else
00566     extern int errno;
00567 #endif
00568 
00569     if (!edt_default_msg_initialized)
00570         edt_msg_init(&edt_default_msg);
00571 
00572     if (!(level & edt_default_msg.level))
00573         return 0;
00574 
00575 #ifdef _NT_
00576 
00577     FormatMessage(
00578         FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
00579         NULL,
00580         GetLastError(),
00581         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),      /* Default language */
00582         (LPTSTR) & lpMsgBuf,
00583         0,
00584         NULL
00585         );
00586 
00587     sprintf(message, "%s: %s\n", msg, lpMsgBuf);
00588     LocalFree(lpMsgBuf);
00589 #else
00590     sprintf(message, "%s: %s\n", msg, strerror(errno));
00591 #endif
00592     return edt_msg(level, message);
00593 }
00594 
00595 
00608 int
00609 edt_msg_output_perror(EdtMsgHandler *msg_p, int level, char *msg)
00610 
00611 {
00612     char message[MAX_MESSAGE];
00613 
00614 #ifdef _NT_
00615     LPVOID *  lpMsgBuf;
00616 #else
00617     extern int errno;
00618 #endif
00619 
00620     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00621         edt_msg_init(&edt_default_msg);
00622 
00623 #ifdef _NT_
00624 
00625     FormatMessage(
00626         FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
00627         NULL,
00628         GetLastError(),
00629         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),      /* Default language */
00630         (LPTSTR) & lpMsgBuf,
00631         0,
00632         NULL
00633         );
00634 
00635     sprintf(message, "%s: %s\n", msg, lpMsgBuf);
00636     LocalFree(lpMsgBuf);
00637 #else
00638     sprintf(message, "%s: %s\n", msg, strerror(errno));
00639 #endif
00640 
00641     return edt_msg_printf(msg_p->target, level, message);
00642 }
00643 
00675 int 
00676 edt_msg_printf_perror(int level, char *format, ...)
00677 {
00678     va_list stack;
00679     va_start(stack, format);
00680 
00681     return edt_msg_output_vprintf_perror(&edt_default_msg, level, format, stack);
00682 }
00683 
00684 
00701 int
00702 edt_msg_output_printf_perror(EdtMsgHandler *msg_p,  int level, char *format, ...)
00703 {
00704     va_list stack;
00705     va_start(stack, format);
00706 
00707     return edt_msg_output_vprintf_perror(msg_p, level, format, stack);
00708 }
00709 
00710 
00718 EdtMsgHandler *
00719 edt_msg_default_handle()
00720 {
00721     if (!edt_default_msg_initialized)
00722         edt_msg_init(&edt_default_msg);
00723 
00724     return &edt_default_msg;
00725 }
00726 
00735 int
00736 edt_msg_default_level()
00737 {
00738     if (!edt_default_msg_initialized)
00739         edt_msg_init(&edt_default_msg);
00740 
00741     return edt_default_msg.level;
00742 }
00743 
00744 
00749 char *edt_msg_last_error()
00750 {
00751     return edt_last_error_message;
00752 }
00753 
00754 static int lvl_indent = 0;
00755 
00756 int
00757 lvl_printf(int delta, char *format, ...)
00758 {
00759     va_list     stack;
00760     int i;
00761     char message[512];
00762     va_start(stack,     format);
00763 
00764     if (delta < 0)
00765         lvl_indent += delta;
00766 
00767     for (i=0;i<lvl_indent;i++)
00768         printf("    ");
00769 
00770     vsprintf(message, format, stack);
00771 
00772     printf("%s",message);
00773     if (delta > 0)
00774         lvl_indent += delta;
00775 
00776     return lvl_indent;
00777 }
00778 
00779 /*
00780 * output message simplified - levels 0 - 3
00781 * level 0 - fatal only
00782 * level 1 - warnings
00783 * level 2 - info level 1
00784 * level 3 - info level 2
00785 */
00786 
00787 void
00788 edt_set_verbosity(int verbose)
00789 
00790 {
00791     int level = edt_msg_default_level();
00792     if (verbose < 1)
00793         level = 0;
00794     else if (verbose > 1) /* default is slightly verbose */
00795     {
00796         level |= EDTAPP_MSG_INFO_1;
00797         level |= EDTLIB_MSG_INFO_1;
00798     }
00799     if (verbose > 2)
00800     {
00801         level |= EDTAPP_MSG_INFO_1
00802             | EDTAPP_MSG_INFO_2
00803             | EDTLIB_MSG_INFO_1
00804             | EDTLIB_MSG_INFO_2;
00805     }
00806     edt_msg_set_level(edt_msg_default_handle(), level);
00807 }
00808 
00809 int
00810 edt_get_verbosity()
00811 
00812 {
00813     if (edt_default_msg.level & (EDTAPP_MSG_INFO_2 | EDTLIB_MSG_INFO_2))
00814         return 3;
00815     if (edt_default_msg.level & (EDTAPP_MSG_INFO_1 | EDTLIB_MSG_INFO_1))
00816         return 2;
00817     if (edt_default_msg.level & (EDT_DEFAULT_MSG_LEVEL))
00818         return 1;
00819 
00820     return 0;
00821 
00822 }
00823 

Generated on Mon Mar 21 14:14:39 2011 by  doxygen 1.4.7