refactoring
This commit is contained in:
		| @ -21,6 +21,6 @@ bin_PROGRAMS = hawk | ||||
| hawk_SOURCES = main.c  | ||||
| hawk_CPPFLAGS = $(CPPFLAGS_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 | ||||
|  | ||||
|  | ||||
| @ -353,7 +353,7 @@ LIBADD_BIN_COMMON = $(LIBM) | ||||
| hawk_SOURCES = main.c  | ||||
| hawk_CPPFLAGS = $(CPPFLAGS_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 | ||||
| all: all-am | ||||
|  | ||||
|  | ||||
							
								
								
									
										109
									
								
								hawk/bin/main.c
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								hawk/bin/main.c
									
									
									
									
									
								
							| @ -26,6 +26,7 @@ | ||||
|  | ||||
| #include <hawk-std.h> | ||||
| #include <hawk-utl.h> | ||||
| #include <hawk-fmt.h> | ||||
| #include <hawk-cli.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; | ||||
| struct sig_state_t | ||||
| { | ||||
| 	hawk_oow_t handler; | ||||
| 	hawk_oow_t old_handler; | ||||
| 	hawk_uintptr_t handler; | ||||
| 	hawk_uintptr_t old_handler; | ||||
| #if defined(HAVE_SIGACTION) | ||||
| 	sigset_t  old_sa_mask; | ||||
| 	int       old_sa_flags; | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| typedef void (*sig_handler_t) (int sig); | ||||
|  | ||||
| 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) | ||||
| { | ||||
| 	if (g_sig_state[sig].handler != (hawk_oow_t)SIG_IGN && | ||||
| 	    g_sig_state[sig].handler != (hawk_oow_t)SIG_DFL) | ||||
| 	if (g_sig_state[sig].handler != (hawk_uintptr_t)SIG_IGN && | ||||
| 	    g_sig_state[sig].handler != (hawk_uintptr_t)SIG_DFL) | ||||
| 	{ | ||||
| 		((sig_handler_t)g_sig_state[sig].handler) (sig); | ||||
| 	} | ||||
|  | ||||
| 	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_oow_t)SIG_DFL) | ||||
| 	    g_sig_state[sig].old_handler != (hawk_uintptr_t)SIG_IGN && | ||||
| 	    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); | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static void dispatch_signal (int sig) | ||||
| { | ||||
| 	if (g_sig_state[sig].handler != (hawk_oow_t)SIG_IGN && | ||||
| 	    g_sig_state[sig].handler != (hawk_oow_t)SIG_DFL) | ||||
| 	if (g_sig_state[sig].handler != (hawk_uintptr_t)SIG_IGN && | ||||
| 	    g_sig_state[sig].handler != (hawk_uintptr_t)SIG_DFL) | ||||
| 	{ | ||||
| 		((sig_handler_t)g_sig_state[sig].handler) (sig); | ||||
| 	} | ||||
|  | ||||
| 	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_oow_t)SIG_DFL) | ||||
| 	    g_sig_state[sig].old_handler != (hawk_uintptr_t)SIG_IGN && | ||||
| 	    g_sig_state[sig].old_handler != (hawk_uintptr_t)SIG_DFL) | ||||
| 	{ | ||||
| 		((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) | ||||
| 	{ | ||||
| 		/* already set - allow handler change. ignore extra_flags. */ | ||||
| 		if (g_sig_state[sig].handler == (hawk_oow_t)handler) return -1; | ||||
| 		g_sig_state[sig].handler = (hawk_oow_t)handler; | ||||
| 		if (g_sig_state[sig].handler == (hawk_uintptr_t)handler) return -1; | ||||
| 		g_sig_state[sig].handler = (hawk_uintptr_t)handler; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 	#if defined(HAVE_SIGACTION) | ||||
| 		struct sigaction sa, oldsa; | ||||
|  | ||||
| 		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; | ||||
|  | ||||
| 		g_sig_state[sig].handler = (hawk_oow_t)handler; | ||||
| 		g_sig_state[sig].handler = (hawk_uintptr_t)handler; | ||||
| 		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 | ||||
| 			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_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; | ||||
| @ -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) | ||||
| { | ||||
| #if defined(HAVE_SIGACTION) | ||||
| 	struct sigaction sa; | ||||
| #endif | ||||
|  | ||||
| 	if (!g_sig_state[sig].handler) return -1; /* not set */ | ||||
|  | ||||
| #if defined(HAVE_SIGACTION) | ||||
| 	HAWK_MEMSET (&sa, 0, HAWK_SIZEOF(sa)); | ||||
| 	sa.sa_mask = g_sig_state[sig].old_sa_mask; | ||||
| 	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; | ||||
| #else | ||||
| 	signal (sig, (sig_handler_t)g_sig_state[sig].old_handler); | ||||
| #endif | ||||
|  | ||||
| 	g_sig_state[sig].handler = 0; | ||||
| 	/* keep other fields untouched */ | ||||
| @ -253,14 +272,6 @@ static int unset_signal_handler (int sig) | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int is_signal_handler_set (int sig) | ||||
| { | ||||
| 	return !!g_sig_state[sig].handler; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* ---------------------------------------------------------------------- */ | ||||
|  | ||||
| static void stop_run (int signo) | ||||
| @ -282,9 +293,15 @@ static void do_nothing (int unused) | ||||
|  | ||||
| static void set_intr_run (void) | ||||
| { | ||||
| #if defined(SIGTERM) | ||||
| 	set_signal_handler (SIGTERM, stop_run, 0); | ||||
| #endif | ||||
| #if defined(SIGHUP) | ||||
| 	set_signal_handler (SIGHUP, stop_run, 0); | ||||
| #endif | ||||
| #if defined(SIGINT) | ||||
| 	set_signal_handler (SIGINT, stop_run, 0); | ||||
| #endif | ||||
| #if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) && defined(SIGPIPE) | ||||
| 	set_signal_handler (SIGPIPE, do_nothing, 0); | ||||
| #endif | ||||
| @ -292,9 +309,15 @@ static void set_intr_run (void) | ||||
|  | ||||
| static void unset_intr_run (void) | ||||
| { | ||||
| #if defined(SIGTERM) | ||||
| 	unset_signal_handler (SIGTERM); | ||||
| #endif | ||||
| #if defined(SIGHUP) | ||||
| 	unset_signal_handler (SIGHUP); | ||||
| #endif | ||||
| #if defined(SIGINT) | ||||
| 	unset_signal_handler (SIGINT); | ||||
| #endif | ||||
| #if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) && defined(SIGPIPE) | ||||
| 	unset_signal_handler (SIGPIPE); | ||||
| #endif | ||||
| @ -915,39 +938,36 @@ static void freearg (struct arg_t* arg) | ||||
| 	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"),  | ||||
| 		(int)hawk_geterrnum(awk), | ||||
| 		(int)hawk_geterrnum(hawk), | ||||
| 		(hawk_oow_t)loc->line, | ||||
| 		(hawk_oow_t)loc->colm, | ||||
| 		((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T("FILE ")), | ||||
| 		((loc->file == HAWK_NULL)? HAWK_T(""): loc->file), | ||||
| 		((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T(" ")), | ||||
| 		hawk_geterrmsg(awk) | ||||
| 		hawk_geterrmsg(hawk) | ||||
| 	); | ||||
| } | ||||
|  | ||||
| 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 */ | ||||
| printf ("print_hawk_rtx_error... TODO: \n"); | ||||
| /* | ||||
| 	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_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, | ||||
| 		HAWK_T("ERROR: CODE %d LINE %zu COLUMN %zu %js%js%js- %js\n"),  | ||||
| 		(int)hawk_rtx_geterrnum(rtx), | ||||
| 		(hawk_oow_t)loc->line, | ||||
| 		(hawk_oow_t)loc->colm, | ||||
| 		((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T("FILE ")), | ||||
| 		((loc->file == HAWK_NULL)? HAWK_T(""): loc->file), | ||||
| 		((loc->file == HAWK_NULL)? HAWK_T(""): HAWK_T(" ")), | ||||
| 		hawk_rtx_geterrmsg(rtx) | ||||
| 	);*/ | ||||
| 	); | ||||
| } | ||||
|  | ||||
| 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); | ||||
| 		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; | ||||
| 		} | ||||
| 		mmgr = &xma_mmgr; | ||||
| @ -1195,6 +1215,7 @@ oops: | ||||
| 	freearg (&arg); | ||||
|  | ||||
| #if defined(HAWK_BUILD_DEBUG) | ||||
| 	/* | ||||
| 	if (arg.failmalloc > 0) | ||||
| 	{ | ||||
| 		hawk_fprintf (HAWK_STDERR, HAWK_T("\n")); | ||||
| @ -1204,7 +1225,7 @@ oops: | ||||
| 			(unsigned long)debug_mmgr_free_count, | ||||
| 			(unsigned long)debug_mmgr_realloc_count); | ||||
| 		hawk_fprintf (HAWK_STDERR, HAWK_T("-------------------------------------------------------\n")); | ||||
| 	} | ||||
| 	}*/ | ||||
| #endif | ||||
|  | ||||
| 	return ret; | ||||
| @ -1232,12 +1253,12 @@ int main (int argc, hawk_bch_t* argv[]) | ||||
| 	if (codepage == CP_UTF8) | ||||
| 	{ | ||||
| 		/*SetConsoleOUtputCP (CP_UTF8);*/ | ||||
| 		hawk_setdflcmgrbyid (HAWK_CMGR_UTF8); | ||||
| 		/*hawk_setdflcmgrbyid (HAWK_CMGR_UTF8);*/ | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* .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); | ||||
| 		/* hawk_setdflcmgrbyid (HAWK_CMGR_SLMB); */ | ||||
| 	} | ||||
| @ -1250,7 +1271,7 @@ int main (int argc, hawk_bch_t* argv[]) | ||||
| #if defined(_WIN32) | ||||
| 	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; | ||||
| 		goto oops; | ||||
| 	} | ||||
| @ -1258,7 +1279,7 @@ int main (int argc, hawk_bch_t* argv[]) | ||||
| /* TODO: add an option to skip watt-32 */ | ||||
| 	_watt_do_exit = 0; /* prevent sock_init from exiting upon failure */ | ||||
| 	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; | ||||
| #endif | ||||
|  | ||||
|  | ||||
							
								
								
									
										2
									
								
								hawk/configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								hawk/configure
									
									
									
									
										vendored
									
									
								
							| @ -18734,7 +18734,7 @@ _ACEOF | ||||
