You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
250 lines
4.9 KiB
250 lines
4.9 KiB
/*++
|
|
|
|
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)))
|
|
|
|
#define NOVTABLE __declspec(novtable)
|