/* See license terms in x.c */

#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][0] == '-' \
                             && argv[0][1]; \
                             argc--, argv++) { \
            char argc_; \
            char** argv_; \
            int brk_; \
            if (argv[0][1] == '-' && argv[0][2] == '\0') { \
                argv++; \
                argc--; \
                break; \
            } \
            int i_; \
            for (i_ = 1, brk_ = 0, argv_ = argv; \
                 argv[0][i_] && !brk_; \
                 i_++) { \
                if (argv_ != argv) \
                break; \
                argc_ = argv[0][i_]; \
                switch (argc_)

#define ARGEND                  } \
        }

#define ARGC()          argc_

#define EARGF() ((argv[0][i_ + 1] == '\0' && argv[1] == NULL)? \
                 ((exit(EXIT_FAILURE)), abort(), (char*)0) : \
                 (brk_ = 1, (argv[0][i_ + 1] != '\0')? \
                 (&argv[0][i_ + 1]) : \
                 (argc--, argv++, argv[0])))

#define ARGF()          ((argv[0][i_ + 1] == '\0' && argv[1] == NULL)? \
                        (char*)0 : \
                        (brk_ = 1, (argv[0][i_ + 1] != '\0')? \
                        (&argv[0][i_ + 1]) : \
                        (argc--, argv++, argv[0])))

#endif
