commit 86e131db0c4195131aa27328a0575392a3cadf56 Author: Kevin Jerebica Date: Sun Aug 25 14:04:27 2024 +0200 feat: implement funky tree lookup diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..370350b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +compile_commands.json +*.o +streecmp +test diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0d0824f --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +CC=gcc +CFLAGS=-g3 +LIBFLAGS=-c +CFILES=streecmp.c +TFILES=test.c +OUTPUT=streecmp +TOUTPUT=test + +all: + $(CC) $(LIBFLAGS) $(CFLAGS) $(CFILES) -o $(OUTPUT) + make test + +test: + $(CC) $(CFLAGS) $(CFILES) $(TFILES) -o $(TOUTPUT) + +run: + ./$(OUTPUT) + +run_test: + ./$(TOUTPUT) + +clean: + rm -rf $(OUTPUT) $(TOUTPUT) diff --git a/data.c b/data.c new file mode 100644 index 0000000..e69de29 diff --git a/streecmp.c b/streecmp.c new file mode 100644 index 0000000..2f9032b --- /dev/null +++ b/streecmp.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include "streecmp.h" + +int strs_cnt = 0; + +struct nod *mknod(struct nod *prnt) { + if (prnt == NULL) { + return NULL; + } + + prnt->pool_size++; + + prnt->pool = (struct nod *) realloc(prnt->pool, sizeof(struct nod)*prnt->pool_size); + if (prnt->pool == NULL) { + return NULL; + } + + struct nod *child = &prnt->pool[prnt->pool_size-1]; + child->pool_size = 0; + child->pool = NULL; + child->val.cval = 0; + child->val.ival = 0; + + return child; +} + +int mkstr(struct nod *rot, char *str) { + for (int i = 0; i < rot->pool_size; i++) { + struct nod *child = &rot->pool[i]; + if (child->val.cval != *str) { + continue; + } + + return mkstr(child, str+1); + } + + struct nod *new = mknod(rot); + 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 *rot, char *strs) { + char *strs_cpy = strdup(strs); + if (strs_cpy == NULL) { + return -1; + } + + for (char *tok = strtok(strs_cpy, "\n"); tok != NULL; tok = strtok(NULL, "\n")) { + int ret = mkstr(rot,tok); + if (ret < 0) { + return -1; + } + } + + return 0; +} + +int streecmp(struct nod *rot, char *str) { + for (int i = 0; i < rot->pool_size; i++) { + struct nod *child = &rot->pool[i]; + if (child->val.cval != *str) { + continue; + } + + if (child->val.cval == '\0') { + return child->val.ival; + } + + return streecmp(child, str+1); + } + + return 0; +} diff --git a/streecmp.h b/streecmp.h new file mode 100644 index 0000000..a1971ff --- /dev/null +++ b/streecmp.h @@ -0,0 +1,20 @@ +#ifndef STREECMP_H +#define STREECMP_H + +struct nodval { + int ival; + char cval; +}; + +struct nod { + struct nodval val; + int pool_size; + struct nod *pool; +}; + +struct nod *mknod(struct nod *prnt); +int mkstr(struct nod *rot, char *str); +int gentree(struct nod *rot, char *strs); +int streecmp(struct nod *rot, char *str); + +#endif diff --git a/test.c b/test.c new file mode 100644 index 0000000..f71b107 --- /dev/null +++ b/test.c @@ -0,0 +1,151 @@ +#include +#include +#include +#include "streecmp.h" + +char *strs = "A-IM\n" + "Accept\n" + "Accept-Charset\n" + "Accept-Datetime\n" + "Accept-Encoding\n" + "Accept-Language\n" + "Access-Control-Request-Method\n" + "Access-Control-Request-Headers\n" + "Authorization\n" + "Cache-Control\n" + "Connection\n" + "Content-Encoding\n" + "Content-Length\n" + "Content-MD5\n" + "Content-Type\n" + "Cookie\n" + "Date\n" + "Expect\n" + "Forwarded\n" + "From\n" + "Host\n" + "HTTP2-Settings\n" + "If-Match\n" + "If-Modified-Since\n" + "If-None-Match\n" + "If-Range\n" + "If-Unmodified-Since\n" + "Max-Forwards\n" + "Origin\n" + "Pragma\n" + "Prefer\n" + "Proxy-Authorization\n" + "Range\n" + "Referer\n" + "TE\n" + "Trailer\n" + "Transfer-Encoding\n" + "User-Agent\n" + "Upgrade\n" + "Via\n" + "Warning\n" + "Upgrade-Insecure-Requests\n" + "X-Requested-With\n" + "DNT\n" + "X-Forwarded-For\n" + "X-Forwarded-Host\n" + "X-Forwarded-Proto\n" + "Front-End-Https\n" + "X-Http-Method-Override\n" + "X-ATT-DeviceID\n" + "X-Wap-Profile\n" + "Proxy-Connection\n" + "X-UIDH\n" + "X-Csrf-Token\n" + "X-Request-ID\n" + "X-Correlation-ID\n" + "Correlation-ID\n" + "Save-Data\n" + "Sec-GPC\n" + "Accept-CH\n" + "Access-Control-Allow-Origin\n" + "Access-Control-Allow-Credentials\n" + "Access-Control-Expose-Headers\n" + "Access-Control-Max-Age\n" + "Access-Control-Allow-Methods\n" + "Access-Control-Allow-Headers\n" + "Accept-Patch\n" + "Accept-Ranges\n" + "Age\n" + "Allow\n" + "Alt-Svc\n" + "Content-Disposition\n" + "Content-Language\n" + "Content-Location\n" + "Content-Range\n" + "Delta-Base\n" + "ETag\n" + "Expires\n" + "IM\n" + "Last-Modified\n" + "Link\n" + "Location\n" + "P3P\n" + "Preference-Applied\n" + "Proxy-Authenticate\n" + "Public-Key-Pins\n" + "Retry-After\n" + "Server\n" + "Set-Cookie\n" + "Strict-Transport-Security\n" + "Tk\n" + "Vary\n" + "WWW-Authenticate\n" + "X-Frame-Options\n" + "Content-Security-Policy\n" + "Expect-CT\n" + "NEL\n" + "Permissions-Policy\n" + "Refresh\n" + "Report-To\n" + "Status\n" + "Timing-Allow-Origin\n" + "X-Content-Duration\n" + "X-Content-Type-Options\n" + "X-Powered-By\n" + "X-Redirect-By\n" + "X-UA-Compatible\n" + "X-XSS-Protection"; + +int main(void) { + int ret; + struct nod *rot = (struct nod *) calloc(1, sizeof(struct nod)); + if (rot == NULL) { + fprintf(stderr, "[-] Failed: not enough dynamic memory\n"); + return -1; + } + + ret = gentree(rot, strs); + if (ret < 0) { + fprintf(stderr, "[-] Failed: could not generate tree\n"); + return -1; + } + + char *strs_cpy = strdup(strs); + if (strs_cpy == NULL) { + fprintf(stderr, "[-] Failed: not enough dynamic memory\n"); + return -1; + } + + fprintf(stdout, "------------------------\n"); + + int cnt = 1; + for (char *tok = strtok(strs_cpy, "\n"); tok != NULL; tok = strtok(NULL, "\n"), cnt++) { + int found = streecmp(rot, tok); + if (found == cnt) { + fprintf(stdout, "[+][%d\t] Success: could find '%s' in tree\n", cnt, tok); + } else { + fprintf(stderr, "[-][%d\t] Error: could not find '%s' in tree\n", cnt, tok); + } + } + + fprintf(stdout, "------------------------\n"); + fprintf(stdout, "[*] Done\n"); + + return 0; +}