added qse_getpathcore()/qse_getmbspathcore()/qse_getwcspathcore()

added qse_fs_dupfspathforwcs()
improved qse_fs_mkdirXXX()
This commit is contained in:
2014-11-27 15:58:51 +00:00
parent 99e9160c53
commit 947f5a8d8d
7 changed files with 286 additions and 73 deletions

View File

@ -71,63 +71,102 @@ static int make_directory_in_fs (qse_fs_t* fs, const qse_fs_char_t* fspath)
/* --------------------------------------------------------------------- */
static int make_directory_with_mbs (qse_fs_t* fs, const qse_mchar_t* path)
static int make_directory_chain (qse_fs_t* fs, qse_fs_char_t* fspath)
{
qse_fs_char_t* p, c;
int ret = 0;
p = get_fspath_core (fspath);
canon_fspath (p, p, 0);
for (; *p; p++)
{
if (IS_FSPATHSEP(*p))
{
c = *(p + 1);
*(p + 1) = QSE_FS_T('\0');
ret = make_directory_in_fs (fs, fspath);
if (ret <= -1 && fs->errnum != QSE_FS_EEXIST)
{
return -1;
goto done; /* abort */
}
*(p + 1) = c;
}
}
if (!IS_FSPATHSEP(*(p - 1))) ret = make_directory_in_fs (fs, fspath);
done:
return ret;
}
int qse_fs_mkdirmbs (qse_fs_t* fs, const qse_mchar_t* path, int flags)
{
qse_fs_char_t* fspath;
int ret;
#if 0
if (fs->cbs.mk)
if (*path == QSE_MT('\0'))
{
int x;
x = fs->cbs.mk (fs, path);
if (x <= -1) return -1;
if (x == 0) return 0; /* skipped */
fs->errnum = QSE_FS_EINVAL;
return -1;
}
#endif
fspath = (qse_fs_char_t*)qse_fs_makefspathformbs (fs, path);
if (!fspath) return -1;
if (flags & QSE_FS_MKDIRMBS_PARENT)
{
fspath = qse_fs_dupfspathformbs (fs, path);
if (!fspath) return -1;
ret = make_directory_chain (fs, fspath);
}
else
{
fspath = (qse_fs_char_t*)qse_fs_makefspathformbs (fs, path);
if (!fspath) return -1;
ret = make_directory_in_fs (fs, fspath);
}
ret = make_directory_from_fs (fs, fspath);
qse_fs_freefspathformbs (fs, path, fspath);
return ret;
}
static int make_directory_with_wcs (qse_fs_t* fs, const qse_wchar_t* path)
int qse_fs_mkdirwcs (qse_fs_t* fs, const qse_wchar_t* path, int flags)
{
qse_fs_char_t* fspath;
int ret;
#if 0
if (fs->cbs.mk)
if (*path == QSE_WT('\0'))
{
int x;
x = fs->cbs.del (fs, path);
if (x <= -1) return -1;
if (x == 0) return 0; /* skipped */
fs->errnum = QSE_FS_EINVAL;
return -1;
}
#endif
fspath = (qse_fs_char_t*)qse_fs_makefspathforwcs (fs, path);
if (!fspath) return -1;
if (flags & QSE_FS_MKDIRWCS_PARENT)
{
fspath = qse_fs_dupfspathforwcs (fs, path);
if (!fspath) return -1;
ret = make_directory_chain (fs, fspath);
}
else
{
fspath = (qse_fs_char_t*)qse_fs_makefspathforwcs (fs, path);
if (!fspath) return -1;
ret = make_directory_in_fs (fs, fspath);
}
ret = make_directory_from_fs (fs, fspath);
qse_fs_freefspathforwcs (fs, path, fspath);
return ret;
}
/* --------------------------------------------------------------------- */
int qse_fs_mkdirmbs (qse_fs_t* fs, const qse_mchar_t* path)
{
return 0;
}
int qse_fs_mkdirwcs (qse_fs_t* fs, const qse_wchar_t* path)
{
return 0;
}
/*
mknodmbs
mkfifombs
mknodwcs
mknodwcs
*/

View File

