1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618
|
/*
This file is part of SUPPL - the supplemental library for DOS
Copyright (C) 1996-2000 Steffen Kaiser
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $RCSfile: SUPPLDBG.H $
$Locker: ska $ $Name: $ $State: Exp $
SUPPL common debugging features
If used by an application, SUPPL and the application will use the
same debugging driver and, therefore, debugging extends from the
application into the functions included from SUPPL. This is
useful especially while debugging heap actions (alloc/dealloc).
Note #1: If NDEBUG is defined, all debugging features are turned off!
Note #2: This #include file MUST be included at the end of the list,
at least behind all the standard #includes referencing via '<...>'.
Otherwise it is possible that some redefines do not work or the
compiler will detect errors within standard include files.
Understood debugging features:
SUPPL_DBG_MEMORY:
Causes that the macro chkMem performs an extensive test of
the logical memory management of DOS and the C runtime environment.
SUPPL_DBG_HEAP:
Causes that the macro 'chkHeap' actively checks the local
heap for corruption.
chkHeap includes chkMem!
SUPPL_LOG_MEMORY:
Causes to redefine heap-related CLib functions (malloc, calloc,
realloc, free,& strdup).
SUPPL_LOG_FUNCTION:
Note: These package was inspired by Fred Fish's DBUG package
shipped with DMake v3+.
When the macro SUPPL_LOG_NO_INFO is #define'ed prior including
this header file, the macro DBG_INFO() expands to nothing.
Causes to active all of the DBG_* macros:
DBG_ENTER() - logs that a function was entered
DBG_ENTER1/DBG_ENTER2() - as DBG_ENTER, *1 -> declaration, *2 -> fct
DBG_ARGUMENTS() - logs function arguments
DBG_RETURN_VALUES() - logs function return values
DBG_EXIT() - logs that a function was exited
DBG_LEAVE() - logs that a function was exited (with parameter, no log)
DBG_LONG_RETURN() - logs that a function was exited (with param & log)
DBG_RETURN_?() - logs that a function was exited (with param & log)
DBG_PRINT() - logs arbitary information
DBG_INFO() - logs arbitary information of information class "inf"
DBG_STRING() - logs a string in information class "inf"
DBG_CHANGE_STATE() - changes logging status
DBG_PUSH_STATE() - duplicates current logging status
DBG_POP_STATE() - forget current logging status & restore previous one
DBG_TERMINATE() - terminate application with a log message
*/
#ifndef __SUPPLDBG_H
#define __SUPPLDBG_H
#include <assert.h>
#ifndef _MICROC_
#include <stdlib.h>
#endif
#include <portable.h>
/*
* Initialize all macros with dummy values. They are undefined later
* right before a debugging specific value is added.
* Initializing them here ensures that they are correctly set for
* non-debugging.
*/
#define chkHeap ;
#define chkMem ;
#ifdef NDEBUG /* native debug support disabled? */
/* Turn off every SUPPL specific debugging feature */
#undef SUPPL_DBG_HEAP
#undef SUPPL_DBG_MEMORY
#undef SUPPL_LOG_MEMORY
#undef SUPPL_LOG_FUNCTION
#else
#ifdef SUPPL_DBG_ALL
/* Turn on every SUPPL specific debugging feature */
#define SUPPL_DBG_HEAP
#define SUPPL_DBG_MEMORY
#define SUPPL_LOG_MEMORY
#define SUPPL_LOG_FUNCTION
#endif
#endif /* !defined(NDEBUG) */
#ifdef SUPPL_ALWAYS_DEBUG_HEAP
#define SUPPL_DBG_HEAP
#endif
#ifdef SUPPL_ALWAYS_DEBUG_MEMORY
#define SUPPL_DBG_MEMORY
#endif
#ifdef SUPPL_DBG_MEMORY
#undef chkMem
#define chkMem suppl_testMemChain();
#endif
#ifdef SUPPL_DBG_HEAP
/* Define the macro 'chkHeap' to actively test the local heap for
corruption. Note: The macro must be used without semicolon!
*/
#undef chkHeap
#ifdef __TURBOC__
#include <alloc.h>
#ifdef NDEBUG
#define chkHeap suppl_testHeap(); chkMem
#else
#define chkHeap assert(heapcheck() == _HEAPOK); chkMem
#endif
#else
#define chkHeap chkMem
#endif
#endif
#ifdef SUPPL_LOG_MEMORY
#include "syslog.h"
/* Use internal wrappers for CLib symbols */
#ifdef malloc
#undef malloc
#endif
#ifdef realloc
#undef realloc
#endif
#ifdef calloc
#undef calloc
#endif
#ifdef free
#undef free
#endif
#ifdef strdup
#undef strdup
#endif
#define malloc(size) suppl_malloc((size))
#define calloc(nelem,size) suppl_calloc((nelem), (size))
#define realloc(poi,size) suppl_realloc((poi), (size))
#define free(poi) suppl_free((poi))
#define strdup(poi) suppl_strdup((poi))
#endif
#ifdef SUPPL_LOG_FUNCTION
/* The following macros are defined:
DBG_EXTENSION
Extension of the logfile
DBG_LIBRARY
If redefined by the user, this macros specifies the name
of the library, the current file is located in.
Defaults to none.
DBG_ALWAYS_FLUSHLOG
If defined, the log file is flushed each time one entry has been
written successfully into the logfile. (compile-time option
- see INITSUPL.LOC!)
DBG_ALWAYS_CLOSELOG
If defined, the log file is closed each time one entry has been
written successfully into the logfile. (compile-time option
- see INITSUPL.LOC!)
Use this option if system crashes corrupt the logfile or same
entries won't appear there.
NONE OF THESE MACROS MUST NOT BE USED WITH A TRAILING SEMICOLON!
DBG_CLOSELOG
Close the logfile.
DBG_FLUSHLOG
Flush the log file and make sure all data is written to disk
and the directory entry has been updated.
This function should be called each time when it is possible
that the program is going to crash or is going to be
asynchroneously terminated (e.g. Ctrl-Alt-Del).
DBG_ENTER(char *function_name, char *function_class)
Enters the function with name "function_name" and class. (see STATE)
It must be the first statement immediately following the variable
declaration, because it will define a variable as well.
This macro must be pairly used with DBG_LEAVE or DBG_EXIT.
All of the other macros won't work without DBG_ENTER.
DBG_ENTER1
Is the variable declaration part of DBG_ENTER()
DBG_ENTER2(char *function_name, char *function_class)
Is the function calling part of DBG_ENTER()
DBG_ARGUMENTS( (char *format_spec, arguments) )
Logs the arguments of the current function. The parameters follow
the same rules as in DBG_PRINT. The only difference to DBG_PRINT
is that the output can be selectively enabled/disabled.
DBG_RETURN_VALUES( (char *format_spec, arguments) )
Logs the retrun values of the current function. The parameters follow
the same rules as in DBG_PRINT. The only difference to DBG_PRINT
is that the output can be selectively enabled/disabled.
DBG_EXIT
Exits a void function. The "return" statement is already
included.
DBG_LEAVE(return_expression)
As DBG_EXIT, but "return_expression" is passed as an argument
to "return". The return value is NOT logged automatically.
DBG_LONG_RETURN(type, char *format_spec, return_expression)
This macro combines: DBG_RETURN_VALUES and DBG_LEAVE.
Unfortunately return_expression would be evaluated twice,
therefore it is evaluated once and stored into a temporary
variable of the specified type; 'type' must (or, at least,
should) be of the same type as the function returns. The
same applies to the format specification, which is passed
to printf().
DBG_RETURN_#(return_expression)
As DBG_RETURN(), '#' is the uppercase letter usually find
within a printf()-format specification:
# type format_spec
C char "%c"
S char* "\"%s\""
I int "%d"
U unsigned "%u"
X int "0x%x"
L long "%ld"
UL unsigned long "%lu"
F double "%f"
G double "%g"
P void * "%p"
A 'B' may be prefixed to buffer "return_expression" within a
temporary variable to suppress side effects and/or multiple
evalutation of a complex expression.
DBG_PRINT( char *information_class, (char *format_spec, arguments) )
Logs ONE line. "format_spec" is a valid printf() format
string and should not contain no '\n' character. Both the
format spec and the arguments must be enclosed into
parenthises.
The information_class specifies whether or not this information
is logged (see STATE).
DBG_INFO( (char *format_spec, arguments) )
As DBG_PRINT(), but prints message of class "inf".
Because these macro may generate a lot of strings, they can be
individually disable with the SUPPL_LOG_NO_INFO macro. It must
be #define'ed prior including "suppldbg.h"
DBG_STRING(char *string)
As DBG_INFO(), but prints a string only
DBG_PUSH_STATE
Duplicates the current logging status. Any subsequent DBG_CHANGE_STATE
will effect the newly generated status only.
If there is no status currently, this function is ignored.
DBG_POP_STATE
Discards the topmost logging status and restores the previous one.
If there is only one or none pushed status, this function is
ignored.
DBG_CHANGE_STATE(char *state_spec)
Modifies the current logging status according the state_spec.
If there is no current status, a new one will be created.
The state_spec is a sequence of log_specs delimited by semicolons.
A log_spec consists of a log_format_letter and arguments,
the arguments can be delimited by commas, if necessary.
No superflous whitespaces or such are allowed!
The following log_format_letters are understood:
d# set the maximum logging depth (#: unsigned number)
default: no limit
f?*,... files to be logged (*: one file name), each filename
is prefixed by '+' enable, or '-' disable file.
Wildcards are not allowed. The filename must be specified
the same way as the compiler named them in their __FILE__
macro, this is usually the fully-qualified filename.
"+" alone logs everything (clears every previous settings),
"-" alone logs nothing (also clears every previous settings).
default: log everything.
c?*,... functions to be logged (*: one function name)
Syntax the same as "f*,...", but the string must
case-sensitively match the string passed to DBG_ENTER()
l? globally enable/disable logging (?: + enable, - disable)
i? indent output (?: + enable, - disable)
If disbale the nesting level is inserted as number, otherwise
as a repetive count of "| " strings
C?*,... classes to be logged
Syntax the same as "f*,...", but the string must either
case-sensitively match one of the classes specified as
function_class (DBG_ENTER) or information_class (DBG_PRINT)
or one of the SUPPL classes:
information classes:
"arg" - DBG_ARGUMENTS
"rv" - DBG_RETURN_VALUE
"fct" - DBG_ENTER & DBG_EXIT/DBG_LEAVE
"inf" - informative information
function classes:
"env" - environment
"mcb" - MCB
"mem" - memory
"str" - string
"ini" - INI file
"cmd" - command line handling
"err" - error wrappers
"dfn" - filename functions
"fil" - FILE wrappers
"lmt" - long mathematics
"nls" - NLS
"log" - syslog / logging
"msc" - misc.
Note: function and information classes share the same
name space.
Note: If the library name is specify with DBG_LIBRARY,
one must enable the library as well. All SUPPL files
use the library name "SUPPL". E.g. to enable SUPPL logging,
it is _not_ sufficient to specify "C+", but "C+,+SUPPL",
note that "+SUPPL" must trail "+"!
Defaults to '-' (disable everything).
DBG_TERMINATE(char *string)
logs the string, then "program terminated by debug system",
then terminates the application via exit(DBG_EXIT_CODE)
*/
#ifndef DBG_LIBRARY
#define DBG_LIBRARY 0
#endif
#define DBG_CLOSELOG \
suppl_log_close();
#define DBG_FLUSHLOG \
suppl_log_flush();
#define DBG_ENTER1 \
auto suppl_log_local_data_t suppl_log_data;
#define DBG_ENTER2(fct_name, fct_class) \
suppl_log_enter(DBG_LIBRARY, __FILE__, __LINE__, &suppl_log_data \
, (fct_name), (fct_class));
#define DBG_ENTER(fct_name, fct_class) \
DBG_ENTER1 \
DBG_ENTER2(fct_name, fct_class)
#define DBG_ARGUMENTS( info ) \
DBG_PRINT( Suppl_class_arg , info )
#define DBG_RETURN_VALUES( info ) \
DBG_PRINT( Suppl_class_rv , info )
#define DBG_EXIT \
{ suppl_log_leave(&suppl_log_data); \
return; }
#define DBG_LEAVE(expr) \
{ suppl_log_leave(&suppl_log_data); \
return (expr); }
#define DBG_LONG_RETURN(type, fmt, expr) \
{ type suppl_temp_var; \
suppl_temp_var = (expr); \
DBG_RETURN_VALUES( (fmt, suppl_temp_var) ) \
DBG_LEAVE( suppl_temp_var ) \
}
#define DBG_RETURN(fmt, expr) \
{ DBG_RETURN_VALUES( (fmt, (expr)) ) \
DBG_LEAVE( (expr) ) \
}
#if 1
#define DBG_PRINT(inf_class, info) \
{ if(suppl_log_print_1((inf_class))) \
suppl_log_print_2 info; \
}
#else
#define DBG_PRINT(inf_class, info) \
{ if(suppl_log_class_enabled((inf_class))) \
suppl_log_log info; \
}
#endif
#ifdef SUPPL_LOG_NO_INFO
#define DBG_INFO(info) ;
#define DBG_STRING(info) ;
#else
#define DBG_INFO( info ) \
DBG_PRINT( Suppl_class_inf , info )
#define DBG_STRING(str) DBG_INFO( (str) )
#endif
#define DBG_PUSH_STATE \
suppl_log_push();
#define DBG_POP_STATE \
suppl_log_pop();
#define DBG_CHANGE_STATE(state) \
suppl_log_change((state));
#define DBG_TERMINATE(loginfo) \
suppl_log_terminate((loginfo));
#else
/* Generate pseudo-macros */
#define DBG_CLOSELOG ;
#define DBG_FLUSHLOG ;
#define DBG_ENTER1 ;
#define DBG_ENTER2(fct_name, fct_class) ;
#define DBG_ENTER(fct_name, fct_class) ;
#define DBG_ARGUMENTS( info ) ;
#define DBG_RETURN_VALUES( info ) ;
#define DBG_EXIT return;
#define DBG_LEAVE(expr) return (expr);
#define DBG_LONG_RETURN(t,f,expr) return (expr);
#define DBG_RETURN(f,expr) return (expr);
#define DBG_PRINT(inf_class, info) ;
#define DBG_INFO( info ) ;
#define DBG_STRING(str) ;
#define DBG_PUSH_STATE ;
#define DBG_POP_STATE ;
#define DBG_CHANGE_STATE(state) ;
#define DBG_TERMINATE(string) suppl_log_exit((string));
#endif
/* Format specs used for the DBG_RETURN_*() macros */
#define DBG_RETURN_FMT_SPEC_C "%c"
#define DBG_RETURN_FMT_SPEC_S "\"%s\""
#define DBG_RETURN_FMT_SPEC_I "%d"
#define DBG_RETURN_FMT_SPEC_U "%u"
#define DBG_RETURN_FMT_SPEC_X "0x%x"
#define DBG_RETURN_FMT_SPEC_L "%ld"
#define DBG_RETURN_FMT_SPEC_UL "%lu"
#define DBG_RETURN_FMT_SPEC_F "%f"
#define DBG_RETURN_FMT_SPEC_G "%g"
#define DBG_RETURN_FMT_SPEC_P "%p"
#define DBG_RETURN_BC(expr) DBG_LONG_RETURN(char, DBG_RETURN_FMT_SPEC_C, (expr))
#define DBG_RETURN_BS(expr) DBG_LONG_RETURN(char*, DBG_RETURN_FMT_SPEC_S, (expr))
#define DBG_RETURN_BI(expr) DBG_LONG_RETURN(int, DBG_RETURN_FMT_SPEC_I, (expr))
#define DBG_RETURN_BU(expr) DBG_LONG_RETURN(unsigned, DBG_RETURN_FMT_SPEC_U, (expr))
#define DBG_RETURN_BX(expr) DBG_LONG_RETURN(int, DBG_RETURN_FMT_SPEC_X, (expr))
#define DBG_RETURN_BL(expr) DBG_LONG_RETURN(long, DBG_RETURN_FMT_SPEC_L, (expr))
#define DBG_RETURN_BUL(expr) DBG_LONG_RETURN(unsigned long, DBG_RETURN_FMT_SPEC_UL, (expr))
#define DBG_RETURN_BF(expr) DBG_LONG_RETURN(double, DBG_RETURN_FMT_SPEC_F, (expr))
#define DBG_RETURN_BG(expr) DBG_LONG_RETURN(double, DBG_RETURN_FMT_SPEC_G, (expr))
#define DBG_RETURN_BP(expr) DBG_LONG_RETURN(void *, DBG_RETURN_FMT_SPEC_P, (expr))
#define DBG_RETURN_C(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_C, (expr))
#define DBG_RETURN_S(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_S, (expr))
#define DBG_RETURN_I(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_I, (expr))
#define DBG_RETURN_U(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_U, (expr))
#define DBG_RETURN_X(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_X, (expr))
#define DBG_RETURN_L(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_L, (expr))
#define DBG_RETURN_UL(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_UL, (expr))
#define DBG_RETURN_F(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_F, (expr))
#define DBG_RETURN_G(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_G, (expr))
#define DBG_RETURN_P(expr) DBG_RETURN(DBG_RETURN_FMT_SPEC_P, (expr))
/*
* Declarations of functions
*/
/* Some special log functions:
malloc --> malloc(size) = poi; <success|failure>
calloc --> malloc(size) = poi; <success|failure>
realloc --> realloc(poi, size) = poi; <success|failure>
free --> free(poi);
strdup --> malloc(size) = poi; <success|failure>
These functions will automatically open the logfile if necessary.
*/
extern void suppl_log_malloc(void const * const newpoi, const size_t size);
/* extern void suppl_log_calloc(void const * const newpoi, const size_t nelem, const size_t size); */
#define suppl_log_calloc(newpoi,nelem,size) \
suppl_log_malloc((newpoi), (nelem) * (size))
extern void suppl_log_realloc(void const * const newpoi, const void * const oldpoi, const size_t size);
extern void suppl_log_free(const void * const oldpoi);
extern void suppl_log_strdup(char const * const newpoi, const char * const string);
/* These functions substitutes the associated function and
call suppl_log_*(), too. */
extern void *suppl_malloc(const size_t size);
extern void *suppl_calloc(const size_t nelem, const size_t size);
extern void *suppl_realloc(void * const poi, const size_t size);
extern void suppl_free(void * const poi);
extern char *suppl_strdup(const char * const string);
/* Function to test if the DOS Memory Chain has been corrupted
if so, the application is terminated */
extern void suppl_testMemChain(void);
extern void suppl_testHeap(void);
/* These functions are the backend of the logging package */
typedef unsigned suppl_log_lvl_t; /* nesting level type */
typedef unsigned long suppl_log_linenr_t; /* compiler line number type */
typedef const char * suppl_log_sptr_t; /* string pointer */
typedef const char * const suppl_log_csptr_t; /* string pointer */
typedef struct {
suppl_log_lvl_t suppl_l_prv_nestlevel;
FLAG suppl_l_prv_fct_enabled;
suppl_log_sptr_t suppl_l_fctname;
} suppl_log_local_data_t;
void suppl_log_enter(suppl_log_sptr_t library_name
, suppl_log_csptr_t file_name
, suppl_log_linenr_t linenr
, suppl_log_local_data_t *data
, suppl_log_csptr_t function_name
, suppl_log_csptr_t function_class);
void suppl_log_leave(suppl_log_local_data_t *data);
int suppl_log_class_enabled(suppl_log_csptr_t classname);
void suppl_log_log(suppl_log_csptr_t fmt, ...);
int suppl_log_print_1(suppl_log_csptr_t inf_class);
void suppl_log_print_2(suppl_log_csptr_t fmt, ...);
void suppl_log_push(void);
void suppl_log_pop(void);
void suppl_log_change(suppl_log_csptr_t state);
void suppl_log_flush(void);
void suppl_log_close(void);
void suppl_log_terminate(suppl_log_csptr_t loginfo);
void suppl_log_exit(suppl_log_csptr_t loginfo);
/*
* Strings of the function classes used within SUPPL
* defined as constant character arrays to prevent that each file
* creates its own local copy of the string in its data segment
*/
extern const char Suppl_appName[];
extern const char Suppl_cmdline[];
extern const char Suppl_dfn[];
extern const char Suppl_dynstr[];
extern const char Suppl_env[];
extern const char Suppl_error[];
extern const char Suppl_farmem[];
extern const char Suppl_inifile[];
extern const char Suppl_inifile1[];
extern const char Suppl_inifile2[];
extern const char Suppl_inifile3[];
extern const char Suppl_mcb[];
extern const char Suppl_misc[];
extern const char Suppl_nls[];
extern const char Suppl_portable[];
extern const char Suppl_SUPPL[];
extern const char Suppl_supplio[];
extern const char Suppl_syslog[];
extern const char Suppl_usr[];
/*
* Strings of the log classes used within SUPPL
* defined as constant character arrays to prevent that each file
* creates its own local copy of the string in its data segment
*/
extern const char Suppl_class_arg[];
extern const char Suppl_class_rv[];
extern const char Suppl_class_fct[];
extern const char Suppl_class_inf[];
extern const char Suppl_class_env[];
extern const char Suppl_class_mcb[];
extern const char Suppl_class_mem[];
extern const char Suppl_class_str[];
extern const char Suppl_class_ini[];
extern const char Suppl_class_cmd[];
extern const char Suppl_class_err[];
extern const char Suppl_class_dfn[];
extern const char Suppl_class_fil[];
extern const char Suppl_class_lmt[];
extern const char Suppl_class_nls[];
extern const char Suppl_class_log[];
extern const char Suppl_class_msc[];
#endif /* defined(__DBUG_H) */
|