From 5bb744d350a68ff75e5af32b9070983b7e0aa716 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Fri, 9 May 2025 17:44:20 -0400 Subject: Have recursive decoder mostly working, now need to find way to store payloads safely --- src/include/xml/decode.c | 16 +++++++--------- src/include/xml/xml.h | 2 +- src/test.c | 6 +++--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/include/xml/decode.c b/src/include/xml/decode.c index 2b5ca67..06c5bf6 100644 --- a/src/include/xml/decode.c +++ b/src/include/xml/decode.c @@ -6,7 +6,7 @@ static char *gettag(char *xml, int *pos); static char *getvalue(char *xml, int *pos); -map_t *decode(char *xml, int *len) +map_t *decode(char *xml, int *pos, int *len) { printf("%s\n", xml); if (*len) @@ -18,7 +18,7 @@ map_t *decode(char *xml, int *len) char *tag = NULL; int err = 0; - for (int i = 0; i < strlen(xml); ++i) { + for (int i = *pos; i < strlen(xml); ++i) { if (xml[i] == '<') { ++i; if (xml[i] == '/') { @@ -26,6 +26,7 @@ map_t *decode(char *xml, int *len) char *tmp = gettag(xml, &i); if (!strcmp(tag, tmp)) { free(tmp); + *pos = i + 1; goto end; } else { err = 1; @@ -37,21 +38,18 @@ map_t *decode(char *xml, int *len) tag = gettag(xml, &i); } else if (xml[i] == '>') { ++i; - // TODO: figure out recursive calls if (xml[i] == '<') { - map_t *ndec = decode(xml + i, &(decoded->n)); + map_t *ndec = decode(xml, &i, &(decoded->n)); free(ndec); } else { - decoded->payload = getvalue(xml, &i); - decoded->size = sizeof(char); - decoded->n = strlen(decoded->payload); - printf("%s\n", (char *) decoded->payload); + char *value = getvalue(xml, &i); + printf("%s\n", value); + free(value); } } } end: if (err) { - free(decoded->payload); free(decoded); decoded = NULL; } diff --git a/src/include/xml/xml.h b/src/include/xml/xml.h index 4ee80b7..d64c61b 100644 --- a/src/include/xml/xml.h +++ b/src/include/xml/xml.h @@ -20,7 +20,7 @@ typedef struct { /* decode: decodes the provided xml statement into a map_t */ -map_t *decode(char *xml, int *len); +map_t *decode(char *xml, int *pos, int *len); /* encode: encodes the provided map_t into a xml statement */ char *encode(map_t *map, int len); diff --git a/src/test.c b/src/test.c index 35e6adf..57ef27a 100644 --- a/src/test.c +++ b/src/test.c @@ -262,9 +262,9 @@ void test_encode(void) void test_decode(void) { char *xml = - "value1value2"; - int len = 0; - map_t *map = decode(xml, &len); + "value1value2"; + int len = 0, start = 0; + map_t *map = decode(xml, &start, &len); free(map); } -- cgit v1.2.3