added sys::stat(). still incomplete

This commit is contained in:
2020-03-16 08:55:29 +00:00
parent 532de8ac48
commit 625cca9d1f
2 changed files with 100 additions and 7 deletions

View File

@ -2960,7 +2960,95 @@ static int fnc_symlink (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
}
/* ------------------------------------------------------------ */
/* TODO: fnc_stat */
static int fnc_stat (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{
sys_list_t* sys_list;
hawk_val_t* a0;
hawk_int_t rx;
sys_list = rtx_to_sys_list(rtx, fi);
a0 = hawk_rtx_getarg(rtx, 0);
#if defined(_WIN32)
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOIMPL, HAWK_NULL);
#elif defined(__OS2__)
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOIMPL, HAWK_NULL);
#elif defined(__DOS__)
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOIMPL, HAWK_NULL);
#else
{
hawk_bch_t* str1;
hawk_oow_t len1;
hawk_val_t* tmp;
hawk_stat_t stbuf;
hawk_val_map_data_t md[10];
hawk_int_t dev, ino, size;
int x;
str1 = hawk_rtx_getvalbcstr(rtx, a0, &len1);
if (!str1)
{
rx = copy_error_to_sys_list(rtx, sys_list);
goto done;
}
if (hawk_find_bchar(str1, len1, '\0'))
{
rx = set_error_on_sys_list(rtx, sys_list, HAWK_EINVAL, HAWK_NULL);
hawk_rtx_freevalbcstr (rtx, a0, str1);
goto done;
}
rx = HAWK_STAT(str1, &stbuf);
hawk_rtx_freevalbcstr (rtx, a0, str1);
if (rx <= -1)
{
rx = set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL);
goto done;
}
HAWK_MEMSET (md, 0, HAWK_SIZEOF(md));
md[0].key.ptr = HAWK_T("dev");
md[0].key.len = 3;
md[0].type = HAWK_VAL_MAP_DATA_INT;
dev = stbuf.st_dev;
md[0].vptr = &dev;
md[1].key.ptr = HAWK_T("ino");
md[1].key.len = 3;
md[1].type = HAWK_VAL_MAP_DATA_INT;
ino = stbuf.st_ino;
md[1].vptr = &ino;
md[2].key.ptr = HAWK_T("size");
md[2].key.len = 4;
md[3].type = HAWK_VAL_MAP_DATA_INT;
size = stbuf.st_size;
md[2].vptr = &size;
tmp = hawk_rtx_makemapvalwithdata(rtx, md);
if (!tmp) goto fail;
hawk_rtx_refupval (rtx, tmp);
x = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 1), tmp);
hawk_rtx_refdownval (rtx, tmp);
if (x <= -1)
{
fail:
rx = copy_error_to_sys_list(rtx, sys_list);
}
else
{
rx = ERRNUM_TO_RC(HAWK_ENOERR);
}
}
done:
#endif
HAWK_ASSERT (HAWK_IN_QUICKINT_RANGE(rx));
hawk_rtx_setretval (rtx, hawk_rtx_makeintval(rtx, rx));
return 0;
}
#if 0
TODO: fnc_utime
@ -4324,6 +4412,7 @@ static fnctab_t fnctab[] =
{ HAWK_T("sleep"), { { 1, 1, HAWK_NULL }, fnc_sleep, 0 } },
{ HAWK_T("sockaddrdom"), { { 1, 1, HAWK_NULL }, fnc_sockaddrdom, 0 } },
{ HAWK_T("socket"), { { 3, 3, HAWK_NULL }, fnc_socket, 0 } },
{ HAWK_T("stat"), { { 2, 2, HAWK_T("vr") }, fnc_stat, 0 } },
{ HAWK_T("strftime"), { { 2, 3, HAWK_NULL }, fnc_strftime, 0 } },
{ HAWK_T("symlink"), { { 2, 2, HAWK_NULL }, fnc_symlink, 0 } },
{ HAWK_T("system"), { { 1, 1, HAWK_NULL }, fnc_system, 0 } },