diff --git a/src/gargoyle.c b/src/gargoyle.c index 044fe0b..b4cf268 100644 --- a/src/gargoyle.c +++ b/src/gargoyle.c @@ -89,3 +89,38 @@ uint8_t gargoyle_digest_args(uint16_t optc, struct gargoyle_opt *optv, int *argc return GARGOYLE_ERR_SUCCESS; } + +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); + } + } + + return 0; +}