URI: 
       tUse arg.h to select functions - pm - barely a pack manager
  HTML git clone git://z3bra.org/pm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 8a79a86f24490bc8a31d5796f9e506955f6c11d0
   DIR parent 8ef8e1103b492188efea63c94b4ba538dff30aec
  HTML Author: z3bra <willyatmailoodotorg>
       Date:   Fri, 18 Dec 2015 23:48:53 +0100
       
       Use arg.h to select functions
       
       Diffstat:
         A arg.h                               |      65 +++++++++++++++++++++++++++++++
         M pack.c                              |      28 +++++++++++++++++++++++-----
       
       2 files changed, 88 insertions(+), 5 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/pack.c b/pack.c
       t@@ -1,13 +1,26 @@
        #include <fcntl.h>
        #include <stdio.h>
       +#include <stdlib.h>
        #include <sys/stat.h>
        #include <sys/types.h>
        
        #include <archive.h>
        #include <archive_entry.h>
        
       +#include "arg.h"
       +
        #define PACKAGE_BUFF_SIZE 8192
        
       +
       +char *argv0;
       +
       +void
       +usage(char *name)
       +{
       +        fprintf(stderr, "usage: %s [-hl] [-c <ARCHIVE> <FILE>[,FILES..]]\n", name);
       +        exit(1);
       +}
       +
        /*
         * output the content of an archive
         */
       t@@ -93,12 +106,17 @@ main (int argc, char **argv)
        {
                const char *out;
        
       -        if (argc == 2)
       -                pack_list(*(++argv));
       -        if (argc > 2) {
       -                out = *(++argv);
       +        ARGBEGIN{
       +        case 'l':
       +                pack_list(EARGF(usage(argv0)));
       +                break;
       +        case 'c':
       +                out = EARGF(usage(argv0));
                        pack_creat(out, ++argv);
       -        }
       +                break;
       +        default:
       +                usage(argv0);
       +        }ARGEND;
        
                return 0;
        }
        \ No newline at end of file