home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / INCLUDE / VADECL.H < prev    next >
C/C++ Source or Header  |  1990-06-01  |  4KB  |  95 lines

  1. /*
  2.     vadecl.h  1/10/88
  3.  
  4.     % 'virtual smart'  array functions
  5.  
  6.     written by Joe DeSantis.
  7.     fleshed out by Ted Peck.
  8.  
  9.     OWL 1.2
  10.     Copyright (c) 1986, 1987, 1988, by Oakland Group, Inc.
  11.     ALL RIGHTS RESERVED.
  12.  
  13.     Revision History:
  14.     -----------------
  15.      4/05/88 Ted    added VOID *'s, prototype arg names, clearelem
  16.      4/18/88 Ted    Added free element/next element handling
  17.  
  18.      3/28/90 jmd    ansi-fied
  19.      6/01/90 jmd    changed index to indeks to avoid DG conflict
  20. */
  21.  
  22. /* -------------------------------------------------------------------------- */
  23. /* Data Types */
  24.  
  25. #define NOID    ((unsigned)(-1))
  26.  
  27. /* -------------------------------------------------------------------------- */
  28. typedef unsigned va_index;
  29. typedef va_index va_key;
  30. typedef int      va_tag;
  31.  
  32. /* The varray structure. */
  33.  
  34. typedef struct varray_struct {
  35.     byte         *array;                  /* the array */
  36.     unsigned     nelem;                  /* number of elements in array */
  37.     unsigned      elemsize;            /* size of an element in array */
  38.     VOID         *clearelem;            /* pointer to element full of init vals */
  39.     va_index      hint;
  40. } *varray;
  41.  
  42. /* The va_element structure, tacked on to each varray element */
  43. typedef struct _vae {
  44.     boolean  inuse;
  45.     va_tag      tag;
  46. } vae_struct;
  47.  
  48. /* -------------------------------------------------------------------------- */
  49. /* Macros. */
  50.  
  51. #define oarrayelem(array, indeks, esize)    ((byte *)(array)+(indeks)*(esize))
  52.  
  53. /* -------------------------------------------------------------------------- */
  54. #define va_array(va)        ((va)->array)
  55. #define va_nelem(va)        ((va)->nelem)
  56. #define va_inesize(va)        ((va)->elemsize)
  57. #define va_elemsize(va)        ((va)->elemsize - sizeof(vae_struct))
  58. #define va_clearelem(va)    ((va)->clearelem)
  59. #define va_hint(va)            ((va)->hint)
  60.  
  61. #define va_isvalid(va, indeks)            ((unsigned)(indeks) < (va)->nelem)
  62. #define va_elem(va, indeks)                oarrayelem((va)->array, indeks, va_inesize(va))
  63. #define va_elemvae(va, elem)            ((vae_struct *)((byte *)elem + va_elemsize(va)))
  64. #define va_vaeptr(va, indeks)            ((vae_struct *)((byte *)va_elem(va, (indeks)+1) - sizeof(vae_struct)))
  65. #define va_elemindeks(va,elem)            (((elem) != NULL) ? ((va_indeks)(((byte *)elem) - (va)->array)/va_inesize(va)) : NOID)
  66. #define va_geteleminuse(va, elem)        (va_elemvae(va, elem)->inuse)
  67. #define va_seteleminuse(va, elem, iu)    (va_elemvae(va, elem)->inuse = iu)
  68. #define va_getelemtag(va, elem)            (va_elemvae(va, elem)->tag)
  69. #define va_setelemtag(va, elem, tg)        (va_elemvae(va, elem)->tag = tg)
  70.  
  71. #define va_get(va, indeks)                (va_isvalid (va, indeks) ? va_elem(va, indeks) : NULL)
  72. #define va_isfree(va, indeks)            (!va_vaeptr(va, indeks)->inuse)
  73. #define va_setfree(va, indeks, isfree)    (va_vaeptr(va, indeks)->inuse = !isfree)
  74. #define va_gettag(va, indeks)            (va_vaeptr(va, indeks)->tag)
  75. #define va_settag(va, indeks, intag)      (va_vaeptr(va, indeks)->tag = intag)
  76.  
  77. #define va_getfirst(va, tag, ip)        va_getnext(va, tag, ip, NOID)
  78.  
  79. /* -------------------------------------------------------------------------- */
  80. /* Function prototypes. */
  81. /* -------------------------------------------------------------------------- */
  82.  
  83. /* VARRAY.C */
  84. extern varray    va_make(unsigned nelem, unsigned elemsize, VOID *clearelem, boolean inuse, va_tag tag);
  85. extern void        va_free(varray va);
  86. extern VOID       *va_put(varray va, va_index indeks, VOID *elem);
  87. extern unsigned va_clear(varray va, va_index indeks, unsigned nelem);
  88. extern void        va_freeelem(varray va, va_index indeks);
  89. extern va_index va_findfree(varray va);
  90. extern va_index va_getnext(varray va, va_tag tagspec, va_index *indexp, va_key key);
  91. extern unsigned va_expand(varray va, va_index indeks);
  92.  
  93. /* -------------------------------------------------------------------------- */
  94.  
  95.