scribo

Email-based phlog generator
git clone git://git.z3bra.org/scribo.git
Log | Files | Refs

commit c7fa199582f31a4dba0b45aea601a88349eee95e
parent c150b139555f493a41dd8cf9c102fa8fa7cef4e8
Author: Willy Goiffon <dev@z3bra.org>
Date:   Mon,  7 Sep 2020 23:07:55 +0200

Set outfile based on subject line

Diffstat:
Mscribo.c | 59+++++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 47 insertions(+), 12 deletions(-)

diff --git a/scribo.c b/scribo.c @@ -1,4 +1,5 @@ #include <ctype.h> +#include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -24,6 +25,9 @@ SLIST_HEAD(headers, hdr); #ifndef strlcpy size_t strlcpy(char *dst, const char *src, size_t siz); #endif +#ifndef strlcat +size_t strlcat(char *dst, const char *src, size_t siz); +#endif void usage(char *pgm) @@ -32,6 +36,30 @@ usage(char *pgm) } char * +sanitize(const char *s) +{ + static char tmp[PATH_MAX]; + const char *p; + char *w; + + for (p = s, w = tmp; *p; p++) { + switch (*p) { + case '.': + *(w++) = *p; + break; + case ' ': + *(w++) = '_'; + break; + default: + if (isalnum(*p)) + *(w++) = tolower(*p); + } + } + + return tmp; +} + +char * header(struct headers *head, char *key) { struct hdr *h; @@ -89,19 +117,15 @@ parseheaders(FILE *fp, struct headers *head) } int -writelog(FILE *in, FILE *out) +writelog(FILE *in, FILE *out, struct headers *head) { struct tm tm = {.tm_isdst = -1}; char stamp[BUFSIZ]; char *subject, *date, *from; - struct headers headers; - if (parseheaders(in, &headers) < 0) - return -1; - - subject = header(&headers, "Subject"); - date = header(&headers, "Date"); - from = header(&headers, "From"); + subject = header(head, "Subject"); + date = header(head, "Date"); + from = header(head, "From"); /* convert date to an appropriate format */ strptime(date, "%a, %d %b %Y %T %z", &tm); @@ -120,6 +144,8 @@ main(int argc, char *argv[]) { FILE *in = stdin, *out = stdout; char *argv0, *infile, *outfile; + char fn[PATH_MAX]; + struct headers headers; infile = NULL; outfile = NULL; @@ -142,16 +168,25 @@ main(int argc, char *argv[]) if (infile) in = fopen(infile, "r"); + if (!in) + return -1; + if (chdir(basedir) < 0) return -1; + if (parseheaders(in, &headers) < 0) + return -1; + + if (!outfile) { + strlcpy(fn, sanitize(header(&headers, "Subject")), sizeof(fn)); + strlcat(fn, ".txt", sizeof(fn)); + outfile = fn; + } + if (outfile) out = fopen(outfile, "w"); - if (!in || !out) - return -1; - - if (writelog(in, out) < 0) + if (writelog(in, out, &headers) < 0) return -1; fclose(in);