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