109 lines
1.7 KiB
C
109 lines
1.7 KiB
C
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
BILINK.H
|
|
|
|
Abstract:
|
|
|
|
Management for doubly linked lists
|
|
|
|
Author:
|
|
|
|
George Joy
|
|
|
|
Environment:
|
|
|
|
32-bit 'C'
|
|
|
|
Revision History:
|
|
|
|
--*/// BILINK.H
|
|
|
|
// Make sure all variations of DEBUG are defined if any one is
|
|
#if defined(DEBUG) || defined(DBG) || defined(_DEBUG)
|
|
#if !defined(DBG)
|
|
#define DBG
|
|
#endif
|
|
#if !defined(DEBUG)
|
|
#define DEBUG
|
|
#endif
|
|
#if !defined(_DEBUG)
|
|
#define _DEBUG
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif // __cplusplus
|
|
|
|
#ifndef _BILINK_
|
|
|
|
#define _BILINK_
|
|
|
|
#if !defined(offsetof)
|
|
#define offsetof(type, field) ((int)(&((type *)0)->field))
|
|
#endif
|
|
|
|
#ifndef CONTAINING_RECORD
|
|
#define CONTAINING_RECORD(address,type,field) \
|
|
((type *)((PCHAR)(address) - (UINT_PTR)(&((type *)0)->field)))
|
|
#endif // CONTAINING_RECORD
|
|
|
|
typedef struct BILINK {
|
|
struct BILINK *next;
|
|
struct BILINK *prev;
|
|
void *pvObject;
|
|
} BILINK;
|
|
|
|
/* XLATOFF */
|
|
|
|
#define EMPTY_BILINK(_pBilink) ((_pBilink)->next==(_pBilink))
|
|
|
|
#ifdef DEBUG
|
|
#define ASSERT_EMPTY_BILINK(_b) ASSERT((_b)->next==(_b))
|
|
#else
|
|
#define ASSERT_EMPTY_BILINK(_b)
|
|
#endif
|
|
|
|
// This only works for BILINKS that are the first item in a structure.
|
|
#define BilinkToList( _pBilink ) \
|
|
(_pBilink)->prev->next=NULL;
|
|
|
|
#define InitBilink( _pBilink, _pvObject ) \
|
|
(_pBilink)->prev=(_pBilink)->next=(_pBilink); (_pBilink)->pvObject = _pvObject;
|
|
|
|
#ifdef DEBUG
|
|
|
|
int FindObject(
|
|
BILINK *link,
|
|
BILINK *list
|
|
);
|
|
#endif
|
|
|
|
void InsertAfter(
|
|
BILINK *in,
|
|
BILINK *after
|
|
);
|
|
|
|
void InsertBefore(
|
|
BILINK *in,
|
|
BILINK *before
|
|
);
|
|
|
|
void Delete(
|
|
BILINK *p
|
|
);
|
|
|
|
/* XLATON */
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif // __cplusplus
|