#include #include #include #include #include "util.h" static struct feed *feeds; static char *line; static size_t linesize; static time_t comparetime; static unsigned long totalnew, total; static void printfeed(FILE *fpitems, FILE *fpin, struct feed *f) { char *fields[FieldLast]; ssize_t linelen; unsigned int isnew; struct tm rtm, *tm; time_t parsedtime; /* menu if not unnamed */ if (f->name[0]) { fputs("

name, fpitems); fputs("\">name, fpitems); fputs("\">", fpitems); xmlencode(f->name, fpitems); fputs("

\n", fpitems); } fputs("
\n", fpitems);

	while ((linelen = getline(&line, &linesize, fpin)) > 0 &&
	       !ferror(fpitems)) {
		if (line[linelen - 1] == '\n')
			line[--linelen] = '\0';
		parseline(line, fields);

		parsedtime = 0;
		if (!strtotime(fields[FieldUnixTimestamp], &parsedtime) &&
		    (tm = localtime_r(&parsedtime, &rtm))) {
			isnew = (parsedtime >= comparetime) ? 1 : 0;
			totalnew += isnew;
			f->totalnew += isnew;
			fprintf(fpitems, "%04d-%02d-%02d %02d:%02d ",
			        tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
			        tm->tm_hour, tm->tm_min);
		} else {
			isnew = 0;
			fputs("                 ", fpitems);
		}
		f->total++;
		total++;

		if (fields[FieldLink][0]) {
			fputs("", fpitems);
		}
		if (isnew)
			fputs("", fpitems);
		xmlencode(fields[FieldTitle], fpitems);
		if (isnew)
			fputs("", fpitems);
		if (fields[FieldLink][0])
			fputs("", fpitems);
		fputs("\n", fpitems);
	}
	fputs("
\n", fpitems); } int main(int argc, char *argv[]) { FILE *fpindex, *fpitems, *fpmenu = NULL, *fp; char *name; int i, showsidebar = (argc > 1); struct feed *f; if (pledge("stdio rpath wpath cpath", 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"); /* 1 day is old news */ comparetime -= 86400; /* write main index page */ if (!(fpindex = fopen("index.html", "wb"))) err(1, "fopen: index.html"); if (!(fpitems = fopen("items.html", "wb"))) err(1, "fopen: items.html"); if (showsidebar && !(fpmenu = fopen("menu.html", "wb"))) err(1, "fopen: menu.html"); if (pledge(argc == 1 ? "stdio" : "stdio rpath", NULL) == -1) err(1, "pledge"); fputs("\n" "\n" "\t\n" "\t\n" "\t\n" "\t\n" "\n" "
", fpitems); if (argc == 1) { feeds[0].name = ""; printfeed(fpitems, stdin, &feeds[0]); checkfileerror(stdin, "", 'r'); } else { for (i = 1; i < argc; i++) { name = ((name = strrchr(argv[i], '/'))) ? name + 1 : argv[i]; feeds[i - 1].name = name; if (!(fp = fopen(argv[i], "r"))) err(1, "fopen: %s", argv[i]); printfeed(fpitems, fp, &feeds[i - 1]); checkfileerror(fp, argv[i], 'r'); checkfileerror(fpitems, "items.html", 'w'); fclose(fp); } } fputs("
\n\n", fpitems); /* div items */ if (showsidebar) { fputs("\n" "\n" "\n" "\t\n" "\t\n" "\n" "\n\n", fpmenu); } fputs("\n\n\n" "\t\n" "\t\n" "\t(", fpindex); fprintf(fpindex, "%lu/%lu", totalnew, total); fputs(") - Newsfeed\n\t\n" "\n", fpindex); if (showsidebar) { fputs("\n" "\t\n", fpindex); } else { fputs("\n", fpindex); } fputs( "\t\n" "\n" "\n", fpindex); checkfileerror(fpindex, "index.html", 'w'); checkfileerror(fpitems, "items.html", 'w'); fclose(fpindex); fclose(fpitems); if (fpmenu) { checkfileerror(fpmenu, "menu.html", 'w'); fclose(fpmenu); } return 0; }