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
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;
00097 int success = -1;
00098
00099 unsigned error = edt_err_num();
00100
00101 #ifdef _NT_
00102 LPVOID * lpMsgBuf;
00103 #else
00104 char *errstr;
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
00119
00120 vsprintf(edt_last_error_message, format, ap);
00121
00122
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),
00130 (LPTSTR) & lpMsgBuf,
00131 0,
00132 NULL
00133 );
00134
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
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),
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),
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
00777
00778
00779
00780
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)
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 }