This commit is contained in:
Nick Chambers 2022-07-07 19:43:06 -05:00
parent f8003f67b5
commit 11bf68274d
10 changed files with 138 additions and 138 deletions

View File

@ -6,7 +6,7 @@
#include <gargoyle/privledge.h>
#include <stdint.h>
uint8_t gargoyle_digest_argv(uint16_t optc, struct gargoyle_opt *optv, int *argc, char ***argv, struct gargoyle_err *err, gargoyle_flag_type flags);
uint8_t gargoyle_digest_envh(uint16_t optc, struct gargoyle_opt *optv, const char *prefix, uint16_t prefix_sz, char ***envh, struct gargoyle_err *err, gargoyle_flag_type flags);
uint8_t gargoyle_digest_argv(uint16_t optc, struct gargoyle_optn *optv, int *argc, char ***argv, struct gargoyle_err *err, gargoyle_flag_type flags);
uint8_t gargoyle_digest_envh(uint16_t optc, struct gargoyle_optn *optv, const char *prefix, uint16_t prefix_sz, char ***envh, struct gargoyle_err *err, gargoyle_flag_type flags);
#endif

View File

@ -3,7 +3,7 @@
#include <stdint.h>
struct gargoyle_opt {
struct gargoyle_optn {
const char *brand;
uint16_t brand_sz;
const char emblem;
@ -12,9 +12,9 @@ struct gargoyle_opt {
uint8_t type;
};
#define GARGOYLE_CS_OPT(brand, val) GARGOYLE_MK_OPT(brand), 0[brand], &val[0], sizeof(val)
#define GARGOYLE_EM_OPT(brand, emblem, val) GARGOYLE_MK_OPT(brand), emblem, &val, sizeof(val)
#define GARGOYLE_EZ_OPT(brand, val) GARGOYLE_MK_OPT(brand), 0[brand], &val, sizeof(val)
#define GARGOYLE_MK_OPT(brand) brand, (sizeof(brand) - 1)
#define GARGOYLE_CS_OPTN(brand, val) GARGOYLE_MK_OPTN(brand), 0[brand], &val[0], sizeof(val)
#define GARGOYLE_EM_OPTN(brand, emblem, val) GARGOYLE_MK_OPTN(brand), emblem, &val, sizeof(val)
#define GARGOYLE_EZ_OPTN(brand, val) GARGOYLE_MK_OPTN(brand), 0[brand], &val, sizeof(val)
#define GARGOYLE_MK_OPTN(brand) brand, (sizeof(brand) - 1)
#endif

View File

@ -4,7 +4,7 @@
#include <gargoyle/codex.h>
#include <gargoyle/privledge.h>
uint8_t gargoyle_from_bool(struct gargoyle_opt *opt, const char *brand, const char *neg, uint16_t neg_sz, gargoyle_flag_type flags);
uint8_t gargoyle_from_rope(struct gargoyle_opt *opt, const char *brand_val, gargoyle_flag_type flags);
uint8_t gargoyle_from_bool(struct gargoyle_optn *optn, const char *brand, const char *neg, uint16_t neg_sz, gargoyle_flag_type flags);
uint8_t gargoyle_from_rope(struct gargoyle_optn *optn, const char *brand_val, gargoyle_flag_type flags);
#endif

View File

@ -5,7 +5,7 @@
#include <gargoyle/privledge.h>
#include <stdint.h>
struct gargoyle_opt *gargoyle_find_brand(uint16_t optc, struct gargoyle_opt *optv, const char *brand, const char *neg, uint16_t neg_sz, gargoyle_flag_type flags);
struct gargoyle_opt *gargoyle_find_emblem(uint16_t optc, struct gargoyle_opt *optv, const char emblem, gargoyle_flag_type flags);
struct gargoyle_optn *gargoyle_find_brand(uint16_t optc, struct gargoyle_optn *optv, const char *brand, const char *neg, uint16_t neg_sz, gargoyle_flag_type flags);
struct gargoyle_optn *gargoyle_find_emblem(uint16_t optc, struct gargoyle_optn *optv, const char emblem, gargoyle_flag_type flags);
#endif

View File

@ -5,7 +5,7 @@
#include <stddef.h>
#include <strings.h>
uint8_t gargoyle_digest_argv(uint16_t optc, struct gargoyle_opt *optv, int *argc, char ***argv, struct gargoyle_err *err, gargoyle_flag_type flags) {
uint8_t gargoyle_digest_argv(uint16_t optc, struct gargoyle_optn *optv, int *argc, char ***argv, struct gargoyle_err *err, gargoyle_flag_type flags) {
if(!(flags & GARGOYLE_FLG_GREED)) {
*argc -= 1;
*argv += 1;
@ -28,13 +28,13 @@ uint8_t gargoyle_digest_argv(uint16_t optc, struct gargoyle_opt *optv, int *argc
return GARGOYLE_ERR_SUCCESS;
}
struct gargoyle_opt *opt = NULL;
struct gargoyle_optn *optn = NULL;
if(*(arg + 1) == '-') {
const char *brand = arg + 2;
opt = gargoyle_find_brand(optc, optv, brand, NULL, 0, flags);
optn = gargoyle_find_brand(optc, optv, brand, NULL, 0, flags);
if(!opt) {
if(!optn) {
if(flags & GARGOYLE_FLG_STRCT) {
char *eql = index(brand, '=');
GARGOYLE_MK_ERR(err, GARGOYLE_ERR_UNKNOWN_OPTN, "unknown option '--%.*s'", (int) (eql - brand), brand);
@ -49,28 +49,28 @@ uint8_t gargoyle_digest_argv(uint16_t optc, struct gargoyle_opt *optv, int *argc
uint8_t res = 0;
const char *val = NULL;
if(opt->type & GARGOYLE_TYPE_BOOL) {
res = gargoyle_from_bool(opt, brand, NULL, 0, flags);
} else if(*(brand + opt->brand_sz) == '=') {
val = brand + opt->brand_sz + 1;
res = gargoyle_from_rope(opt, val, flags);
if(optn->type & GARGOYLE_TYPE_BOOL) {
res = gargoyle_from_bool(optn, brand, NULL, 0, flags);
} else if(*(brand + optn->brand_sz) == '=') {
val = brand + optn->brand_sz + 1;
res = gargoyle_from_rope(optn, val, flags);
} else {
if(!*(*argv + 1)) {
GARGOYLE_MK_ERR(err, GARGOYLE_ERR_VAL_REQUIRED, "option '--%s' requires a value", opt->brand);
GARGOYLE_MK_ERR(err, GARGOYLE_ERR_VAL_REQUIRED, "option '--%s' requires a value", optn->brand);
return err->code;
}
*argc -= 1;
*argv += 1;
val = **argv;
res = gargoyle_from_rope(opt, val, flags);
res = gargoyle_from_rope(optn, val, flags);
}
if(res) {
if(val) {
GARGOYLE_MK_ERR(err, res, "invalid value '%s' for option '--%s'", val, opt->brand);
GARGOYLE_MK_ERR(err, res, "invalid value '%s' for option '--%s'", val, optn->brand);
} else {
GARGOYLE_MK_ERR(err, res, "invalid value for option '--%s'", opt->brand);
GARGOYLE_MK_ERR(err, res, "invalid value for option '--%s'", optn->brand);
}
return err->code;
@ -79,9 +79,9 @@ uint8_t gargoyle_digest_argv(uint16_t optc, struct gargoyle_opt *optv, int *argc
const char *idx = arg + 1;
for(; *idx; idx += 1) {
opt = gargoyle_find_emblem(optc, optv, *idx, flags);
optn = gargoyle_find_emblem(optc, optv, *idx, flags);
if(!opt) {
if(!optn) {
if(flags & GARGOYLE_FLG_STRCT) {
GARGOYLE_MK_ERR(err, GARGOYLE_ERR_UNKNOWN_OPTN, "unknown option '-%c'", *idx);
return err->code;
@ -94,29 +94,29 @@ uint8_t gargoyle_digest_argv(uint16_t optc, struct gargoyle_opt *optv, int *argc
uint8_t res = 0;
const char *val = NULL;
if(opt->type & GARGOYLE_TYPE_BOOL) {
res = gargoyle_from_bool(opt, "", NULL, 0, flags);
if(optn->type & GARGOYLE_TYPE_BOOL) {
res = gargoyle_from_bool(optn, "", NULL, 0, flags);
} else if(*(idx + 1)) {
val = idx + 1;
res = gargoyle_from_rope(opt, val, flags);
res = gargoyle_from_rope(optn, val, flags);
break;
} else {
if(!*(*argv + 1)) {
GARGOYLE_MK_ERR(err, GARGOYLE_ERR_VAL_REQUIRED, "option '-%c' requires a value", opt->emblem);
GARGOYLE_MK_ERR(err, GARGOYLE_ERR_VAL_REQUIRED, "option '-%c' requires a value", optn->emblem);
return err->code;
}
*argc -= 1;
*argv += 1;
val = **argv;
res = gargoyle_from_rope(opt, val, flags);
res = gargoyle_from_rope(optn, val, flags);
}
if(res) {
if(val) {
GARGOYLE_MK_ERR(err, res, "invalid value '%s' for option '-%c'", val, opt->emblem);
GARGOYLE_MK_ERR(err, res, "invalid value '%s' for option '-%c'", val, optn->emblem);
} else {
GARGOYLE_MK_ERR(err, res, "invalid value for option '-%c'", opt->emblem);
GARGOYLE_MK_ERR(err, res, "invalid value for option '-%c'", optn->emblem);
}
return err->code;
@ -131,7 +131,7 @@ uint8_t gargoyle_digest_argv(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, struct gargoyle_err *err, gargoyle_flag_type flags) {
uint8_t gargoyle_digest_envh(uint16_t optc, struct gargoyle_optn *optv, const char *prefix, uint16_t prefix_sz, char ***envh, struct gargoyle_err *err, gargoyle_flag_type flags) {
if(flags & GARGOYLE_FLG_BCASE) {
flags |= GARGOYLE_FLG_ICASE;
}
@ -146,9 +146,9 @@ uint8_t gargoyle_digest_envh(uint16_t optc, struct gargoyle_opt *optv, const cha
}
const char *brand = var + prefix_sz + 1;
struct gargoyle_opt *opt = gargoyle_find_brand(optc, optv, brand, "NO_", 3, flags);
struct gargoyle_optn *optn = gargoyle_find_brand(optc, optv, brand, "NO_", 3, flags);
if(!opt) {
if(!optn) {
if(flags & GARGOYLE_FLG_STRCT) {
char *eql = index(brand, '=');
GARGOYLE_MK_ERR(err, GARGOYLE_ERR_UNKNOWN_OPTN, "unknown variable '%.*s'", (int) (eql - brand), brand);
@ -160,14 +160,14 @@ uint8_t gargoyle_digest_envh(uint16_t optc, struct gargoyle_opt *optv, const cha
uint8_t res = 0;
if(opt->type & GARGOYLE_TYPE_BOOL) {
res = gargoyle_from_bool(opt, brand, "NO_", 3, flags);
if(optn->type & GARGOYLE_TYPE_BOOL) {
res = gargoyle_from_bool(optn, brand, "NO_", 3, flags);
} else {
res = gargoyle_from_rope(opt, brand + opt->brand_sz + 1, flags);
res = gargoyle_from_rope(optn, brand + optn->brand_sz + 1, flags);
}
if(res) {
GARGOYLE_MK_ERR(err, res, "invalid value '%s' for variable '%.*s'", brand + opt->brand_sz + 1, opt->brand_sz, opt->brand);
GARGOYLE_MK_ERR(err, res, "invalid value '%s' for variable '%.*s'", brand + optn->brand_sz + 1, optn->brand_sz, optn->brand);
return err->code;
}
}

View File

@ -3,7 +3,7 @@
#include <gargoyle/twine.h>
#include <stdlib.h>
uint8_t gargoyle_from_bool(struct gargoyle_opt *opt, const char *brand, const char *neg, uint16_t neg_sz, gargoyle_flag_type flags) {
uint8_t gargoyle_from_bool(struct gargoyle_optn *opt, const char *brand, const char *neg, uint16_t neg_sz, gargoyle_flag_type flags) {
if(!neg) {
neg = "no-";
neg_sz = 3;
@ -17,7 +17,7 @@ uint8_t gargoyle_from_bool(struct gargoyle_opt *opt, const char *brand, const ch
return GARGOYLE_ERR_SUCCESS;
}
uint8_t gargoyle_from_rope(struct gargoyle_opt *opt, const char *brand_val, gargoyle_flag_type flags) {
uint8_t gargoyle_from_rope(struct gargoyle_optn *opt, const char *brand_val, gargoyle_flag_type flags) {
if(opt->type & GARGOYLE_TYPE_UINT) {
char *end = NULL;
uint64_t *val = opt->val;

View File

@ -4,7 +4,7 @@
#include <gargoyle/twine.h>
#include <stddef.h>
struct gargoyle_opt *gargoyle_find_brand(uint16_t optc, struct gargoyle_opt *optv, const char *brand, const char *neg, uint16_t neg_sz, gargoyle_flag_type flags) {
struct gargoyle_optn *gargoyle_find_brand(uint16_t optc, struct gargoyle_optn *optv, const char *brand, const char *neg, uint16_t neg_sz, gargoyle_flag_type flags) {
if(!neg) {
neg = "no-";
neg_sz = 3;
@ -28,7 +28,7 @@ struct gargoyle_opt *gargoyle_find_brand(uint16_t optc, struct gargoyle_opt *opt
return NULL;
}
struct gargoyle_opt *gargoyle_find_emblem(uint16_t optc, struct gargoyle_opt *optv, const char emblem, gargoyle_flag_type flags) {
struct gargoyle_optn *gargoyle_find_emblem(uint16_t optc, struct gargoyle_optn *optv, const char emblem, gargoyle_flag_type flags) {
for(; optc; optc -= 1, optv += 1) {
if(emblem == optv->emblem) {
return optv;

View File

@ -20,12 +20,12 @@ void gargoyle_test_digest_envh(void) {
uint64_t uint_val = 0;
int64_t sint_val = 0;
struct gargoyle_opt optv[] = {
{ GARGOYLE_EZ_OPT("uint", uint_val), GARGOYLE_TYPE_UINT },
{ GARGOYLE_EZ_OPT("sint", sint_val), GARGOYLE_TYPE_SINT }
struct gargoyle_optn optv[] = {
{ GARGOYLE_EZ_OPTN("uint", uint_val), GARGOYLE_TYPE_UINT },
{ GARGOYLE_EZ_OPTN("sint", sint_val), GARGOYLE_TYPE_SINT }
};
uint16_t optc = sizeof(optv) / sizeof(struct gargoyle_opt);
uint16_t optc = sizeof(optv) / sizeof(struct gargoyle_optn);
char *dirty_env[] = {
"GARGOYLE_*(#&(%&)*=",
@ -74,7 +74,7 @@ void gargoyle_test_digest_envh(void) {
"GARGOYLE_sint=-2022",
"GARGOYLE_uint=42",
"GARGOYLE_UINT=43",
"GARGOYLE_NOT_AN_OPT=racket",
"GARGOYLE_NOT_AN_OPTN=racket",
NULL
};

View File

@ -14,8 +14,8 @@ int clean_suite_scribe(void) {
void scribe_test_from_bool(void) {
uint8_t foo = 0;
struct gargoyle_opt opts[] = {
{ GARGOYLE_EZ_OPT("foo", foo), GARGOYLE_TYPE_BOOL }
struct gargoyle_optn opts[] = {
{ GARGOYLE_EZ_OPTN("foo", foo), GARGOYLE_TYPE_BOOL }
};
uint8_t res = gargoyle_from_bool(opts, "", NULL, 0, 0);
@ -551,11 +551,11 @@ void scribe_test_from_rope(void) {
double dble_val = 0;
char rope_val[10];
struct gargoyle_opt opts[] = {
{ GARGOYLE_EZ_OPT("uint", uint_val), GARGOYLE_TYPE_UINT },
{ GARGOYLE_EZ_OPT("sint", sint_val), GARGOYLE_TYPE_SINT },
{ GARGOYLE_EZ_OPT("dble", dble_val), GARGOYLE_TYPE_DBLE },
{ GARGOYLE_CS_OPT("rope", rope_val), GARGOYLE_TYPE_ROPE }
struct gargoyle_optn opts[] = {
{ GARGOYLE_EZ_OPTN("uint", uint_val), GARGOYLE_TYPE_UINT },
{ GARGOYLE_EZ_OPTN("sint", sint_val), GARGOYLE_TYPE_SINT },
{ GARGOYLE_EZ_OPTN("dble", dble_val), GARGOYLE_TYPE_DBLE },
{ GARGOYLE_CS_OPTN("rope", rope_val), GARGOYLE_TYPE_ROPE }
};
uint8_t res = gargoyle_from_rope(&opts[0], "42", 0);

View File

@ -11,122 +11,122 @@ int clean_suite_sleuth(void) {
}
void sleuth_test_find_brand(void) {
struct gargoyle_opt optv[] = {
{ GARGOYLE_MK_OPT("baz"), 0, NULL, 0, GARGOYLE_TYPE_DBLE },
{ GARGOYLE_MK_OPT("foo"), 0, NULL, 0, GARGOYLE_TYPE_BOOL },
{ GARGOYLE_MK_OPT("bar"), 0, NULL, 0, GARGOYLE_TYPE_UINT }
struct gargoyle_optn optv[] = {
{ GARGOYLE_MK_OPTN("baz"), 0, NULL, 0, GARGOYLE_TYPE_DBLE },
{ GARGOYLE_MK_OPTN("foo"), 0, NULL, 0, GARGOYLE_TYPE_BOOL },
{ GARGOYLE_MK_OPTN("bar"), 0, NULL, 0, GARGOYLE_TYPE_UINT }
};
uint16_t optc = sizeof(optv) / sizeof(struct gargoyle_opt);
uint16_t optc = sizeof(optv) / sizeof(struct gargoyle_optn);
struct gargoyle_opt *opt = gargoyle_find_brand(optc, optv, "", NULL, 0, 0);
CU_ASSERT_PTR_NULL(opt);
struct gargoyle_optn *optn = gargoyle_find_brand(optc, optv, "", NULL, 0, 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "foo", NULL, 0, 0);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "foo", opt->brand_sz);
optn = gargoyle_find_brand(optc, optv, "foo", NULL, 0, 0);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "foo", optn->brand_sz);
opt = gargoyle_find_brand(optc, optv, "no-foo", NULL, 0, 0);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "foo", opt->brand_sz);
optn = gargoyle_find_brand(optc, optv, "no-foo", NULL, 0, 0);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "foo", optn->brand_sz);
opt = gargoyle_find_brand(optc, optv, "no-foo", "", 0, 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "no-foo", "", 0, 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "no_foo", NULL, 0, GARGOYLE_FLG_SYMBL);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "foo", opt->brand_sz);
optn = gargoyle_find_brand(optc, optv, "no_foo", NULL, 0, GARGOYLE_FLG_SYMBL);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "foo", optn->brand_sz);
opt = gargoyle_find_brand(optc, optv, "no_foo", NULL, 0, GARGOYLE_FLG_ICASE);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "no_foo", NULL, 0, GARGOYLE_FLG_ICASE);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "no_foo", NULL, 0, 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "no_foo", NULL, 0, 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "No-Foo", NULL, 0, GARGOYLE_FLG_SYMBL);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "No-Foo", NULL, 0, GARGOYLE_FLG_SYMBL);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "No-Foo", NULL, 0, GARGOYLE_FLG_ICASE);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "foo", opt->brand_sz);
optn = gargoyle_find_brand(optc, optv, "No-Foo", NULL, 0, GARGOYLE_FLG_ICASE);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "foo", optn->brand_sz);
opt = gargoyle_find_brand(optc, optv, "No-Foo", NULL, 0, 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "No-Foo", NULL, 0, 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "NO_FOO", NULL, 0, GARGOYLE_FLG_FLXBL);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "foo", opt->brand_sz);
optn = gargoyle_find_brand(optc, optv, "NO_FOO", NULL, 0, GARGOYLE_FLG_FLXBL);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "foo", optn->brand_sz);
opt = gargoyle_find_brand(optc, optv, "bar", NULL, 0, 0);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "bar", opt->brand_sz);
optn = gargoyle_find_brand(optc, optv, "bar", NULL, 0, 0);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "bar", optn->brand_sz);
opt = gargoyle_find_brand(optc, optv, "ba", NULL, 0, 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "ba", NULL, 0, 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "baro", NULL, 0, 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "baro", NULL, 0, 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "floor", NULL, 0, 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "floor", NULL, 0, 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "harrow", NULL, 0, 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "harrow", NULL, 0, 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_brand(optc, optv, "$#^*!@&(*(@&", NULL, 0, 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_brand(optc, optv, "$#^*!@&(*(@&", NULL, 0, 0);
CU_ASSERT_PTR_NULL(optn);
}
void sleuth_test_find_emblem(void) {
struct gargoyle_opt optv[] = {
{ GARGOYLE_MK_OPT("glu"), 'G', NULL, 0, GARGOYLE_TYPE_UINT },
{ GARGOYLE_MK_OPT("foo"), 'f', NULL, 0, GARGOYLE_TYPE_BOOL },
{ GARGOYLE_MK_OPT("bar"), 'b', NULL, 0, GARGOYLE_TYPE_DBLE },
{ GARGOYLE_MK_OPT("blu"), 'B', NULL, 0, GARGOYLE_TYPE_UINT }
struct gargoyle_optn optv[] = {
{ GARGOYLE_MK_OPTN("glu"), 'G', NULL, 0, GARGOYLE_TYPE_UINT },
{ GARGOYLE_MK_OPTN("foo"), 'f', NULL, 0, GARGOYLE_TYPE_BOOL },
{ GARGOYLE_MK_OPTN("bar"), 'b', NULL, 0, GARGOYLE_TYPE_DBLE },
{ GARGOYLE_MK_OPTN("blu"), 'B', NULL, 0, GARGOYLE_TYPE_UINT }
};
uint16_t optc = sizeof(optv) / sizeof(struct gargoyle_opt);
uint16_t optc = sizeof(optv) / sizeof(struct gargoyle_optn);
struct gargoyle_opt *opt = gargoyle_find_emblem(optc, optv, 'f', 0);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "foo", opt->brand_sz);
struct gargoyle_optn *optn = gargoyle_find_emblem(optc, optv, 'f', 0);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "foo", optn->brand_sz);
opt = gargoyle_find_emblem(optc, optv, 'f', GARGOYLE_FLG_ECASE);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "foo", opt->brand_sz);
optn = gargoyle_find_emblem(optc, optv, 'f', GARGOYLE_FLG_ECASE);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "foo", optn->brand_sz);
opt = gargoyle_find_emblem(optc, optv, 'F', 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_emblem(optc, optv, 'F', 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_emblem(optc, optv, 'F', GARGOYLE_FLG_ECASE);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "foo", opt->brand_sz);
optn = gargoyle_find_emblem(optc, optv, 'F', GARGOYLE_FLG_ECASE);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "foo", optn->brand_sz);
opt = gargoyle_find_emblem(optc, optv, 'b', 0);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "bar", opt->brand_sz);
optn = gargoyle_find_emblem(optc, optv, 'b', 0);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "bar", optn->brand_sz);
opt = gargoyle_find_emblem(optc, optv, 'b', GARGOYLE_FLG_ECASE);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "bar", opt->brand_sz);
optn = gargoyle_find_emblem(optc, optv, 'b', GARGOYLE_FLG_ECASE);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "bar", optn->brand_sz);
opt = gargoyle_find_emblem(optc, optv, 'B', 0);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "blu", opt->brand_sz);
optn = gargoyle_find_emblem(optc, optv, 'B', 0);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "blu", optn->brand_sz);
opt = gargoyle_find_emblem(optc, optv, 'B', GARGOYLE_FLG_ECASE);
CU_ASSERT_PTR_NOT_NULL(opt);
CU_ASSERT_NSTRING_EQUAL(opt->brand, "bar", opt->brand_sz);
optn = gargoyle_find_emblem(optc, optv, 'B', GARGOYLE_FLG_ECASE);
CU_ASSERT_PTR_NOT_NULL(optn);
CU_ASSERT_NSTRING_EQUAL(optn->brand, "bar", optn->brand_sz);
opt = gargoyle_find_emblem(optc, optv, 'g', 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_emblem(optc, optv, 'g', 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_emblem(optc, optv, 'o', 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_emblem(optc, optv, 'o', 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_emblem(optc, optv, 'P', 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_emblem(optc, optv, 'P', 0);
CU_ASSERT_PTR_NULL(optn);
opt = gargoyle_find_emblem(optc, optv, 'q', 0);
CU_ASSERT_PTR_NULL(opt);
optn = gargoyle_find_emblem(optc, optv, 'q', 0);
CU_ASSERT_PTR_NULL(optn);
}