Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/cross.cpp b/../../../../libretro_dosbox/dosbox-libretro/src/misc/cross.cpp
- index bd788480..3e9d4663 100644
- --- a/cross.cpp
- +++ b/../../../../libretro_dosbox/dosbox-libretro/src/misc/cross.cpp
- @@ -1,5 +1,5 @@
- /*
- - * Copyright (C) 2002-2019 The DOSBox Team
- + * Copyright (C) 2002-2013 The DOSBox Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- @@ -11,49 +11,38 @@
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- - * You should have received a copy of the GNU General Public License along
- - * with this program; if not, write to the Free Software Foundation, Inc.,
- - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- + * You should have received a copy of the GNU General Public License
- + * along with this program; if not, write to the Free Software
- + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- + *
- + * Wengier: LFN support
- */
- +#include <stdlib.h>
- +#include <string>
- +
- +#include <retro_dirent.h>
- +#ifdef VITA
- +#include <psp2/io/stat.h>
- +#endif
- +
- +#include "../../libretro/libretro.h"
- #include "dosbox.h"
- #include "cross.h"
- #include "support.h"
- -#include <string>
- -#include <stdlib.h>
- -
- -#ifdef WIN32
- -#ifndef _WIN32_IE
- -#define _WIN32_IE 0x0400
- -#endif
- -#include <shlobj.h>
- -#endif
- #if defined HAVE_SYS_TYPES_H && defined HAVE_PWD_H
- #include <sys/types.h>
- #include <pwd.h>
- #endif
- +extern std::string retro_system_directory;
- -
- -#ifdef WIN32
- -static void W32_ConfDir(std::string& in,bool create) {
- - int c = create?1:0;
- - char result[MAX_PATH] = { 0 };
- - BOOL r = SHGetSpecialFolderPath(NULL,result,CSIDL_LOCAL_APPDATA,c);
- - if(!r || result[0] == 0) r = SHGetSpecialFolderPath(NULL,result,CSIDL_APPDATA,c);
- - if(!r || result[0] == 0) {
- - char const * windir = getenv("windir");
- - if(!windir) windir = "c:\\windows";
- - safe_strncpy(result,windir,MAX_PATH);
- - char const* appdata = "\\Application Data";
- - size_t len = strlen(result);
- - if(len + strlen(appdata) < MAX_PATH) strcat(result,appdata);
- - if(create) mkdir(result);
- - }
- - in = result;
- -}
- +#ifdef _WIN32
- +const char slash = '\\';
- +#else
- +const char slash = '/';
- #endif
- void Cross::GetPlatformConfigDir(std::string& in) {
- @@ -66,7 +55,7 @@ void Cross::GetPlatformConfigDir(std::string& in) {
- #else
- slash = '/';
- #endif
- - in = retro_save_directory;
- + in = retro_save_directory + slash + retro_library_name;
- #elif WIN32
- W32_ConfDir(in,false);
- in += "\\DOSBox";
- @@ -81,182 +70,116 @@ void Cross::GetPlatformConfigDir(std::string& in) {
- }
- void Cross::GetPlatformConfigName(std::string& in) {
- -#ifndef __LIBRETRO__
- #ifdef WIN32
- #define DEFAULT_CONFIG_FILE "dosbox-" VERSION ".conf"
- #elif defined(MACOSX)
- #define DEFAULT_CONFIG_FILE "DOSBox " VERSION " Preferences"
- #else /*linux freebsd*/
- #define DEFAULT_CONFIG_FILE "dosbox-" VERSION ".conf"
- -#endif
- -#else
- -#define DEFAULT_CONFIG_FILE "DOSBox-SVN.conf"
- #endif
- in = DEFAULT_CONFIG_FILE;
- }
- -void Cross::CreatePlatformConfigDir(std::string& in) {
- -#ifdef WIN32
- - W32_ConfDir(in,true);
- - in += "\\DOSBox";
- - mkdir(in.c_str());
- -#elif defined(MACOSX)
- - in = "~/Library/Preferences";
- - ResolveHomedir(in);
- - //Don't create it. Assume it exists
- -#else
- - in = "~/.dosbox";
- - ResolveHomedir(in);
- - mkdir(in.c_str(),0700);
- -#endif
- +void Cross::CreatePlatformConfigDir(std::string& in)
- +{
- + in += retro_system_directory + slash + "DOSBox";
- in += CROSS_FILESPLIT;
- }
- -void Cross::ResolveHomedir(std::string & temp_line) {
- - if(!temp_line.size() || temp_line[0] != '~') return; //No ~
- -
- - if(temp_line.size() == 1 || temp_line[1] == CROSS_FILESPLIT) { //The ~ and ~/ variant
- - char * home = getenv("HOME");
- - if(home) temp_line.replace(0,1,std::string(home));
- -#if defined HAVE_SYS_TYPES_H && defined HAVE_PWD_H && !defined HAVE_LIBNX
- - } else { // The ~username variant
- - std::string::size_type namelen = temp_line.find(CROSS_FILESPLIT);
- - if(namelen == std::string::npos) namelen = temp_line.size();
- - std::string username = temp_line.substr(1,namelen - 1);
- - struct passwd* pass = getpwnam(username.c_str());
- - if(pass) temp_line.replace(0,namelen,pass->pw_dir); //namelen -1 +1(for the ~)
- +void Cross::ResolveHomedir(std::string & temp_line)
- +{
- + if(!temp_line.size() || temp_line[0] != '~')
- + return; //No ~
- +
- + if(temp_line.size() == 1 || temp_line[1] == CROSS_FILESPLIT)
- + {
- + //The ~ and ~/ variant
- + char *home = getenv("HOME");
- + if(home)
- + temp_line.replace(0,1,std::string(home));
- + }
- +#if defined HAVE_SYS_TYPES_H && defined HAVE_PWD_H && !defined(__SWITCH__)
- + else
- + {
- + struct passwd *pass;
- + std::string username;
- + // The ~username variant
- + std::string::size_type namelen = temp_line.find(CROSS_FILESPLIT);
- +
- + if(namelen == std::string::npos)
- + namelen = temp_line.size();
- + username = temp_line.substr(1,namelen - 1);
- + pass = getpwnam(username.c_str());
- + if(pass)
- + temp_line.replace(0,namelen,pass->pw_dir); //namelen -1 +1(for the ~)
- + }
- #endif // USERNAME lookup code
- - }
- }
- -void Cross::CreateDir(std::string const& in) {
- +void Cross::CreateDir(std::string const& in)
- +{
- #ifdef WIN32
- - mkdir(in.c_str());
- + mkdir(in.c_str());
- +#elif defined(VITA)
- + sceIoMkdir(in.c_str(), 0700);
- #else
- - mkdir(in.c_str(),0700);
- + mkdir(in.c_str(),0700);
- #endif
- }
- -bool Cross::IsPathAbsolute(std::string const& in) {
- +bool Cross::IsPathAbsolute(std::string const& in)
- +{
- // Absolute paths
- -#if defined (WIN32) || defined(OS2)
- +#if defined (WIN32)
- // drive letter
- - if (in.size() > 2 && in[1] == ':' ) return true;
- + if (in.size() > 2 && in[1] == ':' )
- + return true;
- // UNC path
- - else if (in.size() > 2 && in[0]=='\\' && in[1]=='\\') return true;
- + else if (in.size() > 2 && in[0]=='\\' && in[1]=='\\')
- + return true;
- #else
- - if (in.size() > 1 && in[0] == '/' ) return true;
- + if (in.size() > 1 && in[0] == '/' )
- + return true;
- #endif
- return false;
- }
- -#if defined (WIN32)
- -
- -dir_information* open_directory(const char* dirname) {
- - if (dirname == NULL) return NULL;
- -
- - size_t len = strlen(dirname);
- - if (len == 0) return NULL;
- -
- +dir_information* open_directory(const char* dirname)
- +{
- static dir_information dir;
- - safe_strncpy(dir.base_path,dirname,MAX_PATH);
- -
- - if (dirname[len-1] == '\\') strcat(dir.base_path,"*.*");
- - else strcat(dir.base_path,"\\*.*");
- -
- - dir.handle = INVALID_HANDLE_VALUE;
- -
- - return (access(dirname,0) ? NULL : &dir);
- -}
- -
- -bool read_directory_first(dir_information* dirp, char* entry_name, bool& is_directory) {
- - if (!dirp) return false;
- - dirp->handle = FindFirstFile(dirp->base_path, &dirp->search_data);
- - if (INVALID_HANDLE_VALUE == dirp->handle) {
- - return false;
- - }
- -
- - safe_strncpy(entry_name,dirp->search_data.cFileName,(MAX_PATH<CROSS_LEN)?MAX_PATH:CROSS_LEN);
- -
- - if (dirp->search_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) is_directory = true;
- - else is_directory = false;
- -
- - return true;
- -}
- -
- -bool read_directory_next(dir_information* dirp, char* entry_name, bool& is_directory) {
- - if (!dirp) return false;
- - int result = FindNextFile(dirp->handle, &dirp->search_data);
- - if (result==0) return false;
- + dir.dir = retro_opendir(dirname);
- - safe_strncpy(entry_name,dirp->search_data.cFileName,(MAX_PATH<CROSS_LEN)?MAX_PATH:CROSS_LEN);
- -
- - if (dirp->search_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) is_directory = true;
- - else is_directory = false;
- -
- - return true;
- -}
- -
- -void close_directory(dir_information* dirp) {
- - if (dirp && dirp->handle != INVALID_HANDLE_VALUE) {
- - FindClose(dirp->handle);
- - dirp->handle = INVALID_HANDLE_VALUE;
- - }
- -}
- -
- -#else
- -
- -dir_information* open_directory(const char* dirname) {
- - static dir_information dir;
- - dir.dir=opendir(dirname);
- safe_strncpy(dir.base_path,dirname,CROSS_LEN);
- - return dir.dir?&dir:NULL;
- -}
- -bool read_directory_first(dir_information* dirp, char* entry_name, bool& is_directory) {
- - if (!dirp) return false;
- - return read_directory_next(dirp,entry_name,is_directory);
- + return dir.dir && dir.dir->directory ? &dir : NULL;
- }
- -bool read_directory_next(dir_information* dirp, char* entry_name, bool& is_directory) {
- - if (!dirp) return false;
- - struct dirent* dentry = readdir(dirp->dir);
- - if (dentry==NULL) {
- - return false;
- - }
- +bool read_directory_next(dir_information* dirp, char* entry_name, char* entry_sname, bool& is_directory)
- +{
- + struct stat status;
- + static char buffer[2*CROSS_LEN] = { 0 };
- -// safe_strncpy(entry_name,dentry->d_name,(FILENAME_MAX<MAX_PATH)?FILENAME_MAX:MAX_PATH); // [include stdio.h], maybe pathconf()
- - safe_strncpy(entry_name,dentry->d_name,CROSS_LEN);
- + if (retro_readdir(dirp->dir))
- + {
- + char file_path[4096];
- -#ifdef DIRENT_HAS_D_TYPE
- - if(dentry->d_type == DT_DIR) {
- - is_directory = true;
- - return true;
- - } else if(dentry->d_type == DT_REG) {
- - is_directory = false;
- - return true;
- - }
- -#endif
- + safe_strncpy(entry_name, retro_dirent_get_name(dirp->dir), CROSS_LEN);
- + entry_sname[0]=0;
- + is_directory = retro_dirent_is_dir(dirp->dir, file_path);
- - //Maybe only for DT_UNKNOWN if DIRENT_HAD_D_TYPE..
- - static char buffer[2 * CROSS_LEN + 1] = { 0 };
- - static char split[2] = { CROSS_FILESPLIT , 0 };
- - buffer[0] = 0;
- - strcpy(buffer,dirp->base_path);
- - size_t buflen = strlen(buffer);
- - if (buflen && buffer[buflen - 1] != CROSS_FILESPLIT ) strcat(buffer, split);
- - strcat(buffer,entry_name);
- - struct stat status;
- + return true;
- + }
- - if (stat(buffer,&status) == 0) is_directory = (S_ISDIR(status.st_mode)>0);
- - else is_directory = false;
- -
- - return true;
- + return false;
- }
- -void close_directory(dir_information* dirp) {
- - if (dirp) closedir(dirp->dir);
- +bool read_directory_first(dir_information* dirp, char* entry_name, char* entry_sname, bool& is_directory)
- +{
- + return read_directory_next(dirp, entry_name, entry_sname, is_directory);
- }
- -#endif
- +void close_directory(dir_information* dirp)
- +{
- + retro_closedir(dirp->dir);
- +}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement