You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

81 lines
1.5 KiB

#include "chartree.h"
#include <string.h>
#include <stdlib.h>
static char *DupLower(const char *s)
{
char *sp,*sl = strdup(s);
if (!sl) return false;
for(sp=sl;*sp;sp++) *sp=tolower(*sp);
return sl;
}
static cptr *CharTreeInit(char c)
{
cptr *p;
p=(cptr *)calloc(1,sizeof(cptr));
if (p) p->chr = c;
return p;
}
void CharTreeDestroy(cptr *p)
{
if (p)
{
CharTreeDestroy(p->leaf);
CharTreeDestroy(p->next);
free(p);
}
}
static cptr *CharTreeFindChar(cptr *p,char c)
{
while (p)
{
if (p->chr==c) return p;
p = p->next;
}
return NULL;
}
bool CharTreeAddStr(cptr **pp,const char *s)
{
cptr *p;
if (*pp)
{
if (!(p=CharTreeFindChar(*pp,*s)))
{
// already present. append to list head
if (!(p = CharTreeInit(*s)))
return false;
p->next = *pp;
*pp = p;
}
}
else
if (!(p = *pp = CharTreeInit(*s))) return false;
if (!*s) return true;
return CharTreeAddStr(&p->leaf,s+1);
}
bool CharTreeCheckStr(cptr *p,const char *s)
{
p = CharTreeFindChar(p,*s);
if (!p) return false;
if (!*s) return true;
return CharTreeCheckStr(p->leaf,s+1);
}
bool CharTreeAddStrLower(cptr **pp,const char *s)
{
bool b;
char *sl = DupLower(s);
if (!sl) return false;
b=CharTreeAddStr(pp,sl);
free(sl);
return b;
}
bool CharTreeCheckStrLower(cptr *pp,const char *s)
{
bool b;
char *sl = DupLower(s);
if (!sl) return false;
b=CharTreeCheckStr(pp,sl);
free(sl);
return b;
}