133 lines
4.2 KiB
C
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__ */
|
||
|
|