ftp.nice.ch/pub/next/unix/developer/docgen.0.3.2.s.tar.gz#/docgen-0.3.2/dlist/dlist.c

This is dlist.c 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.c,v $
 * Revision 1.4  94/12/19  21:17:12  berezaw
 * finished quick sort function
 * 
 * Revision 1.3  94/12/19  13:15:51  berezaw
 * made daddel functions macros for a more general function
 * 
 * Revision 1.2  94/12/18  01:29:33  berezaw
 * fixed a sizeof in a malloc call
 * 
 * Revision 1.1  94/12/17  21:54:05  berezaw
 * Initial revision
 * 
 *
 *	$Header: /Users/berezaw/src/dlist/RCS/dlist.c,v 1.4 94/12/19 21:17:12 berezaw Exp $
 */

#include "dlist.h"

DLIST *_initdlist(size_t els,int lnk)
{
	DLIST *newstr;
	
	newstr=(DLIST *)malloc(sizeof(DLIST));
	if(newstr != NULL) {
		newstr->_first=NULL;
		newstr->_last=NULL;
		newstr->_bytes=0;
		newstr->_elems=0;
		newstr->_elsize=els;
		newstr->_flags.is_linked=lnk ? 1 : 0;
	}
	return newstr;
}

void freeels(DLIST *oldstr)
{
	void *tchar, *pchar;

	if(oldstr==NULL)
	  return;
	
	pchar=oldstr->_first;
	if(oldstr->_flags.is_linked)
	  while(pchar) {
		  tchar=pchar;
		  free(((_DEL *)pchar)->_element);
		  pchar=((_DEL *)pchar)->_next;
		  free(tchar);
	  }
	else
	  while(pchar) {
		  tchar=pchar;
		  pchar=((_DEL *)pchar)->_next;
		  free(tchar);
	  }
	oldstr->_first=oldstr->_last=NULL;
	oldstr->_bytes=oldstr->_elems=oldstr->_elsize=0;
}

void freedlist(DLIST *oldstr)
{
	if(oldstr==NULL)
	  return;
	
	freeels(oldstr);		
	free(oldstr);
}

void *__daddel(DLIST *dstr, void *addel, size_t els)
{
	_DEL *newchar;
	_DELV *newvel;
	int lnk=dstr->_flags.is_linked;

	if(!dstr || (!delsize(dstr) && !els) )
	  return NULL;

	if(els) {
		if(!(newvel=(struct _delv *)malloc(sizeof(struct _delv))))
		  return NULL;;
		newvel->_elvsize=els;
		if(!lnk)
		  newvel->_element=malloc(els);
		else
		  newvel->_element=addel;
		newchar=(_DEL *)newvel;
	}
	else {
		if(!(newchar=(struct _del *)malloc(sizeof(struct _del))))
		  return NULL;
		if(!lnk)
		  newchar->_element=malloc(delsize(dstr));
		else
		  newchar->_element=addel;
	}
	
	if(!(newchar->_element))
	  return NULL;
	
	if(!lnk)
		(void)memcpy(newchar->_element, addel, delsize(dstr) ? delsize(dstr) : els);
	
	newchar->_next=NULL;
	if(dstr->_last==NULL) {
		dstr->_last=newchar;
		dstr->_first=newchar;
		newchar->_prev=NULL;
	}
	else {
		newchar->_prev=dstr->_last;
		((struct _del *)dstr->_last)->_next=newchar;
		dstr->_last=newchar;	
	}
	dstr->_bytes+=delsize(dstr)?delsize(dstr):els;
	dstr->_elems++;
	
	return addel;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.