mirror of https://github.com/bol-van/zapret/
7 changed files with 98 additions and 98 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,81 +1,81 @@ |
|||||
#include "chartree.h" |
#include "chartree.h" |
||||
#include <string.h> |
#include <string.h> |
||||
#include <stdlib.h> |
#include <stdlib.h> |
||||
|
|
||||
static char *DupLower(const char *s) |
static char *DupLower(const char *s) |
||||
{ |
{ |
||||
char *sp,*sl = strdup(s); |
char *sp,*sl = strdup(s); |
||||
if (!sl) return false; |
if (!sl) return false; |
||||
for(sp=sl;*sp;sp++) *sp=tolower(*sp); |
for(sp=sl;*sp;sp++) *sp=tolower(*sp); |
||||
return sl; |
return sl; |
||||
} |
} |
||||
|
|
||||
static cptr *CharTreeInit(char c) |
static cptr *CharTreeInit(char c) |
||||
{ |
{ |
||||
cptr *p; |
cptr *p; |
||||
p=(cptr *)calloc(1,sizeof(cptr)); |
p=(cptr *)calloc(1,sizeof(cptr)); |
||||
if (p) p->chr = c; |
if (p) p->chr = c; |
||||
return p; |
return p; |
||||
} |
} |
||||
void CharTreeDestroy(cptr *p) |
void CharTreeDestroy(cptr *p) |
||||
{ |
{ |
||||
if (p) |
if (p) |
||||
{ |
{ |
||||
CharTreeDestroy(p->leaf); |
CharTreeDestroy(p->leaf); |
||||
CharTreeDestroy(p->next); |
CharTreeDestroy(p->next); |
||||
free(p); |
free(p); |
||||
} |
} |
||||
} |
} |
||||
static cptr *CharTreeFindChar(cptr *p,char c) |
static cptr *CharTreeFindChar(cptr *p,char c) |
||||
{ |
{ |
||||
while (p) |
while (p) |
||||
{ |
{ |
||||
if (p->chr==c) return p; |
if (p->chr==c) return p; |
||||
p = p->next; |
p = p->next; |
||||
} |
} |
||||
return NULL; |
return NULL; |
||||
} |
} |
||||
bool CharTreeAddStr(cptr **pp,const char *s) |
bool CharTreeAddStr(cptr **pp,const char *s) |
||||
{ |
{ |
||||
cptr *p; |
cptr *p; |
||||
if (*pp) |
if (*pp) |
||||
{ |
{ |
||||
if (!(p=CharTreeFindChar(*pp,*s))) |
if (!(p=CharTreeFindChar(*pp,*s))) |
||||
{ |
{ |
||||
// already present. append to list head
|
// already present. append to list head
|
||||
if (!(p = CharTreeInit(*s))) |
if (!(p = CharTreeInit(*s))) |
||||
return false; |
return false; |
||||
p->next = *pp; |
p->next = *pp; |
||||
*pp = p; |
*pp = p; |
||||
} |
} |
||||
} |
} |
||||
else |
else |
||||
if (!(p = *pp = CharTreeInit(*s))) return false; |
if (!(p = *pp = CharTreeInit(*s))) return false; |
||||
if (!*s) return true; |
if (!*s) return true; |
||||
return CharTreeAddStr(&p->leaf,s+1); |
return CharTreeAddStr(&p->leaf,s+1); |
||||
} |
} |
||||
bool CharTreeCheckStr(cptr *p,const char *s) |
bool CharTreeCheckStr(cptr *p,const char *s) |
||||
{ |
{ |
||||
p = CharTreeFindChar(p,*s); |
p = CharTreeFindChar(p,*s); |
||||
if (!p) return false; |
if (!p) return false; |
||||
if (!*s) return true; |
if (!*s) return true; |
||||
return CharTreeCheckStr(p->leaf,s+1); |
return CharTreeCheckStr(p->leaf,s+1); |
||||
} |
} |
||||
bool CharTreeAddStrLower(cptr **pp,const char *s) |
bool CharTreeAddStrLower(cptr **pp,const char *s) |
||||
{ |
{ |
||||
bool b; |
bool b; |
||||
char *sl = DupLower(s); |
char *sl = DupLower(s); |
||||
if (!sl) return false; |
if (!sl) return false; |
||||
b=CharTreeAddStr(pp,sl); |
b=CharTreeAddStr(pp,sl); |
||||
free(sl); |
free(sl); |
||||
return b; |
return b; |
||||
} |
} |
||||
bool CharTreeCheckStrLower(cptr *pp,const char *s) |
bool CharTreeCheckStrLower(cptr *pp,const char *s) |
||||
{ |
{ |
||||
bool b; |
bool b; |
||||
char *sl = DupLower(s); |
char *sl = DupLower(s); |
||||
if (!sl) return false; |
if (!sl) return false; |
||||
b=CharTreeCheckStr(pp,sl); |
b=CharTreeCheckStr(pp,sl); |
||||
free(sl); |
free(sl); |
||||
return b; |
return b; |
||||
} |
} |
||||
|
@ -1,16 +1,16 @@ |
|||||
#pragma once |
#pragma once |
||||
|
|
||||
#include <stdbool.h> |
#include <stdbool.h> |
||||
#include <ctype.h> |
#include <ctype.h> |
||||
|
|
||||
typedef struct cptr |
typedef struct cptr |
||||
{ |
{ |
||||
char chr; |
char chr; |
||||
struct cptr *leaf,*next; |
struct cptr *leaf,*next; |
||||
} cptr; |
} cptr; |
||||
|
|
||||
void CharTreeDestroy(cptr *p); |
void CharTreeDestroy(cptr *p); |
||||
bool CharTreeAddStr(cptr **pp,const char *s); |
bool CharTreeAddStr(cptr **pp,const char *s); |
||||
bool CharTreeAddStrLower(cptr **pp,const char *s); |
bool CharTreeAddStrLower(cptr **pp,const char *s); |
||||
bool CharTreeCheckStr(cptr *p,const char *s); |
bool CharTreeCheckStr(cptr *p,const char *s); |
||||
bool CharTreeCheckStrLower(cptr *pp,const char *s); |
bool CharTreeCheckStrLower(cptr *pp,const char *s); |
||||
|
Loading…
Reference in new issue