/*++ Copyright (c) 1996-1997 Microsoft Corporation --*/ /*++ MACROS.H useful macros I didn't want to declare in every file. first incarnation in EXTENDED: DAVIDCHR 11/4/1996 next incarnation in k5 compat: DAVIDCHR 1/8/1997 modified to be more portable: DAVIDCHR 4/8/1997 --*/ /* Note that all of these macros use "HopefullyUnusedVariableName" for a local variable to prevent the unintentional "capture" of a passed parameter by the same name. Hopefully, we'll never use a variable by that name. If so, the variable can be made even more longer and less convenient to use. :-) */ #define EQUALS TRUE #define NOT_EQUALS FALSE /* BREAK_AND_LOG_IF is for use with actual test results. When you absolutely must have the results logged... */ #define BREAK_AND_LOG_IF( variable, loglevel, data, message, label ) { \ BOOL HopefullyUnusedVariableName; \ unsigned long HopefullyUnusedVariableName_SaveData; \ \ HopefullyUnusedVariableName = (variable); \ HopefullyUnusedVariableName_SaveData = data; \ \ if (HopefullyUnusedVariableName) { \ if ( HopefullyUnusedVariableName_SaveData == 0 ) { \ HopefullyUnusedVariableName_SaveData = \ HopefullyUnusedVariableName; \ } \ LOGMSG( loglevel, HopefullyUnusedVariableName_SaveData, message );\ goto label; \ }} #define BREAK_EXPR( variable, operator, test, message, label ) BREAK_HOOK_EXPR( variable, operator, test, "%hs", message, label) #ifdef USE_NTLOG /* the other macros MAY or MAY NOT use the logger */ #ifndef BREAK_LOG_LEVEL #define BREAK_LOG_LEVEL LOGLEVEL_INFO #endif #define BREAK_HOOK_EXPR( variable, operator, test, formatmessage, hook, label ) {\ BOOL HopefullyUnusedVariableName;\ unsigned long HopefullyUnusedVariableName_Save;\ CHAR HopefullyUnusedVariableName_Buffer[1024];\ /* unsigned long HopefullyUnusedVariableName_szBuffer = 1024; */\ \ HopefullyUnusedVariableName_Save = (ULONG) (variable);\ HopefullyUnusedVariableName = (operator == EQUALS) ? \ (HopefullyUnusedVariableName_Save == (ULONG) test) :\ (HopefullyUnusedVariableName_Save != (ULONG) test);\ \ if (HopefullyUnusedVariableName) {\ sprintf( HopefullyUnusedVariableName_Buffer, formatmessage, hook );\ LOGMSG(BREAK_LOG_LEVEL, HopefullyUnusedVariableName_Save, HopefullyUnusedVariableName_Buffer );\ goto label;\ }} #else #define BREAK_HOOK_EXPR( variable, operator, test, formatmessage, hook, label ) {\ BOOL HopefullyUnusedVariableName;\ ULONG HopefullyUnusedVariableName_Save;\ \ HopefullyUnusedVariableName_Save = (ULONG) (variable);\ HopefullyUnusedVariableName = (operator == EQUALS) ? \ (HopefullyUnusedVariableName_Save == (ULONG) test) :\ (HopefullyUnusedVariableName_Save != (ULONG) test);\ \ if (HopefullyUnusedVariableName) {\ fprintf(stderr, "\n** 0x%x \t ", HopefullyUnusedVariableName_Save );\ fprintf(stderr, formatmessage, hook);\ fprintf(stderr, "\n");\ goto label;\ }} #endif #define BREAK_IF( variable, message, label ) BREAK_EXPR((variable), NOT_EQUALS, 0L, message, label) #define BREAK_EQ( variable, equals, message, label ) \ BREAK_EXPR(variable, EQUALS, equals, message, label ) #define WSA_BREAK( variable, invalidator, message, label ) \ BREAK_HOOK_EXPR( variable, EQUALS, invalidator, \ message "\n\tWSAGetLastError() returns (dec) %d.",\ WSAGetLastError(), label ) #define NT_BREAK_ON BREAK_IF /*++ MYALLOC used whom: variable to put the memory into. what: what kind of memory it points to.. the integral denomination of memory we are allocating (char for a string, int for an int *...) howmany: integral size of "what"s we are allocating (see below) withwhat: routine to use in allocation (eg malloc, LocalAlloc...). this routine must return NULL on failure to allocate. EXAMPLE: I want to allocate a string of 15 characters with malloc { PCHAR mystring; if (! MYALLOC( mystring, CHAR, 15, malloc )) { fprintf(stderr, "failed to allocate!"); exit(0); } } --*/ #define MYALLOC( whom, what, howmany, withwhat ) \ ( ( (whom) = (what *) (withwhat)( (howmany) * sizeof(what)) ) != NULL ) /* ONEALLOC is a special case of MYALLOC, where howmany is 1 */ #define ONEALLOC( whom, what, withwhat ) MYALLOC( whom, what, 1, withwhat)