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:
043baa6
)
parser: fix precedence of quoting over ; as command terminator, thx to netprince...
author
Felix Fietkau
<nbd@openwrt.org>
Tue, 8 Apr 2008 19:20:41 +0000
(21:20 +0200)
committer
Felix Fietkau
<nbd@openwrt.org>
Tue, 8 Apr 2008 19:20:41 +0000
(21:20 +0200)
file.c
patch
|
blob
|
history
util.c
patch
|
blob
|
history
diff --git
a/file.c
b/file.c
index
740b1d5
..
5360ef7
100644
(file)
--- a/
file.c
+++ b/
file.c
@@
-35,6
+35,7
@@
static void assert_eol(struct uci_context *ctx, char **str)
{
char *tmp;
{
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");
tmp = next_arg(ctx, str, false, false);
if (*tmp && (ctx->flags & UCI_FLAG_STRICT))
uci_parse_error(ctx, *str, "too many arguments");
@@
-169,19
+170,17
@@
error:
static void uci_parse_line(struct uci_context *ctx, bool single)
{
struct uci_parse_context *pctx = ctx->pctx;
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)
if (!word)
-
continue
;
+
return
;
switch(word[0]) {
switch(word[0]) {
+ case 0:
case '#':
return;
case 'p':
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;
}
uci_parse_error(ctx, word, "unterminated command");
break;
}
- }
+ }
while (1);
}
/* max number of characters that escaping adds to the string */
}
/* max number of characters that escaping adds to the string */
diff --git
a/util.c
b/util.c
index
cba69c3
..
a85ec9b
100644
(file)
--- a/
util.c
+++ b/
util.c
@@
-303,6
+303,7
@@
static void parse_single_quote(struct uci_context *ctx, char **str, char **targe
*/
static void parse_str(struct uci_context *ctx, char **str, char **target)
{
*/
static void parse_str(struct uci_context *ctx, char **str, char **target)
{
+ bool next = true;
do {
switch(**str) {
case '\'':
do {
switch(**str) {
case '\'':
@@
-316,6
+317,9
@@
static void parse_str(struct uci_context *ctx, char **str, char **target)
/* fall through */
case 0:
goto done;
/* fall through */
case 0:
goto done;
+ case ';':
+ next = false;
+ goto done;
case '\\':
if (!parse_backslash(ctx, str))
continue;
case '\\':
if (!parse_backslash(ctx, str))
continue;
@@
-332,7
+336,7
@@
done:
* character, skip to the next one, because the whitespace will
* be overwritten by a null byte here
*/
* character, skip to the next one, because the whitespace will
* be overwritten by a null byte here
*/
- if (**str)
+ if (**str
&& next
)
*str += 1;
/* terminate the parsed string */
*str += 1;
/* terminate the parsed string */
@@
-349,7
+353,12
@@
static char *next_arg(struct uci_context *ctx, char **str, bool required, bool n
val = ptr = *str;
skip_whitespace(ctx, str);
val = ptr = *str;
skip_whitespace(ctx, str);
- parse_str(ctx, str, &ptr);
+ if(*str[0] == ';') {
+ *str[0] = 0;
+ *str += 1;
+ } else {
+ parse_str(ctx, str, &ptr);
+ }
if (!*val) {
if (required)
uci_parse_error(ctx, *str, "insufficient arguments");
if (!*val) {
if (required)
uci_parse_error(ctx, *str, "insufficient arguments");