added sys::dirname() and sys::basename()
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-12-22 02:05:09 +09:00
parent 488839f761
commit 33ba979512
8 changed files with 185 additions and 102 deletions

View File

@@ -1,7 +1,8 @@
AUTOMAKE_OPTION = foreign AUTOMAKE_OPTION = foreign
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = EXTRA_DIST = go.mod
SUBDIRS = SUBDIRS =
SUBDIRS += tools lib mod bin samples t SUBDIRS += tools lib mod bin samples t

View File

@@ -374,7 +374,7 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
AUTOMAKE_OPTION = foreign AUTOMAKE_OPTION = foreign
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = EXTRA_DIST = go.mod
SUBDIRS = tools lib mod bin samples t SUBDIRS = tools lib mod bin samples t
#if ENABLE_STATIC_MODULE #if ENABLE_STATIC_MODULE
#SUBDIRS += tools mod lib bin samples t #SUBDIRS += tools mod lib bin samples t

View File

@@ -251,7 +251,7 @@ HawkStd::Run* HawkStd::parse (Source& in, Source& out)
int HawkStd::build_argcv (Run* run) int HawkStd::build_argcv (Run* run)
{ {
Value argv (run); Value argv(run);
for (hawk_oow_t i = 0; i < this->runarg.len; i++) for (hawk_oow_t i = 0; i < this->runarg.len; i++)
{ {

View File

@@ -67,7 +67,7 @@ static hawk_bch_t* wcs_to_mbuf (hawk_gem_t* g, const hawk_uch_t* wcs, hawk_becs_
if (hawk_gem_convutobcstr(g, wcs, &wl, HAWK_NULL, &ml) <= -1 || if (hawk_gem_convutobcstr(g, wcs, &wl, HAWK_NULL, &ml) <= -1 ||
hawk_becs_setlen(mbuf, ml) == (hawk_oow_t)-1) return HAWK_NULL; hawk_becs_setlen(mbuf, ml) == (hawk_oow_t)-1) return HAWK_NULL;
hawk_gem_convutobcstr (g, wcs, &wl, HAWK_BECS_PTR(mbuf), &ml); hawk_gem_convutobcstr(g, wcs, &wl, HAWK_BECS_PTR(mbuf), &ml);
return HAWK_BECS_PTR(mbuf); return HAWK_BECS_PTR(mbuf);
} }
@@ -98,7 +98,7 @@ static int upath_exists (hawk_gem_t* g, const hawk_uch_t* name, hawk_becs_t* mbu
mptr = wcs_to_mbuf(g, name, mbuf); mptr = wcs_to_mbuf(g, name, mbuf);
if (HAWK_UNLIKELY(!mptr)) return -1; if (HAWK_UNLIKELY(!mptr)) return -1;
x = _dos_getfileattr (mptr, &attr); x = _dos_getfileattr(mptr, &attr);
return (x == 0)? 1: ((errno == ENOENT)? 0: -1); return (x == 0)? 1: ((errno == ENOENT)? 0: -1);
#elif defined(macintosh) #elif defined(macintosh)
@@ -108,10 +108,10 @@ static int upath_exists (hawk_gem_t* g, const hawk_uch_t* name, hawk_becs_t* mbu
mptr = wcs_to_mbuf(g, name, mbuf); mptr = wcs_to_mbuf(g, name, mbuf);
if (HAWK_UNLIKELY(!mptr)) return -1; if (HAWK_UNLIKELY(!mptr)) return -1;
HAWK_MEMSET (&fpb, 0, HAWK_SIZEOF(fpb)); HAWK_MEMSET(&fpb, 0, HAWK_SIZEOF(fpb));
fpb.ioNamePtr = (unsigned char*)mptr; fpb.ioNamePtr = (unsigned char*)mptr;
return (PBGetCatInfoSync ((CInfoPBRec*)&fpb) == noErr)? 1: 0; return (PBGetCatInfoSync((CInfoPBRec*)&fpb) == noErr)? 1: 0;
#else #else
struct stat st; struct stat st;
const hawk_bch_t* mptr; const hawk_bch_t* mptr;
@@ -147,7 +147,7 @@ static int bpath_exists (hawk_gem_t* g, const hawk_bch_t* name, hawk_becs_t* mbu
#elif defined(macintosh) #elif defined(macintosh)
HFileInfo fpb; HFileInfo fpb;
HAWK_MEMSET (&fpb, 0, HAWK_SIZEOF(fpb)); HAWK_MEMSET(&fpb, 0, HAWK_SIZEOF(fpb));
fpb.ioNamePtr = (unsigned char*)name; fpb.ioNamePtr = (unsigned char*)name;
return (PBGetCatInfoSync((CInfoPBRec*)&fpb) == noErr)? 1: 0; return (PBGetCatInfoSync((CInfoPBRec*)&fpb) == noErr)? 1: 0;
#else #else
@@ -162,9 +162,6 @@ static int bpath_exists (hawk_gem_t* g, const hawk_bch_t* name, hawk_becs_t* mbu
#endif #endif
} }
#if defined(NO_RECURSION) #if defined(NO_RECURSION)
typedef struct __u_stack_node_t __u_stack_node_t; typedef struct __u_stack_node_t __u_stack_node_t;
#endif #endif
@@ -303,7 +300,7 @@ static int __u_get_next_segment (__u_glob_t* g, __u_segment_t* seg)
} }
else else
{ {
HAWK_ASSERT (seg->type == NORMAL); HAWK_ASSERT(seg->type == NORMAL);
seg->ptr = &seg->ptr[seg->len + 1]; seg->ptr = &seg->ptr[seg->len + 1];
seg->len = 0; seg->len = 0;
@@ -344,9 +341,9 @@ static int __u_handle_non_wild_segments (__u_glob_t* g, __u_segment_t* seg)
{ {
while (__u_get_next_segment(g, seg) != NONE && !seg->wild) while (__u_get_next_segment(g, seg) != NONE && !seg->wild)
{ {
HAWK_ASSERT (seg->type != NONE && !seg->wild); HAWK_ASSERT(seg->type != NONE && !seg->wild);
if (seg->sep && hawk_uecs_ccat (&g->path, seg->sep) == (hawk_oow_t)-1) return -1; if (seg->sep && hawk_uecs_ccat(&g->path, seg->sep) == (hawk_oow_t)-1) return -1;
if (seg->esc) if (seg->esc)
{ {
/* if the segment contains escape sequences, /* if the segment contains escape sequences,
@@ -358,7 +355,7 @@ static int __u_handle_non_wild_segments (__u_glob_t* g, __u_segment_t* seg)
int escaped = 0; int escaped = 0;
if (HAWK_UECS_CAPA(&g->tbuf) < seg->len && if (HAWK_UECS_CAPA(&g->tbuf) < seg->len &&
hawk_uecs_setcapa (&g->tbuf, seg->len) == (hawk_oow_t)-1) return -1; hawk_uecs_setcapa(&g->tbuf, seg->len) == (hawk_oow_t)-1) return -1;
tmp.ptr = HAWK_UECS_PTR(&g->tbuf); tmp.ptr = HAWK_UECS_PTR(&g->tbuf);
tmp.len = 0; tmp.len = 0;
@@ -381,13 +378,13 @@ static int __u_handle_non_wild_segments (__u_glob_t* g, __u_segment_t* seg)
} }
} }
if (hawk_uecs_ncat (&g->path, tmp.ptr, tmp.len) == (hawk_oow_t)-1) return -1; if (hawk_uecs_ncat(&g->path, tmp.ptr, tmp.len) == (hawk_oow_t)-1) return -1;
} }
else else
{ {
/* if the segment doesn't contain escape sequences, /* if the segment doesn't contain escape sequences,
* append the segment to the path without special handling */ * append the segment to the path without special handling */
if (hawk_uecs_ncat (&g->path, seg->ptr, seg->len) == (hawk_oow_t)-1) return -1; if (hawk_uecs_ncat(&g->path, seg->ptr, seg->len) == (hawk_oow_t)-1) return -1;
} }
if (!seg->next && upath_exists(g->gem, HAWK_UECS_PTR(&g->path), &g->mbuf) > 0) if (!seg->next && upath_exists(g->gem, HAWK_UECS_PTR(&g->path), &g->mbuf) > 0)
@@ -434,7 +431,7 @@ entry:
while (1) while (1)
{ {
hawk_uecs_setlen (&g->path, tmp2); hawk_uecs_setlen(&g->path, tmp2);
x = hawk_dir_read(dp, &ent); x = hawk_dir_read(dp, &ent);
if (x <= -1) if (x <= -1)
@@ -497,12 +494,12 @@ entry:
} }
} }
hawk_uecs_setlen (&g->path, tmp); hawk_uecs_setlen(&g->path, tmp);
hawk_dir_close (dp); dp = HAWK_NULL; hawk_dir_close(dp); dp = HAWK_NULL;
} }
} }
HAWK_ASSERT (dp == HAWK_NULL); HAWK_ASSERT(dp == HAWK_NULL);
#if defined(NO_RECURSION) #if defined(NO_RECURSION)
if (g->stack) if (g->stack)
@@ -531,29 +528,29 @@ entry:
/* destory the free list */ /* destory the free list */
r = g->free; r = g->free;
g->free = r->next; g->free = r->next;
hawk_gem_freemem (g->gem, r); hawk_gem_freemem(g->gem, r);
} }
#endif #endif
return 0; return 0;
oops: oops:
if (dp) hawk_dir_close (dp); if (dp) hawk_dir_close(dp);
#if defined(NO_RECURSION) #if defined(NO_RECURSION)
while (g->stack) while (g->stack)
{ {
r = g->stack; r = g->stack;
g->stack = r->next; g->stack = r->next;
hawk_dir_close (r->dp); hawk_dir_close(r->dp);
hawk_gem_freemem (g->gem, r); hawk_gem_freemem(g->gem, r);
} }
while (g->free) while (g->free)
{ {
r = g->stack; r = g->stack;
g->free = r->next; g->free = r->next;
hawk_gem_freemem (g->gem, r); hawk_gem_freemem(g->gem, r);
} }
#endif #endif
return -1; return -1;
@@ -565,7 +562,7 @@ int hawk_gem_uglob (hawk_gem_t* gem, const hawk_uch_t* pattern, hawk_gem_uglob_c
__u_glob_t g; __u_glob_t g;
int x; int x;
HAWK_MEMSET (&g, 0, HAWK_SIZEOF(g)); HAWK_MEMSET(&g, 0, HAWK_SIZEOF(g));
g.gem = gem; g.gem = gem;
g.cbimpl = cbimpl; g.cbimpl = cbimpl;
g.cbctx = cbctx; g.cbctx = cbctx;
@@ -583,7 +580,7 @@ int hawk_gem_uglob (hawk_gem_t* gem, const hawk_uch_t* pattern, hawk_gem_uglob_c
if (hawk_uecs_init(&g.path, g.gem, 512) <= -1) return -1; if (hawk_uecs_init(&g.path, g.gem, 512) <= -1) return -1;
if (hawk_uecs_init(&g.tbuf, g.gem, 256) <= -1) if (hawk_uecs_init(&g.tbuf, g.gem, 256) <= -1)
{ {
hawk_uecs_fini (&g.path); hawk_uecs_fini(&g.path);
return -1; return -1;
} }
@@ -591,22 +588,22 @@ int hawk_gem_uglob (hawk_gem_t* gem, const hawk_uch_t* pattern, hawk_gem_uglob_c
{ {
if (hawk_becs_init(&g.mbuf, g.gem, 512) <= -1) if (hawk_becs_init(&g.mbuf, g.gem, 512) <= -1)
{ {
hawk_uecs_fini (&g.path); hawk_uecs_fini(&g.path);
hawk_uecs_fini (&g.path); hawk_uecs_fini(&g.path);
return -1; return -1;
} }
} }
HAWK_MEMSET (&seg, 0, HAWK_SIZEOF(seg)); HAWK_MEMSET(&seg, 0, HAWK_SIZEOF(seg));
seg.type = NONE; seg.type = NONE;
seg.ptr = pattern; seg.ptr = pattern;
seg.len = 0; seg.len = 0;
x = __u_search(&g, &seg); x = __u_search(&g, &seg);
if (HAWK_SIZEOF(hawk_uch_t) != HAWK_SIZEOF(hawk_uch_t)) hawk_becs_fini (&g.mbuf); if (HAWK_SIZEOF(hawk_uch_t) != HAWK_SIZEOF(hawk_uch_t)) hawk_becs_fini(&g.mbuf);
hawk_uecs_fini (&g.tbuf); hawk_uecs_fini(&g.tbuf);
hawk_uecs_fini (&g.path); hawk_uecs_fini(&g.path);
if (x <= -1) return -1; if (x <= -1) return -1;
return g.expanded; return g.expanded;
@@ -753,7 +750,7 @@ static int __b_get_next_segment (__b_glob_t* g, __b_segment_t* seg)
} }
else else
{ {
HAWK_ASSERT (seg->type == NORMAL); HAWK_ASSERT(seg->type == NORMAL);
seg->ptr = &seg->ptr[seg->len + 1]; seg->ptr = &seg->ptr[seg->len + 1];
seg->len = 0; seg->len = 0;
@@ -794,21 +791,20 @@ static int __b_handle_non_wild_segments (__b_glob_t* g, __b_segment_t* seg)
{ {
while (__b_get_next_segment(g, seg) != NONE && !seg->wild) while (__b_get_next_segment(g, seg) != NONE && !seg->wild)
{ {
HAWK_ASSERT (seg->type != NONE && !seg->wild); HAWK_ASSERT(seg->type != NONE && !seg->wild);
if (seg->sep && hawk_becs_ccat (&g->path, seg->sep) == (hawk_oow_t)-1) return -1; if (seg->sep && hawk_becs_ccat(&g->path, seg->sep) == (hawk_oow_t)-1) return -1;
if (seg->esc) if (seg->esc)
{ {
/* if the segment contains escape sequences, /* if the segment contains escape sequences,
* strip the escape letters off the segment */ * strip the escape letters off the segment */
hawk_bcs_t tmp; hawk_bcs_t tmp;
hawk_oow_t i; hawk_oow_t i;
int escaped = 0; int escaped = 0;
if (HAWK_BECS_CAPA(&g->tbuf) < seg->len && if (HAWK_BECS_CAPA(&g->tbuf) < seg->len &&
hawk_becs_setcapa (&g->tbuf, seg->len) == (hawk_oow_t)-1) return -1; hawk_becs_setcapa(&g->tbuf, seg->len) == (hawk_oow_t)-1) return -1;
tmp.ptr = HAWK_BECS_PTR(&g->tbuf); tmp.ptr = HAWK_BECS_PTR(&g->tbuf);
tmp.len = 0; tmp.len = 0;
@@ -831,13 +827,13 @@ static int __b_handle_non_wild_segments (__b_glob_t* g, __b_segment_t* seg)
} }
} }
if (hawk_becs_ncat (&g->path, tmp.ptr, tmp.len) == (hawk_oow_t)-1) return -1; if (hawk_becs_ncat(&g->path, tmp.ptr, tmp.len) == (hawk_oow_t)-1) return -1;
} }
else else
{ {
/* if the segment doesn't contain escape sequences, /* if the segment doesn't contain escape sequences,
* append the segment to the path without special handling */ * append the segment to the path without special handling */
if (hawk_becs_ncat (&g->path, seg->ptr, seg->len) == (hawk_oow_t)-1) return -1; if (hawk_becs_ncat(&g->path, seg->ptr, seg->len) == (hawk_oow_t)-1) return -1;
} }
if (!seg->next && bpath_exists(g->gem, HAWK_BECS_PTR(&g->path), &g->mbuf) > 0) if (!seg->next && bpath_exists(g->gem, HAWK_BECS_PTR(&g->path), &g->mbuf) > 0)
@@ -884,7 +880,7 @@ entry:
while (1) while (1)
{ {
hawk_becs_setlen (&g->path, tmp2); hawk_becs_setlen(&g->path, tmp2);
x = hawk_dir_read(dp, &ent); x = hawk_dir_read(dp, &ent);
if (x <= -1) if (x <= -1)
@@ -947,12 +943,12 @@ entry:
} }
} }
hawk_becs_setlen (&g->path, tmp); hawk_becs_setlen(&g->path, tmp);
hawk_dir_close (dp); dp = HAWK_NULL; hawk_dir_close(dp); dp = HAWK_NULL;
} }
} }
HAWK_ASSERT (dp == HAWK_NULL); HAWK_ASSERT(dp == HAWK_NULL);
#if defined(NO_RECURSION) #if defined(NO_RECURSION)
if (g->stack) if (g->stack)
@@ -981,29 +977,29 @@ entry:
/* destory the free list */ /* destory the free list */
r = g->free; r = g->free;
g->free = r->next; g->free = r->next;
hawk_gem_freemem (g->gem, r); hawk_gem_freemem(g->gem, r);
} }
#endif #endif
return 0; return 0;
oops: oops:
if (dp) hawk_dir_close (dp); if (dp) hawk_dir_close(dp);
#if defined(NO_RECURSION) #if defined(NO_RECURSION)
while (g->stack) while (g->stack)
{ {
r = g->stack; r = g->stack;
g->stack = r->next; g->stack = r->next;
hawk_dir_close (r->dp); hawk_dir_close(r->dp);
hawk_gem_freemem (g->gem, r); hawk_gem_freemem(g->gem, r);
} }
while (g->free) while (g->free)
{ {
r = g->stack; r = g->stack;
g->free = r->next; g->free = r->next;
hawk_gem_freemem (g->gem, r); hawk_gem_freemem(g->gem, r);
} }
#endif #endif
return -1; return -1;
@@ -1015,7 +1011,7 @@ int hawk_gem_bglob (hawk_gem_t* gem, const hawk_bch_t* pattern, hawk_gem_bglob_c
__b_glob_t g; __b_glob_t g;
int x; int x;
HAWK_MEMSET (&g, 0, HAWK_SIZEOF(g)); HAWK_MEMSET(&g, 0, HAWK_SIZEOF(g));
g.gem = gem; g.gem = gem;
g.cbimpl = cbimpl; g.cbimpl = cbimpl;
g.cbctx = cbctx; g.cbctx = cbctx;
@@ -1033,7 +1029,7 @@ int hawk_gem_bglob (hawk_gem_t* gem, const hawk_bch_t* pattern, hawk_gem_bglob_c
if (hawk_becs_init(&g.path, g.gem, 512) <= -1) return -1; if (hawk_becs_init(&g.path, g.gem, 512) <= -1) return -1;
if (hawk_becs_init(&g.tbuf, g.gem, 256) <= -1) if (hawk_becs_init(&g.tbuf, g.gem, 256) <= -1)
{ {
hawk_becs_fini (&g.path); hawk_becs_fini(&g.path);
return -1; return -1;
} }
@@ -1041,22 +1037,22 @@ int hawk_gem_bglob (hawk_gem_t* gem, const hawk_bch_t* pattern, hawk_gem_bglob_c
{ {
if (hawk_becs_init(&g.mbuf, g.gem, 512) <= -1) if (hawk_becs_init(&g.mbuf, g.gem, 512) <= -1)
{ {
hawk_becs_fini (&g.path); hawk_becs_fini(&g.path);
hawk_becs_fini (&g.path); hawk_becs_fini(&g.path);
return -1; return -1;
} }
} }
HAWK_MEMSET (&seg, 0, HAWK_SIZEOF(seg)); HAWK_MEMSET(&seg, 0, HAWK_SIZEOF(seg));
seg.type = NONE; seg.type = NONE;
seg.ptr = pattern; seg.ptr = pattern;
seg.len = 0; seg.len = 0;
x = __b_search(&g, &seg); x = __b_search(&g, &seg);
if (HAWK_SIZEOF(hawk_bch_t) != HAWK_SIZEOF(hawk_uch_t)) hawk_becs_fini (&g.mbuf); if (HAWK_SIZEOF(hawk_bch_t) != HAWK_SIZEOF(hawk_uch_t)) hawk_becs_fini(&g.mbuf);
hawk_becs_fini (&g.tbuf); hawk_becs_fini(&g.tbuf);
hawk_becs_fini (&g.path); hawk_becs_fini(&g.path);
if (x <= -1) return -1; if (x <= -1) return -1;
return g.expanded; return g.expanded;

View File

@@ -778,10 +778,23 @@ HAWK_EXPORT const hawk_bch_t* hawk_get_base_name_bcstr (
const hawk_bch_t* path const hawk_bch_t* path
); );
HAWK_EXPORT const hawk_uch_t* hawk_get_base_name_uchars (
const hawk_uch_t* path,
hawk_oow_t len
);
HAWK_EXPORT const hawk_bch_t* hawk_get_base_name_bchars (
const hawk_bch_t* path,
hawk_oow_t len
);
#if defined(HAWK_OOCH_IS_UCH) #if defined(HAWK_OOCH_IS_UCH)
# define hawk_get_base_name_oocstr hawk_get_base_name_ucstr # define hawk_get_base_name_oocstr hawk_get_base_name_ucstr
# define hawk_get_base_name_oochars hawk_get_base_name_uchars
#else #else
# define hawk_get_base_name_oocstr hawk_get_base_name_bcstr # define hawk_get_base_name_oocstr hawk_get_base_name_bcstr
# define hawk_get_base_name_ochars hawk_get_base_name_bchars
#endif #endif
/* ========================================================================= /* =========================================================================

View File

@@ -273,7 +273,7 @@ enum mux_evt_code_t
static hawk_int_t copy_error_to_sys_list (hawk_rtx_t* rtx, sys_list_t* sys_list) static hawk_int_t copy_error_to_sys_list (hawk_rtx_t* rtx, sys_list_t* sys_list)
{ {
hawk_errnum_t errnum = hawk_rtx_geterrnum(rtx); hawk_errnum_t errnum = hawk_rtx_geterrnum(rtx);
hawk_copy_oocstr (sys_list->ctx.errmsg, HAWK_COUNTOF(sys_list->ctx.errmsg), hawk_rtx_geterrmsg(rtx)); hawk_copy_oocstr(sys_list->ctx.errmsg, HAWK_COUNTOF(sys_list->ctx.errmsg), hawk_rtx_geterrmsg(rtx));
return ERRNUM_TO_RC(errnum); return ERRNUM_TO_RC(errnum);
} }
@@ -367,7 +367,7 @@ static void chain_sys_node_to_mux_node (sys_node_t* mux_node, sys_node_t* node)
sys_node_data_mux_t* mux_data = &mux_node->ctx.u.mux; sys_node_data_mux_t* mux_data = &mux_node->ctx.u.mux;
sys_node_data_file_t* file_data = &node->ctx.u.file; sys_node_data_file_t* file_data = &node->ctx.u.file;
HAWK_ASSERT (!(node->ctx.flags & SYS_NODE_DATA_FLAG_IN_MUX)); HAWK_ASSERT(!(node->ctx.flags & SYS_NODE_DATA_FLAG_IN_MUX));
node->ctx.flags |= SYS_NODE_DATA_FLAG_IN_MUX; node->ctx.flags |= SYS_NODE_DATA_FLAG_IN_MUX;
file_data->mux = mux_node; file_data->mux = mux_node;
@@ -384,7 +384,7 @@ static void unchain_sys_node_from_mux_node (sys_node_t* mux_node, sys_node_t* no
sys_node_data_mux_t* mux_data = &mux_node->ctx.u.mux; sys_node_data_mux_t* mux_data = &mux_node->ctx.u.mux;
sys_node_data_file_t* file_data = &node->ctx.u.file; sys_node_data_file_t* file_data = &node->ctx.u.file;
HAWK_ASSERT (node->ctx.flags & SYS_NODE_DATA_FLAG_IN_MUX); HAWK_ASSERT(node->ctx.flags & SYS_NODE_DATA_FLAG_IN_MUX);
node->ctx.flags &= ~SYS_NODE_DATA_FLAG_IN_MUX; node->ctx.flags &= ~SYS_NODE_DATA_FLAG_IN_MUX;
if (file_data->x_prev) ((sys_node_t*)file_data->x_prev)->ctx.u.file.x_next = file_data->x_next; if (file_data->x_prev) ((sys_node_t*)file_data->x_prev)->ctx.u.file.x_next = file_data->x_next;
@@ -501,7 +501,7 @@ static HAWK_INLINE rtx_data_t* rtx_to_data (hawk_rtx_t* rtx, const hawk_fnc_info
mod_ctx_t* mctx = (mod_ctx_t*)fi->mod->ctx; mod_ctx_t* mctx = (mod_ctx_t*)fi->mod->ctx;
hawk_rbt_pair_t* pair; hawk_rbt_pair_t* pair;
pair = hawk_rbt_search(mctx->rtxtab, &rtx, HAWK_SIZEOF(rtx)); pair = hawk_rbt_search(mctx->rtxtab, &rtx, HAWK_SIZEOF(rtx));
HAWK_ASSERT (pair != HAWK_NULL); HAWK_ASSERT(pair != HAWK_NULL);
return (rtx_data_t*)HAWK_RBT_VPTR(pair); return (rtx_data_t*)HAWK_RBT_VPTR(pair);
} }
@@ -637,7 +637,7 @@ static int fnc_open (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
goto fail; goto fail;
} }
rx = new_node->id; rx = new_node->id;
HAWK_ASSERT (rx >= 0); HAWK_ASSERT(rx >= 0);
} }
else else
{ {
@@ -650,7 +650,7 @@ static int fnc_open (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
rx = copy_error_to_sys_list(rtx, sys_list); rx = copy_error_to_sys_list(rtx, sys_list);
} }
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -686,14 +686,14 @@ static int fnc_openfd (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
if (!sys_node) goto fail; if (!sys_node) goto fail;
rx = sys_node->id; rx = sys_node->id;
HAWK_ASSERT (rx >= 0); HAWK_ASSERT(rx >= 0);
} }
else else
{ {
rx = set_error_on_sys_list(rtx, sys_list, HAWK_EINVAL, HAWK_T("invalid file descriptor %jd"), (hawk_intmax_t)fd); rx = set_error_on_sys_list(rtx, sys_list, HAWK_EINVAL, HAWK_T("invalid file descriptor %jd"), (hawk_intmax_t)fd);
} }
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -997,7 +997,7 @@ static int fnc_dup (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
done: done:
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); /* assume a file descriptor never gets larger than HAWK_INT_MAX */ HAWK_ASSERT(HAWK_IN_INT_RANGE(rx)); /* assume a file descriptor never gets larger than HAWK_INT_MAX */
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -1083,12 +1083,12 @@ static int fnc_flock (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t rx; hawk_int_t rx;
hawk_val_t* retv; hawk_val_t* retv;
HAWK_STATIC_ASSERT (FLOCK_GET != F_RDLCK); HAWK_STATIC_ASSERT(FLOCK_GET != F_RDLCK);
HAWK_STATIC_ASSERT (FLOCK_GET != F_WRLCK); HAWK_STATIC_ASSERT(FLOCK_GET != F_WRLCK);
HAWK_STATIC_ASSERT (FLOCK_GET != F_UNLCK); HAWK_STATIC_ASSERT(FLOCK_GET != F_UNLCK);
HAWK_STATIC_ASSERT (FLOCK_WAIT != F_RDLCK); HAWK_STATIC_ASSERT(FLOCK_WAIT != F_RDLCK);
HAWK_STATIC_ASSERT (FLOCK_WAIT != F_WRLCK); HAWK_STATIC_ASSERT(FLOCK_WAIT != F_WRLCK);
HAWK_STATIC_ASSERT (FLOCK_WAIT != F_UNLCK); HAWK_STATIC_ASSERT(FLOCK_WAIT != F_UNLCK);
sys_list = rtx_to_sys_list(rtx, fi); sys_list = rtx_to_sys_list(rtx, fi);
sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx); sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx);
@@ -1774,7 +1774,7 @@ static int fnc_opendir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
rx = copy_error_to_sys_list(rtx, sys_list); rx = copy_error_to_sys_list(rtx, sys_list);
} }
/*HAWK_ASSERT (HAWK_IN_INT_RANGE(rx));*/ /*HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));*/
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -2823,7 +2823,7 @@ done:
if (val) hawk_rtx_freevalbcstr(rtx, a1, val); if (val) hawk_rtx_freevalbcstr(rtx, a1, val);
if (var) hawk_rtx_freevalbcstr(rtx, a0, var); if (var) hawk_rtx_freevalbcstr(rtx, a0, var);
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -2865,7 +2865,7 @@ static int fnc_unsetenv (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
done: done:
if (str) hawk_rtx_freevalbcstr(rtx, a0, str); if (str) hawk_rtx_freevalbcstr(rtx, a0, str);
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3032,7 +3032,7 @@ static int fnc_system (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
done: done:
if (str) hawk_rtx_freevaloocstr(rtx, a0, str); if (str) hawk_rtx_freevaloocstr(rtx, a0, str);
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3081,7 +3081,7 @@ static int fnc_chroot (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
#endif #endif
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3133,7 +3133,7 @@ static int fnc_chmod (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
#endif #endif
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3213,7 +3213,7 @@ static int fnc_mkdir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
#endif #endif
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3289,7 +3289,7 @@ static int fnc_rmdir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
#endif #endif
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3367,7 +3367,7 @@ static int fnc_unlink (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
#endif #endif
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3415,7 +3415,7 @@ static int fnc_symlink (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
#endif #endif
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3584,7 +3584,7 @@ static int fnc_stat (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
done: done:
#endif #endif
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3649,7 +3649,7 @@ static int fnc_utime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
#endif #endif
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3705,7 +3705,7 @@ static int fnc_openmux (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOIMPL, HAWK_NULL); rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOIMPL, HAWK_NULL);
#endif #endif
/*HAWK_ASSERT (HAWK_IN_INT_RANGE(rx));*/ /*HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));*/
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -3966,11 +3966,11 @@ static int fnc_getmuxevt (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
goto done; goto done;
} }
HAWK_ASSERT (HAWK_IN_INT_RANGE(file_node->id)); HAWK_ASSERT(HAWK_IN_INT_RANGE(file_node->id));
x = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 2), hawk_rtx_makeintval(rtx, file_node->id)); x = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 2), hawk_rtx_makeintval(rtx, file_node->id));
if (x <= -1) goto fail; if (x <= -1) goto fail;
HAWK_ASSERT (HAWK_IN_INT_RANGE(mux_data->x_evt[index].events)); HAWK_ASSERT(HAWK_IN_INT_RANGE(mux_data->x_evt[index].events));
x = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 3), hawk_rtx_makeintval(rtx, mux_data->x_evt[index].events)); x = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 3), hawk_rtx_makeintval(rtx, mux_data->x_evt[index].events));
if (x <= -1) goto fail; if (x <= -1) goto fail;
} }
@@ -4017,7 +4017,7 @@ static int fnc_sockaddrdom (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
rx = copy_error_to_sys_list(rtx, sys_list); rx = copy_error_to_sys_list(rtx, sys_list);
} }
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -4050,7 +4050,7 @@ static int fnc_socket (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
new_node->ctx.type = SYS_NODE_DATA_TYPE_SCK; /* override the type to socket */ new_node->ctx.type = SYS_NODE_DATA_TYPE_SCK; /* override the type to socket */
rx = new_node->id; rx = new_node->id;
HAWK_ASSERT (rx >= 0); HAWK_ASSERT(rx >= 0);
} }
} }
else else
@@ -4058,7 +4058,7 @@ static int fnc_socket (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
rx = set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL); rx = set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL);
} }
HAWK_ASSERT (HAWK_IN_INT_RANGE(rx)); HAWK_ASSERT(HAWK_IN_INT_RANGE(rx));
hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval(rtx, rx));
return 0; return 0;
} }
@@ -4434,7 +4434,7 @@ static int fnc_accept (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
new_node->ctx.type = SYS_NODE_DATA_TYPE_SCK; /* override the type to socket */ new_node->ctx.type = SYS_NODE_DATA_TYPE_SCK; /* override the type to socket */
rx = new_node->id; rx = new_node->id;
HAWK_ASSERT (rx >= 0); HAWK_ASSERT(rx >= 0);
} }
done: done:
@@ -4536,7 +4536,7 @@ static void open_remote_log_socket (hawk_rtx_t* rtx, rtx_data_t* rdp)
int domain = hawk_skad_get_family(&rdp->log.skad); int domain = hawk_skad_get_family(&rdp->log.skad);
int type = SOCK_DGRAM; int type = SOCK_DGRAM;
HAWK_ASSERT (rdp->log.sck <= -1); HAWK_ASSERT(rdp->log.sck <= -1);
#if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) #if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC)
type |= SOCK_NONBLOCK; type |= SOCK_NONBLOCK;
@@ -4618,7 +4618,7 @@ static int fnc_openlog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
log_type = SYSLOG_REMOTE; log_type = SYSLOG_REMOTE;
actual_ident = ident + pfxlen; actual_ident = ident + pfxlen;
actual_ident_len = ident_len - pfxlen; actual_ident_len = ident_len - pfxlen;
slash = hawk_rfind_oochar_in_oochars(actual_ident, actual_ident_len, '/'); // fine the last slash slash = hawk_rfind_oochar_in_oochars(actual_ident, actual_ident_len, '/'); // find the last slash
if (!slash) if (!slash)
{ {
rx = set_error_on_sys_list(rtx, sys_list, HAWK_EINVAL, HAWK_T("invalid identifier '%js' with remote address"), ident); rx = set_error_on_sys_list(rtx, sys_list, HAWK_EINVAL, HAWK_T("invalid identifier '%js' with remote address"), ident);
@@ -5257,7 +5257,7 @@ static hawk_int_t pack_data (hawk_rtx_t* rtx, const hawk_oocs_t* fmt, const hawk
hawk_flt_t v; hawk_flt_t v;
float x; float x;
hawk_uint32_t y; hawk_uint32_t y;
HAWK_ASSERT (HAWK_SIZEOF(float) == HAWK_SIZEOF(hawk_uint32_t)); HAWK_ASSERT(HAWK_SIZEOF(float) == HAWK_SIZEOF(hawk_uint32_t));
PACK_CHECK_ARG_AND_BUF(rep_cnt, HAWK_SIZEOF(hawk_uint32_t) * rep_cnt); PACK_CHECK_ARG_AND_BUF(rep_cnt, HAWK_SIZEOF(hawk_uint32_t) * rep_cnt);
for (rc = 0; rc < rep_cnt; rc++) for (rc = 0; rc < rep_cnt; rc++)
{ {
@@ -5274,7 +5274,7 @@ static hawk_int_t pack_data (hawk_rtx_t* rtx, const hawk_oocs_t* fmt, const hawk
hawk_flt_t v; hawk_flt_t v;
double x; double x;
hawk_uint64_t y; hawk_uint64_t y;
HAWK_ASSERT (HAWK_SIZEOF(double) == HAWK_SIZEOF(hawk_uint64_t)); HAWK_ASSERT(HAWK_SIZEOF(double) == HAWK_SIZEOF(hawk_uint64_t));
PACK_CHECK_ARG_AND_BUF(rep_cnt, HAWK_SIZEOF(hawk_uint64_t) * rep_cnt); PACK_CHECK_ARG_AND_BUF(rep_cnt, HAWK_SIZEOF(hawk_uint64_t) * rep_cnt);
for (rc = 0; rc < rep_cnt; rc++) for (rc = 0; rc < rep_cnt; rc++)
{ {
@@ -5867,6 +5867,52 @@ fail:
goto done; goto done;
} }
/* ----------------------------------------------------------------------- */
static int fnc_basename (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{
hawk_val_t* a0, * tmp;
hawk_oocs_t path;
const hawk_ooch_t* ptr;
a0 = hawk_rtx_getarg(rtx, 0);
path.ptr = hawk_rtx_getvaloocstr(rtx, a0, &path.len);
if (HAWK_UNLIKELY(!path.ptr)) return -1;
ptr = hawk_get_base_name_oochars(path.ptr, path.len);
tmp = hawk_rtx_makestrvalwithoocstr(rtx, ptr);
hawk_rtx_freevaloocstr(rtx, a0, path.ptr);
if (HAWK_UNLIKELY(!tmp)) return -1;
hawk_rtx_setretval(rtx, tmp);
return 0;
}
static int fnc_dirname (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{
hawk_val_t* a0, * tmp;
hawk_oocs_t path;
const hawk_ooch_t* ptr;
hawk_oow_t len;
a0 = hawk_rtx_getarg(rtx, 0);
path.ptr = hawk_rtx_getvaloocstr(rtx, a0, &path.len);
if (HAWK_UNLIKELY(!path.ptr)) return -1;
ptr = hawk_get_base_name_oochars(path.ptr, path.len);
len = ptr - path.ptr;
if (len > 1) len--;
tmp = hawk_rtx_makestrvalwithoochars(rtx, path.ptr, len);
hawk_rtx_freevaloocstr(rtx, a0, path.ptr);
if (HAWK_UNLIKELY(!tmp)) return -1;
hawk_rtx_setretval(rtx, tmp);
return 0;
}
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
#define A_MAX HAWK_TYPE_MAX(hawk_oow_t) #define A_MAX HAWK_TYPE_MAX(hawk_oow_t)
@@ -5884,6 +5930,7 @@ static hawk_mod_fnc_tab_t fnctab[] =
{ HAWK_T("WTERMSIG"), { { 1, 1, HAWK_NULL }, fnc_wtermsig, 0 } }, { HAWK_T("WTERMSIG"), { { 1, 1, HAWK_NULL }, fnc_wtermsig, 0 } },
{ HAWK_T("accept"), { { 1, 3, HAWK_T("vvr") }, fnc_accept, 0 } }, { HAWK_T("accept"), { { 1, 3, HAWK_T("vvr") }, fnc_accept, 0 } },
{ HAWK_T("addtomux"), { { 3, 3, HAWK_NULL }, fnc_addtomux, 0 } }, { HAWK_T("addtomux"), { { 3, 3, HAWK_NULL }, fnc_addtomux, 0 } },
{ HAWK_T("basename"), { { 1, 1, HAWK_NULL }, fnc_basename, 0 } },
{ HAWK_T("bind"), { { 2, 2, HAWK_NULL }, fnc_bind, 0 } }, { HAWK_T("bind"), { { 2, 2, HAWK_NULL }, fnc_bind, 0 } },
{ HAWK_T("chmod"), { { 2, 2, HAWK_NULL }, fnc_chmod, 0 } }, { HAWK_T("chmod"), { { 2, 2, HAWK_NULL }, fnc_chmod, 0 } },
{ HAWK_T("chroot"), { { 1, 1, HAWK_NULL }, fnc_chroot, 0 } }, { HAWK_T("chroot"), { { 1, 1, HAWK_NULL }, fnc_chroot, 0 } },
@@ -5893,6 +5940,7 @@ static hawk_mod_fnc_tab_t fnctab[] =
{ HAWK_T("closemux"), { { 1, 1, HAWK_NULL }, fnc_closemux, 0 } }, { HAWK_T("closemux"), { { 1, 1, HAWK_NULL }, fnc_closemux, 0 } },
{ HAWK_T("connect"), { { 2, 2, HAWK_NULL }, fnc_connect, 0 } }, { HAWK_T("connect"), { { 2, 2, HAWK_NULL }, fnc_connect, 0 } },
{ HAWK_T("delfrommux"), { { 2, 2, HAWK_NULL }, fnc_delfrommux, 0 } }, { HAWK_T("delfrommux"), { { 2, 2, HAWK_NULL }, fnc_delfrommux, 0 } },
{ HAWK_T("dirname"), { { 1, 1, HAWK_NULL }, fnc_dirname, 0 } },
{ HAWK_T("dup"), { { 1, 3, HAWK_NULL }, fnc_dup, 0 } }, { HAWK_T("dup"), { { 1, 3, HAWK_NULL }, fnc_dup, 0 } },
{ HAWK_T("errmsg"), { { 0, 0, HAWK_NULL }, fnc_errmsg, 0 } }, { HAWK_T("errmsg"), { { 0, 0, HAWK_NULL }, fnc_errmsg, 0 } },
{ HAWK_T("fchmod"), { { 2, 2, HAWK_NULL }, fnc_fchmod, 0 } }, { HAWK_T("fchmod"), { { 2, 2, HAWK_NULL }, fnc_fchmod, 0 } },
@@ -6395,7 +6443,7 @@ static void unload (hawk_mod_t* mod, hawk_t* hawk)
{ {
mod_ctx_t* mctx = (mod_ctx_t*)mod->ctx; mod_ctx_t* mctx = (mod_ctx_t*)mod->ctx;
HAWK_ASSERT (HAWK_RBT_SIZE(mctx->rtxtab) == 0); HAWK_ASSERT(HAWK_RBT_SIZE(mctx->rtxtab) == 0);
hawk_rbt_close(mctx->rtxtab); hawk_rbt_close(mctx->rtxtab);
hawk_freemem(hawk, mctx); hawk_freemem(hawk, mctx);

View File

@@ -524,7 +524,7 @@ const hawk_uch_t* hawk_get_base_name_ucstr (const hawk_uch_t* path)
if (IS_PATH_SEP(*p)) last = p; if (IS_PATH_SEP(*p)) last = p;
} }
return last? (last +1): path; return last? (last + 1): path;
} }
const hawk_bch_t* hawk_get_base_name_bcstr (const hawk_bch_t* path) const hawk_bch_t* hawk_get_base_name_bcstr (const hawk_bch_t* path)
@@ -536,6 +536,31 @@ const hawk_bch_t* hawk_get_base_name_bcstr (const hawk_bch_t* path)
if (IS_PATH_SEP(*p)) last = p; if (IS_PATH_SEP(*p)) last = p;
} }
return last? (last +1): path; return last? (last + 1): path;
} }
const hawk_uch_t* hawk_get_base_name_uchars (const hawk_uch_t* path, hawk_oow_t len)
{
const hawk_uch_t* p, * last = HAWK_NULL;
const hawk_uch_t* end = path + len;
for (p = path; p < end; p++)
{
if (IS_PATH_SEP(*p)) last = p;
}
return last? (last + 1): path;
}
const hawk_bch_t* hawk_get_base_name_bchars (const hawk_bch_t* path, hawk_oow_t len)
{
const hawk_bch_t* p, * last = HAWK_NULL;
const hawk_bch_t* end = path + len;
for (p = path; p < end; p++)
{
if (IS_PATH_SEP(*p)) last = p;
}
return last? (last + 1): path;
}

View File

@@ -62,7 +62,7 @@ public:
int open () int open ()
{ {
if (HawkStd::open () <= -1) return -1; if (HawkStd::open() <= -1) return -1;
idLastSleep = this->addGlobal(HAWK_T("LAST_SLEEP")); idLastSleep = this->addGlobal(HAWK_T("LAST_SLEEP"));
if (idLastSleep <= -1) goto oops; if (idLastSleep <= -1) goto oops;
@@ -413,7 +413,7 @@ static int hawk_main (MyHawk& hawk, int argc, hawk_bch_t* argv[])
cmdline_t cmdline; cmdline_t cmdline;
int n; int n;
hawk.setTrait (hawk.getTrait() | HAWK_FLEXMAP | HAWK_RWPIPE | HAWK_NEXTOFILE); hawk.setTrait(hawk.getTrait() | HAWK_FLEXMAP | HAWK_RWPIPE | HAWK_NEXTOFILE);
// ARGV[0] // ARGV[0]
if (hawk.addArgument(HAWK_T("hawk51")) <= -1) if (hawk.addArgument(HAWK_T("hawk51")) <= -1)
@@ -424,7 +424,7 @@ static int hawk_main (MyHawk& hawk, int argc, hawk_bch_t* argv[])
if ((n = handle_cmdline(hawk, argc, argv, &cmdline)) <= 0) return n; if ((n = handle_cmdline(hawk, argc, argv, &cmdline)) <= 0) return n;
if (cmdline.incdirs) hawk.setIncludeDirs (cmdline.incdirs); if (cmdline.incdirs) hawk.setIncludeDirs(cmdline.incdirs);
MyHawk::Source* in, * out; MyHawk::Source* in, * out;
MyHawk::SourceString in_str(cmdline.ins); MyHawk::SourceString in_str(cmdline.ins);
MyHawk::SourceFile in_file(cmdline.inf); MyHawk::SourceFile in_file(cmdline.inf);