refactoring

This commit is contained in:
hyung-hwan 2019-12-18 08:16:34 +00:00
parent 446925bcbf
commit 40d8800dab
22 changed files with 278 additions and 177 deletions

View File

@ -21,6 +21,6 @@ bin_PROGRAMS = hawk
hawk_SOURCES = main.c hawk_SOURCES = main.c
hawk_CPPFLAGS = $(CPPFLAGS_ALL_COMMON) hawk_CPPFLAGS = $(CPPFLAGS_ALL_COMMON)
hawk_LDFLAGS = $(LDFLAGS_ALL_COMMON) hawk_LDFLAGS = $(LDFLAGS_ALL_COMMON)
hawk_LDADD = $(LIBADD_BIN_COMMON) -lhawk hawk_LDADD = $(LIBADD_BIN_COMMON) $(SOCKET_LIBS) -lhawk
hawk_DEPENDENCIES = ../lib/libhawk.la hawk_DEPENDENCIES = ../lib/libhawk.la

View File

@ -353,7 +353,7 @@ LIBADD_BIN_COMMON = $(LIBM)
hawk_SOURCES = main.c hawk_SOURCES = main.c
hawk_CPPFLAGS = $(CPPFLAGS_ALL_COMMON) hawk_CPPFLAGS = $(CPPFLAGS_ALL_COMMON)
hawk_LDFLAGS = $(LDFLAGS_ALL_COMMON) hawk_LDFLAGS = $(LDFLAGS_ALL_COMMON)
hawk_LDADD = $(LIBADD_BIN_COMMON) -lhawk hawk_LDADD = $(LIBADD_BIN_COMMON) $(SOCKET_LIBS) -lhawk
hawk_DEPENDENCIES = ../lib/libhawk.la hawk_DEPENDENCIES = ../lib/libhawk.la
all: all-am all: all-am

View File

