version 1.53, 2019/10/14 08:38:07 |
version 1.54, 2019/10/15 08:30:36 |
|
|
return (RB_FIND(options_array, &o->value.array, &a)); |
return (RB_FIND(options_array, &o->value.array, &a)); |
} |
} |
|
|
|
static struct options_array_item * |
|
options_array_new(struct options_entry *o, u_int idx) |
|
{ |
|
struct options_array_item *a; |
|
|
|
a = xcalloc(1, sizeof *a); |
|
a->index = idx; |
|
RB_INSERT(options_array, &o->value.array, a); |
|
return (a); |
|
} |
|
|
static void |
static void |
options_array_free(struct options_entry *o, struct options_array_item *a) |
options_array_free(struct options_entry *o, struct options_array_item *a) |
{ |
{ |
|
|
return (-1); |
return (-1); |
} |
} |
|
|
if (OPTIONS_IS_COMMAND(o) && value != NULL) { |
if (value == NULL) { |
|
a = options_array_item(o, idx); |
|
if (a != NULL) |
|
options_array_free(o, a); |
|
return (0); |
|
} |
|
|
|
if (OPTIONS_IS_COMMAND(o)) { |
pr = cmd_parse_from_string(value, NULL); |
pr = cmd_parse_from_string(value, NULL); |
switch (pr->status) { |
switch (pr->status) { |
case CMD_PARSE_EMPTY: |
case CMD_PARSE_EMPTY: |
|
|
case CMD_PARSE_SUCCESS: |
case CMD_PARSE_SUCCESS: |
break; |
break; |
} |
} |
} |
|
|
|
a = options_array_item(o, idx); |
a = options_array_item(o, idx); |
if (value == NULL) { |
if (a == NULL) |
if (a != NULL) |
a = options_array_new(o, idx); |
options_array_free(o, a); |
else |
|
options_value_free(o, &a->value); |
|
a->value.cmdlist = pr->cmdlist; |
return (0); |
return (0); |
} |
} |
|
|
if (OPTIONS_IS_STRING(o)) { |
if (OPTIONS_IS_STRING(o)) { |
|
a = options_array_item(o, idx); |
if (a != NULL && append) |
if (a != NULL && append) |
xasprintf(&new, "%s%s", a->value.string, value); |
xasprintf(&new, "%s%s", a->value.string, value); |
else |
else |
new = xstrdup(value); |
new = xstrdup(value); |
|
if (a == NULL) |
|
a = options_array_new(o, idx); |
|
else |
|
options_value_free(o, &a->value); |
|
a->value.string = new; |
|
return (0); |
} |
} |
|
|
if (a == NULL) { |
if (cause != NULL) |
a = xcalloc(1, sizeof *a); |
*cause = xstrdup("wrong array type"); |
a->index = idx; |
return (-1); |
RB_INSERT(options_array, &o->value.array, a); |
|
} else |
|
options_value_free(o, &a->value); |
|
|
|
if (OPTIONS_IS_STRING(o)) |
|
a->value.string = new; |
|
else if (OPTIONS_IS_COMMAND(o)) |
|
a->value.cmdlist = pr->cmdlist; |
|
return (0); |
|
} |
} |
|
|
int |
int |