1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-07-04 04:50:22 +00:00

Repace fixdir() with filepath_fix_directory()

This commit is contained in:
Samuel Gomes 2023-12-10 11:15:41 +05:30
parent 0e251eb8e8
commit 48539861f3
5 changed files with 83 additions and 48 deletions

View file

@ -20898,7 +20898,7 @@ void sub_bsave(qbs *filename, int32 offset, int32 size) {
if (size != 65536)
size &= 0xFFFF;
qbs_set(tqbs, qbs_add(filename, nullt)); // prepare null-terminated filename
fh.open(fixdir(tqbs), std::ios::binary | std::ios::out);
fh.open(filepath_fix_directory(tqbs), std::ios::binary | std::ios::out);
if (fh.is_open() == NULL) {
error(64);
return;
@ -20939,7 +20939,7 @@ void sub_bload(qbs *filename, int32 offset, int32 passed) {
offset &= 0xFFFF;
}
qbs_set(tqbs, qbs_add(filename, nullt)); // prepare null-terminated filename
fh.open(fixdir(tqbs), std::ios::binary | std::ios::in);
fh.open(filepath_fix_directory(tqbs), std::ios::binary | std::ios::in);
if (fh.is_open() == NULL) {
error(53);
return;
@ -26413,7 +26413,7 @@ void sub_run(qbs *f) {
strz = qbs_new(0, 0);
qbs_set(str, f);
fixdir(str);
filepath_fix_directory(str);
#ifdef QB64_WINDOWS
@ -29558,24 +29558,24 @@ int32 gfs_open(qbs *filename, int32 access, int32 restrictions, int32 how) {
if (how == 2) {
// with truncate
if (access == 1)
f->file_handle->open(fixdir(filenamez), std::ios::in | std::ios::binary | std::ios::trunc);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::in | std::ios::binary | std::ios::trunc);
if (access == 2)
f->file_handle->open(fixdir(filenamez), std::ios::out | std::ios::binary | std::ios::trunc);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::out | std::ios::binary | std::ios::trunc);
if (access == 3)
f->file_handle->open(fixdir(filenamez), std::ios::in | std::ios::out | std::ios::binary | std::ios::trunc);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::in | std::ios::out | std::ios::binary | std::ios::trunc);
} else {
// without truncate
if (access == 1)
f->file_handle->open(fixdir(filenamez), std::ios::in | std::ios::binary);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::in | std::ios::binary);
if (access == 2)
f->file_handle->open(fixdir(filenamez), std::ios::out | std::ios::binary | std::ios::app);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::out | std::ios::binary | std::ios::app);
if (access == 3)
f->file_handle->open(fixdir(filenamez), std::ios::in | std::ios::out | std::ios::binary);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::in | std::ios::out | std::ios::binary);
}
if (how) {
if (!f->file_handle->is_open()) { // couldn't open file, so attempt creation
f->file_handle_o = new std::ofstream();
f->file_handle_o->open(fixdir(filenamez), std::ios::out);
f->file_handle_o->open(filepath_fix_directory(filenamez), std::ios::out);
if (f->file_handle_o->is_open()) { // created new file
f->file_handle_o->close();
// retry open
@ -29583,19 +29583,19 @@ int32 gfs_open(qbs *filename, int32 access, int32 restrictions, int32 how) {
if (how == 2) {
// with truncate
if (access == 1)
f->file_handle->open(fixdir(filenamez), std::ios::in | std::ios::binary | std::ios::trunc);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::in | std::ios::binary | std::ios::trunc);
if (access == 2)
f->file_handle->open(fixdir(filenamez), std::ios::out | std::ios::binary | std::ios::trunc);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::out | std::ios::binary | std::ios::trunc);
if (access == 3)
f->file_handle->open(fixdir(filenamez), std::ios::in | std::ios::out | std::ios::binary | std::ios::trunc);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::in | std::ios::out | std::ios::binary | std::ios::trunc);
} else {
// without truncate
if (access == 1)
f->file_handle->open(fixdir(filenamez), std::ios::in | std::ios::binary);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::in | std::ios::binary);
if (access == 2)
f->file_handle->open(fixdir(filenamez), std::ios::out | std::ios::binary | std::ios::app);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::out | std::ios::binary | std::ios::app);
if (access == 3)
f->file_handle->open(fixdir(filenamez), std::ios::in | std::ios::out | std::ios::binary);
f->file_handle->open(filepath_fix_directory(filenamez), std::ios::in | std::ios::out | std::ios::binary);
}
}
delete f->file_handle_o;
@ -29731,7 +29731,7 @@ int32 gfs_open(qbs *filename, int32 access, int32 restrictions, int32 how) {
if (how)
x3 = OPEN_ALWAYS;
undefined_retry:
f_w->file_handle = CreateFile(fixdir(filenamez), x, x2, NULL, x3, FILE_ATTRIBUTE_NORMAL, NULL);
f_w->file_handle = CreateFile(filepath_fix_directory(filenamez), x, x2, NULL, x3, FILE_ATTRIBUTE_NORMAL, NULL);
if (f_w->file_handle == INVALID_HANDLE_VALUE) {
if (how == 3) {
@ -29775,7 +29775,7 @@ undefined_retry:
if (GetFileSize_low || GetFileSize_high) {
CloseHandle(f_w->file_handle);
x3 = TRUNCATE_EXISTING;
f_w->file_handle = CreateFile(fixdir(filenamez), x, x2, NULL, x3, FILE_ATTRIBUTE_NORMAL, NULL);
f_w->file_handle = CreateFile(filepath_fix_directory(filenamez), x, x2, NULL, x3, FILE_ATTRIBUTE_NORMAL, NULL);
if (f_w->file_handle == INVALID_HANDLE_VALUE) {
gfs_free(i);

View file

@ -17,10 +17,8 @@ const char *filepath_get_extension(const char *fliename);
bool filepath_has_extension(const char *path, const char *extension);
// The following overloaded functions changes the path separators in path based on the OS (path is modified)
char *filepath_fix_directory(char *path);
char *filepath_fix_directory(std::string &path);
char *filepath_fix_directory(qbs *path);
char *fixdir(qbs *);
const char *filepath_fix_directory(char *path);
const char *filepath_fix_directory(qbs *path);
const char *filepath_fix_directory(std::string &path);
#endif

View file

@ -3,9 +3,10 @@
#include "libqb-common.h"
#include <string.h>
#include <algorithm>
#include "../../libqb.h"
#include "filepath.h"
const char *filepath_get_filename(const char *path) {
const char *fileName;
@ -75,17 +76,53 @@ bool filepath_has_extension(const char *path, const char *extension) {
#endif
}
char *fixdir(qbs *filename) {
// note: changes the slashes in a filename to make it compatible with the OS
// applied to QB commands: open, bload/bsave, loadfont, loadimage, sndopen/sndplayfile
for (auto i = 0; i < filename->len; i++) {
/// @brief Changes the slashes in a file name / path to make it compatible with the OS
/// @param path The path to fix (this contents may be changed)
/// @return Returns the C-string for convenience
const char *filepath_fix_directory(char *path) {
auto len = strlen(path);
for (size_t i = 0; i < len; i++) {
#ifdef QB64_WINDOWS
if (filename->chr[i] == 47)
filename->chr[i] = 92;
if (path[i] == '/')
path[i] = '\\';
#else
if (filename->chr[i] == 92)
filename->chr[i] = 47;
if (path[i] == '\\')
path[i] = '/';
#endif
}
return (char *)filename->chr;
return path;
}
/// @brief Changes the slashes in a file name / path to make it compatible with the OS
/// @param path The path to fix (this contents may be changed)
/// @return Returns the C-string for convenience
const char *filepath_fix_directory(qbs *path) {
for (size_t i = 0; i < path->len; i++) {
#ifdef QB64_WINDOWS
if (path->chr[i] == '/')
path->chr[i] = '\\';
#else
if (path->chr[i] == '\\')
path->chr[i] = '/';
#endif
}
return (char *)path->chr;
}
/// @brief Changes the slashes in a file name / path to make it compatible with the OS
/// @param path The path to fix (this contents may be changed)
/// @return Returns the C-string for convenience
const char *filepath_fix_directory(std::string &path) {
std::transform(path.begin(), path.end(), path.begin(), [](unsigned char c) {
#ifdef QB64_WINDOWS
return c == '/' ? '\\' : c;
#else
return c == '\\' ? '/' : c;
#endif
});
return path.c_str();
}

View file

@ -217,7 +217,7 @@ int32 func__direxists(qbs *file) {
qbs_set(strz, qbs_add(file, qbs_new_txt_len("\0", 1)));
#ifdef QB64_WINDOWS
static int32 x;
x = GetFileAttributes(fixdir(strz));
x = GetFileAttributes(filepath_fix_directory(strz));
if (x == INVALID_FILE_ATTRIBUTES)
return 0;
if (x & FILE_ATTRIBUTE_DIRECTORY)
@ -225,7 +225,7 @@ int32 func__direxists(qbs *file) {
return 0;
#elif defined(QB64_UNIX)
struct stat sb;
if (stat(fixdir(strz), &sb) == 0 && S_ISDIR(sb.st_mode))
if (stat(filepath_fix_directory(strz), &sb) == 0 && S_ISDIR(sb.st_mode))
return -1;
return 0;
#else
@ -242,7 +242,7 @@ int32 func__fileexists(qbs *file) {
qbs_set(strz, qbs_add(file, qbs_new_txt_len("\0", 1)));
#ifdef QB64_WINDOWS
static int32 x;
x = GetFileAttributes(fixdir(strz));
x = GetFileAttributes(filepath_fix_directory(strz));
if (x == INVALID_FILE_ATTRIBUTES)
return 0;
if (x & FILE_ATTRIBUTE_DIRECTORY)
@ -250,13 +250,13 @@ int32 func__fileexists(qbs *file) {
return -1;
#elif defined(QB64_UNIX)
struct stat sb;
if (stat(fixdir(strz), &sb) == 0 && S_ISREG(sb.st_mode))
if (stat(filepath_fix_directory(strz), &sb) == 0 && S_ISREG(sb.st_mode))
return -1;
return 0;
#else
// generic method (not currently used)
static std::ifstream fh;
fh.open(fixdir(strz), std::ios::binary | std::ios::in);
fh.open(filepath_fix_directory(strz), std::ios::binary | std::ios::in);
if (fh.is_open() == NULL) {
fh.clear(std::ios::goodbit);
return 0;
@ -283,7 +283,7 @@ void sub_chdir(qbs *str) {
if (!strz)
strz = qbs_new(0, 0);
qbs_set(strz, qbs_add(str, qbs_new_txt_len("\0", 1)));
if (chdir(fixdir(strz)) == -1) {
if (chdir(filepath_fix_directory(strz)) == -1) {
// assume errno==ENOENT
error(76); // path not found
}
@ -358,7 +358,7 @@ void sub_files(qbs *str, int32 passed) {
return;
}
hFind = FindFirstFile(fixdir(strz), &fd);
hFind = FindFirstFile(filepath_fix_directory(strz), &fd);
if (hFind == INVALID_HANDLE_VALUE) {
error(53);
return;
@ -451,7 +451,7 @@ void sub_kill(qbs *str) {
strpath->len = 0; // no path specified
static int32 count;
count = 0;
hFind = FindFirstFile(fixdir(strz), &fd);
hFind = FindFirstFile(filepath_fix_directory(strz), &fd);
if (hFind == INVALID_HANDLE_VALUE) {
error(53);
return;
@ -480,7 +480,7 @@ void sub_kill(qbs *str) {
} // file not found
return;
#else
if (remove(fixdir(strz))) {
if (remove(filepath_fix_directory(strz))) {
i = errno;
if (i == ENOENT) {
error(53);
@ -503,9 +503,9 @@ void sub_mkdir(qbs *str) {
strz = qbs_new(0, 0);
qbs_set(strz, qbs_add(str, qbs_new_txt_len("\0", 1)));
#ifdef QB64_UNIX
if (mkdir(fixdir(strz), 0770) == -1) {
if (mkdir(filepath_fix_directory(strz), 0770) == -1) {
#else
if (mkdir(fixdir(strz)) == -1) {
if (mkdir(filepath_fix_directory(strz)) == -1) {
#endif
if (errno == EEXIST) {
error(75);
@ -528,7 +528,7 @@ void sub_name(qbs *oldname, qbs *newname) {
static int32 i;
qbs_set(strz, qbs_add(oldname, qbs_new_txt_len("\0", 1)));
qbs_set(strz2, qbs_add(newname, qbs_new_txt_len("\0", 1)));
if (rename(fixdir(strz), fixdir(strz2))) {
if (rename(filepath_fix_directory(strz), filepath_fix_directory(strz2))) {
i = errno;
if (i == ENOENT) {
error(53);
@ -553,7 +553,7 @@ void sub_rmdir(qbs *str) {
if (!strz)
strz = qbs_new(0, 0);
qbs_set(strz, qbs_add(str, qbs_new_txt_len("\0", 1)));
if (rmdir(fixdir(strz)) == -1) {
if (rmdir(filepath_fix_directory(strz)) == -1) {
if (errno == ENOTEMPTY) {
error(75);
return;

View file

@ -1311,8 +1311,8 @@ void sub_chain(qbs *f) {
extensions_ready:
// normalize dir slashes
fixdir(f_exe);
fixdir(f_bas);
filepath_fix_directory(f_exe);
filepath_fix_directory(f_bas);
// get path (strip paths from f_exe & f_bas)
f_path->len = 0;