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

This is dstring.c in view mode; [Download] [Up]

/* dstring v1.0.0	Dynamic string 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:	dstring.c,v $
 * Revision 1.15  94/12/12  01:29:55  berezaw
 * caught some more (char)s to change to (DCHAR)
 * 
 * Revision 1.14  94/12/08  10:41:31  berezaw
 * daddchar() now returns DCHAR with 0 on error
 * 
 * Revision 1.13  94/12/03  00:09:31  berezaw
 * changed all uses of (char) to (DCHAR)
 * 
 * Revision 1.12  94/12/02  11:50:20  berezaw
 * using DCHAR definition
 * 
 * Revision 1.11  94/12/01  10:52:11  berezaw
 * added getdnewchars() function to buffer mallocs
 * of struct _dchar, then #ifdef'd it out,
 * because it doesn't seem to be any faster
 * 
 * Revision 1.10  94/11/30  15:43:25  berezaw
 * added buffering to allocation of new _dchars
 * 
 * Revision 1.9  94/11/28  12:04:03  berezaw
 * *** empty log message ***
 * 
 *
 *	@(#)dstring.c	1.8 (Bill Bereza) 11/15/94
 *	$Header: /Users/berezaw/src/dynstr/RCS/dstring.c,v 1.15 94/12/12 01:29:55 berezaw Exp $
 */

#include "dstring.h"
#define DOLDMALL

DSTRING *initdstr(void)
{
	DSTRING *newstr;
	
	newstr=(DSTRING *)malloc(sizeof(DSTRING));
	if(newstr != NULL) {
		newstr->_first=NULL;
		newstr->_last=NULL;
		newstr->_length=0;
	}
	return newstr;
}

void freedchars(DSTRING *oldstr)
{
	struct _dchar *tchar, *pchar;

	if(oldstr==NULL)
	  return;
	
	pchar=oldstr->_first;
	while(pchar!=NULL) {
		tchar=pchar;
		pchar=pchar->_next;
		free(tchar);
	}
	oldstr->_first=oldstr->_last=NULL;
	oldstr->_length=0;
}

void freedstr(DSTRING *oldstr)
{
	if(oldstr==NULL)
	  return;
	
	freedchars(oldstr);		
	free(oldstr);
}

#ifndef DOLDMALL
#define DBUFLEN	((size_t)10)

struct _dchar *getdnewchar(void)
{
	static struct _dchar *dnewchar[DBUFLEN];
	static size_t currbuff=0;
	register size_t loop;

	if(!currbuff) {
		for(loop=0;loop<DBUFLEN;loop++)
		  dnewchar[loop]=(struct _dchar *)malloc(sizeof(struct _dchar));
		currbuff=DBUFLEN;
	}
	return dnewchar[--currbuff];
}

#undef DBUFLEN
#endif

DCHAR daddchar(DSTRING *dstr, DCHAR addchar)
{
	struct _dchar *newchar;

	if(dstr==NULL)
	  return 0;

#ifdef DOLDMALL
	newchar=(struct _dchar *)malloc(sizeof(struct _dchar));
#else
	newchar=getdnewchar();
#endif
	if(newchar == NULL) {
		return 0;
	}
	else {
		newchar->_character=addchar;
		newchar->_next=NULL;
		if(dstr->_last==NULL) {
			dstr->_last=newchar;
			dstr->_first=newchar;
		}
		else {
			dstr->_last->_next=newchar;
			dstr->_last=newchar;	
		}
		(dstr->_length)++;
		return addchar;
	}
}

DCHAR *arrdstr(DSTRING *ostr)
{
	struct _dchar *index;
	register size_t i=0;
	DCHAR *charray;

	if(ostr==NULL)
	  return NULL;
	
	if((charray=(DCHAR *)(calloc(((dstrlen(ostr))+1), sizeof(DCHAR)))) != NULL) {
		index=ostr->_first;
		while(index != NULL) {
			charray[i++]=index->_character;
			index=index->_next;
		}
		charray[i]='\0';
	}
	return charray;
}

