added sys::resetdir() to awk
fixed bugs in qse_dir_reset()
This commit is contained in:
parent
ec930a92ab
commit
351736b43c
@ -1001,6 +1001,52 @@ static int fnc_readdir (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int fnc_resetdir (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||
{
|
||||
sys_list_t* sys_list;
|
||||
sys_node_t* sys_node;
|
||||
qse_awk_int_t rx = RC_ERROR;
|
||||
|
||||
sys_list = rtx_to_sys_list(rtx, fi);
|
||||
sys_node = get_sys_list_node_with_arg(rtx, sys_list, qse_awk_rtx_getarg(rtx, 0));
|
||||
|
||||
if (sys_node && sys_node->ctx.type == SYS_NODE_DATA_DIR)
|
||||
{
|
||||
qse_char_t* path;
|
||||
qse_awk_val_t* a1;
|
||||
|
||||
a1 = qse_awk_rtx_getarg(rtx, 1);
|
||||
path = qse_awk_rtx_getvalstr(rtx, a1, QSE_NULL);
|
||||
if (path)
|
||||
{
|
||||
if (qse_dir_reset(sys_node->ctx.u.dir, path) <= -1)
|
||||
{
|
||||
rx = direrr_to_rc(qse_dir_geterrnum(sys_node->ctx.u.dir));
|
||||
set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx));
|
||||
}
|
||||
else
|
||||
{
|
||||
rx = 0; /* success */
|
||||
qse_awk_rtx_freevalstr (rtx, a1, path);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rx = awkerr_to_rc(qse_awk_rtx_geterrnum(rtx));
|
||||
set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rx = RC_EINVAL;
|
||||
set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx));
|
||||
}
|
||||
|
||||
/* no error check for qse_awk_rtx_makeintval() here since ret
|
||||
* is 0 or -1. it will never fail for those numbers */
|
||||
qse_awk_rtx_setretval (rtx, qse_awk_rtx_makeintval(rtx, rx));
|
||||
return 0;
|
||||
}
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static int fnc_fork (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi)
|
||||
@ -2483,6 +2529,7 @@ static fnctab_t fnctab[] =
|
||||
{ QSE_T("pipe"), { { 2, 3, QSE_T("rrv") }, fnc_pipe, 0 } },
|
||||
{ QSE_T("read"), { { 2, 3, QSE_T("vrv") }, fnc_read, 0 } },
|
||||
{ QSE_T("readdir"), { { 2, 2, QSE_T("vr") }, fnc_readdir, 0 } },
|
||||
{ QSE_T("resetdir"), { { 2, 2, QSE_NULL }, fnc_resetdir, 0 } },
|
||||
{ QSE_T("settime"), { { 1, 1, QSE_NULL }, fnc_settime, 0 } },
|
||||
{ QSE_T("sleep"), { { 1, 1, QSE_NULL }, fnc_sleep, 0 } },
|
||||
{ QSE_T("strftime"), { { 2, 3, QSE_NULL }, fnc_strftime, 0 } },
|
||||
|
@ -430,6 +430,8 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
#if defined(_WIN32)
|
||||
/* ------------------------------------------------------------------- */
|
||||
const qse_char_t* tptr;
|
||||
HANDLE dh;
|
||||
WIN32_FIND_DATA wfd;
|
||||
|
||||
dir->status &= ~STATUS_DONE;
|
||||
dir->status &= ~STATUS_DONE_ERR;
|
||||
@ -463,13 +465,17 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
}
|
||||
if (tptr == QSE_NULL) return -1;
|
||||
|
||||
dir->h = FindFirstFile (tptr, &dir->wfd);
|
||||
if (dir->h == INVALID_HANDLE_VALUE)
|
||||
dh = FindFirstFile(tptr, &wfd);
|
||||
if (dh == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
dir->errnum = syserr_to_errnum (GetLastError());
|
||||
return -1;
|
||||
}
|
||||
|
||||
close_dir_safely (dir);
|
||||
|
||||
dir->h = dh;
|
||||
dir->wfd = wfd;
|
||||
return 0;
|
||||
/* ------------------------------------------------------------------- */
|
||||
|
||||
@ -478,9 +484,13 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
/* ------------------------------------------------------------------- */
|
||||
APIRET rc;
|
||||
const qse_mchar_t* mptr;
|
||||
|
||||
dir->h = HDIR_CREATE;
|
||||
dir->count = 1;
|
||||
HDIR h = HDIR_CREATE;
|
||||
#if defined(FIL_STANDARDL)
|
||||
FILEFINDBUF3L ffb = { 0 };
|
||||
#else
|
||||
FILEFINDBUF3 ffb = { 0 };
|
||||
#endif
|
||||
ULONG count = 1;
|
||||
|
||||
if (dir->flags & QSE_DIR_MBSPATH)
|
||||
{
|
||||
@ -499,11 +509,11 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
|
||||
rc = DosFindFirst (
|
||||
mptr,
|
||||
&dir->h,
|
||||
&h,
|
||||
FILE_DIRECTORY | FILE_READONLY,
|
||||
&dir->ffb,
|
||||
&ffb,
|
||||
QSE_SIZEOF(dir->ffb),
|
||||
&dir->count,
|
||||
&count,
|
||||
#if defined(FIL_STANDARDL)
|
||||
FIL_STANDARDL
|
||||
#else
|
||||
@ -517,6 +527,11 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
return -1;
|
||||
}
|
||||
|
||||
close_dir_safely (dir);
|
||||
|
||||
dir->h = h;
|
||||
dir->ffb = ffb;
|
||||
dir->count = count;
|
||||
dir->status |= STATUS_OPENED;
|
||||
return 0;
|
||||
/* ------------------------------------------------------------------- */
|
||||
@ -526,6 +541,7 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
/* ------------------------------------------------------------------- */
|
||||
unsigned int rc;
|
||||
const qse_mchar_t* mptr;
|
||||
struct find_t f;
|
||||
|
||||
dir->status &= ~STATUS_DONE;
|
||||
dir->status &= ~STATUS_DONE_ERR;
|
||||
@ -546,13 +562,16 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
}
|
||||
if (mptr == QSE_NULL) return -1;
|
||||
|
||||
rc = _dos_findfirst(mptr, _A_NORMAL | _A_SUBDIR, &dir->f);
|
||||
rc = _dos_findfirst(mptr, _A_NORMAL | _A_SUBDIR, &f);
|
||||
if (rc != 0)
|
||||
{
|
||||
dir->errnum = syserr_to_errnum(errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
close_dir_safely (dir);
|
||||
|
||||
dir->f = f;
|
||||
dir->status |= STATUS_OPENED;
|
||||
return 0;
|
||||
/* ------------------------------------------------------------------- */
|
||||
@ -592,6 +611,8 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
return -1;
|
||||
}
|
||||
|
||||
close_dir_safely (dir);
|
||||
|
||||
dir->dp = dp;
|
||||
return 0;
|
||||
#endif
|
||||
@ -599,7 +620,6 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
|
||||
|
||||
int qse_dir_reset (qse_dir_t* dir, const qse_char_t* path)
|
||||
{
|
||||
close_dir_safely (dir);
|
||||
if (reset_to_path(dir, path) <= -1) return -1;
|
||||
|
||||
if (dir->flags & QSE_DIR_SORT)
|
||||
|
Loading…
Reference in New Issue
Block a user