From f35050a4efa5777bbf949d1df323d5bbaff70a78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=91=D0=BE=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Wed, 15 Oct 2025 17:49:07 +0200 Subject: [PATCH] work in progess --- Makefile | 4 +-- Makefile.am | 4 +-- Makefile.in | 4 +-- libxtools/clcomp.c | 70 +++++++++++++++++++++++++++++++++++++++++--- libxtools/clcomp.h | 5 ++-- libxtools/clconfig.c | 44 ++++------------------------ libxtools/clconfig.h | 4 +-- 7 files changed, 83 insertions(+), 52 deletions(-) diff --git a/Makefile b/Makefile index 66145e3..69feb81 100644 --- a/Makefile +++ b/Makefile @@ -929,8 +929,8 @@ test:: libxtools/cllexer_test test:: libxtools/clcomp_test cd libxtools && ./clcomp_test -#test: libxtools/clconfig_test -# cd libxtools && ./clconfig_test +test:: libxtools/clconfig_test + cd libxtools && ./clconfig_test clean-local: rm -f *~ diff --git a/Makefile.am b/Makefile.am index cd74ad0..002e93c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -69,8 +69,8 @@ test:: libxtools/cllexer_test test:: libxtools/clcomp_test cd libxtools && ./clcomp_test -#test: libxtools/clconfig_test -# cd libxtools && ./clconfig_test +test:: libxtools/clconfig_test + cd libxtools && ./clconfig_test clean-local: rm -f *~ diff --git a/Makefile.in b/Makefile.in index c16dcad..4ad2616 100644 --- a/Makefile.in +++ b/Makefile.in @@ -929,8 +929,8 @@ test:: libxtools/cllexer_test test:: libxtools/clcomp_test cd libxtools && ./clcomp_test -#test: libxtools/clconfig_test -# cd libxtools && ./clconfig_test +test:: libxtools/clconfig_test + cd libxtools && ./clconfig_test clean-local: rm -f *~ diff --git a/libxtools/clcomp.c b/libxtools/clcomp.c index c481202..2ff8eb5 100644 --- a/libxtools/clcomp.c +++ b/libxtools/clcomp.c @@ -7,15 +7,25 @@ #include #include #include +#include #include #include -void clcomp_init(clcomp_t* comp, vmapper_t* mapper, char** argv, int argc) { +static char* strcopy(char* src) { + size_t srcsize = strlen(src) + 1; + char* dst = malloc(srcsize); + memset(dst, '\0', srcsize); + strcpy(dst, src); + return dst; +} + +void clcomp_init(clcomp_t* comp, vmapper_t* vmapper, char** argv, int argc) { comp->argv = argv; comp->argc = argc; comp->argn = 1; - comp->mapper = mapper; + comp->pos = 0; + comp->vmapper = vmapper; if (comp->argc > comp->argn) { cllexer_init(&(comp->lexer), comp->argv[comp->argn]); } @@ -38,19 +48,71 @@ int clcomp_gettok(clcomp_t* comp, char* token) { return toktype; } - int clcomp_parse(clcomp_t* comp) { char token[1024]; int toktype = TOKEN_NULL; int i = 0; + char* key = NULL; + char* val = NULL; + while (toktype != TOKEN_ENDF) { toktype = clcomp_gettok(comp, token); - printf("cllexer_gettok res: %d: %d [%s]\n", i, toktype, token); i++; + printf("cllexer_parse res: %d: %d [%s]\n", i, toktype, token); + switch (comp->pos) { + case 0: { + if (toktype == TOKEN_PREF) { + comp->pos = 1; + printf("pos %d: TOKEN_PREF %s\n", comp->pos, token); + continue; + } else { + continue; + } + } + case 1: { + if (toktype == TOKEN_WORD) { + comp->pos = 2; + key = strcopy(token); + printf("pos %d: TOKEN_WORD %s\n", comp->pos, token); + continue; + } else { + goto error; + } + } + case 2: { + if (toktype == TOKEN_DELIM || toktype == TOKEN_SPACE) { + comp->pos = 3; + printf("pos %d: TOKEN_DELIM %s\n", comp->pos, token); + continue; + } else { + goto error; + } + } + case 3: { + if (toktype == TOKEN_WORD) { + comp->pos = 0; + printf("pos %d: TOKEN_WORD %s\n", comp->pos, token); + val = strcopy(token); + printf("keyval = [%s], [%s]\n", key, val); + vmapper_set(comp->vmapper, key, val); + free(key); + free(val); + continue; + } else { + goto error; + } + } + + } } return 0; + + error: + free(key); + free(val); + return -1; } diff --git a/libxtools/clcomp.h b/libxtools/clcomp.h index c1fd663..30137e7 100644 --- a/libxtools/clcomp.h +++ b/libxtools/clcomp.h @@ -14,11 +14,12 @@ typedef struct { char** argv; int argc; int argn; + int pos; cllexer_t lexer; - vmapper_t* mapper; + vmapper_t* vmapper; } clcomp_t; -void clcomp_init(clcomp_t* clcomp, vmapper_t* mapper, char** argv, int argc); +void clcomp_init(clcomp_t* clcomp, vmapper_t* vmapper, char** argv, int argc); int clcomp_gettok(clcomp_t* clcomp, char* token); int clcomp_parse(clcomp_t* clcomp); void clcomp_destroy(clcomp_t* clcomp); diff --git a/libxtools/clconfig.c b/libxtools/clconfig.c index 1e9d3ad..6ec479e 100644 --- a/libxtools/clconfig.c +++ b/libxtools/clconfig.c @@ -11,54 +11,22 @@ #include void clconfig_init(clconfig_t* clconfig, int argc, char **argv) { - //clcomp_init(&(clconfig->lexer), argv, argc); - vmapper_init(&(clconfig->mapper)); + vmapper_init(&(clconfig->vmapper)); + clcomp_init(&(clconfig->comp), &(clconfig->vmapper), argv, argc); } int clconfig_bind(clconfig_t* clconfig, int type, char* name, void* ptr) { - vmapper_t* vmapper = &(clconfig->mapper); + vmapper_t* vmapper = &(clconfig->vmapper); return vmapper_bind(vmapper, type, name, ptr); } int clconfig_parse(clconfig_t* clconfig) { - - char token[1024]; - int toktype = TOKEN_NULL; - int i = 0; - while (toktype != TOKEN_ENDF) { - toktype = clcomp_gettok(&(clconfig->lexer), token); - printf("clconfig_parse %d: %d [%s]\n", i, toktype, token); - i++; - - - } + clcomp_parse(&(clconfig->comp)); return 0; } void clconfig_destroy(clconfig_t* clconfig) { - clcomp_destroy(&(clconfig->lexer)); - vmapper_destroy(&(clconfig->mapper)); + clcomp_destroy(&(clconfig->comp)); + vmapper_destroy(&(clconfig->vmapper)); } -int __main(int argc, char **argv) { - (void)argc; - (void)argv; - -/* - char*_argv[] = { argv[0], "--qwerty=-num12345", "--foo=-bar" }; - int _argc = 2; - - clcomp_t clcomp; - clcomp_init(&clcomp, _argv, _argc); - - char token[1024]; - int toktype = TOKEN_NULL; - int i = 0; - while (toktype != TOKEN_ENDF) { - toktype = clcomp_gettok(&lex, token); - printf("%d: %d [%s]\n", i, toktype, token); - i++; - } -*/ - return 0; -} diff --git a/libxtools/clconfig.h b/libxtools/clconfig.h index e0e1dda..086fdfc 100644 --- a/libxtools/clconfig.h +++ b/libxtools/clconfig.h @@ -11,8 +11,8 @@ #include typedef struct { - clcomp_t lexer; - vmapper_t mapper; + clcomp_t comp; + vmapper_t vmapper; int argc; char ** argv; } clconfig_t;