#ifndef __ITEMARR_H__
#define __ITEMARR_H__
#include "user.h"
typedef struct _ITEMLINK{
DWORD cur;
DWORD size;
struct _ITEMLINK *next;
} ITEMLINK;
typedef struct{
LPBYTE array;
BOOL bFixed;
ITEMLINK *first;
ITEMLINK *last;
DWORD length;
DWORD size;
DWORD szItem;
DWORD szRef;
DWORD szInit;
DWORD szGrow;
} ITEMARRAY;
typedef struct{
DWORD szRef;
ITEMARRAY ia;
} ITEMSTACK;
#define ISARRAY(a,type) (a && (a)->szItem==sizeof(type))
#define ItemArrayClear(a) ((a) ? 0 : ((a)->length=0))
#define ItemArrayInit(ia,sz) ItemArrayInitEx(ia,sz,0,0)
#define ItemArrayInitFixed(ia,sz) ItemArrayInitFixedEx(ia,sz,128,256)
LPVOID ItemArrayPtr(ITEMARRAY *ia, int i);
BOOL ItemArrayInitEx(ITEMARRAY *ia, DWORD sz, DWORD init, DWORD grow);
BOOL ItemArrayInitFixedEx(ITEMARRAY *ia, DWORD sz, DWORD init, DWORD grow);
void ItemArrayRemoveItem(ITEMARRAY *ia, LONG idx);
LPVOID ItemArraySearch(ITEMARRAY *ia, LPVOID key, int (*cmp)(LPVOID,LPVOID));
LONG ItemArraySearchIndex(ITEMARRAY *ia, LPVOID key, int (*cmp)(LPVOID,LPVOID));
#ifndef DBGALLOC
LPVOID ItemArrayAllocOnePtr(ITEMARRAY *ia);
LONG ItemArrayAllocOne(ITEMARRAY *ia);
LPVOID ItemArrayAllocManyPtr(ITEMARRAY *ia, DWORD sz);
LONG ItemArrayAllocMany(ITEMARRAY *ia, DWORD sz);
void ItemArrayFree(ITEMARRAY *ia);
#else
#define ItemArrayFree(ia) _ItemArrayFree(ia,__FILE__,__LINE__);
#define ItemArrayAllocOne(ia) _ItemArrayAllocOne(ia,__FILE__,__LINE__);
#define ItemArrayAllocOnePtr(ia) _ItemArrayAllocOnePtr(ia,__FILE__,__LINE__);
#define ItemArrayAllocMany(ia,s) _ItemArrayAllocMany(ia,s,__FILE__,__LINE__);
#define ItemArrayAllocManyPtr(ia,s) _ItemArrayAllocManyPtr(ia,s,__FILE__,__LINE__);
void _ItemArrayFree(ITEMARRAY *ia, LPTSTR f, DWORD ln);
LPVOID _ItemArrayAllocOnePtr(ITEMARRAY *ia, LPTSTR f, DWORD ln);
LONG _ItemArrayAllocOne(ITEMARRAY *ia, LPTSTR f, DWORD ln);
LPVOID _ItemArrayAllocManyPtr(ITEMARRAY *ia, DWORD sz, LPTSTR f, DWORD ln);
LONG _ItemArrayAllocMany(ITEMARRAY *ia, DWORD sz, LPTSTR f, DWORD ln);
#endif
typedef struct{
LONG left;
LONG right;
} STRINGTREEITEM;
typedef struct{
LPBYTE strings;
LPVOID array;
DWORD szItem;
LPDWORD offsets;
STRINGTREEITEM *nodes;
BOOL ignoreCase;
DWORD szStrings;
DWORD lenStrings;
LONG root;
DWORD size;
DWORD init;
DWORD length;
DWORD grow;
} STRINGTREE;
#define StringTreeInit(ia,init,grow) StringTreeInitEx(ia,0,init,grow,FALSE)
LPVOID StringTreeGetData(STRINGTREE *st, LONG i);
LPVOID StringTreeFindData(STRINGTREE *st, LPCTSTR str);
BOOL StringTreeInitEx(STRINGTREE *st,DWORD szItem,DWORD init,DWORD grow, BOOL ignoreCase);
LONG StringTreeFindString(STRINGTREE *st, LPCTSTR str);
LPBYTE StringTreeGetString(STRINGTREE *st, LONG i);
LONG StringTreeAddString(STRINGTREE *st, LPCTSTR str);
BOOL StringTreeFree(STRINGTREE *st);
void ItemArraySort(
ITEMARRAY *ia,
int (*cmp)(LPVOID,LPVOID)
);
#define MemArrayAlloc(ia,sz) MemArrayReAlloc(ia,NULL,sz)
LPVOID MemArrayReAlloc(ITEMARRAY *ia, LPVOID pv, DWORD sz);
void MemArrayFreePtr(ITEMARRAY *ia, LPVOID pv);
void MemArrayFreeAll(ITEMARRAY *ia);
BOOL ItemStackInit(ITEMSTACK *stack, DWORD sz);
LPVOID ItemStackGet(ITEMSTACK *stack);
LPVOID ItemStackPush(ITEMSTACK *stack, LPVOID p);
void ItemStackPop(ITEMSTACK *stack);
void ItemStackFree(ITEMSTACK *stack);
#endif