EXPORT m64p_error CALL ConfigExternalGetParameter(m64p_handle Handle, const char *SectionName, const char *ParamName, char* ParamPtr, int ParamMaxLength) { struct external_config* ext_config = Handle; int foundSection = 0; if (ParamPtr == NULL || SectionName == NULL || ParamName == NULL) return M64ERR_INPUT_INVALID; void *buffer = malloc(ext_config->length + 1); memcpy(buffer, ext_config->file, ext_config->length + 1); char *line = buffer; char *end = line + ext_config->length; while (line < end) { ini_line l = ini_parse_line(&line); switch (l.type) { case INI_SECTION: if (osal_insensitive_strcmp(SectionName, l.name) == 0) foundSection = 1; else foundSection = 0; break; case INI_PROPERTY: if (foundSection) { if (osal_insensitive_strcmp(ParamName, l.name) == 0) { strncpy(ParamPtr, l.value, ParamMaxLength); free(buffer); return M64ERR_SUCCESS; } } break; default: break; } } free(buffer); return M64ERR_INPUT_NOT_FOUND; }
void romdatabase_open(void) { FILE *fPtr; char buffer[256]; romdatabase_search* search = NULL; romdatabase_search** next_search; int counter, value, lineno; unsigned char index; const char *pathname = ConfigGetSharedDataFilepath("mupen64plus.ini"); if(g_romdatabase.have_database) return; /* Open romdatabase. */ if (pathname == NULL || (fPtr = fopen(pathname, "rb")) == NULL) { DebugMessage(M64MSG_ERROR, "Unable to open rom database file '%s'.", pathname); return; } g_romdatabase.have_database = 1; /* Clear premade indices. */ for(counter = 0; counter < 255; ++counter) g_romdatabase.crc_lists[counter] = NULL; for(counter = 0; counter < 255; ++counter) g_romdatabase.md5_lists[counter] = NULL; g_romdatabase.list = NULL; next_search = &g_romdatabase.list; /* Parse ROM database file */ for (lineno = 1; fgets(buffer, 255, fPtr) != NULL; lineno++) { char *line = buffer; ini_line l = ini_parse_line(&line); switch (l.type) { case INI_SECTION: { md5_byte_t md5[16]; if (!parse_hex(l.name, md5, 16)) { DebugMessage(M64MSG_WARNING, "ROM Database: Invalid MD5 on line %i", lineno); search = NULL; continue; } *next_search = (romdatabase_search*) malloc(sizeof(romdatabase_search)); search = *next_search; next_search = &search->next_entry; memset(search, 0, sizeof(romdatabase_search)); search->entry.goodname = NULL; memcpy(search->entry.md5, md5, 16); search->entry.refmd5 = NULL; search->entry.crc1 = 0; search->entry.crc2 = 0; search->entry.status = 0; /* Set default to 0 stars. */ search->entry.savetype = DEFAULT; search->entry.players = DEFAULT; search->entry.rumble = DEFAULT; search->entry.countperop = COUNT_PER_OP_DEFAULT; search->entry.alternate_vi_timing = ALTERNATE_VI_TIMING_DEFAULT; search->entry.count_per_scanline = DEFAULT_COUNT_PER_SCANLINE; search->entry.cheats = NULL; search->entry.set_flags = ROMDATABASE_ENTRY_NONE; search->next_entry = NULL; search->next_crc = NULL; /* Index MD5s by first 8 bits. */ index = search->entry.md5[0]; search->next_md5 = g_romdatabase.md5_lists[index]; g_romdatabase.md5_lists[index] = search; break; } case INI_PROPERTY: // This happens if there's stray properties before any section, // or if some error happened on INI_SECTION (e.g. parsing). if (search == NULL) { DebugMessage(M64MSG_WARNING, "ROM Database: Ignoring property on line %i", lineno); continue; } if(!strcmp(l.name, "GoodName")) { search->entry.goodname = strdup(l.value); search->entry.set_flags |= ROMDATABASE_ENTRY_GOODNAME; } else if(!strcmp(l.name, "CRC")) { char garbage_sweeper; if (sscanf(l.value, "%X %X%c", &search->entry.crc1, &search->entry.crc2, &garbage_sweeper) == 2) { /* Index CRCs by first 8 bits. */ index = search->entry.crc1 >> 24; search->next_crc = g_romdatabase.crc_lists[index]; g_romdatabase.crc_lists[index] = search; search->entry.set_flags |= ROMDATABASE_ENTRY_CRC; } else { search->entry.crc1 = search->entry.crc2 = 0; DebugMessage(M64MSG_WARNING, "ROM Database: Invalid CRC on line %i", lineno); } }
m64p_error ConfigInit(const char *ConfigDirOverride, const char *DataDirOverride) { m64p_error rval; const char *configpath = NULL; char *filepath; long filelen; FILE *fPtr; char *configtext; config_section *current_section = NULL; char *line, *end, *lastcomment; if (l_ConfigInit) return M64ERR_ALREADY_INIT; l_ConfigInit = 1; /* if a data directory was specified, make a copy of it */ if (DataDirOverride != NULL) { l_DataDirOverride = strdup(DataDirOverride); if (l_DataDirOverride == NULL) return M64ERR_NO_MEMORY; /* TODO mupen64plus-ae specific hack */ strcpy(l_DataDirOverride, DataDirOverride); } /* if a config directory was specified, make a copy of it */ if (ConfigDirOverride != NULL) { l_ConfigDirOverride = strdup(ConfigDirOverride); if (l_ConfigDirOverride == NULL) return M64ERR_NO_MEMORY; } /* get the full pathname to the config file and try to open it */ configpath = ConfigGetUserConfigPath(); if (configpath == NULL) return M64ERR_FILES; filepath = combinepath(configpath, MUPEN64PLUS_CFG_NAME); if (filepath == NULL) return M64ERR_NO_MEMORY; fPtr = fopen(filepath, "rb"); if (fPtr == NULL) { DebugMessage(M64MSG_INFO, "Couldn't open configuration file '%s'. Using defaults.", filepath); free(filepath); l_SaveConfigOnExit = 1; /* auto-save the config file so that the defaults will be saved to disk */ return M64ERR_SUCCESS; } free(filepath); /* read the entire config file */ fseek(fPtr, 0L, SEEK_END); filelen = ftell(fPtr); fseek(fPtr, 0L, SEEK_SET); configtext = (char *) malloc(filelen + 1); if (configtext == NULL) { fclose(fPtr); return M64ERR_NO_MEMORY; } if (fread(configtext, 1, filelen, fPtr) != filelen) { free(configtext); fclose(fPtr); return M64ERR_FILES; } fclose(fPtr); /* parse the file data */ current_section = NULL; line = configtext; end = configtext + filelen; lastcomment = NULL; *end = 0; while (line < end) { ini_line l = ini_parse_line(&line); switch (l.type) { case INI_COMMENT: lastcomment = l.value; break; case INI_SECTION: rval = ConfigOpenSection(l.name, (m64p_handle *) ¤t_section); if (rval != M64ERR_SUCCESS) { free(configtext); return rval; } lastcomment = NULL; break; case INI_PROPERTY: if (l.value[0] == '"' && l.value[strlen(l.value)-1] == '"') { l.value++; l.value[strlen(l.value)-1] = 0; ConfigSetDefaultString((m64p_handle) current_section, l.name, l.value, lastcomment); } else if (osal_insensitive_strcmp(l.value, "false") == 0) { ConfigSetDefaultBool((m64p_handle) current_section, l.name, 0, lastcomment); } else if (osal_insensitive_strcmp(l.value, "true") == 0) { ConfigSetDefaultBool((m64p_handle) current_section, l.name, 1, lastcomment); } else if (is_numeric(l.value)) { int val_int = (int) strtol(l.value, NULL, 10); float val_float = (float) strtod(l.value, NULL); if ((val_float - val_int) != 0.0) ConfigSetDefaultFloat((m64p_handle) current_section, l.name, val_float, lastcomment); else ConfigSetDefaultInt((m64p_handle) current_section, l.name, val_int, lastcomment); } else { /* assume that it's a string */ ConfigSetDefaultString((m64p_handle) current_section, l.name, l.value, lastcomment); } lastcomment = NULL; break; default: break; } } /* release memory used for config file text */ free(configtext); /* duplicate the entire config data list, to store a copy of the list which represents the state of the file on disk */ copy_configlist_active_to_saved(); return M64ERR_SUCCESS; }
void LoadCustomSettings(bool internal) { std::string myString = replaceChars(RSP.romname); bool found = false; char buffer[256]; char* line; FILE* fPtr; std::transform(myString.begin(), myString.end(), myString.begin(), ::toupper); if (internal) { line = strtok(customini, "\n"); } else { const char *pathname = ConfigGetSharedDataFilepath("GLideN64.custom.ini"); if (pathname == NULL || (fPtr = fopen(pathname, "rb")) == NULL) return; } while (true) { if (!internal) { if (fgets(buffer, 255, fPtr) == NULL) break; else line = buffer; } ini_line l = ini_parse_line(&line); switch (l.type) { case INI_SECTION: { if (myString == replaceChars(l.name)) found = true; else found = false; } case INI_PROPERTY: { if (found) { if (!strcmp(l.name, "video\\cropMode")) config.video.cropMode = atoi(l.value); else if (!strcmp(l.name, "video\\cropWidth")) config.video.cropWidth = atoi(l.value); else if (!strcmp(l.name, "video\\cropHeight")) config.video.cropHeight = atoi(l.value); else if (!strcmp(l.name, "video\\multisampling")) config.video.multisampling = atoi(l.value); else if (!strcmp(l.name, "frameBufferEmulation\\aspect")) config.frameBufferEmulation.aspect = atoi(l.value); else if (!strcmp(l.name, "frameBufferEmulation\\nativeResFactor")) config.frameBufferEmulation.nativeResFactor = atoi(l.value); else if (!strcmp(l.name, "frameBufferEmulation\\copyToRDRAM")) config.frameBufferEmulation.copyToRDRAM = atoi(l.value); else if (!strcmp(l.name, "frameBufferEmulation\\copyFromRDRAM")) config.frameBufferEmulation.copyFromRDRAM = atoi(l.value); else if (!strcmp(l.name, "frameBufferEmulation\\copyDepthToRDRAM")) config.frameBufferEmulation.copyDepthToRDRAM = atoi(l.value); else if (!strcmp(l.name, "frameBufferEmulation\\copyAuxToRDRAM")) config.frameBufferEmulation.copyAuxToRDRAM = atoi(l.value); else if (!strcmp(l.name, "frameBufferEmulation\\N64DepthCompare")) config.frameBufferEmulation.N64DepthCompare = atoi(l.value); else if (!strcmp(l.name, "frameBufferEmulation\\bufferSwapMode")) config.frameBufferEmulation.bufferSwapMode = atoi(l.value); else if (!strcmp(l.name, "texture\\bilinearMode")) config.texture.bilinearMode = atoi(l.value); else if (!strcmp(l.name, "texture\\maxAnisotropy")) config.texture.maxAnisotropy = atoi(l.value); else if (!strcmp(l.name, "generalEmulation\\enableNativeResTexrects")) config.generalEmulation.enableNativeResTexrects = atoi(l.value); else if (!strcmp(l.name, "generalEmulation\\correctTexrectCoords")) config.generalEmulation.correctTexrectCoords = atoi(l.value); else if (!strcmp(l.name, "generalEmulation\\enableLegacyBlending")) config.generalEmulation.enableLegacyBlending = atoi(l.value); else if (!strcmp(l.name, "generalEmulation\\enableFragmentDepthWrite")) config.generalEmulation.enableFragmentDepthWrite = atoi(l.value); } } } if (internal) { line = strtok(NULL, "\n"); if (line == NULL) break; } } }