diff options
author | bpc2003 <wpesfriendnva@gmail.com> | 2025-05-19 13:56:32 -0400 |
---|---|---|
committer | bpc2003 <wpesfriendnva@gmail.com> | 2025-05-19 13:56:32 -0400 |
commit | d697d2c3b3d74e642691d8be36ff771485e02924 (patch) | |
tree | a3d923d0a1be61514ed27ae22fe61f760e1075a9 | |
parent | 0575736fd33a60796ce29c0241da2492363fe24d (diff) |
Made decoder smaller
-rw-r--r-- | src/include/xml/decode.c | 95 | ||||
-rw-r--r-- | src/test.c | 36 |
2 files changed, 70 insertions, 61 deletions
diff --git a/src/include/xml/decode.c b/src/include/xml/decode.c index e486a18..6a163bb 100644 --- a/src/include/xml/decode.c +++ b/src/include/xml/decode.c @@ -3,38 +3,28 @@ #include "xml.h" -static char *gettag(char *xml, int *pos); -static char *getvalue(char *xml, int *pos); -static attr_t *getattrs(char *parsed, char **tag, int *n_attrs); +static char *get_tag(char *xml, int *pos); +static attr_t *get_attrs(char *parsed, char **tag, int *n_attrs); + +static int check_closing_tag(char *xml, int *pos, char *tag, int *err); +static void set_tag(char *xml, map_t **map, int *closed, int *pos); +static void set_value(char *xml, int *pos, map_t **map); -// TODO: make this smaller -// TODO: add attribute parsing map_t *decode(char *xml, int *pos, int *len) { - if (*len) - ++(*len); - else - *len = 1; - map_t *decoded = calloc(1, sizeof(map_t)); + if (*len) ++(*len); + else *len = 1; + map_t *decoded = calloc(1, sizeof(map_t)); int err = 0, closed = 1; for (int i = *pos; i < strlen(xml); ++i) { - if (!strncmp(xml + i, "</", 2)) { - i += 2; - char *tmp = gettag(xml, &i); - if (!strcmp(decoded->tag, tmp)) + if (check_closing_tag(xml, &i, decoded->tag, &err)) { + if (!err) *pos = i; - else - err = 1; - free(tmp); - goto end; - } else if (xml[i] == '<' && closed) { - ++i; - decoded->attrs = - getattrs(gettag(xml, &i), - &(decoded->tag), &(decoded->n_attrs)); - closed = 0; - } else if (xml[i] == '<' && !closed) { + break; + } else if (xml[i] == '<' && closed) + set_tag(xml, &decoded, &closed, &i); + else if (xml[i] == '<' && !closed) { map_t *ndec = decode(xml, &i, &(decoded->n)); decoded->size = sizeof(map_t); if (decoded->n > 1) @@ -43,21 +33,17 @@ map_t *decode(char *xml, int *pos, int *len) decoded->payload = calloc(1, sizeof(map_t)); ((map_t *) decoded->payload)[decoded->n - 1] = *ndec; free(ndec); - } else { - decoded->payload = getvalue(xml, &i); - decoded->size = sizeof(char); - decoded->n = strlen(decoded->payload); - } + } else + set_value(xml, &i, &decoded); } - end: - if (err) { - free(decoded); - decoded = NULL; - } - return decoded; + if (err) { + free(decoded); + decoded = NULL; + } + return decoded; } -static char *gettag(char *xml, int *pos) +static char *get_tag(char *xml, int *pos) { int len, i; for (i = *pos, len = 0; xml[i] != '>' && i < strlen(xml); ++i, ++len) @@ -70,20 +56,22 @@ static char *gettag(char *xml, int *pos) return title; } -static char *getvalue(char *xml, int *pos) +static void set_value(char *xml, int *pos, map_t **map) { int len, i; for (i = *pos, len = 0; xml[i] != '<' && i < strlen(xml); ++i, ++len) ; if (i >= strlen(xml)) - return NULL; - char *value = calloc(len + 1, sizeof(char)); - strncpy(value, xml + *pos, len); + return; + + (*map)->payload = calloc(len + 1, sizeof(char)); + strncpy((*map)->payload, xml + *pos, len); + (*map)->size = sizeof(char); + (*map)->n = strlen((*map)->payload); *pos += len - 1; - return value; } -static attr_t *getattrs(char *parsed, char **tag, int *n_attrs) +static attr_t *get_attrs(char *parsed, char **tag, int *n_attrs) { attr_t *attrs; char *iter = strtok(parsed, " "); @@ -128,3 +116,24 @@ static attr_t *getattrs(char *parsed, char **tag, int *n_attrs) free(parsed); return attrs; } + +static void set_tag(char *xml, map_t **map, int *closed, int *pos) +{ + (*pos)++; + (*map)->attrs = get_attrs(get_tag(xml, pos), + &((*map)->tag), &((*map)->n_attrs)); + *closed = 0; +} + +static int check_closing_tag(char *xml, int *pos, char *tag, int *err) +{ + if (!strncmp(xml + *pos, "</", 2)) { + *pos += 2; + char *tmp = get_tag(xml, pos); + if (strcmp(tag, tmp)) + *err = 1; + free(tmp); + return 1; + } + return 0; +} @@ -212,38 +212,38 @@ void test_encode(void) map->payload = (map_t []) { { .attrs = (attr_t []) { - { .id = "id", .value = "0" } + { .id = "id", .value = "0" } }, .n_attrs = 1, .tag = "document", .payload = (map_t []) { - { - .attrs = NULL, - .n_attrs = 0, - .tag = "test", - .payload = "test", - .size = sizeof(char), - .n = 4 - } + { + .attrs = NULL, + .n_attrs = 0, + .tag = "test", + .payload = "test", + .size = sizeof(char), + .n = 4 + } }, .size = sizeof(map_t), .n = 1 }, { .attrs = (attr_t []) { - { .id = "id", .value = "1" } + { .id = "id", .value = "1" } }, .n_attrs = 1, .tag = "document", .payload = (map_t []) { - { - .attrs = NULL, - .n_attrs = 0, - .tag = "test", - .payload = "test", - .size = sizeof(char), - .n = 4 - } + { + .attrs = NULL, + .n_attrs = 0, + .tag = "test", + .payload = "test", + .size = sizeof(char), + .n = 4 + } }, .size = sizeof(map_t), .n = 1 |