DSTRING *dstrarr(DCHAR *charray)
{
	DSTRING *nstr;

	if(charray==NULL)
	  return NULL;
	
	if((nstr=initdstr())!=NULL)
	  for(;*charray;daddchar(nstr, *charray++));
	return nstr;
}

DSTRING *dstrarrcat(DSTRING *ostr,DCHAR *charray)
{
	if(charray==NULL)
	  return NULL;
	
	if(ostr!=NULL)
	  for(;*charray;daddchar(ostr, *charray++));
	return ostr;
}

DSTRING *dstrcat(DSTRING *ostr, DSTRING *addstr)
{
	struct _dchar *pchar;
	
	if((ostr!=NULL) && (addstr!=NULL)) {
		pchar=addstr->_first;
		while(pchar != NULL) {
			daddchar(ostr, pchar->_character);
			pchar=pchar->_next;
		}
	}
	return ostr;
}

DSTRING *dstrcpy(DSTRING *addstr)
{
	struct _dchar *pchar;
	DSTRING *ostr=NULL;

	if(addstr==NULL)
	  return NULL;
	
	ostr=initdstr();
	if(ostr!=NULL) {
		pchar=addstr->_first;
		while(pchar != NULL) {
			daddchar(ostr, pchar->_character);
			pchar=pchar->_next;
		}
	}
	return ostr;
}

DCHAR *arrdstrfromhead(DSTRING *ostr, size_t n)
{
	DCHAR *charray;
	struct _dchar *index;
	register size_t loop;

	if(ostr==NULL)
	  return NULL;
	
	if(n>=dstrlen(ostr))
	  return arrdstr(ostr);
	else {
		index=ostr->_first;
		if((charray=(DCHAR *)(calloc((n+1), sizeof(DCHAR)))) != NULL) {
			for(loop=0;loop<n;loop++) {
				charray[loop]=index->_character;
				index=index->_next;
			}
			charray[loop]='\0';
		}
		return charray;
	}
}

DSTRING *dstrfromhead(DSTRING *ostr, size_t n)
{
	DSTRING *nstr;
	struct _dchar *index;
	register size_t loop;

	if(ostr==NULL)
	  return NULL;
	
	if(n>=dstrlen(ostr))
	  return dstrcpy(ostr);
	else {
		if((nstr=initdstr()) != NULL) {
			index=ostr->_first;
			for(loop=n;loop;loop--) {
				daddchar(nstr, index->_character);
				index=index->_next;
			}
		}
		return nstr;
	}
}

DCHAR *arrdstrfromtail(DSTRING *ostr, size_t n)
{
	DCHAR *charray;
	struct _dchar *index;
	register size_t loop;
	
	if(ostr==NULL)
	  return NULL;
	
	if(n>=dstrlen(ostr))
	  return arrdstr(ostr);
	else {
		index=ostr->_first;
		for(loop=1;loop<=(dstrlen(ostr)-n);loop++)
		  index=index->_next;
		loop=0;
		if((charray=(DCHAR *)(calloc((n+1), sizeof(DCHAR)))) != NULL) {
			while(index != NULL) {
				charray[loop++]=index->_character;
				index=index->_next;
			}
			charray[loop]='\0';
		}
		return charray;
	}
}

DSTRING *dstrfromtail(DSTRING *ostr, size_t n)
{
	DSTRING *nstr;
	struct _dchar *index;
	register size_t loop;
	
	if(ostr==NULL)
	  return NULL;
	
	if(n>=dstrlen(ostr))
	  return dstrcpy(ostr);
	else {
		index=ostr->_first;
		for(loop=1;loop<=(dstrlen(ostr)-n);loop++)
		  index=index->_next;
		if((nstr=initdstr()) != NULL)
		  for(loop=n;loop;loop--) {
			  daddchar(nstr, index->_character);
			  index=index->_next;
		  }
		return nstr;
	}
}

