2024-08-25 12:04:27 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2024-08-25 20:24:08 +00:00
|
|
|
#include <math.h>
|
2024-08-25 12:04:27 +00:00
|
|
|
#include "streecmp.h"
|
|
|
|
|
|
|
|
int strs_cnt = 0;
|
|
|
|
|
2024-08-27 16:45: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);
|
|
|
|
}
|
|
|
|
|
2024-08-25 20:24:08 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2024-08-27 16:45:27 +00:00
|
|
|
nod->pool = (struct nod **) calloc(POOL_SIZE, sizeof(struct nod *));
|
2024-08-25 20:24:08 +00:00
|
|
|
if (nod->pool == NULL) {
|
|
|
|
free(nod);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return nod;
|
|
|
|
}
|
2024-08-25 12:04:27 +00:00
|
|
|
|
2024-08-25 20:24:08 +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;
|
|
|
|
}
|
|
|
|
|
2024-08-25 20:24:08 +00:00
|
|
|
nod->pool_size++;
|
|
|
|
nod->pool[loc] = allocnod();
|
2024-08-25 12:04:27 +00:00
|
|
|
|
2024-08-25 20:24:08 +00:00
|
|
|
return nod->pool[loc];
|
2024-08-25 12:04:27 +00:00
|
|
|
}
|
|
|
|
|
2024-08-25 20:24:08 +00:00
|
|
|
int mkstr(struct nod *nod, char *str) {
|
|
|
|
struct nod *target = nod->pool[*str];
|
|
|
|
if (target != NULL) {
|
2024-08-25 21:01:28 +00:00
|
|
|
if (*str == '\0') {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2024-08-25 20:24:08 +00:00
|
|
|
return mkstr(target, str+1);
|
2024-08-25 12:04:27 +00:00
|
|
|
}
|
|
|
|
|
2024-08-25 20:24:08 +00:00
|
|
|
struct nod *new = mknod(nod, *str);
|
2024-08-25 12:04:27 +00:00
|
|
|
if (new == NULL) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
new->val.cval = *str;
|
|
|
|
if (*str != '\0') {
|
|
|
|
return mkstr(new, str+1);
|
|
|
|
}
|
|
|
|
|
|
|
|
strs_cnt++;
|
|
|
|
new->val.ival = strs_cnt;
|
|
|
|
return strs_cnt;
|
|
|
|
}
|
|
|
|
|
2024-08-27 16:59:30 +00:00
|
|
|
int gentree(struct nod *nod, char *strs, char *delim) {
|
2024-08-25 12:04:27 +00:00
|
|
|
char *strs_cpy = strdup(strs);
|
|
|
|
if (strs_cpy == NULL) {
|
2024-08-27 16:45:27 +00:00
|
|
|
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)) {
|
2024-08-25 20:24:08 +00:00
|
|
|
int ret = mkstr(nod, tok);
|
2024-08-25 12:04:27 +00:00
|
|
|
if (ret < 0) {
|
2024-08-27 16:45:27 +00:00
|
|
|
goto _err_mkstr;
|
2024-08-25 12:04:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-27 16:45:27 +00:00
|
|
|
free(strs_cpy);
|
2024-08-25 12:04:27 +00:00
|
|
|
return 0;
|
2024-08-27 16:45:27 +00:00
|
|
|
|
|
|
|
_err_mkstr:
|
|
|
|
free(strs_cpy);
|
|
|
|
_err:
|
|
|
|
return -1;
|
2024-08-25 12:04:27 +00:00
|
|
|
}
|
|
|
|
|
2024-08-25 20:24:08 +00:00
|
|
|
int streecmp(struct nod *nod, char *str) {
|
|
|
|
struct nod *target = nod->pool[*str];
|
|
|
|
if (target == NULL) {
|
|
|
|
return 0;
|
|
|
|
}
|
2024-08-25 12:04:27 +00:00
|
|
|
|
2024-08-25 20:24:08 +00:00
|
|
|
if (target->val.cval == '\0') {
|
|
|
|
return target->val.ival;
|
2024-08-25 12:04:27 +00:00
|
|
|
}
|
|
|
|
|
2024-08-25 20:24:08 +00:00
|
|
|
return streecmp(target, str+1);
|
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) {
|
|
|
|
struct nod *nptr = nod;
|
|
|
|
char *sptr = str;
|
|
|
|
|
|
|
|
for (int i = 0; i < len; i++) {
|
|
|
|
struct nod *target = nptr->pool[*sptr];
|
|
|
|
if (target == NULL) {
|
|
|
|
goto _not_found;
|
|
|
|
}
|
|
|
|
|
|
|
|
nptr = target;
|
|
|
|
sptr++;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct nod *end = nptr->pool['\0'];
|
|
|
|
if (end == NULL) {
|
|
|
|
goto _not_found;
|
|
|
|
}
|
|
|
|
|
|
|
|
return end->val.ival;
|
|
|
|
|
|
|
|
_not_found:
|
|
|
|
return 0;
|
|
|
|
}
|