AcePerl
view release on metacpan or search on metacpan
acelib/wh/array.h view on Meta::CPAN
/* #define ARRAY_CHECK */
typedef struct ArrayStruct
{ char* base ; /* char* since need to do pointer arithmetic in bytes */
int dim ; /* length of alloc'ed space */
int size ;
int max ; /* largest element accessed via array() */
int id ; /* unique identifier */
int magic ;
} *Array ;
/* NB we need the full definition for arr() for macros to work
do not use it in user programs - it is private.
*/
#define ARRAY_MAGIC 8918274
#define STACK_MAGIC 8918275
#define ASS_MAGIC 8918276
#if !defined(MEM_DEBUG)
Array uArrayCreate (int n, int size, STORE_HANDLE handle) ;
void arrayExtend (Array a, int n) ;
Array arrayCopy (Array a) ;
#else
Array uArrayCreate_dbg (int n, int size, STORE_HANDLE handle,
const char *hfname,int hlineno) ;
void arrayExtend_dbg (Array a, int n, const char *hfname,int hlineno) ;
Array arrayCopy_dbg(Array a, const char *hfname,int hlineno) ;
#define uArrayCreate(n, s, h) uArrayCreate_dbg(n, s, h, __FILE__, __LINE__)
#define arrayExtend(a, n ) arrayExtend_dbg(a, n, __FILE__, __LINE__)
#define arrayCopy(a) arrayCopy_dbg(a, __FILE__, __LINE__)
#endif
Array uArrayReCreate (Array a,int n, int size) ;
void uArrayDestroy (Array a);
char *uArray (Array a, int index) ;
char *uArrCheck (Array a, int index) ;
char *uArrayCheck (Array a, int index) ;
#define arrayCreate(n,type) uArrayCreate(n,sizeof(type), 0)
#define arrayHandleCreate(n,type,handle) uArrayCreate(n, sizeof(type), handle)
#define arrayReCreate(a,n,type) uArrayReCreate(a,n,sizeof(type))
#define arrayDestroy(x) ((x) ? uArrayDestroy(x), x=0, TRUE : FALSE)
#if (defined(ARRAY_CHECK) && !defined(ARRAY_NO_CHECK))
#define arrp(ar,i,type) ((type*)uArrCheck(ar,i))
#define arr(ar,i,type) (*(type*)uArrCheck(ar,i))
#define arrayp(ar,i,type) ((type*)uArrayCheck(ar,i))
#define array(ar,i,type) (*(type*)uArrayCheck(ar,i))
#else
#define arr(ar,i,type) ((*(type*)((ar)->base + (i)*(ar)->size)))
#define arrp(ar,i,type) (((type*)((ar)->base + (i)*(ar)->size)))
#define arrayp(ar,i,type) ((type*)uArray(ar,i))
#define array(ar,i,type) (*(type*)uArray(ar,i))
#endif /* ARRAY_CHECK */
/* only use arr() when there is no danger of needing expansion */
Array arrayTruncatedCopy (Array a, int x1, int x2) ;
void arrayStatus (int *nmadep,int* nusedp, int *memAllocp, int *memUsedp) ;
int arrayReportMark (void) ; /* returns current array number */
void arrayReport (int j) ; /* write stderr about all arrays since j */
#define arrayMax(ar) ((ar)->max)
#define arrayForceFeed(ar,j) (uArray(ar,j), (ar)->max = (j))
#define arrayExists(ar) ((ar) && (ar)->magic == ARRAY_MAGIC ? (ar)->id : 0 )
/* JTM's package to hold sorted arrays of ANY TYPE */
BOOL arrayInsert(Array a, void * s, int (*order)(void*, void*));
BOOL arrayRemove(Array a, void * s, int (*order)(void*, void*));
void arraySort(Array a, int (*order)(void*, void*)) ;
void arraySortPos (Array a, int pos, int (*order)(void*, void*));
void arrayCompress(Array a) ;
BOOL arrayFind(Array a, void *s, int *ip, int (*order)(void*, void*));
BOOL arrayIsEntry(Array a, int i, void *s);
/************** Stack package **************/
typedef struct StackStruct /* assumes objects <= 16 bytes long */
{ Array a ;
int magic ;
char* ptr ; /* current end pointer */
char* pos ; /* potential internal pointer */
char* safe ; /* need to extend beyond here */
BOOL textOnly; /* If this is set, don't align the stack.
This (1) save space (esp on ALPHA) and
(2) provides stacks which can be stored and got
safely between architectures. Once you've set this,
using stackTextOnly() only pushText, popText, etc,
no other types. */
} *Stack ;
/* as with ArrayStruct, the user should NEVER access StackStruct
members directly - only through the subroutines/macros
*/
#if !defined(MEM_DEBUG)
Stack stackHandleCreate (int n, STORE_HANDLE handle) ;
#else
Stack stackHandleCreate_dbg (int n, STORE_HANDLE handle,
const char *hfname,int hlineno) ;
#define stackHandleCreate(n, h) stackHandleCreate_dbg(n, h, __FILE__, __LINE__)
#endif
#define stackCreate(n) stackHandleCreate(n, 0)
Stack stackReCreate (Stack s, int n) ;
Stack stackCopy (Stack, STORE_HANDLE handle) ;
void stackTextOnly(Stack s);
void uStackDestroy (Stack s);
#define stackDestroy(x) ((x) ? uStackDestroy(x), (x)=0, TRUE : FALSE)
void stackExtend (Stack s, int n) ;
void stackClear (Stack s) ;
#define stackEmpty(stk) ((stk)->ptr <= (stk)->a->base)
#define stackExists(stk) ((stk) && (stk)->magic == STACK_MAGIC ? arrayExists((stk)->a) : 0)
/* Stack alignment: we use two strategies: the smallest type we push is
a short, so if the required alignment is to 2 byte boundaries, we
push each type to its size, and alignments are kept.
Otherwise, we push each type to STACK_ALIGNMENT, this ensures
alignment but can waste space. On machines with 32 bits ints and
pointers, we make satck alignment 4 bytes, and do the consequent unaligned
access to doubles by steam.
( run in 0.471 second using v1.01-cache-2.11-cpan-ceb78f64989 )