/* ======================================================================= LLD.h Generic Doubly Linked List for fixed size data-items. v1.00 94-08-21 _____ This version is Public Domain. /_|__| A.Reitsma, Delft, The Netherlands. / | \ --------------------------------------------------------------- */ #include "defines.h" #ifndef FAR #define FAR #endif #ifndef LL__ERR_H #define LL__ERR_H /* same values used in LLS ... */ enum ListErrors { /* return values for LLDcheck() *//* The highest value is returned */ LIST_NO_PROBLEMS, /* All is OK (multiple use) */ LIST_EMPTY, /* No data available */ LIST_ERRORS, /* Dummy to separate warnings from */ /* ---- REAL errors --------------------------- */ LIST_CORRUPT1, /* invalid last node pointer: != first->next */ /* (empty list) or link error */ LIST_CORRUPT2, /* invalid current node pointer: != first->next */ /* (empty list) */ LIST_CORRUPT3, /* invalid last node pointer: Not really last. */ LIST_CORRUPT4, /* invalid last node pointer: Not in list, */ /* or link error after current node */ LIST_ERR_LAST, /* invalid last node pointer: NULL */ LIST_CORRUPT5, /* invalid current node pointer: Not in list, */ /* or link error before current node */ LIST_CORRUPT6, /* invalid current->next node pointer: NULL */ /* although the list is not empty */ LIST_CORRUPT7, /* NULL current node pointer */ LIST_ERR_HEAD, /* NULL first node pointer */ /* or error in head node */ LIST_NOT_CREATED, /* List deleted or not created */ LIST_INV_NUMBER, /* List number out of range */ LIST_SYSTEM_NULL /* List system not intialized */ }; typedef int (*CompFunPtr) (const void *, const void *); /* simplifies declarations */ #endif #ifndef LLD_H #define LLD_H /* ---- LL system management and maintenance -------------------------- */ int LLDsystemInit(int ListCount); /* returns -1 on failure. It is not required to call it. */ /* A second call does nothing: ListCount is ignored. */ int LLDcreate(int ItemSize); /* returns list number to use or -1 on failure. */ /* MUST be called before using a list. */ /* Calls LLsystemInit if necessary. */ void LLDdelete(int List); /* delete entire list, data is NOT free()'d */ int LLDcheck(int List); /* returns enum ListErrors value */ /* its primary purpose is debugging. */ int LLDsystemClose(void); /* MK mainly frees memory for the ListControlBlocks */ /* ---- Node management -------------------------------------------------- Functions changing current node pointer to the new node. Each created list has its own -- fixed -- datasize. See LLcreate(). An ellipsis "..." indicates the data to insert. */ int LLDnodeInsert(int List, ...); /* insert BEFORE current node */ int LLDnodeAdd(int List, ...); /* insert AFTER current node */ /* a return value of -1 indicates a memory allocation problem. */ /* Functions NOT changing the current node pointer. Especially intended for implementation of Queue's and Stacks. */ int LLDnodePrepend(int List, ...); /* insert as first node */ int LLDnodeAppend(int List, ...); /* insert as last node */ /* a return value of -1 indicates a memory allocation problem. */ /* The following four functions are essentially the same as the preceeding four. The data is however not passed by value but by reference. */ int LLDnodeInsertFrom(int List, void *Source); int LLDnodeAddFrom(int List, void *Source); int LLDnodePrependFrom(int List, void *Source); int LLDnodeAppendFrom(int List, void *Source); void LLDnodeDelete(int List); /* remove current node */ /* current node ptr moved to next node. UNLESS the deleted node */ /* was the last node: then current ptr moved to previous node */ int LLDnodeFind(int List, CompFunPtr Compare, void *DataPtr); /* Find *DataPtr in the List using the *Compare function. */ /* Returns the return value of *Compare. 0 == equal == found. */ /* non-zero == not found. Current node is set to found node. */ /* Returns 2 for an empty list. */ /* First checked node is current node. */ /* A NULL Compare-function defaults to the use of memcmp() with */ /* the list's itemsize as third (size) parameter. */ /* simple implementation. FindFirst and FindNext may be needed. */ /* ---- current node pointer management ---------------------------------- These functions change the current node pointer and return 1 when there was a change. A return of 0 indicates trying to move past the begin or the end of the list, or an empty list. The return value is intended for iteration purposes. I.e. stopping a scan through a list. */ int LLDnodePtr2First(int List); int LLDnodePtr2Last(int List); int LLDnodePtr2Next(int List); int LLDnodePtr2Prev(int List); /* ---- stored data management ------------------------------------------- return typed data: */ int LLDnodeInt(int List); long LLDnodeLong(int List); float LLDnodeFloat(int List); void *LLDnodePtr(int List); void FAR *LLDnodeFptr(int List); /* 'return' typeless data. The return value is the size of the data. The data is transferred to Destination. If 'Destination' is NULL, the only action is returning the size. */ int LLDnodeDataTo(int List, void *Destination); /* replaces typeless data with source */ int LLDnodeDataFrom(int List, void *source); #endif /* ==== LLD.h end ==================================================== */