void parse_INIfile () { Log ("--[ PARSING INI FILE ]------------------------------\n"); #ifndef LINUX sprintf (config_file, "%shugo.ini", short_exe_name); #else { char tmp_home[256]; FILE *f; sprintf (tmp_home, "%shugo.ini", short_exe_name); f = fopen (tmp_home, "rb"); if (f != NULL) { strcpy (config_file, tmp_home); fclose (f); } else strcpy (config_file, "/etc/hugo.ini"); } #endif init_config (); parse_INIfile_raw (); dispose_config (); }
char init_config (void) { FILE *FCfgFile = NULL; char *pWrd = NULL; char *pRet; char *pTmp; char *section = NULL; if (config_ar) dispose_config(); config_ar_index = 0; config_ar = (config_var *) malloc (sizeof (config_var) * config_ar_size_max); if (! config_ar) return 0; /* open config file for reading */ if ((FCfgFile = fopen (config_file, "r")) != NULL) { do { memset (sCfgFileLine, '\0', BUFSIZ); /* note.. line must NOT be a comment */ pRet = fgets (sCfgFileLine, BUFSIZ, FCfgFile); if (sCfgFileLine[0] == '#') continue; if (sCfgFileLine[0] == '[') { int section_size; pWrd = strrchr (sCfgFileLine, ']'); if (pWrd == NULL) /* Badly formed section line */ continue; if (section != NULL) free (section); section_size = pWrd - sCfgFileLine; section = (char *) malloc (section_size); strncpy (section, sCfgFileLine + 1, section_size - 1); section[section_size - 1] = '\0'; continue; } pWrd = strchr (sCfgFileLine, '='); if (pWrd == NULL) continue; pTmp = strchr (pWrd, '\n'); if (pTmp != NULL) *pTmp = '\0'; if (config_ar_index < config_ar_size_max) { config_ar[config_ar_index].section = (char *) strdup (section); *pWrd = '\0'; pTmp = pWrd - 1; while (*pTmp == '\t' || *pTmp == ' ') *(pTmp--) = '\0'; config_ar[config_ar_index].variable = (char *) strdup (sCfgFileLine); while (*pWrd == '\t' || *pWrd == ' ') pWrd++; config_ar[config_ar_index].value = (char *) strdup (pWrd + 1); config_ar_index++; } } while (pRet != NULL); fclose (FCfgFile); } if (section != NULL) free (section); qsort (config_ar, config_ar_index, sizeof (config_var), config_var_cmp); return 1; }
//! makes the configuration changes permanent void save_config (void) { char config_name[PATH_MAX]; unsigned char input_config_number, input_config_button, input_config_player; // Reads all variables in the ini file init_config (); set_config_var_str ("main", "rom_dir", initial_path); set_config_var_int ("main", "config", current_config); set_config_var_int ("main", "language", language); set_config_var_int ("main", "smode", smode); set_config_var_int ("main", "eagle", use_eagle); set_config_var_int ("main", "scanline", use_scanline); set_config_var_int ("main", "snd_freq", option.want_snd_freq); set_config_var_int ("main", "buffer_size", sbuf_size); set_config_var_int ("main", "joy_type", gamepad_driver); set_config_var_int ("main", "sound_driver", sound_driver); set_config_var_int ("main", "start_fullscreen", option.want_fullscreen); set_config_var_int ("main", "use_fullscreen_aspect", option.want_fullscreen_aspect); set_config_var_int ("main", "use_overlay", option.want_hardware_scaling); set_config_var_int ("main", "minimum_bios_hooking", minimum_bios_hooking); set_config_var_str ("main", "cdsystem_path", cdsystem_path); set_config_var_str ("main", "cd_path", ISO_filename); set_config_var_int ("main", "stereo_sound", option.want_stereo); set_config_var_int ("main", "fullscreen_width", option.fullscreen_width); set_config_var_int ("main", "fullscreen_height", option.fullscreen_height); set_config_var_int ("main", "window_size", option.window_size); set_config_var_int ("main", "arcade_card", option.want_arcade_card_emulation); set_config_var_int ("main", "supergraphx", option.want_supergraphx_emulation); set_config_var_int ("main", "tv_size", option.want_television_size_emulation); set_config_var_int ("main", "hardware_format", option.wanted_hardware_format); // For each input configuration ... for (input_config_number = 0; input_config_number < 16; input_config_number++) { char section_name[] = "CONFIG0"; if (input_config_number < 10) section_name[6] = '0' + input_config_number; else section_name[6] = 'a' + input_config_number - 10; // For each player configuration ... for (input_config_player = 0; input_config_player < 5; input_config_player++) { char input_name[8]; char input_type_name[10]; // If there's a joypad, dump it if (config[input_config_number].individual_config[input_config_player].joydev) { snprintf (input_name, 8, "joydev%1d", input_config_player); snprintf (input_type_name, 10, "%d", config[input_config_number].individual_config[input_config_player].joydev); set_config_var_str (section_name, input_name, input_type_name); } // For each button configuration ... for (input_config_button = 0; input_config_button < J_MAX; input_config_button++) { char temp_joy_str[15]; // Skip empty entries in joypad mapping if (config[input_config_number].individual_config[input_config_player]. joy_mapping[input_config_button] == default_joy_mapping[input_config_button]) continue; if ((0 == config[input_config_number].individual_config[input_config_player].joydev) && (input_config_button >= J_PAD_START)) { // If it is a joystick button/axis and it is disabled, we skip it continue; } snprintf (temp_joy_str, 15, "%s%1d", joymap_reverse[input_config_button], input_config_player); set_config_var_int (section_name, temp_joy_str, config[input_config_number].individual_config[input_config_player]. joy_mapping[input_config_button]); } } } // Sorts the configuration array qsort (config_ar, config_ar_index, sizeof (config_var), config_var_cmp); // Dump the configuration into a file sprintf (config_name, "%shugo.ini", short_exe_name); dump_config (config_name); dispose_config (); }