|
|
/*
* 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__ */
|