edt_error.c

Go to the documentation of this file.
00001 
00009 #include "edtinc.h"
00010 #include <stdlib.h>
00011 #include <string.h>
00012 
00013 #ifdef _NT_
00014 
00015 #include <windows.h>
00016 #include <process.h>
00017 
00018 #else
00019 
00020 #ifndef VXWORKS
00021 #include <sys/errno.h>
00022 #endif
00023 
00024 #endif
00025 
00026 
00027 
00028 #define MAX_MESSAGE 512
00029 
00030 #ifdef PDV
00031 #define EDT_DEFAULT_MSG_LEVEL     EDTAPP_MSG_FATAL \
00032     | EDTAPP_MSG_WARNING \
00033     | EDTLIB_MSG_FATAL \
00034     | EDTLIB_MSG_WARNING \
00035     | PDVLIB_MSG_FATAL \
00036     | PDVLIB_MSG_WARNING
00037 #else
00038 #define EDT_DEFAULT_MSG_LEVEL     EDTAPP_MSG_FATAL \
00039     | EDTAPP_MSG_WARNING \
00040     | EDTLIB_MSG_FATAL \
00041     | EDTLIB_MSG_WARNING 
00042 #endif
00043 
00044 static char edt_last_error_message[MAX_MESSAGE];
00045 
00046 EdtMsgHandler edt_default_msg;
00047 static int edt_default_msg_initialized = 0;
00048 
00049 static int 
00050 edt_msg_printf(void *f_p, int level, char *message)
00051 {
00052     FILE *f = (FILE *) f_p;
00053 
00054 
00055     if (f)
00056         return fprintf(f, message);
00057 
00058     else
00059         return -1;
00060 
00061 }
00062 
00063 static void 
00064 edt_msg_close_file(EdtMsgHandler *msg_p)
00065 
00066 {
00067     if (msg_p->own_file && msg_p->file)
00068         fclose(msg_p->file);
00069 
00070     if (msg_p->target == msg_p->file)
00071         msg_p->target = NULL;
00072 
00073     msg_p->file = NULL;
00074     msg_p->own_file = 0;
00075 
00076 }
00077 
00078 
00079 /* copied from libedt.c, so we don't need to link to that just for this function
00080 */
00081 static unsigned 
00082 edt_err_num(void)
00083 {
00084 #ifdef _NT_
00085     return GetLastError();
00086 #else 
00087     extern int errno;
00088     return errno;
00089 #endif
00090 }
00091 
00092 static int
00093 edt_msg_output_vprintf_perror(EdtMsgHandler *msg_p,  int level, char *format, va_list ap)
00094 {
00095 
00096     char *fullmsg; /* callers message + perror message */
00097     int success = -1;
00098     /* copy of last errno so no problem if it changes while executing this func. */
00099     unsigned error = edt_err_num(); 
00100 
00101 #ifdef _NT_
00102     LPVOID *  lpMsgBuf;
00103 #else
00104     char *errstr; /* perror message */
00105     extern int errno;
00106 #endif
00107 
00108     if (msg_p == &edt_default_msg)
00109     {
00110         if (!edt_default_msg_initialized)
00111             edt_msg_init(msg_p);
00112     }
00113 
00114     if (!(level & msg_p->level))
00115         return 0;
00116 
00117 
00118     /* get caller's string...  */ 
00119 
00120     vsprintf(edt_last_error_message, format, ap);
00121 
00122     /* ... then add system error string to it. */
00123 #ifdef _NT_
00124 
00125     FormatMessage(
00126         FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
00127         NULL,
00128         error,
00129         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),      /* Default language */
00130         (LPTSTR) & lpMsgBuf,
00131         0,
00132         NULL
00133         );
00134     /* add three for \n and ": " chars. */
00135     fullmsg = (char *)malloc(strlen(edt_last_error_message) + strlen( (char*)lpMsgBuf ) + 3*sizeof(char));
00136     sprintf(fullmsg, "%s: %s\n", edt_last_error_message, (char*)lpMsgBuf);
00137     LocalFree(lpMsgBuf);
00138 #else
00139     errstr = strerror(error);
00140     /* add three for \n and ": " chars. */
00141     fullmsg = (char *)malloc(strlen(edt_last_error_message) + strlen(errstr) + 3*sizeof(char));
00142     sprintf(fullmsg, "%s: %s\n", edt_last_error_message, errstr);
00143 #endif
00144 
00145 
00146     if (msg_p->func) {
00147         success = msg_p->func(msg_p->target, level, fullmsg);
00148     }
00149 
00150     free(fullmsg);
00151     return success;
00152 }
00153 
00154 
00155 
00172 void 
00173 edt_msg_init(EdtMsgHandler *msg_p)
00174 
00175 {
00176     if (msg_p)
00177     {
00178         msg_p->file = stderr;
00179         msg_p->own_file = 0;
00180         msg_p->level = EDT_DEFAULT_MSG_LEVEL;
00181         msg_p->func = edt_msg_printf;
00182         msg_p->target = msg_p->file;
00183     }
00184 
00185     if (msg_p == &edt_default_msg)
00186         edt_default_msg_initialized = 1;
00187 }
00188 
00189 
00199 void 
00200 edt_msg_init_names(EdtMsgHandler *msg_p, char *file, int level)
00201 
00202 {
00203     edt_msg_init(msg_p);
00204     edt_msg_set_name(msg_p, file);
00205     edt_msg_set_level(msg_p, level);
00206 
00207 }
00208 
00219 void 
00220 edt_msg_init_files(EdtMsgHandler *msg_p, FILE *file, int level)
00221 
00222 {
00223     edt_msg_init(msg_p);
00224     edt_msg_set_file(msg_p, file);
00225     edt_msg_set_level(msg_p, level);
00226 }
00227 
00228 
00229 
00244 void 
00245 edt_msg_close(EdtMsgHandler *msg_p)
00246 
00247 {
00248     edt_msg_close_file(msg_p);
00249 }
00250 
00251 
00252 
00277 int
00278 edt_msg(int level, char *format, ...)
00279 {
00280     va_list     stack;
00281 
00282     if (!edt_default_msg_initialized)
00283         edt_msg_init(&edt_default_msg);
00284 
00285     if (!(level & edt_default_msg.level))
00286         return 0;
00287 
00288     va_start(stack,     format);
00289 
00290     vsprintf(edt_last_error_message, format, stack);
00291 
00292     if (edt_default_msg.func)
00293         return edt_default_msg.func(edt_default_msg.target, level, edt_last_error_message);
00294     return -1;
00295 
00296 }
00297 
00298 
00299 
00342 int
00343 edt_msg_output(EdtMsgHandler *msg_p,  int level, char *format, ...)
00344 {
00345 
00346     va_list     stack;
00347 
00348 
00349     if (msg_p == &edt_default_msg)
00350     {
00351         if (!edt_default_msg_initialized)
00352             edt_msg_init(msg_p);
00353     }
00354 
00355     if (!(level & msg_p->level))
00356         return 0;
00357 
00358     va_start(stack,     format);
00359 
00360     vsprintf(edt_last_error_message, format, stack);
00361 
00362     if (msg_p->func)
00363         return msg_p->func(msg_p->target, level, edt_last_error_message);
00364 
00365     return -1;
00366 }
00367 
00368 
00369 
00370 
00387 void 
00388 edt_msg_set_level(EdtMsgHandler *msg_p, int newlevel)
00389 
00390 {
00391     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00392         edt_msg_init(&edt_default_msg);
00393 
00394     msg_p->level  = newlevel;
00395 
00396 }
00397 
00405 int 
00406 edt_msg_get_level(EdtMsgHandler *msg_p) 
00407 {
00408     return msg_p->level;
00409 }
00410 
00411 
00419 void 
00420 edt_msg_add_level(EdtMsgHandler *msg_p, int level) 
00421 {
00422     edt_msg_set_level(msg_p, edt_msg_get_level(msg_p) | level);
00423 }
00424 
00425 
00439 void 
00440 edt_msg_set_function(EdtMsgHandler *msg_p, EdtMsgFunction f)
00441 
00442 {
00443     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00444         edt_msg_init(&edt_default_msg);
00445 
00446     msg_p->func = f;
00447 }
00448 
00475 void 
00476 edt_msg_set_file(EdtMsgHandler *msg_p, FILE *fp)
00477 
00478 {
00479     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00480         edt_msg_init(&edt_default_msg);
00481 
00482     edt_msg_close_file(msg_p);
00483 
00484     msg_p->file = fp; 
00485 
00486     msg_p->own_file = 0;
00487 }
00488 
00489 
00497 void 
00498 edt_msg_set_name(EdtMsgHandler *msg_p, char *name)
00499 
00500 {
00501     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00502         edt_msg_init(&edt_default_msg);
00503 
00504     edt_msg_close_file(msg_p);
00505 
00506     msg_p->file = fopen(name, "wb");
00507 
00508     msg_p->own_file = (msg_p->file != NULL);
00509     edt_msg_set_target(msg_p, msg_p->file);
00510 
00511 }
00512 
00522 void 
00523 edt_msg_set_target(EdtMsgHandler *msg_p, void *target)
00524 
00525 {
00526     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00527         edt_msg_init(&edt_default_msg);
00528 
00529     msg_p->target = target;
00530 }
00531 
00532 
00552 int
00553 edt_msg_perror(int level, char *msg)
00554 
00555 {
00557     char message[MAX_MESSAGE];
00558 
00559 #ifdef _NT_
00560     LPVOID *  lpMsgBuf;
00561 #else
00562     extern int errno;
00563 #endif
00564 
00565     if (!edt_default_msg_initialized)
00566         edt_msg_init(&edt_default_msg);
00567 
00568     if (!(level & edt_default_msg.level))
00569         return 0;
00570 
00571 #ifdef _NT_
00572 
00573     FormatMessage(
00574         FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
00575         NULL,
00576         GetLastError(),
00577         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),      /* Default language */
00578         (LPTSTR) & lpMsgBuf,
00579         0,
00580         NULL
00581         );
00582 
00583     sprintf(message, "%s: %s\n", msg, lpMsgBuf);
00584     LocalFree(lpMsgBuf);
00585 #else
00586     sprintf(message, "%s: %s\n", msg, strerror(errno));
00587 #endif
00588     return edt_msg(level, message);
00589 }
00590 
00591 
00604 int
00605 edt_msg_output_perror(EdtMsgHandler *msg_p, int level, char *msg)
00606 
00607 {
00608     char message[MAX_MESSAGE];
00609 
00610 #ifdef _NT_
00611     LPVOID *  lpMsgBuf;
00612 #else
00613     extern int errno;
00614 #endif
00615 
00616     if ((msg_p == &edt_default_msg) && !edt_default_msg_initialized)
00617         edt_msg_init(&edt_default_msg);
00618 
00619 #ifdef _NT_
00620 
00621     FormatMessage(
00622         FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
00623         NULL,
00624         GetLastError(),
00625         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),      /* Default language */
00626         (LPTSTR) & lpMsgBuf,
00627         0,
00628         NULL
00629         );
00630 
00631     sprintf(message, "%s: %s\n", msg, lpMsgBuf);
00632     LocalFree(lpMsgBuf);
00633 #else
00634     sprintf(message, "%s: %s\n", msg, strerror(errno));
00635 #endif
00636 
00637     return edt_msg_printf(msg_p->target, level, message);
00638 }
00639 
00671 int 
00672 edt_msg_printf_perror(int level, char *format, ...)
00673 {
00674     va_list stack;
00675     va_start(stack, format);
00676 
00677     return edt_msg_output_vprintf_perror(&edt_default_msg, level, format, stack);
00678 }
00679 
00680 
00697 int
00698 edt_msg_output_printf_perror(EdtMsgHandler *msg_p,  int level, char *format, ...)
00699 {
00700     va_list stack;
00701     va_start(stack, format);
00702 
00703     return edt_msg_output_vprintf_perror(msg_p, level, format, stack);
00704 }
00705 
00706 
00714 EdtMsgHandler *
00715 edt_msg_default_handle()
00716 {
00717     if (!edt_default_msg_initialized)
00718         edt_msg_init(&edt_default_msg);
00719 
00720     return &edt_default_msg;
00721 }
00722 
00731 int
00732 edt_msg_default_level()
00733 {
00734     if (!edt_default_msg_initialized)
00735         edt_msg_init(&edt_default_msg);
00736 
00737     return edt_default_msg.level;
00738 }
00739 
00740 
00745 char *edt_msg_last_error()
00746 {
00747     return edt_last_error_message;
00748 }
00749 
00750 static int lvl_indent = 0;
00751 
00752 int
00753 lvl_printf(int delta, char *format, ...)
00754 {
00755     va_list     stack;
00756     int i;
00757     char message[512];
00758     va_start(stack,     format);
00759 
00760     if (delta < 0)
00761         lvl_indent += delta;
00762 
00763     for (i=0;i<lvl_indent;i++)
00764         printf("    ");
00765 
00766     vsprintf(message, format, stack);
00767 
00768     printf("%s",message);
00769     if (delta > 0)
00770         lvl_indent += delta;
00771 
00772     return lvl_indent;
00773 }
00774 
00775 /*
00776 * output message simplified - levels 0 - 3
00777 * level 0 - fatal only
00778 * level 1 - warnings
00779 * level 2 - info level 1
00780 * level 3 - info level 2
00781 */
00782 
00783 void
00784 edt_set_verbosity(int verbose)
00785 
00786 {
00787     int level = edt_msg_default_level();
00788     if (verbose < 1)
00789         level = 0;
00790     else if (verbose > 1) /* default is slightly verbose */
00791     {
00792         level |= EDTAPP_MSG_INFO_1;
00793         level |= EDTLIB_MSG_INFO_1;
00794     }
00795     if (verbose > 2)
00796     {
00797         level |= EDTAPP_MSG_INFO_1
00798             | EDTAPP_MSG_INFO_2
00799             | EDTLIB_MSG_INFO_1
00800             | EDTLIB_MSG_INFO_2;
00801     }
00802     edt_msg_set_level(edt_msg_default_handle(), level);
00803 }

Generated on Mon May 12 16:38:52 2008 by  doxygen 1.5.1