forked from jienfak/ftest
-
Notifications
You must be signed in to change notification settings - Fork 0
/
arg.h
81 lines (68 loc) · 1.89 KB
/
arg.h
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#ifndef ARG_H__
#define ARG_H__
/*
* Copy me if you can.
* by 20h
*/
/* Modified by "jien". */
/* Simplest argument parsing.
It parses options until meet first
non option argument or "--" argument.
Options can have 2 looks:
1) -[option][argument]
2) -[option] [argument]
No -[option]=[argument] parsing, it is easy to add
by yourself though.
Suckless team, thanks you stopped my headache
about parsing arguments. */
extern char *argv0;
/* Use with "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' ){ /* Stop if meet "--". */ \
argv++;\
argc--;\
break;\
}\
for( brk_ = 0, argv[0]++, argv_ = argv;\
argv[0][0] && !brk_;\
argv[0]++ ) {\
if (argv_ != argv)/* Go to next option if we got argument. */\
break;\
argc_ = argv[0][0]; /* Option that we will switch. */\
switch (argc_)\
/* To handle num options. */ /* The next word argument. */
#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_) /* Current option. */
/* Mandatory argument. */
#define EARGF(x)\
((argv[0][1] == '\0' && argv[1] == NULL)?\
((x), abort(), (char *)0) : /* Exit if no any argument. */\
(brk_ = 1, (argv[0][1] != '\0')?\
(&argv[0][1]) /* Concatenated argument. */ :\
(argc--, argv++, argv[0]))) /* The next word argument. */
/* Optional argument. */
#define ARGF()\
((argv[0][1] == '\0' && argv[1] == NULL)?\
(char *)0 : /* Return "zero-pointer" if no any argument. */ \
(brk_ = 1, (argv[0][1] != '\0')?\
(&argv[0][1]) : /* Concatenated argument. */ \
(argc--, argv++, argv[0]))) /* The next word argument. */
#endif /* ARG_H__ */