From 9b25546e5859f36d7fe5def6eb642fa94685f78b Mon Sep 17 00:00:00 2001 From: Matteo Bini Date: Mon, 15 Jul 2024 20:52:30 +0200 Subject: [PATCH] Standard input --- srohtml.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/srohtml.c b/srohtml.c index 76bc55d..168f3a5 100644 --- a/srohtml.c +++ b/srohtml.c @@ -11,6 +11,7 @@ #define FAVICON "data:image/gif;base64,R0lGODlhEAAQAKEAAAAAcP///wAAcAAAcCH5BAEKAAIALAAAAAAQABAAQAIwlBWZxxwAQWjtTQRvlZhTnGSfYT3eZ3WaE4mjGa1UasoH7c6tzYanfqmhJMKXglcAADs=" #define LANG_LEN 2 #define LINE_MAX 1000 +#define LINE_START 80 #define NOTES_START 8 #define NOTES_MAX_DIGITS 3 @@ -51,7 +52,7 @@ static void cmd_tm(const char *line); static void cmd_ur(const char *line); static void footer(void); static void footnotes(void); -static int fread_line(FILE *file, char **str, size_t *len); +static size_t fread_line(FILE *file, char **str, size_t *len); static void indent_str(char **str); static void page_head(void); static void print_help(void); @@ -570,26 +571,31 @@ footnotes(void) string_cat(&body, "\t\t\n"); } -int +size_t fread_line(FILE *file, char **str, size_t *len) { int c; - char *end; size_t i; - i = 0; - while ((c = fgetc(file)) && c != '\n' && c != EOF && i < LINE_MAX) - i++; - - *str = safe_malloc(i + 1); + if (*str == NULL) { + *len = LINE_START + 1; + *str = safe_malloc(sizeof(char) * *len); + } + + i = 0; + while ((c = fgetc(file)) && c != '\n' && c != EOF && i < LINE_MAX) { + if (i >= *len - 1) { + *len *= 2; + *str = safe_realloc(*str, sizeof(char) * *len); + } + (*str)[i] = c; + i++; + } - fseek(file, -i - 1, SEEK_CUR); - fread(*str, 1, i, file); (*str)[i] = '\0'; *len = i; - fseek(file, 1, SEEK_CUR); - return c == EOF ? EOF : c; + return c == EOF ? EOF : i; } void @@ -649,6 +655,8 @@ main (int argc, char *argv[]) sitography.size = NOTES_START; sitography.notes = malloc(sizeof(note) * sitography.size); + len = 0; + line = NULL; while (fread_line(in, &line, &len) != EOF) { if (!len) cmd_close(); @@ -669,6 +677,8 @@ main (int argc, char *argv[]) space = 1; } free(line); + len = 0; + line = NULL; } free(line); if (in != stdin)