@ -778,6 +778,34 @@ qse_fs_char_t* qse_fs_makefspathforwcs (qse_fs_t* fs, const qse_wchar_t* path)
return fspath;
}
qse_fs_char_t* qse_fs_dupfspathformbs (qse_fs_t* fs, const qse_mchar_t* path)
{
qse_fs_char_t* fspath;
#if defined(QSE_FS_CHAR_IS_MCHAR)
fspath = qse_mbsdup (path, fs->mmgr);
#else
fspath = qse_mbstowcsdupwithcmgr (path, QSE_NULL, fs->mmgrm fs->cmgr);
if (!fspath) fs->errnum = QSE_FS_ENOMEM;
#endif
return fspath;
}
qse_fs_char_t* qse_fs_dupfspathforwcs (qse_fs_t* fs, const qse_wchar_t* path)
{
qse_fs_char_t* fspath;
#if defined(QSE_FS_CHAR_IS_MCHAR)
fspath = qse_wcstombsdupwithcmgr (path, QSE_NULL, fs->mmgr, fs->cmgr);
if (!fspath) fs->errnum = QSE_FS_ENOMEM;
#else
fspath = qse_wcsdup (path, fs->mmgr);
#endif
return fspath;
}
void qse_fs_freefspathformbs (qse_fs_t* fs, const qse_mchar_t* path, qse_fs_char_t* fspath)
{
if (path != fspath) QSE_MMGR_FREE (fs->mmgr, fspath);

View File

@ -30,6 +30,7 @@
#include <qse/cmn/dir.h>
#include <qse/cmn/mem.h>
#include <qse/cmn/str.h>
#include <qse/cmn/path.h>
#if defined(_WIN32)
# include <windows.h>
@ -71,6 +72,18 @@
# define free_str_with_mbs(fs,mbs,str) QSE_MMGR_FREE((fs)->mmgr,str)
#endif
#if defined(QSE_FS_CHAR_IS_MCHAR)
# define canon_fspath(path,canon,flags) qse_canonmbspath(path,canon,flags)
# define get_fspath_core(fspath) qse_getmbspathcore(fspath)
# define IS_FSPATHSEP(x) QSE_ISPATHMBSEP(x)
# define QSE_FS_T(x) QSE_MT(x)
#else
# define canon_fspath(fspath,canon,flags) qse_canonwcspath(fspath,canon,flags)
# define get_fspath_core(fspath) qse_getwcspathcore(fspath)
# define IS_FSPATHSEP(x) QSE_ISPATHWCSEP(x)
# define QSE_FS_T(x) QSE_WT(x)
#endif
#if defined(__cplusplus)
extern "C" {
#endif
@ -95,6 +108,16 @@ qse_fs_char_t* qse_fs_makefspathforwcs (
const qse_wchar_t* path
);
qse_fs_char_t* qse_fs_dupfspathformbs (
qse_fs_t* fs,
const qse_mchar_t* path
);
qse_fs_char_t* qse_fs_dupfspathforwcs (
qse_fs_t* fs,
const qse_wchar_t* path
);
void qse_fs_freefspathformbs (
qse_fs_t* fs,
const qse_mchar_t* path,

View File

@ -26,6 +26,10 @@
#include <qse/cmn/path.h>
/* TODO: support the \\?\ prefix and the \\.\ prefix on windows
* support \\?\UNC\server\path which is equivalent to \\server\path.
* */
/* ------------------------------------------------------------------ */
/* MBS IMPLEMENTATION */
/* ------------------------------------------------------------------ */
@ -40,6 +44,7 @@
(s[0] >= QSE_MT('a') && s[0] <= QSE_MT('z'))) && \
s[1] == QSE_MT(':'))
int qse_ismbsabspath (const qse_mchar_t* path)
{
if (IS_MSEP(path[0])) return 1;
@ -48,7 +53,7 @@ int qse_ismbsabspath (const qse_mchar_t* path)
* but the path within the drive is kind of relative */
if (IS_MDRIVE(path)) return 1;
#endif
return 0;
return 0;
}
int qse_ismbsdrivepath (const qse_mchar_t* path)
@ -75,6 +80,25 @@ int qse_ismbsdrivecurpath (const qse_mchar_t* path)
return 0;
}
qse_mchar_t* qse_getmbspathcore (const qse_mchar_t* path)
{
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
if (IS_MDRIVE(path)) return path + 2;
#if defined(_WIN32)
else if (IS_MSEP(*ptr) && IS_MSEP(*(ptr + 1)) && !IS_MSEP_OR_MNIL(*(ptr + 2)))
{
/* UNC Path */
ptr += 2;
do { ptr++; } while (!IS_MSEP_OR_MNIL(*ptr));
if (IS_MSEP(*ptr)) return ptr;
}
#endif
/* TOOD: \\server\XXX \\.\XXX \\?\XXX \\?\UNC\server\XXX */
#endif
return path;
}
qse_size_t qse_canonmbspath (const qse_mchar_t* path, qse_mchar_t* canon, int flags)
{
const qse_mchar_t* ptr;
@ -390,6 +414,23 @@ int qse_iswcsdrivecurpath (const qse_wchar_t* path)
return 0;
}
qse_wchar_t* qse_getwcspathcore (const qse_wchar_t* path)
{
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
if (IS_WDRIVE(path)) return path + 2;
#if defined(_WIN32)
else if (IS_WSEP(*ptr) && IS_WSEP(*(ptr + 1)) && !IS_WSEP_OR_WNIL(*(ptr + 2)))
{
/* UNC Path */
ptr += 2;
do { ptr++; } while (!IS_WSEP_OR_WNIL(*ptr));
if (IS_WSEP(*ptr)) return ptr;
}
#endif
#endif
return path;
}
qse_size_t qse_canonwcspath (const qse_wchar_t* path, qse_wchar_t* canon, int flags)
{
const qse_wchar_t* ptr;