2022-06-19 01:13:10 +00:00
|
|
|
#include <gargoyle.h>
|
2022-06-27 23:25:31 +00:00
|
|
|
#include <gargoyle/scribe.h>
|
|
|
|
#include <gargoyle/sleuth.h>
|
2022-06-29 01:24:07 +00:00
|
|
|
#include <gargoyle/twine.h>
|
2022-06-19 05:13:49 +00:00
|
|
|
#include <stddef.h>
|
2022-06-19 01:13:10 +00:00
|
|
|
|
2022-06-29 19:44:45 +00:00
|
|
|
uint8_t gargoyle_digest_argv(uint16_t optc, struct gargoyle_opt *optv, int *argc, char ***argv, gargoyle_flag_type flags) {
|
2022-06-27 23:25:31 +00:00
|
|
|
if(!(flags & GARGOYLE_FLG_GREED)) {
|
2022-06-19 09:02:11 +00:00
|
|
|
*argc -= 1;
|
|
|
|
*argv += 1;
|
|
|
|
}
|
|
|
|
|
2022-06-27 23:25:31 +00:00
|
|
|
if(flags & GARGOYLE_FLG_BCASE) {
|
|
|
|
flags |= GARGOYLE_FLG_ICASE;
|
|
|
|
}
|
|
|
|
|
2022-06-19 05:56:39 +00:00
|
|
|
while(1) {
|
2022-06-19 01:13:10 +00:00
|
|
|
const char *arg = **argv;
|
|
|
|
|
|
|
|
if(!arg || *arg != '-' || !*(arg + 1)) {
|
2022-06-19 05:56:39 +00:00
|
|
|
return GARGOYLE_ERR_SUCCESS;
|
2022-06-19 01:13:10 +00:00
|
|
|
} else if(*arg == '-' && *(arg + 1) == '-' && !*(arg + 2)) {
|
|
|
|
*argc -= 1;
|
|
|
|
*argv += 1;
|
2022-06-19 05:56:39 +00:00
|
|
|
return GARGOYLE_ERR_SUCCESS;
|
2022-06-19 05:13:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
struct gargoyle_opt *opt = NULL;
|
|
|
|
|
|
|
|
if(*(arg + 1) == '-') {
|
2022-06-20 01:30:01 +00:00
|
|
|
const char *brand = arg + 2;
|
2022-06-30 07:19:10 +00:00
|
|
|
opt = gargoyle_find_brand(optc, optv, brand, NULL, 0, flags);
|
2022-06-19 05:56:39 +00:00
|
|
|
|
|
|
|
if(!opt) {
|
2022-06-30 04:32:07 +00:00
|
|
|
if(flags & GARGOYLE_FLG_STRCT) {
|
|
|
|
return GARGOYLE_ERR_UNKNOWN_OPT;
|
|
|
|
} else {
|
|
|
|
*argc -= 1;
|
|
|
|
*argv += 1;
|
|
|
|
continue;
|
|
|
|
}
|
2022-06-19 05:56:39 +00:00
|
|
|
}
|
2022-06-20 01:30:01 +00:00
|
|
|
|
|
|
|
uint8_t res = 0;
|
|
|
|
|
|
|
|
if(opt->type & GARGOYLE_TYPE_BOOL) {
|
2022-06-29 01:24:07 +00:00
|
|
|
res = gargoyle_from_bool(opt, brand, "no-", 3, flags);
|
2022-06-20 01:30:01 +00:00
|
|
|
} else if(*(brand + opt->brand_sz) == '=') {
|
2022-06-27 23:25:31 +00:00
|
|
|
res = gargoyle_from_rope(opt, brand + opt->brand_sz + 1, flags);
|
2022-06-20 01:30:01 +00:00
|
|
|
} else {
|
2022-06-20 17:49:17 +00:00
|
|
|
if(!*(*argv + 1)) {
|
2022-06-20 01:30:01 +00:00
|
|
|
return GARGOYLE_ERR_VALUE_REQUIRED;
|
|
|
|
}
|
|
|
|
|
|
|
|
*argc -= 1;
|
|
|
|
*argv += 1;
|
2022-06-27 23:25:31 +00:00
|
|
|
res = gargoyle_from_rope(opt, **argv, flags);
|
2022-06-20 01:30:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(res) {
|
|
|
|
return res;
|
|
|
|
}
|
2022-06-19 05:13:49 +00:00
|
|
|
} else {
|
2022-06-19 05:56:39 +00:00
|
|
|
const char *idx = arg + 1;
|
|
|
|
|
|
|
|
for(; *idx; idx += 1) {
|
2022-06-27 23:25:31 +00:00
|
|
|
opt = gargoyle_find_emblem(optc, optv, *idx, flags);
|
2022-06-19 05:13:49 +00:00
|
|
|
|
2022-06-19 05:56:39 +00:00
|
|
|
if(!opt) {
|
2022-06-30 04:32:07 +00:00
|
|
|
if(flags & GARGOYLE_FLG_STRCT) {
|
|
|
|
return GARGOYLE_ERR_UNKNOWN_OPT;
|
|
|
|
} else {
|
|
|
|
*argc -= 1;
|
|
|
|
*argv += 1;
|
|
|
|
continue;
|
|
|
|
}
|
2022-06-19 05:56:39 +00:00
|
|
|
}
|
2022-06-29 01:24:07 +00:00
|
|
|
|
|
|
|
uint8_t res = 0;
|
|
|
|
|
|
|
|
if(opt->type & GARGOYLE_TYPE_BOOL) {
|
|
|
|
res = gargoyle_from_bool(opt, "", "*", 1, flags);
|
|
|
|
} else if(*(idx + 1)) {
|
|
|
|
res = gargoyle_from_rope(opt, idx + 1, flags);
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
if(!*(*argv + 1)) {
|
|
|
|
return GARGOYLE_ERR_VALUE_REQUIRED;
|
|
|
|
}
|
|
|
|
|
|
|
|
*argc -= 1;
|
|
|
|
*argv += 1;
|
|
|
|
res = gargoyle_from_rope(opt, **argv, flags);
|
|
|
|
}
|
2022-06-19 05:56:39 +00:00
|
|
|
}
|
2022-06-19 01:13:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
*argc -= 1;
|
|
|
|
*argv += 1;
|
|
|
|
}
|
|
|
|
|
2022-06-19 05:56:39 +00:00
|
|
|
return GARGOYLE_ERR_SUCCESS;
|
2022-06-19 01:13:10 +00:00
|
|
|
}
|
2022-06-29 01:27:17 +00:00
|
|
|
|
|
|
|
uint8_t gargoyle_digest_envh(uint16_t optc, struct gargoyle_opt *optv, const char *prefix, uint16_t prefix_sz, char ***envh, gargoyle_flag_type flags) {
|
|
|
|
if(flags & GARGOYLE_FLG_BCASE) {
|
|
|
|
flags |= GARGOYLE_FLG_ICASE;
|
|
|
|
}
|
|
|
|
|
|
|
|
for(; **envh; *envh += 1) {
|
|
|
|
const char *var = **envh;
|
|
|
|
|
|
|
|
if(!gargoyle_cmp(prefix, var, prefix_sz, flags) || *(var + prefix_sz) != '_') {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *brand = var + prefix_sz + 1;
|
|
|
|
struct gargoyle_opt *opt = gargoyle_find_brand(optc, optv, brand, "NO_", 3, flags);
|
|
|
|
|
|
|
|
if(!opt) {
|
|
|
|
if(flags & GARGOYLE_FLG_STRCT) {
|
|
|
|
return GARGOYLE_ERR_UNKNOWN_OPT;
|
|
|
|
} else {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t res = 0;
|
|
|
|
|
|
|
|
if(opt->type & GARGOYLE_TYPE_BOOL) {
|
|
|
|
res = gargoyle_from_bool(opt, brand, "NO_", 3, flags);
|
|
|
|
} else {
|
|
|
|
res = gargoyle_from_rope(opt, brand + opt->brand_sz + 1, flags);
|
|
|
|
}
|
2022-06-29 01:42:32 +00:00
|
|
|
|
|
|
|
if(res) {
|
|
|
|
return res;
|
|
|
|
}
|
2022-06-29 01:27:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|