diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/xml/decode.c | 60 |
1 files changed, 28 insertions, 32 deletions
diff --git a/src/include/xml/decode.c b/src/include/xml/decode.c index 06c5bf6..a405e97 100644 --- a/src/include/xml/decode.c +++ b/src/include/xml/decode.c @@ -6,46 +6,43 @@ static char *gettag(char *xml, int *pos); static char *getvalue(char *xml, int *pos); +// TODO: make this smaller map_t *decode(char *xml, int *pos, int *len) { - printf("%s\n", xml); if (*len) ++(*len); else *len = 1; map_t *decoded = calloc(1, sizeof(map_t)); - decoded->payload = NULL; - char *tag = NULL; - int err = 0; + int err = 0, closed = 1; for (int i = *pos; i < strlen(xml); ++i) { - if (xml[i] == '<') { + if (!strncmp(xml + i, "</", 2)) { + i += 2; + char *tmp = gettag(xml, &i); + if (!strcmp(decoded->tag, tmp)) + *pos = i; + else + err = 1; + free(tmp); + goto end; + } else if (xml[i] == '<' && closed) { ++i; - if (xml[i] == '/') { - ++i; - char *tmp = gettag(xml, &i); - if (!strcmp(tag, tmp)) { - free(tmp); - *pos = i + 1; - goto end; - } else { - err = 1; - free(tmp); - goto end; - } - } - else if (!tag) - tag = gettag(xml, &i); - } else if (xml[i] == '>') { - ++i; - if (xml[i] == '<') { - map_t *ndec = decode(xml, &i, &(decoded->n)); - free(ndec); - } else { - char *value = getvalue(xml, &i); - printf("%s\n", value); - free(value); - } + decoded->tag = gettag(xml, &i); + closed = 0; + } else if (xml[i] == '<' && !closed) { + map_t *ndec = decode(xml, &i, &(decoded->n)); + decoded->size = sizeof(map_t); + if (decoded->n > 1) + decoded->payload = realloc(decoded->payload, decoded->n * sizeof(map_t)); + else + 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); } } end: @@ -53,7 +50,6 @@ map_t *decode(char *xml, int *pos, int *len) free(decoded); decoded = NULL; } - free(tag); return decoded; } @@ -63,7 +59,7 @@ static char *gettag(char *xml, int *pos) for (i = *pos, len = 0; xml[i] != '>'; ++i, ++len) ; char *title = calloc(len + 1, sizeof(char)); strncpy(title, xml + *pos, len); - *pos += len - 1; + *pos += len; return title; } |