2004-02-13 19:09:12 +03:00
|
|
|
/*
|
|
|
|
* 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;
|
2004-02-14 02:07:42 +03:00
|
|
|
/** Default font size / 0.1pt. */
|
|
|
|
int option_font_size = 100;
|
|
|
|
/** Minimum font size. */
|
|
|
|
int option_font_min_size = 70;
|
|
|
|
|
2004-02-13 19:09:12 +03:00
|
|
|
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 },
|
2004-02-14 02:07:42 +03:00
|
|
|
{ "font_size", OPTION_INTEGER, &option_font_size },
|
|
|
|
{ "font_min_size", OPTION_INTEGER, &option_font_min_size },
|
2004-02-13 19:09:12 +03:00
|
|
|
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);
|
2004-02-14 02:07:42 +03:00
|
|
|
|
|
|
|
if (option_font_size < 50)
|
|
|
|
option_font_size = 50;
|
|
|
|
if (1000 < option_font_size)
|
|
|
|
option_font_size = 1000;
|
|
|
|
if (option_font_min_size < 10)
|
|
|
|
option_font_min_size = 10;
|
|
|
|
if (500 < option_font_min_size)
|
|
|
|
option_font_min_size = 500;
|
2004-02-13 19:09:12 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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);
|
|
|
|
}
|