#!/usr/bin/c -Wall -Wextra -std=c99 -O2 -- #define _XOPEN_SOURCE 700 #include #include #include #include #include #include #include #include "str_replace.h" #define ROOT "https://blog.notryan.com" void p_tag(unsigned indent, char *tag, char *str) { while (indent--) putchar(' '); printf("<%s>%s\n", tag, str, tag); } #define RFC5322_FMT "%a, %d %b %Y %T %z" size_t rfc5322_date(struct tm *tm, char *buf, size_t len) { //setenv("TZ", "PST8PDT", 1); tzset(); return strftime(buf, len, RFC5322_FMT, tm); } void get_datetime_str(char *fname, char *pub_date) { int fd = open(fname, O_RDONLY); // Date char date[17]; lseek(fd, 143, 0); read(fd, date, sizeof(date)); date[sizeof(date)-1] = '\0'; // Time char time_[15]; lseek(fd, 225, 0); read(fd, time_, sizeof(time_)); time_[sizeof(time_)-1] = '\0'; // Append and parse close(fd); sprintf(pub_date, "%s %s", date, time_); } void p_item(unsigned index) { // Read item contents. Skip if DNE. char fname[8]; sprintf(fname, "%03u.txt", index); if (access(fname, R_OK) == -1) return; // Read date char pub_date[64]; get_datetime_str(fname, pub_date); // Read title char title[80]; FILE *fp = fopen(fname, "r"); fseek(fp, 240, 0); while (fgetc(fp) == ' '); fseek(fp, -1, SEEK_CUR); fgets(title, 80, fp); title[strlen(title)-1] = '\0'; fseek(fp, 0, 0); // Generate body char *desc = malloc(100); desc[0] = '\0'; strcat(desc, "\n"); int i = 2; char buf[100]; while (fgets(buf, 100, fp)) { char *escaped = escape_html(buf); desc = realloc(desc, 100*i++); strcat(desc, escaped); free(escaped); } fclose(fp); strcat(desc, "]]>"); // Generate title char link[80]; sprintf(link, ROOT"/%s", fname); puts("\n "); p_tag(8, "title", title); p_tag(8, "link", link); p_tag(8, "description", desc); p_tag(8, "pubDate", pub_date); printf(" %s\n", fname); puts(" "); free(desc); } int main(void) { char build_date[64]; time_t tm = time(NULL); rfc5322_date(localtime(&tm), build_date, sizeof(build_date)); puts(""); puts(""); puts(""); puts(""); p_tag(4, "title", "notryan - blog"); p_tag(4, "link", ROOT); p_tag(4, "description", "A text-only blog about technology... and stuff."); printf("\n"); p_tag(4, "generator", ROOT"/rss.c"); p_tag(4, "lastBuildDate", build_date); for (int i = 1; i < 1000; i++) p_item(i); puts(""); puts(""); return 0; }