@ -26,6 +26,7 @@
#include <hawk-std.h> #include <hawk-std.h>
#include <hawk-utl.h> #include <hawk-utl.h>
#include <hawk-fmt.h>
#include <hawk-cli.h> #include <hawk-cli.h>
#include <stdio.h> #include <stdio.h>
@ -134,48 +135,55 @@ static void dprint (const hawk_ooch_t* fmt, ...)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
#if defined(HAVE_SIGACTION)
typedef struct sig_state_t sig_state_t; typedef struct sig_state_t sig_state_t;
struct sig_state_t struct sig_state_t
{ {
hawk_oow_t handler; hawk_uintptr_t handler;
hawk_oow_t old_handler; hawk_uintptr_t old_handler;
#if defined(HAVE_SIGACTION)
sigset_t old_sa_mask; sigset_t old_sa_mask;
int old_sa_flags; int old_sa_flags;
#endif
}; };
typedef void (*sig_handler_t) (int sig); typedef void (*sig_handler_t) (int sig);
static sig_state_t g_sig_state[HAWK_NSIG]; static sig_state_t g_sig_state[HAWK_NSIG];
static int is_signal_handler_set (int sig)
{
return !!g_sig_state[sig].handler;
}
#if defined(HAVE_SIGACTION)
static void dispatch_siginfo (int sig, siginfo_t* si, void* ctx) static void dispatch_siginfo (int sig, siginfo_t* si, void* ctx)
{ {
if (g_sig_state[sig].handler != (hawk_oow_t)SIG_IGN && if (g_sig_state[sig].handler != (hawk_uintptr_t)SIG_IGN &&
g_sig_state[sig].handler != (hawk_oow_t)SIG_DFL) g_sig_state[sig].handler != (hawk_uintptr_t)SIG_DFL)
{ {
((sig_handler_t)g_sig_state[sig].handler) (sig); ((sig_handler_t)g_sig_state[sig].handler) (sig);
} }
if (g_sig_state[sig].old_handler && if (g_sig_state[sig].old_handler &&
g_sig_state[sig].old_handler != (hawk_oow_t)SIG_IGN && g_sig_state[sig].old_handler != (hawk_uintptr_t)SIG_IGN &&
g_sig_state[sig].old_handler != (hawk_oow_t)SIG_DFL) g_sig_state[sig].old_handler != (hawk_uintptr_t)SIG_DFL)
{ {
((void(*)(int, siginfo_t*, void*))g_sig_state[sig].old_handler) (sig, si, ctx); ((void(*)(int, siginfo_t*, void*))g_sig_state[sig].old_handler) (sig, si, ctx);
} }
} }
#endif
static void dispatch_signal (int sig) static void dispatch_signal (int sig)
{ {
if (g_sig_state[sig].handler != (hawk_oow_t)SIG_IGN && if (g_sig_state[sig].handler != (hawk_uintptr_t)SIG_IGN &&
g_sig_state[sig].handler != (hawk_oow_t)SIG_DFL) g_sig_state[sig].handler != (hawk_uintptr_t)SIG_DFL)
{ {
((sig_handler_t)g_sig_state[sig].handler) (sig); ((sig_handler_t)g_sig_state[sig].handler) (sig);
} }
if (g_sig_state[sig].old_handler && if (g_sig_state[sig].old_handler &&
g_sig_state[sig].old_handler != (hawk_oow_t)SIG_IGN && g_sig_state[sig].old_handler != (hawk_uintptr_t)SIG_IGN &&
g_sig_state[sig].old_handler != (hawk_oow_t)SIG_DFL) g_sig_state[sig].old_handler != (hawk_uintptr_t)SIG_DFL)
{ {
((sig_handler_t)g_sig_state[sig].old_handler) (sig); ((sig_handler_t)g_sig_state[sig].old_handler) (sig);
} }
@ -186,11 +194,12 @@ static int set_signal_handler (int sig, sig_handler_t handler, int extra_flags)
if (g_sig_state[sig].handler) if (g_sig_state[sig].handler)
{ {
/* already set - allow handler change. ignore extra_flags. */ /* already set - allow handler change. ignore extra_flags. */
if (g_sig_state[sig].handler == (hawk_oow_t)handler) return -1; if (g_sig_state[sig].handler == (hawk_uintptr_t)handler) return -1;
g_sig_state[sig].handler = (hawk_oow_t)handler; g_sig_state[sig].handler = (hawk_uintptr_t)handler;
} }
else else
{ {
#if defined(HAVE_SIGACTION)
struct sigaction sa, oldsa; struct sigaction sa, oldsa;
if (sigaction(sig, HAWK_NULL, &oldsa) == -1) return -1; if (sigaction(sig, HAWK_NULL, &oldsa) == -1) return -1;
@ -213,14 +222,18 @@ static int set_signal_handler (int sig, sig_handler_t handler, int extra_flags)
if (sigaction(sig, &sa, HAWK_NULL) == -1) return -1; if (sigaction(sig, &sa, HAWK_NULL) == -1) return -1;
g_sig_state[sig].handler = (hawk_oow_t)handler; g_sig_state[sig].handler = (hawk_uintptr_t)handler;
if (oldsa.sa_flags & SA_SIGINFO) if (oldsa.sa_flags & SA_SIGINFO)
g_sig_state[sig].old_handler = (hawk_oow_t)oldsa.sa_sigaction; g_sig_state[sig].old_handler = (hawk_uintptr_t)oldsa.sa_sigaction;
else else
g_sig_state[sig].old_handler = (hawk_oow_t)oldsa.sa_handler; g_sig_state[sig].old_handler = (hawk_uintptr_t)oldsa.sa_handler;
g_sig_state[sig].old_sa_mask = oldsa.sa_mask; g_sig_state[sig].old_sa_mask = oldsa.sa_mask;
g_sig_state[sig].old_sa_flags = oldsa.sa_flags; g_sig_state[sig].old_sa_flags = oldsa.sa_flags;
#else
g_sig_state[sig].old_handler = (hawk_uintptr_t)signal(sig, handler);
g_sig_state[sig].handler = (hawk_uintptr_t)dispatch_signal;
#endif
} }
return 0; return 0;
@ -228,10 +241,13 @@ static int set_signal_handler (int sig, sig_handler_t handler, int extra_flags)
static int unset_signal_handler (int sig) static int unset_signal_handler (int sig)
{ {
#if defined(HAVE_SIGACTION)
struct sigaction sa; struct sigaction sa;
#endif
if (!g_sig_state[sig].handler) return -1; /* not set */ if (!g_sig_state[sig].handler) return -1; /* not set */
#if defined(HAVE_SIGACTION)
HAWK_MEMSET (&sa, 0, HAWK_SIZEOF(sa)); HAWK_MEMSET (&sa, 0, HAWK_SIZEOF(sa));
sa.sa_mask = g_sig_state[sig].old_sa_mask; sa.sa_mask = g_sig_state[sig].old_sa_mask;
sa.sa_flags = g_sig_state[sig].old_sa_flags; sa.sa_flags = g_sig_state[sig].old_sa_flags;
@ -246,6 +262,9 @@ static int unset_signal_handler (int sig)
} }
if (sigaction(sig, &sa, HAWK_NULL) == -1) return -1; if (sigaction(sig, &sa, HAWK_NULL) == -1) return -1;
#else
signal (sig, (sig_handler_t)g_sig_state[sig].old_handler);
#endif
g_sig_state[sig].handler = 0; g_sig_state[sig].handler = 0;
/* keep other fields untouched */ /* keep other fields untouched */
@ -253,14 +272,6 @@ static int unset_signal_handler (int sig)
return 0; return 0;
} }
static int is_signal_handler_set (int sig)
{
return !!g_sig_state[sig].handler;
}
#endif
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
static void stop_run (int signo) static void stop_run (int signo)
@ -282,9 +293,15 @@ static void do_nothing (int unused)
static void set_intr_run (void) static void set_intr_run (void)
{ {
#if defined(SIGTERM)
set_signal_handler (SIGTERM, stop_run, 0); set_signal_handler (SIGTERM, stop_run, 0);
#endif
#if defined(SIGHUP)
set_signal_handler (SIGHUP, stop_run, 0); set_signal_handler (SIGHUP, stop_run, 0);
#endif
#if defined(SIGINT)
set_signal_handler (SIGINT, stop_run, 0); set_signal_handler (SIGINT, stop_run, 0);
#endif
#if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) && defined(SIGPIPE) #if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) && defined(SIGPIPE)
set_signal_handler (SIGPIPE, do_nothing, 0); set_signal_handler (SIGPIPE, do_nothing, 0);
#endif #endif
@ -292,9 +309,15 @@ static void set_intr_run (void)
static void unset_intr_run (void) static void unset_intr_run (void)
{ {
#if defined(SIGTERM)
unset_signal_handler (SIGTERM); unset_signal_handler (SIGTERM);
#endif
#if defined(SIGHUP)
unset_signal_handler (SIGHUP); unset_signal_handler (SIGHUP);
#endif
#if defined(SIGINT)
unset_signal_handler (SIGINT); unset_signal_handler (SIGINT);
#endif
#if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) && defined(SIGPIPE) #if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) && defined(SIGPIPE)
unset_signal_handler (SIGPIPE); unset_signal_handler (SIGPIPE);
#endif #endif
@ -915,39 +938,36 @@ static void freearg (struct arg_t* arg)
if (arg->gvm.ptr) free (arg->gvm.ptr); if (arg->gvm.ptr) free (arg->gvm.ptr);
} }
static void print_hawk_error (hawk_t* awk) static void print_hawk_error (hawk_t* hawk)
{ {
const hawk_loc_t* loc = hawk_geterrloc(awk); const hawk_loc_t* loc = hawk_geterrloc(hawk);
hawk_logfmt (awk, HAWK_LOG_STDERR, hawk_logfmt (hawk, HAWK_LOG_STDERR,
HAWK_T("ERROR: CODE %d LINE %zu COLUMN %zu %js%js%js- %js\n"), HAWK_T("ERROR: CODE %d LINE %zu COLUMN %zu %js%js%js- %js\n"),
(int)hawk_geterrnum(awk), (int)hawk_geterrnum(hawk),
(hawk_oow_t)loc->line, (hawk_oow_t)loc->line,
(hawk_oow_t)loc->colm, (hawk_oow_t)loc->colm,
((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T("FILE ")), ((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T("FILE ")),
((loc->file == HAWK_NULL)? HAWK_T(""): loc->file), ((loc->file == HAWK_NULL)? HAWK_T(""): loc->file),
((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T(" ")), ((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T(" ")),
hawk_geterrmsg(awk) hawk_geterrmsg(hawk)
); );
} }
static void print_hawk_rtx_error (hawk_rtx_t* rtx) static void print_hawk_rtx_error (hawk_rtx_t* rtx)
{ {
const hawk_loc_t* loc = hawk_rtx_geterrloc (rtx); const hawk_loc_t* loc = hawk_rtx_geterrloc(rtx);
/* TODO: proper logging mask */ hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR,
printf ("print_hawk_rtx_error... TODO: \n"); HAWK_T("ERROR: CODE %d LINE %zu COLUMN %zu %js%js%js- %js\n"),
/* (int)hawk_rtx_geterrnum(rtx),
hawk_logfmt (hawk_rtx_gethawk(rtx), 0,
HAWK_T("ERROR: CODE %d LINE %zu COLUMN %zu %s%s%s- %s\n"),
hawk_rtx_geterrnum(rtx),
(hawk_oow_t)loc->line, (hawk_oow_t)loc->line,
(hawk_oow_t)loc->colm, (hawk_oow_t)loc->colm,
((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T("FILE ")), ((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T("FILE ")),
((loc->file == HAWK_NULL)? HAWK_T(""): loc->file), ((loc->file == HAWK_NULL)? HAWK_T(""): loc->file),
((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T(" ")), ((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T(" ")),
hawk_rtx_geterrmsg(rtx) hawk_rtx_geterrmsg(rtx)
);*/ );
} }
hawk_htb_walk_t add_global (hawk_htb_t* map, hawk_htb_pair_t* pair, void* arg) hawk_htb_walk_t add_global (hawk_htb_t* map, hawk_htb_pair_t* pair, void* arg)
@ -1092,7 +1112,7 @@ static HAWK_INLINE int execute_hawk (int argc, hawk_bch_t* argv[])
xma_mmgr.ctx = hawk_xma_open(HAWK_MMGR_GETDFL(), 0, arg.memlimit); xma_mmgr.ctx = hawk_xma_open(HAWK_MMGR_GETDFL(), 0, arg.memlimit);
if (xma_mmgr.ctx == HAWK_NULL) if (xma_mmgr.ctx == HAWK_NULL)
{ {
hawk_printf (HAWK_T("ERROR: cannot open memory heap\n")); print_error ("cannot open memory heap\n");
goto oops; goto oops;
} }
mmgr = &xma_mmgr; mmgr = &xma_mmgr;
@ -1195,6 +1215,7 @@ oops:
freearg (&arg); freearg (&arg);
#if defined(HAWK_BUILD_DEBUG) #if defined(HAWK_BUILD_DEBUG)
/*
if (arg.failmalloc > 0) if (arg.failmalloc > 0)
{ {
hawk_fprintf (HAWK_STDERR, HAWK_T("\n")); hawk_fprintf (HAWK_STDERR, HAWK_T("\n"));
@ -1204,7 +1225,7 @@ oops:
(unsigned long)debug_mmgr_free_count, (unsigned long)debug_mmgr_free_count,
(unsigned long)debug_mmgr_realloc_count); (unsigned long)debug_mmgr_realloc_count);
hawk_fprintf (HAWK_STDERR, HAWK_T("-------------------------------------------------------\n")); hawk_fprintf (HAWK_STDERR, HAWK_T("-------------------------------------------------------\n"));
} }*/
#endif #endif
return ret; return ret;
@ -1232,12 +1253,12 @@ int main (int argc, hawk_bch_t* argv[])
if (codepage == CP_UTF8) if (codepage == CP_UTF8)
{ {
/*SetConsoleOUtputCP (CP_UTF8);*/ /*SetConsoleOUtputCP (CP_UTF8);*/
hawk_setdflcmgrbyid (HAWK_CMGR_UTF8); /*hawk_setdflcmgrbyid (HAWK_CMGR_UTF8);*/
} }
else else
{ {
/* .codepage */ /* .codepage */
hawk_fmt_uintmax_to_bcstr (locale, HAWK_COUNTOF(locale), codepage, 10, -1, HAWK_MT('\0'), HAWK_MT(".")); hawk_fmt_uintmax_to_bcstr (locale, HAWK_COUNTOF(locale), codepage, 10, -1, '\0', ".");
setlocale (LC_ALL, locale); setlocale (LC_ALL, locale);
/* hawk_setdflcmgrbyid (HAWK_CMGR_SLMB); */ /* hawk_setdflcmgrbyid (HAWK_CMGR_SLMB); */
} }
@ -1250,7 +1271,7 @@ int main (int argc, hawk_bch_t* argv[])
#if defined(_WIN32) #if defined(_WIN32)
if (WSAStartup (MAKEWORD(2,0), &wsadata) != 0) if (WSAStartup (MAKEWORD(2,0), &wsadata) != 0)
{ {
print_error (HAWK_T("Failed to start up winsock\n")); print_error ("Failed to start up winsock\n");
ret = -1; ret = -1;
goto oops; goto oops;
} }
@ -1258,7 +1279,7 @@ int main (int argc, hawk_bch_t* argv[])
/* TODO: add an option to skip watt-32 */ /* TODO: add an option to skip watt-32 */
_watt_do_exit = 0; /* prevent sock_init from exiting upon failure */ _watt_do_exit = 0; /* prevent sock_init from exiting upon failure */
if (sock_init() != 0) if (sock_init() != 0)
print_warning (HAWK_T("Failed to initialize watt-32\n")); print_warning ("Failed to initialize watt-32\n");
else sock_inited = 1; else sock_inited = 1;
#endif #endif

2
hawk/configure vendored
View File

@ -18734,7 +18734,7 @@ _ACEOF
fi fi
done done
for ac_func in snprintf _vsnprintf _vsnwprintf strerror_r for ac_func in snprintf _vsnprintf _vsnwprintf strerror_r random_r random
do : do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"

View File

@ -202,7 +202,7 @@ AC_CHECK_FUNCS([makecontext swapcontext getcontext setcontext])
AC_CHECK_FUNCS([clock_nanosleep nanosleep usleep]) AC_CHECK_FUNCS([clock_nanosleep nanosleep usleep])
AC_CHECK_FUNCS([localtime_r gmtime_r]) AC_CHECK_FUNCS([localtime_r gmtime_r])
AC_CHECK_FUNCS([sigaction signal]) AC_CHECK_FUNCS([sigaction signal])
AC_CHECK_FUNCS([snprintf _vsnprintf _vsnwprintf strerror_r]) AC_CHECK_FUNCS([snprintf _vsnprintf _vsnwprintf strerror_r random_r random])
AC_CHECK_FUNCS([accept4 pipe2 epoll_create epoll_create1 kqueue kqueue1]) AC_CHECK_FUNCS([accept4 pipe2 epoll_create epoll_create1 kqueue kqueue1])
AC_CHECK_FUNCS([isatty mmap munmap]) AC_CHECK_FUNCS([isatty mmap munmap])
AC_CHECK_FUNCS([readdir64 dirfd faccessat]) AC_CHECK_FUNCS([readdir64 dirfd faccessat])

View File

@ -1278,22 +1278,21 @@ static int get_devname_from_handle (
return 0; return 0;
} }
static int get_volname_from_handle ( static int get_volname_from_handle (hawk_fio_t* fio, hawk_ooch_t* buf, hawk_oow_t len)
hawk_fio_t* fio, hawk_ooch_t* buf, hawk_oow_t len)
{ {
if (get_devname_from_handle (fio, buf, len) == -1) return -1; if (get_devname_from_handle (fio, buf, len) == -1) return -1;
if (hawk_strcasebeg (buf, HAWK_T("\\Device\\LanmanRedirector\\"))) if (hawk_comp_oocstr_limited(buf, HAWK_T("\\Device\\LanmanRedirector\\"), 25, 1) == 0)
{ {
/*buf[0] = HAWK_T('\\');*/ /*buf[0] = HAWK_T('\\');*/
hawk_strcpy (&buf[1], &buf[24]); hawk_copy_oocstr_unlimited (&buf[1], &buf[24]);
} }
else else
{ {
DWORD n; DWORD n;
hawk_ooch_t drives[128]; hawk_ooch_t drives[128];
n = GetLogicalDriveStrings (HAWK_COUNTOF(drives), drives); n = GetLogicalDriveStrings(HAWK_COUNTOF(drives), drives);
if (n == 0 /* error */ || if (n == 0 /* error */ ||
n > HAWK_COUNTOF(drives) /* buffer small */) n > HAWK_COUNTOF(drives) /* buffer small */)
@ -1312,14 +1311,14 @@ static int get_volname_from_handle (
drv[2] = HAWK_T('\0'); drv[2] = HAWK_T('\0');
if (QueryDosDevice (drv, path, HAWK_COUNTOF(path))) if (QueryDosDevice (drv, path, HAWK_COUNTOF(path)))
{ {
hawk_oow_t pl = hawk_strlen(path); hawk_oow_t pl = hawk_count_oocstr(path);
hawk_oow_t bl = hawk_strlen(buf); hawk_oow_t bl = hawk_count_oocstr(buf);
if (bl > pl && buf[pl] == HAWK_T('\\') && if (bl > pl && buf[pl] == HAWK_T('\\') &&
hawk_strxncasecmp(buf, pl, path, pl) == 0) hawk_comp_oochars(buf, pl, path, pl, 1) == 0)
{ {
buf[0] = drv[0]; buf[0] = drv[0];
buf[1] = HAWK_T(':'); buf[1] = HAWK_T(':');
hawk_strcpy (&buf[2], &buf[pl]); hawk_copy_oocstr_unlimited (&buf[2], &buf[pl]);
break; break;
} }
} }

View File

@ -384,15 +384,40 @@ hawk_bch_t* hawk_gem_duputobcharswithcmgr (hawk_gem_t* gem, const hawk_uch_t* uc
return bcs; return bcs;
} }
hawk_uch_t* hawk_gem_dupbcstrarrtoucstr (hawk_gem_t* gem, const hawk_bch_t* bcs[], hawk_oow_t* ucslen, int all)
{
hawk_oow_t bl, ul, capa, pos, i;
hawk_uch_t* ucs;
for (capa = 0, i = 0; bcs[i]; i++)
{
if (hawk_gem_convbtoucstr(gem, bcs[i], &bl, HAWK_NULL, &ul, all) <= -1) return HAWK_NULL;
capa += ul;
}
ucs = (hawk_uch_t*)hawk_gem_allocmem(gem, (capa + 1) * HAWK_SIZEOF(*ucs));
if (!ucs) return HAWK_NULL;
for (pos = 0, i = 0; bcs[i]; i++)
{
ul = capa - pos + 1;
hawk_gem_convbtoucstr (gem, bcs[i], &bl, &ucs[pos], &ul, all);
pos += ul;
}
if (ucslen) *ucslen = capa;
return ucs;
}
hawk_bch_t* hawk_gem_dupucstrarrtobcstr (hawk_gem_t* gem, const hawk_uch_t* ucs[], hawk_oow_t* bcslen) hawk_bch_t* hawk_gem_dupucstrarrtobcstr (hawk_gem_t* gem, const hawk_uch_t* ucs[], hawk_oow_t* bcslen)
{ {
hawk_oow_t wl, ml, capa, pos, i; hawk_oow_t ul, bl, capa, pos, i;
hawk_bch_t* bcs; hawk_bch_t* bcs;
for (capa = 0, i = 0; ucs[i]; i++) for (capa = 0, i = 0; ucs[i]; i++)
{ {
if (hawk_gem_convutobcstr(gem, ucs[i], &wl, HAWK_NULL, &ml) <= -1) return HAWK_NULL; if (hawk_gem_convutobcstr(gem, ucs[i], &ul, HAWK_NULL, &bl) <= -1) return HAWK_NULL;
capa += ml; capa += bl;
} }
bcs = (hawk_bch_t*)hawk_gem_allocmem(gem, (capa + 1) * HAWK_SIZEOF(*bcs)); bcs = (hawk_bch_t*)hawk_gem_allocmem(gem, (capa + 1) * HAWK_SIZEOF(*bcs));
@ -400,9 +425,9 @@ hawk_bch_t* hawk_gem_dupucstrarrtobcstr (hawk_gem_t* gem, const hawk_uch_t* ucs[
for (pos = 0, i = 0; ucs[i]; i++) for (pos = 0, i = 0; ucs[i]; i++)
{ {
ml = capa - pos + 1; bl = capa - pos + 1;
hawk_gem_convutobcstr (gem, ucs[i], &wl, &bcs[pos], &ml); hawk_gem_convutobcstr (gem, ucs[i], &ul, &bcs[pos], &bl);
pos += ml; pos += bl;
} }
if (bcslen) *bcslen = capa; if (bcslen) *bcslen = capa;

View File

@ -343,6 +343,12 @@
/* Define to 1 if you have the `quadmath_snprintf' function. */ /* Define to 1 if you have the `quadmath_snprintf' function. */
#undef HAVE_QUADMATH_SNPRINTF #undef HAVE_QUADMATH_SNPRINTF
/* Define to 1 if you have the `random' function. */
#undef HAVE_RANDOM
/* Define to 1 if you have the `random_r' function. */
#undef HAVE_RANDOM_R
/* Define to 1 if you have the `readdir64' function. */ /* Define to 1 if you have the `readdir64' function. */
#undef HAVE_READDIR64 #undef HAVE_READDIR64

View File

@ -1258,9 +1258,6 @@ typedef enum hawk_log_mask_t hawk_log_mask_t;
*/ */
#if (HAWK_SIZEOF_UCH_T == HAWK_SIZEOF_BCH_T) #if (HAWK_SIZEOF_UCH_T == HAWK_SIZEOF_BCH_T)
# define HAWK_UT(txt) (txt) # define HAWK_UT(txt) (txt)
#elif defined(HAWK_UCH_IS_CHAR16_T) && (HAWK_SIZEOF_WCHAR_T == 2)
/* prefer L to u as u is not supported by some compiers despite char16_t support */
# define HAWK_UT(txt) (L ## txt)
#elif defined(HAWK_UCH_IS_CHAR16_T) #elif defined(HAWK_UCH_IS_CHAR16_T)
# define HAWK_UT(txt) (u ## txt) # define HAWK_UT(txt) (u ## txt)
#else #else

View File

@ -218,12 +218,20 @@ HAWK_EXPORT hawk_bch_t* hawk_gem_duputobcharswithcmgr (
hawk_cmgr_t* cmgr hawk_cmgr_t* cmgr
); );
HAWK_EXPORT hawk_uch_t* hawk_gem_dupbcstrarrtoucstr (
hawk_gem_t* gem,
const hawk_bch_t* bcs[],
hawk_oow_t* ucslen,
int all
);
HAWK_EXPORT hawk_bch_t* hawk_gem_dupucstrarrtobcstr ( HAWK_EXPORT hawk_bch_t* hawk_gem_dupucstrarrtobcstr (
hawk_gem_t* gem, hawk_gem_t* gem,
const hawk_uch_t* ucs[], const hawk_uch_t* ucs[],
hawk_oow_t* bcslen hawk_oow_t* bcslen
); );
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
hawk_oow_t hawk_gem_vfmttoucstr ( hawk_oow_t hawk_gem_vfmttoucstr (

View File

@ -547,9 +547,9 @@ HAWK_EXPORT hawk_htb_pair_t* hawk_htb_update (
* for (i = 0; i < HAWK_COUNTOF(vals); i++) * for (i = 0; i < HAWK_COUNTOF(vals); i++)
* { * {
* hawk_cstr_t ctx; * hawk_cstr_t ctx;
* ctx.ptr = vals[i]; ctx.len = hawk_strlen(vals[i]); * ctx.ptr = vals[i]; ctx.len = hawk_count_oocstr(vals[i]);
* hawk_htb_cbsert (s1, * hawk_htb_cbsert (s1,
* keys[i%HAWK_COUNTOF(keys)], hawk_strlen(keys[i%HAWK_COUNTOF(keys)]), * keys[i%HAWK_COUNTOF(keys)], hawk_count_oocstr(keys[i%HAWK_COUNTOF(keys)]),
* cbserter, &ctx * cbserter, &ctx
* ); // note error check is skipped * ); // note error check is skipped
* } * }

View File

@ -52,7 +52,7 @@ enum hawk_pio_flag_t
/** indicate that the command to hawk_pio_open() is a multi-byte string. /** indicate that the command to hawk_pio_open() is a multi-byte string.
* it is useful if #HAWK_OOCH_IS_UCH is defined. */ * it is useful if #HAWK_OOCH_IS_UCH is defined. */
HAWK_PIO_MBSCMD = (1 << 4), HAWK_PIO_BCSTRCMD = (1 << 4),
/** don't attempt to close open file descriptors unknown to pio. /** don't attempt to close open file descriptors unknown to pio.
* it is useful only on a unix-like systems where file descriptors * it is useful only on a unix-like systems where file descriptors
@ -202,7 +202,7 @@ extern "C" {
* On *nix systems, a full path to the command is needed if it is not specified. * On *nix systems, a full path to the command is needed if it is not specified.
* If \a env is #HAWK_NULL, the environment of \a cmd inherits that of the * If \a env is #HAWK_NULL, the environment of \a cmd inherits that of the
* calling process. If you want to pass an empty environment, you can pass * calling process. If you want to pass an empty environment, you can pass
* an empty \a env object with no items inserted. If #HAWK_PIO_MBSCMD is * an empty \a env object with no items inserted. If #HAWK_PIO_BCSTRCMD is
* specified in \a flags, \a cmd is treated as a multi-byte string whose * specified in \a flags, \a cmd is treated as a multi-byte string whose
* character type is #hawk_bch_t. * character type is #hawk_bch_t.
* \return #hawk_pio_t object on success, #HAWK_NULL on failure * \return #hawk_pio_t object on success, #HAWK_NULL on failure

View File

@ -500,9 +500,9 @@ HAWK_EXPORT hawk_rbt_pair_t* hawk_rbt_update (
* for (i = 0; i < HAWK_COUNTOF(vals); i++) * for (i = 0; i < HAWK_COUNTOF(vals); i++)
* { * {
* hawk_cstr_t ctx; * hawk_cstr_t ctx;
* ctx.ptr = vals[i]; ctx.len = hawk_strlen(vals[i]); * ctx.ptr = vals[i]; ctx.len = hawk_count_oocstr(vals[i]);
* hawk_rbt_cbsert (s1, * hawk_rbt_cbsert (s1,
* keys[i%HAWK_COUNTOF(keys)], hawk_strlen(keys[i%HAWK_COUNTOF(keys)]), * keys[i%HAWK_COUNTOF(keys)], hawk_count_oocstr(keys[i%HAWK_COUNTOF(keys)]),
* cbserter, &ctx * cbserter, &ctx
* ); // note error check is skipped * ); // note error check is skipped
* } * }

View File

@ -156,7 +156,7 @@ HAWK_EXPORT hawk_t* hawk_openstdwithmmgr (
* *
* in[0].type = HAWK_PARSESTD_OOCS; * in[0].type = HAWK_PARSESTD_OOCS;
* in[0].u.str.ptr = HAWK_T("BEGIN { print 10; }"); * in[0].u.str.ptr = HAWK_T("BEGIN { print 10; }");
* in[0].u.str.len = hawk_strlen(in.u.str.ptr); * in[0].u.str.len = hawk_count_oocstr(in.u.str.ptr);
* in[1].type = HAWK_PARSESTD_NULL; * in[1].type = HAWK_PARSESTD_NULL;
* out.type = HAWK_PARSESTD_OOCS; * out.type = HAWK_PARSESTD_OOCS;
* n = hawk_parsestd (awk, in, &out); * n = hawk_parsestd (awk, in, &out);

View File

@ -463,13 +463,15 @@ HAWK_EXPORT int hawk_comp_bcstr (
HAWK_EXPORT int hawk_comp_ucstr_limited ( HAWK_EXPORT int hawk_comp_ucstr_limited (
const hawk_uch_t* str1, const hawk_uch_t* str1,
const hawk_uch_t* str2, const hawk_uch_t* str2,
hawk_oow_t maxlen hawk_oow_t maxlen,
int ignorecase
); );
HAWK_EXPORT int hawk_comp_bcstr_limited ( HAWK_EXPORT int hawk_comp_bcstr_limited (
const hawk_bch_t* str1, const hawk_bch_t* str1,
const hawk_bch_t* str2, const hawk_bch_t* str2,
hawk_oow_t maxlen hawk_oow_t maxlen,
int ignorecase
); );
HAWK_EXPORT int hawk_comp_ucstr_bcstr ( HAWK_EXPORT int hawk_comp_ucstr_bcstr (
@ -729,12 +731,13 @@ HAWK_EXPORT int hawk_split_bcstr (
# define hawk_comp_oochars_ucstr hawk_comp_uchars_ucstr # define hawk_comp_oochars_ucstr hawk_comp_uchars_ucstr
# define hawk_comp_oochars_oocstr hawk_comp_uchars_ucstr # define hawk_comp_oochars_oocstr hawk_comp_uchars_ucstr
# define hawk_comp_oocstr hawk_comp_ucstr # define hawk_comp_oocstr hawk_comp_ucstr
# define hawk_comp_oocstr_limited hawk_comp_ucstr_limited
# define hawk_copy_oochars(dst,src,len) hawk_copy_uchars(dst,src,len) # define hawk_copy_oochars hawk_copy_uchars
# define hawk_copy_bchars_to_oochars(dst,src,len) hawk_copy_bchars_to_uchars(dst,src,len) # define hawk_copy_bchars_to_oochars hawk_copy_bchars_to_uchars
# define hawk_copy_oochars_to_bchars(dst,src,len) hawk_copy_uchars_to_bchars(dst,src,len) # define hawk_copy_oochars_to_bchars hawk_copy_uchars_to_bchars
# define hawk_copy_uchars_to_oochars(dst,src,len) hawk_copy_uchars(dst,src,len) # define hawk_copy_uchars_to_oochars hawk_copy_uchars
# define hawk_copy_oochars_to_uchars(dst,src,len) hawk_copy_uchars(dst,src,len) # define hawk_copy_oochars_to_uchars hawk_copy_uchars
# define hawk_copy_oochars_to_oocstr(dst,dlen,src,slen) hawk_copy_uchars_to_ucstr(dst,dlen,src,slen) # define hawk_copy_oochars_to_oocstr(dst,dlen,src,slen) hawk_copy_uchars_to_ucstr(dst,dlen,src,slen)
# define hawk_copy_oochars_to_oocstr_unlimited(dst,src,len) hawk_copy_uchars_to_ucstr_unlimited(dst,src,len) # define hawk_copy_oochars_to_oocstr_unlimited(dst,src,len) hawk_copy_uchars_to_ucstr_unlimited(dst,src,len)
@ -765,12 +768,13 @@ HAWK_EXPORT int hawk_split_bcstr (
# define hawk_comp_oochars_ucstr hawk_comp_bchars_ucstr # define hawk_comp_oochars_ucstr hawk_comp_bchars_ucstr
# define hawk_comp_oochars_oocstr hawk_comp_bchars_bcstr # define hawk_comp_oochars_oocstr hawk_comp_bchars_bcstr
# define hawk_comp_oocstr hawk_comp_bcstr # define hawk_comp_oocstr hawk_comp_bcstr
# define hawk_comp_oocstr_limited hawk_comp_bcstr_limited
# define hawk_copy_oochars(dst,src,len) hawk_copy_bchars(dst,src,len) # define hawk_copy_oochars hawk_copy_bchars
# define hawk_copy_bchars_to_oochars(dst,src,len) hawk_copy_bchars(dst,src,len) # define hawk_copy_bchars_to_oochars hawk_copy_bchars
# define hawk_copy_oochars_to_bchars(dst,src,len) hawk_copy_bchars(dst,src,len) # define hawk_copy_oochars_to_bchars hawk_copy_bchars
# define hawk_copy_uchars_to_oochars(dst,src,len) hawk_copy_uchars_to_bchars(dst,src,len) # define hawk_copy_uchars_to_oochars hawk_copy_uchars_to_bchars
# define hawk_copy_oochars_to_uchars(dst,src,len) hawk_copy_bchars_to_uchars(dst,src,len) # define hawk_copy_oochars_to_uchars hawk_copy_bchars_to_uchars
# define hawk_copy_oochars_to_oocstr(dst,dlen,src,slen) hawk_copy_bchars_to_bcstr(dst,dlen,src,slen) # define hawk_copy_oochars_to_oocstr(dst,dlen,src,slen) hawk_copy_bchars_to_bcstr(dst,dlen,src,slen)
# define hawk_copy_oochars_to_oocstr_unlimited(dst,src,len) hawk_copy_bchars_to_bcstr_unlimited(dst,src,len) # define hawk_copy_oochars_to_oocstr_unlimited(dst,src,len) hawk_copy_bchars_to_bcstr_unlimited(dst,src,len)

View File

@ -1926,6 +1926,7 @@ static HAWK_INLINE hawk_uch_t* hawk_dupbtoucstr (hawk_t* hawk, const hawk_bch_t*
static HAWK_INLINE hawk_bch_t* hawk_duputobcstr (hawk_t* hawk, const hawk_uch_t* ucs, hawk_oow_t* _bcslen) { return hawk_gem_duputobcstr(hawk_getgem(hawk), ucs, _bcslen); } static HAWK_INLINE hawk_bch_t* hawk_duputobcstr (hawk_t* hawk, const hawk_uch_t* ucs, hawk_oow_t* _bcslen) { return hawk_gem_duputobcstr(hawk_getgem(hawk), ucs, _bcslen); }
static HAWK_INLINE hawk_uch_t* hawk_dupbtoucharswithcmgr (hawk_t* hawk, const hawk_bch_t* bcs, hawk_oow_t _bcslen, hawk_oow_t* _ucslen, hawk_cmgr_t* cmgr, int all) { return hawk_gem_dupbtoucharswithcmgr(hawk_getgem(hawk), bcs, _bcslen, _ucslen, cmgr, all); } static HAWK_INLINE hawk_uch_t* hawk_dupbtoucharswithcmgr (hawk_t* hawk, const hawk_bch_t* bcs, hawk_oow_t _bcslen, hawk_oow_t* _ucslen, hawk_cmgr_t* cmgr, int all) { return hawk_gem_dupbtoucharswithcmgr(hawk_getgem(hawk), bcs, _bcslen, _ucslen, cmgr, all); }
static HAWK_INLINE hawk_bch_t* hawk_duputobcharswithcmgr (hawk_t* hawk, const hawk_uch_t* ucs, hawk_oow_t _ucslen, hawk_oow_t* _bcslen, hawk_cmgr_t* cmgr) { return hawk_gem_duputobcharswithcmgr(hawk_getgem(hawk), ucs, _ucslen, _bcslen, cmgr); } static HAWK_INLINE hawk_bch_t* hawk_duputobcharswithcmgr (hawk_t* hawk, const hawk_uch_t* ucs, hawk_oow_t _ucslen, hawk_oow_t* _bcslen, hawk_cmgr_t* cmgr) { return hawk_gem_duputobcharswithcmgr(hawk_getgem(hawk), ucs, _ucslen, _bcslen, cmgr); }
static HAWK_INLINE hawk_uch_t* hawk_dupbcstrarrtoucstr (hawk_t* hawk, const hawk_bch_t* bcsarr[], hawk_oow_t* ucslen, int all) { return hawk_gem_dupbcstrarrtoucstr(hawk_getgem(hawk), bcsarr, ucslen, all); }
static HAWK_INLINE hawk_bch_t* hawk_dupucstrarrtobcstr (hawk_t* hawk, const hawk_uch_t* ucsarr[], hawk_oow_t* bcslen) { return hawk_gem_dupucstrarrtobcstr(hawk_getgem(hawk), ucsarr, bcslen); } static HAWK_INLINE hawk_bch_t* hawk_dupucstrarrtobcstr (hawk_t* hawk, const hawk_uch_t* ucsarr[], hawk_oow_t* bcslen) { return hawk_gem_dupucstrarrtobcstr(hawk_getgem(hawk), ucsarr, bcslen); }
#else #else
#define hawk_dupbtouchars(hawk, bcs, _bcslen, _ucslen, all) hawk_gem_dupbtouchars(hawk_getgem(hawk), bcs, _bcslen, _ucslen, all) #define hawk_dupbtouchars(hawk, bcs, _bcslen, _ucslen, all) hawk_gem_dupbtouchars(hawk_getgem(hawk), bcs, _bcslen, _ucslen, all)
@ -1936,6 +1937,7 @@ static HAWK_INLINE hawk_bch_t* hawk_dupucstrarrtobcstr (hawk_t* hawk, const hawk
#define hawk_duputobcstr(hawk, ucs, _bcslen) hawk_gem_duputobcstr(hawk_getgem(hawk), ucs, _bcslen) #define hawk_duputobcstr(hawk, ucs, _bcslen) hawk_gem_duputobcstr(hawk_getgem(hawk), ucs, _bcslen)
#define hawk_dupbtoucharswithcmgr(hawk, bcs, _bcslen, _ucslen, cmgr, all) hawk_gem_dupbtoucharswithcmgr(hawk_getgem(hawk), bcs, _bcslen, _ucslen, cmgr, all) #define hawk_dupbtoucharswithcmgr(hawk, bcs, _bcslen, _ucslen, cmgr, all) hawk_gem_dupbtoucharswithcmgr(hawk_getgem(hawk), bcs, _bcslen, _ucslen, cmgr, all)
#define hawk_duputobcharswithcmgr(hawk, ucs, _ucslen, _bcslen, cmgr) hawk_gem_duputobcharswithcmgr(hawk_getgem(hawk), ucs, _ucslen, _bcslen, cmgr) #define hawk_duputobcharswithcmgr(hawk, ucs, _ucslen, _bcslen, cmgr) hawk_gem_duputobcharswithcmgr(hawk_getgem(hawk), ucs, _ucslen, _bcslen, cmgr)
#define hawk_dupbcstrarrtoucstr(hawk, bcsarr, ucslen, all) hawk_gem_dupbcstrarrtoucstr(hawk_getgem(hawk), bcsarr, ucslen, all)
#define hawk_dupucstrarrtobcstr(hawk, ucsarr, bcslen) hawk_gem_dupucstrarrtobcstr(hawk_getgem(hawk), ucsarr, bcslen) #define hawk_dupucstrarrtobcstr(hawk, ucsarr, bcslen) hawk_gem_dupucstrarrtobcstr(hawk_getgem(hawk), ucsarr, bcslen)
#endif #endif
@ -3169,6 +3171,7 @@ static HAWK_INLINE hawk_uch_t* hawk_rtx_dupbtoucstr (hawk_rtx_t* rtx, const hawk
static HAWK_INLINE hawk_bch_t* hawk_rtx_duputobcstr (hawk_rtx_t* rtx, const hawk_uch_t* ucs, hawk_oow_t* _bcslen) { return hawk_gem_duputobcstr(hawk_rtx_getgem(rtx), ucs, _bcslen); } static HAWK_INLINE hawk_bch_t* hawk_rtx_duputobcstr (hawk_rtx_t* rtx, const hawk_uch_t* ucs, hawk_oow_t* _bcslen) { return hawk_gem_duputobcstr(hawk_rtx_getgem(rtx), ucs, _bcslen); }
static HAWK_INLINE hawk_uch_t* hawk_rtx_dupbtoucharswithcmgr (hawk_rtx_t* rtx, const hawk_bch_t* bcs, hawk_oow_t _bcslen, hawk_oow_t* _ucslen, hawk_cmgr_t* cmgr, int all) { return hawk_gem_dupbtoucharswithcmgr(hawk_rtx_getgem(rtx), bcs, _bcslen, _ucslen, cmgr, all); } static HAWK_INLINE hawk_uch_t* hawk_rtx_dupbtoucharswithcmgr (hawk_rtx_t* rtx, const hawk_bch_t* bcs, hawk_oow_t _bcslen, hawk_oow_t* _ucslen, hawk_cmgr_t* cmgr, int all) { return hawk_gem_dupbtoucharswithcmgr(hawk_rtx_getgem(rtx), bcs, _bcslen, _ucslen, cmgr, all); }
static HAWK_INLINE hawk_bch_t* hawk_rtx_duputobcharswithcmgr (hawk_rtx_t* rtx, const hawk_uch_t* ucs, hawk_oow_t _ucslen, hawk_oow_t* _bcslen, hawk_cmgr_t* cmgr) { return hawk_gem_duputobcharswithcmgr(hawk_rtx_getgem(rtx), ucs, _ucslen, _bcslen, cmgr); } static HAWK_INLINE hawk_bch_t* hawk_rtx_duputobcharswithcmgr (hawk_rtx_t* rtx, const hawk_uch_t* ucs, hawk_oow_t _ucslen, hawk_oow_t* _bcslen, hawk_cmgr_t* cmgr) { return hawk_gem_duputobcharswithcmgr(hawk_rtx_getgem(rtx), ucs, _ucslen, _bcslen, cmgr); }
static HAWK_INLINE hawk_uch_t* hawk_rtx_dupbcstrarrtoucstr (hawk_rtx_t* rtx, const hawk_bch_t* bcsarr[], hawk_oow_t* ucslen, int all) { return hawk_gem_dupbcstrarrtoucstr(hawk_rtx_getgem(rtx), bcsarr, ucslen, all); }
static HAWK_INLINE hawk_bch_t* hawk_rtx_dupucstrarrtobcstr (hawk_rtx_t* rtx, const hawk_uch_t* ucsarr[], hawk_oow_t* bcslen) { return hawk_gem_dupucstrarrtobcstr(hawk_rtx_getgem(rtx), ucsarr, bcslen); } static HAWK_INLINE hawk_bch_t* hawk_rtx_dupucstrarrtobcstr (hawk_rtx_t* rtx, const hawk_uch_t* ucsarr[], hawk_oow_t* bcslen) { return hawk_gem_dupucstrarrtobcstr(hawk_rtx_getgem(rtx), ucsarr, bcslen); }
#else #else
#define hawk_rtx_dupbtouchars(rtx, bcs, _bcslen, _ucslen, all) hawk_gem_dupbtouchars(hawk_rtx_getgem(rtx), bcs, _bcslen, _ucslen, all) #define hawk_rtx_dupbtouchars(rtx, bcs, _bcslen, _ucslen, all) hawk_gem_dupbtouchars(hawk_rtx_getgem(rtx), bcs, _bcslen, _ucslen, all)
@ -3179,6 +3182,7 @@ static HAWK_INLINE hawk_bch_t* hawk_rtx_dupucstrarrtobcstr (hawk_rtx_t* rtx, con
#define hawk_rtx_duputobcstr(rtx, ucs, _bcslen) hawk_gem_duputobcstr(hawk_rtx_getgem(rtx), ucs, _bcslen) #define hawk_rtx_duputobcstr(rtx, ucs, _bcslen) hawk_gem_duputobcstr(hawk_rtx_getgem(rtx), ucs, _bcslen)
#define hawk_rtx_dupbtoucharswithcmgr(rtx, bcs, _bcslen, _ucslen, cmgr, all) hawk_gem_dupbtoucharswithcmgr(hawk_rtx_getgem(rtx), bcs, _bcslen, _ucslen, cmgr, all) #define hawk_rtx_dupbtoucharswithcmgr(rtx, bcs, _bcslen, _ucslen, cmgr, all) hawk_gem_dupbtoucharswithcmgr(hawk_rtx_getgem(rtx), bcs, _bcslen, _ucslen, cmgr, all)
#define hawk_rtx_duputobcharswithcmgr(rtx, ucs, _ucslen, _bcslen, cmgr) hawk_gem_duputobcharswithcmgr(hawk_rtx_getgem(rtx), ucs, _ucslen, _bcslen, cmgr) #define hawk_rtx_duputobcharswithcmgr(rtx, ucs, _ucslen, _bcslen, cmgr) hawk_gem_duputobcharswithcmgr(hawk_rtx_getgem(rtx), ucs, _ucslen, _bcslen, cmgr)
#define hawk_rtx_dupbcstrarrtoucstr(rtx, bcsarr, ucslen, all) hawk_gem_dupbcstrarrtoucstr(hawk_rtx_getgem(hawk), bcsarr, ucslen, all)
#define hawk_rtx_dupucstrarrtobcstr(rtx, ucsarr, bcslen) hawk_gem_dupucstrarrtobcstr(hawk_rtx_getgem(rtx), ucsarr, bcslen) #define hawk_rtx_dupucstrarrtobcstr(rtx, ucsarr, bcslen) hawk_gem_dupucstrarrtobcstr(hawk_rtx_getgem(rtx), ucsarr, bcslen)
#endif #endif

View File

@ -36,7 +36,7 @@
# error QUADMATH.H NOT AVAILABLE or NOT COMPILABLE # error QUADMATH.H NOT AVAILABLE or NOT COMPILABLE
#endif #endif
#if !defined(HAWK_HAVE_CONFIG_H) #if !defined(HAWK_HAVE_CFG_H)
# if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) # if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
# define HAVE_CEIL # define HAVE_CEIL
# define HAVE_FLOOR # define HAVE_FLOOR
@ -64,7 +64,9 @@
typedef struct modctx_t typedef struct modctx_t
{ {
unsigned int seed; unsigned int seed;
#if defined(HAVE_RANDOM_R)
struct random_data prand; struct random_data prand;
#endif
} modctx_t; } modctx_t;
static int fnc_math_1 (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, hawk_math1_t f) static int fnc_math_1 (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi, hawk_math1_t f)
@ -534,7 +536,13 @@ static int fnc_rand (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
modctx_t* modctx; modctx_t* modctx;
modctx = (modctx_t*)fi->mod->ctx; modctx = (modctx_t*)fi->mod->ctx;
#if defined(HAVE_RANDOM_R)
random_r (&modctx->prand, &randv); random_r (&modctx->prand, &randv);
#elif defined(HAVE_RANDOM)
randv = random();
#else
randv = rand();
#endif
r = hawk_rtx_makefltval(rtx, (hawk_flt_t)randv / RANDV_MAX); r = hawk_rtx_makefltval(rtx, (hawk_flt_t)randv / RANDV_MAX);
if (r == HAWK_NULL) return -1; if (r == HAWK_NULL) return -1;
@ -562,17 +570,29 @@ static int fnc_srand (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
if (nargs <= 0) if (nargs <= 0)
{ {
struct timeval tv; hawk_ntime_t tv;
gettimeofday (&tv, HAWK_NULL); hawk_get_time (&tv);
modctx->seed = tv.tv_sec * tv.tv_usec; modctx->seed = tv.sec + tv.nsec;
#if defined(HAVE_RANDOM_R)
srandom_r (modctx->seed, &modctx->prand); srandom_r (modctx->seed, &modctx->prand);
#elif defined(HAVE_RANDOM)
srandom (modctx->seed);
#else
srand (modctx->seed);
#endif
} }
else else
{ {
a0 = hawk_rtx_getarg(rtx, 0); a0 = hawk_rtx_getarg(rtx, 0);
n = hawk_rtx_valtoint(rtx, a0, &lv); n = hawk_rtx_valtoint(rtx, a0, &lv);
if (n <= -1) return -1; if (n <= -1) return -1;
#if defined(HAVE_RANDOM_R)
srandom_r (lv, &modctx->prand); srandom_r (lv, &modctx->prand);
#elif defined(HAVE_RANDOM)
srandom (lv);
#else
srand (lv);
#endif
} }
r = hawk_rtx_makeintval (rtx, prev); r = hawk_rtx_makeintval (rtx, prev);
@ -685,16 +705,22 @@ static void unload (hawk_mod_t* mod, hawk_t* awk)
int hawk_mod_math (hawk_mod_t* mod, hawk_t* awk) int hawk_mod_math (hawk_mod_t* mod, hawk_t* awk)
{ {
modctx_t* modctx; modctx_t* modctx;
struct timeval tv; hawk_ntime_t tv;
modctx = hawk_allocmem(awk, HAWK_SIZEOF(*modctx)); modctx = hawk_allocmem(awk, HAWK_SIZEOF(*modctx));
if (modctx == HAWK_NULL) return -1; if (modctx == HAWK_NULL) return -1;
HAWK_MEMSET (modctx, 0, HAWK_SIZEOF(*modctx)); HAWK_MEMSET (modctx, 0, HAWK_SIZEOF(*modctx));
gettimeofday (&tv, HAWK_NULL); hawk_get_time (&tv);
modctx->seed = tv.tv_sec * tv.tv_usec; modctx->seed = tv.sec + tv.nsec;
#if defined(HAVE_RANDOM_R)
srandom_r (modctx->seed, &modctx->prand); srandom_r (modctx->seed, &modctx->prand);
#elif defined(HAVE_RANDOM)
srandom (modctx->seed);
#else
srand (modctx->seed);
#endif
mod->query = query; mod->query = query;
mod->unload = unload; mod->unload = unload;

View File

@ -257,23 +257,19 @@ static int make_param (hawk_pio_t* pio, const hawk_ooch_t* cmd, int flags, param
if (flags & HAWK_PIO_SHELL) mcmd = (hawk_ooch_t*)cmd; if (flags & HAWK_PIO_SHELL) mcmd = (hawk_ooch_t*)cmd;
else else
{ {
mcmd = hawk_strdup (cmd, pio->mmgr); mcmd = hawk_gem_dupoocstr(pio->gem, cmd, HAWK_NULL);
if (mcmd == HAWK_NULL) if (mcmd == HAWK_NULL) goto oops;
{
pio->errnum = HAWK_PIO_ENOMEM;
goto oops;
}
fcnt = hawk_split_oocstr(mcmd, HAWK_T(""), HAWK_T('\"'), HAWK_T('\"'), HAWK_T('\\')); fcnt = hawk_split_oocstr(mcmd, HAWK_T(""), HAWK_T('\"'), HAWK_T('\"'), HAWK_T('\\'));
if (fcnt <= 0) if (fcnt <= 0)
{ {
/* no field or an error */ /* no field or an error */
pio->errnum = HAWK_PIO_EINVAL; hawk_gem_seterrnum (pio->gem, HAWK_NULL, HAWK_EINVAL);
goto oops; goto oops;
} }
} }
#else #else
if (flags & HAWK_PIO_MBSCMD) if (flags & HAWK_PIO_BCSTRCMD)
{ {
/* the cmd is flagged to be of hawk_bch_t /* the cmd is flagged to be of hawk_bch_t
* while the default character type is hawk_uch_t. */ * while the default character type is hawk_uch_t. */
@ -898,28 +894,30 @@ create_process:
}; };
#if defined(HAWK_OOCH_IS_UCH) #if defined(HAWK_OOCH_IS_UCH)
if (flags & HAWK_PIO_MBSCMD) if (flags & HAWK_PIO_BCSTRCMD)
{ {
const hawk_bch_t* x[3]; const hawk_bch_t* x[3];
x[0] = mcmdname[create_retried]; x[0] = mcmdname[create_retried];
x[1] = (const hawk_bch_t*)cmd; x[1] = (const hawk_bch_t*)cmd;
x[2] = HAWK_NULL; x[2] = HAWK_NULL;
dupcmd = hawk_mbsatowcsdup(x, HAWK_NULL, mmgr); dupcmd = hawk_gem_dupbcstrarrtoucstr(pio->gem, x, HAWK_NULL, 0);
} }
else else
#endif
{ {
#endif const hawk_ooch_t* x[3];
dupcmd = hawk_strdup2(cmdname[create_retried], cmd, mmgr); x[0] = cmdname[create_retried];
#if defined(HAWK_OOCH_IS_UCH) x[1] = cmd;
x[2] = HAWK_NULL;
dupcmd = hawk_gem_dupoocstrarr(pio->gem, x, HAWK_NULL);
} }
#endif
} }
else else
{ {
#if defined(HAWK_OOCH_IS_UCH) #if defined(HAWK_OOCH_IS_UCH)
if (flags & HAWK_PIO_MBSCMD) if (flags & HAWK_PIO_BCSTRCMD)
{ {
dupcmd = hawk_dupbtoucstr (pio->gem, (const hawk_bch_t*)cmd, HAWK_NULL, 0); dupcmd = hawk_gem_dupbtoucstr(pio->gem, (const hawk_bch_t*)cmd, HAWK_NULL, 0);
} }
else else
{ {
@ -1079,7 +1077,7 @@ create_process:
if (maxidx == -1) if (maxidx == -1)
{ {
pio->errnum = HAWK_PIO_EINVAL; hawk_gem_seterrnum (pio->gem, HAWK_NULL, HAWK_EINVAL);
goto oops; goto oops;
} }
@ -1195,46 +1193,38 @@ create_process:
hawk_oow_t n, mn; hawk_oow_t n, mn;
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
mn = hawk_strlen(cmd); mn = hawk_count_oocstr(cmd);
#else #else
if (flags & HAWK_PIO_MBSCMD) if (flags & HAWK_PIO_BCSTRCMD)
{ {
mn = hawk_mbslen((const hawk_bch_t*)cmd); mn = hawk_count_bcstr((const hawk_bch_t*)cmd);
} }
else else
{ {
if (hawk_wcstombs (cmd, &n, HAWK_NULL, &mn) <= -1) if (hawk_gem_convutobcstr(pio->gem, cmd, &n, HAWK_NULL, &mn) <= -1) goto oops; /* illegal sequence found */
{
pio->errnum = HAWK_PIO_EINVAL;
goto oops; /* illegal sequence found */
}
} }
#endif #endif
cmd_line = hawk_allocmem(hawk, ((11+mn+1+1) * HAWK_SIZEOF(*cmd_line))); cmd_line = hawk_gem_allocmem(pio->gem, ((11+mn+1+1) * HAWK_SIZEOF(*cmd_line)));
if (cmd_line == HAWK_NULL) if (cmd_line == HAWK_NULL) goto oops;
{
pio->errnum = HAWK_PIO_ENOMEM;
goto oops;
}
hawk_mbscpy (cmd_line, HAWK_BT("cmd.exe")); /* cmd.exe\0/c */ hawk_copy_bcstr_unlimited (cmd_line, "cmd.exe"); /* cmd.exe\0/c */
hawk_mbscpy (&cmd_line[8], HAWK_BT("/c ")); hawk_copy_bcstr_unlimited (&cmd_line[8], "/c ");
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
hawk_mbscpy (&cmd_line[11], cmd); hawk_copy_bcstr_unlimited (&cmd_line[11], cmd);
#else #else
if (flags & HAWK_PIO_MBSCMD) if (flags & HAWK_PIO_BCSTRCMD)
{ {
hawk_mbscpy (&cmd_line[11], (const hawk_bch_t*)cmd); hawk_copy_bcstr_unlimited (&cmd_line[11], (const hawk_bch_t*)cmd);
} }
else else
{ {
mn = mn + 1; /* update the buffer size */ mn = mn + 1; /* update the buffer size */
hawk_wcstombs (cmd, &n, &cmd_line[11], &mn); hawk_gem_convutobcstr (pio->gem, cmd, &n, &cmd_line[11], &mn);
} }
#endif #endif
cmd_line[11+mn+1] = HAWK_BT('\0'); /* additional \0 after \0 */ cmd_line[11+mn+1] = '\0'; /* additional \0 after \0 */
cmd_file = HAWK_BT("cmd.exe"); cmd_file = "cmd.exe";
} }
else else
{ {
@ -1242,23 +1232,27 @@ create_process:
hawk_oow_t mn; hawk_oow_t mn;
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
const hawk_ooch_t* strarr[3];
strarr[0] = cmd;
strarr[1] = HAWK_T(" ");
strarr[2] = HAWK_NULL;
mn = hawk_count_oocstr(cmd); mn = hawk_count_oocstr(cmd);
cmd_line = hawk_strdup2 (cmd, HAWK_T(" "), pio->mmgr); cmd_line = hawk_dupucstrarr(pio->gem, strarr HAWK_NULL);
if (cmd_line == HAWK_NULL) if (cmd_line == HAWK_NULL) goto oops;
{
pio->errnum = HAWK_PIO_ENOMEM;
goto oops;
}
#else #else
if (flags & HAWK_PIO_MBSCMD) if (flags & HAWK_PIO_BCSTRCMD)
{ {
const hawk_bch_t* mbsarr[3];
mbsarr[0] = (const hawk_bch_t*)cmd;
mbsarr[1] = " ";
mbsarr[2] = HAWK_NULL;
mn = hawk_count_bcstr((const hawk_bch_t*)cmd); mn = hawk_count_bcstr((const hawk_bch_t*)cmd);
cmd_line = hawk_mbsdup2 ((const hawk_bch_t*)cmd, HAWK_BT(" "), pio->mmgr); cmd_line = hawk_dupbcstrarr(pio->gem, mbsarr, HAWK_NULL);
if (cmd_line == HAWK_NULL) if (cmd_line == HAWK_NULL) goto oops;
{
pio->errnum = HAWK_PIO_ENOMEM;
goto oops;
}
} }
else else
{ {
@ -1315,7 +1309,7 @@ create_process:
#elif defined(__DOS__) #elif defined(__DOS__)
/* DOS not multi-processed. can't support pio */ /* DOS not multi-processed. can't support pio */
pio->errnum = HAWK_PIO_ENOIMPL; hawk_gem_seterrnum (pio->gem, HAWK_NULL, HAWK_ENOIMPL);
return -1; return -1;
#else #else

View File

@ -457,7 +457,7 @@ hawk_ooi_t hawk_sio_putucstr (hawk_sio_t* sio, const hawk_uch_t* str)
if (hawk_sio_flush (sio) <= -1) return -1; /* can't do buffering */ if (hawk_sio_flush (sio) <= -1) return -1; /* can't do buffering */
for (cur = str, left = hawk_wcslen(str); left > 0; cur += count, left -= count) for (cur = str, left = hawk_count_ucstr(str); left > 0; cur += count, left -= count)
{ {
if (WriteConsoleW(sio->file.handle, cur, left, &count, HAWK_NULL) == FALSE) if (WriteConsoleW(sio->file.handle, cur, left, &count, HAWK_NULL) == FALSE)
{ {

View File

@ -41,10 +41,11 @@
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
# include <tchar.h> # include <tchar.h>
# if defined(HAWK_HAVE_CONFIG_H) && defined(HAWK_ENABLE_LIBLTDL) # if defined(HAWK_HAVE_CFG_H) && defined(HAWK_ENABLE_LIBLTDL)
# include <ltdl.h> # include <ltdl.h>
# define USE_LTDL # define USE_LTDL
# endif # endif
# include <io.h>
#elif defined(__OS2__) #elif defined(__OS2__)
# define INCL_DOSMODULEMGR # define INCL_DOSMODULEMGR
# define INCL_DOSPROCESS # define INCL_DOSPROCESS
@ -65,7 +66,7 @@
# endif # endif
#endif #endif
#if !defined(HAWK_HAVE_CONFIG_H) #if !defined(HAWK_HAVE_CFG_H)
# if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) # if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
# define HAVE_POW # define HAVE_POW
# define HAVE_FMOD # define HAVE_FMOD
@ -137,8 +138,6 @@ typedef struct xtn_t
int gbl_argc; int gbl_argc;
int gbl_argv; int gbl_argv;
int gbl_environ; int gbl_environ;
int gbl_errno;
int gbl_errstr;
hawk_ecb_t ecb; hawk_ecb_t ecb;
int stdmod_up; int stdmod_up;
@ -355,12 +354,8 @@ void* hawk_stdmodopen (hawk_t* awk, const hawk_mod_spec_t* spec)
if (spec->postfix) tmp[count++] = spec->postfix; if (spec->postfix) tmp[count++] = spec->postfix;
tmp[count] = HAWK_NULL; tmp[count] = HAWK_NULL;
modpath = hawk_stradup (tmp, HAWK_NULL, hawk_getmmgr(awk)); modpath = hawk_dupoocstrarr(awk, tmp, HAWK_NULL);
if (!modpath) if (!modpath) return HAWK_NULL;
{
hawk_seterrnum (awk, HAWK_ENOMEM, HAWK_NULL);
return HAWK_NULL;
}
h = LoadLibrary (modpath); h = LoadLibrary (modpath);
@ -3030,14 +3025,10 @@ static int add_globals (hawk_t* awk)
xtn->gbl_argc = hawk_addgbl(awk, HAWK_T("ARGC")); xtn->gbl_argc = hawk_addgbl(awk, HAWK_T("ARGC"));
xtn->gbl_argv = hawk_addgbl(awk, HAWK_T("ARGV")); xtn->gbl_argv = hawk_addgbl(awk, HAWK_T("ARGV"));
xtn->gbl_environ = hawk_addgbl(awk, HAWK_T("ENVIRON")); xtn->gbl_environ = hawk_addgbl(awk, HAWK_T("ENVIRON"));
xtn->gbl_errno = hawk_addgbl(awk, HAWK_T("ERRNO"));
xtn->gbl_errstr = hawk_addgbl(awk, HAWK_T("ERRSTR"));
return (xtn->gbl_argc <= -1 || return (xtn->gbl_argc <= -1 ||
xtn->gbl_argv <= -1 || xtn->gbl_argv <= -1 ||
xtn->gbl_environ <= -1 || xtn->gbl_environ <= -1)? -1: 0;
xtn->gbl_errno <= -1 ||
xtn->gbl_errstr <= -1)? -1: 0;
} }
struct fnctab_t struct fnctab_t

View File

@ -446,10 +446,10 @@ retry:
{ {
#ifdef TRE_WCHAR #ifdef TRE_WCHAR
if (type == STR_WIDE) if (type == STR_WIDE)
result = hawk_comp_ucstr_limited((const hawk_uch_t*)string + so, str_wide - 1, (size_t)bt_len); result = hawk_comp_ucstr_limited((const hawk_uch_t*)string + so, str_wide - 1, (size_t)bt_len, 0);
else else
#endif /* TRE_WCHAR */ #endif /* TRE_WCHAR */
result = hawk_comp_bcstr_limited((const char*)string + so, str_byte - 1, (size_t)bt_len); result = hawk_comp_bcstr_limited((const char*)string + so, str_byte - 1, (size_t)bt_len, 0);
} }
else if (len - pos < bt_len) else if (len - pos < bt_len)
result = 1; result = 1;

View File

@ -195,30 +195,56 @@ int hawk_comp_bcstr (const hawk_bch_t* str1, const hawk_bch_t* str2, int ignorec
} }
int hawk_comp_ucstr_limited (const hawk_uch_t* str1, const hawk_uch_t* str2, hawk_oow_t maxlen) int hawk_comp_ucstr_limited (const hawk_uch_t* str1, const hawk_uch_t* str2, hawk_oow_t maxlen, int ignorecase)
{ {
if (maxlen == 0) return 0; if (maxlen == 0) return 0;
while (*str1 == *str2) if (ignorecase)
{ {
if (*str1 == '\0' || maxlen == 1) return 0; while (hawk_to_uch_lower(*str1) == hawk_to_uch_lower(*str2))
str1++; str2++; maxlen--; {
} if (*str1 == '\0' || maxlen == 1) return 0;
str1++; str2++; maxlen--;
}
return ((hawk_uchu_t)*str1 > (hawk_uchu_t)*str2)? 1: -1; return ((hawk_uchu_t)hawk_to_uch_lower(*str1) > (hawk_uchu_t)hawk_to_uch_lower(*str2))? 1: -1;
}
else
{
while (*str1 == *str2)
{
if (*str1 == '\0' || maxlen == 1) return 0;
str1++; str2++; maxlen--;
}
return ((hawk_uchu_t)*str1 > (hawk_uchu_t)*str2)? 1: -1;
}
} }
int hawk_comp_bcstr_limited (const hawk_bch_t* str1, const hawk_bch_t* str2, hawk_oow_t maxlen) int hawk_comp_bcstr_limited (const hawk_bch_t* str1, const hawk_bch_t* str2, hawk_oow_t maxlen, int ignorecase)
{ {
if (maxlen == 0) return 0; if (maxlen == 0) return 0;
while (*str1 == *str2) if (ignorecase)
{ {
if (*str1 == '\0' || maxlen == 1) return 0; while (hawk_to_uch_lower(*str1) == hawk_to_uch_lower(*str2))
str1++; str2++; maxlen--; {
} if (*str1 == '\0' || maxlen == 1) return 0;
str1++; str2++; maxlen--;
}
return ((hawk_bchu_t)*str1 > (hawk_bchu_t)*str2)? 1: -1; return ((hawk_bchu_t)hawk_to_uch_lower(*str1) > (hawk_bchu_t)hawk_to_uch_lower(*str2))? 1: -1;
}
else
{
while (*str1 == *str2)
{
if (*str1 == '\0' || maxlen == 1) return 0;
str1++; str2++; maxlen--;
}
return ((hawk_bchu_t)*str1 > (hawk_bchu_t)*str2)? 1: -1;
}
} }
int hawk_comp_ucstr_bcstr (const hawk_uch_t* str1, const hawk_bch_t* str2) int hawk_comp_ucstr_bcstr (const hawk_uch_t* str1, const hawk_bch_t* str2)