home *** CD-ROM | disk | FTP | other *** search
- /*
- vadecl.h 1/10/88
-
- % 'virtual smart' array functions
-
- written by Joe DeSantis.
- fleshed out by Ted Peck.
-
- OWL 1.1
- Copyright (c) 1986, 1987, 1988, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 4/05/88 Ted added VOID *'s, prototype arg names, clearelem
- 4/18/88 Ted Added free element/next element handling
- */
-
- /* -------------------------------------------------------------------------- */
- /* Data Types */
-
- #define NOID ((unsigned)(-1))
-
- /* -------------------------------------------------------------------------- */
- typedef unsigned va_index;
- typedef va_index va_key;
- typedef int va_tag;
-
- /* The varray structure. */
-
- typedef struct varray_struct {
- byte *array; /* the array */
- unsigned nelem; /* number of elements in array */
- unsigned elemsize; /* size of an element in array */
- VOID *clearelem; /* pointer to element full of init vals */
- va_index hint;
- } *varray;
-
- /* The va_element structure, tacked on to each varray element */
- typedef struct {
- boolean inuse;
- va_tag tag;
- } vae_struct;
-
- /* -------------------------------------------------------------------------- */
- /* Macros. */
-
- #define oarrayelem(array, index, esize) ((byte *)(array)+(index)*(esize))
-
- /* -------------------------------------------------------------------------- */
- #define va_array(va) ((va)->array)
- #define va_nelem(va) ((va)->nelem)
- #define va_inesize(va) ((va)->elemsize)
- #define va_elemsize(va) ((va)->elemsize - sizeof(vae_struct))
- #define va_clearelem(va) ((va)->clearelem)
- #define va_hint(va) ((va)->hint)
-
- #define va_isvalid(va, index) ((unsigned)(index) < (va)->nelem)
- #define va_elem(va, index) oarrayelem((va)->array, index, va_inesize(va))
- #define va_elemvae(va, elem) ((vae_struct *)((byte *)elem + va_elemsize(va)))
- #define va_vaeptr(va, index) ((vae_struct *)((byte *)va_elem(va, (index)+1) - sizeof(vae_struct)))
- #define va_elemindex(va,elem) (((elem) != NULL) ? ((va_index)(((byte *)elem) - (va)->array)/va_inesize(va)) : NOID)
- #define va_geteleminuse(va, elem) (va_elemvae(va, elem)->inuse)
- #define va_seteleminuse(va, elem, iu) (va_elemvae(va, elem)->inuse = iu)
- #define va_getelemtag(va, elem) (va_elemvae(va, elem)->tag)
- #define va_setelemtag(va, elem, tg) (va_elemvae(va, elem)->tag = tg)
-
- #define va_get(va, index) (va_isvalid (va, index) ? va_elem(va, index) : NULL)
- #define va_isfree(va, index) (!va_vaeptr(va, index)->inuse)
- #define va_setfree(va, index, isfree) (va_vaeptr(va, index)->inuse = !isfree)
- #define va_gettag(va, index) (va_vaeptr(va, index)->tag)
- #define va_settag(va, index, intag) (va_vaeptr(va, index)->tag = intag)
-
- #define va_getfirst(va, tag, ip) va_getnext(va, tag, ip, NOID)
-
- /* -------------------------------------------------------------------------- */
- /* Function prototypes. */
- /* -------------------------------------------------------------------------- */
- extern varray va_make(_arg5(unsigned nelem, unsigned elemsize,
- VOID *clearelem, boolean inuse,va_tag tag));
-
- extern void va_free(_arg1(varray va));
- extern VOID *va_put(_arg3(varray va, va_index index, VOID *elem));
- extern unsigned va_clear(_arg3(varray va, va_index index, unsigned nelem));
- extern void va_freeelem(_arg2(varray va, va_index index));
- extern va_index va_findfree(_arg1(varray va));
- extern va_index va_getnext(_arg4(varray va, va_tag tagspec, va_index *indexp, va_key key));
- extern unsigned va_expand(_arg2(varray va, va_index index));
-
- /* -------------------------------------------------------------------------- */
-
-