DCHAR *arrdstrrmfromhead(DSTRING *ostr, size_t n)
{
	DCHAR *charray;
	struct _dchar *index;
	register size_t loop;

	if(ostr==NULL)
	  return NULL;
	
	if(n>=dstrlen(ostr)) {
		charray=arrdstr(ostr);
		freedchars(ostr);
		return charray;
	}
	else {
		index=ostr->_first;
		if((charray=(DCHAR *)(calloc((n+1), sizeof(DCHAR)))) != NULL) {
			for(loop=0;loop<n;loop++) {
				charray[loop]=ostr->_first->_character;
				index=ostr->_first;
				ostr->_first=ostr->_first->_next;
				free(index);
				ostr->_length--;
			}
			charray[loop]='\0';
		}
		return charray;
	}
}

DCHAR *arrdstrrmfromtail(DSTRING *ostr, size_t n)
{
	DCHAR *charray;
	struct _dchar *index, *pchar, *tchar;
	register size_t loop;

	if(ostr==NULL)
	  return NULL;
	
	if(n>=dstrlen(ostr)) {
		charray=arrdstr(ostr);
		freedchars(ostr);
		return charray;
	}
	else {
		index=ostr->_first;
		pchar=index;
		for(loop=1;loop<=(dstrlen(ostr)-n);loop++) {
			pchar=index;
			index=index->_next;
		}
		ostr->_last=pchar;
		loop=0;
		if((charray=(DCHAR *)(calloc((n+1), sizeof(DCHAR)))) != NULL) {
			while(index != NULL) {
				charray[loop++]=index->_character;
				tchar=index;
				index=index->_next;
				pchar->_next=index;
				free(tchar); ostr->_length--;
			}
			charray[loop]='\0';
		}
		return charray;
	}
}

DSTRING *dstrrmfromhead(DSTRING *ostr, size_t n)
{
	DSTRING *nstr;
	struct _dchar *index;
	register size_t loop;

	if(ostr==NULL)
	  return NULL;
	
	if(n>=dstrlen(ostr)) {
		if((nstr=initdstr()) != NULL) {
			nstr->_first=ostr->_first;
			nstr->_last=ostr->_last;
			nstr->_length=ostr->_length;
			ostr->_first=NULL;
			ostr->_last=NULL;
			ostr->_length=0;
		}
		return nstr;
	}
	else {
		if((nstr=initdstr()) != NULL) {
			index=ostr->_first;
			nstr->_length=n;
			nstr->_first=index;
			for(loop=0;loop<(n-1);loop++)
			  index=index->_next;
			nstr->_last=index;
			index=index->_next;
			nstr->_last->_next=NULL;
			ostr->_first=index;
			ostr->_length-=n;
		}
		return nstr;
	}
}

DSTRING *dstrrmfromtail(DSTRING *ostr, size_t n)
{
	DSTRING *nstr;
	struct _dchar *index, *pchar;
	register size_t loop;
	
	if(ostr==NULL)
	  return NULL;
	
	if(n>=dstrlen(ostr)) {
		if((nstr=initdstr()) != NULL) {
			nstr->_first=ostr->_first;
			nstr->_last=ostr->_last;
			nstr->_length=ostr->_length;
			ostr->_first=NULL;
			ostr->_last=NULL;
			ostr->_length=0;
		}
		return nstr;
	}
	else {
		index=ostr->_first;
		pchar=index;
		for(loop=1;loop<=(dstrlen(ostr)-n);loop++) {
			pchar=index;
			index=index->_next;
		}
		if((nstr=initdstr()) != NULL) {
			nstr->_first=index;
			nstr->_last=ostr->_last;
			nstr->_length=n;
			ostr->_last=pchar;
			ostr->_last->_next=NULL;
			ostr->_length-=n;
		}
		return nstr;
	}
}

size_t dstrlen(DSTRING *oldstring)
{
	if(oldstring==NULL)
	  return 0;
	else
	  return oldstring->_length;
}

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