streecmp/streecmp.c

154 lines
3.1 KiB
C
Raw Permalink Normal View History

2024-08-25 12:04:27 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
2024-08-25 12:04:27 +00:00
#include "streecmp.h"
static int strs_cnt = 1;
2024-08-25 12:04:27 +00:00
void frenod(struct nod *nod) {
for (int i = 0; i < POOL_SIZE; i++) {
struct nod *p = nod->pool[i];
if (p == NULL) {
continue;
}
frenod(p);
}
free(nod->pool);
memset(nod, 0, sizeof(struct nod));
free(nod);
}
struct nod *allocnod(void) {
struct nod *nod = (struct nod *) calloc(1, sizeof(struct nod));
if (nod == NULL) {
2024-08-25 12:04:27 +00:00
return NULL;
}
nod->pool = (struct nod **) calloc(POOL_SIZE, sizeof(struct nod *));
if (nod->pool == NULL) {
free(nod);
return NULL;
}
return nod;
}
2024-08-25 12:04:27 +00:00
struct nod *mknod(struct nod *nod, int loc) {
if (nod == NULL) {
return allocnod();
}
if (nod->pool == NULL) {
2024-08-25 12:04:27 +00:00
return NULL;
}
nod->pool_size++;
nod->pool[loc] = allocnod();
2024-08-25 12:04:27 +00:00
return nod->pool[loc];
2024-08-25 12:04:27 +00:00
}
int mkstr(struct nod *nod, char *str, int val, int flag) {
char ch = (flag & LOOSE_CHECK) &&
(*str >= 'a') &&
(*str <= 'z') ? *str-32 : *str;
struct nod *target = nod->pool[ch];
if (target != NULL) {
if (*str == '\0') {
return 0;
}
return mkstr(target, str+1, val, flag);
2024-08-25 12:04:27 +00:00
}
struct nod *new = mknod(nod, ch);
2024-08-25 12:04:27 +00:00
if (new == NULL) {
return -1;
}
new->val.cval = ch;
2024-08-25 12:04:27 +00:00
if (*str != '\0') {
return mkstr(new, str+1, val, flag);
2024-08-25 12:04:27 +00:00
}
new->val.ival = val;
return val;
2024-08-25 12:04:27 +00:00
}
int gentree(struct nod *nod, char *strs, char *delim, int flag) {
strs_cnt = 1;
2024-08-25 12:04:27 +00:00
char *strs_cpy = strdup(strs);
if (strs_cpy == NULL) {
goto _err;
2024-08-25 12:04:27 +00:00
}
2024-08-27 16:59:30 +00:00
if (delim == NULL) {
delim = DEF_DELIM;
}
for (char *tok = strtok(strs_cpy, delim); tok != NULL; tok
= strtok(NULL, delim)) {
int ret = mkstr(nod, tok, strs_cnt, flag);
2024-08-25 12:04:27 +00:00
if (ret < 0) {
goto _err_mkstr;
2024-08-25 12:04:27 +00:00
}
strs_cnt++;
2024-08-25 12:04:27 +00:00
}
free(strs_cpy);
2024-08-25 12:04:27 +00:00
return 0;
_err_mkstr:
free(strs_cpy);
_err:
return -1;
2024-08-25 12:04:27 +00:00
}
int streecmp(struct nod *nod, char *str, int flag) {
char ch = (flag & LOOSE_CHECK) &&
(*str >= 'a') &&
(*str <= 'z') ? *str-32 : *str;
struct nod *target = nod->pool[ch];
if (target == NULL) {
return 0;
}
2024-08-25 12:04:27 +00:00
if (target->val.cval == '\0') {
return target->val.ival;
2024-08-25 12:04:27 +00:00
}
return streecmp(target, str+1, flag);
2024-08-25 12:04:27 +00:00
}
2024-09-02 19:29:29 +00:00
int streencmp(struct nod *nod, char *str, int len, int flag) {
2024-09-02 19:29:29 +00:00
struct nod *nptr = nod;
for (char *sptr = str; sptr < str+len; sptr++) {
char ch = (flag & LOOSE_CHECK) &&
(*sptr >= 'a') &&
(*sptr <= 'z') ? *sptr-32 : *sptr;
2024-09-02 19:29:29 +00:00
struct nod *target = nptr->pool[ch];
2024-09-02 19:29:29 +00:00
if (target == NULL) {
goto _not_found;
}
nptr = target;
}
nptr = nptr->pool['\0'];
if (nptr == NULL) {
2024-09-02 19:29:29 +00:00
goto _not_found;
}
return nptr->val.ival;
2024-09-02 19:29:29 +00:00
_not_found:
return 0;
}