diff options
author | Thomas Adam <thomas@xteddy.org> | 2020-03-21 14:01:27 +0000 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2020-03-21 14:01:27 +0000 |
commit | 5123bb7db4ce2f8744957a888c8fa264c1423166 (patch) | |
tree | 4696260f9d7eab850f37f6d85610cd1714b69aef /arguments.c | |
parent | c6d4baa4e5d5d36990049917cb9cbb0ca4092b86 (diff) | |
parent | af6ae35900a066389c1c9b4dbd430b557fcb8816 (diff) | |
download | rtmux-5123bb7db4ce2f8744957a888c8fa264c1423166.tar.gz rtmux-5123bb7db4ce2f8744957a888c8fa264c1423166.tar.bz2 rtmux-5123bb7db4ce2f8744957a888c8fa264c1423166.zip |
Merge branch 'obsd-master'
Diffstat (limited to 'arguments.c')
-rw-r--r-- | arguments.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/arguments.c b/arguments.c index e2d18980..e9af70ac 100644 --- a/arguments.c +++ b/arguments.c @@ -343,3 +343,53 @@ args_strtonum(struct args *args, u_char ch, long long minval, long long maxval, *cause = NULL; return (ll); } + +/* Convert an argument to a number which may be a percentage. */ +long long +args_percentage(struct args *args, u_char ch, long long minval, + long long maxval, long long curval, char **cause) +{ + const char *errstr; + long long ll; + struct args_entry *entry; + struct args_value *value; + size_t valuelen; + char *copy; + + if ((entry = args_find(args, ch)) == NULL) { + *cause = xstrdup("missing"); + return (0); + } + value = TAILQ_LAST(&entry->values, args_values); + valuelen = strlen(value->value); + + if (value->value[valuelen - 1] == '%') { + copy = xstrdup(value->value); + copy[valuelen - 1] = '\0'; + + ll = strtonum(copy, 0, 100, &errstr); + free(copy); + if (errstr != NULL) { + *cause = xstrdup(errstr); + return (0); + } + ll = (curval * ll) / 100; + if (ll < minval) { + *cause = xstrdup("too large"); + return (0); + } + if (ll > maxval) { + *cause = xstrdup("too small"); + return (0); + } + } else { + ll = strtonum(value->value, minval, maxval, &errstr); + if (errstr != NULL) { + *cause = xstrdup(errstr); + return (0); + } + } + + *cause = NULL; + return (ll); +} |