X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/05b75f8d50b83e943af3be4071449304d82dbdcd..224cac449a246bd7432fd5fb4e15f942547185d3:/cgi/options.c diff --git a/cgi/options.c b/cgi/options.c index 0e4a1d5..521ce35 100644 --- a/cgi/options.c +++ b/cgi/options.c @@ -1,23 +1,21 @@ /* * This file is part of DisOrder. - * Copyright (C) 2004-2008 Richard Kettlewell + * Copyright (C) 2004-2008, 2011 Richard Kettlewell * - * This program is free software; you can redistribute it and/or modify + * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA + * along with this program. If not, see . */ -/** @file server/options.c +/** @file cgi/options.c * @brief CGI options * * Options represent an additional configuration system private to the @@ -26,18 +24,16 @@ #include "disorder-cgi.h" -struct column { - int ncolumns; - char **columns; -}; - +/** @brief State for parsing an options file */ struct read_options_state { + /** @brief Filename */ const char *name; + + /** @brief Line number */ int line; }; static hash *labels; -static hash *columns; static void option__readfile(const char *name); @@ -51,21 +47,17 @@ static void option__include(int attribute((unused)) nvec, option__readfile(vec[0]); } -static void option__columns(int nvec, - char **vec) { - struct column c; - - c.ncolumns = nvec - 1; - c.columns = &vec[1]; - hash_add(columns, vec[0], &c, HASH_INSERT_OR_REPLACE); -} - +/** @brief Definition of an option command */ static struct option { + /** @brief Command name */ const char *name; - int minargs, maxargs; + /** @brief Minimum number of arguments */ + int minargs; + /** @brief Maximum number of arguments */ + int maxargs; + /** @brief Command handler */ void (*handler)(int nvec, char **vec); } options[] = { - { "columns", 1, INT_MAX, option__columns }, { "include", 1, 1, option__include }, { "label", 2, 2, option__label }, }; @@ -74,7 +66,7 @@ static void option__split_error(const char *msg, void *u) { struct read_options_state *cs = u; - error(0, "%s:%d: %s", cs->name, cs->line, msg); + disorder_error(0, "%s:%d: %s", cs->name, cs->line, msg); } static void option__readfile(const char *name) { @@ -86,7 +78,7 @@ static void option__readfile(const char *name) { if(!(cs.name = mx_find(name, 1/*report*/))) return; if(!(fp = fopen(cs.name, "r"))) - fatal(errno, "error opening %s", cs.name); + disorder_fatal(errno, "error opening %s", cs.name); cs.line = 0; while(!inputline(cs.name, fp, &buffer, '\n')) { ++cs.line; @@ -96,17 +88,17 @@ static void option__readfile(const char *name) { if(!n) continue; if((i = TABLE_FIND(options, name, vec[0])) == -1) { - error(0, "%s:%d: unknown option '%s'", cs.name, cs.line, vec[0]); + disorder_error(0, "%s:%d: unknown option '%s'", cs.name, cs.line, vec[0]); continue; } ++vec; --n; if(n < options[i].minargs) { - error(0, "%s:%d: too few arguments to '%s'", cs.name, cs.line, vec[-1]); + disorder_error(0, "%s:%d: too few arguments to '%s'", cs.name, cs.line, vec[-1]); continue; } if(n > options[i].maxargs) { - error(0, "%s:%d: too many arguments to '%s'", cs.name, cs.line, vec[-1]); + disorder_error(0, "%s:%d: too many arguments to '%s'", cs.name, cs.line, vec[-1]); continue; } options[i].handler(n, vec); @@ -120,7 +112,6 @@ static void option__init(void) { if(!have_read_options) { have_read_options = 1; labels = hash_new(sizeof (char *)); - columns = hash_new(sizeof (struct column)); option__readfile("options"); } } @@ -188,27 +179,6 @@ int option_label_exists(const char *key) { return !!hash_find(labels, key); } -/** @brief Return a column list - * @param name Context (playing/recent/etc) - * @param ncolumns Where to store column count or NULL - * @return Pointer to column list - */ -char **option_columns(const char *name, int *ncolumns) { - struct column *c; - - option__init(); - c = hash_find(columns, name); - if(c) { - if(ncolumns) - *ncolumns = c->ncolumns; - return c->columns; - } else { - if(ncolumns) - *ncolumns = 0; - return 0; - } -} - /* Local Variables: c-basic-offset:2