URI:
       sfeed_jsonfeed: simplify and improve code, add a man page - randomcrap - random crap programs of varying quality
  HTML git clone git://git.codemadness.org/randomcrap
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 24f66cebd6695e6e4a43a9599f9f7a2cd89917c4
   DIR parent b59a9f4450bed15d38218127345cea54e2c5bd81
  HTML Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Wed,  8 Mar 2023 22:17:12 +0100
       
       sfeed_jsonfeed: simplify and improve code, add a man page
       
       Diffstat:
         A sfeed/sfeed_jsonfeed.1              |      42 +++++++++++++++++++++++++++++++
         M sfeed/sfeed_jsonfeed.c              |      50 +++++++++++++-------------------
       
       2 files changed, 62 insertions(+), 30 deletions(-)
       ---
   DIR diff --git a/sfeed/sfeed_jsonfeed.1 b/sfeed/sfeed_jsonfeed.1
       @@ -0,0 +1,42 @@
       +.Dd March 8, 2023
       +.Dt SFEED_JSONFEED 1
       +.Os
       +.Sh NAME
       +.Nm sfeed_jsonfeed
       +.Nd format feed data to JSON Feed 1.1
       +.Sh SYNOPSIS
       +.Nm
       +.Op Ar
       +.Sh DESCRIPTION
       +.Nm
       +formats feed data (TSV) from
       +.Xr sfeed 1
       +from stdin or for each
       +.Ar file
       +to stdout as JSON Feed 1.1 data.
       +If one or more
       +.Ar file
       +arguments are specified then the basename of the
       +.Ar file
       +is used as the feed name in the output.
       +If no
       +.Ar file
       +arguments are specified and so the data is read from stdin then the feed name
       +is empty.
       +If
       +.Nm
       +is reading from one or more
       +.Ar file
       +arguments it will prefix the entry title with "[feed name] ".
       +.Sh EXIT STATUS
       +.Ex -std
       +.Sh EXAMPLES
       +.Bd -literal
       +curl -s 'https://codemadness.org/atom.xml' | sfeed | sfeed_jsonfeed
       +.Ed
       +.Sh SEE ALSO
       +.Xr sfeed 1 ,
       +.Xr sfeed_atom 1 ,
       +.Xr sfeed 5
       +.Sh AUTHORS
       +.An Hiltjo Posthuma Aq Mt hiltjo@codemadness.org
   DIR diff --git a/sfeed/sfeed_jsonfeed.c b/sfeed/sfeed_jsonfeed.c
       @@ -1,4 +1,3 @@
       -/* sfeed(5) to jsonfeed format program */
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
       @@ -14,31 +13,22 @@ static int firstitem = 1;
        static void
        printcontent(const char *s)
        {
       -        int ch;
       -
                for (; *s; s++) {
       -                ch = *s;
                        switch (*s) {
                        case '\\':
                                s++;
                                switch (*s) {
       -                        case 'n':  ch = '\n'; break;
       -                        case '\\': ch = '\\'; break;
       -                        case 't':  ch = '\t'; break;
       -                        default: continue; /* ignore */
       +                        case 'n':  fputs("\\n",  stdout); break;
       +                        case '\\': fputs("\\\\", stdout); break;
       +                        case 't':  fputs("\\t",  stdout); break;
                                }
       -                        break;
       -                }
       -                switch (ch) {
       -                case '"':  fputs("\\\"", stdout);  break;
       -                case '\\': fputs("\\\\", stdout);  break;
       -                case '\n': fputs("\\n",  stdout);  break;
       -                case '\t': fputs("\\t",  stdout);  break;
       +                        break; /* ignore invalid escape sequence */
       +                case '"':  fputs("\\\"", stdout); break;
                        default:
       -                        if (ISCNTRL((unsigned char)ch) || ch == '"')
       -                                printf("\\u00%02x", ch);
       +                        if (ISCNTRL((unsigned char)*s))
       +                                ; /* there are no control-chars in sfeed(5) data */
                                else
       -                                putchar(ch);
       +                                putchar(*s);
                                break;
                        }
                }
       @@ -49,7 +39,7 @@ printfield(const char *s)
        {
                for (; *s; s++) {
                        if (ISCNTRL((unsigned char)*s))
       -                        printf("\\u00%02x", *s);
       +                        ; /* there are no control-chars in sfeed(5) data */
                        else if (*s == '\\')
                                fputs("\\\\", stdout);
                        else if (*s == '"')
       @@ -79,9 +69,7 @@ printfeed(FILE *fp, const char *feedname)
                                fputs(",\n", stdout);
                        firstitem = 0;
        
       -                fputs("{\n", stdout);
       -
       -                fputs("\t\"id\": \"", stdout);
       +                fputs("{\n\t\"id\": \"", stdout);
                        printfield(fields[FieldId]);
                        fputs("\"", stdout);
        
       @@ -95,6 +83,11 @@ printfeed(FILE *fp, const char *feedname)
                        }
        
                        fputs(",\n\t\"title\": \"", stdout);
       +                if (feedname[0]) {
       +                        fputs("[", stdout);
       +                        printfield(feedname);
       +                        fputs("] ", stdout);
       +                }
                        printfield(fields[FieldTitle]);
                        fputs("\"", stdout);
        
       @@ -142,9 +135,7 @@ printfeed(FILE *fp, const char *feedname)
                        else
                                fputs(",\n\t\"content_text\": \"", stdout);
                        printcontent(fields[FieldContent]);
       -                fputs("\"", stdout);
       -
       -                fputs("\n}", stdout);
       +                fputs("\"\n}", stdout);
                }
        }
        
       @@ -158,10 +149,10 @@ main(int argc, char *argv[])
                if (pledge(argc == 1 ? "stdio" : "stdio rpath", NULL) == -1)
                        err(1, "pledge");
        
       -        fputs("{\n", stdout);
       -        fputs("\"version\": \"https://jsonfeed.org/version/1.1\",\n", stdout);
       -        fputs("\"title\": \"sfeed to jsonfeed 1.1\",\n", stdout);
       -        fputs("\"items\": [\n", stdout);
       +        fputs("{\n"
       +              "\"version\": \"https://jsonfeed.org/version/1.1\",\n"
       +              "\"title\": \"sfeed to jsonfeed 1.1\",\n"
       +              "\"items\": [\n", stdout);
        
                if (argc == 1) {
                        printfeed(stdin, "");
       @@ -177,7 +168,6 @@ main(int argc, char *argv[])
                                fclose(fp);
                        }
                }
       -
                fputs("]\n}\n", stdout);
        
                checkfileerror(stdout, "<stdout>", 'w');