mirror of
https://github.com/OpenDriver2/REDRIVER2.git
synced 2024-11-25 11:52:32 +01:00
- added filesystem utilities
This commit is contained in:
parent
c164a6d2de
commit
5cd3a284e0
175
src_rebuild/utils/fs.cpp
Normal file
175
src_rebuild/utils/fs.cpp
Normal file
@ -0,0 +1,175 @@
|
||||
#include "fs.h"
|
||||
|
||||
#include <string>
|
||||
#include <cassert>
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#include <direct.h>
|
||||
#include <wtypes.h>
|
||||
|
||||
#define HOME_ENV "USERPROFILE"
|
||||
|
||||
void FS_FixPathSlashes(char* pathbuff)
|
||||
{
|
||||
while (*pathbuff)
|
||||
{
|
||||
if (*pathbuff == '/') // make windows-style path
|
||||
*pathbuff = '\\';
|
||||
pathbuff++;
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined (__unix__)
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <glob.h> // glob(), globfree()
|
||||
|
||||
void FS_FixPathSlashes(char* pathbuff)
|
||||
{
|
||||
while (*pathbuff)
|
||||
{
|
||||
if (*pathbuff == '\\') // make unix-style path
|
||||
*pathbuff = '/';
|
||||
pathbuff++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
struct FS_FINDDATA
|
||||
{
|
||||
char* wildcard;
|
||||
|
||||
#ifdef _WIN32
|
||||
WIN32_FIND_DATAA wfd;
|
||||
HANDLE fileHandle;
|
||||
#else
|
||||
glob_t gl;
|
||||
int index;
|
||||
int pathlen;
|
||||
#endif // _WIN32
|
||||
};
|
||||
|
||||
char* strreplace(char** str, char* dst, char* replace)
|
||||
{
|
||||
char* start, * tmp;
|
||||
int n;
|
||||
|
||||
if ((start = strstr(*str, dst)) == 0)
|
||||
return(0);
|
||||
|
||||
n = (start - *str) + strlen(start + strlen(dst)) + strlen(replace) + 1;
|
||||
|
||||
tmp = (char*)malloc(n);
|
||||
|
||||
// left part
|
||||
strncpy(tmp, *str, start - *str);
|
||||
|
||||
// replace (mid) part
|
||||
strcpy(tmp + (start - *str), replace);
|
||||
|
||||
// right part
|
||||
strcat(tmp, start + strlen(dst));
|
||||
|
||||
free(*str);
|
||||
|
||||
*str = tmp;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
// opens directory for search props
|
||||
const char* FS_FindFirst(const char* wildcard, FS_FINDDATA** findData)
|
||||
{
|
||||
assert(findData != nullptr);
|
||||
|
||||
if (findData == nullptr)
|
||||
return nullptr;
|
||||
|
||||
FS_FINDDATA* newFind = new FS_FINDDATA;
|
||||
*findData = newFind;
|
||||
|
||||
newFind->wildcard = (char*)malloc(strlen(wildcard) + 1);
|
||||
strcpy(newFind->wildcard, wildcard);
|
||||
FS_FixPathSlashes(newFind->wildcard);
|
||||
|
||||
#ifndef _WIN32
|
||||
strreplace(&newFind->wildcard, "*.*", "*");
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
newFind->fileHandle = ::FindFirstFileA(newFind->wildcard, &newFind->wfd);
|
||||
|
||||
if (newFind->fileHandle != INVALID_HANDLE_VALUE)
|
||||
return newFind->wfd.cFileName;
|
||||
#else // POSIX
|
||||
newFind->index = -1;
|
||||
|
||||
if (glob(newFind->wildcard, 0, NULL, &newFind->gl) == 0 && newFind->gl.gl_pathc > 0)
|
||||
{
|
||||
newFind->pathlen = strchr(newFind->wildcard, '.') - newFind->wildcard;
|
||||
newFind->index = 0;
|
||||
return newFind->gl.gl_pathv[newFind->index] + newFind->pathlen;
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
// delete if no luck
|
||||
FS_FindClose(newFind);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const char* FS_FindNext(FS_FINDDATA* findData)
|
||||
{
|
||||
if (!findData)
|
||||
return nullptr;
|
||||
|
||||
#ifdef _WIN32
|
||||
if (!::FindNextFileA(findData->fileHandle, &findData->wfd))
|
||||
return nullptr;
|
||||
#else
|
||||
if (findData->index < 0 || findData->index >= findData->gl.gl_pathc)
|
||||
return nullptr;
|
||||
#endif // _WIN32
|
||||
|
||||
#ifdef _WIN32
|
||||
return findData->wfd.cFileName;
|
||||
#else
|
||||
findData->index++;
|
||||
return findData->gl.gl_pathv[findData->index] + findData->pathlen;
|
||||
#endif // _WIN32
|
||||
}
|
||||
|
||||
void FS_FindClose(FS_FINDDATA* findData)
|
||||
{
|
||||
if (!findData)
|
||||
return;
|
||||
|
||||
#ifdef _WIN32
|
||||
if(findData->fileHandle = INVALID_HANDLE_VALUE)
|
||||
FindClose(findData->fileHandle);
|
||||
#else
|
||||
if (findData->index >= 0)
|
||||
globfree(&findData->gl);
|
||||
#endif // _WIN32
|
||||
delete findData;
|
||||
}
|
||||
|
||||
bool FS_FindIsDirectory(FS_FINDDATA* findData)
|
||||
{
|
||||
if (!findData)
|
||||
return false;
|
||||
|
||||
#ifdef _WIN32
|
||||
return (findData->wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
|
||||
#else
|
||||
struct stat st;
|
||||
|
||||
if (stat(findData->gl.gl_pathv[findData->index], &st) == 0)
|
||||
{
|
||||
return (st.st_mode & S_IFDIR) > 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
#endif // _WIN32
|
||||
}
|
24
src_rebuild/utils/fs.h
Normal file
24
src_rebuild/utils/fs.h
Normal file
@ -0,0 +1,24 @@
|
||||
#ifndef FS_H
|
||||
#define FS_H
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <direct.h>
|
||||
#define HOME_ENV "USERPROFILE"
|
||||
|
||||
#elif defined (__unix__)
|
||||
#include <sys/stat.h>
|
||||
#define HOME_ENV "HOME"
|
||||
|
||||
#define _mkdir(str) mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
|
||||
#endif
|
||||
|
||||
struct FS_FINDDATA;
|
||||
|
||||
void FS_FixPathSlashes(char* pathbuff);
|
||||
|
||||
const char* FS_FindFirst(const char* wildcard, FS_FINDDATA** findData);
|
||||
const char* FS_FindNext(FS_FINDDATA* findData);
|
||||
void FS_FindClose(FS_FINDDATA* findData);
|
||||
bool FS_FindIsDirectory(FS_FINDDATA* findData);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user