#include #include #include #include #include "streecmp.h" int strs_cnt = 0; 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) { return NULL; } nod->pool = (struct nod **) calloc(POOL_SIZE, sizeof(struct nod *)); if (nod->pool == NULL) { free(nod); return NULL; } return nod; } struct nod *mknod(struct nod *nod, int loc) { if (nod == NULL) { return allocnod(); } if (nod->pool == NULL) { return NULL; } nod->pool_size++; nod->pool[loc] = allocnod(); return nod->pool[loc]; } int mkstr(struct nod *nod, char *str) { struct nod *target = nod->pool[*str]; if (target != NULL) { if (*str == '\0') { return 0; } return mkstr(target, str+1); } struct nod *new = mknod(nod, *str); 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; } int gentree(struct nod *nod, char *strs, char *delim) { char *strs_cpy = strdup(strs); if (strs_cpy == NULL) { goto _err; } if (delim == NULL) { delim = DEF_DELIM; } for (char *tok = strtok(strs_cpy, delim); tok != NULL; tok = strtok(NULL, delim)) { int ret = mkstr(nod, tok); if (ret < 0) { goto _err_mkstr; } } free(strs_cpy); return 0; _err_mkstr: free(strs_cpy); _err: return -1; } int streecmp(struct nod *nod, char *str) { struct nod *target = nod->pool[*str]; if (target == NULL) { return 0; } if (target->val.cval == '\0') { return target->val.ival; } return streecmp(target, str+1); } int streencmp(struct nod *nod, char *str, int len) { for (int i = 0; i < len; i++) { struct nod *target = nod->pool[*str]; if (target == NULL) { return 0; } if (target->val.cval == '\0') { return target->val.ival; } } return 0; }