static void parse_hat(struct retro_keybind *bind, const char *str) { uint16_t hat; uint16_t hat_dir = 0; char *dir = NULL; if (!bind || !str) return; if (!isdigit((int)*str)) return; hat = strtoul(str, &dir, 0); if (!dir) { RARCH_WARN("Found invalid hat in config!\n"); return; } if (string_is_equal_noncase(dir, "up")) hat_dir = HAT_UP_MASK; else if (string_is_equal_noncase(dir, "down")) hat_dir = HAT_DOWN_MASK; else if (string_is_equal_noncase(dir, "left")) hat_dir = HAT_LEFT_MASK; else if (string_is_equal_noncase(dir, "right")) hat_dir = HAT_RIGHT_MASK; if (hat_dir) bind->joykey = HAT_MAP(hat, hat_dir); }
const struct file_archive_file_backend* file_archive_get_file_backend(const char *path) { char newpath[PATH_MAX_LENGTH]; const char *file_ext = NULL; char *last = NULL; newpath[0] = '\0'; strlcpy(newpath, path, sizeof(newpath)); last = (char*)path_get_archive_delim(newpath); if (last) *last = '\0'; file_ext = path_get_extension(newpath); #ifdef HAVE_7ZIP if (string_is_equal_noncase(file_ext, "7z")) return &sevenzip_backend; #endif #ifdef HAVE_ZLIB if ( string_is_equal_noncase(file_ext, "zip") || string_is_equal_noncase(file_ext, "apk") ) return &zlib_backend; #endif return NULL; }
static bool type_is_prioritized(const char *path) { const char *ext = path_get_extension(path); if (string_is_equal_noncase(ext, "cue")) return true; if (string_is_equal_noncase(ext, "gdi")) return true; return false; }
struct string_list *compressed_file_list_new(const char *path, const char* ext) { #if defined(HAVE_ZLIB) || defined(HAVE_7ZIP) const char* file_ext = path_get_extension(path); #endif #ifdef HAVE_7ZIP if (string_is_equal_noncase(file_ext, "7z")) return compressed_7zip_file_list_new(path,ext); #endif #ifdef HAVE_ZLIB if (string_is_equal_noncase(file_ext, "zip")) return file_archive_get_file_list(path, ext); #endif return NULL; }
/** * find_gfx_ctx_driver_index: * @ident : Identifier of resampler driver to find. * * Finds graphics context driver index by @ident name. * * Returns: graphics context driver index if driver was found, otherwise * -1. **/ static int find_gfx_ctx_driver_index(const char *ident) { unsigned i; for (i = 0; gfx_ctx_drivers[i]; i++) if (string_is_equal_noncase(ident, gfx_ctx_drivers[i]->ident)) return i; return -1; }
static bool init_content_file_extract( struct string_list *temporary_content, struct string_list *content, rarch_system_info_t *system, const struct retro_subsystem_info *special, union string_list_elem_attr *attr ) { unsigned i; settings_t *settings = config_get_ptr(); for (i = 0; i < content->size; i++) { const char *ext = NULL; const char *valid_ext = system->info.valid_extensions; /* Block extract check. */ if (content->elems[i].attr.i & 1) continue; ext = path_get_extension(content->elems[i].data); if (special) valid_ext = special->roms[i].valid_extensions; if (!ext) continue; if (string_is_equal_noncase(ext, "zip")) { char new_path[PATH_MAX_LENGTH]; char temp_content[PATH_MAX_LENGTH]; strlcpy(temp_content, content->elems[i].data, sizeof(temp_content)); if (!file_archive_extract_first_content_file(temp_content, sizeof(temp_content), valid_ext, *settings->cache_directory ? settings->cache_directory : NULL, new_path, sizeof(new_path))) { RARCH_ERR("Failed to extract content from zipped file: %s.\n", temp_content); return false; } string_list_set(content, i, new_path); if (!string_list_append(temporary_content, new_path, *attr)) return false; } } return true; }
/** * path_is_compressed_file: * @path : path * * Checks if path is a compressed file. * * Returns: true (1) if path is a compressed file, otherwise false (0). **/ bool path_is_compressed_file(const char* path) { #ifdef HAVE_COMPRESSION const char *ext = path_get_extension(path); #ifdef HAVE_ZLIB if (string_is_equal_noncase(ext, "zip") || string_is_equal_noncase(ext, "apk")) return true; #endif #ifdef HAVE_7ZIP if (string_is_equal_noncase(ext, "7z")) return true; #endif #endif return false; }
static enum retro_key find_rk_bind(const char *str) { size_t i; for (i = 0; input_config_key_map[i].str; i++) { if (string_is_equal_noncase(input_config_key_map[i].str, str)) return input_config_key_map[i].key; } RARCH_WARN("Key name %s not found.\n", str); return RETROK_UNKNOWN; }
static int file_archive_extract_cb(const char *name, const char *valid_exts, const uint8_t *cdata, unsigned cmode, uint32_t csize, uint32_t size, uint32_t checksum, struct archive_extract_userdata *userdata) { const char *ext = path_get_extension(name); /* Extract first file that matches our list. */ if (ext && string_list_find_elem(userdata->ext, ext)) { char new_path[PATH_MAX_LENGTH]; char wanted_file[PATH_MAX_LENGTH]; const char *delim = NULL; new_path[0] = wanted_file[0] = '\0'; if (userdata->extraction_directory) fill_pathname_join(new_path, userdata->extraction_directory, path_basename(name), sizeof(new_path)); else fill_pathname_resolve_relative(new_path, userdata->archive_path, path_basename(name), sizeof(new_path)); userdata->first_extracted_file_path = strdup(new_path); delim = path_get_archive_delim(userdata->archive_path); if (delim) { strlcpy(wanted_file, delim + 1, sizeof(wanted_file)); if (!string_is_equal_noncase(userdata->extracted_file_path, wanted_file)) return 1; /* keep searching for the right file */ } else strlcpy(wanted_file, userdata->archive_path, sizeof(wanted_file)); if (file_archive_perform_mode(new_path, valid_exts, cdata, cmode, csize, size, 0, userdata)) userdata->found_file = true; return 0; } return 1; }
/** * driver_find_index: * @label : string of driver type to be found. * @drv : identifier of driver to be found. * * Find index of the driver, based on @label. * * Returns: -1 if no driver based on @label and @drv found, otherwise * index number of the driver found in the array. **/ static int driver_find_index(const char * label, const char *drv) { unsigned i; char str[256] = {0}; for (i = 0; find_driver_nonempty(label, i, str, sizeof(str)) != NULL; i++) { if (string_is_empty(str)) break; if (string_is_equal_noncase(drv, str)) return i; } return -1; }
void core_info_list_get_supported_cores(core_info_list_t *core_info_list, const char *path, const core_info_t **infos, size_t *num_infos) { size_t i; struct string_list *list = NULL; size_t supported = 0; if (!core_info_list) return; core_info_tmp_path = path; #ifdef HAVE_ZLIB if (string_is_equal_noncase(path_get_extension(path), "zip")) list = file_archive_get_file_list(path, NULL); core_info_tmp_list = list; #endif /* Let supported core come first in list so we can return * a pointer to them. */ qsort(core_info_list->list, core_info_list->count, sizeof(core_info_t), core_info_qsort_cmp); for (i = 0; i < core_info_list->count; i++, supported++) { const core_info_t *core = &core_info_list->list[i]; if (core_info_does_support_file(core, path)) continue; #ifdef HAVE_ZLIB if (core_info_does_support_any_file(core, list)) continue; #endif break; } if (list) string_list_free(list); *infos = core_info_list->list; *num_infos = supported; }
/* Generic compressed file loader. * Extracts to buf, unless optional_filename != 0 * Then extracts to optional_filename and leaves buf alone. */ static int content_file_compressed_read( const char * path, void **buf, const char* optional_filename, ssize_t *length) { int ret = 0; const char* file_ext = NULL; struct string_list *str_list = string_split(path, "#"); /* Safety check. * If optional_filename and optional_filename * exists, we simply return 0, * hoping that optional_filename is the * same as requested. */ if (optional_filename && path_file_exists(optional_filename)) { *length = 0; return 1; } /* We assure that there is something after the '#' symbol. * * This error condition happens for example, when * path = /path/to/file.7z, or * path = /path/to/file.7z# */ if (str_list->size <= 1) goto error; #if defined(HAVE_7ZIP) || defined(HAVE_ZLIB) file_ext = path_get_extension(str_list->elems[0].data); #endif #ifdef HAVE_7ZIP if (string_is_equal_noncase(file_ext, "7z")) { *length = content_7zip_file_read(str_list->elems[0].data, str_list->elems[1].data, buf, optional_filename); if (*length != -1) ret = 1; } #endif #ifdef HAVE_ZLIB if (string_is_equal_noncase(file_ext, "zip")) { *length = content_zip_file_read(str_list->elems[0].data, str_list->elems[1].data, buf, optional_filename); if (*length != -1) ret = 1; } string_list_free(str_list); #endif return ret; error: RARCH_ERR("Could not extract string and substring from " ": %s.\n", path); string_list_free(str_list); *length = 0; return 0; }
int find_first_data_track(const char *cue_path, int32_t *offset, char *track_path, size_t max_len) { int rv, m, s, f; char tmp_token[MAX_TOKEN_LEN]; char cue_dir[PATH_MAX_LENGTH]; RFILE *fd; strlcpy(cue_dir, cue_path, sizeof(cue_dir)); path_basedir(cue_dir); fd = filestream_open(cue_path, RFILE_MODE_READ, -1); if (!fd) { RARCH_LOG("Could not open CUE file '%s': %s\n", cue_path, strerror(errno)); return -errno; } RARCH_LOG("Parsing CUE file '%s'...\n", cue_path); while (get_token(fd, tmp_token, MAX_TOKEN_LEN) > 0) { if (string_is_equal(tmp_token, "FILE")) { get_token(fd, tmp_token, MAX_TOKEN_LEN); fill_pathname_join(track_path, cue_dir, tmp_token, max_len); } else if (string_is_equal_noncase(tmp_token, "TRACK")) { get_token(fd, tmp_token, MAX_TOKEN_LEN); get_token(fd, tmp_token, MAX_TOKEN_LEN); if (string_is_equal_noncase(tmp_token, "AUDIO")) continue; find_token(fd, "INDEX"); get_token(fd, tmp_token, MAX_TOKEN_LEN); get_token(fd, tmp_token, MAX_TOKEN_LEN); if (sscanf(tmp_token, "%02d:%02d:%02d", &m, &s, &f) < 3) { RARCH_LOG("Error parsing time stamp '%s'\n", tmp_token); return -errno; } *offset = ((m * 60) * (s * 75) * f) * 25; RARCH_LOG("Found 1st data track on file '%s+%d'\n", track_path, *offset); rv = 0; goto clean; } } rv = -EINVAL; clean: filestream_close(fd); return rv; }
/** * playlist_push: * @playlist : Playlist handle. * @path : Path of new playlist entry. * @core_path : Core path of new playlist entry. * @core_name : Core name of new playlist entry. * * Push entry to top of playlist. **/ bool playlist_push(playlist_t *playlist, const char *path, const char *label, const char *core_path, const char *core_name, const char *crc32, const char *db_name) { size_t i; bool core_path_empty = string_is_empty(core_path); bool core_name_empty = string_is_empty(core_name); if (core_path_empty || core_name_empty) { if (core_name_empty && !core_path_empty) { static char base_path[255] = {0}; fill_pathname_base_noext(base_path, core_path, sizeof(base_path)); core_name = base_path; } if (core_path_empty || core_name_empty) { RARCH_ERR("cannot push NULL or empty core name into the playlist.\n"); return false; } } if (string_is_empty(path)) path = NULL; if (!playlist) return false; for (i = 0; i < playlist->size; i++) { struct playlist_entry tmp; bool equal_path; equal_path = (!path && !playlist->entries[i].path) || (path && playlist->entries[i].path && #ifdef _WIN32 /*prevent duplicates on case-insensitive operating systems*/ string_is_equal_noncase(path,playlist->entries[i].path) #else string_is_equal(path,playlist->entries[i].path) #endif ); /* Core name can have changed while still being the same core. * Differentiate based on the core path only. */ if (!equal_path) continue; if (!string_is_equal(playlist->entries[i].core_path, core_path)) continue; /* If top entry, we don't want to push a new entry since * the top and the entry to be pushed are the same. */ if (i == 0) return false; /* Seen it before, bump to top. */ tmp = playlist->entries[i]; memmove(playlist->entries + 1, playlist->entries, i * sizeof(struct playlist_entry)); playlist->entries[0] = tmp; goto success; } if (playlist->size == playlist->cap) { struct playlist_entry *entry = &playlist->entries[playlist->cap - 1]; if (entry) playlist_free_entry(entry); playlist->size--; } if (playlist->entries) { memmove(playlist->entries + 1, playlist->entries, (playlist->cap - 1) * sizeof(struct playlist_entry)); playlist->entries[0].path = NULL; playlist->entries[0].label = NULL; playlist->entries[0].core_path = NULL; playlist->entries[0].core_name = NULL; playlist->entries[0].db_name = NULL; playlist->entries[0].crc32 = NULL; if (!string_is_empty(path)) playlist->entries[0].path = strdup(path); if (!string_is_empty(label)) playlist->entries[0].label = strdup(label); if (!string_is_empty(core_path)) playlist->entries[0].core_path = strdup(core_path); if (!string_is_empty(core_name)) playlist->entries[0].core_name = strdup(core_name); if (!string_is_empty(db_name)) playlist->entries[0].db_name = strdup(db_name); if (!string_is_empty(crc32)) playlist->entries[0].crc32 = strdup(crc32); } playlist->size++; success: playlist->modified = true; return true; }