bool settings_load_config(const char* file, bool apply) { int fd; char line[128]; char* name; char* value; int i; fd = open_utf8(file, O_RDONLY); if (fd < 0) return false; while (read_line(fd, line, sizeof line) > 0) { if (!settings_parseline(line, &name, &value)) continue; for(i=0; i<nb_settings; i++) { if (settings[i].cfg_name == NULL) continue; if (!strcasecmp(name,settings[i].cfg_name)) { switch (settings[i].flags&F_T_MASK) { case F_T_CUSTOM: settings[i].custom_setting->load_from_cfg(settings[i].setting, value); break; case F_T_INT: case F_T_UINT: #ifdef HAVE_LCD_COLOR if (settings[i].flags&F_RGB) hex_to_rgb(value, (int*)settings[i].setting); else #endif if (settings[i].cfg_vals == NULL) { *(int*)settings[i].setting = atoi(value); } else { int temp, *v = (int*)settings[i].setting; bool found = cfg_string_to_int(i, &temp, value); if (found) { if (settings[i].flags&F_TABLE_SETTING) *v = settings[i].table_setting->values[temp]; else *v = temp; } else { /* atoi breaks choice settings because they * don't have int-like values, and would * fall back to the first value (i.e. 0) * due to atoi */ if (!(settings[i].flags&F_CHOICE_SETTING)) *v = atoi(value); } } break; case F_T_BOOL: { int temp; if (cfg_string_to_int(i,&temp,value)) *(bool*)settings[i].setting = (temp!=0); if (settings[i].bool_setting->option_callback) settings[i].bool_setting->option_callback(temp!=0); break; } case F_T_CHARPTR: case F_T_UCHARPTR: { char storage[MAX_PATH]; if (settings[i].filename_setting->prefix) { int len = strlen(settings[i].filename_setting->prefix); if (!strncasecmp(value, settings[i].filename_setting->prefix, len)) { strlcpy(storage, &value[len], MAX_PATH); } else strlcpy(storage, value, MAX_PATH); } else strlcpy(storage, value, MAX_PATH); if (settings[i].filename_setting->suffix) { char *s = strcasestr(storage,settings[i].filename_setting->suffix); if (s) *s = '\0'; } strlcpy((char*)settings[i].setting, storage, settings[i].filename_setting->max_len); break; } } break; } /* if (!strcmp(name,settings[i].cfg_name)) */ } /* for(...) */ } /* while(...) */ close(fd); settings_save(); if (apply) settings_apply(true); return true; }
void settings_parse(config_t *config) { int i = 0; const char ps2[4] = "PS2"; char section_path[256]; char setting[256]; if (config == NULL) { return; } /// Home strcpy(section_path,ps2); strkat(section_path,".Home."); sprintf(setting,"%s%s",section_path,"Partition"); strcpy(settings.home.partition, cfg_get_string(setting,"")); sprintf(setting,"%s%s",section_path,"Directory"); strcpy(settings.home.directory, cfg_get_string(setting,"mc0:/SYS-CONF")); /// Display strcpy(section_path,ps2); strkat(section_path,".Display."); sprintf(setting,"%s%s",section_path,"Mode"); settings.display.mode = cfg_string_to_int(cfg_get_string(setting,"0")); printf("mode = %d\n",settings.display.mode); if (settings.display.mode == GRAPH_MODE_AUTO) { settings.display.mode = graph_get_region(); } sprintf(setting,"%s%s",section_path,"Interlace"); settings.display.interlace = cfg_get_bool(setting,0); sprintf(setting,"%s%s",section_path,"OffsetX"); settings.display.x = cfg_string_to_int(cfg_get_string(setting,"0")); sprintf(setting,"%s%s",section_path,"OffsetY"); settings.display.y = cfg_string_to_int(cfg_get_string(setting,"0")); /// Sound strcpy(section_path,ps2); strkat(section_path,".Sound."); sprintf(setting,"%s%s",section_path,"Stereo"); settings.sound.stereo = cfg_get_bool(setting,1); sprintf(setting,"%s%s",section_path,"Volume"); settings.sound.volume = cfg_string_to_int(cfg_get_string(setting,"100")); /// Font strcpy(section_path,ps2); strkat(section_path,".Font."); sprintf(setting,"%s%s",section_path,"Height"); settings.font.height = cfg_string_to_int(cfg_get_string(setting,"16")); sprintf(setting,"%s%s",section_path,"Color"); for (i = 0; i < 4; i++) { settings.font.color[i] = cfg_string_to_int(cfg_get_string_elem(setting,i,"128")); } sprintf(setting,"%s%s",section_path,"Highlight"); for (i = 0; i < 4; i++) { settings.font.highlight[i] = cfg_string_to_int(cfg_get_string_elem(setting,i,"255")); } /// Input strcpy(section_path,ps2); strkat(section_path,".Input."); sprintf(setting,"%s%s",section_path,"Port"); settings.input.port = cfg_string_to_int(cfg_get_string(setting,"0")); sprintf(setting,"%s%s",section_path,"Slot"); settings.input.slot = cfg_string_to_int(cfg_get_string(setting,"0")); sprintf(setting,"%s%s",section_path,"Confirm"); if (!strcmp("X",cfg_get_string(setting,"X"))) { settings.input.confirm = PAD_CROSS; } else { settings.input.confirm = PAD_CIRCLE; } /// Devices strcpy(section_path,ps2); strkat(section_path,".Devices."); sprintf(setting,"%s%s",section_path,"Mass"); settings.devices.mass = cfg_get_bool(setting,0); sprintf(setting,"%s%s",section_path,"HDD"); settings.devices.hdd = cfg_get_bool(setting,0); }