version 1.31, 2020/04/22 06:57:13 |
version 1.32, 2020/05/16 15:40:04 |
|
|
|
|
/* Find a flag in the arguments tree. */ |
/* Find a flag in the arguments tree. */ |
static struct args_entry * |
static struct args_entry * |
args_find(struct args *args, u_char ch) |
args_find(struct args *args, u_char flag) |
{ |
{ |
struct args_entry entry; |
struct args_entry entry; |
|
|
entry.flag = ch; |
entry.flag = flag; |
return (RB_FIND(args_tree, &args->tree, &entry)); |
return (RB_FIND(args_tree, &args->tree, &entry)); |
} |
} |
|
|
|
|
|
|
/* Return if an argument is present. */ |
/* Return if an argument is present. */ |
int |
int |
args_has(struct args *args, u_char ch) |
args_has(struct args *args, u_char flag) |
{ |
{ |
struct args_entry *entry; |
struct args_entry *entry; |
|
|
entry = args_find(args, ch); |
entry = args_find(args, flag); |
if (entry == NULL) |
if (entry == NULL) |
return (0); |
return (0); |
return (entry->count); |
return (entry->count); |
|
|
|
|
/* Set argument value in the arguments tree. */ |
/* Set argument value in the arguments tree. */ |
void |
void |
args_set(struct args *args, u_char ch, const char *s) |
args_set(struct args *args, u_char flag, const char *s) |
{ |
{ |
struct args_entry *entry; |
struct args_entry *entry; |
struct args_value *value; |
struct args_value *value; |
|
|
entry = args_find(args, ch); |
entry = args_find(args, flag); |
if (entry == NULL) { |
if (entry == NULL) { |
entry = xcalloc(1, sizeof *entry); |
entry = xcalloc(1, sizeof *entry); |
entry->flag = ch; |
entry->flag = flag; |
entry->count = 1; |
entry->count = 1; |
TAILQ_INIT(&entry->values); |
TAILQ_INIT(&entry->values); |
RB_INSERT(args_tree, &args->tree, entry); |
RB_INSERT(args_tree, &args->tree, entry); |
|
|
|
|
/* Get argument value. Will be NULL if it isn't present. */ |
/* Get argument value. Will be NULL if it isn't present. */ |
const char * |
const char * |
args_get(struct args *args, u_char ch) |
args_get(struct args *args, u_char flag) |
{ |
{ |
struct args_entry *entry; |
struct args_entry *entry; |
|
|
if ((entry = args_find(args, ch)) == NULL) |
if ((entry = args_find(args, flag)) == NULL) |
return (NULL); |
return (NULL); |
|
if (TAILQ_EMPTY(&entry->values)) |
|
return (NULL); |
return (TAILQ_LAST(&entry->values, args_values)->value); |
return (TAILQ_LAST(&entry->values, args_values)->value); |
} |
} |
|
|
|
/* Get first argument. */ |
|
u_char |
|
args_first(struct args *args, struct args_entry **entry) |
|
{ |
|
*entry = RB_MIN(args_tree, &args->tree); |
|
if (*entry == NULL) |
|
return (0); |
|
return ((*entry)->flag); |
|
} |
|
|
|
/* Get next argument. */ |
|
u_char |
|
args_next(struct args_entry **entry) |
|
{ |
|
*entry = RB_NEXT(args_tree, &args->tree, *entry); |
|
if (*entry == NULL) |
|
return (0); |
|
return ((*entry)->flag); |
|
} |
|
|
/* Get first value in argument. */ |
/* Get first value in argument. */ |
const char * |
const char * |
args_first_value(struct args *args, u_char ch, struct args_value **value) |
args_first_value(struct args *args, u_char flag, struct args_value **value) |
{ |
{ |
struct args_entry *entry; |
struct args_entry *entry; |
|
|
if ((entry = args_find(args, ch)) == NULL) |
if ((entry = args_find(args, flag)) == NULL) |
return (NULL); |
return (NULL); |
|
|
*value = TAILQ_FIRST(&entry->values); |
*value = TAILQ_FIRST(&entry->values); |
|
|
|
|
/* Convert an argument value to a number. */ |
/* Convert an argument value to a number. */ |
long long |
long long |
args_strtonum(struct args *args, u_char ch, long long minval, long long maxval, |
args_strtonum(struct args *args, u_char flag, long long minval, |
char **cause) |
long long maxval, char **cause) |
{ |
{ |
const char *errstr; |
const char *errstr; |
long long ll; |
long long ll; |
struct args_entry *entry; |
struct args_entry *entry; |
struct args_value *value; |
struct args_value *value; |
|
|
if ((entry = args_find(args, ch)) == NULL) { |
if ((entry = args_find(args, flag)) == NULL) { |
*cause = xstrdup("missing"); |
*cause = xstrdup("missing"); |
return (0); |
return (0); |
} |
} |
|
|
|
|
/* Convert an argument to a number which may be a percentage. */ |
/* Convert an argument to a number which may be a percentage. */ |
long long |
long long |
args_percentage(struct args *args, u_char ch, long long minval, |
args_percentage(struct args *args, u_char flag, long long minval, |
long long maxval, long long curval, char **cause) |
long long maxval, long long curval, char **cause) |
{ |
{ |
const char *value; |
const char *value; |
struct args_entry *entry; |
struct args_entry *entry; |
|
|
if ((entry = args_find(args, ch)) == NULL) { |
if ((entry = args_find(args, flag)) == NULL) { |
*cause = xstrdup("missing"); |
*cause = xstrdup("missing"); |
return (0); |
return (0); |
} |
} |