diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2008-06-19 21:13:56 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2008-06-19 21:13:56 +0000 |
commit | 0695db3889928969d4281859bbe676d7c8605f49 (patch) | |
tree | e3de7f5c48fad7fc1b387e3838d1c61f262a49fe /cfg.c | |
parent | 471e37659fb66011f3c163241de041c727863a43 (diff) |
Convert cfg.c to use cmd-string stuff.
Diffstat (limited to 'cfg.c')
-rw-r--r-- | cfg.c | 200 |
1 files changed, 52 insertions, 148 deletions
@@ -1,4 +1,4 @@ -/* $Id: cfg.c,v 1.9 2008-06-16 20:25:54 nicm Exp $ */ +/* $Id: cfg.c,v 1.10 2008-06-19 21:13:56 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> @@ -51,169 +51,73 @@ cfg_error(unused struct cmd_ctx *ctx, const char *fmt, ...) } int -load_cfg(const char *path, char **causep) +load_cfg(const char *path, char **cause) { FILE *f; - int ch, argc; - u_int line; - char **argv, *buf, *s, *cause; + u_int n; + char *buf, *line, *ptr; size_t len; struct cmd *cmd; struct cmd_ctx ctx; if ((f = fopen(path, "rb")) == NULL) { - xasprintf(causep, "%s: %s", path, strerror(errno)); + xasprintf(cause, "%s: %s", path, strerror(errno)); return (1); } - cause = NULL; - - argv = NULL; - argc = 0; - - buf = NULL; - len = 0; - - line = 0; - while ((ch = getc(f)) != EOF) { - switch (ch) { - case '\'': - if ((s = cfg_string(f, '\'', 0)) == NULL) - goto error; - argv = xrealloc(argv, argc + 1, sizeof *argv); - argv[argc++] = s; - break; - case '"': - if ((s = cfg_string(f, '"', 1)) == NULL) - goto error; - argv = xrealloc(argv, argc + 1, sizeof *argv); - argv[argc++] = s; - break; - case '#': - /* Comment: discard until EOL. */ - while ((ch = getc(f)) != '\n' && ch != EOF) - ; - /* FALLTHROUGH */ - case '\n': - case EOF: - case ' ': - case '\t': - if (len != 0) { - buf = xrealloc(buf, 1, len + 1); - buf[len] = '\0'; - - argv = xrealloc(argv, argc + 1, sizeof *argv); - argv[argc++] = buf; - - buf = NULL; - len = 0; - } - - if (ch != '\n' && ch != EOF) - break; - line++; - if (argc == 0) - break; - - if ((cmd = cmd_parse(argc, argv, &cause)) == NULL) - goto error; - - ctx.msgdata = NULL; - ctx.cursession = NULL; - ctx.curclient = NULL; - - ctx.error = cfg_error; - ctx.print = cfg_print; - ctx.info = cfg_print; - - ctx.cmdclient = NULL; - ctx.flags = 0; - - cfg_cause = NULL; - cmd_exec(cmd, &ctx); - cmd_free(cmd); - if (cfg_cause != NULL) { - cause = cfg_cause; - goto error; - } - - while (--argc >= 0) - xfree(argv[argc]); - argc = 0; - break; - default: - if (len >= SIZE_MAX - 2) - goto error; - - buf = xrealloc(buf, 1, len + 1); - buf[len++] = ch; - break; + n = 0; + + line = NULL; + while ((buf = fgetln(f, &len))) { + if (buf[len - 1] == '\n') + buf[len - 1] = '\0'; + else { + line = xrealloc(line, 1, len + 1); + memcpy(line, buf, len); + line[len] = '\0'; + buf = line; } - } - - fclose(f); - - return (0); - -error: - while (--argc >= 0) - xfree(argv[argc]); - xfree(argv); - - if (buf != NULL) - xfree(buf); + n++; + + /* Trim spaces from start and end. */ + while (*buf != '\0' && (*buf == ' ' || *buf == '\t')) + *buf++ = '\0'; + len = strlen(buf); + while (len > 0 && (buf[len - 1] == ' ' || buf[len - 1] == '\t')) + buf[--len] = '\0'; + if (*buf == '\0') + continue; + + if ((cmd = cmd_string_parse(buf, cause)) == NULL) + goto error; + cfg_cause = NULL; - if (cause == NULL) - xasprintf(causep, "%s: error at line %u", path, line); - else - xasprintf(causep, "%s: %s at line %u", path, cause, line); - return (1); -} + ctx.msgdata = NULL; + ctx.cursession = NULL; + ctx.curclient = NULL; -char * -cfg_string(FILE *f, char endch, int esc) -{ - int ch; - char *buf; - size_t len; + ctx.error = cfg_error; + ctx.print = cfg_print; + ctx.info = cfg_print; - buf = NULL; - len = 0; + ctx.cmdclient = NULL; + ctx.flags = 0; - while ((ch = getc(f)) != endch) { - switch (ch) { - case EOF: - goto error; - case '\\': - if (!esc) - break; - switch (ch = getc(f)) { - case EOF: - goto error; - case 'r': - ch = '\r'; - break; - case 'n': - ch = '\n'; - break; - case 't': - ch = '\t'; - break; - } - break; - } - - if (len >= SIZE_MAX - 2) + cfg_cause = NULL; + cmd_exec(cmd, &ctx); + cmd_free(cmd); + if (cfg_cause != NULL) { + *cause = cfg_cause; goto error; - buf = xrealloc(buf, 1, len + 1); - buf[len++] = ch; - } + } + } + if (line != NULL) + xfree(line); - buf = xrealloc(buf, 1, len + 1); - buf[len] = '\0'; - return (buf); + return (0); error: - if (buf != NULL) - xfree(buf); - return (NULL); + xasprintf(&ptr, "%s: %s at line %u", path, *cause, n); + xfree(*cause); + *cause = ptr; + return (1); } |