X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=cli.c;h=144cddefa285f0fbdfaa4d88514404a6686b6258;hp=6e2a5ff4718016446d20bfa29ea9a7e10bd7bd1b;hb=2e90d2637abcbea12f5f4070be7a158fb4637604;hpb=e7f08cbbc35f6e761579634e7154b5660ac427e5 diff --git a/cli.c b/cli.c index 6e2a5ff..144cdde 100644 --- a/cli.c +++ b/cli.c @@ -19,12 +19,15 @@ #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), + CLI_FLAG_NOPLUGINS= (1 << 5), } flags; static FILE *input; @@ -34,9 +37,11 @@ enum { /* section cmds */ CMD_GET, CMD_SET, + CMD_ADD_LIST, CMD_DEL, CMD_RENAME, CMD_REVERT, + CMD_REORDER, /* package cmds */ CMD_SHOW, CMD_CHANGES, @@ -48,8 +53,74 @@ 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; + int maxlen; + + if (!s->anonymous || !(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; + } + + 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); + + ti->idx++; + + return typestr; +} + static void uci_usage(void) { fprintf(stderr, @@ -61,15 +132,20 @@ static void uci_usage(void) "\tchanges []\n" "\tcommit []\n" "\tadd \n" + "\tadd_list .
.