summaryrefslogtreecommitdiffstats
path: root/arguments.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2021-08-20 22:01:46 +0100
committerThomas Adam <thomas@xteddy.org>2021-08-20 22:01:46 +0100
commitb0da0cee4d54aa64db0f49eee509a76fd89d6f68 (patch)
tree1e54ddb0b113708c46e80d342d10be74cdf7b176 /arguments.c
parent944fde7c57c4f3caebb04cfc3943a81ee9729de8 (diff)
parentd589be6c65c7295880bb84cd875baab2f77d5067 (diff)
Merge branch 'obsd-master' into master
Diffstat (limited to 'arguments.c')
-rw-r--r--arguments.c95
1 files changed, 52 insertions, 43 deletions
diff --git a/arguments.c b/arguments.c
index f6f6ecaf..92072ad5 100644
--- a/arguments.c
+++ b/arguments.c
@@ -28,10 +28,6 @@
* Manipulate command arguments.
*/
-struct args_value {
- char *value;
- TAILQ_ENTRY(args_value) entry;
-};
TAILQ_HEAD(args_values, args_value);
struct args_entry {
@@ -41,6 +37,12 @@ struct args_entry {
RB_ENTRY(args_entry) entry;
};
+struct args {
+ struct args_tree tree;
+ int argc;
+ char **argv;
+};
+
static struct args_entry *args_find(struct args *, u_char);
static int args_cmp(struct args_entry *, struct args_entry *);
@@ -76,7 +78,7 @@ args_create(void)
/* Parse an argv and argc into a new argument set. */
struct args *
-args_parse(const char *template, int argc, char **argv)
+args_parse(const char *template, int argc, char **argv, int lower, int upper)
{
struct args *args;
int opt;
@@ -102,6 +104,10 @@ args_parse(const char *template, int argc, char **argv)
args->argc = argc;
args->argv = cmd_copy_argv(argc, argv);
+ if ((lower != -1 && argc < lower) || (upper != -1 && argc > upper)) {
+ args_free(args);
+ return (NULL);
+ }
return (args);
}
@@ -129,11 +135,19 @@ args_free(struct args *args)
free(args);
}
+/* Convert arguments to vector. */
+void
+args_vector(struct args *args, int *argc, char ***argv)
+{
+ *argc = args->argc;
+ *argv = cmd_copy_argv(args->argc, args->argv);
+}
+
/* Add to string. */
static void printflike(3, 4)
args_print_add(char **buf, size_t *len, const char *fmt, ...)
{
- va_list ap;
+ va_list ap;
char *s;
size_t slen;
@@ -148,23 +162,6 @@ args_print_add(char **buf, size_t *len, const char *fmt, ...)
free(s);
}
-/* Add value to string. */
-static void
-args_print_add_value(char **buf, size_t *len, struct args_entry *entry,
- struct args_value *value)
-{
- char *escaped;
-
- if (**buf != '\0')
- args_print_add(buf, len, " -%c ", entry->flag);
- else
- args_print_add(buf, len, "-%c ", entry->flag);
-
- escaped = args_escape(value->value);
- args_print_add(buf, len, "%s", escaped);
- free(escaped);
-}
-
/* Add argument to string. */
static void
args_print_add_argument(char **buf, size_t *len, const char *argument)
@@ -183,7 +180,7 @@ args_print_add_argument(char **buf, size_t *len, const char *argument)
char *
args_print(struct args *args)
{
- size_t len;
+ size_t len;
char *buf;
int i;
u_int j;
@@ -206,8 +203,13 @@ args_print(struct args *args)
/* Then the flags with arguments. */
RB_FOREACH(entry, args_tree, &args->tree) {
- TAILQ_FOREACH(value, &entry->values, entry)
- args_print_add_value(&buf, &len, entry, value);
+ TAILQ_FOREACH(value, &entry->values, entry) {
+ if (*buf != '\0')
+ args_print_add(&buf, &len, " -%c", entry->flag);
+ else
+ args_print_add(&buf, &len, "-%c", entry->flag);
+ args_print_add_argument(&buf, &len, value->value);
+ }
}
/* And finally the argument vector. */
@@ -333,31 +335,38 @@ args_next(struct args_entry **entry)
return ((*entry)->flag);
}
-/* Get first value in argument. */
+/* Get argument count. */
+u_int
+args_count(struct args *args)
+{
+ return (args->argc);
+}
+
+/* Return argument as string. */
const char *
-args_first_value(struct args *args, u_char flag, struct args_value **value)
+args_string(struct args *args, u_int idx)
+{
+ if (idx >= (u_int)args->argc)
+ return (NULL);
+ return (args->argv[idx]);
+}
+
+/* Get first value in argument. */
+struct args_value *
+args_first_value(struct args *args, u_char flag)
{
struct args_entry *entry;
if ((entry = args_find(args, flag)) == NULL)
return (NULL);
-
- *value = TAILQ_FIRST(&entry->values);
- if (*value == NULL)
- return (NULL);
- return ((*value)->value);
+ return (TAILQ_FIRST(&entry->values));
}
/* Get next value in argument. */
-const char *
-args_next_value(struct args_value **value)
+struct args_value *
+args_next_value(struct args_value *value)
{
- if (*value == NULL)
- return (NULL);
- *value = TAILQ_NEXT(*value, entry);
- if (*value == NULL)
- return (NULL);
- return ((*value)->value);
+ return (TAILQ_NEXT(value, entry));
}
/* Convert an argument value to a number. */
@@ -366,7 +375,7 @@ args_strtonum(struct args *args, u_char flag, long long minval,
long long maxval, char **cause)
{
const char *errstr;
- long long ll;
+ long long ll;
struct args_entry *entry;
struct args_value *value;
@@ -408,7 +417,7 @@ args_string_percentage(const char *value, long long minval, long long maxval,
long long curval, char **cause)
{
const char *errstr;
- long long ll;
+ long long ll;
size_t valuelen = strlen(value);
char *copy;