void build_ListCallback(RDIR* rdir, EListCallbackArg arg) { const char* fname = retro_dirent_get_name(rdir); if(arg == EListCallbackArg_Pop) { currPath = pathStack.top(); pathStack.pop(); currVirtPath = virtPathStack.top(); virtPathStack.pop(); return; } if(retro_dirent_is_dir(rdir)) { if(!strcmp(fname,".")) return; if(!strcmp(fname,"..")) return; pathStack.push(currPath); virtPathStack.push(currVirtPath); currVirtPath = currVirtPath + "/" + fname; bool ok = LIBFAT::MkDir(currVirtPath.c_str()); if(!ok) printf("ERROR adding dir %s via libfat\n",currVirtPath.c_str()); currPath = currPath + path_default_slash() + fname; return; } else { std::string path = currPath + path_default_slash() + fname; FILE* inf = fopen(path.c_str(),"rb"); if(inf) { fseek(inf,0,SEEK_END); long len = ftell(inf); fseek(inf,0,SEEK_SET); u8 *buf = new u8[len]; fread(buf,1,len,inf); fclose(inf); std::string path = currVirtPath + "/" + fname; printf("FAT + (%10.2f KB) %s \n",len/1024.f,path.c_str()); bool ok = LIBFAT::WriteFile(path.c_str(),buf,len); if(!ok) printf("ERROR adding file to fat\n"); delete[] buf; } else printf("ERROR opening file for fat\n"); } }
bool ozone_reset_theme_textures(ozone_handle_t *ozone) { unsigned i, j; char theme_path[255]; bool result = true; for (j = 0; j < ozone_themes_count; j++) { ozone_theme_t *theme = ozone_themes[j]; fill_pathname_join( theme_path, ozone->png_path, theme->name, sizeof(theme_path) ); for (i = 0; i < OZONE_THEME_TEXTURE_LAST; i++) { char filename[PATH_MAX_LENGTH]; strlcpy(filename, OZONE_THEME_TEXTURES_FILES[i], sizeof(filename)); strlcat(filename, ".png", sizeof(filename)); if (!menu_display_reset_textures_list(filename, theme_path, &theme->textures[i], TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL)) { RARCH_WARN("[OZONE] Asset missing: %s%s%s\n", theme_path, path_default_slash(), filename); result = false; } } } return result; }
// List all files and subdirectories recursively static void list_files(const char *filepath, ListCallback list_callback) { void * hFind; char *fname; u32 dwError; RDIR* rdir = retro_opendir(filepath); if(!rdir) return; if(retro_dirent_error(rdir)) { retro_closedir(rdir); return; } for(;;) { if(!retro_readdir(rdir)) break; const char* fname = retro_dirent_get_name(rdir); list_callback(rdir,EListCallbackArg_Item); if(retro_dirent_is_dir(rdir) && (strcmp(fname, ".")) && (strcmp(fname, ".."))) { std::string subdir = (std::string)filepath + path_default_slash() + fname; list_files(subdir.c_str(), list_callback); list_callback(rdir, EListCallbackArg_Pop); } } retro_closedir(rdir); }
void fill_pathname_abbreviate_special(char *out_path, const char *in_path, size_t size) { #if !defined(RARCH_CONSOLE) unsigned i; const char *candidates[3]; const char *notations[3]; char application_dir[PATH_MAX_LENGTH]; const char *home = getenv("HOME"); application_dir[0] = '\0'; /* application_dir could be zero-string. Safeguard against this. * * Keep application dir in front of home, moving app dir to a * new location inside home would break otherwise. */ /* ugly hack - use application_dir pointer before filling it in. C89 reasons */ candidates[0] = application_dir; candidates[1] = home; candidates[2] = NULL; notations [0] = ":"; notations [1] = "~"; notations [2] = NULL; fill_pathname_application_path(application_dir, sizeof(application_dir)); path_basedir_wrapper(application_dir); for (i = 0; candidates[i]; i++) { if (!string_is_empty(candidates[i]) && strstr(in_path, candidates[i]) == in_path) { size_t src_size = strlcpy(out_path, notations[i], size); retro_assert(src_size < size); out_path += src_size; size -= src_size; in_path += strlen(candidates[i]); if (!path_char_is_slash(*in_path)) { retro_assert(strlcpy(out_path, path_default_slash(), size) < size); out_path++; size--; } break; /* Don't allow more abbrevs to take place. */ } } #endif retro_assert(strlcpy(out_path, in_path, size) < size); }
/** * path_basedir: * @path : path * * Extracts base directory by mutating path. * Keeps trailing '/'. **/ void path_basedir(char *path) { char *last = NULL; if (strlen(path) < 2) return; last = find_last_slash(path); if (last) last[1] = '\0'; else snprintf(path, 3, ".%s", path_default_slash()); }
/* Assumes path is a directory. Appends a slash * if not already there. */ void fill_pathname_slash(char *path, size_t size) { size_t path_len = strlen(path); const char *last_slash = find_last_slash(path); // Try to preserve slash type. if (last_slash && (last_slash != (path + path_len - 1))) { char join_str[2] = {*last_slash}; rarch_assert(strlcat(path, join_str, size) < size); } else if (!last_slash) rarch_assert(strlcat(path, path_default_slash(), size) < size); }
/** * fill_pathname_slash: * @path : path * @size : size of path * * Assumes path is a directory. Appends a slash * if not already there. **/ void fill_pathname_slash(char *path, size_t size) { size_t path_len = strlen(path); const char *last_slash = find_last_slash(path); /* Try to preserve slash type. */ if (last_slash && (last_slash != (path + path_len - 1))) { char join_str[2]; strlcpy(join_str, last_slash, sizeof(join_str)); retro_assert(strlcat(path, join_str, size) < size); } else if (!last_slash) retro_assert(strlcat(path, path_default_slash(), size) < size); }
void fill_pathname_abbreviate_special(char *out_path, const char *in_path, size_t size) { #if !defined(RARCH_CONSOLE) unsigned i; const char *home = getenv("HOME"); char application_dir[PATH_MAX]; fill_pathname_application_path(application_dir, sizeof(application_dir)); path_basedir(application_dir); /* application_dir could be zero-string. Safeguard against this. * * Keep application dir in front of home, moving app dir to a * new location inside home would break otherwise. */ const char *candidates[3] = { application_dir, home, NULL }; const char *notations[3] = { ":", "~", NULL }; for (i = 0; candidates[i]; i++) { if (*candidates[i] && strstr(in_path, candidates[i]) == in_path) { size_t src_size = strlcpy(out_path, notations[i], size); rarch_assert(src_size < size); out_path += src_size; size -= src_size; in_path += strlen(candidates[i]); if (!path_char_is_slash(*in_path)) { rarch_assert(strlcpy(out_path, path_default_slash(), size) < size); out_path++; size--; } break; /* Don't allow more abbrevs to take place. */ } } #endif rarch_assert(strlcpy(out_path, in_path, size) < size); }
void path_basedir(char *path) { char *last = NULL; if (strlen(path) < 2) return; #ifdef HAVE_COMPRESSION /* We want to find the directory with the zipfile in basedir. */ last = strchr(path,'#'); if (last) *last = '\0'; #endif last = find_last_slash(path); if (last) last[1] = '\0'; else snprintf(path, 3, ".%s", path_default_slash()); }
/** * path_basedir: * @path : path * * Extracts base directory by mutating path. * Keeps trailing '/'. **/ void path_basedir_wrapper(char *path) { char *last = NULL; if (strlen(path) < 2) return; #ifdef HAVE_COMPRESSION /* We want to find the directory with the archive in basedir. */ last = (char*)path_get_archive_delim(path); if (last) *last = '\0'; #endif last = find_last_slash(path); if (last) last[1] = '\0'; else snprintf(path, 3, ".%s", path_default_slash()); }
void ozone_context_reset_horizontal_list(ozone_handle_t *ozone) { unsigned i; const char *title; char title_noext[255]; char *chr; bool hyphen_found; size_t list_size = ozone_list_get_size(ozone, MENU_LIST_HORIZONTAL); for (i = 0; i < list_size; i++) { const char *path = NULL; ozone_node_t *node = (ozone_node_t*)file_list_get_userdata_at_offset(ozone->horizontal_list, i); if (!node) { node = ozone_alloc_node(); if (!node) continue; } file_list_get_at_offset(ozone->horizontal_list, i, &path, NULL, NULL, NULL); if (!path) continue; if (!strstr(path, file_path_str(FILE_PATH_LPL_EXTENSION))) continue; { struct texture_image ti; char *sysname = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); char *texturepath = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); char *content_texturepath = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); char *icons_path = (char*) malloc(PATH_MAX_LENGTH * sizeof(char)); strlcpy(icons_path, ozone->icons_path, PATH_MAX_LENGTH * sizeof(char)); sysname[0] = texturepath[0] = content_texturepath[0] = '\0'; fill_pathname_base_noext(sysname, path, PATH_MAX_LENGTH * sizeof(char)); fill_pathname_join_concat(texturepath, icons_path, sysname, file_path_str(FILE_PATH_PNG_EXTENSION), PATH_MAX_LENGTH * sizeof(char)); /* If the playlist icon doesn't exist return default */ if (!filestream_exists(texturepath)) fill_pathname_join_concat(texturepath, icons_path, "default", file_path_str(FILE_PATH_PNG_EXTENSION), PATH_MAX_LENGTH * sizeof(char)); ti.width = 0; ti.height = 0; ti.pixels = NULL; ti.supports_rgba = video_driver_supports_rgba(); if (image_texture_load(&ti, texturepath)) { if(ti.pixels) { video_driver_texture_unload(&node->icon); video_driver_texture_load(&ti, TEXTURE_FILTER_MIPMAP_LINEAR, &node->icon); } image_texture_free(&ti); } fill_pathname_join_delim(sysname, sysname, file_path_str(FILE_PATH_CONTENT_BASENAME), '-', PATH_MAX_LENGTH * sizeof(char)); strlcat(content_texturepath, icons_path, PATH_MAX_LENGTH * sizeof(char)); strlcat(content_texturepath, path_default_slash(), PATH_MAX_LENGTH * sizeof(char)); strlcat(content_texturepath, sysname, PATH_MAX_LENGTH * sizeof(char)); /* If the content icon doesn't exist return default-content */ if (!filestream_exists(content_texturepath)) { strlcat(icons_path, path_default_slash(), PATH_MAX_LENGTH * sizeof(char)); strlcat(icons_path, "default", PATH_MAX_LENGTH * sizeof(char)); fill_pathname_join_delim(content_texturepath, icons_path, file_path_str(FILE_PATH_CONTENT_BASENAME), '-', PATH_MAX_LENGTH * sizeof(char)); } if (image_texture_load(&ti, content_texturepath)) { if(ti.pixels) { video_driver_texture_unload(&node->content_icon); video_driver_texture_load(&ti, TEXTURE_FILTER_MIPMAP_LINEAR, &node->content_icon); } image_texture_free(&ti); } /* Console name */ menu_entries_get_at_offset( ozone->horizontal_list, i, &title, NULL, NULL, NULL, NULL); fill_pathname_base_noext(title_noext, title, sizeof(title_noext)); /* Format : "Vendor - Console" Remove everything before the hyphen and the subsequent space */ chr = title_noext; hyphen_found = false; while (true) { if (*chr == '-') { hyphen_found = true; break; } else if (*chr == '\0') break; chr++; } if (hyphen_found) chr += 2; else chr = title_noext; if (node->console_name) free(node->console_name); node->console_name = strdup(chr); free(sysname); free(texturepath); free(content_texturepath); free(icons_path); } } }