summaryrefslogtreecommitdiff
path: root/desktop/options.c
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2004-02-13 16:09:12 +0000
committerJames Bursa <james@netsurf-browser.org>2004-02-13 16:09:12 +0000
commit1319ff78c89fd0c34feea187ca3d67058875fbe6 (patch)
treeb3a1bb74c14305e38991db53e9119c72084daa87 /desktop/options.c
parentadd94ad0381bae4889dcd46620b8bfe4e4f443ce (diff)
downloadnetsurf-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.c157
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);
+}