This is dlist.h in view mode; [Download] [Up]
/* dlist v1.0.0 Dynamic list library * Copyright (c) 1994 Bill Bereza * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * * To reach the author * * email: * berezaw@river.it.gvsu.edu ac368@leo.nmc.edu * * $Log: dlist.h,v $ * Revision 1.6 94/12/22 02:47:55 berezaw * added dlistmemusage() macro * * Revision 1.5 94/12/20 22:53:06 berezaw * did some fiddling with qsort * * Revision 1.4 94/12/19 22:19:08 berezaw * *** empty log message *** * * Revision 1.3 94/12/19 21:17:30 berezaw * finished quick sort function * * Revision 1.2 94/12/19 13:16:15 berezaw * made daddel functions macros for a more general function * * Revision 1.1 94/12/17 21:54:24 berezaw * Initial revision * * * $Header: /Users/berezaw/src/dlist/RCS/dlist.h,v 1.6 94/12/22 02:47:55 berezaw Exp $ */ #ifndef _DLIST_H #define _DLIST_H #include <stdlib.h> #include <stddef.h> #include <string.h> struct __dlstflags { unsigned int is_linked : 1; }; #define __DFLAGS struct __dlstflags struct _del { /* normal element structure */ void *_element; struct _del *_prev; struct _del *_next; }; #define _DEL struct _del struct _delv { /* variable element structure */ void *_element; struct _delv *_prev; struct _delv *_next; size_t _elvsize; }; #define _DELV struct _delv struct _dlist { void *_first; void *_last; size_t _bytes; size_t _elems; size_t _elsize; __DFLAGS _flags; }; #define DLIST struct _dlist extern DLIST *_initdlist(size_t obs, int lnk); #define initdlist(s) _initdlist((s),0) #define initdlink(s) _initdlist((s),1) /* initdlist will allocate space for the dlist structure * and set all the values in the structure to zero or null * * It will set the element size to obs. If obs is zero, then * the element size will be variable * * initdlink will create a list where the element space * will only point to some previously allocated space * * you will have to free it. * * returns pointer to DLIST if successful, else returns NULL */ #define DLST_ISLINKED(s) ((s)->_flags.is_linked) #define DLST_SAVE(s) (((s)->_flags.is_linked)=1) #define DLST_FREE(s) (((s)->_flags.is_linked)=0) extern void freeels(DLIST *oldlist); /* freeels frees all the elements in the dlist * and resets the length to zero * * the argument must be a previously initialized dlist * * no return value */ extern void freedlist(DLIST *oldlist); /* freedlist will free all space used by the dlist struct * including the list of elements * * the argument should be a dlist struct pointer that has already been allocated * * freedlist has no return value */ extern void *__daddel(DLIST *dstr, void *addel, size_t els); #define daddel(l,a) __daddel((l),(a),0) /* daddel will add one element to the dlist * * dlist must already be initialized with initdlist first * * daddel returns NULL if it couldn't add an element * and returns a pointer to added if successful */ #define daddelv(l,a,s) __daddel((l),(a),(s)) /* daddelv will add one character to the dlist * * dlist must already be initialized with initdlist first * * daddelv returns NULL if it couldn't add an element * and returns the pointer to the element added if successful */ #define dlistbytes(l) ((l)->_bytes) /* dlistbytes returns the number of bytes in the DLISt * * the dlist must already be initialized */ /* extern size_t dlistels(DLIST *oldlist); */ #define dlistels(l) ((l)->_elems) #define dlistsize(l) dlistels(l) /* dlistels returns the number of elements in the DLISt * * the dlist must already be initialized */ /* extern size_t delsize(DLIST *oldlist); */ #define delsize(l) ((l)->_elsize) /* delsize returns the size of elements in the DLISt * * the dlist must already be initialized */ #define dlistmemusage(q) (sizeof(DLIST)+(DLST_ISLINKED(q) ? 0 : dlistbytes(q))+(dlistsize(q)*(delsize(q) ? sizeof(_DEL) : sizeof(_DELV)))) extern void *arrdlist(DLIST *oldlist); /* arrdlist will allocate space for an array and * copy all elements from DLIST into the array * * This function can only be used if the list uses * non-variable elements * * DLIST must be previously initialized * * returns a pointer to the array */ extern DLIST *__dlistcat(DLIST *ostr, DLIST *addstr); #define dlistcat(t,f) __dlistcat((t),(f)) /* dlistcat appends the elements from the second dlist onto the end * of the first dlist * * both arguments must be previously initialized dlist * * returns NULL on error, else returns pointer to the first list */ #define dlistcpy(f) __dlistcat((initdlist(delsize(f))), (f)) /* dlistcpy copies the elements from the second dlist and creates another dlist * pointed to by the first dstring pointer * * the second dlist must be previously initialized * * returns NULL on error, else returns a pointer to the new dlist */ #define dlistlnk(f) __dlistcat((initdlink(delsize(f))), (f)) /* dlistcpy copies the elements from the second dlist and creates another dlist * pointed to by the first dstring pointer * * Both of the dlists will be pointing to the same data * This allows you to have a sorted and unsorted version * of the same data. * * the second dlist must be previously initialized * * returns NULL on error, else returns a pointer to the new dlist */ #define __DELCMPARGS void *, void * extern DLIST *dlstinsertsort(DLIST *tosort, int (*elcmp)(__DELCMPARGS)); /* perform Insertion Sort on the list * * returns a pointer to the new sorted list */ extern DLIST *dlstsort(DLIST *tosort, int (*elcmp)(__DELCMPARGS)); /* perform best possible sort on the list * * this will perform an optimised quick sort on the list * (when I finish the qsort function) * * returns a pointer to the sorted list */ #endif /* !_DLIST_H */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.