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
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;
00101 int success = -1;
00102
00103 unsigned error = edt_err_num();
00104
00105 #ifdef _NT_
00106 LPVOID * lpMsgBuf;
00107 #else
00108 char *errstr;
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
00123
00124 vsprintf(edt_last_error_message, format, ap);
00125
00126
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),
00134 (LPTSTR) & lpMsgBuf,
00135 0,
00136 NULL
00137 );
00138
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
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),
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),
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
00781
00782
00783
00784
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)
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