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.