summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--README2
-rw-r--r--sfeed_gopher.159
-rw-r--r--sfeed_gopher.c (renamed from sfeed_gph.c)67
-rw-r--r--sfeed_gph.145
5 files changed, 98 insertions, 77 deletions
diff --git a/Makefile b/Makefile
index 857443d..5975400 100644
--- a/Makefile
+++ b/Makefile
@@ -19,7 +19,7 @@ BIN = \
sfeed\
sfeed_atom\
sfeed_frames\
- sfeed_gph \
+ sfeed_gopher \
sfeed_html\
sfeed_mbox\
sfeed_opml_import\
diff --git a/README b/README
index 0f92628..75dda9f 100644
--- a/README
+++ b/README
@@ -127,7 +127,7 @@ sfeed - Read XML RSS or Atom feed data from stdin. Write feed data
in TAB-separated format to stdout.
sfeed_atom - Format feed data (TSV) to an Atom feed.
sfeed_frames - Format feed data (TSV) to HTML file(s) with frames.
-sfeed_gph - Format feed data (TSV) to geomyidae .gph files.
+sfeed_gopher - Format feed data (TSV) to Gopher files.
sfeed_html - Format feed data (TSV) to HTML.
sfeed_opml_export - Generate an OPML XML file from a sfeedrc config file.
sfeed_opml_import - Generate a sfeedrc config file from an OPML XML file.
diff --git a/sfeed_gopher.1 b/sfeed_gopher.1
new file mode 100644
index 0000000..a57340a
--- /dev/null
+++ b/sfeed_gopher.1
@@ -0,0 +1,59 @@
+.Dd January 18, 2020
+.Dt SFEED_GOPHER 1
+.Os
+.Sh NAME
+.Nm sfeed_gopher
+.Nd format feed data to Gopher files
+.Sh SYNOPSIS
+.Nm
+.Op Ar file...
+.Sh DESCRIPTION
+.Nm
+formats feed data (TSV) from
+.Xr sfeed 1
+from stdin or
+.Ar file
+to stdout in the raw Gopher output format.
+.Pp
+If one or more
+.Ar file
+are specified, the basename of the
+.Ar file
+is used as the feed name in the output.
+.Nm
+creates a index index file and for each feed creates a file in the
+format feedname.
+.Pp
+If no
+.Ar file
+parameters are specified and the data is read from stdin then the data is
+written to stdout and no files are written.
+.Pp
+Items with a timestamp from the last day compared to the system time at the
+time of formatting are counted and marked as new.
+.Bl -tag -width Ds
+.It Ev SFEED_GOPHER_PATH
+This environment variable can be used as the prefix for each path in the
+index file.
+The default is "/".
+.It Ev SFEED_GOPHER_HOST
+This environment variable can be used as the Gopher Host field.
+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".
+.El
+.Sh SEE ALSO
+.Xr sfeed 1 ,
+.Xr sfeed 5
+.Sh STANDARDS
+.Rs
+.%D March 1993
+.%R RFC 1436
+.%T The Internet Gopher Protocol
+.Re
+.Sh AUTHORS
+.An Hiltjo Posthuma Aq Mt hiltjo@codemadness.org
+.Sh CAVEATS
+The common-used 'h' and 'i' types are used in this program.
+These types are an extension to Gopher.
diff --git a/sfeed_gph.c b/sfeed_gopher.c
index 34c4ac2..4100c62 100644
--- a/sfeed_gph.c
+++ b/sfeed_gopher.c
@@ -16,18 +16,16 @@
#include "util.h"
static struct feed f;
-static char *prefixpath;
+static char *prefixpath = "/", *host = "127.0.0.1", *port = "70"; /* default */
static char *line;
static size_t linesize;
static time_t comparetime;
-/* Escape characters in links in geomyidae .gph format */
+/* Escape characters in gopher, CR and LF are ignored */
void
-gphlink(FILE *fp, const char *s, size_t len)
+gophertext(FILE *fp, const char *s)
{
- size_t i;
-
- for (i = 0; *s && i < len; s++, i++) {
+ for (; *s; s++) {
switch (*s) {
case '\r': /* ignore CR */
case '\n': /* ignore LF */
@@ -35,9 +33,6 @@ gphlink(FILE *fp, const char *s, size_t len)
case '\t':
fputs(" ", fp);
break;
- case '|': /* escape separators */
- fputs("\\|", fp);
- break;
default:
fputc(*s, fp);
break;
@@ -54,8 +49,10 @@ printfeed(FILE *fpitems, FILE *fpin, struct feed *f)
struct tm *tm;
time_t parsedtime;
- if (f->name[0])
- fprintf(fpitems, "t%s\n\n", f->name);
+ if (f->name[0]) {
+ fprintf(fpitems, "i%s\t\t%s\t%s\r\n", f->name, host, port);
+ fprintf(fpitems, "i\t\t%s\t%s\r\n", host, port);
+ }
while ((linelen = getline(&line, &linesize, fpin)) > 0) {
if (line[linelen - 1] == '\n')
@@ -74,29 +71,33 @@ printfeed(FILE *fpitems, FILE *fpin, struct feed *f)
f->total++;
if (fields[FieldLink][0]) {
- fputs("[h|", fpitems);
+ fputs("h", fpitems);
fprintf(fpitems, "%c %04d-%02d-%02d %02d:%02d ",
isnew ? 'N' : ' ',
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
tm->tm_hour, tm->tm_min);
- gphlink(fpitems, fields[FieldTitle], strlen(fields[FieldTitle]));
- fputs("|URL:", fpitems);
- gphlink(fpitems, fields[FieldLink], strlen(fields[FieldLink]));
- fputs("|server|port]\n", fpitems);
+ gophertext(fpitems, fields[FieldTitle]);
+ fputs("\tURL:", fpitems);
+ gophertext(fpitems, fields[FieldLink]);
+
} else {
- fprintf(fpitems, "%c %04d-%02d-%02d %02d:%02d %s\n",
+ fprintf(fpitems, "i%c %04d-%02d-%02d %02d:%02d ",
isnew ? 'N' : ' ',
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
- tm->tm_hour, tm->tm_min, fields[FieldTitle]);
+ tm->tm_hour, tm->tm_min);
+ gophertext(fpitems, fields[FieldTitle]);
+ fputs("\t", fpitems);
}
+ fprintf(fpitems, "\t%s\t%s\r\n", host, port);
}
+ fputs(".\r\n", fpitems);
}
int
main(int argc, char *argv[])
{
FILE *fpitems, *fpindex, *fp;
- char *name, path[PATH_MAX + 1];
+ char *name, *p, path[PATH_MAX + 1];
int i, r;
if (pledge(argc == 1 ? "stdio" : "stdio rpath wpath cpath", NULL) == -1)
@@ -107,16 +108,21 @@ main(int argc, char *argv[])
/* 1 day is old news */
comparetime -= 86400;
+ if ((p = getenv("SFEED_GOPHER_HOST")))
+ host = p;
+ if ((p = getenv("SFEED_GOPHER_PORT")))
+ port = p;
+
if (argc == 1) {
f.name = "";
printfeed(stdout, stdin, &f);
} else {
- if (!(prefixpath = getenv("SFEED_GPH_PATH")))
- prefixpath = "/";
+ if ((p = getenv("SFEED_GOPHER_PATH")))
+ prefixpath = p;
/* write main index page */
- if (!(fpindex = fopen("index.gph", "wb")))
- err(1, "fopen: index.gph");
+ if (!(fpindex = fopen("index", "wb")))
+ err(1, "fopen: index");
for (i = 1; i < argc; i++) {
memset(&f, 0, sizeof(f));
@@ -126,7 +132,7 @@ main(int argc, char *argv[])
if (!(fp = fopen(argv[i], "r")))
err(1, "fopen: %s", argv[i]);
- r = snprintf(path, sizeof(path), "%s.gph", name);
+ r = snprintf(path, sizeof(path), "%s", name);
if (r < 0 || (size_t)r >= sizeof(path))
errx(1, "path truncation: %s", path);
if (!(fpitems = fopen(path, "wb")))
@@ -138,13 +144,14 @@ main(int argc, char *argv[])
fclose(fpitems);
/* append directory item to index */
- fprintf(fpindex, "[1|");
- gphlink(fpindex, name, strlen(name));
- fprintf(fpindex, " (%lu/%lu)|", f.totalnew, f.total);
- gphlink(fpindex, prefixpath, strlen(prefixpath));
- gphlink(fpindex, path, strlen(path));
- fputs("|server|port]\n", fpindex);
+ fputs("1", fpindex);
+ gophertext(fpindex, name);
+ fprintf(fpindex, " (%lu/%lu)\t", f.totalnew, f.total);
+ gophertext(fpindex, prefixpath);
+ gophertext(fpindex, path);
+ fprintf(fpindex, "\t%s\t%s\r\n", host, port);
}
+ fputs(".\r\n", fpindex);
fclose(fpindex);
}
diff --git a/sfeed_gph.1 b/sfeed_gph.1
deleted file mode 100644
index ff4edf3..0000000
--- a/sfeed_gph.1
+++ /dev/null
@@ -1,45 +0,0 @@
-.Dd July 20, 2019
-.Dt SFEED_GPH 1
-.Os
-.Sh NAME
-.Nm sfeed_gph
-.Nd format feed data to geomyidae .gph files
-.Sh SYNOPSIS
-.Nm
-.Op Ar file...
-.Sh DESCRIPTION
-.Nm
-formats feed data (TSV) from
-.Xr sfeed 1
-from stdin or
-.Ar file
-to stdout in the geomyidae .gph file format.
-.Pp
-If one or more
-.Ar file
-are specified, the basename of the
-.Ar file
-is used as the feed name in the output.
-.Nm
-creates a index.gph index file and for each feed creates a file in the
-format feedname.gph.
-.Pp
-If no
-.Ar file
-parameters are specified and the data is read from stdin then the gph data
-is written to stdout and no files are written.
-.Pp
-Items with a timestamp from the last day compared to the system time at the
-time of formatting are counted and marked as new.
-.Bl -tag -width Ds
-.It Ev SFEED_GPH_PATH
-This environment variable can be used as the prefix for each path in the
-index.gph file.
-The default is "/".
-.El
-.Sh SEE ALSO
-.Xr sfeed 1 ,
-.Xr sfeed 5 ,
-.Xr geomyidae 8
-.Sh AUTHORS
-.An Hiltjo Posthuma Aq Mt hiltjo@codemadness.org