tAdd flags to change input/output files - scribo - Email-based phlog generator
(HTM) git clone git://git.z3bra.org/scribo.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 2afee9ff157c4e6b7b4a78b91ebb244d4fbeb37d
(DIR) parent e61e8e2a4eecc4ede095cd76160d0949d321758f
(HTM) Author: Willy Goiffon <dev@z3bra.org>
Date: Sun, 6 Sep 2020 20:58:08 +0200
Add flags to change input/output files
Diffstat:
A arg.h | 65 +++++++++++++++++++++++++++++++
M scribo.c | 51 +++++++++++++++++++++++--------
2 files changed, 104 insertions(+), 12 deletions(-)
---
(DIR) diff --git a/arg.h b/arg.h
t@@ -0,0 +1,65 @@
+/*
+ * Copy me if you can.
+ * by 20h
+ */
+
+#ifndef ARG_H__
+#define ARG_H__
+
+extern char *argv0;
+
+/* use main(int argc, char *argv[]) */
+#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
+ argv[0] && argv[0][1]\
+ && argv[0][0] == '-';\
+ argc--, argv++) {\
+ char argc_;\
+ char **argv_;\
+ int brk_;\
+ if (argv[0][1] == '-' && argv[0][2] == '\0') {\
+ argv++;\
+ argc--;\
+ break;\
+ }\
+ for (brk_ = 0, argv[0]++, argv_ = argv;\
+ argv[0][0] && !brk_;\
+ argv[0]++) {\
+ if (argv_ != argv)\
+ break;\
+ argc_ = argv[0][0];\
+ switch (argc_)
+
+/* Handles obsolete -NUM syntax */
+#define ARGNUM case '0':\
+ case '1':\
+ case '2':\
+ case '3':\
+ case '4':\
+ case '5':\
+ case '6':\
+ case '7':\
+ case '8':\
+ case '9'
+
+#define ARGEND }\
+ }
+
+#define ARGC() argc_
+
+#define ARGNUMF() (brk_ = 1, estrtonum(argv[0], 0, INT_MAX))
+
+#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\
+ ((x), abort(), (char *)0) :\
+ (brk_ = 1, (argv[0][1] != '\0')?\
+ (&argv[0][1]) :\
+ (argc--, argv++, argv[0])))
+
+#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\
+ (char *)0 :\
+ (brk_ = 1, (argv[0][1] != '\0')?\
+ (&argv[0][1]) :\
+ (argc--, argv++, argv[0])))
+
+#define LNGARG() &argv[0][0]
+
+#endif
(DIR) diff --git a/scribo.c b/scribo.c
t@@ -7,31 +7,58 @@
#include <sys/queue.h>
+#include "arg.h"
#include "rfc5322.h"
+void
+usage(char *pgm)
+{
+ fprintf(stderr, "usage: %s [-b basedir]", pgm);
+}
+
int
main(int argc, char *argv[])
{
- FILE *fp = stdin;
- struct header *p;
+ FILE *in = stdin, *out = stdout;
+ struct header *p = NULL;
struct headers head = SLIST_HEAD_INITIALIZER(headers);
- char buf[BUFSIZ];
+ char *argv0, *infile, *outfile, buf[BUFSIZ];
size_t len;
- if (argc > 1)
- fp = fopen(argv[1], "r");
+ infile = NULL;
+ outfile = NULL;
+
+ ARGBEGIN {
+ case 'i':
+ infile = EARGF(usage(argv0));
+ break; /* NOTREACHED */
+ case 'o':
+ outfile = EARGF(usage(argv0));
+ break; /* NOTREACHED */
+ default:
+ usage(argv0);
+ exit(1);
+ } ARGEND;
+
+ if (infile)
+ in = fopen(infile, "r");
+
+ if (outfile)
+ out = fopen(outfile, "w");
- if (rfc5322_parse(fp, &head) < 0)
+ if (rfc5322_parse(in, &head) < 0)
return -1;
- SLIST_FOREACH(p, &head, entries)
- printf("%s: %s\n", p->field, p->body);
+ SLIST_FOREACH(p, &head, entries) {
+ if (!strcmp(p->field, "Subject"))
+ fprintf(out, "# %s\n\n", p->body);
+ }
- printf("\n");
- while((len = fread(buf, 1, BUFSIZ, fp)))
- printf("%s", buf);
+ while ((len = fread(buf, 1, BUFSIZ, in)))
+ fwrite(buf, 1, len, out);
- fclose(fp);
+ fclose(in);
+ fclose(out);
return 0;
}