Windows2003-3790/inetcore/wininet/inc/macros.h
2020-09-30 16:53:55 +02:00

249 lines
4.9 KiB
C

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
macros.h
Abstract:
Contains all internal macros used in INTERNET.DLL
Contents:
ROUND_UP_?K
ROUND_UP_DWORD
NEW
DEL
NEW_STRING
DEL_STRING
NEW_MEMORY
ZAP
PRIVATE
PUBLIC
GLOBAL
LOCAL
DEBUG_FUNCTION
SKIPWS
Author:
Richard L Firth (rfirth) 16-Nov-1994
Revision History:
16-Nov-1994 rfirth
Created
--*/
//
// macros
//
//
// ROUND_UP_ - return (n) rounded up to the next (k) bytes
//
#define ROUND_UP_NK(n, k) (((n) + ((_ ## k ## K) - 1)) & -(_ ## k ## K))
#define ROUND_UP_2K(n) ROUND_UP_NK(n, 2)
#define ROUND_UP_4K(n) ROUND_UP_NK(n, 4)
#define ROUND_UP_8K(n) ROUND_UP_NK(n, 8)
#define ROUND_UP_16K(n) ROUND_UP_NK(n, 16)
//
// ROUND_UP_DWORD - return (n) rounded up to the next 4 bytes
//
#define ROUND_UP_DWORD(value) \
(((value) + sizeof(DWORD) - 1) & ~(sizeof(DWORD) - 1))
//
// ARRAY_ELEMENTS - returns number of elements in array
//
#define ARRAY_ELEMENTS(array) \
(sizeof(array)/sizeof(array[0]))
//
// NEW - allocates a new 'object' of type (obj). Memory is allocated with
// LocalAlloc and initialized to zeroes
//
#define NEW(object) \
(object FAR *)ALLOCATE_ZERO_MEMORY(sizeof(object))
//
// DEL - (should be DELETE, but that symbol is taken) - does opposite of NEW()
//
#define DEL(object) \
FREE_MEMORY(object)
//
// NEW_STRING - performs NEW for a string
//
#define NEW_STRING(string) \
NewString(string, 0)
//
// DEL_STRING - performs DEL for a string
//
#define DEL_STRING(string) \
FREE_MEMORY(string)
//
// NEW_MEMORY - performs NEW for arbitrary sized memory
//
#define NEW_MEMORY(n, type) \
(type FAR *)ALLOCATE_FIXED_MEMORY(n * sizeof(type))
//
// ZAP - zeroes an object (must be a variable, not a pointer)
//
#define ZAP(thing) \
ZeroMemory((PVOID)&thing, sizeof(thing))
//
// STRTOUL - character-width independent (compile-time controlled) strtoul
//
#define STRTOUL strtoul
//
// PRIVATE - make static items visible in debug version *FOR GLOBALS ONLY*. Use
// LOCAL in functions
//
#if INET_DEBUG
#define PRIVATE
#else
//#define PRIVATE static
#define PRIVATE
#endif // INET_DEBUG
//
// PUBLIC - just used as an aide-a-programmer pour le nonce
//
#define PUBLIC
//
// GLOBAL - same as PUBLIC, aide-a-programmer (for now) that tells you this
// thang has global scope
//
#define GLOBAL
//
// LOCAL - always expands to static, so you know that this thing only has
// local scope (within the current block)
//
#define LOCAL static
//
// DEBUG_FUNCTION - this is a debug-only routine (if it get compiled in retail
// version a compile-time error is generated)
//
#if INET_DEBUG
#define DEBUG_FUNCTION
#else
#define DEBUG_FUNCTION
#endif // INET_DEBUG
//
// SKIPWS - skips blank widespace on the front of a string
//
#define SKIPWS(s) while (*(s)==' ' || *(s)=='\t') (s)++;
//
// MAKE_LOWER - takes an assumed upper character and bit manipulates into a lower.
// (make sure the character is Upper case alpha char to begin, otherwise it corrupts)
//
#define MAKE_LOWER(c) (c | 0x20)
//
// MAKE_UPPER - takes an assumed lower character and bit manipulates into a upper.
// (make sure the character is Lower case alpha char to begin, otherwise it corrupts)
//
#define MAKE_UPPER(c) (c & 0xdf)
//
// FASTCALL - used to bypass problems that may arise with UNIX compilers
//
#ifdef FASTCALL
#undef FASTCALL
#endif
#ifdef unix
#define FASTCALL
#else
#define FASTCALL __fastcall
#endif
//
// macro to cast FILETIME to LONGLONG
//
#define FT2LL(x) ( ((LONGLONG)((x).dwLowDateTime)) | (((LONGLONG)((x).dwHighDateTime))<<32) )
//
// Inline function to handle adding LONGLONG to FILETIME.
//
static __inline
void AddLongLongToFT( IN OUT LPFILETIME lpft,
IN LONGLONG llVal )
{
LONGLONG llTmp;
llTmp = FT2LL(*lpft);
llTmp += llVal;
lpft->dwLowDateTime = ((LPDWORD)&llTmp)[0];
lpft->dwHighDateTime = ((LPDWORD)&llTmp)[1];
}
//
// Macro to compute the number of bytes between two pointers
// The type of this expression is size_t, a signed integral
// type matching the size of a pointer
//
#define PtrDifference(x,y) ((LPBYTE)(x) - (LPBYTE)(y))
//
// Macro to typecast 64-bit quantity to 32-bits
// Asserts in debug mode if the typecast loses information
//
#ifdef DBG
#define GuardedCast(x) ((x)<=0xFFFFFFFFL ? (DWORD)(x) : (InternetAssert(FALSE, __FILE__, __LINE__), 0))
#else
#define GuardedCast(x) (DWORD)(x)
#endif
// Macro for the most common case
#define PtrDiff32(x,y) (GuardedCast(PtrDifference(x,y)))