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;
        }