projects
/
project
/
uci.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
13290b7
)
replace the uci_escape function with something cleaner, fixes some quoted string...
author
Felix Fietkau
<nbd@openwrt.org>
Wed, 4 Jun 2008 22:38:32 +0000
(
00:38
+0200)
committer
Felix Fietkau
<nbd@openwrt.org>
Wed, 4 Jun 2008 22:38:32 +0000
(
00:38
+0200)
file.c
patch
|
blob
|
history
diff --git
a/file.c
b/file.c
index
5ec0032
..
c513c87
100644
(file)
--- a/
file.c
+++ b/
file.c
@@
-208,42
+208,47
@@
static void uci_parse_line(struct uci_context *ctx, bool single)
/*
* escape an uci string for export
*/
/*
* escape an uci string for export
*/
-static char *uci_escape(struct uci_context *ctx, char *str)
+static char *uci_escape(struct uci_context *ctx, c
onst c
har *str)
{
{
- c
har *s, *p
;
- int
po
s = 0;
+ c
onst char *end
;
+ int
of
s = 0;
if (!ctx->buf) {
ctx->bufsz = LINEBUF;
ctx->buf = malloc(LINEBUF);
}
if (!ctx->buf) {
ctx->bufsz = LINEBUF;
ctx->buf = malloc(LINEBUF);
}
- s = str;
- p = strchr(str, '\'');
- if (!p)
- return str;
+ while (1) {
+ int len;
- do {
- int len = p - s;
- if (len > 0) {
- if (p + sizeof(UCI_QUOTE_ESCAPE) - str >= ctx->bufsz) {
- ctx->bufsz *= 2;
- ctx->buf = realloc(ctx->buf, ctx->bufsz);
- if (!ctx->buf)
- UCI_THROW(ctx, UCI_ERR_MEM);
- }
- memcpy(&ctx->buf[pos], s, len);
- pos += len;
+ end = strchr(str, '\'');
+ if (!end)
+ end = str + strlen(str);
+ len = end - str;
+
+ /* make sure that we have enough room in the buffer */
+ while (ofs + len + sizeof(UCI_QUOTE_ESCAPE) + 1 > ctx->bufsz) {
+ ctx->bufsz *= 2;
+ ctx->buf = uci_realloc(ctx, ctx->buf, ctx->bufsz);
}
}
- strcpy(&ctx->buf[pos], UCI_QUOTE_ESCAPE);
- pos += sizeof(UCI_QUOTE_ESCAPE);
- s = p + 1;
- } while ((p = strchr(s, '\'')));
+ /* copy the string until the character before the quote */
+ memcpy(&ctx->buf[ofs], str, len);
+ ofs += len;
+
+ /* end of string? return the buffer */
+ if (*end == 0)
+ break;
+
+ memcpy(&ctx->buf[ofs], UCI_QUOTE_ESCAPE, sizeof(UCI_QUOTE_ESCAPE));
+ ofs += strlen(&ctx->buf[ofs]);
+ str = end + 1;
+ }
+
+ ctx->buf[ofs] = 0;
return ctx->buf;
}
return ctx->buf;
}
-
/*
* export a single config package to a file stream
*/
/*
* export a single config package to a file stream
*/