#include #include #include #include #include #include #include "gemtext.h" static int _case_text(struct gemtext *line, char **out, size_t *outlen) { char *app; *outlen += gemtext_text_strlen(line); *outlen += 7; /*

*/ app = realloc(*out, (*outlen+1)); if (app == NULL) return -1; *out = app; strlcat(*out, "

", (*outlen+1)); strlcat(*out, gemtext_text_string(line), (*outlen)+1); strlcat(*out, "

", (*outlen)+1); return 0; } static int _case_link(struct gemtext *line, char **out, size_t *outlen) { char *app; *outlen += gemtext_link_link_strlen(line); *outlen += gemtext_link_label_strlen(line); *outlen += 22; /*

*/ app = realloc(*out, (*outlen)+1); if (app == NULL) return -1; *out = app; strlcat(*out, "

", (*outlen)+1); if (gemtext_link_has_label(line)) strlcat(*out, gemtext_link_label_string(line), (*outlen)+1); strlcat(*out, "

", (*outlen)+1); return 0; } static int _case_pre(struct gemtext *line, char **out, size_t *outlen) { char *app; *outlen += gemtext_pre_strlen(line); *outlen += 18; /*

*/ app = realloc(*out, (*outlen)+1); if (app == NULL) return -1; *out = app; strlcat(*out, "

", (*outlen)+1);
	strlcat(*out, gemtext_pre_string(line), (*outlen)+1);
	strlcat(*out, "

", (*outlen)+1); return 0; } static int _case_h1(struct gemtext *line, char **out, size_t *outlen) { char *app; *outlen += gemtext_h1_strlen(line); *outlen += 9; /*

*/ app = realloc(*out, (*outlen)+1); if (app == NULL) return -1; *out = app; strlcat(*out, "

", (*outlen)+1); strlcat(*out, gemtext_h1_string(line), (*outlen)+1); strlcat(*out, "

", (*outlen)+1); return 0; } static int _case_h2(struct gemtext *line, char **out, size_t *outlen) { char *app; *outlen += gemtext_h2_strlen(line); *outlen += 9; /*

*/ app = realloc(*out, (*outlen)+1); if (app == NULL) return -1; *out = app; strlcat(*out, "

", (*outlen)+1); strlcat(*out, gemtext_h2_string(line), (*outlen)+1); strlcat(*out, "

", (*outlen)+1); return 0; } static int _case_h3(struct gemtext *line, char **out, size_t *outlen) { char *app; *outlen += gemtext_h3_strlen(line); *outlen += 9; /*

*/ app = realloc(*out, (*outlen)+1); if (app == NULL) return -1; *out = app; strlcat(*out, "

", (*outlen)+1); strlcat(*out, gemtext_h3_string(line), (*outlen)+1); strlcat(*out, "

", (*outlen)+1); return 0; } static int _case_ul(struct gemtext *line, char **out, size_t *outlen) { char *app; *outlen += gemtext_ul_strlen(line); *outlen += 9; /*
  • */ app = realloc(*out, (*outlen)+1); if (app == NULL) return -1; *out = app; strlcat(*out, "
  • ", (*outlen)+1); strlcat(*out, gemtext_ul_string(line), (*outlen)+1); strlcat(*out, "
  • ", (*outlen)+1); return 0; } static int _case_qt(struct gemtext *line, char **out, size_t *outlen) { char *app; *outlen += gemtext_qt_strlen(line); *outlen += 25; /*
    */ app = realloc(*out, (*outlen)+1); if (app == NULL) return -1; *out = app; strlcat(*out, "
    ", (*outlen)+1); strlcat(*out, gemtext_qt_string(line), (*outlen)+1); strlcat(*out, "
    ", (*outlen)+1); return 0; } int gemtext_list_encode_to_html(struct gemtext **list, char **out, size_t *outlen) { char *app; int i; int ulindic; *out = NULL; *outlen = 0; ulindic = 0; *out = malloc(1); if (*out == NULL) return -1; *out[0] = '\0'; /* for strlcat() */ for (i = 0; list[i] != NULL; i++) { if (gemtext_type(list[i]) != GEMTEXT_UL && ulindic) { *outlen += 5; /* */ app = realloc(*out, (*outlen)+1); if (app == NULL) { free(*out); return -1; } *out = app; strlcat(*out, "", (*outlen)+1); ulindic = 0; } switch (gemtext_type(list[i])) { case GEMTEXT_TEXT: if (_case_text(list[i], out, outlen) == -1) { free(*out); return -1; } break; case GEMTEXT_LINK: if (_case_link(list[i], out, outlen) == -1) { free(*out); return -1; } break; case GEMTEXT_PRE: if (_case_pre(list[i], out, outlen) == -1) { free(*out); return -1; } break; case GEMTEXT_H1: if (_case_h1(list[i], out, outlen) == -1) { free(*out); return -1; } break; case GEMTEXT_H2: if (_case_h2(list[i], out, outlen) == -1) { free(*out); return -1; } break; case GEMTEXT_H3: if (_case_h3(list[i], out, outlen) == -1) { free(*out); return -1; } break; case GEMTEXT_UL: if (!ulindic) { *outlen += 4; /*
      */ app = realloc(*out, (*outlen)+1); if (app == NULL) { free(*out); return -1; } *out = app; strlcat(*out, "
        ", (*outlen)+1); ulindic = 1; } if (_case_ul(list[i], out, outlen) == -1) { free(*out); return -1; } break; case GEMTEXT_QT: if (_case_qt(list[i], out, outlen) == -1) { free(*out); return -1; } break; } } return 0; } int gemtext_list_encode_to_html_fd(struct gemtext **list, int fd) { char *out; size_t len; if (gemtext_list_encode_to_html(list, &out, &len) == -1) return -1; if (write(fd, out, len) == -1) { free(out); return -1; } free(out); return 0; } int gemtext_list_encode_to_html_file(struct gemtext **list, const char *file) { int fd; fd = open(file, O_WRONLY|O_TRUNC|O_CREAT); if (fd == -1) return -1; /* file does not have to be owned by user, so errors are expected */ fchmod(fd, 0644); if (gemtext_list_encode_to_html_fd(list, fd) == -1) { close(fd); return -1; } close(fd); return 0; }