X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=parse.c;h=9c9dc59461592b637e744509108eb5ca3c430011;hp=b6ee73426f7321b716c1a040449b52cdda612e62;hb=a652efc7675db8b2c0571899609b42e539162141;hpb=18fb97c63cef0493f9bd8625692c7f614f0af21c diff --git a/parse.c b/parse.c index b6ee734..9c9dc59 100644 --- a/parse.c +++ b/parse.c @@ -126,25 +126,47 @@ static char *parse_unquoted(char **str) while (**str && !isspace(**str)) *str += 1; - **str = 0; - *str += 1; + + if (**str) { + **str = 0; + *str += 1; + } return val; } -static char *next_arg(char **str) +static char *next_arg(struct uci_context *ctx, char **str, bool required) { + char *val; skip_whitespace(str); switch (**str) { case '"': - return parse_double_quote(str); + val = parse_double_quote(str); case '\'': - return parse_single_quote(str); + val = parse_single_quote(str); case 0: - return NULL; + val = NULL; default: - return parse_unquoted(str); + val = parse_unquoted(str); + } + + if (required && !val) { + ctx->pctx->byte = *str - ctx->pctx->buf; + UCI_THROW(ctx, UCI_ERR_PARSE); + } + + return val; +} + +static void assert_eol(struct uci_context *ctx, char **str) +{ + char *tmp; + + tmp = next_arg(ctx, str, false); + if (tmp) { + ctx->pctx->byte = tmp - ctx->pctx->buf; + UCI_THROW(ctx, UCI_ERR_PARSE); } } @@ -159,13 +181,10 @@ static void uci_parse_config(struct uci_context *ctx, char **str) UCI_THROW(ctx, UCI_ERR_PARSE); } - type = next_arg(str); - if (!type) { - ctx->pctx->byte = *str - ctx->pctx->buf; - UCI_THROW(ctx, UCI_ERR_PARSE); - } - - name = next_arg(str); + type = next_arg(ctx, str, true); + name = next_arg(ctx, str, false); + assert_eol(ctx, str); + DPRINTF("Section<%s>: %s\n", type, name); } @@ -175,17 +194,9 @@ static void uci_parse_option(struct uci_context *ctx, char **str) *str += strlen(*str) + 1; - name = next_arg(str); - if (!name) { - ctx->pctx->byte = *str - ctx->pctx->buf; - UCI_THROW(ctx, UCI_ERR_PARSE); - } - - value = next_arg(str); - if (!value) { - ctx->pctx->byte = *str - ctx->pctx->buf; - UCI_THROW(ctx, UCI_ERR_PARSE); - } + name = next_arg(ctx, str, true); + value = next_arg(ctx, str, true); + assert_eol(ctx, str); DPRINTF("\tOption: %s=\"%s\"\n", name, value); }