projects
/
project
/
uci.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
more export stuff
[project/uci.git]
/
parse.c
diff --git
a/parse.c
b/parse.c
index
5158028
..
1297b80
100644
(file)
--- a/
parse.c
+++ b/
parse.c
@@
-80,7
+80,7
@@
static void uci_parse_cleanup(struct uci_context *ctx)
ctx->pctx = NULL;
if (pctx->cfg) {
uci_list_del(&pctx->cfg->list);
ctx->pctx = NULL;
if (pctx->cfg) {
uci_list_del(&pctx->cfg->list);
- uci_drop_
file
(pctx->cfg);
+ uci_drop_
config
(pctx->cfg);
}
if (pctx->buf)
free(pctx->buf);
}
if (pctx->buf)
free(pctx->buf);
@@
-246,14
+246,26
@@
static void assert_eol(struct uci_context *ctx, char **str)
*/
static void uci_parse_config(struct uci_context *ctx, char **str)
{
*/
static void uci_parse_config(struct uci_context *ctx, char **str)
{
- char *type, *name;
+ char *name = NULL;
+ char *type = NULL;
/* command string null-terminated by strtok */
*str += strlen(*str) + 1;
/* command string null-terminated by strtok */
*str += strlen(*str) + 1;
+ UCI_TRAP_SAVE(ctx, error);
type = next_arg(ctx, str, true);
name = next_arg(ctx, str, false);
assert_eol(ctx, str);
type = next_arg(ctx, str, true);
name = next_arg(ctx, str, false);
assert_eol(ctx, str);
+ ctx->pctx->section = uci_add_section(ctx->pctx->cfg, type, name);
+ UCI_TRAP_RESTORE(ctx);
+ return;
+
+error:
+ if (name)
+ free(name);
+ if (type)
+ free(type);
+ UCI_THROW(ctx, ctx->errno);
}
/*
}
/*
@@
-261,14
+273,31
@@
static void uci_parse_config(struct uci_context *ctx, char **str)
*/
static void uci_parse_option(struct uci_context *ctx, char **str)
{
*/
static void uci_parse_option(struct uci_context *ctx, char **str)
{
- char *name, *value;
+ char *name = NULL;
+ char *value = NULL;
+ if (!ctx->pctx->section) {
+ ctx->pctx->byte = *str - ctx->pctx->buf;
+ ctx->pctx->reason = "option command found before the first section";
+ UCI_THROW(ctx, UCI_ERR_PARSE);
+ }
/* command string null-terminated by strtok */
*str += strlen(*str) + 1;
/* command string null-terminated by strtok */
*str += strlen(*str) + 1;
+ UCI_TRAP_SAVE(ctx, error);
name = next_arg(ctx, str, true);
value = next_arg(ctx, str, true);
assert_eol(ctx, str);
name = next_arg(ctx, str, true);
value = next_arg(ctx, str, true);
assert_eol(ctx, str);
+ uci_add_option(ctx->pctx->section, name, value);
+ UCI_TRAP_RESTORE(ctx);
+ return;
+
+error:
+ if (name)
+ free(name);
+ if (value)
+ free(value);
+ UCI_THROW(ctx, ctx->errno);
}
/*
}
/*
@@
-304,7
+333,7
@@
static void uci_parse_line(struct uci_context *ctx)
}
}
}
}
-int uci_load(struct uci_context *ctx, const char *name)
+int uci_load(struct uci_context *ctx, const char *name
, struct uci_config **cfg
)
{
struct uci_parse_context *pctx;
struct stat statbuf;
{
struct uci_parse_context *pctx;
struct stat statbuf;
@@
-314,6
+343,13
@@
int uci_load(struct uci_context *ctx, const char *name)
UCI_HANDLE_ERR(ctx);
UCI_ASSERT(ctx, name != NULL);
UCI_HANDLE_ERR(ctx);
UCI_ASSERT(ctx, name != NULL);
+ UCI_TRAP_SAVE(ctx, ignore);
+ uci_unload(ctx, name);
+ UCI_TRAP_RESTORE(ctx);
+
+ignore:
+ ctx->errno = 0;
+
/* make sure no memory from previous parse attempts is leaked */
uci_parse_cleanup(ctx);
/* make sure no memory from previous parse attempts is leaked */
uci_parse_cleanup(ctx);
@@
-335,8
+371,9
@@
int uci_load(struct uci_context *ctx, const char *name)
}
if ((stat(filename, &statbuf) < 0) ||
}
if ((stat(filename, &statbuf) < 0) ||
- ((statbuf.st_mode & S_IFMT) != S_IFREG))
+ ((statbuf.st_mode & S_IFMT) != S_IFREG))
{
UCI_THROW(ctx, UCI_ERR_NOTFOUND);
UCI_THROW(ctx, UCI_ERR_NOTFOUND);
+ }
pctx->file = fopen(filename, "r");
if (filename != name)
pctx->file = fopen(filename, "r");
if (filename != name)
@@
-345,7
+382,7
@@
int uci_load(struct uci_context *ctx, const char *name)
if (!pctx->file)
UCI_THROW(ctx, UCI_ERR_IO);
if (!pctx->file)
UCI_THROW(ctx, UCI_ERR_IO);
- pctx->cfg = uci_alloc_
file
(ctx, name);
+ pctx->cfg = uci_alloc_
config
(ctx, name);
while (!feof(pctx->file)) {
uci_getln(ctx);
while (!feof(pctx->file)) {
uci_getln(ctx);
@@
-355,6
+392,9
@@
int uci_load(struct uci_context *ctx, const char *name)
/* add to main config file list */
uci_list_add(&ctx->root, &pctx->cfg->list);
/* add to main config file list */
uci_list_add(&ctx->root, &pctx->cfg->list);
+ if (cfg)
+ *cfg = pctx->cfg;
+
pctx->cfg = NULL;
/* no error happened, we can get rid of the parser context now */
pctx->cfg = NULL;
/* no error happened, we can get rid of the parser context now */