sfeed

Simple RSS and Atom feed parser
git clone https://git.sinitax.com/codemadness/sfeed
Log | Files | Refs | README | LICENSE | Upstream | sfeed.txt

commit dccfd3fd43a4fadf7fb8c4c9155df1dc406e7738
parent 1dff8155ac38dc37efab4b023f220926e5410e05
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date:   Sun, 24 Dec 2017 13:07:11 +0100

add latest (DEBUG version) of sfeed_tail

Diffstat:
Msfeed_tail.c | 50+++++++++++++++++++++++++++++++++++++-------------
1 file changed, 37 insertions(+), 13 deletions(-)

diff --git a/sfeed_tail.c b/sfeed_tail.c @@ -11,7 +11,7 @@ #include "util.h" static int firsttime; -static int runs; +static int sleepsecs; static char *line; static size_t linesize; time_t comparetime; @@ -31,9 +31,9 @@ linecmp(struct line *e1, struct line *e2) if ((r = strcmp(e1->id, e2->id))) return r; - if ((r = strcmp(e1->link, e2->link))) + else if ((r = strcmp(e1->title, e2->title))) return r; - return strcmp(e1->title, e2->title); + return strcmp(e1->link, e2->link); } RB_HEAD(linetree, line) head = RB_INITIALIZER(&head); RB_GENERATE_STATIC(linetree, line, entry, linecmp) @@ -61,10 +61,11 @@ static void printfeed(FILE *fp, const char *feedname) { struct line *add, search; - char *fields[FieldLast]; + char *fields[FieldLast], *s; ssize_t linelen; time_t parsedtime; struct tm *tm; + int i; while ((linelen = getline(&line, &linesize, fp)) > 0) { if (line[linelen - 1] == '\n') @@ -73,7 +74,8 @@ printfeed(FILE *fp, const char *feedname) if (!parseline(line, fields)) break; parsedtime = 0; - strtotime(fields[FieldUnixTimestamp], &parsedtime); + if (strtotime(fields[FieldUnixTimestamp], &parsedtime)) + continue; if (!(tm = localtime(&parsedtime))) err(1, "localtime"); @@ -105,13 +107,26 @@ printfeed(FILE *fp, const char *feedname) if (firsttime) continue; - if (feedname[0]) + /* output parsed line: it may not be the same as the input. */ + for (i = 0; i < FieldLast; i++) { + if (i) + putchar('\t'); + fputs(fields[i], stdout); + } + putchar('\n'); + fflush(stdout); + +#if 0 + if (fields[FieldFeedName][0]) + printf("%-15.15s ", fields[FieldFeedName]); + else if (feedname[0]) printf("%-15.15s ", feedname); printf("%04d-%02d-%02d %02d:%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min); printutf8pad(stdout, fields[FieldTitle], 70, ' '); printf(" %s\n", fields[FieldLink]); +#endif } } @@ -120,7 +135,7 @@ main(int argc, char *argv[]) { char *name; FILE *fp; - int i; + int i, slept = 0; if (pledge("stdio rpath", NULL) == -1) err(1, "pledge"); @@ -130,7 +145,12 @@ main(int argc, char *argv[]) if (pledge(argc == 1 ? "stdio" : "stdio rpath", NULL) == -1) err(1, "pledge"); - for (runs = 0, firsttime = (argc > 1); ; ++runs, firsttime = 0) { + if (argc == 1) + sleepsecs = 1; + else + sleepsecs = 300; + + for (firsttime = (argc > 1); ; firsttime = 0) { if ((comparetime = time(NULL)) == -1) err(1, "time"); /* 1 day is old news */ @@ -148,12 +168,16 @@ main(int argc, char *argv[]) fclose(fp); } } - sleep(300); - /* gc once every 12 runs, each run takes some CPU time and - a 5 minute sleep */ - if (runs && (runs % 12) == 0) { + // DEBUG: TODO: gc first run. + gc(); + + sleep(sleepsecs); + slept += sleepsecs; + + /* gc once every hour (excluding run-time) */ + if (slept >= 3600) { gc(); - runs = 0; + slept = 0; } } return 0;