From 5f705d27ded602a91ea1df63ca27bbf2bd0c56ac Mon Sep 17 00:00:00 2001 From: Robert Spalek Date: Thu, 27 Apr 2006 15:44:56 +0200 Subject: [PATCH] shell/config: upgraded to use conf2 instead of conf --- lib/shell/config.c | 131 ++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 68 deletions(-) diff --git a/lib/shell/config.c b/lib/shell/config.c index 95ddce11..21bf540d 100644 --- a/lib/shell/config.c +++ b/lib/shell/config.c @@ -2,6 +2,7 @@ * UCW Library -- Shell Interface to Configuration Files * * (c) 2002--2005 Martin Mares + * (c) 2006 Robert Spalek * * Once we were using this beautiful Shell version, but it turned out * that it doesn't work with nested config files: @@ -16,16 +17,13 @@ */ #include "lib/lib.h" -#include "lib/conf.h" +#include "lib/conf2.h" #include #include #include #include -static struct cfitem *items; -static byte *flags; - enum flag { F_STRING = 0, F_INT = 1, @@ -55,52 +53,50 @@ Modifiers:\n\ } static byte * -report(struct cfitem *item, byte *value) +report(uns num, byte **pars, struct cf_item *item) { - uns f = flags[item-items]; - byte *err; - byte buf[128]; - - if (f & F_ARRAY) - printf("CF_%s[${#CF_%s[*]}]='", item->name, item->name); - else - printf("CF_%s='", item->name); - - switch (f & F_TYPE_MASK) - { - case F_STRING: - break; - case F_INT: ; - uns val; - if (err = cf_parse_int(value, &val)) - return err; - sprintf(buf, "%d", val); - value = buf; - break; - case F_INT64: ; - u64 val64; - if (err = cf_parse_u64(value, &val64)) - return err; - sprintf(buf, "%Lu", val64); - value = buf; - break; - case F_DOUBLE: ; - double valf; - if (err = cf_parse_double(value, &valf)) - return err; - sprintf(buf, "%g", valf); - value = buf; - break; - default: - ASSERT(0); + uns f = item->type; + for (uns i=0; iname); + while (*value) { if (*value == '\'') die("Apostrophes are not supported in config of scripts"); putchar(*value++); } - puts("'"); + puts("'"); + } return NULL; } @@ -108,7 +104,6 @@ int main(int argc, char **argv) { int i = 1; int start; - struct cfitem *c; log_init("config"); while (i < argc && argv[i][0] == '-') @@ -116,26 +111,24 @@ int main(int argc, char **argv) if (i + 1 >= argc) help(); start = i; - c = items = alloca(sizeof(struct cfitem) * (argc-i+1)); - flags = alloca(argc); - bzero(flags, argc); - c->name = argv[i]; - c->type = CT_SECTION; - c->var = NULL; - c++; - while (++i < argc) + + byte *sec_name = argv[i++]; + uns allow_unknown = 0; + struct cf_section *sec = xmalloc_zero(sizeof(struct cf_section)); + struct cf_item *c = sec->cfg = xmalloc_zero(sizeof(struct cf_item) * (argc-i+1)); + + for (; itype = CT_INCOMPLETE_SECTION; + allow_unknown = 1; else { - uns id = c-items; - char *e = strchr(arg, '='); + byte *e = strchr(arg, '='); if (e) *e++ = 0; - char *t = arg + strlen(arg) - 1; + byte *t = arg + strlen(arg) - 1; if (t > arg) { if (*t == '#') @@ -144,15 +137,15 @@ int main(int argc, char **argv) if (t > arg && *t == '#') { *t-- = 0; - flags[id] |= F_INT64; + c->type |= F_INT64; } else - flags[id] |= F_INT; + c->type |= F_INT; } else if (*t == '$') { *t-- = 0; - flags[id] |= F_DOUBLE; + c->type |= F_DOUBLE; } } @@ -160,20 +153,22 @@ int main(int argc, char **argv) { arg++; printf("declare -a CF_%s ; CF_%s=()\n", arg, arg); - flags[id] |= F_ARRAY; + c->type |= F_ARRAY; } - c->type = CT_FUNCTION; - c->var = report; + c->cls = CC_PARSER; c->name = arg; + c->number = (c->type & F_ARRAY) ? CF_ANY_NUM : 1; + c->ptr = c; + c->u.par = (cf_parser*) report; if (e) - report(c, e); + report(1, &e, c); c++; } } - c->type = CT_STOP; - cf_register(items); - if (cf_getopt(start, argv, CF_SHORT_OPTS, CF_NO_LONG_OPTS, NULL) != -1) + c->cls = CC_END; + cf_declare_section(sec_name, sec, allow_unknown); + if (cf_get_opt(start, argv, CF_SHORT_OPTS, CF_NO_LONG_OPTS, NULL) != -1) help(); return 0; } -- 2.39.2