aboutsummaryrefslogtreecommitdiff
path: root/src/arg.h
blob: 063c1272824b1fb8f6044164092e2d4426062537 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
 * 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(base) (brk_ = 1, estrtol(argv[0], (base)))

#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])))

#endif