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

This is dlststack.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:	dlststack.c,v $
 * Revision 1.3  94/12/19  21:17:33  berezaw
 * finished quick sort function
 * 
 * Revision 1.2  94/12/18  01:30:11  berezaw
 * fixed a sizeof in a malloc call
 * 
 * Revision 1.1  94/12/17  21:54:49  berezaw
 * Initial revision
 * 
 *
 *	$Header: /Users/berezaw/src/dlist/RCS/dlststack.c,v 1.3 94/12/19 21:17:33 berezaw Exp $
 */

#include "dlststack.h"

void *dpushel(DLSTSTACK *dstr, void *addel)
{
	struct _del *newchar;

	if((!dstr) || (!dstackelsize(dstr)))
	  return NULL;
	
	newchar=(struct _del *)malloc(sizeof(struct _del));
	newchar->_element=malloc(dstackelsize(dstr));
	if((!newchar) || (!newchar->_element))
	  return NULL;
	else {
		memcpy(newchar->_element, addel, dstackelsize(dstr));
		newchar->_next=dstr->_first;
		newchar->_prev=NULL;
		if(dstr->_last==NULL)
		  dstr->_last=newchar;
		else
		  ((struct _del *)dstr->_first)->_prev=newchar;
		dstr->_first=newchar;
		dstr->_bytes+=dstackelsize(dstr);
		dstr->_elems++;
		return addel;
	}
}

void *dpushelv(DLSTSTACK *dstr, void *addel, size_t els)
{
	struct _delv *newchar;
	size_t elsize=els ? els : dstackelsize(dstr);

	if((!dstr) || (!elsize))
	  return NULL;
	
	newchar=(struct _delv *)malloc(sizeof(struct _delv));
	newchar->_element=malloc(els);
	newchar->_elvsize=els;
	if((!newchar) || (!newchar->_element))
	  return NULL;
	else {
		memcpy(newchar->_element, addel, els);
		newchar->_next=dstr->_first;
		newchar->_prev=NULL;
		if(dstr->_last==NULL)
		  dstr->_last=newchar;
		else
		  ((struct _delv *)dstr->_first)->_prev=newchar;
		dstr->_first=newchar;
		dstr->_bytes+=els;
		dstr->_elems++;
		return addel;
	}
}

void *dpopel(DLSTSTACK *dstr)
{
	void *pchar;
	void *popel=NULL;

	if(dstr==NULL)
	  return NULL;
	
	if(dstacksize(dstr)) {
		pchar=dstr->_first;
		dstr->_first=((struct _del *)pchar)->_next;
		popel=((struct _del *)pchar)->_element;
		free(pchar);
		dstr->_elems--;
		if(dstackelsize(dstr))
		  dstr->_bytes-=dstackelsize(dstr);
		else
		  dstr->_bytes-=((struct _delv *)pchar)->_elvsize;
	}
	return popel;
}

void *dpopelv(DLSTSTACK *dstr, size_t *bs)
{
	struct _delv *pchar;
	void *popel=NULL;

	if(dstr==NULL)
	  return NULL;

	if(dstacksize(dstr)) {
		pchar=((struct _delv *)dstr->_first);
		*bs=pchar->_elvsize;
		dstr->_first=pchar->_next;
		popel=pchar->_element;
		free(pchar);
		dstr->_elems--;
		if(dstackelsize(dstr))
		  dstr->_bytes-=dstackelsize(dstr);
		else
		  dstr->_bytes-=pchar->_elvsize;
	}
	return popel;
}

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