diff options
author | June McEnroe <june@causal.agency> | 2019-02-27 14:33:11 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2019-02-27 14:33:11 -0500 |
commit | d19a6b9347bb44cbc0a47571568c61104444a40f (patch) | |
tree | 644963c04f7c43feddfeea0d230e9b79699fbd07 | |
parent | Add type and ulimit shell keywords (diff) | |
download | src-d19a6b9347bb44cbc0a47571568c61104444a40f.tar.gz src-d19a6b9347bb44cbc0a47571568c61104444a40f.zip |
Use getsubopt(3) to parse -o options in hi
Diffstat (limited to '')
-rw-r--r-- | bin/hi.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/bin/hi.c b/bin/hi.c index a03b2dc9..c6cdcc5a 100644 --- a/bin/hi.c +++ b/bin/hi.c @@ -349,10 +349,11 @@ enum Option { OptionLen, }; -static const char *OptionKey[OptionLen] = { +static const char *OptionKey[OptionLen + 1] = { #define X(option, key) [option] = key, ENUM_OPTION #undef X + NULL, }; typedef void HeaderFn(const char *opts[]); @@ -649,13 +650,6 @@ static bool findFormat(struct Format *format, const char *name) { return false; } -static bool findOption(enum Option *opt, const char *key) { - for (*opt = 0; *opt < OptionLen; ++*opt) { - if (!strcmp(key, OptionKey[*opt])) return true; - } - return false; -} - int main(int argc, char *argv[]) { setlocale(LC_CTYPE, ""); @@ -680,14 +674,14 @@ int main(int argc, char *argv[]) { } break; case 'n': name = optarg; break; case 'o': { + char *val; enum Option key; - char *keystr, *valstr; - while (NULL != (valstr = strsep(&optarg, ","))) { - keystr = strsep(&valstr, "="); - if (!findOption(&key, keystr)) { - errx(EX_USAGE, "no such option %s", keystr); + while (optarg[0]) { + key = getsubopt(&optarg, (char *const *)OptionKey, &val); + if (key >= OptionLen) { + errx(EX_USAGE, "no such option %s", suboptarg); } - opts[key] = (valstr ? valstr : keystr); + opts[key] = (val ? val : ""); } } break; default: return EX_USAGE; |