From baee5248699451f570f6fdfe13ed53e4fe6e9f65 Mon Sep 17 00:00:00 2001 From: kaa Date: Sun, 9 Jul 2023 09:08:23 -0700 Subject: As it turns out, getline() is a POSIX extension, not included in Windows tcc or MinGW. --- neols.c | 13 ++++++++----- shared.h | 23 ++++++++++++++++++++++- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/neols.c b/neols.c index 01ce98c..a288fee 100644 --- a/neols.c +++ b/neols.c @@ -1,7 +1,11 @@ #include #include #include +#include "shared.h" +/* A majority of lines in files.json +are less than 80 characters long. */ +#define GUESS 80 /* Each informative line has 6 spaces, a quote, then the data type, then a quote, then a colon, then a space, then a quote, @@ -93,15 +97,15 @@ main(int argc, char **argv) else dir = argv[i]; } - char *line = NULL; + char *line; /* The various statistics related to each entry are stored, one entry at a time. A path may be any size, so each line need be handled by realloc. */ char *path = NULL, *updated_at = NULL, *sha1_hash = NULL; int is_directory = 0, size = 0; - int len; - unsigned long line_size = 0; - while ((len = getline(&line, &line_size, in)) > 0) { + int end, len; + for (end = 0; ! end;) { + line = storeline(in, &end, &len, GUESS); /* Only on lines terminating an entry, '}' is the fifth character. The ninth character of each data line is unique. */ @@ -139,7 +143,6 @@ main(int argc, char **argv) } else if (line[8] == 'h') { sha1_hash = line; } - line = NULL; } return 0; } diff --git a/shared.h b/shared.h index 740984d..b4232ae 100644 --- a/shared.h +++ b/shared.h @@ -1 +1,22 @@ -char *site = "https://kaa.neocities.org/"; +static char * +storeline(FILE *in, int *end, int *len, int guess) +{ + static char *line; + line = calloc(guess, sizeof(char)); + int i = 0, buflen = guess; + char ch; + while ((ch = fgetc(in)) != EOF && ch != '\n') { + if (i == buflen - 1) { + buflen += guess; + line = realloc(line, buflen * sizeof(char)); + } + line[i] = ch; + ++i; + } + line[i] = '\0'; + *len = i; + if (ch == EOF) + *end = 1; + + return line; +} -- cgit v1.2.3