From: = <=> Date: Thu, 5 May 2022 13:23:47 +0000 (+0200) Subject: Quality of life changes X-Git-Url: https://git.xolatile.top/?a=commitdiff_plain;h=6afe3cc8ec6c009a43950bdbe138cbc2d7a88a4d;p=soikk-DB.git Quality of life changes --- diff --git a/TODO b/TODO new file mode 100644 index 0000000..87d9437 --- /dev/null +++ b/TODO @@ -0,0 +1 @@ +Try to improve 'sameStr' by maybe not having to check s2[i2] diff --git a/db.h b/db.h index 116637f..a7db8f3 100644 --- a/db.h +++ b/db.h @@ -14,7 +14,7 @@ #include "repl.h" #include "parser.h" #include "storage.h" +#include "strings.h" - -#endif \ No newline at end of file +#endif diff --git a/parser.c b/parser.c index 1c127cd..a680d2a 100644 --- a/parser.c +++ b/parser.c @@ -1,19 +1,6 @@ #include "db.h" -uint16_t len(const char *s){ - uint16_t l = -1; - while(s[++l]); - return l; -} - -bool sameStr(const char* s1, const char *s2){ - uint16_t i1 = 0, i2 = 0; - while(s1[i1] && s2[i2] && s1[i1] == s2[i2]) - ++i1, ++i2; - return !s1[i1] && !s2[i2]; -} - int handleMetaCommand(inputBuffer *in){ if(sameStr(in->buffer, ".exit")){ freeInputBuffer(in); @@ -30,4 +17,4 @@ int handleInput(inputBuffer *in){ }else{ printf("normal command\n"); } -} \ No newline at end of file +} diff --git a/parser.h b/parser.h index 7f1854b..2614615 100644 --- a/parser.h +++ b/parser.h @@ -10,12 +10,8 @@ typedef enum { } metaCommandStatus; -uint16_t len(const char *s); - -bool sameStr(const char* s1, const char *s2); - int handleMetaCommand(inputBuffer *in); int handleInput(inputBuffer *in); -#endif \ No newline at end of file +#endif diff --git a/storage.c b/storage.c index 5e7809b..2a5420b 100644 --- a/storage.c +++ b/storage.c @@ -6,6 +6,7 @@ row *newRow(const char path[MAXPATH]){ memcpy(nr->path, path, MAXPATH); memcpy(nr->tags, "\0", MAXTAGS); nr->numTags = 0; + nr->lenTags = 0; return nr; } @@ -113,6 +114,7 @@ void insertTag(row *r, char *tag){ } r->tags[tagnum] = '\0'; r->numTags = l; + r->lenTags = tagnum; } // Remove a tag from the tags array in the row r @@ -153,4 +155,5 @@ void removeTag(row *r, char *tag){ } r->tags[tagnum] = '\0'; r->numTags = l; -} \ No newline at end of file + r->lenTags = tagnum; +} diff --git a/storage.h b/storage.h index b37bdb8..9689a56 100644 --- a/storage.h +++ b/storage.h @@ -10,7 +10,9 @@ typedef struct{ char path[MAXPATH]; char tags[MAXTAGS]; - int numTags; + uint16_t numTags; + uint16_t lentags; + } row; @@ -26,4 +28,4 @@ void insertTag(row *r, char *tag); void removeTag(row *r, char *tag); -#endif \ No newline at end of file +#endif diff --git a/strings.c b/strings.c new file mode 100644 index 0000000..30e00e7 --- /dev/null +++ b/strings.c @@ -0,0 +1,55 @@ +#include "db.h" + + +uint16_t len(const char *s){ + uint16_t l = -1; + while(s[++l]); + return l; +} + +bool sameStr(const char *s1, const char *s2){ + uint16_t i1 = 0, i2 = 0; + while(s1[i1] && s2[i2] && s1[i1] == s2[i2]) + ++i1, ++i2; + return !s1[i1] && !s2[i2]; +} + + +static int *table(char *y, int n, char sep){ + int *tb = calloc(n, sizeof(int)); + if(tb == NULL){ + fprintf(stderr, "Error callocating array (table)"); + exit(EXIT_FAILURE); + } + + int lSep = n-1; + for(int i = n-1; i >= 0; --i){ + if(y[i] == sep){ + tb[i] = 1; + lSep = i; + }else if(y[i] != '\0'){ + tb[i] = lSep-i; + } + } + return tb; +} + + +ssize_t strInTags(const char *tags, int n, const char *ndl, int m, char sep){ + int *tb = table(tags, n, sep); + + for(int i = 0; i < n; ){ + int j = 0; + while(j < m && tags[i+j] == ndl[j]){ + ++j; + } + if(j == m){ + return i; + } + if(tags[i+j] != ndl[j]){ + i += tb[i]; + } + } + return -1; +} + diff --git a/strings.h b/strings.h new file mode 100644 index 0000000..db3c3e1 --- /dev/null +++ b/strings.h @@ -0,0 +1,14 @@ +#ifndef STRINGS_H +#define STRINGS_H + +#include "db.h" + + +uint16_t len(const char *s); + +bool sameStr(const char *s1, const char *s2); + +ssize_t strInTags(const char *tags, int n, const char *ndl, int m, char sep); + + +#endif