summary refs log tree commit diff
path: root/bin
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-02-27 14:33:11 -0500
committerJune McEnroe <june@causal.agency>2019-02-27 14:33:11 -0500
commitd19a6b9347bb44cbc0a47571568c61104444a40f (patch)
tree644963c04f7c43feddfeea0d230e9b79699fbd07 /bin
parentAdd type and ulimit shell keywords (diff)
downloadsrc-d19a6b9347bb44cbc0a47571568c61104444a40f.tar.gz
src-d19a6b9347bb44cbc0a47571568c61104444a40f.zip
Use getsubopt(3) to parse -o options in hi
Diffstat (limited to 'bin')
-rw-r--r--bin/hi.c22
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;