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');