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

This is dstring2.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:	dstring2.c,v $
 * Revision 1.6  94/12/12  14:44:25  berezaw
 * casting things to (char) where necessarry
 * 
 * Revision 1.5  94/12/08  10:41:56  berezaw
 * dstrcmp functions now return signed long int 
 * to handle almost any size of DCHAR
 * 
 * Revision 1.4  94/12/03  00:09:53  berezaw
 * changed all uses of (char) to (DCHAR)
 * 
 * Revision 1.3  94/12/02  11:50:44  berezaw
 * using DCHAR definition
 * 
 * Revision 1.2  94/11/28  12:04:05  berezaw
 * *** empty log message ***
 * 
 *
 *	@(#)dstring2.c	1.0 (Bill Bereza) 22/15/94
 *	$Header: /Users/berezaw/src/dynstr/RCS/dstring2.c,v 1.6 94/12/12 14:44:25 berezaw Exp $
 */

#include "dstring.h"

signed long int dstrcmp(DSTRING *ds1, DSTRING *ds2) 
{
	struct _dchar *ch1, *ch2;
	
	if((ds1->_first==NULL) || (ds2->_first==NULL))
	  return (ds1->_first==NULL) ? ((ds2->_first==NULL) ? 0 : ds2->_first->_character) : ds1->_first->_character;
	
	ch1=ds1->_first;
	ch2=ds2->_first;
	
	while((ch1->_character) == (ch2->_character)) {
		if(ch2->_next == NULL)
		  break;
		if(ch2->_next == NULL)
		  break;
		
		ch1=ch1->_next;
		ch2=ch2->_next;
	}
	
	return (ch1->_character)-(ch2->_character);
}

signed long int dstrncmp(DSTRING *ds1, DSTRING *ds2, size_t n)
{
	struct _dchar *ch1, *ch2;
	
	if((ds1->_first==NULL) || (ds2->_first==NULL))
	  return (ds1->_first==NULL) ? ((ds2->_first==NULL) ? 0 : ds2->_first->_character) : ds1->_first->_character;
	
	ch1=ds1->_first;
	ch2=ds2->_first;
	
	while(((ch1->_character) == (ch2->_character)) && n) {
		n--;
		if(ch2->_next == NULL)
		  break;
		if(ch2->_next == NULL)
		  break;
		
		ch1=(n) ? ch1->_next : ch1;
		ch2=(n) ? ch2->_next : ch2;
	}
	
	return (ch1->_character)-(ch2->_character);
}

signed long int dstrarrcmp(DSTRING *ds1, DCHAR *ds2)
{
	struct _dchar *ch1;
	
	if((ds1->_first==NULL) || !*ds2)
	  return (ds1->_first==NULL) ? (*ds2 ? *ds2 : 0) : ds1->_first->_character;
	
	ch1=ds1->_first;
	
	while((ch1->_character) == (*ds2)) { 
		if(ch1->_next == NULL)
		  break;
		if(!*ds2)
		  break;
		
		ch1=ch1->_next;
		ds2++;
	}
	
	return (ch1->_character)-(*ds2);
}

signed long int dstrarrncmp(DSTRING *ds1, DCHAR *ds2, size_t n)
{
	struct _dchar *ch1;
	
	if((ds1->_first==NULL) || !*ds2)
	  return (ds1->_first==NULL) ? (*ds2 ? *ds2 : 0) : ds1->_first->_character;
	
	ch1=ds1->_first;
	
	while(((ch1->_character) == (*ds2)) && n) {
		n--;
		if(ch1->_next == NULL)
		  break;
		if(!*ds2)
		  break;
		
		ch1=(n) ? ch1->_next : ch1;
		ds2+=(n) ? 1 : 0;
	}
	
	return (ch1->_character)-(*ds2);
}

DSTRING *dstrchr(DSTRING *dstr, DCHAR ch)
{
	DSTRING *nstr=NULL;

	if(dstr==NULL)
	  return NULL;
	
	if(!dstrlen(dstr))
	  return NULL;
	
	if((nstr=initdstr()) == NULL)
	  return NULL;
	nstr->_last=dstr->_last;
	nstr->_length=dstr->_length;

	if((nstr->_first=dstr->_first) == NULL)
	  return NULL;

	for(;nstr->_first->_character != ch;nstr->_length--)
	  if(nstr->_first->_next == NULL)
		return NULL;
	  else
		nstr->_first=nstr->_first->_next;

	return nstr;
}

DSTRING *dstrrchr(DSTRING *dstr, DCHAR ch)
{
	DSTRING *nstr=NULL;
	struct _dchar *ind;
	size_t len;
	
	if(dstr==NULL)
	  return NULL;
	
	if(!dstrlen(dstr))
	  return NULL;
	
	if((nstr=initdstr()) == NULL)
	  return NULL;
	
	nstr->_last=dstr->_last;
	len=nstr->_length=dstr->_length;
	nstr->_first=NULL;

	for(ind=dstr->_first;ind != NULL;ind=ind->_next) {
		if(ind->_character == ch) {
			nstr->_first=ind;
			nstr->_length=len;
		}
		
		len--;
	}

	if(nstr->_first != NULL)
	  return nstr;
	else
	  return NULL;
}

size_t dstrarrspn(DSTRING *dstr, DCHAR *chlist)
{
	size_t spn=0;
	struct _dchar *ind;

	if((dstr==NULL) || (chlist==NULL))
	  return 0;
	
	for(ind=dstr->_first;ind!=NULL;ind=ind->_next)
	  if(strchr((char *)chlist, (char)ind->_character)!=NULL)
		spn++;
	  else
		return spn;

	return spn;
}

size_t dstrarrcspn(DSTRING *dstr, DCHAR *chlist)
{
	size_t spn=0;
	struct _dchar *ind;

	if((dstr==NULL) || (chlist==NULL))
	  return 0;

	for(ind=dstr->_first;ind!=NULL;ind=ind->_next)
	  if(strchr((char *)chlist, (char)ind->_character)==NULL)
		spn++;
	  else
		return spn;

	return spn;
}

size_t dstrspn(DSTRING *dstr, DSTRING *chlist)
{
	DSTRING *tstr;
	size_t spn=0;
	struct _dchar *ind;

	if((dstr==NULL) || (chlist==NULL))
	  return 0;
	
	for(ind=dstr->_first;ind!=NULL;ind=ind->_next)
	  if((tstr=dstrchr(chlist, ind->_character))!=NULL) {
		  free(tstr);
		  spn++;
	  }
	  else
		return spn;

	return spn;
}

size_t dstrcspn(DSTRING *dstr, DSTRING *chlist)
{
	DSTRING *tstr;
	size_t spn=0;
	struct _dchar *ind;

	if((dstr==NULL) || (chlist==NULL))
	  return 0;

	for(ind=dstr->_first;ind!=NULL;ind=ind->_next)
	  if((tstr=dstrchr(chlist, ind->_character))==NULL)
		spn++;
	  else {
		  free(tstr);
		  return spn;
	  }

	return spn;
}

DSTRING *dstrpbrk(DSTRING *dstr, DSTRING *ch)
{
	DSTRING *tstr=NULL;
	DSTRING *nstr=NULL;

	if((dstr==NULL) || (ch==NULL))
	  return NULL;

	if(!dstrlen(dstr))
	  return NULL;
	
	if((nstr=initdstr()) == NULL)
	  return NULL;
	nstr->_last=dstr->_last;
	nstr->_length=dstr->_length;

	if((nstr->_first=dstr->_first) == NULL)
	  return NULL;

	for(;(tstr=dstrchr(ch, nstr->_first->_character)) == NULL;nstr->_length--)
	  if(nstr->_first->_next == NULL)
		return NULL;
	  else
		nstr->_first=nstr->_first->_next;

	if(tstr!=NULL)
	  free(tstr);
	
	return nstr;
}

DSTRING *dstrarrpbrk(DSTRING *dstr, DCHAR *ch)
{
	DSTRING *nstr=NULL;

	if((dstr==NULL) || (ch==NULL))
	  return NULL;
	
	if(!dstrlen(dstr))
	  return NULL;
	
	if((nstr=initdstr()) == NULL)
	  return NULL;
	nstr->_last=dstr->_last;
	nstr->_length=dstr->_length;

	if((nstr->_first=dstr->_first) == NULL)
	  return NULL;

	for(;strchr((char *)ch, (char)nstr->_first->_character) == NULL;nstr->_length--)
	  if(nstr->_first->_next == NULL)
		return NULL;
	  else
		nstr->_first=nstr->_first->_next;

	return nstr;
}

DSTRING *dstrarrstr(DSTRING *dstr, DCHAR *cs)
{
	DSTRING *nstr=NULL, *tstr;
	struct _dchar *ind;
	size_t loop, len;

	if((dstr==NULL) || (cs==NULL))
	  return NULL;
	
	tstr=initdstr();
	tstr->_first=dstr->_first;
	tstr->_last=dstr->_last;
	tstr->_length=dstr->_length;

	len=strlen(cs);
	
	while(1==1) {				/* This loop will only exit when it finds
								 * or when it fails
								 */

		if((nstr=dstrchr(tstr, *cs)) == NULL)
		  return NULL;

		free(tstr);
		
		ind=nstr->_first;
		
		for(loop=0;len;loop++) {
			if(cs[loop]!=ind->_character)
			  break;

			if(ind->_next==NULL)
			  break;
			else
			  ind=ind->_next;
		}
		if(loop==len)
		  return nstr;
		
		tstr=nstr;
		tstr->_first=nstr->_first->_next;
		tstr->_length--;
	}
}
	

DSTRING *dstrstr(DSTRING *dstr, DSTRING *cs)
{
	DSTRING *nstr=NULL, *tstr;
	struct _dchar *ind, *sech;

	if((dstr==NULL) || (cs==NULL))
	  return NULL;

	tstr=initdstr();
	tstr->_first=dstr->_first;
	tstr->_last=dstr->_last;
	tstr->_length=dstr->_length;

	if((!dstrlen(cs)) || (!dstrlen(dstr)))
	  return NULL;
	
	while(1==1) {				/* This loop will only exit when it finds
								 * or when it fails
								 */

		if((nstr=dstrchr(tstr, cs->_first->_character)) == NULL)
		  return NULL;
		/* printf("dstrchr success:[%c]\n",cs->_first->_character); */
		free(tstr);
		
		ind=nstr->_first;
		
		for(sech=cs->_first;sech!=NULL;sech=sech->_next) {
			if(sech->_character!=ind->_character)
			  break;

			if(ind->_next==NULL)
			  break;
			else
			  ind=ind->_next;
		}
		if(sech==NULL)
		  return nstr;
		
		tstr=nstr;
		tstr->_first=nstr->_first->_next;
		tstr->_length--;
	}
}

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