home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------- */
- /* ARRAY.C */
- /* Verwaltung dynamischer Arrays */
- /* (c) 1992 Thomas Lach & DMV-Verlag */
- /* ------------------------------------------------- */
-
- /* ------------------------------------------------- */
- /* void * ArrayGetwoErr(_Array *arr, size_t position)*/
- /* MACRO */
- /* -- Adressierung eines bestimmten Elements */
- /* ohne Fehlercode */
- /* */
- /* _Array * ArrayStart(size_t elem_size); */
- /* -- initilialisierung des _Array Pointers */
- /* */
- /* ArrayChgAlloc(_Array *arr, int siz) MACRO */
- /* -- Verändern des AllocSizes für die Erweiterung */
- /* des Arrays */
- /* */
- /* _Array * ArrayAdd(_Array *arr, char *data); */
- /* -- Einhängen eines Elements in das _Array */
- /* (mit evtl. Erweiterung des Arrays) */
- /* */
- /* ------------------------------------------------- */
- /* */
- /* void *ArrayChg(_Array *arr, */
- /* void *data, size_t pos) */
- /* Austausch eines bestimmten Elements mit Rückgabe */
- /* des alten Elements */
- /* */
- /* ------------------------------------------------- */
- /* */
- /* void *ArrayDel(_Array *arr, size_t pos) */
- /* Löschen eines bestimmten Elementes mit Rückgabe. */
- /* Das letzte Element wird in das Gelöschte kopiert */
- /* und ArrCount um 1 dekrementiert. */
- /* */
- /* ------------------------------------------------- */
- /* */
- /* void ArrayKill(_Array *arr); */
- /* Zerstören des _Array Pointers */
- /* */
- /* ------------------------------------------------- */
- /* */
- /* ArrayElemNum(_Array *arr) MACRO */
- /* Anzahl der Elemente eines Arrays */
- /* */
- /* */
- /* ArrayErr(_Array *arr) MACRO */
- /* Abfrage des Fehlercodes */
- /* */
- /* ArrayData(_Array *arr) MACRO */
- /* Zeiger auf die Daten eines Arrays */
- /* */
- /* ------------------------------------------------- */
-
- #include <alloc.h> /* malloc, calloc,
- realloc, free */
- #include <string.h> /* memcpy */
- #include <limits.h> /* UINT_MAX */
-
- #include "array.h"
-
- #define SETERR(arr,code) \
- { arr->ErrCode = code; \
- ArrayErrorFunction(arr); }
-
- static const MinArr = 10;
-
- static int _ArrayErrorFunction(_Array *arr);
-
- int (*ArrayErrorFunction)(_Array *arr) =
- _ArrayErrorFunction;
-
- /* ------------------------------------------------- */
-
- _Array * ArrayStart(size_t size)
- {
- char *ar, *tmp;
- static _Array * a;
-
- if ((a = (_Array *) malloc(sizeof(_Array))) ==
- NULLARRAY)
- return (NULLARRAY);
- if ((ar = (char *) calloc(MinArr, size)) == NULL)
- return (NULLARRAY);
- if ((tmp = (char *) malloc(size)) == (char *) 0)
- return (NULLARRAY);
-
- a->Arr = ar, a->ArrSize = MinArr,
- a->Tmp = tmp, a->ErrCode = ARR_NOERR,
- a->ArrCount = 0, a->AllocSize = MinArr,
- a->ItemSize = size;
-
- return a;
- }
-
- /* ------------------------------------------------- */
-
- _Array * ArrayAdd(_Array *arr, char *data)
- {
- char *tmp;
- long pos = ((long)arr->ItemSize *
- (long) arr->ArrCount);
-
- SETERR(arr, ARR_NOERR); // clear error code
-
- if ((pos+arr->ItemSize) > UINT_MAX) {
- SETERR(arr, ARR_LIMERR);
- return NULLARRAY;
- } // size > 64k
-
- if (arr->ArrCount < arr->ArrSize) {
- // empty places ?
- memcpy(arr->Arr+(arr->ItemSize*arr->ArrCount++),
- data, arr->ItemSize);
- return arr;
- }
-
- tmp = realloc(arr->Arr,
- (arr->ArrSize + arr->AllocSize) * arr->ItemSize);
-
- if (tmp != (char *)0) { // copy data
- memcpy(tmp+(arr->ArrCount *
- arr->ItemSize), data, arr->ItemSize);
- arr->ArrCount++;
- arr->ArrSize += arr->AllocSize;
- arr->Arr = tmp;
- return arr;
- }
-
- SETERR(arr, ARR_MEMERR);
-
- return NULLARRAY;
- }
-
- /* ------------------------------------------------- */
-
- void *ArrayChg(_Array *arr, void *data, size_t pos)
- {
- memcpy(arr->Tmp, ArrayGet(arr, pos), arr->ItemSize);
- memcpy(ArrayGet(arr, pos), data, arr->ItemSize);
-
- return arr->Tmp;
- }
-
- /* ------------------------------------------------- */
-
- void *ArrayGet(_Array *arr, size_t pos)
- {
- SETERR(arr, ARR_NOERR); // clear error code
- if (pos < ArrayElemNum(arr))
- return (void*)&(arr->Arr[pos*arr->ItemSize]);
- SETERR(arr, ARR_MAXERR);
- return (void *)0;
- }
-
- /* ------------------------------------------------- */
-
- void *ArrayDel(_Array *arr, size_t pos)
- {
- memcpy(arr->Tmp, ArrayGet(arr, pos), arr->ItemSize);
-
- if (pos < ArrayElemNum(arr)-1) {
- memcpy(ArrayGet(arr,pos),ArrayGet(arr,(pos+1)),
- (ArrayElemNum(arr)-pos)*arr->ItemSize);
- }
-
- ArrayElemNum(arr)-- ;
-
- return arr->Tmp;
- }
-
- /* ------------------------------------------------- */
-
- void ArrayKill(_Array *arr)
- {
- free(arr->Arr);
- free(arr->Tmp);
- memset(arr, 0, sizeof(_Array));
- free(arr);
- arr = NULLARRAY;
- }
-
- /* ------------------------------------------------- */
-
- static int _ArrayErrorFunction(_Array *arr)
- {
- if (arr->ErrCode != ARR_NOERR)
- return arr->ErrCode;
- return arr->ErrCode;
- }
- /* ------------------------------------------------- */
- /* Ende von ARRAY.C */
-
-