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