int Util_unlink(const char *filename) { WCHAR wfilename[FILENAME_MAX]; #ifdef _WIN32_WCE char cwd[FILENAME_MAX]; char fullfilename[FILENAME_MAX]; if (filename[0] != '\\' && filename[0] != '/') { getcwd(cwd, FILENAME_MAX); Util_catpath(fullfilename, cwd, filename); if (MultiByteToWideChar(CP_ACP, 0, fullfilename, -1, wfilename, FILENAME_MAX) <= 0) return -1; } else #endif if (MultiByteToWideChar(CP_ACP, 0, filename, -1, wfilename, FILENAME_MAX) <= 0) return -1; return (DeleteFile(wfilename) != 0) ? 0 : -1; }
int Atari800_Initialise(int *argc, char *argv[]) { int i, j; const char *rom_filename = NULL; const char *rom2_filename = NULL; const char *run_direct = NULL; #ifndef BASIC const char *state_file = NULL; #endif #ifdef __PLUS /* Atari800Win PLus doesn't use configuration files, it reads configuration from the Registry */ #ifndef _WX_ int bUpdateRegistry = (*argc > 1); #endif int bTapeFile = FALSE; int nCartType = CARTRIDGE_type; /* It is necessary because of the CARTRIDGE_Start (there must not be the registry-read value available at startup) */ CARTRIDGE_type = CARTRIDGE_NONE; #ifndef _WX_ /* Print the time info in the "Log file" window */ Misc_PrintTime(); /* Force screen refreshing */ g_nTestVal = _GetRefreshRate() - 1; g_ulAtariState = ATARI_UNINITIALIZED; #endif /* _WX_ */ #elif defined(MACOSX) #else /* __PLUS */ const char *rtconfig_filename = NULL; int got_config; int help_only = FALSE; if (*argc > 1) { for (i = j = 1; i < *argc; i++) { if (strcmp(argv[i], "-config") == 0) { rtconfig_filename = argv[++i]; } else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "-version") == 0 || strcmp(argv[i], "--version") == 0) { printf("%s\n", Atari800_TITLE); return FALSE; } else if (strcmp(argv[i], "--usage") == 0 || strcmp(argv[i], "--help") == 0) { argv[j++] = "-help"; } else if (strcmp(argv[i], "-verbose") == 0) { verbose = TRUE; } else { argv[j++] = argv[i]; } } *argc = j; } got_config = CFG_LoadConfig(rtconfig_filename); /* try to find ROM images if the configuration file is not found or it does not specify some ROM paths (blank paths count as specified) */ CFG_FindROMImages("", TRUE); /* current directory */ #if defined(unix) || defined(__unix__) || defined(__linux__) CFG_FindROMImages("/usr/share/atari800", TRUE); #endif if (*argc > 0 && argv[0] != NULL) { char atari800_exe_dir[FILENAME_MAX]; char atari800_exe_rom_dir[FILENAME_MAX]; /* the directory of the Atari800 program */ Util_splitpath(argv[0], atari800_exe_dir, NULL); CFG_FindROMImages(atari800_exe_dir, TRUE); /* "rom" and "ROM" subdirectories of this directory */ Util_catpath(atari800_exe_rom_dir, atari800_exe_dir, "rom"); CFG_FindROMImages(atari800_exe_rom_dir, TRUE); /* skip "ROM" on systems that are known to be case-insensitive */ #if !defined(DJGPP) && !defined(WIN32) Util_catpath(atari800_exe_rom_dir, atari800_exe_dir, "ROM"); CFG_FindROMImages(atari800_exe_rom_dir, TRUE); #endif } /* finally if nothing is found, set some defaults to make the configuration file easier to edit */ if (Util_filenamenotset(CFG_osa_filename)) strcpy(CFG_osa_filename, "atariosa.rom"); if (Util_filenamenotset(CFG_osb_filename)) strcpy(CFG_osb_filename, "atariosb.rom"); if (Util_filenamenotset(CFG_xlxe_filename)) strcpy(CFG_xlxe_filename, "atarixl.rom"); if (Util_filenamenotset(CFG_5200_filename)) strcpy(CFG_5200_filename, "5200.rom"); if (Util_filenamenotset(CFG_basic_filename)) strcpy(CFG_basic_filename, "ataribas.rom"); /* if no configuration file read, try to save one with the defaults */ if (!got_config) CFG_WriteConfig(); #endif /* __PLUS */ for (i = j = 1; i < *argc; i++) { if (strcmp(argv[i], "-atari") == 0) { if (Atari800_machine_type != Atari800_MACHINE_OSA) { Atari800_machine_type = Atari800_MACHINE_OSB; MEMORY_ram_size = 48; } } else if (strcmp(argv[i], "-xl") == 0) { Atari800_machine_type = Atari800_MACHINE_XLXE; MEMORY_ram_size = 64; } else if (strcmp(argv[i], "-xe") == 0) { Atari800_machine_type = Atari800_MACHINE_XLXE; MEMORY_ram_size = 128; } else if (strcmp(argv[i], "-320xe") == 0) { Atari800_machine_type = Atari800_MACHINE_XLXE; MEMORY_ram_size = MEMORY_RAM_320_COMPY_SHOP; } else if (strcmp(argv[i], "-rambo") == 0) { Atari800_machine_type = Atari800_MACHINE_XLXE; MEMORY_ram_size = MEMORY_RAM_320_RAMBO; } else if (strcmp(argv[i], "-5200") == 0) { Atari800_machine_type = Atari800_MACHINE_5200; MEMORY_ram_size = 16; } else if (strcmp(argv[i], "-nobasic") == 0) Atari800_disable_basic = TRUE; else if (strcmp(argv[i], "-basic") == 0) Atari800_disable_basic = FALSE; else if (strcmp(argv[i], "-nopatch") == 0) ESC_enable_sio_patch = FALSE; else if (strcmp(argv[i], "-nopatchall") == 0) #ifdef D_PATCH ESC_enable_sio_patch = Devices_enable_h_patch = Devices_enable_d_patch = Devices_enable_p_patch = Devices_enable_r_patch = FALSE; #else ESC_enable_sio_patch = Devices_enable_h_patch = Devices_enable_p_patch = Devices_enable_r_patch = FALSE; #endif else if (strcmp(argv[i], "-pal") == 0) Atari800_tv_mode = Atari800_TV_PAL; else if (strcmp(argv[i], "-ntsc") == 0) Atari800_tv_mode = Atari800_TV_NTSC; else if (strcmp(argv[i], "-a") == 0) { Atari800_machine_type = Atari800_MACHINE_OSA; MEMORY_ram_size = 48; } else if (strcmp(argv[i], "-b") == 0) { Atari800_machine_type = Atari800_MACHINE_OSB; MEMORY_ram_size = 48; } else if (strcmp(argv[i], "-emuos") == 0) emuos_mode = 2; else if (strcmp(argv[i], "-c") == 0) { if (MEMORY_ram_size == 48) MEMORY_ram_size = 52; } else { /* parameters that take additional argument follow here */ int i_a = (i + 1 < *argc); /* is argument available? */ int a_m = FALSE; /* error, argument missing! */ if (strcmp(argv[i], "-osa_rom") == 0) { if (i_a) Util_strlcpy(CFG_osa_filename, argv[++i], sizeof(CFG_osa_filename)); else a_m = TRUE; } #if 0 /* TBD what to do with R device */ #ifdef R_IO_DEVICE else if (strcmp(argv[i], "-rdevice") == 0) { Devices_enable_r_patch = TRUE; #ifdef R_SERIAL if (i_a && i + 2 < *argc && *argv[i + 1] != '-') { /* optional serial device name */ struct stat statbuf; if (! stat(argv[i + 1], &statbuf)) { if (S_ISCHR(statbuf.st_mode)) { /* only accept devices as serial device */ Util_strlcpy(RDevice_serial_device, argv[++i], FILENAME_MAX); RDevice_serial_enabled = TRUE; } } } #endif /* R_SERIAL */ } #endif #endif else if (strcmp(argv[i], "-osb_rom") == 0) { if (i_a) Util_strlcpy(CFG_osb_filename, argv[++i], sizeof(CFG_osb_filename)); else a_m = TRUE; } else if (strcmp(argv[i], "-xlxe_rom") == 0) { if (i_a) Util_strlcpy(CFG_xlxe_filename, argv[++i], sizeof(CFG_xlxe_filename)); else a_m = TRUE; } else if (strcmp(argv[i], "-5200_rom") == 0) { if (i_a) Util_strlcpy(CFG_5200_filename, argv[++i], sizeof(CFG_5200_filename)); else a_m = TRUE; } else if (strcmp(argv[i], "-basic_rom") == 0) { if (i_a) Util_strlcpy(CFG_basic_filename, argv[++i], sizeof(CFG_basic_filename)); else a_m = TRUE; } else if (strcmp(argv[i], "-cart") == 0) { if (i_a) rom_filename = argv[++i]; else a_m = TRUE; } else if (strcmp(argv[i], "-cart2") == 0) { if (i_a) rom2_filename = argv[++i]; else a_m = TRUE; } else if (strcmp(argv[i], "-run") == 0) { if (i_a) run_direct = argv[++i]; else a_m = TRUE; } else if (strcmp(argv[i], "-mosaic") == 0) { int total_ram = Util_sscandec(argv[++i]); MEMORY_mosaic_enabled = TRUE; MEMORY_mosaic_maxbank = (total_ram - 48)/4 - 1; if (((total_ram - 48) % 4 != 0) || (MEMORY_mosaic_maxbank > 0x3e) || (MEMORY_mosaic_maxbank < 0)) { Log_print("Invalid Mosaic total RAM size"); return FALSE; } if (MEMORY_axlon_enabled) { Log_print("Axlon and Mosaic can not both be enabled, because they are incompatible"); return FALSE; } } else if (strcmp(argv[i], "-axlon") == 0) { int total_ram = Util_sscandec(argv[++i]); int banks = ((total_ram) - 32) / 16; MEMORY_axlon_enabled = TRUE; if (((total_ram - 32) % 16 != 0) || ((banks != 8) && (banks != 16) && (banks != 32) && (banks != 64) && (banks != 128) && (banks != 256))) { Log_print("Invalid Axlon total RAM size"); return FALSE; } if (MEMORY_mosaic_enabled) { Log_print("Axlon and Mosaic can not both be enabled, because they are incompatible"); return FALSE; } MEMORY_axlon_bankmask = banks - 1; } else if (strcmp(argv[i], "-axlon0f") == 0) { MEMORY_axlon_0f_mirror = TRUE; } #ifndef BASIC /* The BASIC version does not support state files, because: 1. It has no ability to save state files, because of lack of UI. 2. It uses a simplified emulation, so the state files would be incompatible with other versions. 3. statesav is not compiled in to make the executable smaller. */ else if (strcmp(argv[i], "-state") == 0) { if (i_a) state_file = argv[++i]; else a_m = TRUE; } else if (strcmp(argv[i], "-refresh") == 0) { if (i_a) { Atari800_refresh_rate = Util_sscandec(argv[++i]); if (Atari800_refresh_rate < 1) { Log_print("Invalid refresh rate, using 1"); Atari800_refresh_rate = 1; } } else a_m = TRUE; } #endif /* BASIC */ #ifdef STEREO_SOUND else if (strcmp(argv[i], "-stereo") == 0) { POKEYSND_stereo_enabled = TRUE; } else if (strcmp(argv[i], "-nostereo") == 0) { POKEYSND_stereo_enabled = FALSE; } #endif /* STEREO_SOUND */ else { /* all options known to main module tried but none matched */ if (strcmp(argv[i], "-help") == 0) { #if !defined(__PLUS) && !defined(MACOSX) help_only = TRUE; Log_print("\t-config <file> Specify Alternate Configuration File"); #endif Log_print("\t-atari Emulate Atari 800"); Log_print("\t-xl Emulate Atari 800XL"); Log_print("\t-xe Emulate Atari 130XE"); Log_print("\t-320xe Emulate Atari 320XE (COMPY SHOP)"); Log_print("\t-rambo Emulate Atari 320XE (RAMBO)"); Log_print("\t-5200 Emulate Atari 5200 Games System"); Log_print("\t-nobasic Turn off Atari BASIC ROM"); Log_print("\t-basic Turn on Atari BASIC ROM"); Log_print("\t-pal Enable PAL TV mode"); Log_print("\t-ntsc Enable NTSC TV mode"); Log_print("\t-osa_rom <file> Load OS A ROM from file"); Log_print("\t-osb_rom <file> Load OS B ROM from file"); Log_print("\t-xlxe_rom <file> Load XL/XE ROM from file"); Log_print("\t-5200_rom <file> Load 5200 ROM from file"); Log_print("\t-basic_rom <fil> Load BASIC ROM from file"); Log_print("\t-cart <file> Install cartridge (raw or CART format)"); Log_print("\t-run <file> Run Atari program (COM, EXE, XEX, BAS, LST)"); #ifndef BASIC Log_print("\t-state <file> Load saved-state file"); Log_print("\t-refresh <rate> Specify screen refresh rate"); #endif Log_print("\t-nopatch Don't patch SIO routine in OS"); Log_print("\t-nopatchall Don't patch OS at all, H: device won't work"); Log_print("\t-a Use OS A"); Log_print("\t-b Use OS B"); Log_print("\t-c Enable RAM between 0xc000 and 0xcfff in Atari 800"); Log_print("\t-axlon <n> Use Atari 800 Axlon memory expansion: <n> k total RAM"); Log_print("\t-axlon0f Use Axlon shadow at 0x0fc0-0x0fff"); Log_print("\t-mosaic <n> Use 400/800 Mosaic memory expansion: <n> k total RAM"); #ifdef R_IO_DEVICE Log_print("\t-rdevice [<dev>] Enable R: emulation (using serial device <dev>)"); #endif Log_print("\t-v Show version/release number"); } /* copy this option for platform/module specific evaluation */ argv[j++] = argv[i]; } /* this is the end of the additional argument check */ if (a_m) { printf("Missing argument for '%s'\n", argv[i]); return FALSE; } } }
int CFG_LoadConfig(const char *alternate_config_filename) { FILE *fp; const char *fname = rtconfig_filename; char string[256]; #ifndef BASIC int was_obsolete_dir = FALSE; #endif #ifdef SUPPORTS_PLATFORM_CONFIGINIT PLATFORM_ConfigInit(); #endif /* if alternate config filename is passed then use it */ if (alternate_config_filename != NULL && *alternate_config_filename > 0) { Util_strlcpy(rtconfig_filename, alternate_config_filename, FILENAME_MAX); } /* else use the default config name under the HOME folder */ else { char *home = getenv("HOME"); if (home != NULL) Util_catpath(rtconfig_filename, home, DEFAULT_CFG_NAME); else strcpy(rtconfig_filename, DEFAULT_CFG_NAME); } fp = fopen(fname, "r"); if (fp == NULL) { Log_print("User config file '%s' not found.", rtconfig_filename); #ifdef SYSTEM_WIDE_CFG_FILE /* try system wide config file */ fname = SYSTEM_WIDE_CFG_FILE; Log_print("Trying system wide config file: %s", fname); fp = fopen(fname, "r"); #endif if (fp == NULL) { Log_print("No configuration file found, will create fresh one from scratch:"); return FALSE; } } if (fgets(string, sizeof(string), fp) != NULL) { Log_print("Using Atari800 config file: %s\nCreated by %s", fname, string); } while (fgets(string, sizeof(string), fp)) { char *ptr; Util_chomp(string); ptr = strchr(string, '='); if (ptr != NULL) { *ptr++ = '\0'; Util_trim(string); Util_trim(ptr); if (SYSROM_ReadConfig(string, ptr)) { } #ifdef BASIC else if (strcmp(string, "ATARI_FILES_DIR") == 0 || strcmp(string, "SAVED_FILES_DIR") == 0 || strcmp(string, "DISK_DIR") == 0 || strcmp(string, "ROM_DIR") == 0 || strcmp(string, "EXE_DIR") == 0 || strcmp(string, "STATE_DIR") == 0) /* do nothing */; #else else if (strcmp(string, "ATARI_FILES_DIR") == 0) { if (UI_n_atari_files_dir >= UI_MAX_DIRECTORIES) Log_print("All ATARI_FILES_DIR slots used!"); else Util_strlcpy(UI_atari_files_dir[UI_n_atari_files_dir++], ptr, FILENAME_MAX); } else if (strcmp(string, "SAVED_FILES_DIR") == 0) { if (UI_n_saved_files_dir >= UI_MAX_DIRECTORIES) Log_print("All SAVED_FILES_DIR slots used!"); else Util_strlcpy(UI_saved_files_dir[UI_n_saved_files_dir++], ptr, FILENAME_MAX); } else if (strcmp(string, "DISK_DIR") == 0 || strcmp(string, "ROM_DIR") == 0 || strcmp(string, "EXE_DIR") == 0 || strcmp(string, "STATE_DIR") == 0) { /* ignore blank and "." values */ if (ptr[0] != '\0' && (ptr[0] != '.' || ptr[1] != '\0')) was_obsolete_dir = TRUE; } #endif else if (strcmp(string, "H1_DIR") == 0) Util_strlcpy(Devices_atari_h_dir[0], ptr, FILENAME_MAX); else if (strcmp(string, "H2_DIR") == 0) Util_strlcpy(Devices_atari_h_dir[1], ptr, FILENAME_MAX); else if (strcmp(string, "H3_DIR") == 0) Util_strlcpy(Devices_atari_h_dir[2], ptr, FILENAME_MAX); else if (strcmp(string, "H4_DIR") == 0) Util_strlcpy(Devices_atari_h_dir[3], ptr, FILENAME_MAX); else if (strcmp(string, "HD_READ_ONLY") == 0) Devices_h_read_only = Util_sscandec(ptr); else if (strcmp(string, "PRINT_COMMAND") == 0) { if (!Devices_SetPrintCommand(ptr)) Log_print("Unsafe PRINT_COMMAND ignored"); } else if (strcmp(string, "SCREEN_REFRESH_RATIO") == 0) Atari800_refresh_rate = Util_sscandec(ptr); else if (strcmp(string, "DISABLE_BASIC") == 0) Atari800_disable_basic = Util_sscanbool(ptr); else if (strcmp(string, "ENABLE_SIO_PATCH") == 0) { ESC_enable_sio_patch = Util_sscanbool(ptr); } else if (strcmp(string, "ENABLE_H_PATCH") == 0) { Devices_enable_h_patch = Util_sscanbool(ptr); } else if (strcmp(string, "ENABLE_P_PATCH") == 0) { Devices_enable_p_patch = Util_sscanbool(ptr); } else if (strcmp(string, "ENABLE_R_PATCH") == 0) { Devices_enable_r_patch = Util_sscanbool(ptr); } else if (strcmp(string, "ENABLE_NEW_POKEY") == 0) { #ifdef SOUND POKEYSND_enable_new_pokey = Util_sscanbool(ptr); #endif /* SOUND */ } else if (strcmp(string, "STEREO_POKEY") == 0) { #ifdef STEREO_SOUND POKEYSND_stereo_enabled = Util_sscanbool(ptr); #ifdef SOUND_THIN_API Sound_desired.channels = POKEYSND_stereo_enabled ? 2 : 1; #endif /* SOUND_THIN_API */ #endif /* STEREO_SOUND */ } else if (strcmp(string, "SPEAKER_SOUND") == 0) { #ifdef CONSOLE_SOUND POKEYSND_console_sound_enabled = Util_sscanbool(ptr); #endif } else if (strcmp(string, "SERIO_SOUND") == 0) { #ifdef SERIO_SOUND POKEYSND_serio_sound_enabled = Util_sscanbool(ptr); #endif } else if (strcmp(string, "MACHINE_TYPE") == 0) { if (strcmp(ptr, "Atari 400/800") == 0 || /* Also recognise legacy values of this parameter */ strcmp(ptr, "Atari OS/A") == 0 || strcmp(ptr, "Atari OS/B") == 0) Atari800_machine_type = Atari800_MACHINE_800; else if (strcmp(ptr, "Atari XL/XE") == 0) Atari800_machine_type = Atari800_MACHINE_XLXE; else if (strcmp(ptr, "Atari 5200") == 0) Atari800_machine_type = Atari800_MACHINE_5200; else Log_print("Invalid machine type: %s", ptr); } else if (strcmp(string, "RAM_SIZE") == 0) { if (strcmp(ptr, "320 (RAMBO)") == 0) MEMORY_ram_size = MEMORY_RAM_320_RAMBO; else if (strcmp(ptr, "320 (COMPY SHOP)") == 0) MEMORY_ram_size = MEMORY_RAM_320_COMPY_SHOP; else { int size = Util_sscandec(ptr); if (MEMORY_SizeValid(size)) MEMORY_ram_size = size; else Log_print("Invalid RAM size: %s", ptr); } } else if (strcmp(string, "DEFAULT_TV_MODE") == 0) { if (strcmp(ptr, "PAL") == 0) Atari800_tv_mode = Atari800_TV_PAL; else if (strcmp(ptr, "NTSC") == 0) Atari800_tv_mode = Atari800_TV_NTSC; else Log_print("Invalid TV Mode: %s", ptr); } else if (strcmp(string, "MOSAIC_RAM_NUM_BANKS") == 0) { int num = Util_sscandec(ptr); if (num >= 0 && num <= 64) MEMORY_mosaic_num_banks = num; else Log_print("Invalid Mosaic RAM number of banks: %s", ptr); } else if (strcmp(string, "AXLON_RAM_NUM_BANKS") == 0) { int num = Util_sscandec(ptr); if (num == 0 || num == 8 || num == 16 || num == 32 || num == 64 || num == 128 || num == 256) MEMORY_axlon_num_banks = num; else Log_print("Invalid Mosaic RAM number of banks: %s", ptr); } else if (strcmp(string, "ENABLE_MAPRAM") == 0) MEMORY_enable_mapram = Util_sscanbool(ptr); else if (strcmp(string, "BUILTIN_BASIC") == 0) Atari800_builtin_basic = Util_sscanbool(ptr); else if (strcmp(string, "KEYBOARD_LEDS") == 0) Atari800_keyboard_leds = Util_sscanbool(ptr); else if (strcmp(string, "F_KEYS") == 0) Atari800_f_keys = Util_sscanbool(ptr); else if (strcmp(string, "BUILTIN_GAME") == 0) Atari800_builtin_game = Util_sscanbool(ptr); else if (strcmp(string, "KEYBOARD_DETACHED") == 0) Atari800_keyboard_detached = Util_sscanbool(ptr); else if (strcmp(string, "1200XL_JUMPER") == 0) Atari800_jumper = Util_sscanbool(ptr); else if (strcmp(string, "CFG_SAVE_ON_EXIT") == 0) { CFG_save_on_exit = Util_sscanbool(ptr); } /* Add module-specific configurations here */ else if (PBI_ReadConfig(string,ptr)) { } else if (CARTRIDGE_ReadConfig(string, ptr)) { } else if (CASSETTE_ReadConfig(string, ptr)) { } else if (RTIME_ReadConfig(string, ptr)) { } #ifdef XEP80_EMULATION else if (XEP80_ReadConfig(string, ptr)) { } #endif #ifdef AF80 else if (AF80_ReadConfig(string,ptr)) { } #endif #if !defined(BASIC) && !defined(CURSES_BASIC) else if (Colours_ReadConfig(string, ptr)) { } else if (ARTIFACT_ReadConfig(string, ptr)) { } else if (Screen_ReadConfig(string, ptr)) { } #endif #ifdef NTSC_FILTER else if (FILTER_NTSC_ReadConfig(string, ptr)) { } #endif #if SUPPORTS_CHANGE_VIDEOMODE else if (VIDEOMODE_ReadConfig(string, ptr)) { } #endif #if defined(SOUND) && defined(SOUND_THIN_API) else if (Sound_ReadConfig(string, ptr)) { } #endif /* defined(SOUND) && defined(SOUND_THIN_API) */ else { #ifdef SUPPORTS_PLATFORM_CONFIGURE if (!PLATFORM_Configure(string, ptr)) { Log_print("Unrecognized variable or bad parameters: '%s=%s'", string, ptr); } #else Log_print("Unrecognized variable: %s", string); #endif } } else { Log_print("Ignored config line: %s", string); } } fclose(fp); #ifndef BASIC if (was_obsolete_dir) { Log_print( "DISK_DIR, ROM_DIR, EXE_DIR and STATE_DIR configuration options\n" "are no longer supported. Please use ATARI_FILES_DIR\n" "and SAVED_FILES_DIR in your Atari800 configuration file."); } #endif return TRUE; }
int SYSROM_FindInDir(char const *directory, int only_if_not_set) { DIR *dir; struct dirent *entry; if (only_if_not_set && num_unset_roms == 0) /* No unset ROM paths left. */ return TRUE; if ((dir = opendir(directory)) == NULL) return FALSE; while ((entry = readdir(dir)) != NULL) { char full_filename[FILENAME_MAX]; FILE *file; int len; int id; ULONG crc; int matched_crc = FALSE; Util_catpath(full_filename, directory, entry->d_name); if ((file = fopen(full_filename, "rb")) == NULL) /* Ignore non-readable files (e.g. directories). */ continue; len = Util_flen(file); /* Don't proceed to CRC computation if the file has invalid size. */ if (!IsLengthAllowed(len)){ fclose(file); continue; } Util_rewind(file); if (!CRC32_FromFile(file, &crc)) { fclose(file); continue; } fclose(file); /* Match ROM image by CRC. */ for (id = 0; id < SYSROM_SIZE; ++id) { if ((!only_if_not_set || SYSROM_roms[id].unset) && SYSROM_roms[id].size == len && SYSROM_roms[id].crc32 != CRC_NULL && SYSROM_roms[id].crc32 == crc) { strcpy(SYSROM_roms[id].filename, full_filename); ClearUnsetFlag(id); matched_crc = TRUE; break; } } if (!matched_crc) { /* Match custom ROM image by name. */ char *c = entry->d_name; while (*c != 0) { *c = (char)tolower(*c); ++c; } id = MatchByName(entry->d_name, len, only_if_not_set); if (id >= 0){ strcpy(SYSROM_roms[id].filename, full_filename); ClearUnsetFlag(id); } } } closedir(dir); return TRUE; }