From 2434a126da7389443a224d617502a6e6a7c22cf3 Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Tue, 19 Apr 2022 20:50:44 +0300 Subject: [PATCH 1/3] some code moved to String directory --- Autoarr/StringBuilder.h | 24 ------------------- DtsodParser/DtsodV24_deserialize.c | 2 +- DtsodParser/DtsodV24_serialize.c | 2 +- {Autoarr => String}/StringBuilder.c | 0 String/StringBuilder.h | 25 +++++++++++++++++++ base/mystr.c => String/string.c | 37 +---------------------------- base/mystr.h => String/string.h | 14 +---------- base/base.h | 2 +- base/cptr.c | 36 ++++++++++++++++++++++++++++ base/cptr.h | 23 ++++++++++++++++++ base/errors.c | 2 +- kerep.vcxproj | 2 +- kerep.vcxproj.filters | 2 +- tests/test_string.c | 2 +- 14 files changed, 93 insertions(+), 80 deletions(-) delete mode 100644 Autoarr/StringBuilder.h rename {Autoarr => String}/StringBuilder.c (100%) create mode 100644 String/StringBuilder.h rename base/mystr.c => String/string.c (60%) rename base/mystr.h => String/string.h (68%) create mode 100644 base/cptr.c create mode 100644 base/cptr.h diff --git a/Autoarr/StringBuilder.h b/Autoarr/StringBuilder.h deleted file mode 100644 index 96378f0..0000000 --- a/Autoarr/StringBuilder.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#if __cplusplus -extern "C" { -#endif - -#include "Autoarr.h" - - typedef Autoarr(int8) StringBuilder; - - StringBuilder* StringBuilder_create(uint16 max_blocks_count, uint16 max_block_length); - void StringBuilder_free(StringBuilder* b); - void StringBuilder_pop(StringBuilder* b); - void StringBuilder_append_char(StringBuilder* b, char c); - void StringBuilder_append_cptr(StringBuilder* b, char* s); - void StringBuilder_append_string(StringBuilder* b, string s); - void StringBuilder_append_int64(StringBuilder* b, int64 a); - void StringBuilder_append_uint64(StringBuilder* b, uint64 a); - void StringBuilder_append_double(StringBuilder* b, double a); - char* StringBuilder_build(StringBuilder* b); - -#if __cplusplus -} -#endif \ No newline at end of file diff --git a/DtsodParser/DtsodV24_deserialize.c b/DtsodParser/DtsodV24_deserialize.c index 5cf65e1..6e1de1c 100644 --- a/DtsodParser/DtsodV24_deserialize.c +++ b/DtsodParser/DtsodV24_deserialize.c @@ -1,5 +1,5 @@ #include "DtsodV24.h" -#include "../Autoarr/StringBuilder.h" +#include "../String/StringBuilder.h" #define ARR_BC 64 #define ARR_BL 1024 diff --git a/DtsodParser/DtsodV24_serialize.c b/DtsodParser/DtsodV24_serialize.c index 13c7fc9..ab09ffd 100644 --- a/DtsodParser/DtsodV24_serialize.c +++ b/DtsodParser/DtsodV24_serialize.c @@ -1,5 +1,5 @@ #include "DtsodV24.h" -#include "../Autoarr/StringBuilder.h" +#include "../String/StringBuilder.h" // 65536 max length! #define STRB_BC 64 diff --git a/Autoarr/StringBuilder.c b/String/StringBuilder.c similarity index 100% rename from Autoarr/StringBuilder.c rename to String/StringBuilder.c diff --git a/String/StringBuilder.h b/String/StringBuilder.h new file mode 100644 index 0000000..6cdac39 --- /dev/null +++ b/String/StringBuilder.h @@ -0,0 +1,25 @@ +#pragma once + +#if __cplusplus +extern "C" { +#endif + +#include "../Autoarr/Autoarr.h" +#include "../String/string.h" + +typedef Autoarr(int8) StringBuilder; + +StringBuilder* StringBuilder_create(uint16 max_blocks_count, uint16 max_block_length); +void StringBuilder_free(StringBuilder* b); +void StringBuilder_pop(StringBuilder* b); +void StringBuilder_append_char(StringBuilder* b, char c); +void StringBuilder_append_cptr(StringBuilder* b, char* s); +void StringBuilder_append_string(StringBuilder* b, string s); +void StringBuilder_append_int64(StringBuilder* b, int64 a); +void StringBuilder_append_uint64(StringBuilder* b, uint64 a); +void StringBuilder_append_double(StringBuilder* b, double a); +char* StringBuilder_build(StringBuilder* b); + +#if __cplusplus +} +#endif \ No newline at end of file diff --git a/base/mystr.c b/String/string.c similarity index 60% rename from base/mystr.c rename to String/string.c index 520ed9c..511fa2b 100644 --- a/base/mystr.c +++ b/String/string.c @@ -1,39 +1,4 @@ -#include "base.h" - -// returns length of string (including \0) -uint32 cptr_length(char* str){ - uint32 len=0; - while(*(str++)) len++; - return ++len; -} - -// allocates new char[] and copies src there -char* cptr_copy(char* src){ - uint32 len=cptr_length(src); - char* dst=malloc(len*sizeof(char)); - while(len-->0) - dst[len]=src[len]; - return dst; -} - -// compares two char buffers, NullPtr-friendly -bool cptr_compare(char* key0, char* key1){ - if(!key0) return key1 ? false : true; - if(!key1) return false; - while(*key0&&*key1) - if(*key0++ != *key1++) - return false; - return true; -} - -// multiplies char n times -char* char_multiply(char c, uint32 n){ - char* rez=malloc(n+1); - rez[n]=0; - while(n-->0) - rez[n]=c; - return rez; -} +#include "../String/string.h" // copies str content to new char pointer value (adding '\0' at the end) char* string_cpToCptr(string str){ diff --git a/base/mystr.h b/String/string.h similarity index 68% rename from base/mystr.h rename to String/string.h index f5e0f56..43c60b7 100644 --- a/base/mystr.h +++ b/String/string.h @@ -4,19 +4,7 @@ extern "C" { #endif -#include "types.h" - -// returns length of string (including \0) -uint32 cptr_length(char* str); - -// allocates new char[] and copies src there -char* cptr_copy(char* src); - -// compares two char buffers, NullPtr-friendly -bool cptr_compare(char* key0, char* key1); - -// multiplies char n times -char* char_multiply(char c, uint32 n); +#include "../base/base.h" // my fixed length string struct // doesn't store '\0' at the end diff --git a/base/base.h b/base/base.h index 7986532..f9d56b8 100644 --- a/base/base.h +++ b/base/base.h @@ -7,7 +7,7 @@ extern "C" { #include "std.h" #include "types.h" #include "errors.h" -#include "mystr.h" +#include "cptr.h" // executes codeblock and prints execution time #ifdef CLOCK_REALTIME // non-standard high-precision clock diff --git a/base/cptr.c b/base/cptr.c new file mode 100644 index 0000000..75a0ed7 --- /dev/null +++ b/base/cptr.c @@ -0,0 +1,36 @@ +#include "base.h" + +// returns length of string (including \0) +uint32 cptr_length(char* str){ + uint32 len=0; + while(*(str++)) len++; + return ++len; +} + +// allocates new char[] and copies src there +char* cptr_copy(char* src){ + uint32 len=cptr_length(src); + char* dst=malloc(len*sizeof(char)); + while(len-->0) + dst[len]=src[len]; + return dst; +} + +// compares two char buffers, NullPtr-friendly +bool cptr_compare(char* key0, char* key1){ + if(!key0) return key1 ? false : true; + if(!key1) return false; + while(*key0&&*key1) + if(*key0++ != *key1++) + return false; + return true; +} + +// multiplies char n times +char* char_multiply(char c, uint32 n){ + char* rez=malloc(n+1); + rez[n]=0; + while(n-->0) + rez[n]=c; + return rez; +} diff --git a/base/cptr.h b/base/cptr.h new file mode 100644 index 0000000..50cd173 --- /dev/null +++ b/base/cptr.h @@ -0,0 +1,23 @@ +#pragma once + +#if __cplusplus +extern "C" { +#endif + +#include "types.h" + +// returns length of string (including \0) +uint32 cptr_length(char* str); + +// allocates new char[] and copies src there +char* cptr_copy(char* src); + +// compares two char buffers, NullPtr-friendly +bool cptr_compare(char* key0, char* key1); + +// multiplies char n times +char* char_multiply(char c, uint32 n); + +#if __cplusplus +} +#endif \ No newline at end of file diff --git a/base/errors.c b/base/errors.c index d10d5d1..f56687a 100644 --- a/base/errors.c +++ b/base/errors.c @@ -1,6 +1,6 @@ #include "std.h" #include "errors.h" -#include "mystr.h" +#include "cptr.h" char* errname(err_t err){ switch(err){ diff --git a/kerep.vcxproj b/kerep.vcxproj index 5ed9303..8bf4ec8 100644 --- a/kerep.vcxproj +++ b/kerep.vcxproj @@ -207,7 +207,7 @@ - + diff --git a/kerep.vcxproj.filters b/kerep.vcxproj.filters index 802eb88..362d871 100644 --- a/kerep.vcxproj.filters +++ b/kerep.vcxproj.filters @@ -33,7 +33,7 @@ Файлы заголовков - + Файлы заголовков diff --git a/tests/test_string.c b/tests/test_string.c index e9e249f..1a8a523 100644 --- a/tests/test_string.c +++ b/tests/test_string.c @@ -1,5 +1,5 @@ #include "tests.h" -#include "../base/mystr.h" +#include "../String/string.h" void test_string(){ optime(__func__,1,({ From 0309f0a3d099280f754c53d718d6b5279e7d2ffc Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Wed, 20 Apr 2022 19:25:19 +0300 Subject: [PATCH 2/3] StringBuilder rewrote --- DtsodParser/DtsodV24_deserialize.c | 17 ++--- DtsodParser/DtsodV24_serialize.c | 14 ++-- String/StringBuilder.c | 119 ++++++++++++++++++++++------- String/StringBuilder.h | 20 +++-- String/string.c | 20 ++--- String/string.h | 6 +- base/cptr.c | 6 +- base/cptr.h | 2 +- tests/test_string.c | 10 +-- 9 files changed, 138 insertions(+), 76 deletions(-) diff --git a/DtsodParser/DtsodV24_deserialize.c b/DtsodParser/DtsodV24_deserialize.c index 6e1de1c..d410e08 100644 --- a/DtsodParser/DtsodV24_deserialize.c +++ b/DtsodParser/DtsodV24_deserialize.c @@ -3,8 +3,6 @@ #define ARR_BC 64 #define ARR_BL 1024 -#define STRB_BC 64 -#define STRB_BL 1024 typedef struct DeserializeSharedData{ @@ -105,7 +103,7 @@ Maybe __ReadName(DeserializeSharedData* shared){ safethrow_wrongchar(c,;); return SUCCESS(UniPtr(CharPtr,NULL)); case ':': - return SUCCESS(UniPtr(CharPtr,string_cpToCptr(nameStr))); + return SUCCESS(UniPtr(CharPtr,string_extract(nameStr))); case '$': if(nameStr.length!=0) safethrow_wrongchar(c,;); @@ -130,19 +128,18 @@ Maybe __ReadValue(DeserializeSharedData* shared); Maybe __ReadString(DeserializeSharedData* shared){ char c; bool prevIsBackslash=false; - StringBuilder* b=StringBuilder_create(STRB_BC,STRB_BL); + StringBuilder* b=StringBuilder_create(); while ((c=*++text)){ if(c=='"') { if(prevIsBackslash) { // replacing <\"> with <"> - StringBuilder_pop(b); + StringBuilder_rmchar(b); StringBuilder_append_char(b,c); prevIsBackslash=false; } else { - char* str=StringBuilder_build(b); - StringBuilder_free(b); + char* str=StringBuilder_build(b).ptr; return SUCCESS(UniPtr(CharPtr,str)); } } @@ -188,7 +185,7 @@ Maybe __ParseValue(DeserializeSharedData* shared, string str){ break; // Float64 case 'f': { - char* _c=string_cpToCptr(str); + char* _c=string_extract(str); Unitype rez=Uni(Float64,strtod(_c,NULL)); free(_c); return SUCCESS(rez); @@ -196,7 +193,7 @@ Maybe __ParseValue(DeserializeSharedData* shared, string str){ // UInt64 case 'u': { uint64 lu=0; - char* _c=string_cpToCptr(str); + char* _c=string_extract(str); if(sscanf(_c,"%lu",&lu)!=1){ char err[64]; IFWIN( @@ -212,7 +209,7 @@ Maybe __ParseValue(DeserializeSharedData* shared, string str){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { int64 li=0; - char* _c=string_cpToCptr(str); + char* _c=string_extract(str); if(sscanf(_c,"%li",&li)!=1){ char err[64]; IFWIN( diff --git a/DtsodParser/DtsodV24_serialize.c b/DtsodParser/DtsodV24_serialize.c index ab09ffd..d4869f0 100644 --- a/DtsodParser/DtsodV24_serialize.c +++ b/DtsodParser/DtsodV24_serialize.c @@ -1,9 +1,6 @@ #include "DtsodV24.h" #include "../String/StringBuilder.h" -// 65536 max length! -#define STRB_BC 64 -#define STRB_BL 1024 typedef struct SerializeSharedData{ StringBuilder* sh_builder; @@ -35,7 +32,7 @@ Maybe __AppendValue(SerializeSharedData* shared, Unitype u){ addc('u'); break; case Float64: - StringBuilder_append_double(b,u.Float64); + StringBuilder_append_float64(b,u.Float64); addc('f'); break; case CharPtr: @@ -64,7 +61,7 @@ Maybe __AppendValue(SerializeSharedData* shared, Unitype u){ try(AppendValue(e),__,;); addc(','); })); - StringBuilder_pop(b); + StringBuilder_rmchar(b); addc('\n'); tabs--; AppendTabs(); @@ -106,9 +103,8 @@ Maybe __serialize(StringBuilder* _b, uint8 _tabs, Hashtable* dtsod){ } Maybe DtsodV24_serialize(Hashtable* dtsod){ - StringBuilder* sb=StringBuilder_create(STRB_BC,STRB_BL); - try(__serialize(sb,0,dtsod),__, StringBuilder_free((sb))); - char* str=StringBuilder_build(sb); - StringBuilder_free((sb)); + StringBuilder* sb=StringBuilder_create(); + try(__serialize(sb,0,dtsod),__, StringBuilder_free(sb)); + char* str=StringBuilder_build(sb).ptr; return SUCCESS(UniPtr(CharPtr, str)); } diff --git a/String/StringBuilder.c b/String/StringBuilder.c index f11ea13..a577361 100644 --- a/String/StringBuilder.c +++ b/String/StringBuilder.c @@ -1,42 +1,109 @@ #include "StringBuilder.h" -StringBuilder* StringBuilder_create(uint16 max_blocks_count, uint16 max_block_length){ - return Autoarr_create(int8,max_blocks_count,max_block_length); +define_Autoarr(string) + +#define MAXLENGTH 32768 +#define BL_C 32 +#define BL_L 1024 + + +void complete_buf(StringBuilder* b){ + if(!b->compl_bufs) + b->compl_bufs=Autoarr_create(string,BL_C,BL_L); + uint32 len=Autoarr_length(b->curr_buf); + if(!len) return; + string str={.length=len, .ptr=malloc(len)}; + uint32 i=0; + Autoarr_foreach(b->curr_buf, c, ({ + str.ptr[i++]=c; + })); + Autoarr_add(b->compl_bufs,str); + Autoarr_free(b->curr_buf); + b->curr_buf=Autoarr_create(int8,BL_C,BL_L); +} + +void try_complete_buf(StringBuilder* b){ + if(b->curr_buf->blocks_count==BL_C) + complete_buf(b); +} + + +StringBuilder* StringBuilder_create(){ + StringBuilder* b=malloc(sizeof(StringBuilder)); + b->compl_bufs=NULL; + b->curr_buf=Autoarr_create(int8,BL_C,BL_L); + return b; } void StringBuilder_free(StringBuilder* b){ - Autoarr_free(b); + if(b->compl_bufs) Autoarr_free(b->compl_bufs); + Autoarr_free(b->curr_buf); + free(b); } -void StringBuilder_pop(StringBuilder* b){ - Autoarr_pop(b); +string StringBuilder_build(StringBuilder* b){ + complete_buf(b); + uint32 len=0; + Autoarr_foreach(b->compl_bufs, cs, ({ + len+=cs.length; + })); + string str= { .length=len, .ptr=malloc(len+1) }; + str.ptr[len]='\0'; + uint32 i=0; + Autoarr_foreach(b->compl_bufs, cs, ({ + for(uint32 n=0;ncurr_buf->block_length!=0) + Autoarr_pop(b->curr_buf) + else { + if(!b->compl_bufs) throw(ERR_NULLPTR); + string* lastcb=Autoarr_getptr(b->compl_bufs, (Autoarr_length(b->compl_bufs)-1)); + lastcb->length--; + } +} + + void StringBuilder_append_char(StringBuilder* b, char c){ - Autoarr_add(b,c); + try_complete_buf(b); + Autoarr_add(b->curr_buf,c); +} + + +void StringBuilder_append_string(StringBuilder* b, string s){ + complete_buf(b); + Autoarr_add(b->compl_bufs, string_copy(s)); } void StringBuilder_append_cptr(StringBuilder* b, char* s){ - char c; - while((c=*s++)) - Autoarr_add(b,c); + string str={ + .ptr=s, + .length=cptr_length(s) + }; + StringBuilder_append_string(b,str); } -void StringBuilder_append_string(StringBuilder* b, string s){ - while(s.length>0){ - Autoarr_add(b,*s.ptr++); - s.length--; - } +void curr_buf_add_string(StringBuilder* b, string s){ + for(uint32 i=0; icurr_buf,s.ptr[i]); } void StringBuilder_append_int64(StringBuilder* b, int64 a){ + try_complete_buf(b); uint8 i=0; if(a==0){ - Autoarr_add(b,'0'); + Autoarr_add(b->curr_buf,'0'); return; } else if(a<0){ - Autoarr_add(b,'-'); + Autoarr_add(b->curr_buf,'-'); a=-a; } char buf[24]; @@ -45,14 +112,15 @@ void StringBuilder_append_int64(StringBuilder* b, int64 a){ a/=10; } string rev=string_reverse((string){buf,i}); - StringBuilder_append_string(b,rev); + curr_buf_add_string(b,rev); free(rev.ptr); } void StringBuilder_append_uint64(StringBuilder* b, uint64 a){ + try_complete_buf(b); uint8 i=0; if(a==0){ - Autoarr_add(b,'0'); + Autoarr_add(b->curr_buf,'0'); return; } char buf[24]; @@ -61,24 +129,17 @@ void StringBuilder_append_uint64(StringBuilder* b, uint64 a){ a/=10; } string rev=string_reverse((string){buf,i}); - StringBuilder_append_string(b,rev); + curr_buf_add_string(b,rev); free(rev.ptr); } -void StringBuilder_append_double(StringBuilder* b, double a){ +void StringBuilder_append_float64(StringBuilder* b, double a){ + try_complete_buf(b); char buf[32]; IFWIN( sprintf_s(buf,32,"%lf",a), sprintf(buf,"%lf",a) ); StringBuilder_append_cptr(b,buf); -} - -char* StringBuilder_build(StringBuilder* b){ - uint32 len=Autoarr_length(b); - char* str=malloc(len+1); - str[len]=0; - for(uint32 i=0;i0) dst[len]=src[len]; return dst; diff --git a/base/cptr.h b/base/cptr.h index 50cd173..ccce381 100644 --- a/base/cptr.h +++ b/base/cptr.h @@ -6,7 +6,7 @@ extern "C" { #include "types.h" -// returns length of string (including \0) +// returns length of char buffer (without \0) uint32 cptr_length(char* str); // allocates new char[] and copies src there diff --git a/tests/test_string.c b/tests/test_string.c index 1a8a523..90110f6 100644 --- a/tests/test_string.c +++ b/tests/test_string.c @@ -5,12 +5,10 @@ void test_string(){ optime(__func__,1,({ printf("\e[96m-------------[test_string]-------------\n"); char c[]="0123456789abcdef"; - string s=string_cpFromCharPtr(c); - printf("\e[92m\"%s\" \e[94m-> string_cpFromCharPtr()\n",c); - if(s.length!=16) throw("string created with incorrect length"); - char* p=string_cpToCptr(s); - printf("\e[94mstring_cpToCptr() -> \e[92m\"%s\"\n",p); + string s={.ptr=c, .length=cptr_length(c)}; + if(s.length!=sizeof(c)-1) throw("string created with incorrect length"); + char* p=string_extract(s); + printf("\e[94mstring_extract() -> \e[92m\"%s\"\n",p); free(p); - free(s.ptr); })); } \ No newline at end of file From 54bea87b5db668c52ebcb6a42ba9e382de881174 Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Wed, 20 Apr 2022 19:28:28 +0300 Subject: [PATCH 3/3] gitignore --- .gitignore | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.gitignore b/.gitignore index c2f7b42..3cf06f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,6 @@ # Build results bin/ -bin-*/ -.bin/ obj/ -obj-*/ -log/ -logs/ -logs-*/ # IDE files .vs/ @@ -18,6 +12,3 @@ logs-*/ #backups .old*/ - -#temp -messages.dtsod