From 29d80f211dde476f138f984fd7199bb6b1365034 Mon Sep 17 00:00:00 2001 From: Kevin Jerebica Date: Thu, 12 Sep 2024 19:28:17 +0200 Subject: [PATCH] feat: add loose string generation/lookup all lowercase letters are simply converted to capital --- streecmp.a | Bin 0 -> 77952 bytes streecmp.c | 41 +++++++++++++++++++++++++---------------- streecmp.h | 10 ++++++---- test.c | 4 ++-- 4 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 streecmp.a diff --git a/streecmp.a b/streecmp.a new file mode 100644 index 0000000000000000000000000000000000000000..9eacb5446978a7c342bc0fe50543eb5582c7de39 GIT binary patch literal 77952 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 literal 0 HcmV?d00001 diff --git a/streecmp.c b/streecmp.c index 5d8c5f0..67634e7 100644 --- a/streecmp.c +++ b/streecmp.c @@ -51,31 +51,35 @@ struct nod *mknod(struct nod *nod, int loc) { return nod->pool[loc]; } -int mkstr(struct nod *nod, char *str, int val) { - struct nod *target = nod->pool[*str]; +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); + return mkstr(target, str+1, val, flag); } - struct nod *new = mknod(nod, *str); + struct nod *new = mknod(nod, ch); if (new == NULL) { return -1; } - new->val.cval = *str; + new->val.cval = ch; if (*str != '\0') { - return mkstr(new, str+1, val); + return mkstr(new, str+1, val, flag); } new->val.ival = val; return val; } -int gentree(struct nod *nod, char *strs, char *delim) { +int gentree(struct nod *nod, char *strs, char *delim, int flag) { strs_cnt = 1; char *strs_cpy = strdup(strs); @@ -89,7 +93,7 @@ int gentree(struct nod *nod, char *strs, char *delim) { for (char *tok = strtok(strs_cpy, delim); tok != NULL; tok = strtok(NULL, delim)) { - int ret = mkstr(nod, tok, strs_cnt); + int ret = mkstr(nod, tok, strs_cnt, flag); if (ret < 0) { goto _err_mkstr; } @@ -105,8 +109,12 @@ _err: return -1; } -int streecmp(struct nod *nod, char *str) { - struct nod *target = nod->pool[*str]; +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; } @@ -115,21 +123,22 @@ int streecmp(struct nod *nod, char *str) { return target->val.ival; } - return streecmp(target, str+1); + return streecmp(target, str+1, flag); } -int streencmp(struct nod *nod, char *str, int len) { +int streencmp(struct nod *nod, char *str, int len, int flag) { struct nod *nptr = nod; - char *sptr = str; + for (char *sptr = str; sptr < str+len; sptr++) { + char ch = (flag & LOOSE_CHECK) && + (*sptr >= 'a') && + (*sptr <= 'z') ? *sptr-32 : *sptr; - for (int i = 0; i < len; i++) { - struct nod *target = nptr->pool[*sptr]; + struct nod *target = nptr->pool[ch]; if (target == NULL) { goto _not_found; } nptr = target; - sptr++; } nptr = nptr->pool['\0']; diff --git a/streecmp.h b/streecmp.h index 6d35e0d..67d00e6 100644 --- a/streecmp.h +++ b/streecmp.h @@ -4,6 +4,8 @@ #define POOL_SIZE 256 #define DEF_DELIM "\n" +#define LOOSE_CHECK 0b00000001 + struct nodval { int ival; char cval; @@ -18,9 +20,9 @@ struct nod { void frenod(struct nod *nod); struct nod *allocnod(void); struct nod *mknod(struct nod *nod, int loc); -int mkstr(struct nod *nod, char *str, int val); -int gentree(struct nod *nod, char *strs, char *delim); -int streecmp(struct nod *nod, char *str); -int streencmp(struct nod *nod, char *str, int len); +int mkstr(struct nod *nod, char *str, int val, int flag); +int gentree(struct nod *nod, char *strs, char *delim, int flag); +int streecmp(struct nod *nod, char *str, int flag); +int streencmp(struct nod *nod, char *str, int len, int flag); #endif diff --git a/test.c b/test.c index 7a5fcfb..87ea936 100644 --- a/test.c +++ b/test.c @@ -127,7 +127,7 @@ int main(void) { return -1; } - ret = gentree(rot, strs, NULL); + ret = gentree(rot, strs, NULL, LOOSE_CHECK); if (ret < 0) { fprintf(stderr, "[-] Failed: could not generate tree\n"); return -1; @@ -138,7 +138,7 @@ int main(void) { int cnt = 1; for (char *tok = strtok(strs_cpy, "\n"); tok != NULL; tok = strtok(NULL, "\n")) { - int found = streecmp(rot, tok); + int found = streecmp(rot, tok, LOOSE_CHECK); if (found == cnt) { fprintf(stdout, "[+][%d/%d] Success: could find" " '%s' in tree\n", cnt, found, tok);