| fi | ||||
| done | ||||
|  | ||||
| for ac_func in snprintf _vsnprintf _vsnwprintf strerror_r | ||||
| for ac_func in snprintf _vsnprintf _vsnwprintf strerror_r random_r random | ||||
| do : | ||||
|   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` | ||||
| ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" | ||||
|  | ||||
| @ -202,7 +202,7 @@ AC_CHECK_FUNCS([makecontext swapcontext getcontext setcontext]) | ||||
| AC_CHECK_FUNCS([clock_nanosleep nanosleep usleep]) | ||||
| AC_CHECK_FUNCS([localtime_r gmtime_r]) | ||||
| 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([isatty mmap munmap]) | ||||
| AC_CHECK_FUNCS([readdir64 dirfd faccessat]) | ||||
|  | ||||
| @ -1278,22 +1278,21 @@ static int get_devname_from_handle ( | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int get_volname_from_handle ( | ||||
| 	hawk_fio_t* fio, hawk_ooch_t* buf, hawk_oow_t len)  | ||||
| static int get_volname_from_handle (hawk_fio_t* fio, hawk_ooch_t* buf, hawk_oow_t len)  | ||||
| { | ||||
| 	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('\\');*/ | ||||
| 		hawk_strcpy (&buf[1], &buf[24]); | ||||
| 		hawk_copy_oocstr_unlimited (&buf[1], &buf[24]); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		DWORD n; | ||||
| 		hawk_ooch_t drives[128]; | ||||
|  | ||||
| 		n = GetLogicalDriveStrings (HAWK_COUNTOF(drives), drives); | ||||
| 		n = GetLogicalDriveStrings(HAWK_COUNTOF(drives), drives); | ||||
|  | ||||
| 		if (n == 0 /* error */ ||  | ||||
| 		    n > HAWK_COUNTOF(drives) /* buffer small */)  | ||||
| @ -1312,14 +1311,14 @@ static int get_volname_from_handle ( | ||||
| 			drv[2] = HAWK_T('\0'); | ||||
| 			if (QueryDosDevice (drv, path, HAWK_COUNTOF(path))) | ||||
| 			{ | ||||
| 				hawk_oow_t pl = hawk_strlen(path); | ||||
| 				hawk_oow_t bl = hawk_strlen(buf); | ||||
| 				hawk_oow_t pl = hawk_count_oocstr(path); | ||||
| 				hawk_oow_t bl = hawk_count_oocstr(buf); | ||||
| 				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[1] = HAWK_T(':'); | ||||
| 					hawk_strcpy (&buf[2], &buf[pl]); | ||||
| 					hawk_copy_oocstr_unlimited (&buf[2], &buf[pl]); | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| @ -384,15 +384,40 @@ hawk_bch_t* hawk_gem_duputobcharswithcmgr (hawk_gem_t* gem, const hawk_uch_t* uc | ||||
| 	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_oow_t wl, ml, capa, pos, i; | ||||
| 	hawk_oow_t ul, bl, capa, pos, i; | ||||
| 	hawk_bch_t* bcs; | ||||
|  | ||||
| 	for (capa = 0, i = 0; ucs[i]; i++) | ||||
| 	{ | ||||
| 		if (hawk_gem_convutobcstr(gem, ucs[i], &wl, HAWK_NULL, &ml) <= -1)  return HAWK_NULL; | ||||
| 		capa += ml; | ||||
| 		if (hawk_gem_convutobcstr(gem, ucs[i], &ul, HAWK_NULL, &bl) <= -1)  return HAWK_NULL; | ||||
| 		capa += bl; | ||||
| 	} | ||||
|  | ||||
| 	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++) | ||||
| 	{ | ||||
| 		ml = capa - pos + 1; | ||||
| 		hawk_gem_convutobcstr (gem, ucs[i], &wl, &bcs[pos], &ml); | ||||
| 		pos += ml; | ||||
| 		bl = capa - pos + 1; | ||||
| 		hawk_gem_convutobcstr (gem, ucs[i], &ul, &bcs[pos], &bl); | ||||
| 		pos += bl; | ||||
| 	} | ||||
|  | ||||
| 	if (bcslen) *bcslen = capa; | ||||
|  | ||||
| @ -343,6 +343,12 @@ | ||||
| /* Define to 1 if you have the `quadmath_snprintf' function. */ | ||||
| #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. */ | ||||
| #undef HAVE_READDIR64 | ||||
|  | ||||
|  | ||||
| @ -1258,9 +1258,6 @@ typedef enum hawk_log_mask_t hawk_log_mask_t; | ||||
|  */ | ||||
| #if (HAWK_SIZEOF_UCH_T == HAWK_SIZEOF_BCH_T) | ||||
| #       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) | ||||
| #       define HAWK_UT(txt)    (u ## txt) | ||||
| #else | ||||
|  | ||||
| @ -218,12 +218,20 @@ HAWK_EXPORT hawk_bch_t* hawk_gem_duputobcharswithcmgr ( | ||||
| 	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_gem_t*        gem, | ||||
| 	const hawk_uch_t*  ucs[], | ||||
| 	hawk_oow_t*        bcslen | ||||
| ); | ||||
|  | ||||
|  | ||||
| /* ----------------------------------------------------------------------- */ | ||||
|  | ||||
| hawk_oow_t hawk_gem_vfmttoucstr ( | ||||
|  | ||||
| @ -547,9 +547,9 @@ HAWK_EXPORT hawk_htb_pair_t* hawk_htb_update ( | ||||
|  *   for (i = 0; i < HAWK_COUNTOF(vals); i++) | ||||
|  *   { | ||||
|  *     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, | ||||
|  *       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 | ||||
|  *     ); // note error check is skipped | ||||
|  *   } | ||||
|  | ||||
| @ -52,7 +52,7 @@ enum hawk_pio_flag_t | ||||
|  | ||||
| 	/** indicate that the command to hawk_pio_open() is a multi-byte string. | ||||
| 	 *  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. | ||||
| 	 *  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. | ||||
|  * 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 | ||||
|  * 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  | ||||
|  * character type is #hawk_bch_t. | ||||
|  * \return #hawk_pio_t object on success, #HAWK_NULL on failure | ||||
|  | ||||
| @ -500,9 +500,9 @@ HAWK_EXPORT hawk_rbt_pair_t* hawk_rbt_update ( | ||||
|  *   for (i = 0; i < HAWK_COUNTOF(vals); i++) | ||||
|  *   { | ||||
|  *     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, | ||||
|  *       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 | ||||
|  *     ); // note error check is skipped | ||||
|  *   } | ||||
|  | ||||
| @ -156,7 +156,7 @@ HAWK_EXPORT hawk_t* hawk_openstdwithmmgr ( | ||||
|  * | ||||
|  * in[0].type = HAWK_PARSESTD_OOCS; | ||||
|  * 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; | ||||
|  * out.type = HAWK_PARSESTD_OOCS; | ||||
|  * n = hawk_parsestd (awk, in, &out); | ||||
|  | ||||
| @ -463,13 +463,15 @@ HAWK_EXPORT int hawk_comp_bcstr ( | ||||
| HAWK_EXPORT int hawk_comp_ucstr_limited ( | ||||
| 	const hawk_uch_t* str1, | ||||
| 	const hawk_uch_t* str2, | ||||
| 	hawk_oow_t        maxlen | ||||
| 	hawk_oow_t        maxlen, | ||||
| 	int               ignorecase | ||||
| ); | ||||
|  | ||||
| HAWK_EXPORT int hawk_comp_bcstr_limited ( | ||||
| 	const hawk_bch_t* str1, | ||||
| 	const hawk_bch_t* str2, | ||||
| 	hawk_oow_t        maxlen | ||||
| 	hawk_oow_t        maxlen, | ||||
| 	int               ignorecase | ||||
| ); | ||||
|  | ||||
| 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_oocstr hawk_comp_uchars_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_bchars_to_oochars(dst,src,len) hawk_copy_bchars_to_uchars(dst,src,len) | ||||
| #	define hawk_copy_oochars_to_bchars(dst,src,len) hawk_copy_uchars_to_bchars(dst,src,len) | ||||
| #	define hawk_copy_uchars_to_oochars(dst,src,len) hawk_copy_uchars(dst,src,len) | ||||
| #	define hawk_copy_oochars_to_uchars(dst,src,len) hawk_copy_uchars(dst,src,len) | ||||
| #	define hawk_copy_oochars hawk_copy_uchars | ||||
| #	define hawk_copy_bchars_to_oochars hawk_copy_bchars_to_uchars | ||||
| #	define hawk_copy_oochars_to_bchars hawk_copy_uchars_to_bchars | ||||
| #	define hawk_copy_uchars_to_oochars hawk_copy_uchars | ||||
| #	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_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_oocstr hawk_comp_bchars_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_bchars_to_oochars(dst,src,len) hawk_copy_bchars(dst,src,len) | ||||
| #	define hawk_copy_oochars_to_bchars(dst,src,len) hawk_copy_bchars(dst,src,len) | ||||
| #	define hawk_copy_uchars_to_oochars(dst,src,len) hawk_copy_uchars_to_bchars(dst,src,len) | ||||
| #	define hawk_copy_oochars_to_uchars(dst,src,len) hawk_copy_bchars_to_uchars(dst,src,len) | ||||
| #	define hawk_copy_oochars hawk_copy_bchars | ||||
| #	define hawk_copy_bchars_to_oochars hawk_copy_bchars | ||||
| #	define hawk_copy_oochars_to_bchars hawk_copy_bchars | ||||
| #	define hawk_copy_uchars_to_oochars hawk_copy_uchars_to_bchars | ||||
| #	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_unlimited(dst,src,len) hawk_copy_bchars_to_bcstr_unlimited(dst,src,len) | ||||
|  | ||||
| @ -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_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_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); } | ||||
| #else | ||||
| #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_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_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) | ||||
| #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_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_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); } | ||||
| #else | ||||
| #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_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_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) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| @ -36,7 +36,7 @@ | ||||
| #	error QUADMATH.H NOT AVAILABLE or NOT COMPILABLE | ||||
| #endif | ||||
|  | ||||
| #if !defined(HAWK_HAVE_CONFIG_H) | ||||
| #if !defined(HAWK_HAVE_CFG_H) | ||||
| #	if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) | ||||
| #		define HAVE_CEIL | ||||
| #		define HAVE_FLOOR | ||||
| @ -64,7 +64,9 @@ | ||||
| typedef struct modctx_t | ||||
| { | ||||
| 	unsigned int seed; | ||||
| #if defined(HAVE_RANDOM_R) | ||||
| 	struct random_data prand; | ||||
| #endif | ||||
| } modctx_t; | ||||
|  | ||||
| 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 = (modctx_t*)fi->mod->ctx; | ||||
| #if defined(HAVE_RANDOM_R) | ||||
| 	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); | ||||
| 	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) | ||||
| 	{ | ||||
| 		struct timeval tv; | ||||
| 		gettimeofday (&tv, HAWK_NULL); | ||||
| 		modctx->seed = tv.tv_sec * tv.tv_usec; | ||||
| 		hawk_ntime_t tv; | ||||
| 		hawk_get_time (&tv); | ||||
| 		modctx->seed = tv.sec + tv.nsec; | ||||
| 	#if defined(HAVE_RANDOM_R) | ||||
| 		srandom_r (modctx->seed, &modctx->prand); | ||||
| 	#elif defined(HAVE_RANDOM) | ||||
| 		srandom (modctx->seed); | ||||
| 	#else | ||||
| 		srand (modctx->seed); | ||||
| 	#endif | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		a0 = hawk_rtx_getarg(rtx, 0); | ||||
| 		n = hawk_rtx_valtoint(rtx, a0, &lv); | ||||
| 		if (n <= -1) return -1; | ||||
| 	#if defined(HAVE_RANDOM_R) | ||||
| 		srandom_r (lv, &modctx->prand); | ||||
| 	#elif defined(HAVE_RANDOM) | ||||
| 		srandom (lv); | ||||
| 	#else | ||||
| 		srand (lv); | ||||
| 	#endif | ||||
| 	} | ||||
| 	 | ||||
| 	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) | ||||
| { | ||||
| 	modctx_t* modctx; | ||||
| 	struct timeval tv; | ||||
| 	hawk_ntime_t tv; | ||||
|  | ||||
| 	modctx = hawk_allocmem(awk, HAWK_SIZEOF(*modctx)); | ||||
| 	if (modctx == HAWK_NULL) return -1; | ||||
|  | ||||
| 	HAWK_MEMSET (modctx, 0, HAWK_SIZEOF(*modctx)); | ||||
|  | ||||
| 	gettimeofday (&tv, HAWK_NULL); | ||||
| 	modctx->seed = tv.tv_sec * tv.tv_usec; | ||||
| 	hawk_get_time (&tv); | ||||
| 	modctx->seed = tv.sec + tv.nsec; | ||||
| #if defined(HAVE_RANDOM_R) | ||||
| 	srandom_r (modctx->seed, &modctx->prand); | ||||
| #elif defined(HAVE_RANDOM) | ||||
| 	srandom (modctx->seed); | ||||
| #else | ||||
| 	srand (modctx->seed); | ||||
| #endif | ||||
|  | ||||
| 	mod->query = query; | ||||
| 	mod->unload = unload; | ||||
|  | ||||
							
								
								
									
										100
									
								
								hawk/lib/pio.c
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								hawk/lib/pio.c
									
									
									
									
									
								
							| @ -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; | ||||
| 	else | ||||
| 	{ | ||||
| 		mcmd = hawk_strdup (cmd, pio->mmgr); | ||||
| 		if (mcmd == HAWK_NULL)  | ||||
| 		{ | ||||
| 			pio->errnum = HAWK_PIO_ENOMEM; | ||||
| 			goto oops; | ||||
| 		} | ||||
| 		mcmd = hawk_gem_dupoocstr(pio->gem, cmd, HAWK_NULL); | ||||
| 		if (mcmd == HAWK_NULL) goto oops; | ||||
|  | ||||
| 		fcnt = hawk_split_oocstr(mcmd, HAWK_T(""), HAWK_T('\"'), HAWK_T('\"'), HAWK_T('\\'));  | ||||
| 		if (fcnt <= 0)  | ||||
| 		{ | ||||
| 			/* no field or an error */ | ||||
| 			pio->errnum = HAWK_PIO_EINVAL; | ||||
| 			hawk_gem_seterrnum (pio->gem, HAWK_NULL, HAWK_EINVAL); | ||||
| 			goto oops;  | ||||
| 		} | ||||
| 	} | ||||
| #else | ||||
| 	if (flags & HAWK_PIO_MBSCMD)  | ||||
| 	if (flags & HAWK_PIO_BCSTRCMD)  | ||||
| 	{ | ||||
| 		/* the cmd is flagged to be of hawk_bch_t  | ||||
| 		 * while the default character type is hawk_uch_t. */ | ||||
| @ -898,28 +894,30 @@ create_process: | ||||
| 		}; | ||||
|  | ||||
| 	#if defined(HAWK_OOCH_IS_UCH) | ||||
| 		if (flags & HAWK_PIO_MBSCMD) | ||||
| 		if (flags & HAWK_PIO_BCSTRCMD) | ||||
| 		{ | ||||
| 			const hawk_bch_t* x[3]; | ||||
| 			x[0] = mcmdname[create_retried]; | ||||
| 			x[1] = (const hawk_bch_t*)cmd; | ||||
| 			x[2] = HAWK_NULL; | ||||
| 			dupcmd = hawk_mbsatowcsdup(x, HAWK_NULL, mmgr); | ||||
| 			dupcmd = hawk_gem_dupbcstrarrtoucstr(pio->gem, x, HAWK_NULL, 0); | ||||
| 		} | ||||
| 		else | ||||
| 	#endif | ||||
| 		{ | ||||
| 	#endif | ||||
| 			dupcmd = hawk_strdup2(cmdname[create_retried], cmd, mmgr); | ||||
| 	#if defined(HAWK_OOCH_IS_UCH) | ||||
| 			const hawk_ooch_t* x[3]; | ||||
| 			x[0] = cmdname[create_retried]; | ||||
| 			x[1] = cmd; | ||||
| 			x[2] = HAWK_NULL; | ||||
| 			dupcmd = hawk_gem_dupoocstrarr(pio->gem, x, HAWK_NULL); | ||||
| 		} | ||||
| 	#endif | ||||
| 	} | ||||
| 	else  | ||||
| 	{ | ||||
| 	#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 | ||||
| 		{ | ||||
| @ -1079,7 +1077,7 @@ create_process: | ||||
|  | ||||
| 	if (maxidx == -1)  | ||||
| 	{ | ||||
| 		pio->errnum = HAWK_PIO_EINVAL; | ||||
| 		hawk_gem_seterrnum (pio->gem, HAWK_NULL, HAWK_EINVAL); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -1195,46 +1193,38 @@ create_process: | ||||
| 		hawk_oow_t n, mn; | ||||
|  | ||||
| 	#if defined(HAWK_OOCH_IS_BCH) | ||||
| 		mn = hawk_strlen(cmd); | ||||
| 		mn = hawk_count_oocstr(cmd); | ||||
| 	#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 | ||||
| 		{ | ||||
| 			if (hawk_wcstombs (cmd, &n, HAWK_NULL, &mn) <= -1) | ||||
| 			{ | ||||
| 				pio->errnum = HAWK_PIO_EINVAL; | ||||
| 				goto oops; /* illegal sequence found */ | ||||
| 			} | ||||
| 			if (hawk_gem_convutobcstr(pio->gem, cmd, &n, HAWK_NULL, &mn) <= -1) goto oops; /* illegal sequence found */ | ||||
| 		} | ||||
| 	#endif | ||||
| 		cmd_line = hawk_allocmem(hawk, ((11+mn+1+1) * HAWK_SIZEOF(*cmd_line))); | ||||
| 		if (cmd_line == HAWK_NULL)  | ||||
| 		{		 | ||||
| 			pio->errnum = HAWK_PIO_ENOMEM; | ||||
| 			goto oops; | ||||
| 		} | ||||
| 		cmd_line = hawk_gem_allocmem(pio->gem, ((11+mn+1+1) * HAWK_SIZEOF(*cmd_line))); | ||||
| 		if (cmd_line == HAWK_NULL) goto oops; | ||||
|  | ||||
| 		hawk_mbscpy (cmd_line, HAWK_BT("cmd.exe")); /* cmd.exe\0/c */  | ||||
| 		hawk_mbscpy (&cmd_line[8], HAWK_BT("/c ")); | ||||
| 		hawk_copy_bcstr_unlimited (cmd_line, "cmd.exe"); /* cmd.exe\0/c */  | ||||
| 		hawk_copy_bcstr_unlimited (&cmd_line[8], "/c "); | ||||
| 	#if defined(HAWK_OOCH_IS_BCH) | ||||
| 		hawk_mbscpy (&cmd_line[11], cmd); | ||||
| 		hawk_copy_bcstr_unlimited (&cmd_line[11], cmd); | ||||
| 	#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 | ||||
| 		{ | ||||
| 			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 | ||||
| 		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 | ||||
| 	{ | ||||
| @ -1242,23 +1232,27 @@ create_process: | ||||
| 		hawk_oow_t mn; | ||||
|  | ||||
| 	#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); | ||||
| 		cmd_line = hawk_strdup2 (cmd, HAWK_T(" "), pio->mmgr); | ||||
| 		if (cmd_line == HAWK_NULL)  | ||||
| 		{ | ||||
| 			pio->errnum = HAWK_PIO_ENOMEM; | ||||
| 			goto oops; | ||||
| 		} | ||||
| 		cmd_line = hawk_dupucstrarr(pio->gem, strarr HAWK_NULL); | ||||
| 		if (cmd_line == HAWK_NULL) goto oops; | ||||
| 	#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); | ||||
| 			cmd_line = hawk_mbsdup2 ((const hawk_bch_t*)cmd, HAWK_BT(" "), pio->mmgr); | ||||
| 			if (cmd_line == HAWK_NULL)  | ||||
| 			{ | ||||
| 				pio->errnum = HAWK_PIO_ENOMEM; | ||||
| 				goto oops; | ||||
| 			} | ||||
| 			cmd_line = hawk_dupbcstrarr(pio->gem, mbsarr, HAWK_NULL); | ||||
| 			if (cmd_line == HAWK_NULL) goto oops; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| @ -1315,7 +1309,7 @@ create_process: | ||||
| #elif defined(__DOS__) | ||||
|  | ||||
| 	/* DOS not multi-processed. can't support pio */ | ||||
| 	pio->errnum = HAWK_PIO_ENOIMPL; | ||||
| 	hawk_gem_seterrnum (pio->gem, HAWK_NULL, HAWK_ENOIMPL); | ||||
| 	return -1; | ||||
|  | ||||
| #else | ||||
|  | ||||
| @ -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 */ | ||||
|  | ||||
| 		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)  | ||||
| 			{ | ||||
|  | ||||
| @ -41,10 +41,11 @@ | ||||
| #if defined(_WIN32) | ||||
| #	include <windows.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> | ||||
| #		define USE_LTDL | ||||
| #	endif | ||||
| #	include <io.h> | ||||
| #elif defined(__OS2__) | ||||
| #	define INCL_DOSMODULEMGR | ||||
| #	define INCL_DOSPROCESS | ||||
| @ -65,7 +66,7 @@ | ||||
| #	endif | ||||
| #endif | ||||
|  | ||||
| #if !defined(HAWK_HAVE_CONFIG_H) | ||||
| #if !defined(HAWK_HAVE_CFG_H) | ||||
| #	if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) | ||||
| #		define HAVE_POW | ||||
| #		define HAVE_FMOD | ||||
| @ -137,8 +138,6 @@ typedef struct xtn_t | ||||
| 	int gbl_argc; | ||||
| 	int gbl_argv; | ||||
| 	int gbl_environ; | ||||
| 	int gbl_errno; | ||||
| 	int gbl_errstr; | ||||
|  | ||||
| 	hawk_ecb_t ecb; | ||||
| 	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; | ||||
| 	tmp[count] = HAWK_NULL; | ||||
|  | ||||
| 	modpath = hawk_stradup (tmp, HAWK_NULL, hawk_getmmgr(awk)); | ||||
| 	if (!modpath) | ||||
| 	{ | ||||
| 		hawk_seterrnum (awk, HAWK_ENOMEM, HAWK_NULL); | ||||
| 		return HAWK_NULL; | ||||
| 	} | ||||
| 	modpath = hawk_dupoocstrarr(awk, tmp, HAWK_NULL); | ||||
| 	if (!modpath) return HAWK_NULL; | ||||
|  | ||||
| 	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_argv = hawk_addgbl(awk, HAWK_T("ARGV")); | ||||
| 	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 ||  | ||||
| 	        xtn->gbl_argv <= -1 || | ||||
| 	        xtn->gbl_environ <= -1 ||  | ||||
| 	        xtn->gbl_errno <= -1 || | ||||
| 	        xtn->gbl_errstr <= -1)? -1: 0; | ||||
| 	        xtn->gbl_environ <= -1)? -1: 0; | ||||
| } | ||||
|  | ||||
| struct fnctab_t  | ||||
|  | ||||
| @ -446,10 +446,10 @@ retry: | ||||
| 			{ | ||||
| #ifdef TRE_WCHAR | ||||
| 				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 | ||||
| #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) | ||||
| 				result = 1; | ||||
|  | ||||
| @ -195,10 +195,22 @@ 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 (ignorecase) | ||||
| 	{ | ||||
| 		while (hawk_to_uch_lower(*str1) == hawk_to_uch_lower(*str2)) | ||||
| 		{ | ||||
| 			 if (*str1 == '\0' || maxlen == 1) return 0; | ||||
| 			 str1++; str2++; maxlen--; | ||||
| 		} | ||||
|  | ||||
| 		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; | ||||
| @ -206,12 +218,25 @@ int hawk_comp_ucstr_limited (const hawk_uch_t* str1, const hawk_uch_t* str2, haw | ||||
| 		} | ||||
|  | ||||
| 		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 (ignorecase) | ||||
| 	{ | ||||
| 		while (hawk_to_uch_lower(*str1) == hawk_to_uch_lower(*str2)) | ||||
| 		{ | ||||
| 			 if (*str1 == '\0' || maxlen == 1) return 0; | ||||
| 			 str1++; str2++; maxlen--; | ||||
| 		} | ||||
|  | ||||
| 		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; | ||||
| @ -219,6 +244,7 @@ int hawk_comp_bcstr_limited (const hawk_bch_t* str1, const hawk_bch_t* str2, haw | ||||
| 		} | ||||
|  | ||||
| 		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) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user