enhanced dir.c to handle both mbs and wcs by implementing the new QSE_DIR_WCSPATH option
This commit is contained in:
parent
0a9a80c567
commit
77939a5940
@ -60,8 +60,9 @@ typedef enum qse_dir_errnum_t qse_dir_errnum_t;
|
||||
enum qse_dir_flag_t
|
||||
{
|
||||
QSE_DIR_MBSPATH = (1 << 0),
|
||||
QSE_DIR_SORT = (1 << 1),
|
||||
QSE_DIR_SKIPSPCDIR = (1 << 2) /**< limited to normal entries excluding . and .. */
|
||||
QSE_DIR_WCSPATH = (1 << 1),
|
||||
QSE_DIR_SORT = (1 << 2),
|
||||
QSE_DIR_SKIPSPCDIR = (1 << 3) /**< limited to normal entries excluding . and .. */
|
||||
};
|
||||
typedef enum qse_dir_flag_t qse_dir_flag_t;
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
*/
|
||||
#include <qse/types.h>
|
||||
#include <qse/macros.h>
|
||||
#include <qse/cmn/str.h>
|
||||
|
||||
typedef qse_cmgr_t* (*qse_cmgr_finder_t) (const qse_char_t* name);
|
||||
|
||||
@ -470,6 +471,20 @@ QSE_EXPORT qse_mchar_t* qse_wcsnatombsdup (
|
||||
qse_mmgr_t* mmgr
|
||||
);
|
||||
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
# define qse_strtombsdup(sa,mmgr) qse_strdup(sa,mmgr)
|
||||
# define qse_strtowcsdup(sa,mmgr) qse_mbstowcsdup(sa,QSE_NULL,mmgr)
|
||||
# define qse_strtombsdupwithcmgr(sa,mmgr,cmgr) qse_strdup(sa,mmgr)
|
||||
# define qse_strtowcsdupwithcmgr(sa,mmgr,cmgr) qse_mbstowcsdupwithcmgr(sa,QSE_NULL,mmgr,cmgr)
|
||||
|
||||
#else
|
||||
# define qse_strtombsdup(sa,mmgr) qse_wcstombsdup(sa,QSE_NULL,mmgr)
|
||||
# define qse_strtowcsdup(sa,mmgr) qse_wcsdup(sa,mmgr)
|
||||
# define qse_strtombsdupwithcmgr(sa,mmgr,cmgr) qse_wcstombsdupwithcmgr(sa,QSE_NULL,mmgr,cmgr)
|
||||
# define qse_strtowcsdupwithcmgr(sa,mmgr,cmgr) qse_wcsdup(sa,mmgr)
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
@ -1392,6 +1392,7 @@ QSE_EXPORT qse_wchar_t* qse_wcstradup (
|
||||
# define qse_cstradup(sa,len,mmgr) qse_wcstradup(sa,len,mmgr)
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* The qse_mbsstr() function searchs a string \a str for the first occurrence
|
||||
* of a substring \a sub.
|
||||
|
@ -71,7 +71,7 @@ struct qse_dir_t
|
||||
qse_dir_errnum_t errnum;
|
||||
int flags;
|
||||
|
||||
qse_str_t tbuf;
|
||||
qse_wcs_t wbuf;
|
||||
qse_mbs_t mbuf;
|
||||
|
||||
qse_lda_t* stab;
|
||||
@ -158,13 +158,27 @@ static int compare_dirent (qse_lda_t* lda, const void* dptr1, qse_size_t dlen1,
|
||||
int qse_dir_init (qse_dir_t* dir, qse_mmgr_t* mmgr, const qse_char_t* path, int flags)
|
||||
{
|
||||
int n;
|
||||
int path_flags;
|
||||
|
||||
path_flags = flags & (QSE_DIR_MBSPATH | QSE_DIR_WCSPATH);
|
||||
if (path_flags == (QSE_DIR_MBSPATH | QSE_DIR_WCSPATH) || path_flags == 0)
|
||||
{
|
||||
/* if both are set or none are set, force it to the default */
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
flags |= QSE_DIR_MBSPATH;
|
||||
flags &= ~QSE_DIR_WCSPATH;
|
||||
#else
|
||||
flags |= QSE_DIR_WCSPATH;
|
||||
flags &= ~QSE_DIR_MBSPATH;
|
||||
#endif
|
||||
}
|
||||
|
||||
QSE_MEMSET (dir, 0, QSE_SIZEOF(*dir));
|
||||
|
||||
dir->mmgr = mmgr;
|
||||
dir->flags = flags;
|
||||
|
||||
if (qse_str_init (&dir->tbuf, mmgr, 256) <= -1) goto oops_0;
|
||||
if (qse_wcs_init (&dir->wbuf, mmgr, 256) <= -1) goto oops_0;
|
||||
if (qse_mbs_init (&dir->mbuf, mmgr, 256) <= -1) goto oops_1;
|
||||
|
||||
#if defined(_WIN32)
|
||||
@ -194,7 +208,7 @@ oops_3:
|
||||
oops_2:
|
||||
qse_mbs_fini (&dir->mbuf);
|
||||
oops_1:
|
||||
qse_str_fini (&dir->tbuf);
|
||||
qse_wcs_fini (&dir->wbuf);
|
||||
oops_0:
|
||||
return -1;
|
||||
}
|
||||
@ -233,12 +247,12 @@ void qse_dir_fini (qse_dir_t* dir)
|
||||
close_dir_safely (dir);
|
||||
|
||||
qse_mbs_fini (&dir->mbuf);
|
||||
qse_str_fini (&dir->tbuf);
|
||||
qse_wcs_fini (&dir->wbuf);
|
||||
|
||||
if (dir->stab) qse_lda_close (dir->stab);
|
||||
}
|
||||
|
||||
static qse_mchar_t* wcs_to_mbuf (qse_dir_t* dir, const qse_wchar_t* wcs, qse_mbs_t* mbs)
|
||||
static qse_mchar_t* wcs_to_mbuf (qse_dir_t* dir, const qse_wchar_t* wcs, qse_mbs_t* mbuf)
|
||||
{
|
||||
qse_size_t ml, wl;
|
||||
|
||||
@ -248,17 +262,17 @@ static qse_mchar_t* wcs_to_mbuf (qse_dir_t* dir, const qse_wchar_t* wcs, qse_mbs
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
if (qse_mbs_setlen (mbs, ml) == (qse_size_t)-1)
|
||||
if (qse_mbs_setlen (mbuf, ml) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
qse_wcstombs (wcs, &wl, QSE_MBS_PTR(mbs), &ml);
|
||||
return QSE_MBS_PTR(mbs);
|
||||
qse_wcstombs (wcs, &wl, QSE_MBS_PTR(mbuf), &ml);
|
||||
return QSE_MBS_PTR(mbuf);
|
||||
}
|
||||
|
||||
static qse_wchar_t* mbs_to_wbuf (qse_dir_t* dir, const qse_mchar_t* mbs, qse_wcs_t* wcs)
|
||||
static qse_wchar_t* mbs_to_wbuf (qse_dir_t* dir, const qse_mchar_t* mbs, qse_wcs_t* wbuf)
|
||||
{
|
||||
qse_size_t ml, wl;
|
||||
|
||||
@ -267,16 +281,39 @@ static qse_wchar_t* mbs_to_wbuf (qse_dir_t* dir, const qse_mchar_t* mbs, qse_wcs
|
||||
dir->errnum = QSE_DIR_EINVAL;
|
||||
return QSE_NULL;
|
||||
}
|
||||
if (qse_wcs_setlen (wcs, wl) == (qse_size_t)-1)
|
||||
if (qse_wcs_setlen (wbuf, wl) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
qse_mbstowcs (mbs, &ml, QSE_WCS_PTR(wcs), &wl);
|
||||
return QSE_WCS_PTR(wcs);
|
||||
qse_mbstowcs (mbs, &ml, QSE_WCS_PTR(wbuf), &wl);
|
||||
return QSE_WCS_PTR(wbuf);
|
||||
}
|
||||
|
||||
static qse_wchar_t* wcs_to_wbuf (qse_dir_t* dir, const qse_wchar_t* wcs, qse_wcs_t* wbuf)
|
||||
{
|
||||
if (qse_wcs_cpy (&dir->wbuf, wcs) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
return QSE_WCS_PTR(wbuf);
|
||||
}
|
||||
|
||||
static qse_mchar_t* mbs_to_mbuf (qse_dir_t* dir, const qse_mchar_t* mbs, qse_mbs_t* mbuf)
|
||||
{
|
||||
if (qse_mbs_cpy (&dir->mbuf, mbs) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
return QSE_MBS_PTR(mbuf);
|
||||
}
|
||||
|
||||
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
|
||||
static qse_mchar_t* make_mbsdos_path (qse_dir_t* dir, const qse_mchar_t* mpath)
|
||||
{
|
||||
if (mpath[0] == QSE_MT('\0'))
|
||||
@ -304,6 +341,35 @@ static qse_mchar_t* make_mbsdos_path (qse_dir_t* dir, const qse_mchar_t* mpath)
|
||||
return QSE_MBS_PTR(&dir->mbuf);
|
||||
}
|
||||
|
||||
static qse_wchar_t* make_wcsdos_path (qse_dir_t* dir, const qse_wchar_t* wpath)
|
||||
{
|
||||
if (wpath[0] == QSE_WT('\0'))
|
||||
{
|
||||
if (qse_wcs_cpy (&dir->wbuf, QSE_WT("*.*")) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return QSE_NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
qse_size_t len;
|
||||
if ((len = qse_wcs_cpy (&dir->wbuf, wpath)) == (qse_size_t)-1 ||
|
||||
(!QSE_ISPATHWCSEP(wpath[len - 1]) &&
|
||||
!qse_iswcsdrivecurpath(wpath) &&
|
||||
qse_wcs_ccat (&dir->wbuf, QSE_WT('\\')) == (qse_size_t)-1) ||
|
||||
qse_wcs_cat (&dir->wbuf, QSE_WT("*.*")) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return QSE_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return QSE_WCS_PTR(&dir->wbuf);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
static qse_char_t* make_dos_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
{
|
||||
if (path[0] == QSE_T('\0'))
|
||||
@ -357,31 +423,44 @@ static qse_mchar_t* mkdospath (qse_dir_t* dir, const qse_char_t* path)
|
||||
#endif
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
/* ------------------------------------------------------------------- */
|
||||
qse_char_t* tptr;
|
||||
const qse_char_t* tptr;
|
||||
|
||||
dir->status &= ~STATUS_DONE;
|
||||
dir->status &= ~STATUS_DONE_ERR;
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
tptr = make_dos_path (dir, path);
|
||||
#else
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
{
|
||||
qse_mchar_t* mptr = make_mbsdos_path (dir, (const qse_mchar_t*) path);
|
||||
qse_mchar_t* mptr;
|
||||
|
||||
mptr = make_mbsdos_path (dir, (const qse_mchar_t*)path);
|
||||
if (mptr == QSE_NULL) return -1;
|
||||
tptr = mbs_to_wbuf (dir, mptr, &dir->tbuf);
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
tptr = mptr;
|
||||
#else
|
||||
tptr = mbs_to_wbuf (dir, mptr, &dir->wbuf);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
tptr = make_dos_path (dir, path);
|
||||
if (tptr == QSE_NULL) return -1;
|
||||
}
|
||||
qse_wchar_t* wptr;
|
||||
QSE_ASSERT (dir->flags & QSE_DIR_WCSPATH);
|
||||
|
||||
wptr = make_wcsdos_path (dir, (const qse_wchar_t*)path);
|
||||
if (wptr == QSE_NULL) return -1;
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
tptr = wcs_to_mbuf (dir, wptr, &dir->mbuf);
|
||||
#else
|
||||
tptr = wptr;
|
||||
#endif
|
||||
}
|
||||
if (tptr == QSE_NULL) return -1;
|
||||
|
||||
dir->h = FindFirstFile (tptr, &dir->wfd);
|
||||
@ -398,25 +477,24 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
|
||||
/* ------------------------------------------------------------------- */
|
||||
APIRET rc;
|
||||
qse_mchar_t* mptr;
|
||||
const qse_mchar_t* mptr;
|
||||
|
||||
dir->h = HDIR_CREATE;
|
||||
dir->count = 1;
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
mptr = make_dos_path (dir, path);
|
||||
#else
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
{
|
||||
mptr = make_mbsdos_path (dir, (const qse_mchar_t*) path);
|
||||
mptr = make_mbsdos_path (dir, (const qse_mchar_t*)path);
|
||||
}
|
||||
else
|
||||
{
|
||||
qse_char_t* tptr = make_dos_path (dir, path);
|
||||
if (tptr == QSE_NULL) return -1;
|
||||
mptr = wcs_to_mbuf (dir, tptr, &dir->mbuf);
|
||||
qse_wchar_t* wptr;
|
||||
QSE_ASSERT (dir->flags & QSE_DIR_WCSPATH);
|
||||
|
||||
wptr = make_wcsdos_path (dir, (const qse_wchar_t*)path);
|
||||
if (wptr == QSE_NULL) return -1;
|
||||
mptr = wcs_to_mbuf (dir, wptr, &dir->mbuf);
|
||||
}
|
||||
#endif
|
||||
if (mptr == QSE_NULL) return -1;
|
||||
|
||||
rc = DosFindFirst (
|
||||
@ -426,11 +504,11 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
&dir->ffb,
|
||||
QSE_SIZEOF(dir->ffb),
|
||||
&dir->count,
|
||||
#if defined(FIL_STANDARDL)
|
||||
#if defined(FIL_STANDARDL)
|
||||
FIL_STANDARDL
|
||||
#else
|
||||
#else
|
||||
FIL_STANDARD
|
||||
#endif
|
||||
#endif
|
||||
);
|
||||
|
||||
if (rc != NO_ERROR)
|
||||
@ -447,25 +525,25 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
|
||||
/* ------------------------------------------------------------------- */
|
||||
unsigned int rc;
|
||||
qse_mchar_t* mptr;
|
||||
const qse_mchar_t* mptr;
|
||||
|
||||
dir->status &= ~STATUS_DONE;
|
||||
dir->status &= ~STATUS_DONE_ERR;
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
mptr = make_dos_path (dir, path);
|
||||
#else
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
{
|
||||
mptr = make_mbsdos_path (dir, (const qse_mchar_t*) path);
|
||||
mptr = make_mbsdos_path (dir, (const qse_mchar_t*)path);
|
||||
}
|
||||
else
|
||||
{
|
||||
qse_char_t* tptr = make_dos_path (dir, path);
|
||||
if (tptr == QSE_NULL) return -1;
|
||||
mptr = wcs_to_mbuf (dir, tptr, &dir->mbuf);
|
||||
qse_wchar_t* wptr;
|
||||
|
||||
QSE_ASSERT (dir->flags & QSE_DIR_WCSPTH);
|
||||
|
||||
wptr = make_wcsdos_path (dir, (const qse_wchar_t*)path);
|
||||
if (wptr == QSE_NULL) return -1;
|
||||
mptr = wcs_to_mbuf (dir, wptr, &dir->mbuf);
|
||||
}
|
||||
#endif
|
||||
if (mptr == QSE_NULL) return -1;
|
||||
|
||||
rc = _dos_findfirst (mptr, _A_NORMAL | _A_SUBDIR, &dir->f);
|
||||
@ -482,17 +560,21 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
#else
|
||||
DIR* dp;
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
dp = QSE_OPENDIR (path[0] == QSE_MT('\0')? QSE_T("."): path);
|
||||
#else
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
{
|
||||
const qse_mchar_t* mpath = (const qse_mchar_t*)path;
|
||||
const qse_mchar_t* mpath;
|
||||
|
||||
mpath = (const qse_mchar_t*)path;
|
||||
dp = QSE_OPENDIR (mpath == QSE_MT('\0')? QSE_MT("."): mpath);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (path[0] == QSE_T('\0'))
|
||||
|
||||
const qse_wchar_t* wpath;
|
||||
QSE_ASSERT (dir->flags & QSE_DIR_WCSPATH);
|
||||
|
||||
wpath = (const qse_wchar_t*)path;
|
||||
if (wpath[0] == QSE_WT('\0'))
|
||||
{
|
||||
dp = QSE_OPENDIR (QSE_MT("."));
|
||||
}
|
||||
@ -500,13 +582,13 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
{
|
||||
qse_mchar_t* mptr;
|
||||
|
||||
mptr = wcs_to_mbuf (dir, path, &dir->mbuf);
|
||||
mptr = wcs_to_mbuf (dir, wpath, &dir->mbuf);
|
||||
if (mptr == QSE_NULL) return -1;
|
||||
|
||||
dp = QSE_OPENDIR (mptr);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (dp == QSE_NULL)
|
||||
{
|
||||
dir->errnum = syserr_to_errnum (errno);
|
||||
@ -540,7 +622,7 @@ int qse_dir_reset (qse_dir_t* dir, const qse_char_t* path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
|
||||
static int read_dir_to_buf (qse_dir_t* dir, void** name)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
|
||||
@ -571,29 +653,25 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
if (qse_str_cpy (&dir->tbuf, dir->wfd.cFileName) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
*name = QSE_STR_PTR(&dir->tbuf);
|
||||
#else
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
{
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
if (mbs_to_mbuf (dir, dir->wfd.cFileName, &dir->mbuf) == QSE_NULL) return -1;
|
||||
#else
|
||||
if (wcs_to_mbuf (dir, dir->wfd.cFileName, &dir->mbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_STR_PTR(&dir->mbuf);
|
||||
#endif
|
||||
*name = QSE_MBS_PTR(&dir->mbuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (qse_str_cpy (&dir->tbuf, dir->wfd.cFileName) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
*name = QSE_STR_PTR(&dir->tbuf);
|
||||
}
|
||||
QSE_ASSERT (dir->flags & QSE_DIR_WCSPATH);
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
if (mbs_to_wbuf (dir, dir->wfd.cFileName, &dir->wbuf) == QSE_NULL) return -1;
|
||||
#else
|
||||
if (wcs_to_wbuf (dir, dir->wfd.cFileName, &dir->wbuf) == QSE_NULL) return -1;
|
||||
#endif
|
||||
*name = QSE_WCS_PTR(&dir->wbuf);
|
||||
}
|
||||
|
||||
if (FindNextFile (dir->h, &dir->wfd) == FALSE)
|
||||
{
|
||||
@ -636,29 +714,18 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
if (qse_str_cpy (&dir->tbuf, dir->ffb.achName) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
*name = QSE_STR_PTR(&dir->tbuf);
|
||||
#else
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
{
|
||||
if (qse_mbs_cpy (&dir->mbuf, dir->ffb.achName) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
if (mbs_to_mbuf (dir, dir->ffb.achName, &dir->mbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_MBS_PTR(&dir->mbuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mbs_to_wbuf (dir, dir->ffb.achName, &dir->tbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_STR_PTR(&dir->tbuf);
|
||||
QSE_ASSERT (dir->flags & QSE_DIR_WCSPATH);
|
||||
if (mbs_to_wbuf (dir, dir->ffb.achName, &dir->wbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_WCS_PTR(&dir->wbuf);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
rc = DosFindNext (dir->h, &dir->ffb, QSE_SIZEOF(dir->ffb), &dir->count);
|
||||
if (rc == ERROR_NO_MORE_FILES) dir->count = 0;
|
||||
@ -700,29 +767,18 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
if (qse_str_cpy (&dir->tbuf, dir->f.name) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
*name = QSE_STR_PTR(&dir->tbuf);
|
||||
#else
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
{
|
||||
if (qse_mbs_cpy (&dir->mbuf, dir->f.name) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
if (mbs_to_mbuf (dir, dir->f.name, &dir->mbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_MBS_PTR(&dir->mbuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mbs_to_wbuf (dir, dir->f.name, &dir->tbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_STR_PTR(&dir->tbuf);
|
||||
QSE_ASSERT (dir->flags & QSE_DIR_WCSPATH);
|
||||
|
||||
if (mbs_to_wbuf (dir, dir->f.name, &dir->wbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_WCS_PTR(&dir->wbuf);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (_dos_findnext (&dir->f) != 0)
|
||||
{
|
||||
@ -760,30 +816,18 @@ read:
|
||||
IS_PREVDIR_M(de->d_name)) goto read;
|
||||
}
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
if (qse_str_cpy (&dir->tbuf, de->d_name) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*name = QSE_STR_PTR(&dir->tbuf);
|
||||
#else
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
{
|
||||
if (qse_mbs_cpy (&dir->mbuf, de->d_name) == (qse_size_t)-1)
|
||||
{
|
||||
dir->errnum = QSE_DIR_ENOMEM;
|
||||
return -1;
|
||||
}
|
||||
if (mbs_to_mbuf (dir, de->d_name, &dir->mbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_MBS_PTR(&dir->mbuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mbs_to_wbuf (dir, de->d_name, &dir->tbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_STR_PTR(&dir->tbuf);
|
||||
QSE_ASSERT (dir->flags & QSE_DIR_WCSPATH);
|
||||
|
||||
if (mbs_to_wbuf (dir, de->d_name, &dir->wbuf) == QSE_NULL) return -1;
|
||||
*name = QSE_WCS_PTR(&dir->wbuf);
|
||||
}
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
/* ------------------------------------------------------------------- */
|
||||
@ -798,19 +842,15 @@ static int read_ahead_and_sort (qse_dir_t* dir, const qse_char_t* path)
|
||||
|
||||
while (1)
|
||||
{
|
||||
x = read_dir_to_tbuf (dir, &name);
|
||||
x = read_dir_to_buf (dir, &name);
|
||||
if (x >= 1)
|
||||
{
|
||||
qse_size_t size;
|
||||
|
||||
#if defined(QSE_CHAR_IS_MCHAR)
|
||||
size = (qse_mbslen(name) + 1) * QSE_SIZEOF(qse_mchar_t);
|
||||
#else
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
size = (qse_mbslen(name) + 1) * QSE_SIZEOF(qse_mchar_t);
|
||||
else
|
||||
size = (qse_wcslen(name) + 1) * QSE_SIZEOF(qse_wchar_t);
|
||||
#endif
|
||||
|
||||
if (qse_lda_pushheap (dir->stab, name, size) == (qse_size_t)-1)
|
||||
{
|
||||
@ -846,7 +886,7 @@ int qse_dir_read (qse_dir_t* dir, qse_dir_ent_t* ent)
|
||||
int x;
|
||||
void* name;
|
||||
|
||||
x = read_dir_to_tbuf (dir, &name);
|
||||
x = read_dir_to_buf (dir, &name);
|
||||
if (x >= 1)
|
||||
{
|
||||
QSE_MEMSET (ent, 0, QSE_SIZEOF(ent));
|
||||
|
@ -31,7 +31,7 @@
|
||||
* qse_dir_xxx() and qse_glob() don't support mbs and wcs separately.
|
||||
* while the functions here support them. */
|
||||
|
||||
static int delete_file_from_fs (qse_fs_t* fs, const qse_fs_char_t* fspath)
|
||||
int qse_fs_sysrmfile (qse_fs_t* fs, const qse_fs_char_t* fspath)
|
||||
{
|
||||
|
||||
#if defined(_WIN32)
|
||||
@ -74,7 +74,7 @@ static int delete_file_from_fs (qse_fs_t* fs, const qse_fs_char_t* fspath)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int delete_directory_from_fs (qse_fs_t* fs, const qse_fs_char_t* fspath)
|
||||
int qse_fs_sysrmdir (qse_fs_t* fs, const qse_fs_char_t* fspath)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
|
||||
@ -138,7 +138,7 @@ static int delete_file (qse_fs_t* fs, const qse_char_t* path, int purge)
|
||||
fspath = qse_fs_makefspath(fs, path);
|
||||
if (!fspath) return -1;
|
||||
|
||||
ret = delete_file_from_fs (fs, fspath);
|
||||
ret = qse_fs_sysrmfile (fs, fspath);
|
||||
qse_fs_freefspath (fs, path, fspath);
|
||||
|
||||
if (ret <= -1 && purge)
|
||||
@ -176,7 +176,7 @@ static int delete_directory_nocbs (qse_fs_t* fs, const qse_char_t* path)
|
||||
fspath = qse_fs_makefspath(fs, path);
|
||||
if (!fspath) return -1;
|
||||
|
||||
ret = delete_directory_from_fs (fs, fspath);
|
||||
ret = qse_fs_sysrmdir (fs, fspath);
|
||||
qse_fs_freefspath (fs, path, fspath);
|
||||
|
||||
return ret;
|
||||
@ -301,8 +301,8 @@ static int delete_from_fs_with_mbs (qse_fs_t* fs, const qse_mchar_t* path, int d
|
||||
if (x == 0) return 0; /* skipped */
|
||||
}
|
||||
|
||||
ret = dir? delete_directory_from_fs (fs, fspath):
|
||||
delete_file_from_fs (fs, fspath);
|
||||
ret = dir? qse_fs_sysrmdir (fs, fspath):
|
||||
qse_fs_sysrmfile (fs, fspath);
|
||||
|
||||
qse_fs_freefspathformbs (fs, path, fspath);
|
||||
|
||||
@ -337,8 +337,8 @@ static int delete_from_fs_with_wcs (qse_fs_t* fs, const qse_wchar_t* path, int d
|
||||
fspath = qse_fs_makefspathforwcs (fs, path);
|
||||
if (!fspath) return -1;
|
||||
|
||||
ret = dir? delete_directory_from_fs (fs, fspath):
|
||||
delete_file_from_fs (fs, fspath);
|
||||
ret = dir? qse_fs_sysrmdir (fs, fspath):
|
||||
qse_fs_sysrmfile (fs, fspath);
|
||||
|
||||
qse_fs_freefspathforwcs (fs, path, fspath);
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
||||
|
||||
#include "fs.h"
|
||||
|
||||
static int make_directory_in_fs (qse_fs_t* fs, const qse_fs_char_t* fspath)
|
||||
int qse_fs_sysmkdir (qse_fs_t* fs, const qse_fs_char_t* fspath)
|
||||
{
|
||||
|
||||
#if defined(_WIN32)
|
||||
@ -78,7 +78,7 @@ static int make_directory_in_fs (qse_fs_t* fs, const qse_fs_char_t* fspath)
|
||||
|
||||
#else
|
||||
|
||||
if (QSE_MKDIR (fspath, 0755) <= -1)
|
||||
if (QSE_MKDIR (fspath, 0777) <= -1) /* TODO: proper mode?? */
|
||||
{
|
||||
fs->errnum = qse_fs_syserrtoerrnum (fs, errno);
|
||||
return -1;
|
||||
@ -120,7 +120,7 @@ static int make_directory_chain (qse_fs_t* fs, qse_fs_char_t* fspath)
|
||||
c = *(p + 1);
|
||||
*(p + 1) = QSE_FS_T('\0');
|
||||
#endif
|
||||
ret = make_directory_in_fs (fs, fspath);
|
||||
ret = qse_fs_sysmkdir (fs, fspath);
|
||||
if (ret <= -1 && fs->errnum != QSE_FS_EEXIST)
|
||||
{
|
||||
return -1;
|
||||
@ -134,7 +134,7 @@ static int make_directory_chain (qse_fs_t* fs, qse_fs_char_t* fspath)
|
||||
}
|
||||
}
|
||||
|
||||
if (!IS_FSPATHSEP(*(p - 1))) ret = make_directory_in_fs (fs, fspath);
|
||||
if (!IS_FSPATHSEP(*(p - 1))) ret = qse_fs_sysmkdir (fs, fspath);
|
||||
|
||||
done:
|
||||
return ret;
|
||||
@ -165,7 +165,7 @@ int qse_fs_mkdirmbs (qse_fs_t* fs, const qse_mchar_t* path, int flags)
|
||||
fspath = (qse_fs_char_t*)qse_fs_makefspathformbs (fs, path);
|
||||
if (!fspath) return -1;
|
||||
|
||||
ret = make_directory_in_fs (fs, fspath);
|
||||
ret = qse_fs_sysmkdir (fs, fspath);
|
||||
}
|
||||
|
||||
qse_fs_freefspathformbs (fs, path, fspath);
|
||||
@ -198,7 +198,7 @@ int qse_fs_mkdirwcs (qse_fs_t* fs, const qse_wchar_t* path, int flags)
|
||||
fspath = (qse_fs_char_t*)qse_fs_makefspathforwcs (fs, path);
|
||||
if (!fspath) return -1;
|
||||
|
||||
ret = make_directory_in_fs (fs, fspath);
|
||||
ret = qse_fs_sysmkdir (fs, fspath);
|
||||
}
|
||||
|
||||
qse_fs_freefspathforwcs (fs, path, fspath);
|
||||
|
@ -367,6 +367,7 @@ oops:
|
||||
#endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int move_file_in_fs (qse_fs_t* fs, const qse_fs_char_t* oldpath, const qse_fs_char_t* newpath, int flags)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
@ -458,3 +459,5 @@ static int move_file_in_fs (qse_fs_t* fs, const qse_fs_char_t* oldpath, const qs
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -818,11 +818,21 @@ void qse_fs_freefspathforwcs (qse_fs_t* fs, const qse_wchar_t* path, qse_fs_char
|
||||
int qse_fs_getattr (qse_fs_t* fs, const qse_fs_char_t* fspath, qse_fs_attr_t* attr)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
#error TODO
|
||||
|
||||
fs->errnum = QSE_FS_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
#elif defined(__OS2__)
|
||||
#error TODO
|
||||
|
||||
/* TODO */
|
||||
fs->errnum = QSE_FS_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
#elif defined(__DOS__)
|
||||
#error TODO
|
||||
|
||||
fs->errnum = QSE_FS_ENOIMPL;
|
||||
return -1;
|
||||
|
||||
#else
|
||||
#if defined(HAVE_LSTAT)
|
||||
qse_lstat_t st;
|
||||
|
@ -150,6 +150,21 @@ int qse_fs_getattr (
|
||||
qse_fs_attr_t* attr
|
||||
);
|
||||
|
||||
int qse_fs_sysmkdir (
|
||||
qse_fs_t* fs,
|
||||
const qse_fs_char_t* fspath
|
||||
);
|
||||
|
||||
int qse_fs_sysrmfile (
|
||||
qse_fs_t* fs,
|
||||
const qse_fs_char_t* fspath
|
||||
);
|
||||
|
||||
int qse_fs_sysrmdir (
|
||||
qse_fs_t* fs,
|
||||
const qse_fs_char_t* fspath
|
||||
);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
@ -1,39 +1,104 @@
|
||||
#include <qse/cmn/dir.h>
|
||||
#include <qse/cmn/main.h>
|
||||
#include <qse/cmn/mbwc.h>
|
||||
#include <qse/cmn/stdio.h>
|
||||
#include <qse/cmn/sio.h>
|
||||
#include <qse/cmn/mem.h>
|
||||
|
||||
#include <qse/cmn/str.h>
|
||||
#include <qse/cmn/fmt.h>
|
||||
#include <locale.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
static int test_main (int argc, qse_char_t* argv[])
|
||||
static int list_dir (int argc, qse_char_t* argv[], int flags)
|
||||
{
|
||||
qse_dir_t* dir;
|
||||
qse_dir_t* dir = QSE_NULL;
|
||||
qse_dir_ent_t dirent;
|
||||
void* xpath = QSE_NULL;
|
||||
void* xdirpath;
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
if (flags & QSE_DIR_MBSPATH)
|
||||
xdirpath = QSE_MT(".");
|
||||
else
|
||||
xdirpath = QSE_WT(".");
|
||||
|
||||
dir = qse_dir_open (QSE_MMGR_GETDFL(), 0, xdirpath, flags, QSE_NULL);
|
||||
if (!dir)
|
||||
{
|
||||
qse_printf (QSE_T("Cannot open .\n"));
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (flags & QSE_DIR_MBSPATH)
|
||||
xpath = qse_strtombsdup (argv[1], QSE_MMGR_GETDFL());
|
||||
else
|
||||
xpath = qse_strtowcsdup (argv[1], QSE_MMGR_GETDFL());
|
||||
|
||||
xdirpath = xpath;
|
||||
dir = qse_dir_open (QSE_MMGR_GETDFL(), 0, xdirpath, flags, QSE_NULL);
|
||||
if (!dir)
|
||||
{
|
||||
qse_printf (QSE_T("Cannot open %s\n"), argv[1]);
|
||||
goto oops;
|
||||
}
|
||||
}
|
||||
|
||||
dir = qse_dir_open (QSE_MMGR_GETDFL(), 0, (argc < 2? QSE_T("."): argv[1]), QSE_DIR_SORT, QSE_NULL);
|
||||
|
||||
while (qse_dir_read (dir, &dirent) > 0)
|
||||
{
|
||||
qse_printf (QSE_T("%s\n"), dirent.name);
|
||||
if (flags & QSE_DIR_MBSPATH)
|
||||
qse_printf (QSE_T("%hs\n"), dirent.name);
|
||||
else
|
||||
qse_printf (QSE_T("%ls\n"), dirent.name);
|
||||
}
|
||||
|
||||
qse_printf (QSE_T("----------------------------------------\n"));
|
||||
qse_dir_reset (dir, (argc < 2? QSE_T("."): argv[1]));
|
||||
if (qse_dir_reset (dir, xdirpath) <= -1)
|
||||
{
|
||||
qse_printf (QSE_T("Cannot reset\n"));
|
||||
goto oops;
|
||||
}
|
||||
|
||||
|
||||
while (qse_dir_read (dir, &dirent) > 0)
|
||||
{
|
||||
qse_printf (QSE_T("%s\n"), dirent.name);
|
||||
if (flags & QSE_DIR_MBSPATH)
|
||||
qse_printf (QSE_T("%hs\n"), dirent.name);
|
||||
else
|
||||
qse_printf (QSE_T("%ls\n"), dirent.name);
|
||||
}
|
||||
|
||||
QSE_MMGR_FREE(QSE_MMGR_GETDFL(), xpath);
|
||||
qse_dir_close (dir);
|
||||
return 0;
|
||||
|
||||
oops:
|
||||
if (xpath) QSE_MMGR_FREE(QSE_MMGR_GETDFL(), xpath);
|
||||
if (dir) qse_dir_close(dir);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int dir_main (int argc, qse_char_t* argv[])
|
||||
{
|
||||
if (list_dir (argc, argv, QSE_DIR_MBSPATH) <= -1) return -1;
|
||||
qse_printf (QSE_T("===============================\n"));
|
||||
if (list_dir (argc, argv, QSE_DIR_MBSPATH | QSE_DIR_SORT) <= -1) return -1;
|
||||
qse_printf (QSE_T("===============================\n"));
|
||||
if (list_dir (argc, argv, QSE_DIR_WCSPATH) <= -1) return -1;
|
||||
qse_printf (QSE_T("===============================\n"));
|
||||
if (list_dir (argc, argv, QSE_DIR_WCSPATH | QSE_DIR_SORT) <= -1) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qse_main (int argc, qse_achar_t* argv[])
|
||||
{
|
||||
int x;
|
||||
|
||||
#if defined(_WIN32)
|
||||
char locale[100];
|
||||
UINT codepage = GetConsoleOutputCP();
|
||||
@ -44,7 +109,9 @@ int qse_main (int argc, qse_achar_t* argv[])
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (locale, ".%u", (unsigned int)codepage);
|
||||
/* .codepage */
|
||||
qse_fmtuintmaxtombs (locale, QSE_COUNTOF(locale),
|
||||
codepage, 10, -1, QSE_MT('\0'), QSE_MT("."));
|
||||
setlocale (LC_ALL, locale);
|
||||
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
|
||||
}
|
||||
@ -52,6 +119,13 @@ int qse_main (int argc, qse_achar_t* argv[])
|
||||
setlocale (LC_ALL, "");
|
||||
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
|
||||
#endif
|
||||
return qse_runmain (argc, argv, test_main);
|
||||
|
||||
qse_openstdsios ();
|
||||
|
||||
x = qse_runmain (argc, argv, dir_main);
|
||||
|
||||
qse_closestdsios ();
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
|
@ -5,8 +5,12 @@
|
||||
#include <qse/cmn/path.h>
|
||||
#include <qse/cmn/main.h>
|
||||
#include <qse/cmn/mbwc.h>
|
||||
#include <qse/cmn/fmt.h>
|
||||
#include <locale.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
static int fs_del (qse_fs_t* fs, const qse_char_t* path)
|
||||
{
|
||||
@ -110,7 +114,9 @@ int main (int argc, qse_achar_t* argv[])
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (locale, ".%u", (unsigned int)codepage);
|
||||
/* .codepage */
|
||||
qse_fmtuintmaxtombs (locale, QSE_COUNTOF(locale),
|
||||
codepage, 10, -1, QSE_MT('\0'), QSE_MT("."));
|
||||
setlocale (LC_ALL, locale);
|
||||
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
|
||||
}
|
||||
|
@ -6,8 +6,12 @@
|
||||
#include <qse/cmn/main.h>
|
||||
#include <qse/cmn/mbwc.h>
|
||||
#include <qse/cmn/opt.h>
|
||||
#include <qse/cmn/fmt.h>
|
||||
#include <locale.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
static void print_usage (const qse_char_t* argv0)
|
||||
{
|
||||
@ -109,7 +113,9 @@ int main (int argc, qse_achar_t* argv[])
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (locale, ".%u", (unsigned int)codepage);
|
||||
/* .codepage */
|
||||
qse_fmtuintmaxtombs (locale, QSE_COUNTOF(locale),
|
||||
codepage, 10, -1, QSE_MT('\0'), QSE_MT("."));
|
||||
setlocale (LC_ALL, locale);
|
||||
qse_setdflcmgrbyid (QSE_CMGR_SLMB);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user