summaryrefslogtreecommitdiff
path: root/xs_html.h
diff options
context:
space:
mode:
authordefault <nobody@localhost>2023-12-03 23:47:25 +0100
committerdefault <nobody@localhost>2023-12-03 23:47:25 +0100
commitb17aa7d5229c90724ca1b8c87f4ed62f46b6cb3f (patch)
treeeb8b0e311ca739286a5749ddaab6b102a7a2c9e3 /xs_html.h
parent5f047d46c0ad2dd2f1cf83f359ac1ad779cb67f8 (diff)
Backport from xs.
Diffstat (limited to 'xs_html.h')
-rw-r--r--xs_html.h57
1 files changed, 23 insertions, 34 deletions
diff --git a/xs_html.h b/xs_html.h
index 58a50b6..297b989 100644
--- a/xs_html.h
+++ b/xs_html.h
@@ -203,61 +203,50 @@ xs_html *_xs_html_container(xs_html *var[])
void xs_html_render_f(xs_html *h, FILE *f)
/* renders the tag and its subtags into a file */
{
- xs_html *st;
+ if (h == NULL)
+ return;
switch (h->type) {
case XS_HTML_TAG:
- case XS_HTML_SCTAG:
fprintf(f, "<%s", h->content);
- /* render the attributes */
- st = h->f_attr;
- while (st) {
- xs_html *nst = st->next;
- xs_html_render_f(st, f);
- st = nst;
- }
+ /* attributes */
+ xs_html_render_f(h->f_attr, f);
- if (h->type == XS_HTML_SCTAG) {
- /* self-closing tags should not have subtags */
- fprintf(f, "/>");
- }
- else {
- fprintf(f, ">");
+ fprintf(f, ">");
- /* render the subtags */
- st = h->f_tag;
- while (st) {
- xs_html *nst = st->next;
- xs_html_render_f(st, f);
- st = nst;
- }
+ /* sub-tags */
+ xs_html_render_f(h->f_tag, f);
- fprintf(f, "</%s>", h->content);
- }
+ fprintf(f, "</%s>", h->content);
+ break;
+
+ case XS_HTML_SCTAG:
+ fprintf(f, "<%s", h->content);
+ /* attributes */
+ xs_html_render_f(h->f_attr, f);
+
+ fprintf(f, "/>");
break;
case XS_HTML_CONTAINER:
- /* render the subtags and nothing more */
- st = h->f_tag;
- while (st) {
- xs_html *nst = st->next;
- xs_html_render_f(st, f);
- st = nst;
- }
-
+ /* sub-tags */
+ xs_html_render_f(h->f_tag, f);
break;
case XS_HTML_ATTR:
- fprintf(f, " %s", h->content);
- break;
+ fprintf(f, " ");
+ /* fallthrough */
case XS_HTML_TEXT:
fprintf(f, "%s", h->content);
break;
}
+ /* follow the chain */
+ xs_html_render_f(h->next, f);
+
xs_free(h->content);
xs_free(h);
}