work in progess

This commit is contained in:
Олег Бородин
2025-10-15 17:49:07 +02:00
parent ba9f88879d
commit f35050a4ef
7 changed files with 83 additions and 52 deletions

View File

@@ -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 *~

View File

@@ -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 *~

View File

@@ -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 *~

View File

@@ -7,15 +7,25 @@
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include <strings.h>
#include <cllexer.h>
#include <clcomp.h>
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;
}

View File

@@ -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);

View File

@@ -11,54 +11,22 @@
#include <clconfig.h>
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;
}

View File

@@ -11,8 +11,8 @@
#include <vmapper.h>
typedef struct {
clcomp_t lexer;
vmapper_t mapper;
clcomp_t comp;
vmapper_t vmapper;
int argc;
char ** argv;
} clconfig_t;