diff options
author | James Bursa <james@netsurf-browser.org> | 2004-02-13 16:09:12 +0000 |
---|---|---|
committer | James Bursa <james@netsurf-browser.org> | 2004-02-13 16:09:12 +0000 |
commit | 1319ff78c89fd0c34feea187ca3d67058875fbe6 (patch) | |
tree | b3a1bb74c14305e38991db53e9119c72084daa87 /desktop/options.c | |
parent | add94ad0381bae4889dcd46620b8bfe4e4f443ce (diff) | |
download | netsurf-1319ff78c89fd0c34feea187ca3d67058875fbe6.tar.gz netsurf-1319ff78c89fd0c34feea187ca3d67058875fbe6.tar.bz2 |
[project @ 2004-02-13 16:09:12 by bursa]
Clean up and rewrite options code.
svn path=/import/netsurf/; revision=536
Diffstat (limited to 'desktop/options.c')
-rw-r--r-- | desktop/options.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/desktop/options.c b/desktop/options.c new file mode 100644 index 000000000..5b1981b6e --- /dev/null +++ b/desktop/options.c @@ -0,0 +1,157 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net> + * Copyright 2003 John M Bell <jmb202@ecs.soton.ac.uk> + * Copyright 2004 James Bursa <bursa@users.sourceforge.net> + */ + +/** \file + * Option reading and saving (implementation). + * + * Options are stored in the format key:value, one per line. For bool options, + * value is "0" or "1". + */ + +#include <stdbool.h> +#include <stdio.h> +#include <string.h> +#include "netsurf/desktop/options.h" +#include "netsurf/utils/log.h" +#include "netsurf/utils/utils.h" + +#ifdef riscos +#include "netsurf/riscos/options.h" +#else +#define EXTRA_OPTION_DEFINE +#define EXTRA_OPTION_TABLE +#endif + + +/** An HTTP proxy should be used. */ +bool option_http_proxy = false; +/** Hostname of proxy. */ +char *option_http_proxy_host = 0; +/** Proxy port. */ +int option_http_proxy_port = 8080; +EXTRA_OPTION_DEFINE + + +struct { + const char *key; + enum { OPTION_BOOL, OPTION_INTEGER, OPTION_STRING } type; + void *p; +} option_table[] = { + { "http_proxy", OPTION_BOOL, &option_http_proxy }, + { "http_proxy_host", OPTION_STRING, &option_http_proxy_host }, + { "http_proxy_port", OPTION_INTEGER, &option_http_proxy_port }, + EXTRA_OPTION_TABLE +}; + +#define option_table_entries (sizeof option_table / sizeof option_table[0]) + + +/** + * Read options from a file. + * + * \param path name of file to read options from + * + * Option variables corresponding to lines in the file are updated. Missing + * options are unchanged. If the file fails to open, options are unchanged. + */ + +void options_read(const char *path) +{ + char s[100]; + FILE *fp; + + fp = fopen(path, "r"); + if (!fp) { + LOG(("failed to open file '%s'", path)); + return; + } + + while (fgets(s, 100, fp)) { + char *colon, *value; + unsigned int i; + + if (s[0] == 0 || s[0] == '#') + continue; + colon = strchr(s, ':'); + if (colon == 0) + continue; + s[strlen(s) - 1] = 0; /* remove \n at end */ + *colon = 0; /* terminate key */ + value = colon + 1; + + for (i = 0; i != option_table_entries; i++) { + if (strcasecmp(s, option_table[i].key) != 0) + continue; + + switch (option_table[i].type) { + case OPTION_BOOL: + *((bool *) option_table[i].p) = + value[0] == '1'; + break; + + case OPTION_INTEGER: + *((int *) option_table[i].p) = + atoi(value); + break; + + case OPTION_STRING: + free(*((char **) option_table[i].p)); + *((char **) option_table[i].p) = + strdup(value); + break; + } + break; + } + } + + fclose(fp); +} + + +/** + * Save options to a file. + * + * \param path name of file to write options to + * + * Errors are ignored. + */ + +void options_write(const char *path) +{ + unsigned int i; + FILE *fp; + + fp = fopen(path, "w"); + if (!fp) { + LOG(("failed to open file '%s' for writing", path)); + return; + } + + for (i = 0; i != option_table_entries; i++) { + fprintf(fp, "%s:", option_table[i].key); + switch (option_table[i].type) { + case OPTION_BOOL: + fprintf(fp, "%c", *((bool *) option_table[i].p) ? + '1' : '0'); + break; + + case OPTION_INTEGER: + fprintf(fp, "%i", *((int *) option_table[i].p)); + break; + + case OPTION_STRING: + if (*((char **) option_table[i].p)) + fprintf(fp, "%s", *((char **) option_table[i].p)); + break; + } + fprintf(fp, "\n"); + } + + fclose(fp); +} |