aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/config.l
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/config.l')
-rw-r--r--engines/sci/config.l1116
1 files changed, 0 insertions, 1116 deletions
diff --git a/engines/sci/config.l b/engines/sci/config.l
deleted file mode 100644
index 7d05e43768..0000000000
--- a/engines/sci/config.l
+++ /dev/null
@@ -1,1116 +0,0 @@
-/***************************************************************************
- config.l (C) 1999 Christoph Reichenbach
-
-
- This program may be modified and copied freely according to the terms of
- the GNU general public license (GPL), as long as the above copyright
- notice and the licensing information contained herein are preserved.
-
- Please refer to www.gnu.org for licensing details.
-
- This work is provided AS IS, without warranty of any kind, expressed or
- implied, including but not limited to the warranties of merchantibility,
- noninfringement, and fitness for a specific purpose. The author will not
- be held liable for any damage caused by this work or derivatives of it.
-
- By using this source code, you agree to the licensing terms as stated
- above.
-
-
- Please contact the maintainer for bug reports or inquiries.
-
- Current Maintainer:
-
- Christoph Reichenbach (CJR) [jameson@linuxgames.com]
-
-***************************************************************************/
-
-%{
-#include <engine.h>
-#include <gfx_resource.h>
-#include <sci_conf.h>
-#include <stddef.h>
-
-/* unistd override for GNU flex for non-UNIX systems */
-#ifndef HAVE_UNISTD_H
-# define YY_NO_UNISTD_H
-#endif
-
-#ifdef _MSC_VER
-# include <ctype.h>
-# include <direct.h>
-#endif
-
-config_entry_t *conf;
-int cur_section=0; /* Size-1 and current section in conf */
-char *exported_conf_path; /* Path which the config file was found in */
-int dospath; /* Use dos-style paths? */
-
-typedef struct {
- const char *name;
- int value;
-} name_value_pair;
-
-
-struct {
- const char *name;
- void *(*check_driver)(char *name);
-} freesci_subsystems[FREESCI_DRIVER_SUBSYSTEMS_NR] = {
- {"gfx", NULL},
-#ifdef __GNUC__
-#warning "sound"
-#endif
-#if 0
- {"pcm", parse_pcmout_driver},
- {"midiout", parse_midiout_driver}
-#endif
-};
-
-
-typedef struct _file_stack {
- char *name;
- YY_BUFFER_STATE handle;
- struct _file_stack *next;
-} file_stack_t;
-
-static file_stack_t *file_stack = NULL;
-static char *yy_filename = NULL;
-static YY_BUFFER_STATE yy_fsci_active_buffer;
-
-static int
-push_file(char *name);
-
-static int
-pop_file(void);
-
-FILE *initial_file;
-
-static void
-set_config_parameter(config_entry_t *conf, char *subsystem_name, char *driver_name,
- char *option, char *value);
-
-
-static int
-parse_name(char *name, name_value_pair* nvps, const char *what, int oldval); /* Parses a string with a name value pair */
-
-static void
-copy_subsystem_options(config_entry_t *dest, config_entry_t *src);
-/* Copies all subsystem options
-** Parameters: (config_entry_t *) dest: The destination config struct
-** (config_entry_t *) src: Source struct
-** Returns : (void)
-*/
-
-
-static name_value_pair valid_modes[] = {
- {"default", GFXR_DITHER_MODE_D16},
- {"dither", GFXR_DITHER_MODE_D16},
- {"dither16", GFXR_DITHER_MODE_D16},
- {"dither_16", GFXR_DITHER_MODE_D16},
- {"dither-16", GFXR_DITHER_MODE_D16},
- {"d16", GFXR_DITHER_MODE_D16},
- {"flat", GFXR_DITHER_MODE_F256},
- {"interpol", GFXR_DITHER_MODE_F256},
- {"interpolate", GFXR_DITHER_MODE_F256},
- {"dither256", GFXR_DITHER_MODE_D256},
- {"dither_256", GFXR_DITHER_MODE_D256},
- {"d256", GFXR_DITHER_MODE_D256},
- {0, 0} /* Terminator */
-};
-
-static name_value_pair yesno[] = {
- {"yes", 1},
- {"no", 0},
- {"true", 1},
- {"false", 0},
- {"1", 1},
- {"0", 0},
- {"ok", 1},
- {"enable", 1},
- {"disable", 0},
- {"activate", 1},
- {"deactivate", 0},
- {"+", 1},
- {"-", 0},
- {"on", 1},
- {"off", 0},
- {0, 0}
-};
-
-static name_value_pair dither_pattern[] = {
- {"scaled", GFXR_DITHER_PATTERN_SCALED},
- {"unscaled", GFXR_DITHER_PATTERN_1},
- {"one", GFXR_DITHER_PATTERN_1},
- {"1", GFXR_DITHER_PATTERN_1},
- {0, 0}
-};
-
-static name_value_pair dirty_strategy[] = {
- {"1", GFXOP_DIRTY_FRAMES_ONE},
- {"one", GFXOP_DIRTY_FRAMES_ONE},
- {"cluster", GFXOP_DIRTY_FRAMES_CLUSTERS},
- {"clusters", GFXOP_DIRTY_FRAMES_CLUSTERS},
- {0, 0}
-};
-
-static name_value_pair brush_mode[] = {
- {"scaled", GFX_BRUSH_MODE_SCALED},
- {"ellipse", GFX_BRUSH_MODE_ELLIPSES},
- {"ellipses", GFX_BRUSH_MODE_ELLIPSES},
- {"rnd_ellipses", GFX_BRUSH_MODE_RANDOM_ELLIPSES},
- {"rnd-ellipses", GFX_BRUSH_MODE_RANDOM_ELLIPSES},
- {"random_ellipses", GFX_BRUSH_MODE_RANDOM_ELLIPSES},
- {"random-ellipses", GFX_BRUSH_MODE_RANDOM_ELLIPSES},
- {"morerandom", GFX_BRUSH_MODE_MORERANDOM},
- {"more-random", GFX_BRUSH_MODE_MORERANDOM},
- {"more_random", GFX_BRUSH_MODE_MORERANDOM},
- {0, 0}
-};
-
-static name_value_pair filter_mode[] = {
- {"none", GFX_XLATE_FILTER_NONE},
- {"linear", GFX_XLATE_FILTER_LINEAR},
- {"bilinear", GFX_XLATE_FILTER_LINEAR},
- {"bi-linear", GFX_XLATE_FILTER_LINEAR},
- {"trilinear", GFX_XLATE_FILTER_TRILINEAR},
- {"tri-linear", GFX_XLATE_FILTER_TRILINEAR},
- {0, 0}
-};
-
-static name_value_pair antialiasing_modes[] = {
- {"none", GFXR_ANTIALIASING_NONE},
- {"0", GFXR_ANTIALIASING_NONE},
- {"off", GFXR_ANTIALIASING_NONE},
- {"on", GFXR_ANTIALIASING_SIMPLE},
- {"basic", GFXR_ANTIALIASING_SIMPLE},
- {"simple", GFXR_ANTIALIASING_SIMPLE}
-};
-
-static name_value_pair line_mode[] = {
- {"correct", GFX_LINE_MODE_CORRECT},
- {"normal", GFX_LINE_MODE_CORRECT},
- {"fast", GFX_LINE_MODE_FAST},
- {"half", GFX_LINE_MODE_FAST},
- {"fine", GFX_LINE_MODE_FINE},
- {"thin", GFX_LINE_MODE_FINE},
- {0, 0}
-};
-
-#define BAD_INT_VALUE -33333333
-
-/* Types of options */
-#define OPTION_TYPE_NONE 0
-#define OPTION_TYPE_INT 1
-#define OPTION_TYPE_NVP 2
-#define OPTION_TYPE_INVERSE_NVP 3
-#define OPTION_TYPE_STATICREF 4
-#define OPTION_TYPE_STRING 5
-#define OPTION_TYPE_RECT 6
-
-typedef struct {
- int type;
- const char *name;
- int min;
- int max;
- name_value_pair *nvp;
- void * (*parse_funct)(char *);
- int varoffset;
-} standard_option;
-
-#define OPT_END {OPTION_TYPE_NONE, NULL, 0, 0, NULL, 0}
-/* Terminates */
-
-#define OPT_INT(NAME, VARNAME, MIN, MAX) {OPTION_TYPE_INT, NAME, MIN, MAX, NULL, NULL, offsetof (config_entry_t, VARNAME)}
-/* Read INT from the interval [MIN, MAX] */
-
-#define OPT_STRING(NAME, VARNAME) {OPTION_TYPE_STRING, NAME, 0, 0, NULL, NULL, offsetof (config_entry_t, VARNAME)}
-/* Read a string */
-
-#define OPT_NVP(NAME, VARNAME, NVP) {OPTION_TYPE_NVP, NAME, 0, 0, NVP, NULL, offsetof (config_entry_t, VARNAME)}
-/* Read (name,value) pair from NVP */
-
-#define OPT_INVERSE_NVP(NAME, VARNAME, NVP) {OPTION_TYPE_INVERSE_NVP, NAME, 0, 0, NVP, NULL, offsetof (config_entry_t, VARNAME)}
-/* Read NVP and negate result */
-
-#define OPT_STATICREF(NAME, VARNAME, FUNCTN) {OPTION_TYPE_STATICREF, NAME, 0, 0, NULL, FUNCTN, offsetof (config_entry_t, VARNAME)}
-/* Call FUNCTN() with the specified value, store resulting NULL* */
-
-#define OPT_RECT(NAME, VARNAME) {OPTION_TYPE_RECT, NAME, 0, 0, NULL, NULL, offsetof (config_entry_t, VARNAME)}
-/* Read a rectangle */
-
-
-standard_option standard_options[] = {
- OPT_RECT("pic_port_bounds", gfx_options.pic_port_bounds),
- OPT_NVP("pic0_dither_mode", gfx_options.pic0_dither_mode, valid_modes),
- OPT_NVP("color_mode", gfx_options.pic0_dither_mode, valid_modes),
- OPT_NVP("pic0_dither_pattern", gfx_options.pic0_dither_pattern, dither_pattern),
- OPT_NVP("pic0_brush_mode", gfx_options.pic0_brush_mode, brush_mode),
- OPT_NVP("pic0_line_mode", gfx_options.pic0_line_mode, line_mode),
- OPT_NVP("dirty_strategy", gfx_options.dirty_frames, dirty_strategy),
- OPT_INVERSE_NVP("pic0_scaled", gfx_options.pic0_unscaled, yesno),
- OPT_NVP("pic_filter", gfx_options.pic_xlate_filter, filter_mode),
- OPT_NVP("pic_antialiasing", gfx_options.pic0_antialiasing, antialiasing_modes),
- OPT_NVP("text_filter", gfx_options.text_xlate_filter, filter_mode),
- OPT_NVP("view_filter", gfx_options.view_xlate_filter, filter_mode),
- OPT_NVP("cursor_filter", gfx_options.cursor_xlate_filter, filter_mode),
- OPT_NVP("mouse", mouse, yesno),
- OPT_NVP("reverse_stereo", reverse_stereo, yesno),
- OPT_INT("pic_buffer_size", gfx_options.buffer_pics_nr, 0, 4096),
- OPT_INT("alpha_threshold", alpha_threshold, 0, 255),
- OPT_INT("animation_delay", animation_delay, 0, 1000000),
- OPT_INT("animation_granularity", animation_granularity, 1, 160),
-#ifdef __GNUC__
-#warning "Re-enable sound server config"
-#endif
-#if 0
- OPT_STATICREF("midiout_driver", midiout_driver, parse_midiout_driver),
- OPT_STATICREF("midi_device", midi_device, parse_midi_device),
- OPT_STATICREF("sound_server", sound_server, parse_sound_server),
- OPT_STATICREF("pcmout_driver", pcmout_driver, parse_pcmout_driver),
- OPT_INT("pcmout_rate", pcmout_rate, 11025, 48000),
- OPT_INT("pcmout_stereo", pcmout_stereo, 0, 1),
-#endif
- OPT_STRING("console_log", console_log),
- OPT_STRING("module_path", module_path),
- OPT_STRING("menu_dir", menu_dir),
- OPT_STRING("gfx_driver", gfx_driver_name),
- OPT_INT("scale_x", x_scale, 1, 256),
- OPT_INT("scale_y", y_scale, 1, 256),
- OPT_INT("scale", scale, 1, 256),
- OPT_INT("resource_version", res_version, 0, 6),
- OPT_INT("color_depth", color_depth, 8, 32),
- OPT_END
-};
-
-
-static void
-parse_option(char *option, int optlen, char *value);
-
-char *
-crop_value(char *yytext);
-
-char *
-purge_comments(char *comments);
-
-%}
-
-DIGIT [0-9]
-PARAMTOKEN [[:alnum:]"."_\:\/-]*
-SCIVERSION {DIGIT}"."{DIGIT}{3}"."{DIGIT}{3}
-NUMTOKEN {DIGIT}+
-COORDTOKEN {NUMTOKEN},?[[:space:]]*
-RECTTOKEN {COORDTOKEN}{3}{NUMTOKEN}
-NUMPARAMTOKEN {NUMTOKEN}|{PARAMTOKEN}
-PATHTOKEN [[:alnum:]"/""\\""."]*
-NUMPATHPARAMTOKEN {NUMPARAMTOKEN}|{PATHTOKEN}
-QUOTED_NUMPARAMTOKEN "\"".*"\""
-
-%%
-
-"["[_[:alnum:]]+"]" {
- char *cleanup;
- ++yytext; /* Get over opening bracket */
-
- ++cur_section; /* Start new section */
-
- /* Create new entry... */
- conf = (config_entry_t *) sci_realloc(conf, sizeof(config_entry_t) * (cur_section + 1));
-
- /* ...and initialize it */
- memcpy(&(conf[cur_section]), &(conf[0]), sizeof(config_entry_t));
- if (conf[0].console_log)
- conf[cur_section].console_log = sci_strdup (conf[0].console_log);
-
- /* Copy the subsystem init strings */
- copy_subsystem_options(conf + cur_section, conf);
-
- while (isspace(*yytext))
- yytext++;
-
- cleanup = strchr(yytext, ']');
-
- do {
- *cleanup-- = 0;
- } while (isblank(*cleanup));
-
- conf[cur_section].name = sci_strdup(yytext);
-
- conf[cur_section].resource_dir = sci_strdup(".");
-
-}
-
-
-version[[:blank:]]*"="[[:blank:]]*{SCIVERSION} {
-
- yytext = strchr(yytext, '=') + 1;
-
- while (isspace(*yytext))
- yytext++;
-
- version_parse(yytext, &conf[cur_section].version);
-}
-
-resource_dir[[:blank:]]*"="[[:blank:]]*.+ if (cur_section) {
- yytext = strchr(yytext, '=') + 1;
- while (isspace(*yytext))
- yytext++;
-
- sci_free(conf[cur_section].resource_dir);
-
- conf[cur_section].resource_dir = sci_strdup(yytext);
-}
-
-debug_mode[[:blank:]]*"="[[:blank:]]*.+ {
- yytext = strchr(yytext, '=') + 1;
-
- while (isspace(*yytext))
- yytext++;
-
- strcpy (conf[cur_section].debug_mode, yytext);
-}
-
-[[:alnum:]]+"."[[:alnum:]]+"."[[:alnum:]_]+[[:blank:]]*"="[[:blank:]]*({NUMPARAMTOKEN}|{QUOTED_NUMPARAMTOKEN})[[:blank:]]* {
-/* driver parameters */
- char *subsys_name = yytext;
- char *driver_name;
- char *option, *value;
- char *p2;
-
- yytext = strchr(yytext, '.');
- *yytext++ = 0;
- driver_name = yytext;
- yytext = strchr(yytext, '.');
- *yytext++ = 0;
-
-
- option = yytext;
- yytext = strchr(yytext, '=');
- *yytext++ = 0;
-
- p2 = yytext-2; /* trim right spaces */
- while (p2 > option && isspace (*p2))
- *p2-- = 0;
-
- value = crop_value(yytext); /* Get config value */
-
- set_config_parameter(conf + cur_section, subsys_name,
- driver_name, option, value);
-
-}
-
-
-{PARAMTOKEN}[[:blank:]]*"="[[:blank:]]*({NUMPATHPARAMTOKEN}|{QUOTED_NUMPARAMTOKEN})[[:blank:]]* { /* Normal config option */
- char *option_str = yytext;
- char *value_str = yytext;
- int option_str_len;
-
- while (isalnum(*value_str) || *value_str == '_')
- ++value_str;
-
- option_str_len = value_str - option_str;
-
- while (!(isalnum(*value_str) || *value_str == '_' || *value_str == '"' || *value_str == '/' || *value_str == '\\'))
- ++value_str;
-
- value_str = crop_value(value_str);
-
- parse_option(option_str, option_str_len, value_str);
-}
-
-{PARAMTOKEN}[[:blank:]]*"="[[:blank:]]*\"{RECTTOKEN}\" { /* Normal config option */
- char *option_str = yytext;
- char *value_str = yytext;
- int option_str_len;
-
- while (isalnum(*value_str) || *value_str == '_')
- ++value_str;
-
- option_str_len = value_str - option_str;
-
- while (!(isdigit(*value_str)||(*value_str == '"')))
- ++value_str;
-
- value_str = crop_value(value_str);
-
- parse_option(option_str, option_str_len, value_str);
-}
-
-
-(view|pic|cursor)[^_A-Za-z0-9"("]*"("([^";"]|"#"[^\n]*\n)*";" {
- gfx_update_conf(&(conf[cur_section].gfx_options), purge_comments(yytext));
-}
-
-"%include"[^<\n]*<[^>\n]*> {
- char *filename = strchr(yytext, '<');
- char *end = strchr(filename, '>');
-
- *end-- = 0;
- while (isblank(*end))
- *end-- = 0;
-
- filename++;
- while (*filename && isblank(*filename))
- filename++;
-
- push_file(filename);
- YY_NEW_FILE;
-}
-
-
-"#".+$ /* Ignore comments */
-
-[[:blank:]\n]+ /* Eat whitespace */
-
-<<EOF>> {
- yy_delete_buffer( YY_CURRENT_BUFFER );
- yyterminate();
-}
-
-.* printf("Unrecognized option: '%s'\n", yytext);
-
-%%
-
-int
-yywrap(void)
-{
- return pop_file(); /* no further input */
-}
-
-static int
-push_file(char *name)
-{
- file_stack_t *newfs;
- file_stack_t *s;
- FILE *newfile;
-
- if (yy_filename && !strcmp(name, yy_filename)) {
- fprintf(stderr, "[conf] Warning: Attempted immediate circular inclusion of config file '%s'\n",
- name);
- return 1;
- }
-
- s = file_stack;
- while (s) {
- if (!strcmp(name, s->name)) {
- fprintf(stderr, "[conf] Warning: Attempted circular inclusion of config file '%s'\n",
- name);
- return 1;
- }
- s = s->next;
- }
-
- if (!(newfile = fopen(name, "r"))) {
- fprintf(stderr, "[conf] Warning: Could not open configuration file '%s'\n", name);
- return 1;
- }
-
- if (yyin) {
- newfs = (struct _file_stack *) malloc(sizeof(struct _file_stack));
- newfs->handle = yy_fsci_active_buffer;
- newfs->name = yy_filename;
-
- newfs->next = file_stack;
- file_stack = newfs;
- }
-
- yy_filename = strdup(name);
- yy_fsci_active_buffer = yy_create_buffer(newfile, YY_BUF_SIZE);
- yy_switch_to_buffer(yy_fsci_active_buffer);
-
- return 0;
-}
-
-static int
-pop_file(void)
-{
- if (file_stack) {
- void *goner = file_stack;
- yy_delete_buffer(yy_fsci_active_buffer);
- fclose(yyin);
- yy_fsci_active_buffer = file_stack->handle;
- yy_switch_to_buffer(yy_fsci_active_buffer);
-
- free(yy_filename);
- yy_filename = file_stack->name;
- file_stack = file_stack->next;
-
- free(goner);
- return 0;
- } else {
- if (yy_filename) {
- free(yy_filename);
- yy_filename = NULL;
- }
- if (yyin) {
- yy_delete_buffer(yy_fsci_active_buffer);
- fclose(yyin);
- yyin = NULL;
- }
- return 1; /* Done */
- }
-}
-
-
-char *
-crop_value(char *yytext)
-{
- char *retval;
-
- while (isspace(*yytext))
- ++yytext;
-
- retval = yytext;
- if (*yytext == '"') { /* Magic Quote Mode */
- ++retval;
- ++yytext;
- while (*yytext && (*yytext != '"'))
- ++yytext;
- *yytext = 0; /* Terminate */
- } else {
- while (*yytext && !isspace(*yytext))
- ++yytext;
- *yytext = 0; /* Terminate */
- }
-
- return retval;
-}
-
-
-int
-config_init(config_entry_t **_conf, char *conffile)
-{
- char *homedir = sci_get_homedir();
- char *conf_path;
- int i;
-
- conf = (config_entry_t *) sci_malloc(sizeof(config_entry_t));
-#ifdef SATISFY_PURIFY
- memset(conf, 0, sizeof(config_entry_t));
-#endif
-
-/**** Default config: */
- conf->gfx_options.workarounds = 0;
- conf->gfx_options.buffer_pics_nr = 0;
- conf->gfx_options.correct_rendering = 1;
- conf->gfx_options.pic0_unscaled = 1;
- conf->gfx_options.pic0_dither_mode = GFXR_DITHER_MODE_D256;
- conf->gfx_options.pic0_dither_pattern = GFXR_DITHER_PATTERN_SCALED;
- conf->gfx_options.pic0_brush_mode = GFX_BRUSH_MODE_RANDOM_ELLIPSES;
- conf->gfx_options.pic0_line_mode = GFX_LINE_MODE_CORRECT;
- conf->gfx_options.cursor_xlate_filter = GFX_XLATE_FILTER_NONE;
- conf->gfx_options.view_xlate_filter = GFX_XLATE_FILTER_NONE;
- conf->gfx_options.pic_xlate_filter = GFX_XLATE_FILTER_NONE;
- conf->gfx_options.text_xlate_filter = GFX_XLATE_FILTER_NONE;
- conf->gfx_options.dirty_frames = GFXOP_DIRTY_FRAMES_CLUSTERS;
- conf->gfx_options.pic0_antialiasing = GFXR_ANTIALIASING_NONE;
- conf->gfx_options.pic_port_bounds = gfx_rect(0,10,320,190);
- for (i = 0; i < GFX_RESOURCE_TYPES_NR; i++) {
- conf->gfx_options.res_conf.assign[i] = NULL;
- conf->gfx_options.res_conf.mod[i] = NULL;
- }
-
- conf->gfx_driver_name = NULL;
-
-#ifdef __GNUC__
-#warning "Re-enable sound stuff"
-#endif
-#if 0
- conf->pcmout_driver = pcmout_find_driver(NULL);
- conf->pcmout_rate = 22050;
- conf->pcmout_stereo = 1;
- conf->midiout_driver = midiout_find_driver(NULL);
- conf->midi_device = midi_find_device(NULL);
- conf->sound_server = sound_server_find_driver(NULL);
-#endif
-
- conf->x_scale = 0;
- conf->y_scale = 0;
- conf->scale = 0;
- conf->color_depth = 0;
-
- conf->mouse = 1;
- conf->reverse_stereo = 0;
-
- conf->version = 0;
-
- conf->alpha_threshold = 0x90;
- conf->animation_delay = 5;
- conf->animation_granularity = 4;
- conf->console_log = NULL;
- conf->debug_mode [0] = '\0';
- conf->name = NULL;
- conf->resource_dir = NULL;
- conf->module_path = sci_strdup(SCI_DEFAULT_MODULE_PATH);
- conf->res_version = SCI_VERSION_AUTODETECT;
-
- if (homedir) {
- conf->menu_dir = (char*)sci_malloc(strlen(homedir) + strlen(FREESCI_GAMEDIR)
- + strlen(FREESCI_GAMES_DIR) + 2 * strlen(G_DIR_SEPARATOR_S) + 1);
- strcpy(conf->menu_dir, homedir);
- strcat(conf->menu_dir, G_DIR_SEPARATOR_S);
- strcat(conf->menu_dir, FREESCI_GAMEDIR);
- strcat(conf->menu_dir, G_DIR_SEPARATOR_S);
- strcat(conf->menu_dir, FREESCI_GAMES_DIR);
- }
- else
- conf->menu_dir = NULL;
-
- for (i = 0; i < FREESCI_DRIVER_SUBSYSTEMS_NR; i++)
- conf->driver_options[i] = NULL;
-/**** Default config ends */
-
-
- if (conffile) {
- exported_conf_path = (char *) sci_malloc(PATH_MAX + 1);
- getcwd(exported_conf_path, PATH_MAX+1);
-
- conf_path = sci_strdup(conffile); /* Use config file if supplied */
- } else {
- if (!homedir) { /* We're probably not under UNIX if this happens */
-
- conf_path = sci_strdup(FREESCI_CONFFILE_DOS); /* Use DOS config style */
-
- exported_conf_path = (char *) sci_malloc(PATH_MAX + 1);
- getcwd(exported_conf_path, PATH_MAX+1);
-
- dospath = 1; /* Use DOS-style paths */
-
- } else {
-
- /* So we've got a home directory */
- if (chdir(homedir)) {
- fprintf(stderr,"Warning: Could not enter home directory: %s\n", homedir);
- *_conf = conf; /* Set the result variable */
- return 1;
- }
-
- if (chdir(FREESCI_GAMEDIR))
- if (scimkdir(FREESCI_GAMEDIR, 0700)) {
-
- fprintf(stderr,"Warning: Could not enter/create ~/"FREESCI_GAMEDIR"\n");
- *_conf = conf; /* Set the result variable */
- return 1;
- }
-
- conf_path = (char *) sci_malloc(strlen(homedir) + 3 + strlen(FREESCI_GAMEDIR) + strlen(FREESCI_CONFFILE));
- strcpy(conf_path, homedir);
- strcat(conf_path, "/");
- strcat(conf_path, FREESCI_GAMEDIR);
-
- exported_conf_path = sci_strdup(conf_path);
-
- strcat(conf_path, "/");
- strcat(conf_path, FREESCI_CONFFILE);
-
- dospath = 0; /* Use UN*X-style paths */
- }
- } /* !conffile */
-
-
- if ((push_file(conf_path))) {
- printf("No configuration file found; using defaults.\n");
- *_conf = conf; /* Set the result variable */
- sci_free(conf_path);
- sci_free(exported_conf_path);
- return 1;
- }
-
- printf("Reading configuration...\n");
-
- yylex(); /* Parse the file */
-
- while (!pop_file()); /* Ignore error conditions- might be lex implementation dependant */
- sci_free(conf_path);
- sci_free(exported_conf_path);
-
- *_conf = conf; /* Store the result */
- return cur_section + 1;
-}
-
-
-static void
-config_free_driver_options(driver_option_t *option)
-{
- if (option) {
- sci_free(option->option);
- sci_free(option->value);
-
- config_free_driver_options(option->next);
- sci_free(option);
- }
-}
-
-static void
-config_free_driver_subsystem(subsystem_options_t *subsys)
-{
- if (subsys) {
- sci_free(subsys->name);
-
- config_free_driver_options(subsys->options);
-
- config_free_driver_subsystem(subsys->next);
- sci_free(subsys);
- }
-}
-
-
-void
-config_free(config_entry_t **conf, int entries)
-{
- int i;
-
- if ((*conf)->console_log)
- sci_free((*conf)->console_log);
-
- if ((*conf)->module_path)
- sci_free((*conf)->module_path);
-
- if ((*conf)->menu_dir)
- sci_free((*conf)->menu_dir);
-
- for (i = 0; i < entries; i++) {
- int j;
-
- if (i >= 1) {
- sci_free((*conf)[i].name);
- if ((*conf)[i].resource_dir)
- sci_free((*conf)[i].resource_dir);
- if ((*conf)[i].console_log)
- sci_free((*conf)[i].console_log);
- }
-
- for (j = 0; j < FREESCI_DRIVER_SUBSYSTEMS_NR; j++) {
- if ((*conf)[i].driver_options[j])
- config_free_driver_subsystem((*conf)[i].driver_options[j]);
- }
- }
-
- sci_free(*conf);
-}
-
-
-static int
-parse_name(char *name, name_value_pair *nvps, const char *what, int oldval)
-{
- int i = 0;
-
- while (nvps[i].name) {
- if (0 == strcasecmp(name, nvps[i].name))
- return nvps[i].value;
-
- i++;
- }
-
- printf("Invalid %s mode %s\n", what, name);
-
- return oldval;
-}
-
-
-#ifdef __GNUC__
-#warning "Re-enable sound stuff"
-#endif
-#if 0
-void *
-parse_sound_server(char *driver_name)
-{
- sound_server_t *retval = sound_server_find_driver(driver_name);
-
- if (retval)
- return (void *) retval;
- /* not found - return default */
-
- printf ("Unknown sound server %s\n", driver_name);
- return (void *) conf->sound_server;
-}
-
-void *
-parse_midiout_driver(char *driver_name)
-{
- midiout_driver_t *retval = midiout_find_driver(driver_name);
-
- if (retval)
- return (void *) retval;
- /* not found - return default */
-
- printf ("Unknown midiout driver %s\n", driver_name);
- return (void *) conf->midiout_driver;
-}
-
-
-void *
-parse_midi_device(char *driver_name)
-{
- midi_device_t *retval = midi_find_device(driver_name);
-
- if (retval)
- return (void *) retval;
- /* not found - return default */
-
- printf ("Unknown MIDI device %s\n", driver_name);
- return (void *) conf->midi_device;
-}
-
-void *
-parse_pcmout_driver(char *driver_name)
-{
- pcmout_driver_t *retval = pcmout_find_driver(driver_name);
-
- if (retval)
- return (void *) retval;
- /* not found - return default */
-
- printf ("Unknown pcmout driver %s\n", driver_name);
- return (void *) conf->pcmout_driver;
-}
-#endif
-
-static void
-parse_option(char *option, int optlen, char *value)
-{
- int optindex = 0;
- standard_option *opt = NULL;
-
- while (!opt && standard_options[optindex].type)
- if (optlen == strlen(standard_options[optindex].name)
- && !strncmp(standard_options[optindex].name, option, optlen))
- opt = &(standard_options[optindex]);
- else
- optindex++;
-
- if (!opt) {
- fprintf(stderr,"Invalid option '%s'\n", option);
- return;
- }
-
- switch (opt->type) {
-
- case OPTION_TYPE_INT: {
- char *foo;
- int int_value = strtol(value, &foo, 0);
-
- if (*foo) {
- fprintf(stderr, "Option '%s' expects numeric value; encountered '%s'\n",
- opt->name, value);
- return;
- }
-
- if (int_value < opt->min) {
- fprintf(stderr, "Option '%s' expects value >= %d; encountered '%s'\n", opt->name, opt->min, value);
- return;
- }
-
- if (int_value > opt->max) {
- fprintf(stderr, "Option '%s' expects value <= %d; encountered '%s'\n", opt->name, opt->max, value);
- return;
- }
-
- *((int *)(((char *)&(conf[cur_section])) + opt->varoffset)) = int_value; /* Store value */
-
- break;
- }
-
- case OPTION_TYPE_STRING: {
- char **stringref = ((char **)(((char *)&(conf[cur_section])) + opt->varoffset));
- if (*stringref)
- sci_free(*stringref);
- *stringref = sci_strdup(value); /* Store value */
- break;
- }
-
- case OPTION_TYPE_INVERSE_NVP:
- case OPTION_TYPE_NVP: {
- int int_value = parse_name(value, opt->nvp, opt->name, BAD_INT_VALUE);
-
- if (int_value != BAD_INT_VALUE) {
-
- if (opt->type == OPTION_TYPE_INVERSE_NVP)
- int_value = !int_value;
-
-/* FUCKED HERE: cur_section = 0, opt->varoffset = 205 */
- *((int *)(((char*)&(conf[cur_section])) + opt->varoffset)) = int_value; /* Store value */
- }
- break;
- }
-
-
- case OPTION_TYPE_RECT: {
- char *seeker = value;
-
- /* A rect_t is four integers */
- int *result = (int *) ((char *) &(conf[cur_section]) + opt->varoffset);
- int i;
-
- for (i=0;i<4;i++)
- {
- *(result++) = strtol(seeker, &seeker, 10);
- if (i < 3)
- {
- while (((*seeker == ',') || (*seeker == ' ')) &&
- (*seeker != 0))
- seeker++;
- if ((*seeker < '0') || (*seeker > '9'))
- {
- fprintf(stderr, "Option '%s' expects a rectangle\n", opt->name);
- return;
- }
- }
- }
-
- break;
- }
-
-
- case OPTION_TYPE_STATICREF: {
- *((void **)(((char *)&(conf[cur_section])) + opt->varoffset)) = opt->parse_funct(value);
- break;
- }
-
- default:
- fprintf(stderr, "INTERNAL ERROR in %s, parse_option(), line %d\n", __FILE__, __LINE__);
- }
-}
-
-
-driver_option_t *
-get_driver_options(config_entry_t *config, int subsystem, const char *name)
-{
- subsystem_options_t *options;
-
- if (subsystem < 0 || subsystem >= FREESCI_DRIVER_SUBSYSTEMS_NR) {
- fprintf(stderr, "Attempt to get options from invalid subsystem #%d!\n", subsystem);
- return NULL;
- }
-
- if (!config)
- return NULL;
-
-
- options = config->driver_options[subsystem];
-
- while (options && strcasecmp(options->name, name))
- options = options->next;
-
- if (options)
- return options->options;
-
- return NULL;
-}
-
-static driver_option_t *
-clone_driver_options(driver_option_t *options)
-{
- driver_option_t *retval;
-
- if (!options)
- return NULL;
-
- retval = (driver_option_t *) sci_malloc(sizeof(driver_option_t));
- retval->option = sci_strdup(options->option);
- retval->value = sci_strdup(options->value);
- retval->next = clone_driver_options(options->next);
-
- return retval;
-}
-
-static subsystem_options_t *
-clone_subsystem_options(subsystem_options_t *options)
-{
- subsystem_options_t *retval;
-
- if (!options)
- return NULL;
-
- retval = (subsystem_options_t *) sci_malloc(sizeof(subsystem_options_t));
- retval->name = sci_strdup(options->name);
- retval->options = clone_driver_options(options->options);
- retval->next = clone_subsystem_options(options->next);
-
- return retval;
-}
-
-static void
-copy_subsystem_options(config_entry_t *dest, config_entry_t *src)
-{
- int i;
- for (i = 0; i < FREESCI_DRIVER_SUBSYSTEMS_NR; i++)
- dest->driver_options[i] = clone_subsystem_options(src->driver_options[i]);
-}
-
-
-char *
-purge_comments(char *comments)
-{
- char *c = comments;
- int overwrite = 0;
- char ch;
-
- /* Tear out all comments */
- while ((ch = *c)) {
- if (ch == '#')
- overwrite = 1;
- if (ch == '\n')
- overwrite = 0;
- if (overwrite)
- *c = ' ';
-
- c++;
- }
-
- return comments;
-}
-
-static void
-set_config_parameter(config_entry_t *conf, char *subsystem_name, char *driver_name,
- char *option, char *value)
-{
- subsystem_options_t **subsys_optionsp;
- driver_option_t **driver_optionsp;
- int subsystem_nr = -1;
- int i = 0;
-
- while (subsystem_nr == -1 && i < FREESCI_DRIVER_SUBSYSTEMS_NR) {
- if (!strcasecmp(subsystem_name, freesci_subsystems[i].name))
- subsystem_nr = i;
- i++;
- }
-
- if (subsystem_nr == -1) {
- sciprintf("config file: There is no subsystem named '%s'\n", subsystem_name);
- return;
- }
-
-#if 0
- if (!(freesci_subsystems[subsystem_nr].check_driver(driver_name))) {
- sciprintf("config file: There is no %s driver called '%s'\n", subsystem_name, driver_name);
- return;
- }
-#endif
-
- subsys_optionsp = &(conf->driver_options[subsystem_nr]);
-
- while (*subsys_optionsp && strcasecmp((*subsys_optionsp)->name, driver_name))
- subsys_optionsp = &((*subsys_optionsp)->next);
-
- if (!*subsys_optionsp) {
- *subsys_optionsp = (subsystem_options_t *) sci_malloc(sizeof(subsystem_options_t));
- (*subsys_optionsp)->name = sci_strdup(driver_name);
- (*subsys_optionsp)->next = NULL;
- (*subsys_optionsp)->options = NULL;
- }
-
- driver_optionsp = &((*subsys_optionsp)->options);
-
- while (*driver_optionsp && strcasecmp((*driver_optionsp)->option, option))
- driver_optionsp = &((*driver_optionsp)->next);
-
- if (*driver_optionsp) {
- sci_free((*driver_optionsp)->value);
- } else {
- *driver_optionsp = (driver_option_t *) sci_malloc(sizeof(driver_option_t));
- (*driver_optionsp)->option = sci_strdup(option);
- (*driver_optionsp)->next = NULL;
- }
-
- (*driver_optionsp)->value = sci_strdup(value);
-}