summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlasdair Kergon <agk@redhat.com>2003-02-03 20:08:45 +0000
committerAlasdair Kergon <agk@redhat.com>2003-02-03 20:08:45 +0000
commitc0002e576ea0ce2c141a7ed33f1aa05756de849b (patch)
tree70f44c068ca211ba613042b70178e9ee976d3a0b
parentefb63f4740dc09a53d1ec2c20edc73aa94e69bc6 (diff)
downloadlvm2-c0002e576ea0ce2c141a7ed33f1aa05756de849b.tar.gz
lvm2-c0002e576ea0ce2c141a7ed33f1aa05756de849b.tar.xz
lvm2-c0002e576ea0ce2c141a7ed33f1aa05756de849b.zip
Identifiers may now start with digits etc.
-rw-r--r--lib/config/config.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/lib/config/config.c b/lib/config/config.c
index 65125f03..bfd1b6d3 100644
--- a/lib/config/config.c
+++ b/lib/config/config.c
@@ -50,7 +50,7 @@ struct cs {
char *filename;
};
-static void _get_token(struct parser *p);
+static void _get_token(struct parser *p, int tok_prev);
static void _eat_space(struct parser *p);
static struct config_node *_file(struct parser *p);
static struct config_node *_section(struct parser *p);
@@ -175,7 +175,7 @@ int read_config_fd(struct config_tree *cf, int fd, const char *file,
/* parse */
p->tb = p->te = p->fb;
p->line = 1;
- _get_token(p);
+ _get_token(p, TOK_SECTION_E);
if (!(cf->root = _file(p))) {
stack;
goto out;
@@ -536,15 +536,17 @@ static int _match_aux(struct parser *p, int t)
if (p->t != t)
return 0;
- _get_token(p);
+ _get_token(p, t);
return 1;
}
/*
* tokeniser
*/
-static void _get_token(struct parser *p)
+static void _get_token(struct parser *p, int tok_prev)
{
+ int values_allowed = 0;
+
p->tb = p->te;
_eat_space(p);
if (p->tb == p->fe || !*p->tb) {
@@ -552,6 +554,11 @@ static void _get_token(struct parser *p)
return;
}
+ /* Should next token be interpreted as value instead of identifier? */
+ if (tok_prev == TOK_EQ || tok_prev == TOK_ARRAY_B ||
+ tok_prev == TOK_COMMA)
+ values_allowed = 1;
+
p->t = TOK_INT; /* fudge so the fall through for
floats works */
switch (*p->te) {
@@ -621,17 +628,19 @@ static void _get_token(struct parser *p)
case '7':
case '8':
case '9':
- p->te++;
- while ((p->te != p->fe) && (*p->te)) {
- if (*p->te == '.') {
- if (p->t == TOK_FLOAT)
- break;
- p->t = TOK_FLOAT;
- } else if (!isdigit((int) *p->te))
- break;
+ if (values_allowed) {
p->te++;
+ while ((p->te != p->fe) && (*p->te)) {
+ if (*p->te == '.') {
+ if (p->t == TOK_FLOAT)
+ break;
+ p->t = TOK_FLOAT;
+ } else if (!isdigit((int) *p->te))
+ break;
+ p->te++;
+ }
+ break;
}
- break;
default:
p->t = TOK_IDENTIFIER;