X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=cli.c;h=f8b45dba091f088f84e22dc98503fe9e6e1fd7e3;hp=9787988d4c957dffbf27da50fc9bfaac556c9265;hb=021fd65643a7932dc67ebeb2291264e308432428;hpb=976e6db54ee86c7198e68b48cea2f9f1db9c3425 diff --git a/cli.c b/cli.c index 9787988..f8b45db 100644 --- a/cli.c +++ b/cli.c @@ -14,17 +14,21 @@ #include #include #include +#include +#include #include #include "uci.h" #define MAX_ARGS 4 /* max command line arguments for batch mode */ +static const char *delimiter = " "; static const char *appname; static enum { CLI_FLAG_MERGE = (1 << 0), CLI_FLAG_QUIET = (1 << 1), CLI_FLAG_NOCOMMIT = (1 << 2), CLI_FLAG_BATCH = (1 << 3), + CLI_FLAG_SHOW_EXT = (1 << 4), } flags; static FILE *input; @@ -34,9 +38,12 @@ enum { /* section cmds */ CMD_GET, CMD_SET, + CMD_ADD_LIST, + CMD_DEL_LIST, CMD_DEL, CMD_RENAME, CMD_REVERT, + CMD_REORDER, /* package cmds */ CMD_SHOW, CMD_CHANGES, @@ -48,8 +55,81 @@ enum { CMD_HELP, }; +struct uci_type_list { + unsigned int idx; + const char *name; + struct uci_type_list *next; +}; + +static struct uci_type_list *type_list = NULL; +static char *typestr = NULL; +static const char *cur_section_ref = NULL; + static int uci_cmd(int argc, char **argv); +static void +uci_reset_typelist(void) +{ + struct uci_type_list *type; + while (type_list != NULL) { + type = type_list; + type_list = type_list->next; + free(type); + } + if (typestr) { + free(typestr); + typestr = NULL; + } + cur_section_ref = NULL; +} + +static char * +uci_lookup_section_ref(struct uci_section *s) +{ + struct uci_type_list *ti = type_list; + char *ret; + int maxlen; + + if (!(flags & CLI_FLAG_SHOW_EXT)) + return s->e.name; + + /* look up in section type list */ + while (ti) { + if (strcmp(ti->name, s->type) == 0) + break; + ti = ti->next; + } + if (!ti) { + ti = malloc(sizeof(struct uci_type_list)); + if (!ti) + return NULL; + memset(ti, 0, sizeof(struct uci_type_list)); + ti->next = type_list; + type_list = ti; + ti->name = s->type; + } + + if (s->anonymous) { + maxlen = strlen(s->type) + 1 + 2 + 10; + if (!typestr) { + typestr = malloc(maxlen); + } else { + typestr = realloc(typestr, maxlen); + } + + if (typestr) + sprintf(typestr, "@%s[%d]", ti->name, ti->idx); + + ret = typestr; + } else { + ret = s->e.name; + } + + ti->idx++; + + return ret; +} + static void uci_usage(void) { fprintf(stderr, @@ -61,14 +141,19 @@ static void uci_usage(void) "\tchanges []\n" "\tcommit []\n" "\tadd \n" + "\tadd_list .
.