iterate on previous commit which adds $SFEED_NEW_MAX_SECS - sfeed - RSS and Atom parser
 (HTM) git clone git://git.codemadness.org/sfeed
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit bdcbf8589716c047a732db3cc349ee6114ccc25f
 (DIR) parent ccee88cb02cb54f586d22c53e8bb8865817c3dc4
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sun,  7 May 2023 12:39:26 +0200
       
       iterate on previous commit which adds $SFEED_NEW_MAX_SECS
       
       Separate the common pattern to get the time to compare new items in format
       tools to the new util function: getcomparetime().
       
       Some changes and notes:
       - Change it so it is OK to set this value to 0 or negative (in the future).
       - sfeed_curses: truncating newmaxsecs to an int would limit the value too much.
       - Just use strtotime() and parse the value to time_t. This is a signed long
         (32-bit, until 2038) or signed long long (64-bit) on most platforms.
       - sfeed_curses gets the comparison time on reload aswell and it needs errno =
         0, because it uses die(). time() is not guaranteed to set an errno if it fails.
       - Rename environment variable to $SFEED_NEW_AGE.
       
       Diffstat:
         M README                              |       6 +++---
         M sfeed_curses.1                      |       2 +-
         M sfeed_curses.c                      |      13 +++----------
         M sfeed_frames.1                      |       2 +-
         M sfeed_frames.c                      |      17 +++--------------
         M sfeed_gopher.1                      |       2 +-
         M sfeed_gopher.c                      |      17 +++--------------
         M sfeed_html.1                        |       2 +-
         M sfeed_html.c                        |      17 +++--------------
         M sfeed_plain.1                       |       2 +-
         M sfeed_plain.c                       |      18 +++---------------
         M util.c                              |      18 ++++++++++++++++++
         M util.h                              |       1 +
       
       13 files changed, 42 insertions(+), 75 deletions(-)
       ---
 (DIR) diff --git a/README b/README
       @@ -290,9 +290,9 @@ Just like the other format programs included in sfeed you can run it like this:
                sfeed_curses < ~/.sfeed/feeds/xkcd
        
        By default sfeed_curses marks the items of the last day as new/bold. This limit
       -might be overridden by setting the environment variable $SFEED_NEW_MAX_SECS to
       -the desired maximum in seconds. To manage read/unread items in a different way
       -a plain-text file with a list of the read URLs can be used. To enable this
       +might be overridden by setting the environment variable $SFEED_NEW_AGE to the
       +desired maximum in seconds. To manage read/unread items in a different way a
       +plain-text file with a list of the read URLs can be used. To enable this
        behaviour the path to this file can be specified by setting the environment
        variable $SFEED_URL_FILE to the URL file:
        
 (DIR) diff --git a/sfeed_curses.1 b/sfeed_curses.1
       @@ -208,7 +208,7 @@ SIGWINCH.
        Read and process a sequence of keys as input commands from this environment
        variable first, afterwards it reads from the tty as usual.
        This can be useful to automate certain actions at the start.
       -.It Ev SFEED_NEW_MAX_SECS
       +.It Ev SFEED_NEW_AGE
        Overwrite the maximum age in seconds to mark feeds as new.
        By default this is 86400, which equals one day.
        .It Ev SFEED_PIPER
 (DIR) diff --git a/sfeed_curses.c b/sfeed_curses.c
       @@ -191,7 +191,6 @@ static int plumberia = 0; /* env variable: $SFEED_PLUMBER_INTERACTIVE */
        static int piperia = 1; /* env variable: $SFEED_PIPER_INTERACTIVE */
        static int yankeria = 0; /* env variable: $SFEED_YANKER_INTERACTIVE */
        static int lazyload = 0; /* env variable: $SFEED_LAZYLOAD */
       -static int newmaxsecs = 86400; /* env variable: $SFEED_NEW_MAX_SECS */
        
        int
        ttywritef(const char *fmt, ...)
       @@ -1321,9 +1320,8 @@ feeds_load(struct feed *feeds, size_t nfeeds)
                size_t i;
        
                errno = 0;
       -        if ((comparetime = time(NULL)) == (time_t)-1)
       -                die("time");
       -        comparetime -= newmaxsecs;
       +        if ((comparetime = getcomparetime()) == (time_t)-1)
       +                die("getcomparetime");
        
                for (i = 0; i < nfeeds; i++) {
                        f = &feeds[i];
       @@ -1967,7 +1965,7 @@ main(int argc, char *argv[])
                struct pane *p;
                struct feed *f;
                struct row *row;
       -        char *name, *tmp, *endptr;
       +        char *name, *tmp;
                char *search = NULL; /* search text */
                int button, ch, fd, i, keymask, release, x, y;
                off_t pos;
       @@ -1997,11 +1995,6 @@ main(int argc, char *argv[])
                        markunreadcmd = tmp;
                if ((tmp = getenv("SFEED_LAZYLOAD")))
                        lazyload = !strcmp(tmp, "1");
       -        if ((tmp = getenv("SFEED_NEW_MAX_SECS"))) {
       -                newmaxsecs = (int) strtol(tmp, &endptr, 10);
       -                if (*tmp == '\0' || *endptr != '\0' || newmaxsecs <= 0)
       -                        err(1, "cannot parse $SFEED_NEW_MAX_SECS");
       -  }
                urlfile = getenv("SFEED_URL_FILE"); /* can be NULL */
                cmdenv = getenv("SFEED_AUTOCMD"); /* can be NULL */
        
 (DIR) diff --git a/sfeed_frames.1 b/sfeed_frames.1
       @@ -40,7 +40,7 @@ The HTML file of the menu frame which contains navigation "anchor" links (like
        .El
        .Sh ENVIRONMENT VARIABLES
        .Bl -tag -width Ds
       -.It Ev SFEED_NEW_MAX_SECS
       +.It Ev SFEED_NEW_AGE
        Overwrite the maximum age in seconds to mark feeds as new.
        By default this is 86400, which equals one day.
        .El
 (DIR) diff --git a/sfeed_frames.c b/sfeed_frames.c
       @@ -77,9 +77,8 @@ int
        main(int argc, char *argv[])
        {
                FILE *fpindex, *fpitems, *fpmenu = NULL, *fp;
       -        char *name, *tmp, *endptr;
       +        char *name;
                int i, showsidebar = (argc > 1);
       -        long l;
                struct feed *f;
        
                if (pledge("stdio rpath wpath cpath", NULL) == -1)
       @@ -88,18 +87,8 @@ main(int argc, char *argv[])
                if (!(feeds = calloc(argc, sizeof(struct feed))))
                        err(1, "calloc");
        
       -        if ((comparetime = time(NULL)) == (time_t)-1)
       -                errx(1, "time");
       -
       -        if ((tmp = getenv("SFEED_NEW_MAX_SECS"))) {
       -                l = strtol(tmp, &endptr, 10);
       -                if (*tmp == '\0' || *endptr != '\0' || l <= 0)
       -                        err(1, "cannot parse $SFEED_NEW_MAX_SECS");
       -                comparetime -= l;
       -        } else {
       -                /* 1 day is old news */
       -                comparetime -= 86400;
       -        }
       +        if ((comparetime = getcomparetime()) == (time_t)-1)
       +                errx(1, "getcomparetime");
        
                /* write main index page */
                if (!(fpindex = fopen("index.html", "wb")))
 (DIR) diff --git a/sfeed_gopher.1 b/sfeed_gopher.1
       @@ -46,7 +46,7 @@ The default is "127.0.0.1".
        .It Ev SFEED_GOPHER_PORT
        This environment variable can be used as the Gopher Port field.
        The default is "70".
       -.It Ev SFEED_NEW_MAX_SECS
       +.It Ev SFEED_NEW_AGE
        Overwrite the maximum age in seconds to mark feeds as new.
        By default this is 86400, which equals one day.
        .El
 (DIR) diff --git a/sfeed_gopher.c b/sfeed_gopher.c
       @@ -122,9 +122,8 @@ int
        main(int argc, char *argv[])
        {
                FILE *fpitems, *fpindex, *fp;
       -        char *name, *p, *tmp, *endptr;
       +        char *name, *p;
                int i;
       -        long l;
        
                if (argc == 1) {
                        if (pledge("stdio", NULL) == -1)
       @@ -138,18 +137,8 @@ main(int argc, char *argv[])
                                err(1, "pledge");
                }
        
       -        if ((comparetime = time(NULL)) == (time_t)-1)
       -                errx(1, "time");
       -
       -        if ((tmp = getenv("SFEED_NEW_MAX_SECS"))) {
       -                l = strtol(tmp, &endptr, 10);
       -                if (*tmp == '\0' || *endptr != '\0' || l <= 0)
       -                        err(1, "cannot parse $SFEED_NEW_MAX_SECS");
       -                comparetime -= l;
       -        } else {
       -                /* 1 day is old news */
       -                comparetime -= 86400;
       -        }
       +        if ((comparetime = getcomparetime()) == (time_t)-1)
       +                errx(1, "getcomparetime");
        
                if ((p = getenv("SFEED_GOPHER_HOST")))
                        host = p;
 (DIR) diff --git a/sfeed_html.1 b/sfeed_html.1
       @@ -32,7 +32,7 @@ Items are marked as new using a bold markup.
        There is an example style.css stylesheet file included in the distribution.
        .Sh ENVIRONMENT VARIABLES
        .Bl -tag -width Ds
       -.It Ev SFEED_NEW_MAX_SECS
       +.It Ev SFEED_NEW_AGE
        Overwrite the maximum age in seconds to mark feeds as new.
        By default this is 86400, which equals one day.
        .El
 (DIR) diff --git a/sfeed_html.c b/sfeed_html.c
       @@ -78,28 +78,17 @@ int
        main(int argc, char *argv[])
        {
                struct feed *f;
       -        char *name, *tmp, *endptr;
       +        char *name;
                FILE *fp;
                int i;
       -        long l;
        
                if (pledge(argc == 1 ? "stdio" : "stdio rpath", NULL) == -1)
                        err(1, "pledge");
        
                if (!(feeds = calloc(argc, sizeof(struct feed))))
                        err(1, "calloc");
       -        if ((comparetime = time(NULL)) == (time_t)-1)
       -                errx(1, "time");
       -
       -        if ((tmp = getenv("SFEED_NEW_MAX_SECS"))) {
       -                l = strtol(tmp, &endptr, 10);
       -                if (*tmp == '\0' || *endptr != '\0' || l <= 0)
       -                        err(1, "cannot parse $SFEED_NEW_MAX_SECS");
       -                comparetime -= l;
       -        } else {
       -                /* 1 day is old news */
       -                comparetime -= 86400;
       -        }
       +        if ((comparetime = getcomparetime()) == (time_t)-1)
       +                errx(1, "getcomparetime");
        
                fputs("<!DOCTYPE HTML>\n"
                      "<html>\n"
 (DIR) diff --git a/sfeed_plain.1 b/sfeed_plain.1
       @@ -42,7 +42,7 @@ and
        .Xr wcwidth 3 .
        .Sh ENVIRONMENT VARIABLES
        .Bl -tag -width Ds
       -.It Ev SFEED_NEW_MAX_SECS
       +.It Ev SFEED_NEW_AGE
        Overwrite the maximum age in seconds to mark feeds as new.
        By default this is 86400, which equals one day.
        .El
 (DIR) diff --git a/sfeed_plain.c b/sfeed_plain.c
       @@ -2,7 +2,6 @@
        
        #include <locale.h>
        #include <stdio.h>
       -#include <stdlib.h>
        #include <string.h>
        #include <time.h>
        
       @@ -53,9 +52,8 @@ int
        main(int argc, char *argv[])
        {
                FILE *fp;
       -        char *name, *tmp, *endptr;
       +        char *name;
                int i;
       -        long l;
        
                if (pledge("stdio rpath", NULL) == -1)
                        err(1, "pledge");
       @@ -65,18 +63,8 @@ main(int argc, char *argv[])
                if (pledge(argc == 1 ? "stdio" : "stdio rpath", NULL) == -1)
                        err(1, "pledge");
        
       -        if ((comparetime = time(NULL)) == (time_t)-1)
       -                errx(1, "time");
       -
       -        if ((tmp = getenv("SFEED_NEW_MAX_SECS"))) {
       -                l = strtol(tmp, &endptr, 10);
       -                if (*tmp == '\0' || *endptr != '\0' || l <= 0)
       -                        err(1, "cannot parse $SFEED_NEW_MAX_SECS");
       -                comparetime -= l;
       -        } else {
       -                /* 1 day is old news */
       -                comparetime -= 86400;
       -        }
       +        if ((comparetime = getcomparetime()) == (time_t)-1)
       +                errx(1, "getcomparetime");
        
                if (argc == 1) {
                        printfeed(stdin, "");
 (DIR) diff --git a/util.c b/util.c
       @@ -318,6 +318,24 @@ strtotime(const char *s, time_t *t)
                return 0;
        }
        
       +time_t
       +getcomparetime(void)
       +{
       +        time_t now, t;
       +        char *p;
       +
       +        if ((now = time(NULL)) == (time_t)-1)
       +                return (time_t)-1;
       +
       +        if ((p = getenv("SFEED_NEW_AGE"))) {
       +                if (strtotime(p, &t) == -1)
       +                        return (time_t)-1;
       +                return now - t;
       +        }
       +
       +        return now - 86400; /* 1 day is old news */
       +}
       +
        /* Escape characters below as HTML 2.0 / XML 1.0. */
        void
        xmlencode(const char *s, FILE *fp)
 (DIR) diff --git a/util.h b/util.h
       @@ -71,6 +71,7 @@ int uri_makeabs(struct uri *, struct uri *, struct uri *);
        int uri_parse(const char *, struct uri *);
        
        void checkfileerror(FILE *, const char *, int);
       +time_t getcomparetime(void);
        void parseline(char *, char *[FieldLast]);
        void printutf8pad(FILE *, const char *, size_t, int);
        int  strtotime(const char *, time_t *);