From c31faa5c9b72af8a895105f03fe1fc43cb9793a4 Mon Sep 17 00:00:00 2001 From: Oleg Borodin Date: Mon, 4 Sep 2023 22:12:47 +0200 Subject: [PATCH 1/4] at work --- clib/Makefile.am | 2 +- clib/Makefile.in | 2 +- clib/jblock.c | 148 +++++++++++++++++++++++++++++++++++++++++++- clib/jblock.h | 84 ++++++++++++++++++++----- clib/jblock_test.c | 49 ++++++++++++--- clib/jlexer.c | 54 ++++++++++------ clib/jlexer.h | 22 ++++--- clib/jlexer_test.c | 4 +- clib/jparser.c | 3 +- clib/jparser.h | 7 ++- clib/jparser_test.c | 4 +- 11 files changed, 311 insertions(+), 68 deletions(-) diff --git a/clib/Makefile.am b/clib/Makefile.am index 4f996eb..484d511 100644 --- a/clib/Makefile.am +++ b/clib/Makefile.am @@ -1,5 +1,5 @@ -AUTOMAKE_OPTIONS = foreign no-dependencies no-installinfo +AUTOMAKE_OPTIONS = foreign no-dependencies no-installinfo SUFFIXES = .c .o AM_CFLAGS = -Wall diff --git a/clib/Makefile.in b/clib/Makefile.in index 15e7450..a935e0b 100644 --- a/clib/Makefile.in +++ b/clib/Makefile.in @@ -377,7 +377,7 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -AUTOMAKE_OPTIONS = foreign no-dependencies no-installinfo +AUTOMAKE_OPTIONS = foreign no-dependencies no-installinfo SUFFIXES = .c .o AM_CFLAGS = -Wall AM_LDFLAGS = -pthread diff --git a/clib/jblock.c b/clib/jblock.c index d623634..102a30d 100644 --- a/clib/jblock.c +++ b/clib/jblock.c @@ -23,6 +23,13 @@ void jblock_init(jblock_t* jb) { jb->kvarr = malloc(sizeof(jkeyval_t) * INIT_CAPA); } +jblock_t* new_jblock() { + jblock_t* jb = malloc(sizeof(jblock_t)); + if (jb == NULL) return NULL; + jblock_init(jb); + return jb; +} + static void* jblock_checkalloc(jblock_t* jb) { if (jb->kvsize == jb->kvcapa) { size_t newsize = jb->kvcapa * 2; @@ -161,19 +168,44 @@ void jblock_outjson(jblock_t* jb, char** res) { void jblock_destroy(jblock_t* jb) { if (jb == NULL) return; for (int i = 0; i < jb->kvsize; i++) { - free(jb->kvarr[i].key); switch (jb->kvarr[i].type) { + case JKVTYPE_BLK: { + jblock_destroy(jb->kvarr[i].blk); + break; + } + //case JKVTYPE_BLKARR: { + // break; + //} case JKVTYPE_STR: { free(jb->kvarr[i].str); + break; + } + case JKVTYPE_INTARR: { + //free(jb->kvarr[i].numarr); + break; + } + case JKVTYPE_BOOLARR: { + //free(jb->kvarr[i].flagarr); + break; + } + case JKVTYPE_FLTARR: { + //free(jb->kvarr[i].fltarr); + break; } } + free(jb->kvarr[i].key); } jb->kvsize = 0; jb->kvcapa = 0; jb->kvarr = NULL; } +void jblock_free(jblock_t* jb) { + jblock_destroy(jb); + free(jb); +} +/* String container */ static void* jstring_init(jstring_t* str) { str->data = malloc(INIT_CAPA + 1); if (str->data == NULL) return NULL; @@ -188,7 +220,7 @@ static void* jstring_append(jstring_t* str, char* add) { size_t addsize = strlen(add); size_t newsize = str->size + addsize; if (newsize > str->capa) { - char* newstr = malloc(newsize + 1); + char* newstr = realloc(str->data, newsize + 1); if (newstr == NULL) return NULL; } strcpy(&(str->data[str->size]), add); @@ -202,6 +234,118 @@ static char* jstring_getref(jstring_t* str) { return str->data; } +/* Integer array */ +jintarr_t* new_jintarr(void) { + jintarr_t* arr = malloc(sizeof(jintarr_t)); + if (arr == NULL) return NULL; + if (jintarr_init(arr) == NULL) { + jintarr_free(arr); + return NULL; + } + return arr; +} + +void* jintarr_init(jintarr_t* array) { + array->data = malloc(INIT_CAPA * sizeof(int64_t)); + if (array->data == NULL) return NULL; + memset(array->data, 0, INIT_CAPA); + array->capa = INIT_CAPA; + array->size = 0; + return array->data; +} + +void* jintarr_append(jintarr_t* array, int64_t add) { + if (array->size + 1 > array->capa) { + size_t newcapa = (array->capa * 10) / 6 ; + int64_t* newarray = realloc(array->data, newcapa); + if (newarray == NULL) return NULL; + array->capa = newcapa; + array->data = newarray; + } + array->data[array->size++] = add; + return array->data; +} + +int64_t* jintarr_getref(jintarr_t* array) { + return array->data; +} + +void jintarr_destroy(jintarr_t* array) { + if (array == NULL) return; + free(array->data); +} + +void jintarr_free(jintarr_t* array) { + jintarr_destroy(array); + free(array->data); +} + + +/* Float array */ +void* jfltarr_init(jfltarr_t* array) { + array->data = malloc(INIT_CAPA * sizeof(double)); + if (array->data == NULL) return NULL; + memset(array->data, 0, INIT_CAPA); + array->capa = INIT_CAPA; + array->size = 0; + return array->data; +} + +void* jfltarr_append(jfltarr_t* array, double add) { + if (array->size + 1 > array->capa) { + size_t newcapa = (array->capa * 10) / 6 ; + double* newarray = realloc(array->data, newcapa); + if (newarray == NULL) return NULL; + array->capa = newcapa; + array->data = newarray; + } + array->data[array->size++] = add; + return array->data; +} + +double* jfltarr_getref(jfltarr_t* array) { + return array->data; +} + +void jfltarr_destroy(jfltarr_t* array) { + if (array == NULL) return; + free(array->data); +} + + +/* Bool array */ +void* jboolarr_init(jboolarr_t* array) { + array->data = malloc(INIT_CAPA * sizeof(bool)); + if (array->data == NULL) return NULL; + memset(array->data, 0, INIT_CAPA); + array->capa = INIT_CAPA; + array->size = 0; + return array->data; +} + +void* jboolarr_append(jboolarr_t* array, bool add) { + if (array->size + 1 > array->capa) { + size_t newcapa = (array->capa * 10) / 6 ; + bool* newarray = realloc(array->data, newcapa); + if (newarray == NULL) return NULL; + array->capa = newcapa; + array->data = newarray; + } + array->data[array->size++] = add; + return array->data; +} + +bool* jboolarr_getref(jboolarr_t* array) { + return array->data; +} + +void jboolarr_destroy(jboolarr_t* array) { + if (array == NULL) return; + free(array->data); +} + + +/* Tools */ static char* strcopy(char* src) { size_t srcsize = strlen(src) + 1; char* dst = malloc(srcsize); diff --git a/clib/jblock.h b/clib/jblock.h index 967208c..b05e5de 100644 --- a/clib/jblock.h +++ b/clib/jblock.h @@ -5,56 +5,106 @@ #include #include + typedef struct { char* data; int capa; int size; } jstring_t; +typedef struct { + int64_t* data; + int capa; + int size; +} jintarr_t; + +typedef struct { + bool* data; + int capa; + int size; +} jboolarr_t; + +typedef struct { + double* data; + int capa; + int size; +} jfltarr_t; + + +typedef struct jblock jblock_t; typedef struct { char* key; int type; union { - int64_t num; - bool flag; - char* str; - double flt; - int64_t* numarr; - char** strarr; - double* fltarr; - bool* flagarr; + int64_t num; + bool flag; + char* str; + double flt; + jintarr_t numarr; + jfltarr_t fltarr; + jboolarr_t flagarr; + jblock_t* blk; + jblock_t* blkarr; + char** strarr; + }; int arrsize; int arrcapa; } jkeyval_t; -typedef struct { +struct jblock { jkeyval_t* kvarr; int kvsize; int kvcapa; -} jblock_t; +}; #define JKVTYPE_INT 0x01 #define JKVTYPE_STR 0x02 #define JKVTYPE_BOOL 0x03 #define JKVTYPE_FLT 0x04 +#define JKVTYPE_BLK 0x05 #define JKVTYPE_INTARR 0x11 #define JKVTYPE_STRARR 0x12 #define JKVTYPE_BOOLARR 0x13 #define JKVTYPE_FLTARR 0x14 +#define JKVTYPE_BLKARR 0x15 + #define JB_MALLOCERR -1 #define JB_KEYEXISTS -2 +jblock_t* new_jblock(); +void jblock_init(jblock_t* block); +void jblock_outjson(jblock_t* block, char** res); +void jblock_destroy(jblock_t* block); +void jblock_free(jblock_t* jb); + +int jblock_addint(jblock_t* block, char* key, int64_t val); +int jblock_addfloat(jblock_t* block, char* key, double val); +int jblock_addstr(jblock_t* block, char* key, char* val); +int jblock_addbool(jblock_t* block, char* key, bool val); + +jintarr_t* new_jintarr(void); +void* jintarr_init(jintarr_t* array); +void* jintarr_append(jintarr_t* array, int64_t add); +int64_t* jintarr_getref(jintarr_t* array); +void jintarr_destroy(jintarr_t* array); +void jintarr_free(jintarr_t* array); + +jfltarr_t* new_jfltarr(void); +void* jfltarr_init(jfltarr_t* array); +void* jfltarr_append(jfltarr_t* array, double add); +double* jfltarr_getref(jfltarr_t* array); +void jfltarr_destroy(jfltarr_t* array); +void jfltarr_free(jfltarr_t* array); -void jblock_init(jblock_t* kv); -void jblock_outjson(jblock_t* kv, char** res); -void jblock_destroy(jblock_t* kv); +jboolarr_t* new_jboolarr(void); +void* jboolarr_init(jboolarr_t* array); +void* jboolarr_append(jboolarr_t* array, bool add); +bool* jboolarr_getref(jboolarr_t* array); +void jboolarr_destroy(jboolarr_t* array); +void jboolarr_free(jboolarr_t* array); -int jblock_addint(jblock_t* kv, char* key, int64_t val); -int jblock_addfloat(jblock_t* kv, char* key, double val); -int jblock_addstr(jblock_t* kv, char* key, char* val); -int jblock_addbool(jblock_t* kv, char* key, bool val); #endif diff --git a/clib/jblock_test.c b/clib/jblock_test.c index 82dcbb8..c05fc9e 100644 --- a/clib/jblock_test.c +++ b/clib/jblock_test.c @@ -12,25 +12,54 @@ void test01(void) { - jblock_t jb; + jblock_t* jb = new_jblock(); - jblock_init(&jb); - jblock_addint(&jb, "id1", 12345); - jblock_addstr(&jb, "id2", "qwerty"); - jblock_addbool(&jb, "b1", true); - jblock_addbool(&jb, "b2", false); - jblock_addfloat(&jb, "f1", (double)123e1); + jblock_init(jb); + jblock_addint(jb, "id1", 12345); + jblock_addstr(jb, "id2", "qwerty"); + jblock_addbool(jb, "b1", true); + jblock_addbool(jb, "b2", false); + jblock_addfloat(jb, "f1", (double)123e1); char* jsonstr = NULL; - jblock_outjson(&jb, &jsonstr); - jblock_destroy(&jb); + jblock_outjson(jb, &jsonstr); + jblock_free(jb); printf("%s\n", jsonstr); free(jsonstr); } +void test02(void) { + jintarr_t* arr = new_jintarr(); + jintarr_init(arr); + + for (int64_t i = 0; i < 1024 + 1; i++) { + jintarr_append(arr, i); + } + printf("size: %d capa: %d\n", arr->size, arr->capa); + printf("last: %ld\n", arr->data[arr->size - 1]); + + jintarr_free(arr); + +} + +void test03(void) { + jfltarr_t arr; + jfltarr_init(&arr); + + for (int64_t i = 0; i < 1024 + 1; i++) { + jfltarr_append(&arr, i); + } + printf("size: %d capa: %d\n", arr.size, arr.capa); + printf("last: %f\n", arr.data[arr.size - 1]); + + jfltarr_destroy(&arr); +} + int main(void) { - test01(); + //test01(); + test02(); + test03(); return 0; } diff --git a/clib/jlexer.c b/clib/jlexer.c index f288216..4e533a2 100644 --- a/clib/jlexer.c +++ b/clib/jlexer.c @@ -10,25 +10,27 @@ #include #include -#define JLEXCONT_UNDEF 0 -#define JLEXCONT_WORD 1 -#define JLEXCONT_BLOCKB 2 -#define JLEXCONT_BLOCKE 3 -#define JLEXCONT_SEPAR 4 -#define JLEXCONT_NUM 5 -#define JLEXCONT_UNKNOW 6 -#define JLEXCONT_END 9 - -#define JLEXTYPE_UNDEF 0 -#define JLEXTYPE_BLOCKB 1 -#define JLEXTYPE_BLOCKE 2 -#define JLEXTYPE_WORDL 3 -#define JLEXTYPE_SPACE 4 -#define JLEXTYPE_SEPAR 5 -#define JLEXTYPE_NUM 6 -#define JLEXTYPE_COMMA 7 -#define JLEXTYPE_CHAR 8 -#define JLEXTYPE_EOF 9 +#define JLEXCONT_UNDEF 0x00 +#define JLEXCONT_WORD 0x01 +#define JLEXCONT_BLOCKB 0x02 +#define JLEXCONT_BLOCKE 0x03 +#define JLEXCONT_SEPAR 0x04 +#define JLEXCONT_NUM 0x05 +#define JLEXCONT_UNKNOW 0x06 +#define JLEXCONT_END 0x99 + +#define JLEXTYPE_UNDEF 0x00 +#define JLEXTYPE_BLOCKB 0x01 +#define JLEXTYPE_BLOCKE 0x02 +#define JLEXTYPE_WORDL 0x03 +#define JLEXTYPE_SPACE 0x04 +#define JLEXTYPE_SEPAR 0x05 +#define JLEXTYPE_NUM 0x06 +#define JLEXTYPE_COMMA 0x07 +#define JLEXTYPE_CHAR 0x08 +#define JLEXTYPE_ARRB 0x11 +#define JLEXTYPE_ARRE 0x12 +#define JLEXTYPE_EOF 0x99 static int get_ltype(char letter) { @@ -39,6 +41,10 @@ static int get_ltype(char letter) { return JLEXTYPE_BLOCKB; case '}': return JLEXTYPE_BLOCKE; + case '[': + return JLEXTYPE_ARRB; + case ']': + return JLEXTYPE_ARRE; case '"': return JLEXTYPE_WORDL; case ' ': @@ -113,6 +119,16 @@ int jlexer_gettoken(jlexer_t * lexer, char* token) { lexer->context = JLEXCONT_UNDEF; return JLEXTOK_BLOCKE; } + case JLEXTYPE_ARRB:{ + strcpy(token, "ARR BEGIN"); + lexer->context = JLEXCONT_UNDEF; + return JLEXTOK_ARRB; + } + case JLEXTYPE_ARRE:{ + strcpy(token, "ARR END"); + lexer->context = JLEXCONT_UNDEF; + return JLEXTOK_ARRE; + } case JLEXTYPE_SEPAR:{ strcpy(token, "IS"); lexer->context = JLEXCONT_UNDEF; diff --git a/clib/jlexer.h b/clib/jlexer.h index 18dc773..f40bcae 100644 --- a/clib/jlexer.h +++ b/clib/jlexer.h @@ -16,16 +16,18 @@ typedef struct { -#define JLEXTOK_BLOCKB 1 -#define JLEXTOK_BLOCKE 2 -#define JLEXTOK_SPACE 4 -#define JLEXTOK_SEPAR 3 -#define JLEXTOK_UNDEF 4 -#define JLEXTOK_WORD 5 -#define JLEXTOK_NUMB 6 -#define JLEXTOK_UNKNOW 7 -#define JLEXTOK_NEXT 8 -#define JLEXTOK_END 9 +#define JLEXTOK_BLOCKB 0x01 +#define JLEXTOK_BLOCKE 0x02 +#define JLEXTOK_SPACE 0x04 +#define JLEXTOK_SEPAR 0x03 +#define JLEXTOK_UNDEF 0x04 +#define JLEXTOK_WORD 0x05 +#define JLEXTOK_NUMB 0x06 +#define JLEXTOK_UNKNOW 0x07 +#define JLEXTOK_NEXT 0x08 +#define JLEXTOK_ARRB 0x10 +#define JLEXTOK_ARRE 0x11 +#define JLEXTOK_END 0x99 diff --git a/clib/jlexer_test.c b/clib/jlexer_test.c index 6fb50ae..fbcbdff 100644 --- a/clib/jlexer_test.c +++ b/clib/jlexer_test.c @@ -32,9 +32,9 @@ int main(void) { int type = 0; while ((type = jlexer_gettoken(&lexer, token)) != JLEXTOK_END) { - printf("%d: %s\n", type, token); + printf("%02x: %s\n", type, token); } - printf("%d: %s\n", type, token); + printf("%02x: %s\n", type, token); rcache_destroy(&cache); diff --git a/clib/jparser.c b/clib/jparser.c index eba39b3..b8da387 100644 --- a/clib/jparser.c +++ b/clib/jparser.c @@ -31,6 +31,7 @@ void jparser_init(jparser_t * parser, jlexer_t * lexer) { #define MAX_TOKEN_SIZE 1024 + int jparser_parse(jparser_t * parser) { jlexer_t* lex = parser->lexer; char token[MAX_TOKEN_SIZE]; @@ -40,7 +41,7 @@ int jparser_parse(jparser_t * parser) { char* key = ""; while ((type = jlexer_gettoken(lex, token)) != JLEXTOK_END) { - //printf("pos %d %d: %s\n", pos, type, token); + printf("pos %d tok 0x%02x: %s\n", pos, type, token); switch (pos) { // POS 0 case 0:{ diff --git a/clib/jparser.h b/clib/jparser.h index 445cb47..52c3e96 100644 --- a/clib/jparser.h +++ b/clib/jparser.h @@ -23,9 +23,10 @@ typedef struct { jlexer_t* lexer; } jparser_t; -#define JVALTYPE_STR 1 -#define JVALTYPE_NUM 2 -#define JVALTYPE_BOOL 3 +#define JVALTYPE_STR 0x01 +#define JVALTYPE_NUM 0x02 +#define JVALTYPE_BOOL 0x03 +#define JVALTYPE_BLK 0x04 void jparser_init(jparser_t* parser, jlexer_t* lexer); diff --git a/clib/jparser_test.c b/clib/jparser_test.c index 75d2071..029d019 100644 --- a/clib/jparser_test.c +++ b/clib/jparser_test.c @@ -40,14 +40,14 @@ int main(void) { int64_t id = 0; if (jparser_bind(&parser, JVALTYPE_NUM, "id", (void *)&id) < 0) { - log_error("cannot bind variable\n"); + log_error("cannot bind id variable\n"); return 1; } char* name = ""; if (jparser_bind(&parser, JVALTYPE_STR, "name", (void *)&name) < 0) { - log_error("cannot bind variable\n"); + log_error("cannot bind name variable\n"); } printf("id = %ld\n", id); From 81a7e44c99e2842a0f095a4e1acced1e00890ff5 Mon Sep 17 00:00:00 2001 From: Oleg Borodin Date: Mon, 4 Sep 2023 23:41:03 +0200 Subject: [PATCH 2/4] at work --- clib/Makefile.am | 21 ++++-- clib/Makefile.in | 47 ++++++++++--- clib/clparser.c | 2 +- clib/jblock.c | 172 +++++---------------------------------------- clib/jblock.h | 54 ++------------ clib/jblock_test.c | 16 ++--- clib/logger.c | 4 +- cworker.c | 78 ++++++++++---------- 8 files changed, 122 insertions(+), 272 deletions(-) diff --git a/clib/Makefile.am b/clib/Makefile.am index 484d511..3028821 100644 --- a/clib/Makefile.am +++ b/clib/Makefile.am @@ -19,7 +19,9 @@ libcworker_la_SOURCES = \ logger.c \ massert.c \ rcache.c \ - jblock.c + jblock.c \ + cdynarr.c \ + cstring.c include_HEADERS = \ cflexer.h \ @@ -31,8 +33,9 @@ include_HEADERS = \ logger.h \ massert.h \ rcache.h \ - jblock.h - + jblock.h \ + cdynarr.h \ + cstring.h if HAVE_VALGRIND VALGRIND_OPT = --tool=memcheck @@ -56,7 +59,7 @@ valgrind: $(bin_TESTS) common_SOURCES = libcworker.la bin_TESTS = \ - jblock_test + cstring_test noinst_PROGRAMS = \ cfparser_test \ @@ -68,7 +71,9 @@ noinst_PROGRAMS = \ jlexer_test \ jparser_test \ rcache_test \ - jblock_test + jblock_test \ + cdynarr_test \ + cstring_test #TESTS = $(bin_TESTS) @@ -80,7 +85,8 @@ jlexer_test_SOURCES = jlexer_test.c $(common_SOURCES) jparser_test_SOURCES = jparser_test.c $(common_SOURCES) rcache_test_SOURCES = rcache_test.c $(common_SOURCES) jblock_test_SOURCES = jblock_test.c $(common_SOURCES) - +cdynarr_test_SOURCES = cdynarr_test.c $(common_SOURCES) +cstring_test_SOURCES = cstring_test.c $(common_SOURCES) cflexer_test_LDADD = libcworker.la cfparser_test_LDADD = libcworker.la @@ -90,7 +96,8 @@ jblock_test_LDADD = libcworker.la jlexer_test_LDADD = libcworker.la jparser_test_LDADD = libcworker.la rcache_test_LDADD = libcworker.la - +cdynarr_test_LDADD = libcworker.la +cstring_test_LDADD = libcworker.la clean-local: diff --git a/clib/Makefile.in b/clib/Makefile.in index a935e0b..e7cb77e 100644 --- a/clib/Makefile.in +++ b/clib/Makefile.in @@ -94,7 +94,8 @@ noinst_PROGRAMS = cfparser_test$(EXEEXT) clparser_test$(EXEEXT) \ cflexer_test$(EXEEXT) cfparser_test$(EXEEXT) \ cllexer_test$(EXEEXT) clparser_test$(EXEEXT) \ jlexer_test$(EXEEXT) jparser_test$(EXEEXT) \ - rcache_test$(EXEEXT) jblock_test$(EXEEXT) + rcache_test$(EXEEXT) jblock_test$(EXEEXT) \ + cdynarr_test$(EXEEXT) cstring_test$(EXEEXT) subdir = clib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ @@ -114,13 +115,16 @@ LTLIBRARIES = $(noinst_LTLIBRARIES) libcworker_la_LIBADD = am_libcworker_la_OBJECTS = cflexer.lo cfparser.lo cllexer.lo \ clparser.lo jlexer.lo jparser.lo logger.lo massert.lo \ - rcache.lo jblock.lo + rcache.lo jblock.lo cdynarr.lo cstring.lo libcworker_la_OBJECTS = $(am_libcworker_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__objects_1 = +am_cdynarr_test_OBJECTS = cdynarr_test.$(OBJEXT) $(am__objects_1) +cdynarr_test_OBJECTS = $(am_cdynarr_test_OBJECTS) +cdynarr_test_DEPENDENCIES = libcworker.la am_cflexer_test_OBJECTS = cflexer_test.$(OBJEXT) $(am__objects_1) cflexer_test_OBJECTS = $(am_cflexer_test_OBJECTS) cflexer_test_DEPENDENCIES = libcworker.la @@ -133,6 +137,9 @@ cllexer_test_DEPENDENCIES = libcworker.la am_clparser_test_OBJECTS = clparser_test.$(OBJEXT) $(am__objects_1) clparser_test_OBJECTS = $(am_clparser_test_OBJECTS) clparser_test_DEPENDENCIES = libcworker.la +am_cstring_test_OBJECTS = cstring_test.$(OBJEXT) $(am__objects_1) +cstring_test_OBJECTS = $(am_cstring_test_OBJECTS) +cstring_test_DEPENDENCIES = libcworker.la am_jblock_test_OBJECTS = jblock_test.$(OBJEXT) $(am__objects_1) jblock_test_OBJECTS = $(am_jblock_test_OBJECTS) jblock_test_DEPENDENCIES = libcworker.la @@ -178,14 +185,16 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(libcworker_la_SOURCES) $(cflexer_test_SOURCES) \ - $(cfparser_test_SOURCES) $(cllexer_test_SOURCES) \ - $(clparser_test_SOURCES) $(jblock_test_SOURCES) \ +SOURCES = $(libcworker_la_SOURCES) $(cdynarr_test_SOURCES) \ + $(cflexer_test_SOURCES) $(cfparser_test_SOURCES) \ + $(cllexer_test_SOURCES) $(clparser_test_SOURCES) \ + $(cstring_test_SOURCES) $(jblock_test_SOURCES) \ $(jlexer_test_SOURCES) $(jparser_test_SOURCES) \ $(rcache_test_SOURCES) -DIST_SOURCES = $(libcworker_la_SOURCES) $(cflexer_test_SOURCES) \ - $(cfparser_test_SOURCES) $(cllexer_test_SOURCES) \ - $(clparser_test_SOURCES) $(jblock_test_SOURCES) \ +DIST_SOURCES = $(libcworker_la_SOURCES) $(cdynarr_test_SOURCES) \ + $(cflexer_test_SOURCES) $(cfparser_test_SOURCES) \ + $(cllexer_test_SOURCES) $(clparser_test_SOURCES) \ + $(cstring_test_SOURCES) $(jblock_test_SOURCES) \ $(jlexer_test_SOURCES) $(jparser_test_SOURCES) \ $(rcache_test_SOURCES) am__can_run_installinfo = \ @@ -392,7 +401,9 @@ libcworker_la_SOURCES = \ logger.c \ massert.c \ rcache.c \ - jblock.c + jblock.c \ + cdynarr.c \ + cstring.c include_HEADERS = \ cflexer.h \ @@ -404,12 +415,14 @@ include_HEADERS = \ logger.h \ massert.h \ rcache.h \ - jblock.h + jblock.h \ + cdynarr.h \ + cstring.h @HAVE_VALGRIND_TRUE@VALGRIND_OPT = --tool=memcheck common_SOURCES = libcworker.la bin_TESTS = \ - jblock_test + cstring_test #TESTS = $(bin_TESTS) @@ -421,6 +434,8 @@ jlexer_test_SOURCES = jlexer_test.c $(common_SOURCES) jparser_test_SOURCES = jparser_test.c $(common_SOURCES) rcache_test_SOURCES = rcache_test.c $(common_SOURCES) jblock_test_SOURCES = jblock_test.c $(common_SOURCES) +cdynarr_test_SOURCES = cdynarr_test.c $(common_SOURCES) +cstring_test_SOURCES = cstring_test.c $(common_SOURCES) cflexer_test_LDADD = libcworker.la cfparser_test_LDADD = libcworker.la cllexer_test_LDADD = libcworker.la @@ -429,6 +444,8 @@ jblock_test_LDADD = libcworker.la jlexer_test_LDADD = libcworker.la jparser_test_LDADD = libcworker.la rcache_test_LDADD = libcworker.la +cdynarr_test_LDADD = libcworker.la +cstring_test_LDADD = libcworker.la all: all-am .SUFFIXES: @@ -486,6 +503,10 @@ clean-noinstLTLIBRARIES: libcworker.la: $(libcworker_la_OBJECTS) $(libcworker_la_DEPENDENCIES) $(EXTRA_libcworker_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libcworker_la_OBJECTS) $(libcworker_la_LIBADD) $(LIBS) +cdynarr_test$(EXEEXT): $(cdynarr_test_OBJECTS) $(cdynarr_test_DEPENDENCIES) $(EXTRA_cdynarr_test_DEPENDENCIES) + @rm -f cdynarr_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cdynarr_test_OBJECTS) $(cdynarr_test_LDADD) $(LIBS) + cflexer_test$(EXEEXT): $(cflexer_test_OBJECTS) $(cflexer_test_DEPENDENCIES) $(EXTRA_cflexer_test_DEPENDENCIES) @rm -f cflexer_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cflexer_test_OBJECTS) $(cflexer_test_LDADD) $(LIBS) @@ -502,6 +523,10 @@ clparser_test$(EXEEXT): $(clparser_test_OBJECTS) $(clparser_test_DEPENDENCIES) $ @rm -f clparser_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(clparser_test_OBJECTS) $(clparser_test_LDADD) $(LIBS) +cstring_test$(EXEEXT): $(cstring_test_OBJECTS) $(cstring_test_DEPENDENCIES) $(EXTRA_cstring_test_DEPENDENCIES) + @rm -f cstring_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cstring_test_OBJECTS) $(cstring_test_LDADD) $(LIBS) + jblock_test$(EXEEXT): $(jblock_test_OBJECTS) $(jblock_test_DEPENDENCIES) $(EXTRA_jblock_test_DEPENDENCIES) @rm -f jblock_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(jblock_test_OBJECTS) $(jblock_test_LDADD) $(LIBS) diff --git a/clib/clparser.c b/clib/clparser.c index b71b914..1a34caf 100644 --- a/clib/clparser.c +++ b/clib/clparser.c @@ -11,7 +11,7 @@ #include #include -#define INIT_BSIZE 64 +#define INIT_BSIZE 128 static char* strcopy(char* src) { diff --git a/clib/jblock.c b/clib/jblock.c index 102a30d..950a3d1 100644 --- a/clib/jblock.c +++ b/clib/jblock.c @@ -4,17 +4,17 @@ * */ -#include + #include #include #include +#include +#include +#include #define INIT_CAPA 64 -static void* jstring_init(jstring_t* str); -static void* jstring_append(jstring_t* str, char* add); -static char* jstring_getref(jstring_t* str); static char* strcopy(char* src); void jblock_init(jblock_t* jb) { @@ -106,9 +106,9 @@ int jblock_addstr(jblock_t* jb, char* key, char* val) { } void jblock_outjson(jblock_t* jb, char** res) { - jstring_t jstr; - jstring_init(&jstr); - jstring_append(&jstr, "{"); + cstring_t jstr; + cstring_init(&jstr); + cstring_append(&jstr, "{"); for (int i = 0; i < jb->kvsize; i++) { switch (jb->kvarr[i].type) { case JKVTYPE_STR: @@ -117,7 +117,7 @@ void jblock_outjson(jblock_t* jb, char** res) { case JKVTYPE_INT: { char* buffer = NULL; asprintf(&buffer, "\"%s\":", jb->kvarr[i].key); - jstring_append(&jstr, buffer); + cstring_append(&jstr, buffer); free(buffer); break; } @@ -129,39 +129,39 @@ void jblock_outjson(jblock_t* jb, char** res) { case JKVTYPE_INT: { char* buffer = NULL; asprintf(&buffer, "%ld", jb->kvarr[i].num); - jstring_append(&jstr, buffer); + cstring_append(&jstr, buffer); free(buffer); break; } case JKVTYPE_FLT: { char* buffer = NULL; asprintf(&buffer, "%e", jb->kvarr[i].flt); - jstring_append(&jstr, buffer); + cstring_append(&jstr, buffer); free(buffer); break; } case JKVTYPE_BOOL: { if (jb->kvarr[i].flag) { - jstring_append(&jstr, "true"); + cstring_append(&jstr, "true"); } else { - jstring_append(&jstr, "false"); + cstring_append(&jstr, "false"); } break; } case JKVTYPE_STR: { char* buffer = NULL; asprintf(&buffer, "\"%s\"", jb->kvarr[i].str); - jstring_append(&jstr, buffer); + cstring_append(&jstr, buffer); free(buffer); break; } } if (i < jb->kvsize - 1) { - jstring_append(&jstr, ","); + cstring_append(&jstr, ","); } } - jstring_append(&jstr, "}"); - *res = jstring_getref(&jstr); + cstring_append(&jstr, "}"); + *res = cstring_getref(&jstr); } @@ -205,146 +205,6 @@ void jblock_free(jblock_t* jb) { free(jb); } -/* String container */ -static void* jstring_init(jstring_t* str) { - str->data = malloc(INIT_CAPA + 1); - if (str->data == NULL) return NULL; - memset(str->data, '\0', INIT_CAPA + 1); - str->capa = INIT_CAPA; - str->size = 0; - return str->data; -} - - -static void* jstring_append(jstring_t* str, char* add) { - size_t addsize = strlen(add); - size_t newsize = str->size + addsize; - if (newsize > str->capa) { - char* newstr = realloc(str->data, newsize + 1); - if (newstr == NULL) return NULL; - } - strcpy(&(str->data[str->size]), add); - str->data[newsize + 1] = '\0'; - str->capa = newsize; - str->size = newsize; - return str->data; -} - -static char* jstring_getref(jstring_t* str) { - return str->data; -} - -/* Integer array */ -jintarr_t* new_jintarr(void) { - jintarr_t* arr = malloc(sizeof(jintarr_t)); - if (arr == NULL) return NULL; - if (jintarr_init(arr) == NULL) { - jintarr_free(arr); - return NULL; - } - return arr; -} - -void* jintarr_init(jintarr_t* array) { - array->data = malloc(INIT_CAPA * sizeof(int64_t)); - if (array->data == NULL) return NULL; - memset(array->data, 0, INIT_CAPA); - array->capa = INIT_CAPA; - array->size = 0; - return array->data; -} - -void* jintarr_append(jintarr_t* array, int64_t add) { - if (array->size + 1 > array->capa) { - size_t newcapa = (array->capa * 10) / 6 ; - int64_t* newarray = realloc(array->data, newcapa); - if (newarray == NULL) return NULL; - array->capa = newcapa; - array->data = newarray; - } - array->data[array->size++] = add; - return array->data; -} - -int64_t* jintarr_getref(jintarr_t* array) { - return array->data; -} - -void jintarr_destroy(jintarr_t* array) { - if (array == NULL) return; - free(array->data); -} - -void jintarr_free(jintarr_t* array) { - jintarr_destroy(array); - free(array->data); -} - - -/* Float array */ -void* jfltarr_init(jfltarr_t* array) { - array->data = malloc(INIT_CAPA * sizeof(double)); - if (array->data == NULL) return NULL; - memset(array->data, 0, INIT_CAPA); - array->capa = INIT_CAPA; - array->size = 0; - return array->data; -} - -void* jfltarr_append(jfltarr_t* array, double add) { - if (array->size + 1 > array->capa) { - size_t newcapa = (array->capa * 10) / 6 ; - double* newarray = realloc(array->data, newcapa); - if (newarray == NULL) return NULL; - array->capa = newcapa; - array->data = newarray; - } - array->data[array->size++] = add; - return array->data; -} - -double* jfltarr_getref(jfltarr_t* array) { - return array->data; -} - -void jfltarr_destroy(jfltarr_t* array) { - if (array == NULL) return; - free(array->data); -} - - -/* Bool array */ -void* jboolarr_init(jboolarr_t* array) { - array->data = malloc(INIT_CAPA * sizeof(bool)); - if (array->data == NULL) return NULL; - memset(array->data, 0, INIT_CAPA); - array->capa = INIT_CAPA; - array->size = 0; - return array->data; -} - -void* jboolarr_append(jboolarr_t* array, bool add) { - if (array->size + 1 > array->capa) { - size_t newcapa = (array->capa * 10) / 6 ; - bool* newarray = realloc(array->data, newcapa); - if (newarray == NULL) return NULL; - array->capa = newcapa; - array->data = newarray; - } - array->data[array->size++] = add; - return array->data; -} - -bool* jboolarr_getref(jboolarr_t* array) { - return array->data; -} - -void jboolarr_destroy(jboolarr_t* array) { - if (array == NULL) return; - free(array->data); -} - - /* Tools */ static char* strcopy(char* src) { size_t srcsize = strlen(src) + 1; diff --git a/clib/jblock.h b/clib/jblock.h index b05e5de..a45785b 100644 --- a/clib/jblock.h +++ b/clib/jblock.h @@ -5,31 +5,8 @@ #include #include - -typedef struct { - char* data; - int capa; - int size; -} jstring_t; - -typedef struct { - int64_t* data; - int capa; - int size; -} jintarr_t; - -typedef struct { - bool* data; - int capa; - int size; -} jboolarr_t; - -typedef struct { - double* data; - int capa; - int size; -} jfltarr_t; - +#include +#include typedef struct jblock jblock_t; @@ -41,9 +18,9 @@ typedef struct { bool flag; char* str; double flt; - jintarr_t numarr; - jfltarr_t fltarr; - jboolarr_t flagarr; + cintarr_t numarr; + cfltarr_t fltarr; + cboolarr_t flagarr; jblock_t* blk; jblock_t* blkarr; char** strarr; @@ -85,26 +62,5 @@ int jblock_addfloat(jblock_t* block, char* key, double val); int jblock_addstr(jblock_t* block, char* key, char* val); int jblock_addbool(jblock_t* block, char* key, bool val); -jintarr_t* new_jintarr(void); -void* jintarr_init(jintarr_t* array); -void* jintarr_append(jintarr_t* array, int64_t add); -int64_t* jintarr_getref(jintarr_t* array); -void jintarr_destroy(jintarr_t* array); -void jintarr_free(jintarr_t* array); - -jfltarr_t* new_jfltarr(void); -void* jfltarr_init(jfltarr_t* array); -void* jfltarr_append(jfltarr_t* array, double add); -double* jfltarr_getref(jfltarr_t* array); -void jfltarr_destroy(jfltarr_t* array); -void jfltarr_free(jfltarr_t* array); - -jboolarr_t* new_jboolarr(void); -void* jboolarr_init(jboolarr_t* array); -void* jboolarr_append(jboolarr_t* array, bool add); -bool* jboolarr_getref(jboolarr_t* array); -void jboolarr_destroy(jboolarr_t* array); -void jboolarr_free(jboolarr_t* array); - #endif diff --git a/clib/jblock_test.c b/clib/jblock_test.c index c05fc9e..1f79cf8 100644 --- a/clib/jblock_test.c +++ b/clib/jblock_test.c @@ -30,30 +30,30 @@ void test01(void) { } void test02(void) { - jintarr_t* arr = new_jintarr(); - jintarr_init(arr); + cintarr_t* arr = new_cintarr(); + cintarr_init(arr); for (int64_t i = 0; i < 1024 + 1; i++) { - jintarr_append(arr, i); + cintarr_append(arr, i); } printf("size: %d capa: %d\n", arr->size, arr->capa); printf("last: %ld\n", arr->data[arr->size - 1]); - jintarr_free(arr); + cintarr_free(arr); } void test03(void) { - jfltarr_t arr; - jfltarr_init(&arr); + cfltarr_t arr; + cfltarr_init(&arr); for (int64_t i = 0; i < 1024 + 1; i++) { - jfltarr_append(&arr, i); + cfltarr_append(&arr, i); } printf("size: %d capa: %d\n", arr.size, arr.capa); printf("last: %f\n", arr.data[arr.size - 1]); - jfltarr_destroy(&arr); + cfltarr_destroy(&arr); } diff --git a/clib/logger.c b/clib/logger.c index 7438937..2f2fda4 100644 --- a/clib/logger.c +++ b/clib/logger.c @@ -12,10 +12,10 @@ #define CLOCK_SOURCE CLOCK_MONOTONIC -#define MAX_TS_LEN 256 +#define MAX_TS_LEN 256 * 2 -static pthread_mutex_t logmutex = NULL; +static pthread_mutex_t logmutex; static pthread_mutexattr_t logmutex_attrs; void log_init(void) { diff --git a/cworker.c b/cworker.c index d7e66ec..c83b23c 100644 --- a/cworker.c +++ b/cworker.c @@ -94,7 +94,7 @@ static int cworker_readopts(const cworker_t* worker, char** argv, int argc) { log_error("Args parsing error"); return -1; } - + clparser_destroy(&parser); return 0; } @@ -269,53 +269,55 @@ int cworker_run(const cworker_t* worker) { int cworker_handler(const cworker_t* worker, int socket) { int err = 0; - rcache_t cache; - jlexer_t lexer; - jparser_t parser; + //rcache_t cache; + //jlexer_t lexer; + //jparser_t parser; - rcache_init(&cache, socket); - jlexer_init(&lexer, &cache); - jparser_init(&parser, &lexer); + //rcache_init(&cache, socket); + //jlexer_init(&lexer, &cache); + //jparser_init(&parser, &lexer); - if (jparser_parse(&parser) < 0) { - log_error("Cannot parse json"); - err = -1; - goto exit; - } + //if (jparser_parse(&parser) < 0) { + //log_error("Cannot parse json"); + //err = -1; + //goto exit; + //} - int64_t id = 0; - char* name = "none"; + //int64_t id = 0; + //char* name = "none"; + + //if (jparser_bind(&parser, JVALTYPE_NUM, "id", (void *)&id) < 0) { + //log_error("Cannot bind id"); + //} + //if (jparser_bind(&parser, JVALTYPE_STR, "name", (void *)&name) < 0) { + //log_error("Cannot bind name"); + //} - if (jparser_bind(&parser, JVALTYPE_NUM, "id", (void *)&id) < 0) { - log_error("Cannot bind id"); - } - if (jparser_bind(&parser, JVALTYPE_STR, "name", (void *)&name) < 0) { - log_error("Cannot bind name"); - } + //char* msg = NULL; + //asprintf(&msg, "hello, %s!", name); - char* msg = NULL; - asprintf(&msg, "hello, %s!", name); + //jblock_t jb; + //jblock_init(&jb); + //jblock_addstr(&jb, "message", msg); + //jblock_addbool(&jb, "error", false); - jblock_t jb; - jblock_init(&jb); - jblock_addstr(&jb, "message", msg); - jblock_addbool(&jb, "error", false); + //char* jsonstr = NULL; + //jblock_outjson(&jb, &jsonstr); + //jblock_destroy(&jb); - char* jsonstr = NULL; - jblock_outjson(&jb, &jsonstr); - jblock_destroy(&jb); + //write(socket, jsonstr, strlen(jsonstr)); + //free(jsonstr); + //free(name); + //free(msg); - write(socket, jsonstr, strlen(jsonstr)); - free(jsonstr); - free(name); - free(msg); + //exit: + //jparser_destroy(&parser); + //jlexer_destroy(&lexer); + //rcache_destroy(&cache); - exit: - jparser_destroy(&parser); - jlexer_destroy(&lexer); - rcache_destroy(&cache); - return err; + close(socket); + return err; } void cworker_shutdown(cworker_t* worker) { From 773c8549f3dfa901631b8f2f792f5e7ad89c5845 Mon Sep 17 00:00:00 2001 From: Oleg Borodin Date: Mon, 4 Sep 2023 23:41:47 +0200 Subject: [PATCH 3/4] at work --- clib/cdynarr.c | 93 +++++++++++++++++++++++++++++++++++++++++++++ clib/cdynarr.h | 49 ++++++++++++++++++++++++ clib/cdynarr_test.c | 20 ++++++++++ clib/cstring.c | 51 +++++++++++++++++++++++++ clib/cstring.h | 17 +++++++++ clib/cstring_test.c | 41 ++++++++++++++++++++ 6 files changed, 271 insertions(+) create mode 100644 clib/cdynarr.c create mode 100644 clib/cdynarr.h create mode 100644 clib/cdynarr_test.c create mode 100644 clib/cstring.c create mode 100644 clib/cstring.h create mode 100644 clib/cstring_test.c diff --git a/clib/cdynarr.c b/clib/cdynarr.c new file mode 100644 index 0000000..e16cbb1 --- /dev/null +++ b/clib/cdynarr.c @@ -0,0 +1,93 @@ + +/* + * + * Copyright 2023 Oleg Borodin + * + */ + +#include +#include +#include + +#include + + +#define INIT_CAPA 64 + +/* Integer array */ +cintarr_t* new_cintarr(void) { + cintarr_t* arr = malloc(sizeof(cintarr_t)); + if (arr == NULL) return NULL; + if (cintarr_init(arr) == NULL) { + cintarr_free(arr); + return NULL; + } + return arr; +} + +void* cintarr_init(cintarr_t* array) { + array->data = malloc(INIT_CAPA * sizeof(int64_t)); + if (array->data == NULL) return NULL; + memset(array->data, 0, INIT_CAPA); + array->capa = INIT_CAPA; + array->size = 0; + return array->data; +} + +void* cintarr_append(cintarr_t* array, int64_t add) { + if (array->size + 1 > array->capa) { + size_t newcapa = (array->capa * 10) / 6 ; + int64_t* newarray = realloc(array->data, newcapa); + if (newarray == NULL) return NULL; + array->capa = newcapa; + array->data = newarray; + } + array->data[array->size++] = add; + return array->data; +} + +int64_t* cintarr_getref(cintarr_t* array) { + return array->data; +} + +void cintarr_destroy(cintarr_t* array) { + if (array == NULL) return; + free(array->data); +} + +void cintarr_free(cintarr_t* array) { + cintarr_destroy(array); + free(array->data); +} + + +/* Float array */ +void* cfltarr_init(cfltarr_t* array) { + array->data = malloc(INIT_CAPA * sizeof(double)); + if (array->data == NULL) return NULL; + memset(array->data, 0, INIT_CAPA); + array->capa = INIT_CAPA; + array->size = 0; + return array->data; +} + +void* cfltarr_append(cfltarr_t* array, double add) { + if (array->size + 1 > array->capa) { + size_t newcapa = (array->capa * 10) / 6 ; + double* newarray = realloc(array->data, newcapa); + if (newarray == NULL) return NULL; + array->capa = newcapa; + array->data = newarray; + } + array->data[array->size++] = add; + return array->data; +} + +double* cfltarr_getref(cfltarr_t* array) { + return array->data; +} + +void cfltarr_destroy(cfltarr_t* array) { + if (array == NULL) return; + free(array->data); +} diff --git a/clib/cdynarr.h b/clib/cdynarr.h new file mode 100644 index 0000000..184b49b --- /dev/null +++ b/clib/cdynarr.h @@ -0,0 +1,49 @@ + +#ifndef CDYNARR_H_QWERTY +#define CDYNARR_H_QWERTY + +#include +#include + + +typedef struct { + int64_t* data; + int capa; + int size; +} cintarr_t; + +typedef struct { + bool* data; + int capa; + int size; +} cboolarr_t; + +typedef struct { + double* data; + int capa; + int size; +} cfltarr_t; + + +cintarr_t* new_cintarr(void); +void* cintarr_init(cintarr_t* array); +void* cintarr_append(cintarr_t* array, int64_t add); +int64_t* cintarr_getref(cintarr_t* array); +void cintarr_destroy(cintarr_t* array); +void cintarr_free(cintarr_t* array); + +cfltarr_t* new_cfltarr(void); +void* cfltarr_init(cfltarr_t* array); +void* cfltarr_append(cfltarr_t* array, double add); +double* cfltarr_getref(cfltarr_t* array); +void cfltarr_destroy(cfltarr_t* array); +void cfltarr_free(cfltarr_t* array); + +cboolarr_t* new_cboolarr(void); +void* cboolarr_init(cboolarr_t* array); +void* cboolarr_append(cboolarr_t* array, bool add); +bool* cboolarr_getref(cboolarr_t* array); +void cboolarr_destroy(cboolarr_t* array); +void cboolarr_free(cboolarr_t* array); + +#endif diff --git a/clib/cdynarr_test.c b/clib/cdynarr_test.c new file mode 100644 index 0000000..bb505b8 --- /dev/null +++ b/clib/cdynarr_test.c @@ -0,0 +1,20 @@ +/* + * Copyright 2022 Oleg Borodin + */ + +#include +#include +#include +#include + +#include +#include + + +void test01(void) { +} + +int main(void) { + test01(); + return 0; +} diff --git a/clib/cstring.c b/clib/cstring.c new file mode 100644 index 0000000..afdf300 --- /dev/null +++ b/clib/cstring.c @@ -0,0 +1,51 @@ + +/* + * + * Copyright 2023 Oleg Borodin + * + */ + +#include +#include +#include + +#include + +#define INIT_CAPA 64 + +/* String container */ +void* cstring_init(cstring_t* str) { + str->data = malloc(INIT_CAPA + 1); + if (str->data == NULL) return NULL; + memset(str->data, '\0', INIT_CAPA + 1); + str->capa = INIT_CAPA; + str->size = 0; + return str->data; +} + + +void* cstring_append(cstring_t* str, char* add) { + size_t addsize = strlen(add); + size_t newsize = str->size + addsize; + if (newsize >= str->capa) { + size_t newcapa = newsize + 1; + char* newstr = realloc(str->data, newcapa); + if (newstr == NULL) return NULL; + str->data = newstr; + str->capa = newcapa; + } + strcpy(&(str->data[str->size]), add); + str->data[newsize + 1] = '\0'; + str->size = newsize; + return str->data; +} + +char* cstring_getref(cstring_t* str) { + return str->data; +} + + +void cstring_destroy(cstring_t* str) { + if (str == NULL) return; + free(str->data); +} diff --git a/clib/cstring.h b/clib/cstring.h new file mode 100644 index 0000000..70ad58d --- /dev/null +++ b/clib/cstring.h @@ -0,0 +1,17 @@ + +#ifndef CSTRING_H_QWERTY +#define CSTRING_H_QWERTY + +typedef struct { + char* data; + int capa; + int size; +} cstring_t; + + +void* cstring_init(cstring_t* str); +void* cstring_append(cstring_t* str, char* add); +char* cstring_getref(cstring_t* str); +void cstring_destroy(cstring_t* str); + +#endif diff --git a/clib/cstring_test.c b/clib/cstring_test.c new file mode 100644 index 0000000..cb93263 --- /dev/null +++ b/clib/cstring_test.c @@ -0,0 +1,41 @@ +/* + * Copyright 2022 Oleg Borodin + */ + +#include +#include +#include +#include + +#include +#include + + +void test01(void) { + + cstring_t str; + cstring_init(&str); + cstring_append(&str, "qwerty"); + cstring_append(&str, "123456"); + + cstring_append(&str, "qwerty"); + cstring_append(&str, "123456"); + + cstring_append(&str, "qwerty"); + cstring_append(&str, "123456"); + + cstring_append(&str, "qwerty"); + cstring_append(&str, "123456"); + + cstring_append(&str, "qwerty"); + cstring_append(&str, "123456"); + + printf("%s\n", cstring_getref(&str)); + + cstring_destroy(&str); +} + +int main(void) { + test01(); + return 0; +} From 4451879e353d34e0d1e6bd84dde48e533d1564bb Mon Sep 17 00:00:00 2001 From: Oleg Borodin Date: Tue, 5 Sep 2023 09:09:55 +0200 Subject: [PATCH 4/4] at work --- clib/Makefile.am | 31 ++++++++++++----------- clib/Makefile.in | 60 +++++++++++++++++++++++++-------------------- clib/cdynarr_test.c | 3 +++ clib/cstring.c | 11 ++++----- clib/cstring_test.c | 10 ++++---- clib/logger.c | 5 ++-- clib/logger_test.c | 25 +++++++++++++++++++ 7 files changed, 90 insertions(+), 55 deletions(-) create mode 100644 clib/logger_test.c diff --git a/clib/Makefile.am b/clib/Makefile.am index 3028821..c1395ce 100644 --- a/clib/Makefile.am +++ b/clib/Makefile.am @@ -41,14 +41,14 @@ if HAVE_VALGRIND VALGRIND_OPT = --tool=memcheck endif -test: $(bin_TESTS) +test: valgrind +simple: $(bin_TESTS) @for test in $(bin_TESTS); do \ echo ====== Test $${test} ======; \ ./$${test}; \ echo ====== Done $${test} ======; \ done - valgrind: $(bin_TESTS) @for test in $(bin_TESTS); do \ echo ====== Test $${test} ======; \ @@ -56,8 +56,6 @@ valgrind: $(bin_TESTS) echo ====== Done $${test} ======; \ done -common_SOURCES = libcworker.la - bin_TESTS = \ cstring_test @@ -73,20 +71,21 @@ noinst_PROGRAMS = \ rcache_test \ jblock_test \ cdynarr_test \ - cstring_test + cstring_test \ + logger_test #TESTS = $(bin_TESTS) -cflexer_test_SOURCES = cflexer_test.c $(common_SOURCES) -cfparser_test_SOURCES = cfparser_test.c $(common_SOURCES) -cllexer_test_SOURCES = cllexer_test.c $(common_SOURCES) -clparser_test_SOURCES = clparser_test.c $(common_SOURCES) -jlexer_test_SOURCES = jlexer_test.c $(common_SOURCES) -jparser_test_SOURCES = jparser_test.c $(common_SOURCES) -rcache_test_SOURCES = rcache_test.c $(common_SOURCES) -jblock_test_SOURCES = jblock_test.c $(common_SOURCES) -cdynarr_test_SOURCES = cdynarr_test.c $(common_SOURCES) -cstring_test_SOURCES = cstring_test.c $(common_SOURCES) +cflexer_test_SOURCES = cflexer_test.c +cfparser_test_SOURCES = cfparser_test.c +cllexer_test_SOURCES = cllexer_test.c +clparser_test_SOURCES = clparser_test.c +jlexer_test_SOURCES = jlexer_test.c +jparser_test_SOURCES = jparser_test.c +rcache_test_SOURCES = rcache_test.c +jblock_test_SOURCES = jblock_test.c +cdynarr_test_SOURCES = cdynarr_test.c +cstring_test_SOURCES = cstring_test.c cflexer_test_LDADD = libcworker.la cfparser_test_LDADD = libcworker.la @@ -98,7 +97,7 @@ jparser_test_LDADD = libcworker.la rcache_test_LDADD = libcworker.la cdynarr_test_LDADD = libcworker.la cstring_test_LDADD = libcworker.la - +logger_test_LDADD = libcworker.la clean-local: rm -rf *~ diff --git a/clib/Makefile.in b/clib/Makefile.in index e7cb77e..a0d93fa 100644 --- a/clib/Makefile.in +++ b/clib/Makefile.in @@ -95,7 +95,8 @@ noinst_PROGRAMS = cfparser_test$(EXEEXT) clparser_test$(EXEEXT) \ cllexer_test$(EXEEXT) clparser_test$(EXEEXT) \ jlexer_test$(EXEEXT) jparser_test$(EXEEXT) \ rcache_test$(EXEEXT) jblock_test$(EXEEXT) \ - cdynarr_test$(EXEEXT) cstring_test$(EXEEXT) + cdynarr_test$(EXEEXT) cstring_test$(EXEEXT) \ + logger_test$(EXEEXT) subdir = clib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ @@ -121,35 +122,37 @@ AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = -am__objects_1 = -am_cdynarr_test_OBJECTS = cdynarr_test.$(OBJEXT) $(am__objects_1) +am_cdynarr_test_OBJECTS = cdynarr_test.$(OBJEXT) cdynarr_test_OBJECTS = $(am_cdynarr_test_OBJECTS) cdynarr_test_DEPENDENCIES = libcworker.la -am_cflexer_test_OBJECTS = cflexer_test.$(OBJEXT) $(am__objects_1) +am_cflexer_test_OBJECTS = cflexer_test.$(OBJEXT) cflexer_test_OBJECTS = $(am_cflexer_test_OBJECTS) cflexer_test_DEPENDENCIES = libcworker.la -am_cfparser_test_OBJECTS = cfparser_test.$(OBJEXT) $(am__objects_1) +am_cfparser_test_OBJECTS = cfparser_test.$(OBJEXT) cfparser_test_OBJECTS = $(am_cfparser_test_OBJECTS) cfparser_test_DEPENDENCIES = libcworker.la -am_cllexer_test_OBJECTS = cllexer_test.$(OBJEXT) $(am__objects_1) +am_cllexer_test_OBJECTS = cllexer_test.$(OBJEXT) cllexer_test_OBJECTS = $(am_cllexer_test_OBJECTS) cllexer_test_DEPENDENCIES = libcworker.la -am_clparser_test_OBJECTS = clparser_test.$(OBJEXT) $(am__objects_1) +am_clparser_test_OBJECTS = clparser_test.$(OBJEXT) clparser_test_OBJECTS = $(am_clparser_test_OBJECTS) clparser_test_DEPENDENCIES = libcworker.la -am_cstring_test_OBJECTS = cstring_test.$(OBJEXT) $(am__objects_1) +am_cstring_test_OBJECTS = cstring_test.$(OBJEXT) cstring_test_OBJECTS = $(am_cstring_test_OBJECTS) cstring_test_DEPENDENCIES = libcworker.la -am_jblock_test_OBJECTS = jblock_test.$(OBJEXT) $(am__objects_1) +am_jblock_test_OBJECTS = jblock_test.$(OBJEXT) jblock_test_OBJECTS = $(am_jblock_test_OBJECTS) jblock_test_DEPENDENCIES = libcworker.la -am_jlexer_test_OBJECTS = jlexer_test.$(OBJEXT) $(am__objects_1) +am_jlexer_test_OBJECTS = jlexer_test.$(OBJEXT) jlexer_test_OBJECTS = $(am_jlexer_test_OBJECTS) jlexer_test_DEPENDENCIES = libcworker.la -am_jparser_test_OBJECTS = jparser_test.$(OBJEXT) $(am__objects_1) +am_jparser_test_OBJECTS = jparser_test.$(OBJEXT) jparser_test_OBJECTS = $(am_jparser_test_OBJECTS) jparser_test_DEPENDENCIES = libcworker.la -am_rcache_test_OBJECTS = rcache_test.$(OBJEXT) $(am__objects_1) +logger_test_SOURCES = logger_test.c +logger_test_OBJECTS = logger_test.$(OBJEXT) +logger_test_DEPENDENCIES = libcworker.la +am_rcache_test_OBJECTS = rcache_test.$(OBJEXT) rcache_test_OBJECTS = $(am_rcache_test_OBJECTS) rcache_test_DEPENDENCIES = libcworker.la AM_V_P = $(am__v_P_@AM_V@) @@ -189,13 +192,13 @@ SOURCES = $(libcworker_la_SOURCES) $(cdynarr_test_SOURCES) \ $(cflexer_test_SOURCES) $(cfparser_test_SOURCES) \ $(cllexer_test_SOURCES) $(clparser_test_SOURCES) \ $(cstring_test_SOURCES) $(jblock_test_SOURCES) \ - $(jlexer_test_SOURCES) $(jparser_test_SOURCES) \ + $(jlexer_test_SOURCES) $(jparser_test_SOURCES) logger_test.c \ $(rcache_test_SOURCES) DIST_SOURCES = $(libcworker_la_SOURCES) $(cdynarr_test_SOURCES) \ $(cflexer_test_SOURCES) $(cfparser_test_SOURCES) \ $(cllexer_test_SOURCES) $(clparser_test_SOURCES) \ $(cstring_test_SOURCES) $(jblock_test_SOURCES) \ - $(jlexer_test_SOURCES) $(jparser_test_SOURCES) \ + $(jlexer_test_SOURCES) $(jparser_test_SOURCES) logger_test.c \ $(rcache_test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ @@ -420,22 +423,21 @@ include_HEADERS = \ cstring.h @HAVE_VALGRIND_TRUE@VALGRIND_OPT = --tool=memcheck -common_SOURCES = libcworker.la bin_TESTS = \ cstring_test #TESTS = $(bin_TESTS) -cflexer_test_SOURCES = cflexer_test.c $(common_SOURCES) -cfparser_test_SOURCES = cfparser_test.c $(common_SOURCES) -cllexer_test_SOURCES = cllexer_test.c $(common_SOURCES) -clparser_test_SOURCES = clparser_test.c $(common_SOURCES) -jlexer_test_SOURCES = jlexer_test.c $(common_SOURCES) -jparser_test_SOURCES = jparser_test.c $(common_SOURCES) -rcache_test_SOURCES = rcache_test.c $(common_SOURCES) -jblock_test_SOURCES = jblock_test.c $(common_SOURCES) -cdynarr_test_SOURCES = cdynarr_test.c $(common_SOURCES) -cstring_test_SOURCES = cstring_test.c $(common_SOURCES) +cflexer_test_SOURCES = cflexer_test.c +cfparser_test_SOURCES = cfparser_test.c +cllexer_test_SOURCES = cllexer_test.c +clparser_test_SOURCES = clparser_test.c +jlexer_test_SOURCES = jlexer_test.c +jparser_test_SOURCES = jparser_test.c +rcache_test_SOURCES = rcache_test.c +jblock_test_SOURCES = jblock_test.c +cdynarr_test_SOURCES = cdynarr_test.c +cstring_test_SOURCES = cstring_test.c cflexer_test_LDADD = libcworker.la cfparser_test_LDADD = libcworker.la cllexer_test_LDADD = libcworker.la @@ -446,6 +448,7 @@ jparser_test_LDADD = libcworker.la rcache_test_LDADD = libcworker.la cdynarr_test_LDADD = libcworker.la cstring_test_LDADD = libcworker.la +logger_test_LDADD = libcworker.la all: all-am .SUFFIXES: @@ -539,6 +542,10 @@ jparser_test$(EXEEXT): $(jparser_test_OBJECTS) $(jparser_test_DEPENDENCIES) $(EX @rm -f jparser_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(jparser_test_OBJECTS) $(jparser_test_LDADD) $(LIBS) +logger_test$(EXEEXT): $(logger_test_OBJECTS) $(logger_test_DEPENDENCIES) $(EXTRA_logger_test_DEPENDENCIES) + @rm -f logger_test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(logger_test_OBJECTS) $(logger_test_LDADD) $(LIBS) + rcache_test$(EXEEXT): $(rcache_test_OBJECTS) $(rcache_test_DEPENDENCIES) $(EXTRA_rcache_test_DEPENDENCIES) @rm -f rcache_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rcache_test_OBJECTS) $(rcache_test_LDADD) $(LIBS) @@ -796,7 +803,8 @@ uninstall-am: uninstall-includeHEADERS .c.o: $(CC) -I. -pthread $(CPPFLAGS) $(CFLAGS) -c -o $@ $< -test: $(bin_TESTS) +test: valgrind +simple: $(bin_TESTS) @for test in $(bin_TESTS); do \ echo ====== Test $${test} ======; \ ./$${test}; \ diff --git a/clib/cdynarr_test.c b/clib/cdynarr_test.c index bb505b8..cbebec3 100644 --- a/clib/cdynarr_test.c +++ b/clib/cdynarr_test.c @@ -12,6 +12,9 @@ void test01(void) { + + + } int main(void) { diff --git a/clib/cstring.c b/clib/cstring.c index afdf300..e88f2d5 100644 --- a/clib/cstring.c +++ b/clib/cstring.c @@ -1,4 +1,3 @@ - /* * * Copyright 2023 Oleg Borodin @@ -11,11 +10,11 @@ #include -#define INIT_CAPA 64 +#define INIT_CAPA 1 /* String container */ void* cstring_init(cstring_t* str) { - str->data = malloc(INIT_CAPA + 1); + str->data = malloc((INIT_CAPA + 1)*sizeof(char)); if (str->data == NULL) return NULL; memset(str->data, '\0', INIT_CAPA + 1); str->capa = INIT_CAPA; @@ -27,9 +26,9 @@ void* cstring_init(cstring_t* str) { void* cstring_append(cstring_t* str, char* add) { size_t addsize = strlen(add); size_t newsize = str->size + addsize; - if (newsize >= str->capa) { - size_t newcapa = newsize + 1; - char* newstr = realloc(str->data, newcapa); + if (newsize > str->capa) { + size_t newcapa = str->capa + addsize; + char* newstr = realloc(str->data, (newcapa + 1)*sizeof(char)); if (newstr == NULL) return NULL; str->data = newstr; str->capa = newcapa; diff --git a/clib/cstring_test.c b/clib/cstring_test.c index cb93263..6d7fab5 100644 --- a/clib/cstring_test.c +++ b/clib/cstring_test.c @@ -16,19 +16,19 @@ void test01(void) { cstring_t str; cstring_init(&str); cstring_append(&str, "qwerty"); - cstring_append(&str, "123456"); + cstring_append(&str, "123456\n"); cstring_append(&str, "qwerty"); - cstring_append(&str, "123456"); + cstring_append(&str, "123456\n"); cstring_append(&str, "qwerty"); - cstring_append(&str, "123456"); + cstring_append(&str, "123456\n"); cstring_append(&str, "qwerty"); - cstring_append(&str, "123456"); + cstring_append(&str, "123456\n"); cstring_append(&str, "qwerty"); - cstring_append(&str, "123456"); + cstring_append(&str, "123456\n"); printf("%s\n", cstring_getref(&str)); diff --git a/clib/logger.c b/clib/logger.c index 2f2fda4..f46e302 100644 --- a/clib/logger.c +++ b/clib/logger.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -42,9 +43,9 @@ void static set_timestamp(char* buffer) { clock_gettime(CLOCK_SOURCE, &tv); memset(buffer, '\0', MAX_TS_LEN); - sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02d.%ld+%s", + sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02d.%03ld+%s", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, - ptm->tm_min, ptm->tm_sec, tv.tv_nsec, ptm->tm_zone); + ptm->tm_min, ptm->tm_sec, tv.tv_nsec/(int64_t)1000000, ptm->tm_zone); } void log_error(const char* format, ...) { diff --git a/clib/logger_test.c b/clib/logger_test.c new file mode 100644 index 0000000..9f8add1 --- /dev/null +++ b/clib/logger_test.c @@ -0,0 +1,25 @@ +/* + * Copyright 2022 Oleg Borodin + */ + +#include +#include +#include +#include + +#include +#include + + +void test01(void) { + log_init(); + log_debug("qwerty"); + log_debug("qwerty: %s", "12345"); + log_debug("qwerty: %d", 12345); + log_destroy(); +} + +int main(void) { + test01(); + return 0; +}