summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYousong Zhou <yszhou4tech@gmail.com>2014-12-16 15:00:15 +0800
committerFelix Fietkau <nbd@openwrt.org>2014-12-18 12:38:15 +0100
commit8aaed0dcd6b7398ca02fb2fa59886a30e9a32b60 (patch)
tree3871d3e8ef9c57034c74890829603d0acd636963
parent32815cf4959c3219b8b6051efcf045c0d829dc10 (diff)
downloaduci-8aaed0dcd6b7398ca02fb2fa59886a30e9a32b60.tar.gz
delta: preprocess delta line with uci_parse_argument().
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
-rw-r--r--delta.c25
-rw-r--r--file.c7
2 files changed, 15 insertions, 17 deletions
diff --git a/delta.c b/delta.c
index b56df5b..2eb2ae7 100644
--- a/delta.c
+++ b/delta.c
@@ -95,11 +95,14 @@ int uci_add_delta_path(struct uci_context *ctx, const char *dir)
return 0;
}
-static inline int uci_parse_delta_tuple(struct uci_context *ctx, char **buf, struct uci_ptr *ptr)
+static inline int uci_parse_delta_tuple(struct uci_context *ctx, struct uci_ptr *ptr)
{
+ struct uci_parse_context *pctx = ctx->pctx;
+ char *str = pctx_cur_str(pctx), *arg;
int c = UCI_CMD_CHANGE;
- switch(**buf) {
+ UCI_INTERNAL(uci_parse_argument, ctx, ctx->pctx->file, &str, &arg);
+ switch(*arg) {
case '^':
c = UCI_CMD_REORDER;
break;
@@ -122,9 +125,9 @@ static inline int uci_parse_delta_tuple(struct uci_context *ctx, char **buf, str
}
if (c != UCI_CMD_CHANGE)
- *buf += 1;
+ arg += 1;
- UCI_INTERNAL(uci_parse_ptr, ctx, ptr, *buf);
+ UCI_INTERNAL(uci_parse_ptr, ctx, ptr, arg);
if (!ptr->section)
goto error;
@@ -155,13 +158,13 @@ error:
return 0;
}
-static void uci_parse_delta_line(struct uci_context *ctx, struct uci_package *p, char *buf)
+static void uci_parse_delta_line(struct uci_context *ctx, struct uci_package *p)
{
struct uci_element *e = NULL;
struct uci_ptr ptr;
int cmd;
- cmd = uci_parse_delta_tuple(ctx, &buf, &ptr);
+ cmd = uci_parse_delta_tuple(ctx, &ptr);
if (strcmp(ptr.package, p->e.name) != 0)
goto error;
@@ -214,6 +217,7 @@ static int uci_parse_delta(struct uci_context *ctx, FILE *stream, struct uci_pac
pctx->file = stream;
while (!feof(pctx->file)) {
+ pctx->pos = 0;
uci_getln(ctx, 0);
if (!pctx->buf[0])
continue;
@@ -223,7 +227,7 @@ static int uci_parse_delta(struct uci_context *ctx, FILE *stream, struct uci_pac
* delta as possible
*/
UCI_TRAP_SAVE(ctx, error);
- uci_parse_delta_line(ctx, p, pctx->buf);
+ uci_parse_delta_line(ctx, p);
UCI_TRAP_RESTORE(ctx);
changes++;
error:
@@ -311,11 +315,10 @@ static void uci_filter_delta(struct uci_context *ctx, const char *name, const ch
pctx->file = f;
while (!feof(f)) {
struct uci_element *e;
- char *buf;
+ pctx->pos = 0;
uci_getln(ctx, 0);
- buf = pctx->buf;
- if (!buf[0])
+ if (!pctx->buf[0])
continue;
/* NB: need to allocate the element before the call to
@@ -324,7 +327,7 @@ static void uci_filter_delta(struct uci_context *ctx, const char *name, const ch
e = uci_alloc_generic(ctx, UCI_TYPE_DELTA, pctx->buf, sizeof(struct uci_element));
uci_list_add(&list, &e->list);
- uci_parse_delta_tuple(ctx, &buf, &ptr);
+ uci_parse_delta_tuple(ctx, &ptr);
if (section) {
if (!ptr.section || (strcmp(section, ptr.section) != 0))
continue;
diff --git a/file.c b/file.c
index 0fc68a6..5be2e66 100644
--- a/file.c
+++ b/file.c
@@ -278,13 +278,8 @@ int uci_parse_argument(struct uci_context *ctx, FILE *stream, char **str, char *
uci_alloc_parse_context(ctx);
ctx->pctx->file = stream;
-
- if (!*str) {
+ if (!*str)
uci_getln(ctx, 0);
- *str = ctx->pctx->buf;
- } else {
- UCI_ASSERT(ctx, ctx->pctx->pos == *str - ctx->pctx->buf);
- }
/*FIXME do we need to skip empty lines? */
ofs_result = next_arg(ctx, false, false);