windows-nt/Source/XPSP1/NT/shell/ext/docprop/plex.h
2020-09-26 16:20:57 +08:00

133 lines
4.2 KiB
C

/*
* plex.h
*
* Structures and definitions for using plexs.
*/
#ifndef __plex__
#define __plex__
#define WAlign(w) (((w)+1)&~1)
/* comparison return values
*/
#define sgnGT 1
#define sgnEQ 0
#define sgnLT (-1)
#define sgnNE 2
/*----------------------------------------------------------------------------
| PL structure
|
| The PL (pronounced "plex") structure is used to efficiently
| manipulate variable sized arrays.
|
| Fields:
| iMax number of allocated items
| fUseCount use count plex (not all plex API's work w/ UseCount plexes)
| iMac last used allocated item
| cbItem sizeof item
| dAlloc number of items to allocate at a time
| dgShift data group to the plex should be
| allocated in
| rg the array of items
|
| WARNING: this structure also in winpm\excel.inc & mac\excel.i
|
----------------------------------------------------------------------------*/
typedef struct _pl
{
WORD iMax : 15,
fUseCount : 1;
SHORT iMac;
WORD cbItem;
WORD dAlloc:5,
unused:11;
BYTE rg[1];
}
PL;
/*----------------------------------------------------------------------------
| DEFPL macro
|
| Used to define a specific plex.
|
| Arguments:
| PLTYP name of the plex type
| TYP type of item stored in the plex
| iMax name to use for the iMax field
| iMac name to use for the iMac field
| rg name to use for the rg field
----------------------------------------------------------------------------*/
#define DEFPL(PLTYP,TYP,iMax,iMac,rg) \
typedef struct PLTYP\
{ \
WORD iMax : 15, \
fUseCount : 1; \
SHORT iMac; \
WORD cbItem; \
WORD dAlloc:5, \
unused:11; \
TYP rg[1]; \
} \
PLTYP;
/*----------------------------------------------------------------------------
| DEFPL2 macro
|
| Used to define a specific plex.
|
| Arguments:
| PLST name of the plex struct
| PLTYP name of the plex type
| TYP type of item stored in the plex
| iMax name to use for the iMax field
| iMac name to use for the iMac field
| rg name to use for the rg field
----------------------------------------------------------------------------*/
#define DEFPL2(PLST,PLTYP,TYP,iMax,iMac,rg) \
typedef struct PLST\
{ \
WORD iMax : 15, \
fUseCount : 1; \
SHORT iMac; \
WORD cbItem; \
WORD dAlloc:5, \
dgShift:3, \
unused:8; \
TYP rg[1]; \
} \
PLTYP;
// a FORPLEX was expanded by hand in bar.c:FHptbFromBarId for speed --
// if you change this then you may need to change that
#define FORPLEX(hp, hpMac, hppl) \
for ((hpMac) = ((hp) = (VOID HUGE *)((PL HUGE *)(hppl))->rg) + \
((PL HUGE *)(hppl))->iMac; \
LOWORD(hp) < LOWORD(hpMac); (hp)++)
#define cbPL ((int)&((PL *)0)->rg)
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
VOID *PplAlloc(unsigned, int, unsigned);
int IAddPl(VOID **, VOID *);
VOID FreePpl(VOID *);
BOOL RemovePl(VOID *, int);
int IAddPlSort(VOID **, VOID *, int (*pfnSgn)());
BOOL FLookupSortedPl(VOID *, VOID *, int *, int (*pfnSgn)());
int ILookupPl(VOID *, VOID *, int (*pfnSgn)());
VOID *PLookupPl(VOID *, VOID *, int (*pfnSgn)());
int CbPlAlloc(VOID *);
int IAddNewPlPos(VOID **, VOID *, int, int);
#ifdef __cplusplus
}; // extern "C"
#endif // __cplusplus
#endif /* __plex__ */