94639e30de8f6ed3cea66d71ec2bfd2989097311
[csRadar.git] / csrOpt.h
1 // Supported:
2 // -abc
3 // -a value
4 // -ab value
5 //
6 // --long-value=test
7 // regular_thing
8
9 static int csr_argi = 1;
10 static int csr_argj = 1;
11 static int csr_argc = 0;
12 static int csr_consume_next = 0;
13 static char **csr_argv;
14
15 // Will return 0 if exhausted
16 int csr_argp( int argc, char *argv[] )
17 {
18 csr_argv = argv;
19 csr_argc = argc;
20
21 static int delta_i = 0;
22 static int delta_j = 0;
23
24 if( csr_argj != 1 && !csr_argv[ csr_argi ][ csr_argj ] )
25 {
26 csr_argj = 1;
27 csr_argi ++;
28 }
29
30 if( csr_consume_next )
31 {
32 csr_consume_next = 0;
33 csr_argi ++;
34 }
35
36 if( csr_argi >= argc )
37 return 0;
38
39 if( (delta_i == csr_argi) && (delta_j == csr_argj) )
40 {
41 char *cur = &csr_argv[ csr_argi ][ csr_argj ];
42
43 if( *cur != '-' )
44 {
45 fprintf( stderr, "Unknown opt '-%c'\n", *cur );
46 }
47 else
48 {
49 fprintf( stderr, "Unknown opt '--%s'\n", cur + 1 );
50 }
51
52 exit(0);
53 }
54
55 delta_i = csr_argi;
56 delta_j = csr_argj;
57
58 return 1;
59 }
60
61 // Example: see if -c is set
62 int csr_opt( char c )
63 {
64 char *carg = csr_argv[ csr_argi ];
65
66 if( carg[0] == '-' )
67 {
68 if( carg[1] == '-' )
69 return 0;
70
71 if( carg[ csr_argj ] == c )
72 {
73 csr_argj ++;
74
75 return 1;
76 }
77 }
78
79 return 0;
80 }
81
82 // Example: get -c *value*
83 char *csr_opt_arg( char c )
84 {
85 if( csr_opt( c ) )
86 {
87 if( csr_argi < csr_argc-1 )
88 {
89 if( csr_argv[ csr_argi + 1 ][0] != '-' )
90 {
91 csr_consume_next = 1;
92 return csr_argv[ csr_argi + 1 ];
93 }
94 }
95
96 fprintf( stderr, "Option '%c' requires argument!\n", c );
97 exit(0);
98 }
99
100 return NULL;
101 }
102
103 // Example see if --big is set
104 int csr_long_opt( char *name )
105 {
106 char *carg = csr_argv[ csr_argi ];
107
108 if( carg[0] == '-' )
109 {
110 if( carg[1] == '-' )
111 {
112 if( !strcmp( name, carg+2 ) )
113 {
114 csr_consume_next = 1;
115 return 1;
116 }
117 }
118 }
119
120 return 0;
121 }
122
123 // Example: get --big=value
124 char *csr_long_opt_arg( char *name )
125 {
126 char *carg = csr_argv[ csr_argi ];
127
128 if( carg[0] == '-' )
129 {
130 if( carg[1] == '-' )
131 {
132 int k = 2; int set = 0;
133 while( carg[ k ] )
134 {
135 if( carg[ k ] == '=' )
136 {
137 set = 1;
138 break;
139 }
140
141 k ++;
142 }
143
144 if( !strncmp( name, carg+2, k-2 ) )
145 {
146 csr_consume_next = 1;
147
148 // the rest
149 if( set )
150 {
151 return carg + k + 1;
152 }
153 else
154 {
155 fprintf( stderr, "Long option '%s' requires argument\n", name );
156 }
157 }
158 }
159 }
160
161 return NULL;
162 }
163
164 char *csr_arg(void)
165 {
166 char *carg = csr_argv[ csr_argi ];
167
168 if( carg[0] != '-' )
169 {
170 csr_consume_next = 1;
171 return carg;
172 }
173
174 return NULL;
175 }