X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=file.c;h=13fdd3bfb9d3cd4930cfb20f679582350a1dbd1e;hb=4837364113f30c793b373073d27508fec6234ed3;hp=d320ba6c3cd66d49bd708d0756826c80511f3548;hpb=2a3ffb0a3f38d814ae3b9cb7e7fa868218b45423;p=project%2Fuci.git diff --git a/file.c b/file.c index d320ba6..13fdd3b 100644 --- a/file.c +++ b/file.c @@ -35,6 +35,7 @@ static void assert_eol(struct uci_context *ctx, char **str) { char *tmp; + skip_whitespace(ctx, str); tmp = next_arg(ctx, str, false, false); if (*tmp && (ctx->flags & UCI_FLAG_STRICT)) uci_parse_error(ctx, *str, "too many arguments"); @@ -127,7 +128,7 @@ static void uci_parse_config(struct uci_context *ctx, char **str) UCI_TRAP_RESTORE(ctx); return; error: - UCI_THROW(ctx, ctx->errno); + UCI_THROW(ctx, ctx->err); } else pctx->section = uci_alloc_section(pctx->package, type, name); } @@ -157,7 +158,7 @@ static void uci_parse_option(struct uci_context *ctx, char **str) UCI_TRAP_RESTORE(ctx); return; error: - UCI_THROW(ctx, ctx->errno); + UCI_THROW(ctx, ctx->err); } else uci_alloc_option(pctx->section, name, value); } @@ -169,19 +170,17 @@ error: static void uci_parse_line(struct uci_context *ctx, bool single) { struct uci_parse_context *pctx = ctx->pctx; - char *word, *brk = NULL; - - for (word = strtok_r(pctx->buf, ";", &brk); - word; - word = strtok_r(NULL, ";", &brk)) { - - char *pbrk = NULL; - word = strtok_r(word, " \t", &pbrk); + char *word, *brk; + word = pctx->buf; + do { + brk = NULL; + word = strtok_r(word, " \t", &brk); if (!word) - continue; + return; switch(word[0]) { + case 0: case '#': return; case 'p': @@ -200,7 +199,7 @@ static void uci_parse_line(struct uci_context *ctx, bool single) uci_parse_error(ctx, word, "unterminated command"); break; } - } + } while (1); } /* max number of characters that escaping adds to the string */ @@ -324,12 +323,14 @@ int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct u error: if (ctx->flags & UCI_FLAG_PERROR) uci_perror(ctx, NULL); - if ((ctx->errno != UCI_ERR_PARSE) || + if ((ctx->err != UCI_ERR_PARSE) || (ctx->flags & UCI_FLAG_STRICT)) - UCI_THROW(ctx, ctx->errno); + UCI_THROW(ctx, ctx->err); } uci_fixup_section(ctx, ctx->pctx->section); + if (!pctx->package && name) + uci_switch_config(ctx); if (package) *package = pctx->package; if (pctx->merge) @@ -420,8 +421,8 @@ done: if (path) free(path); uci_close_stream(f); - if (ctx->errno) - UCI_THROW(ctx, ctx->errno); + if (ctx->err) + UCI_THROW(ctx, ctx->err); } @@ -510,7 +511,7 @@ static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na } file = uci_open_stream(ctx, filename, SEEK_SET, false, false); - ctx->errno = 0; + ctx->err = 0; UCI_TRAP_SAVE(ctx, done); UCI_INTERNAL(uci_import, ctx, file, name, &package, true); UCI_TRAP_RESTORE(ctx); @@ -523,8 +524,8 @@ static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na done: uci_close_stream(file); - if (ctx->errno) - UCI_THROW(ctx, ctx->errno); + if (ctx->err) + UCI_THROW(ctx, ctx->err); return package; }