got mod-sys.c working partially
This commit is contained in:
		| @ -167,8 +167,8 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/ac/ar-lib \ | ||||
| 	$(top_srcdir)/ac/compile $(top_srcdir)/ac/config.guess \ | ||||
| 	$(top_srcdir)/ac/config.sub $(top_srcdir)/ac/install-sh \ | ||||
| 	$(top_srcdir)/ac/ltmain.sh $(top_srcdir)/ac/missing ac/ar-lib \ | ||||
| 	ac/compile ac/config.guess ac/config.sub ac/install-sh \ | ||||
| 	ac/ltmain.sh ac/missing | ||||
| 	ac/compile ac/config.guess ac/config.sub ac/depcomp \ | ||||
| 	ac/install-sh ac/ltmain.sh ac/missing | ||||
| DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) | ||||
| distdir = $(PACKAGE)-$(VERSION) | ||||
| top_distdir = $(distdir) | ||||
|  | ||||
							
								
								
									
										119
									
								
								hawk/configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										119
									
								
								hawk/configure
									
									
									
									
										vendored
									
									
								
							| @ -18711,6 +18711,18 @@ _ACEOF | ||||
| fi | ||||
| done | ||||
|  | ||||
| for ac_func in timelocal timegm localtime_r gmtime_r | ||||
| 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" | ||||
| if eval test \"x\$"$as_ac_var"\" = x"yes"; then : | ||||
|   cat >>confdefs.h <<_ACEOF | ||||
| #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 | ||||
| _ACEOF | ||||
|  | ||||
| fi | ||||
| done | ||||
|  | ||||
| for ac_func in backtrace backtrace_symbols | ||||
| do : | ||||
|   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` | ||||
| @ -18747,18 +18759,6 @@ _ACEOF | ||||
| fi | ||||
| done | ||||
|  | ||||
| for ac_func in localtime_r gmtime_r | ||||
| 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" | ||||
| if eval test \"x\$"$as_ac_var"\" = x"yes"; then : | ||||
|   cat >>confdefs.h <<_ACEOF | ||||
| #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 | ||||
| _ACEOF | ||||
|  | ||||
| fi | ||||
| done | ||||
|  | ||||
| for ac_func in sigaction signal | ||||
| do : | ||||
|   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` | ||||
| @ -19811,6 +19811,101 @@ _ACEOF | ||||
|  | ||||
| fi | ||||
|  | ||||
| ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtime" "ac_cv_member_struct_stat_st_birthtime" "$ac_includes_default" | ||||
| if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes; then : | ||||
|  | ||||
| cat >>confdefs.h <<_ACEOF | ||||
| #define HAVE_STRUCT_STAT_ST_BIRTHTIME 1 | ||||
| _ACEOF | ||||
|  | ||||
|  | ||||
| fi | ||||
|  | ||||
| ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim.tv_nsec" "ac_cv_member_struct_stat_st_mtim_tv_nsec" "$ac_includes_default" | ||||
| if test "x$ac_cv_member_struct_stat_st_mtim_tv_nsec" = xyes; then : | ||||
|  | ||||
| cat >>confdefs.h <<_ACEOF | ||||
| #define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1 | ||||
| _ACEOF | ||||
|  | ||||
|  | ||||
| fi | ||||
|  | ||||
| ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim.tv_nsec" "ac_cv_member_struct_stat_st_birthtim_tv_nsec" "$ac_includes_default" | ||||
| if test "x$ac_cv_member_struct_stat_st_birthtim_tv_nsec" = xyes; then : | ||||
|  | ||||
| cat >>confdefs.h <<_ACEOF | ||||
| #define HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC 1 | ||||
| _ACEOF | ||||
|  | ||||
|  | ||||
| fi | ||||
|  | ||||
| ac_fn_c_check_member "$LINENO" "struct stat" "st_mtimespec.tv_nsec" "ac_cv_member_struct_stat_st_mtimespec_tv_nsec" "$ac_includes_default" | ||||
| if test "x$ac_cv_member_struct_stat_st_mtimespec_tv_nsec" = xyes; then : | ||||
|  | ||||
| cat >>confdefs.h <<_ACEOF | ||||
| #define HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1 | ||||
| _ACEOF | ||||
|  | ||||
|  | ||||
| fi | ||||
|  | ||||
| ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec.tv_nsec" "ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" "$ac_includes_default" | ||||
| if test "x$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" = xyes; then : | ||||
|  | ||||
| cat >>confdefs.h <<_ACEOF | ||||
| #define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1 | ||||
| _ACEOF | ||||
|  | ||||
|  | ||||
| fi | ||||
|  | ||||
| ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" "#include <time.h> | ||||
| " | ||||
| if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : | ||||
|  | ||||
| cat >>confdefs.h <<_ACEOF | ||||
| #define HAVE_STRUCT_TM_TM_GMTOFF 1 | ||||
| _ACEOF | ||||
|  | ||||
|  | ||||
| fi | ||||
|  | ||||
| ac_fn_c_check_member "$LINENO" "struct tm" "__tm_gmtoff" "ac_cv_member_struct_tm___tm_gmtoff" "#include <time.h> | ||||
| " | ||||
| if test "x$ac_cv_member_struct_tm___tm_gmtoff" = xyes; then : | ||||
|  | ||||
| cat >>confdefs.h <<_ACEOF | ||||
| #define HAVE_STRUCT_TM___TM_GMTOFF 1 | ||||
| _ACEOF | ||||
|  | ||||
|  | ||||
| fi | ||||
|  | ||||
| ac_fn_c_check_member "$LINENO" "struct tm" "tm_zone" "ac_cv_member_struct_tm_tm_zone" "#include <time.h> | ||||
| " | ||||
| if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : | ||||
|  | ||||
| cat >>confdefs.h <<_ACEOF | ||||
| #define HAVE_STRUCT_TM_TM_ZONE 1 | ||||
| _ACEOF | ||||
|  | ||||
|  | ||||
| fi | ||||
|  | ||||
| ac_fn_c_check_member "$LINENO" "struct tm" "__tm_zone" "ac_cv_member_struct_tm___tm_zone" "#include <time.h> | ||||
| " | ||||
| if test "x$ac_cv_member_struct_tm___tm_zone" = xyes; then : | ||||
|  | ||||
| cat >>confdefs.h <<_ACEOF | ||||
| #define HAVE_STRUCT_TM___TM_ZONE 1 | ||||
| _ACEOF | ||||
|  | ||||
|  | ||||
| fi | ||||
|  | ||||
|  | ||||
|  | ||||
| # The cast to long int works around a bug in the HP C Compiler | ||||
| # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects | ||||
|  | ||||
| @ -197,10 +197,10 @@ dnl	[#include <stddef.h>]) | ||||
|  | ||||
| dnl check functions | ||||
| AC_CHECK_FUNCS([gettimeofday settimeofday clock_gettime clock_settime getitimer setitimer]) | ||||
| AC_CHECK_FUNCS([timelocal timegm localtime_r gmtime_r]) | ||||
| AC_CHECK_FUNCS([backtrace backtrace_symbols]) | ||||
| 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 random_r random]) | ||||
| AC_CHECK_FUNCS([accept4 pipe2 epoll_create epoll_create1 kqueue kqueue1]) | ||||
| @ -381,6 +381,16 @@ AC_TRY_RUN( | ||||
| dnl check struct members | ||||
| AC_STRUCT_DIRENT_D_TYPE | ||||
| AC_CHECK_MEMBERS([DIR.d_fd, DIR.dd_fd],,,[[#include <dirent.h>]]) | ||||
| AC_CHECK_MEMBERS([struct stat.st_birthtime]) | ||||
| AC_CHECK_MEMBERS([struct stat.st_mtim.tv_nsec]) | ||||
| AC_CHECK_MEMBERS([struct stat.st_birthtim.tv_nsec]) | ||||
| AC_CHECK_MEMBERS([struct stat.st_mtimespec.tv_nsec]) | ||||
| AC_CHECK_MEMBERS([struct stat.st_birthtimespec.tv_nsec]) | ||||
| AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[[#include <time.h>]]) | ||||
| AC_CHECK_MEMBERS([struct tm.__tm_gmtoff],,,[[#include <time.h>]]) | ||||
| AC_CHECK_MEMBERS([struct tm.tm_zone],,,[[#include <time.h>]]) | ||||
| AC_CHECK_MEMBERS([struct tm.__tm_zone],,,[[#include <time.h>]]) | ||||
|  | ||||
|  | ||||
| dnl check the size of primitive data types | ||||
| AC_CHECK_SIZEOF(char,,[[]]) | ||||
|  | ||||
| @ -51,6 +51,7 @@ pkginclude_HEADERS = \ | ||||
| 	hawk.h \ | ||||
| 	hawk-chr.h \ | ||||
| 	hawk-cmn.h \ | ||||
| 	hawk-dir.h \ | ||||
| 	hawk-ecs.h \ | ||||
| 	hawk-fmt.h \ | ||||
| 	hawk-gem.h \ | ||||
| @ -73,6 +74,7 @@ libhawk_la_SOURCES =  \ | ||||
| 	$(pkginclude_HEADERS) \ | ||||
| 	arr.c \ | ||||
| 	chr.c \ | ||||
| 	dir.c \ | ||||
| 	ecs-imp.h \ | ||||
| 	ecs.c \ | ||||
| 	err-prv.h \ | ||||
| @ -162,10 +164,10 @@ if ENABLE_STATIC_MODULE | ||||
| libhawk_la_SOURCES += \ | ||||
| 	imap-imp.h \ | ||||
| 	mod-math.c mod-math.h \ | ||||
| 	mod-str.c mod-str.h  | ||||
| 	mod-str.c mod-str.h \ | ||||
| 	mod-sys.c mod-sys.h | ||||
| libhawk_la_LIBADD += | ||||
|  | ||||
| ## mod-sys.c mod-sys.h | ||||
| ### mod-dir.c mod-dir.h  | ||||
|  | ||||
| if ENABLE_MOD_MYSQL | ||||
|  | ||||
| @ -99,7 +99,8 @@ host_triplet = @host@ | ||||
| @ENABLE_STATIC_MODULE_TRUE@am__append_6 = \ | ||||
| @ENABLE_STATIC_MODULE_TRUE@	imap-imp.h \ | ||||
| @ENABLE_STATIC_MODULE_TRUE@	mod-math.c mod-math.h \ | ||||
| @ENABLE_STATIC_MODULE_TRUE@	mod-str.c mod-str.h  | ||||
| @ENABLE_STATIC_MODULE_TRUE@	mod-str.c mod-str.h \ | ||||
| @ENABLE_STATIC_MODULE_TRUE@	mod-sys.c mod-sys.h | ||||
|  | ||||
| @ENABLE_STATIC_MODULE_TRUE@am__append_7 =  | ||||
|  | ||||
| @ -160,34 +161,37 @@ am__DEPENDENCIES_1 = | ||||
| @ENABLE_LIBLTDL_FALSE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) | ||||
| am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \ | ||||
| 	$(am__DEPENDENCIES_3) | ||||
| am__libhawk_la_SOURCES_DIST = hawk.h hawk-chr.h hawk-cmn.h hawk-ecs.h \ | ||||
| 	hawk-fmt.h hawk-gem.h hawk-htb.h hawk-rbt.h hawk-pack1.h \ | ||||
| 	hawk-utl.h hawk-std.h hawk-tre.h hawk-unpack.h arr.c chr.c \ | ||||
| 	ecs-imp.h ecs.c err-prv.h err.c fmt-imp.h fmt.c fnc-prv.h \ | ||||
| 	fnc.c htb.c gem.c hawk-prv.h hawk.c mb8.c misc-prv.h misc.c \ | ||||
| 	parse-prv.h parse.c rbt.c rec.c rio-prv.h rio.c run-prv.h \ | ||||
| 	run.c tre-prv.h tre-ast.c tre-ast.h tre-compile.c \ | ||||
| 	tre-compile.h tre-match-bt.c tre-match-pa.c tre-match-ut.h \ | ||||
| 	tre-mem.c tre-mem.h tre-parse.c tre-parse.h tre-stack.c \ | ||||
| 	tre-stack.h tre.c tree-prv.h tree.c utf16.c utf8.c utl-sort.c \ | ||||
| 	utl-str.c utl-sys.c utl.c val-prv.h val.c hawk-cli.h \ | ||||
| 	hawk-fio.h hawk-mtx.h hawk-pio.h hawk-sio.h hawk-tio.h cli.c \ | ||||
| 	fio.c mtx.c pio.c sio.c syscall.h syserr.h tio.c std-prv.h \ | ||||
| 	std.c imap-imp.h mod-math.c mod-math.h mod-str.c mod-str.h | ||||
| am__libhawk_la_SOURCES_DIST = hawk.h hawk-chr.h hawk-cmn.h hawk-dir.h \ | ||||
| 	hawk-ecs.h hawk-fmt.h hawk-gem.h hawk-htb.h hawk-rbt.h \ | ||||
| 	hawk-pack1.h hawk-utl.h hawk-std.h hawk-tre.h hawk-unpack.h \ | ||||
| 	arr.c chr.c dir.c ecs-imp.h ecs.c err-prv.h err.c fmt-imp.h \ | ||||
| 	fmt.c fnc-prv.h fnc.c htb.c gem.c hawk-prv.h hawk.c mb8.c \ | ||||
| 	misc-prv.h misc.c parse-prv.h parse.c rbt.c rec.c rio-prv.h \ | ||||
| 	rio.c run-prv.h run.c tre-prv.h tre-ast.c tre-ast.h \ | ||||
| 	tre-compile.c tre-compile.h tre-match-bt.c tre-match-pa.c \ | ||||
| 	tre-match-ut.h tre-mem.c tre-mem.h tre-parse.c tre-parse.h \ | ||||
| 	tre-stack.c tre-stack.h tre.c tree-prv.h tree.c utf16.c utf8.c \ | ||||
| 	utl-sort.c utl-str.c utl-sys.c utl.c val-prv.h val.c \ | ||||
| 	hawk-cli.h hawk-fio.h hawk-mtx.h hawk-pio.h hawk-sio.h \ | ||||
| 	hawk-tio.h cli.c fio.c mtx.c pio.c sio.c syscall.h syserr.h \ | ||||
| 	tio.c std-prv.h std.c imap-imp.h mod-math.c mod-math.h \ | ||||
| 	mod-str.c mod-str.h mod-sys.c mod-sys.h | ||||
| am__objects_1 = | ||||
| @ENABLE_STATIC_MODULE_TRUE@am__objects_2 = libhawk_la-mod-math.lo \ | ||||
| @ENABLE_STATIC_MODULE_TRUE@	libhawk_la-mod-str.lo | ||||
| @ENABLE_STATIC_MODULE_TRUE@	libhawk_la-mod-str.lo \ | ||||
| @ENABLE_STATIC_MODULE_TRUE@	libhawk_la-mod-sys.lo | ||||
| am_libhawk_la_OBJECTS = $(am__objects_1) libhawk_la-arr.lo \ | ||||
| 	libhawk_la-chr.lo libhawk_la-ecs.lo libhawk_la-err.lo \ | ||||
| 	libhawk_la-fmt.lo libhawk_la-fnc.lo libhawk_la-htb.lo \ | ||||
| 	libhawk_la-gem.lo libhawk_la-hawk.lo libhawk_la-mb8.lo \ | ||||
| 	libhawk_la-misc.lo libhawk_la-parse.lo libhawk_la-rbt.lo \ | ||||
| 	libhawk_la-rec.lo libhawk_la-rio.lo libhawk_la-run.lo \ | ||||
| 	libhawk_la-tre-ast.lo libhawk_la-tre-compile.lo \ | ||||
| 	libhawk_la-tre-match-bt.lo libhawk_la-tre-match-pa.lo \ | ||||
| 	libhawk_la-tre-mem.lo libhawk_la-tre-parse.lo \ | ||||
| 	libhawk_la-tre-stack.lo libhawk_la-tre.lo libhawk_la-tree.lo \ | ||||
| 	libhawk_la-utf16.lo libhawk_la-utf8.lo libhawk_la-utl-sort.lo \ | ||||
| 	libhawk_la-chr.lo libhawk_la-dir.lo libhawk_la-ecs.lo \ | ||||
| 	libhawk_la-err.lo libhawk_la-fmt.lo libhawk_la-fnc.lo \ | ||||
| 	libhawk_la-htb.lo libhawk_la-gem.lo libhawk_la-hawk.lo \ | ||||
| 	libhawk_la-mb8.lo libhawk_la-misc.lo libhawk_la-parse.lo \ | ||||
| 	libhawk_la-rbt.lo libhawk_la-rec.lo libhawk_la-rio.lo \ | ||||
| 	libhawk_la-run.lo libhawk_la-tre-ast.lo \ | ||||
| 	libhawk_la-tre-compile.lo libhawk_la-tre-match-bt.lo \ | ||||
| 	libhawk_la-tre-match-pa.lo libhawk_la-tre-mem.lo \ | ||||
| 	libhawk_la-tre-parse.lo libhawk_la-tre-stack.lo \ | ||||
| 	libhawk_la-tre.lo libhawk_la-tree.lo libhawk_la-utf16.lo \ | ||||
| 	libhawk_la-utf8.lo libhawk_la-utl-sort.lo \ | ||||
| 	libhawk_la-utl-str.lo libhawk_la-utl-sys.lo libhawk_la-utl.lo \ | ||||
| 	libhawk_la-val.lo libhawk_la-cli.lo libhawk_la-fio.lo \ | ||||
| 	libhawk_la-mtx.lo libhawk_la-pio.lo libhawk_la-sio.lo \ | ||||
| @ -485,6 +489,7 @@ pkginclude_HEADERS = \ | ||||
| 	hawk.h \ | ||||
| 	hawk-chr.h \ | ||||
| 	hawk-cmn.h \ | ||||
| 	hawk-dir.h \ | ||||
| 	hawk-ecs.h \ | ||||
| 	hawk-fmt.h \ | ||||
| 	hawk-gem.h \ | ||||
| @ -497,10 +502,10 @@ pkginclude_HEADERS = \ | ||||
| 	hawk-unpack.h | ||||
|  | ||||
| pkglib_LTLIBRARIES = libhawk.la $(am__append_5) | ||||
| libhawk_la_SOURCES = $(pkginclude_HEADERS) arr.c chr.c ecs-imp.h ecs.c \ | ||||
| 	err-prv.h err.c fmt-imp.h fmt.c fnc-prv.h fnc.c htb.c gem.c \ | ||||
| 	hawk-prv.h hawk.c mb8.c misc-prv.h misc.c parse-prv.h parse.c \ | ||||
| 	rbt.c rec.c rio-prv.h rio.c run-prv.h run.c tre-prv.h \ | ||||
| libhawk_la_SOURCES = $(pkginclude_HEADERS) arr.c chr.c dir.c ecs-imp.h \ | ||||
| 	ecs.c err-prv.h err.c fmt-imp.h fmt.c fnc-prv.h fnc.c htb.c \ | ||||
| 	gem.c hawk-prv.h hawk.c mb8.c misc-prv.h misc.c parse-prv.h \ | ||||
| 	parse.c rbt.c rec.c rio-prv.h rio.c run-prv.h run.c tre-prv.h \ | ||||
| 	tre-ast.c tre-ast.h tre-compile.c tre-compile.h tre-match-bt.c \ | ||||
| 	tre-match-pa.c tre-match-ut.h tre-mem.c tre-mem.h tre-parse.c \ | ||||
| 	tre-parse.h tre-stack.c tre-stack.h tre.c tree-prv.h tree.c \ | ||||
| @ -627,6 +632,7 @@ distclean-compile: | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-arr.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-chr.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-cli.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-dir.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-ecs.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-err.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-fio.Plo@am__quote@ | ||||
| @ -639,6 +645,7 @@ distclean-compile: | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-misc.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-mod-math.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-mod-str.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-mod-sys.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-mtx.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-parse.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-pio.Plo@am__quote@ | ||||
| @ -706,6 +713,13 @@ libhawk_la-chr.lo: chr.c | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||
| @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhawk_la-chr.lo `test -f 'chr.c' || echo '$(srcdir)/'`chr.c | ||||
|  | ||||
| libhawk_la-dir.lo: dir.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhawk_la-dir.lo -MD -MP -MF $(DEPDIR)/libhawk_la-dir.Tpo -c -o libhawk_la-dir.lo `test -f 'dir.c' || echo '$(srcdir)/'`dir.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-dir.Tpo $(DEPDIR)/libhawk_la-dir.Plo | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dir.c' object='libhawk_la-dir.lo' libtool=yes @AMDEPBACKSLASH@ | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||
| @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhawk_la-dir.lo `test -f 'dir.c' || echo '$(srcdir)/'`dir.c | ||||
|  | ||||
| libhawk_la-ecs.lo: ecs.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhawk_la-ecs.lo -MD -MP -MF $(DEPDIR)/libhawk_la-ecs.Tpo -c -o libhawk_la-ecs.lo `test -f 'ecs.c' || echo '$(srcdir)/'`ecs.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-ecs.Tpo $(DEPDIR)/libhawk_la-ecs.Plo | ||||
| @ -979,6 +993,13 @@ libhawk_la-mod-str.lo: mod-str.c | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||
| @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhawk_la-mod-str.lo `test -f 'mod-str.c' || echo '$(srcdir)/'`mod-str.c | ||||
|  | ||||
| libhawk_la-mod-sys.lo: mod-sys.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhawk_la-mod-sys.lo -MD -MP -MF $(DEPDIR)/libhawk_la-mod-sys.Tpo -c -o libhawk_la-mod-sys.lo `test -f 'mod-sys.c' || echo '$(srcdir)/'`mod-sys.c | ||||
| @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-mod-sys.Tpo $(DEPDIR)/libhawk_la-mod-sys.Plo | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mod-sys.c' object='libhawk_la-mod-sys.lo' libtool=yes @AMDEPBACKSLASH@ | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||
| @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhawk_la-mod-sys.lo `test -f 'mod-sys.c' || echo '$(srcdir)/'`mod-sys.c | ||||
|  | ||||
| .cpp.o: | ||||
| @am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ | ||||
| @am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ | ||||
|  | ||||
							
								
								
									
										844
									
								
								hawk/lib/dir.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										844
									
								
								hawk/lib/dir.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,844 @@ | ||||
| /* | ||||
|  * $Id$ | ||||
|  * | ||||
|     Copyright (c) 2006-2019 Chung, Hyung-Hwan. All rights reserved. | ||||
|  | ||||
|     Redistribution and use in source and binary forms, with or without | ||||
|     modification, are permitted provided that the following conditions | ||||
|     are met: | ||||
|     1. Redistributions of source code must retain the above copyright | ||||
|        notice, this list of conditions and the following disclaimer. | ||||
|     2. Redistributions in binary form must reproduce the above copyright | ||||
|        notice, this list of conditions and the following disclaimer in the | ||||
|        documentation and/or other materials provided with the distribution. | ||||
|  | ||||
|     THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR | ||||
|     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||||
|     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||||
|     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||
|     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||||
|     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
|     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
|     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||||
|     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include <hawk-dir.h> | ||||
| #include "hawk-prv.h" | ||||
|  | ||||
| #if defined(_WIN32)  | ||||
| #	include <windows.h> | ||||
| #elif defined(__OS2__)  | ||||
| #	define INCL_DOSFILEMGR | ||||
| #	define INCL_ERRORS | ||||
| #	include <os2.h> | ||||
| #elif defined(__DOS__)  | ||||
| #	include <dos.h> | ||||
| #	include <errno.h> | ||||
| #else | ||||
| #	include "syscall.h" | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #define STATUS_OPENED    (1 << 0) | ||||
| #define STATUS_DONE      (1 << 1) | ||||
| #define STATUS_DONE_ERR  (1 << 2) | ||||
| #define STATUS_POPHEAP   (1 << 3) | ||||
| #define STATUS_SORT_ERR  (1 << 4) | ||||
|  | ||||
| #define IS_CURDIR(x) ((x)[0] == '.' && (x)[1] == '\0') | ||||
| #define IS_PREVDIR(x) ((x)[0] == '.' && (x)[1] == '.' && (x)[2] == '\0') | ||||
|  | ||||
|  | ||||
| struct hawk_dir_t | ||||
| { | ||||
| 	hawk_gem_t* gem; | ||||
| 	int flags; | ||||
|  | ||||
| 	hawk_uecs_t wbuf; | ||||
| 	hawk_becs_t mbuf; | ||||
|  | ||||
| 	hawk_arr_t* stab; | ||||
| 	int status; | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| 	HANDLE h; | ||||
| 	WIN32_FIND_DATA wfd; | ||||
| #elif defined(__OS2__) | ||||
| 	HDIR h; | ||||
| 	#if defined(FIL_STANDARDL)  | ||||
| 	FILEFINDBUF3L ffb; | ||||
| 	#else | ||||
| 	FILEFINDBUF3 ffb; | ||||
| 	#endif | ||||
| 	ULONG count; | ||||
| #elif defined(__DOS__) | ||||
| 	struct find_t f; | ||||
| #else | ||||
| 	HAWK_DIR* dp; | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| int hawk_dir_init (hawk_dir_t* dir, hawk_gem_t* gem, const hawk_ooch_t* path, int flags); | ||||
| void hawk_dir_fini (hawk_dir_t* dir); | ||||
|  | ||||
| static void close_dir_safely (hawk_dir_t* dir); | ||||
| static int reset_to_path (hawk_dir_t* dir, const hawk_ooch_t* path); | ||||
| static int read_ahead_and_sort (hawk_dir_t* dir, const hawk_ooch_t* path); | ||||
|  | ||||
| #include "syserr.h" | ||||
| IMPLEMENT_SYSERR_TO_ERRNUM (hawk, HAWK) | ||||
|  | ||||
| hawk_dir_t* hawk_dir_open (hawk_gem_t* gem, hawk_oow_t xtnsize, const hawk_ooch_t* path, int flags) | ||||
| { | ||||
| 	hawk_dir_t* dir; | ||||
|  | ||||
| 	dir = hawk_gem_allocmem(gem, HAWK_SIZEOF(*dir) + xtnsize); | ||||
| 	if (dir) | ||||
| 	{ | ||||
| 		if (hawk_dir_init(dir, gem, path, flags) <= -1) | ||||
| 		{ | ||||
| 			hawk_gem_freemem (gem, dir); | ||||
| 			dir = HAWK_NULL; | ||||
| 		} | ||||
| 		else HAWK_MEMSET (dir + 1, 0, xtnsize); | ||||
| 	} | ||||
|  | ||||
| 	return dir; | ||||
| } | ||||
|  | ||||
| void hawk_dir_close (hawk_dir_t* dir) | ||||
| { | ||||
| 	hawk_dir_fini (dir); | ||||
| 	hawk_gem_freemem (dir->gem, dir); | ||||
| } | ||||
|  | ||||
| void* hawk_dir_getxtn (hawk_dir_t* dir) | ||||
| { | ||||
| 	return (void*)(dir + 1); | ||||
| } | ||||
|  | ||||
| static int compare_dirent (hawk_arr_t* arr, const void* dptr1, hawk_oow_t dlen1, const void* dptr2, hawk_oow_t dlen2) | ||||
| { | ||||
| 	int n = HAWK_MEMCMP(dptr1, dptr2, ((dlen1 < dlen2)? dlen1: dlen2)); | ||||
| 	if (n == 0 && dlen1 != dlen2) n = (dlen1 > dlen2)? 1: -1; | ||||
| 	return -n; | ||||
| } | ||||
|  | ||||
| int hawk_dir_init (hawk_dir_t* dir, hawk_gem_t* gem, const hawk_ooch_t* path, int flags) | ||||
| { | ||||
| 	int n; | ||||
| 	int path_flags; | ||||
|  | ||||
| 	path_flags = flags & (HAWK_DIR_MBSPATH | HAWK_DIR_WCSPATH); | ||||
| 	if (path_flags == (HAWK_DIR_MBSPATH | HAWK_DIR_WCSPATH) || path_flags == 0) | ||||
| 	{ | ||||
| 		/* if both are set or none are set, force it to the default */ | ||||
| 	#if defined(HAWK_OOCH_IS_BCH) | ||||
| 		flags |= HAWK_DIR_MBSPATH; | ||||
| 		flags &= ~HAWK_DIR_WCSPATH; | ||||
| 	#else | ||||
| 		flags |= HAWK_DIR_WCSPATH; | ||||
| 		flags &= ~HAWK_DIR_MBSPATH; | ||||
| 	#endif | ||||
| 	} | ||||
|  | ||||
| 	HAWK_MEMSET (dir, 0, HAWK_SIZEOF(*dir)); | ||||
|  | ||||
| 	dir->gem = gem; | ||||
| 	dir->flags = flags; | ||||
|  | ||||
| 	if (hawk_uecs_init(&dir->wbuf, gem, 256) <= -1) goto oops_0; | ||||
| 	if (hawk_becs_init(&dir->mbuf, gem, 256) <= -1) goto oops_1; | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| 	dir->h = INVALID_HANDLE_VALUE; | ||||
| #endif | ||||
|  | ||||
| 	n = reset_to_path(dir, path); | ||||
| 	if (n <= -1) goto oops_2; | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_SORT) | ||||
| 	{ | ||||
| 		dir->stab = hawk_arr_open(gem, 0, 128); | ||||
| 		if (dir->stab == HAWK_NULL) goto oops_3; | ||||
|  | ||||
| 		/*hawk_arr_setscale (dir->stab, 1);*/ | ||||
| 		hawk_arr_setcopier (dir->stab, HAWK_ARR_COPIER_INLINE); | ||||
| 		hawk_arr_setcomper (dir->stab, compare_dirent); | ||||
| 		if (read_ahead_and_sort(dir, path) <= -1) goto oops_4; | ||||
| 	} | ||||
|  | ||||
| 	return n; | ||||
|  | ||||
| oops_4: | ||||
| 	hawk_arr_close (dir->stab); | ||||
| oops_3: | ||||
| 	close_dir_safely (dir); | ||||
| oops_2: | ||||
| 	hawk_becs_fini (&dir->mbuf); | ||||
| oops_1: | ||||
| 	hawk_uecs_fini (&dir->wbuf); | ||||
| oops_0: | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| static void close_dir_safely (hawk_dir_t* dir) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
| 	if (dir->h != INVALID_HANDLE_VALUE) | ||||
| 	{ | ||||
| 		FindClose (dir->h); | ||||
| 		dir->h = INVALID_HANDLE_VALUE; | ||||
| 	} | ||||
| #elif defined(__OS2__) | ||||
| 	if (dir->status & STATUS_OPENED) | ||||
| 	{ | ||||
| 		DosFindClose (dir->h); | ||||
| 		dir->status &= ~STATUS_OPENED; | ||||
| 	} | ||||
| #elif defined(__DOS__) | ||||
| 	if (dir->status & STATUS_OPENED) | ||||
| 	{ | ||||
| 		_dos_findclose (&dir->f); | ||||
| 		dir->status &= ~STATUS_OPENED; | ||||
| 	} | ||||
| #else | ||||
| 	if (dir->dp) | ||||
| 	{ | ||||
| 		HAWK_CLOSEDIR (dir->dp); | ||||
| 		dir->dp = HAWK_NULL; | ||||
| 	} | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void hawk_dir_fini (hawk_dir_t* dir) | ||||
| { | ||||
| 	close_dir_safely (dir); | ||||
|  | ||||
| 	hawk_becs_fini (&dir->mbuf); | ||||
| 	hawk_uecs_fini (&dir->wbuf); | ||||
|  | ||||
| 	if (dir->stab) hawk_arr_close (dir->stab); | ||||
| } | ||||
|  | ||||
| static hawk_bch_t* wcs_to_mbuf (hawk_dir_t* dir, const hawk_uch_t* wcs, hawk_becs_t* mbuf) | ||||
| { | ||||
| #if 0 | ||||
| 	hawk_oow_t ml, wl; | ||||
|  | ||||
| 	if (hawk_gem_convutobcstr(gem, wcs, &wl, HAWK_NULL, &ml) <= -1) return HAWK_NULL; | ||||
|  | ||||
| 	if (hawk_becs_setlen(mbuf, ml) == (hawk_oow_t)-1)  | ||||
| 	{ | ||||
| 		dir->errnum = HAWK_DIR_ENOMEM; | ||||
| 		return HAWK_NULL; | ||||
| 	} | ||||
|  | ||||
| 	hawk_wcstombs (wcs, &wl, HAWK_BECS_PTR(mbuf), &ml); | ||||
| 	return HAWK_BECS_PTR(mbuf); | ||||
|  | ||||
| #else | ||||
|  | ||||
| 	if (hawk_becs_ncatuchars(mbuf, wcs, hawk_count_ucstr(wcs), dir->gem->cmgr) == (hawk_oow_t)-1) return HAWK_NULL; | ||||
| 	return HAWK_BECS_PTR(mbuf); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static hawk_uch_t* mbs_to_wbuf (hawk_dir_t* dir, const hawk_bch_t* mbs, hawk_uecs_t* wbuf) | ||||
| { | ||||
| #if 0 | ||||
| 	hawk_oow_t ml, wl; | ||||
|  | ||||
| 	if (hawk_mbstowcs (mbs, &ml, HAWK_NULL, &wl) <= -1) | ||||
| 	{ | ||||
| 		dir->errnum = HAWK_DIR_EINVAL; | ||||
| 		return HAWK_NULL; | ||||
| 	} | ||||
| 	if (hawk_uecs_setlen (wbuf, wl) == (hawk_oow_t)-1)  | ||||
| 	{ | ||||
| 		dir->errnum = HAWK_DIR_ENOMEM; | ||||
| 		return HAWK_NULL; | ||||
| 	} | ||||
|  | ||||
| 	hawk_mbstowcs (mbs, &ml, HAWK_UECS_PTR(wbuf), &wl); | ||||
| 	return HAWK_UECS_PTR(wbuf); | ||||
| #else | ||||
| 	/* convert all regardless of encoding failure */ | ||||
| 	if (hawk_uecs_ncatbchars(wbuf, mbs, hawk_count_bcstr(mbs), dir->gem->cmgr, 1) == (hawk_oow_t)-1) return HAWK_NULL; | ||||
| 	return HAWK_UECS_PTR(wbuf); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static hawk_uch_t* wcs_to_wbuf (hawk_dir_t* dir, const hawk_uch_t* wcs, hawk_uecs_t* wbuf) | ||||
| { | ||||
| 	if (hawk_uecs_cpy(&dir->wbuf, wcs) == (hawk_oow_t)-1) return HAWK_NULL; | ||||
| 	return HAWK_UECS_PTR(wbuf); | ||||
| } | ||||
|  | ||||
| static hawk_bch_t* mbs_to_mbuf (hawk_dir_t* dir, const hawk_bch_t* mbs, hawk_becs_t* mbuf) | ||||
| { | ||||
| 	if (hawk_becs_cpy(&dir->mbuf, mbs) == (hawk_oow_t)-1) return HAWK_NULL; | ||||
| 	return HAWK_BECS_PTR(mbuf); | ||||
| } | ||||
|  | ||||
| #if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) | ||||
| static hawk_bch_t* make_mbsdos_path (hawk_dir_t* dir, const hawk_bch_t* mpath) | ||||
| { | ||||
| 	if (mpath[0] == '\0') | ||||
| 	{ | ||||
| 		if (hawk_becs_cpy(&dir->mbuf, "*.*") == (hawk_oow_t)-1) return HAWK_NULL; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		hawk_oow_t len; | ||||
| 		if ((len = hawk_becs_cpy(&dir->mbuf, mpath)) == (hawk_oow_t)-1 || | ||||
| 		    (!HAWK_ISPATHMBSEP(mpath[len - 1]) &&  | ||||
| 		     !hawk_ismbsdrivecurpath(mpath) && | ||||
| 		     hawk_becs_ccat(&dir->mbuf, '\\') == (hawk_oow_t)-1) || | ||||
| 		    hawk_becs_cat(&dir->mbuf, "*.*") == (hawk_oow_t)-1) return HAWK_NULL; | ||||
| 	} | ||||
|  | ||||
| 	return HAWK_BECS_PTR(&dir->mbuf); | ||||
| } | ||||
|  | ||||
| static hawk_uch_t* make_wcsdos_path (hawk_dir_t* dir, const hawk_uch_t* wpath) | ||||
| { | ||||
| 	if (wpath[0] == HAWK_UT('\0')) | ||||
| 	{ | ||||
| 		if (hawk_uecs_cpy (&dir->wbuf, HAWK_UT("*.*")) == (hawk_oow_t)-1) return HAWK_NULL; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		hawk_oow_t len; | ||||
| 		if ((len = hawk_uecs_cpy (&dir->wbuf, wpath)) == (hawk_oow_t)-1 || | ||||
| 		    (!HAWK_ISPATHWCSEP(wpath[len - 1]) &&  | ||||
| 		     !hawk_iswcsdrivecurpath(wpath) && | ||||
| 		     hawk_uecs_ccat (&dir->wbuf, HAWK_UT('\\')) == (hawk_oow_t)-1) || | ||||
| 		    hawk_uecs_cat (&dir->wbuf, HAWK_UT("*.*")) == (hawk_oow_t)-1) return HAWK_NULL; | ||||
| 	} | ||||
|  | ||||
| 	return HAWK_UECS_PTR(&dir->wbuf); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /* | ||||
| static hawk_ooch_t* make_dos_path (hawk_dir_t* dir, const hawk_ooch_t* path) | ||||
| { | ||||
| 	if (path[0] == HAWK_T('\0')) | ||||
| 	{ | ||||
| 		if (hawk_str_cpy (&dir->tbuf, HAWK_T("*.*")) == (hawk_oow_t)-1)  | ||||
| 		{ | ||||
| 			dir->errnum = HAWK_DIR_ENOMEM; | ||||
| 			return HAWK_NULL; | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		hawk_oow_t len; | ||||
| 		if ((len = hawk_str_cpy (&dir->tbuf, path)) == (hawk_oow_t)-1 || | ||||
| 		    (!HAWK_ISPATHSEP(path[len - 1]) &&  | ||||
| 		     !hawk_isdrivecurpath(path) && | ||||
| 		     hawk_str_ccat (&dir->tbuf, HAWK_T('\\')) == (hawk_oow_t)-1) || | ||||
| 		    hawk_str_cat (&dir->tbuf, HAWK_T("*.*")) == (hawk_oow_t)-1) | ||||
| 		{ | ||||
| 			dir->errnum = HAWK_DIR_ENOMEM; | ||||
| 			return HAWK_NULL; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return HAWK_STR_PTR(&dir->tbuf); | ||||
| } | ||||
|  | ||||
| static hawk_bch_t* mkdospath (hawk_dir_t* dir, const hawk_ooch_t* path) | ||||
| { | ||||
|  | ||||
| #if defined(HAWK_OOCH_IS_BCH) | ||||
| 	return make_dos_path (dir, path); | ||||
| #else | ||||
| 	if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 	{ | ||||
| 		return make_mbsdos_path (dir, (const hawk_bch_t*) path); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		hawk_ooch_t* tptr; | ||||
| 		hawk_bch_t* mptr; | ||||
|  | ||||
| 		tptr = make_dos_path (dir, path); | ||||
| 		if (tptr == HAWK_NULL) return HAWK_NULL; | ||||
|  | ||||
| 		mptr = wcs_to_mbuf (dir, HAWK_STR_PTR(&dir->tbuf), &dir->mbuf); | ||||
| 		if (mptr == HAWK_NULL) return HAWK_NULL; | ||||
|  | ||||
| 		return mptr; | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| } | ||||
| */ | ||||
|  | ||||
| static int reset_to_path (hawk_dir_t* dir, const hawk_ooch_t* path) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
| 	const hawk_ooch_t* tptr; | ||||
|  | ||||
| 	dir->status &= ~STATUS_DONE; | ||||
| 	dir->status &= ~STATUS_DONE_ERR; | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 	{ | ||||
| 		hawk_bch_t* mptr; | ||||
|  | ||||
| 		mptr = make_mbsdos_path (dir, (const hawk_bch_t*)path); | ||||
| 		if (mptr == HAWK_NULL) return -1; | ||||
|  | ||||
| 	#if defined(HAWK_OOCH_IS_BCH) | ||||
| 		tptr = mptr; | ||||
| 	#else | ||||
| 		tptr = mbs_to_wbuf (dir, mptr, &dir->wbuf); | ||||
| 	#endif | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		hawk_uch_t* wptr; | ||||
| 		HAWK_ASSERT (dir->flags & HAWK_DIR_WCSPATH); | ||||
|  | ||||
| 		wptr = make_wcsdos_path(dir, (const hawk_uch_t*)path); | ||||
| 		if (wptr == HAWK_NULL) return -1; | ||||
|  | ||||
| 	#if defined(HAWK_OOCH_IS_BCH) | ||||
| 		tptr = wcs_to_mbuf(dir, wptr, &dir->mbuf); | ||||
| 	#else | ||||
| 		tptr = wptr; | ||||
| 	#endif | ||||
| 	} | ||||
| 	if (tptr == HAWK_NULL) return -1; | ||||
|  | ||||
| 	dir->h = FindFirstFile(tptr, &dir->wfd); | ||||
| 	if (dir->h == INVALID_HANDLE_VALUE)  | ||||
| 	{ | ||||
| 		hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum(GetLastError())); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
|  | ||||
| #elif defined(__OS2__) | ||||
|  | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
| 	APIRET rc; | ||||
| 	const hawk_bch_t* mptr; | ||||
|  | ||||
| 	dir->h = HDIR_CREATE; | ||||
| 	dir->count = 1; | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 	{ | ||||
| 		mptr = make_mbsdos_path (dir, (const hawk_bch_t*)path); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		hawk_uch_t* wptr; | ||||
| 		HAWK_ASSERT (dir->flags & HAWK_DIR_WCSPATH); | ||||
|  | ||||
| 		wptr = make_wcsdos_path(dir, (const hawk_uch_t*)path); | ||||
| 		if (wptr == HAWK_NULL) return -1; | ||||
| 		mptr = wcs_to_mbuf(dir, wptr, &dir->mbuf); | ||||
| 	} | ||||
| 	if (mptr == HAWK_NULL) return -1; | ||||
|  | ||||
| 	rc = DosFindFirst ( | ||||
| 		mptr, | ||||
| 		&dir->h,  | ||||
| 		FILE_DIRECTORY | FILE_READONLY, | ||||
| 		&dir->ffb, | ||||
| 		HAWK_SIZEOF(dir->ffb), | ||||
| 		&dir->count, | ||||
| 	#if defined(FIL_STANDARDL)  | ||||
| 		FIL_STANDARDL | ||||
| 	#else | ||||
| 		FIL_STANDARD | ||||
| 	#endif | ||||
| 	); | ||||
|  | ||||
| 	if (rc != NO_ERROR) | ||||
| 	{ | ||||
| 		hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum(rc)); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	dir->status |= STATUS_OPENED; | ||||
| 	return 0; | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
|  | ||||
| #elif defined(__DOS__) | ||||
|  | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
| 	unsigned int rc; | ||||
| 	const hawk_bch_t* mptr; | ||||
|  | ||||
| 	dir->status &= ~STATUS_DONE; | ||||
| 	dir->status &= ~STATUS_DONE_ERR; | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 	{ | ||||
| 		mptr = make_mbsdos_path(dir, (const hawk_bch_t*)path); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		hawk_uch_t* wptr; | ||||
|  | ||||
| 		HAWK_ASSERT (dir->flags & HAWK_DIR_WCSPATH); | ||||
|  | ||||
| 		wptr = make_wcsdos_path(dir, (const hawk_uch_t*)path); | ||||
| 		if (wptr == HAWK_NULL) return -1; | ||||
| 		mptr = wcs_to_mbuf(dir, wptr, &dir->mbuf); | ||||
| 	} | ||||
| 	if (mptr == HAWK_NULL) return -1; | ||||
|  | ||||
| 	rc = _dos_findfirst(mptr, _A_NORMAL | _A_SUBDIR, &dir->f); | ||||
| 	if (rc != 0)  | ||||
| 	{ | ||||
| 		hawk_gem_seterrnum (dir->gem, HAWK_NULL,syserr_to_errnum(errno)); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	dir->status |= STATUS_OPENED; | ||||
| 	return 0; | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
|  | ||||
| #else | ||||
| 	DIR* dp; | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 	{ | ||||
| 		const hawk_bch_t* mpath = (const hawk_bch_t*)path; | ||||
| 		dp = HAWK_OPENDIR(mpath[0] == '\0'? ".": mpath); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		const hawk_uch_t* wpath; | ||||
| 		/*HAWK_ASSERT (dir->flags & HAWK_DIR_WCSPATH);*/ | ||||
|  | ||||
| 		wpath = (const hawk_uch_t*)path; | ||||
| 		if (wpath[0] == '\0') | ||||
| 		{ | ||||
| 			dp = HAWK_OPENDIR("."); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			hawk_bch_t* mptr; | ||||
|  | ||||
| 			mptr = wcs_to_mbuf(dir, wpath, &dir->mbuf); | ||||
| 			if (mptr == HAWK_NULL) return -1; | ||||
|  | ||||
| 			dp = HAWK_OPENDIR(mptr); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (dp == HAWK_NULL)  | ||||
| 	{ | ||||
| 		hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum(errno)); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	dir->dp = dp; | ||||
| 	return 0; | ||||
| #endif  | ||||
| } | ||||
|  | ||||
| int hawk_dir_reset (hawk_dir_t* dir, const hawk_ooch_t* path) | ||||
| { | ||||
| 	close_dir_safely (dir); | ||||
| 	if (reset_to_path (dir, path) <= -1) return -1; | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_SORT) | ||||
| 	{ | ||||
| 		hawk_arr_clear (dir->stab); | ||||
| 		if (read_ahead_and_sort (dir, path) <= -1)  | ||||
| 		{ | ||||
| 			dir->status |= STATUS_SORT_ERR; | ||||
| 			return -1; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			dir->status &= ~STATUS_SORT_ERR; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int read_dir_to_buf (hawk_dir_t* dir, void** name) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
|  | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
| 	if (dir->status & STATUS_DONE) return (dir->status & STATUS_DONE_ERR)? -1: 0; | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_SKIPSPCDIR) | ||||
| 	{ | ||||
| 		/* skip . and .. */ | ||||
| 		while (IS_CURDIR(dir->wfd.cFileName) || IS_PREVDIR(dir->wfd.cFileName)) | ||||
| 		{ | ||||
| 			if (FindNextFile(dir->h, &dir->wfd) == FALSE)  | ||||
| 			{ | ||||
| 				DWORD x = GetLastError(); | ||||
| 				if (x == ERROR_NO_MORE_FILES)  | ||||
| 				{ | ||||
| 					dir->status |= STATUS_DONE; | ||||
| 					return 0; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum(x)); | ||||
| 					dir->status |= STATUS_DONE; | ||||
| 					dir->status |= STATUS_DONE_ERR; | ||||
| 					return -1; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 	{ | ||||
| 	#if defined(HAWK_OOCH_IS_BCH) | ||||
| 		if (mbs_to_mbuf(dir, dir->wfd.cFileName, &dir->mbuf) == HAWK_NULL) return -1; | ||||
| 	#else | ||||
| 		if (wcs_to_mbuf(dir, dir->wfd.cFileName, &dir->mbuf) == HAWK_NULL) return -1; | ||||
| 	#endif | ||||
| 		*name = HAWK_BECS_PTR(&dir->mbuf); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		HAWK_ASSERT (dir->flags & HAWK_DIR_WCSPATH); | ||||
| 	#if defined(HAWK_OOCH_IS_BCH) | ||||
| 		if (mbs_to_wbuf(dir, dir->wfd.cFileName, &dir->wbuf) == HAWK_NULL) return -1; | ||||
| 	#else | ||||
| 		if (wcs_to_wbuf(dir, dir->wfd.cFileName, &dir->wbuf) == HAWK_NULL) return -1; | ||||
| 	#endif | ||||
| 		*name = HAWK_UECS_PTR(&dir->wbuf); | ||||
| 	} | ||||
|  | ||||
| 	if (FindNextFile (dir->h, &dir->wfd) == FALSE)  | ||||
| 	{ | ||||
| 		DWORD x = GetLastError(); | ||||
| 		if (x == ERROR_NO_MORE_FILES) dir->status |= STATUS_DONE; | ||||
| 		else | ||||
| 		{ | ||||
| 			hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum (x)); | ||||
| 			dir->status |= STATUS_DONE; | ||||
| 			dir->status |= STATUS_DONE_ERR; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return 1; | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
|  | ||||
| #elif defined(__OS2__) | ||||
|  | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
| 	APIRET rc; | ||||
|  | ||||
| 	if (dir->count <= 0) return 0; | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_SKIPSPCDIR) | ||||
| 	{ | ||||
| 		/* skip . and .. */ | ||||
| 		while (IS_CURDIR(dir->ffb.achName) || IS_PREVDIR(dir->ffb.achName)) | ||||
| 		{ | ||||
| 			rc = DosFindNext (dir->h, &dir->ffb, HAWK_SIZEOF(dir->ffb), &dir->count); | ||||
| 			if (rc == ERROR_NO_MORE_FILES)  | ||||
| 			{ | ||||
| 				dir->count = 0; | ||||
| 				return 0; | ||||
| 			} | ||||
| 			else if (rc != NO_ERROR) | ||||
| 			{ | ||||
| 				hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum (rc)); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 	{ | ||||
| 		if (mbs_to_mbuf (dir, dir->ffb.achName, &dir->mbuf) == HAWK_NULL) return -1; | ||||
| 		*name = HAWK_BECS_PTR(&dir->mbuf); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		HAWK_ASSERT (dir->flags & HAWK_DIR_WCSPATH); | ||||
| 		if (mbs_to_wbuf (dir, dir->ffb.achName, &dir->wbuf) == HAWK_NULL) return -1; | ||||
| 		*name = HAWK_UECS_PTR(&dir->wbuf); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	rc = DosFindNext (dir->h, &dir->ffb, HAWK_SIZEOF(dir->ffb), &dir->count); | ||||
| 	if (rc == ERROR_NO_MORE_FILES) dir->count = 0; | ||||
| 	else if (rc != NO_ERROR) | ||||
| 	{ | ||||
| 		hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum (rc)); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return 1; | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
|  | ||||
| #elif defined(__DOS__) | ||||
|  | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
|  | ||||
| 	if (dir->status & STATUS_DONE) return (dir->status & STATUS_DONE_ERR)? -1: 0; | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_SKIPSPCDIR) | ||||
| 	{ | ||||
| 		/* skip . and .. */ | ||||
| 		while (IS_CURDIR(dir->f.name) || IS_PREVDIR(dir->f.name)) | ||||
| 		{ | ||||
| 			if (_dos_findnext (&dir->f) != 0) | ||||
| 			{ | ||||
| 				if (errno == ENOENT)  | ||||
| 				{ | ||||
| 					dir->status |= STATUS_DONE; | ||||
| 					return 0; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum (errno)); | ||||
| 					dir->status |= STATUS_DONE; | ||||
| 					dir->status |= STATUS_DONE_ERR; | ||||
| 					return -1; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 	{ | ||||
| 		if (mbs_to_mbuf (dir, dir->f.name, &dir->mbuf) == HAWK_NULL) return -1; | ||||
| 		*name = HAWK_BECS_PTR(&dir->mbuf); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		HAWK_ASSERT (dir->flags & HAWK_DIR_WCSPATH); | ||||
|  | ||||
| 		if (mbs_to_wbuf (dir, dir->f.name, &dir->wbuf) == HAWK_NULL) return -1; | ||||
| 		*name = HAWK_UECS_PTR(&dir->wbuf); | ||||
| 	} | ||||
|  | ||||
| 	if (_dos_findnext (&dir->f) != 0) | ||||
| 	{ | ||||
| 		if (errno == ENOENT) dir->status |= STATUS_DONE; | ||||
| 		else | ||||
| 		{ | ||||
| 			hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum (errno)); | ||||
| 			dir->status |= STATUS_DONE; | ||||
| 			dir->status |= STATUS_DONE_ERR; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return 1; | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
|  | ||||
| #else | ||||
|  | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
| 	hawk_dirent_t* de; | ||||
|  | ||||
| read: | ||||
| 	errno = 0; | ||||
| 	de = HAWK_READDIR (dir->dp); | ||||
| 	if (de == NULL)  | ||||
| 	{ | ||||
| 		if (errno == 0) return 0; | ||||
| 		hawk_gem_seterrnum (dir->gem, HAWK_NULL, syserr_to_errnum (errno)); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_SKIPSPCDIR) | ||||
| 	{ | ||||
| 		/* skip . and .. */ | ||||
| 		if (IS_CURDIR(de->d_name) ||  | ||||
| 		    IS_PREVDIR(de->d_name)) goto read; | ||||
| 	} | ||||
|  | ||||
| 	if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 	{ | ||||
| 		if (mbs_to_mbuf (dir, de->d_name, &dir->mbuf) == HAWK_NULL) return -1; | ||||
| 		*name = HAWK_BECS_PTR(&dir->mbuf); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/*HAWK_ASSERT (dir->flags & HAWK_DIR_WCSPATH);*/ | ||||
| 		if (mbs_to_wbuf (dir, de->d_name, &dir->wbuf) == HAWK_NULL) return -1; | ||||
| 		*name = HAWK_UECS_PTR(&dir->wbuf); | ||||
| 	} | ||||
|  | ||||
| 	return 1; | ||||
| 	/* ------------------------------------------------------------------- */ | ||||
|  | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static int read_ahead_and_sort (hawk_dir_t* dir, const hawk_ooch_t* path) | ||||
| { | ||||
| 	int x; | ||||
| 	void* name; | ||||
|  | ||||
| 	while (1) | ||||
| 	{ | ||||
| 		x = read_dir_to_buf (dir, &name); | ||||
| 		if (x >= 1) | ||||
| 		{ | ||||
| 			hawk_oow_t size; | ||||
|  | ||||
| 			if (dir->flags & HAWK_DIR_MBSPATH) | ||||
| 				size = (hawk_count_bcstr(name) + 1) * HAWK_SIZEOF(hawk_bch_t); | ||||
| 			else | ||||
| 				size = (hawk_count_ucstr(name) + 1) * HAWK_SIZEOF(hawk_uch_t); | ||||
|  | ||||
| 			if (hawk_arr_pushheap(dir->stab, name, size) == (hawk_oow_t)-1) return -1; | ||||
| 		} | ||||
| 		else if (x == 0) break; | ||||
| 		else return -1; | ||||
| 	} | ||||
|  | ||||
| 	dir->status &= ~STATUS_POPHEAP; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| int hawk_dir_read (hawk_dir_t* dir, hawk_dir_ent_t* ent) | ||||
| { | ||||
| 	if (dir->flags & HAWK_DIR_SORT) | ||||
| 	{ | ||||
| 		if (dir->status & STATUS_SORT_ERR) return -1; | ||||
|  | ||||
| 		if (dir->status & STATUS_POPHEAP) hawk_arr_popheap (dir->stab); | ||||
| 		else dir->status |= STATUS_POPHEAP; | ||||
|  | ||||
| 		if (HAWK_ARR_SIZE(dir->stab) <= 0) return 0; /* no more entry */ | ||||
|  | ||||
| 		ent->name = HAWK_ARR_DPTR(dir->stab, 0); | ||||
| 		return 1; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		int x; | ||||
| 		void* name; | ||||
|  | ||||
| 		x = read_dir_to_buf(dir, &name); | ||||
| 		if (x >= 1) | ||||
| 		{ | ||||
| 			HAWK_MEMSET (ent, 0, HAWK_SIZEOF(ent)); | ||||
| 			ent->name = name; | ||||
| 		} | ||||
|  | ||||
| 		return x; | ||||
| 	} | ||||
| } | ||||
| @ -454,6 +454,33 @@ | ||||
| /* Define to 1 if `d_type' is a member of `struct dirent'. */ | ||||
| #undef HAVE_STRUCT_DIRENT_D_TYPE | ||||
|  | ||||
| /* Define to 1 if `st_birthtime' is a member of `struct stat'. */ | ||||
| #undef HAVE_STRUCT_STAT_ST_BIRTHTIME | ||||
|  | ||||
| /* Define to 1 if `st_birthtimespec.tv_nsec' is a member of `struct stat'. */ | ||||
| #undef HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC | ||||
|  | ||||
| /* Define to 1 if `st_birthtim.tv_nsec' is a member of `struct stat'. */ | ||||
| #undef HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC | ||||
|  | ||||
| /* Define to 1 if `st_mtimespec.tv_nsec' is a member of `struct stat'. */ | ||||
| #undef HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC | ||||
|  | ||||
| /* Define to 1 if `st_mtim.tv_nsec' is a member of `struct stat'. */ | ||||
| #undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC | ||||
|  | ||||
| /* Define to 1 if `tm_gmtoff' is a member of `struct tm'. */ | ||||
| #undef HAVE_STRUCT_TM_TM_GMTOFF | ||||
|  | ||||
| /* Define to 1 if `tm_zone' is a member of `struct tm'. */ | ||||
| #undef HAVE_STRUCT_TM_TM_ZONE | ||||
|  | ||||
| /* Define to 1 if `__tm_gmtoff' is a member of `struct tm'. */ | ||||
| #undef HAVE_STRUCT_TM___TM_GMTOFF | ||||
|  | ||||
| /* Define to 1 if `__tm_zone' is a member of `struct tm'. */ | ||||
| #undef HAVE_STRUCT_TM___TM_ZONE | ||||
|  | ||||
| /* Define to 1 if you have the `swapcontext' function. */ | ||||
| #undef HAVE_SWAPCONTEXT | ||||
|  | ||||
| @ -525,6 +552,12 @@ | ||||
| /* Define to 1 if you have the `tanq' function. */ | ||||
| #undef HAVE_TANQ | ||||
|  | ||||
| /* Define to 1 if you have the `timegm' function. */ | ||||
| #undef HAVE_TIMEGM | ||||
|  | ||||
| /* Define to 1 if you have the `timelocal' function. */ | ||||
| #undef HAVE_TIMELOCAL | ||||
|  | ||||
| /* Define to 1 if you have the <time.h> header file. */ | ||||
| #undef HAVE_TIME_H | ||||
|  | ||||
|  | ||||
							
								
								
									
										87
									
								
								hawk/lib/hawk-dir.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								hawk/lib/hawk-dir.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,87 @@ | ||||
| /* | ||||
|  * $Id$ | ||||
|  * | ||||
|     Copyright (c) 2006-2019 Chung, Hyung-Hwan. All rights reserved. | ||||
|  | ||||
|     Redistribution and use in source and binary forms, with or without | ||||
|     modification, are permitted provided that the following conditions | ||||
|     are met: | ||||
|     1. Redistributions of source code must retain the above copyright | ||||
|        notice, this list of conditions and the following disclaimer. | ||||
|     2. Redistributions in binary form must reproduce the above copyright | ||||
|        notice, this list of conditions and the following disclaimer in the | ||||
|        documentation and/or other materials provided with the distribution. | ||||
|  | ||||
|     THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR | ||||
|     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||||
|     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||||
|     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||
|     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||||
|     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
|     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
|     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||||
|     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #ifndef _HAWK_DIR_H_ | ||||
| #define _HAWK_DIR_H_ | ||||
|  | ||||
| #include <hawk-cmn.h> | ||||
|  | ||||
| typedef struct hawk_dir_t hawk_dir_t; | ||||
| typedef struct hawk_dir_ent_t hawk_dir_ent_t; | ||||
|  | ||||
| enum hawk_dir_flag_t | ||||
| { | ||||
| 	HAWK_DIR_MBSPATH    = (1 << 0), | ||||
| 	HAWK_DIR_WCSPATH    = (1 << 1), | ||||
| 	HAWK_DIR_SORT       = (1 << 2), | ||||
| 	HAWK_DIR_SKIPSPCDIR = (1 << 3)  /**< limited to normal entries excluding . and .. */ | ||||
| }; | ||||
| typedef enum hawk_dir_flag_t hawk_dir_flag_t; | ||||
|  | ||||
| struct hawk_dir_ent_t | ||||
| { | ||||
| 	const hawk_ooch_t* name; | ||||
| }; | ||||
|  | ||||
| #if defined(__cplusplus) | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| HAWK_EXPORT hawk_dir_t* hawk_dir_open ( | ||||
| 	hawk_gem_t*        gem, | ||||
| 	hawk_oow_t         xtnsize, | ||||
| 	const hawk_ooch_t* path,  | ||||
| 	int                flags | ||||
| ); | ||||
|  | ||||
| HAWK_EXPORT void hawk_dir_close ( | ||||
| 	hawk_dir_t* dir | ||||
| ); | ||||
|  | ||||
| HAWK_EXPORT void* hawk_dir_getxtn ( | ||||
| 	hawk_dir_t* dir | ||||
| ); | ||||
|  | ||||
| HAWK_EXPORT int hawk_dir_reset ( | ||||
| 	hawk_dir_t*        dir, | ||||
| 	const hawk_ooch_t* path | ||||
| ); | ||||
|  | ||||
| /** | ||||
|  * The hawk_dir_read() function reads a directory entry and | ||||
|  * stores it in memory pointed to by \a ent. | ||||
|  * \return -1 on failure, 0 upon no more entry, 1 on success | ||||
|  */ | ||||
| HAWK_EXPORT int hawk_dir_read ( | ||||
| 	hawk_dir_t*     dir, | ||||
| 	hawk_dir_ent_t* ent | ||||
| ); | ||||
|  | ||||
| #if defined(__cplusplus) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
| @ -26,6 +26,7 @@ | ||||
|  | ||||
| #include "mod-sys.h" | ||||
| #include "hawk-prv.h" | ||||
| #include <hawk-dir.h> | ||||
|  | ||||
| #if defined(_WIN32) | ||||
| #	include <windows.h> | ||||
| @ -119,7 +120,7 @@ struct sys_node_data_t | ||||
| 	union | ||||
| 	{ | ||||
| 		int fd; | ||||
| 		//hawk_dir_t* dir; | ||||
| 		hawk_dir_t* dir; | ||||
| 	} u; | ||||
| }; | ||||
| typedef struct sys_node_data_t sys_node_data_t; | ||||
| @ -164,50 +165,33 @@ static HAWK_INLINE sys_rc_t syserr_to_rc (int syserr) | ||||
|  | ||||
| 		case EBADF: return RC_EBADF; | ||||
| 		case ECHILD: return RC_ECHILD; | ||||
| 		case EINTR:  return RC_EINTR; | ||||
| 		case EEXIST: return RC_EEXIST; | ||||
| 		case EINTR: return RC_EINTR; | ||||
| 		case EINVAL: return RC_EINVAL; | ||||
| 		case ENOMEM:  return RC_ENOMEM; | ||||
| 		case ENOSYS:  return RC_ENOSYS; | ||||
| 		case EPERM:  return RC_EPERM; | ||||
|  | ||||
| 		case ENOENT: return RC_ENOENT; | ||||
| 		case ENOMEM: return RC_ENOMEM; | ||||
| 		case ENOSYS: return RC_ENOSYS; | ||||
| 		case EPERM: return RC_EPERM; | ||||
| 		default: return RC_ERROR; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| #if 0 | ||||
| static HAWK_INLINE sys_rc_t direrr_to_rc (hawk_dir_errnum_t direrr) | ||||
| static HAWK_INLINE sys_rc_t hawkerr_to_rc (hawk_errnum_t hawkerr) | ||||
| { | ||||
| 	switch (direrr) | ||||
| 	{ | ||||
| 		case HAWK_DIR_ENOIMPL: return RC_ENOIMPL; | ||||
| 		case HAWK_DIR_ENOMEM: return RC_ENOMEM; | ||||
| 		case HAWK_DIR_EINVAL: return RC_EINVAL; | ||||
| 		case HAWK_DIR_EPERM: return RC_EPERM; | ||||
| 		case HAWK_DIR_ENOENT: return RC_ENOENT; | ||||
| 		case HAWK_DIR_EEXIST: return RC_EEXIST; | ||||
| 		case HAWK_DIR_ENOTDIR: return RC_ENOTDIR; | ||||
| 		case HAWK_DIR_EINTR: return RC_EINTR; | ||||
| 		case HAWK_DIR_EAGAIN: return RC_EAGAIN; | ||||
|  | ||||
| 		default: return RC_ERROR; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static HAWK_INLINE sys_rc_t awkerr_to_rc (hawk_dir_errnum_t awkerr) | ||||
| { | ||||
| 	switch (awkerr) | ||||
| 	switch (hawkerr) | ||||
| 	{ | ||||
| 		case HAWK_EAGAIN: return RC_EAGAIN; | ||||
| 		case HAWK_ECHILD: return RC_ECHILD; | ||||
| 		case HAWK_EEXIST: return RC_EEXIST; | ||||
| 		case HAWK_EINTR: return RC_EINTR; | ||||
| 		case HAWK_EINVAL: return RC_EINVAL; | ||||
| 		case HAWK_ENOENT: return RC_ENOENT; | ||||
| 		case HAWK_ENOIMPL: return RC_ENOIMPL; | ||||
| 		case HAWK_ENOMEM: return RC_ENOMEM; | ||||
| 		case HAWK_EINVAL: return RC_EINVAL; | ||||
| 		case HAWK_EPERM: return RC_EPERM; | ||||
| 		case HAWK_ENOENT: return RC_ENOENT; | ||||
| 		case HAWK_EEXIST: return RC_EEXIST; | ||||
|  | ||||
| 		default: return RC_ERROR; | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static const hawk_ooch_t* rc_to_errstr (sys_rc_t rc) | ||||
| { | ||||
| @ -236,7 +220,7 @@ static void set_errmsg_on_sys_list (hawk_rtx_t* rtx, sys_list_t* sys_list, const | ||||
| 	{ | ||||
| 		va_list ap; | ||||
| 		va_start (ap, errfmt); | ||||
| 		hawk_strxvfmt (sys_list->ctx.errmsg, HAWK_COUNTOF(sys_list->ctx.errmsg), errfmt, ap); | ||||
| 		hawk_rtx_vfmttooocstr (rtx, sys_list->ctx.errmsg, HAWK_COUNTOF(sys_list->ctx.errmsg), errfmt, ap); | ||||
| 		va_end (ap); | ||||
| 	} | ||||
| 	else | ||||
| @ -392,7 +376,7 @@ static int fnc_close (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| /* | ||||
|   BEGIN { | ||||
|      f = sys::open ("/tmp/test.txt", sys::O_RDONLY); | ||||
|      f = sys::open("/tmp/test.txt", sys::O_RDONLY); | ||||
|      while (sys::read(f, x, 10) > 0) printf (B"%s", x); | ||||
|      sys::close (f); | ||||
|   } | ||||
| @ -436,7 +420,7 @@ static int fnc_open (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		{ | ||||
| 			close (fd); | ||||
| 		fail: | ||||
| 			rx = awkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 			rx = hawkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 			set_errmsg_on_sys_list (rtx, sys_list, HAWK_NULL); | ||||
| 		} | ||||
| 	} | ||||
| @ -446,7 +430,7 @@ static int fnc_open (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		set_errmsg_on_sys_list_with_syserr (rtx, sys_list); | ||||
| 	} | ||||
|  | ||||
| 	HAWK_ASSERT (HAWK_IN_QUICKINT_RANGE(rx)); | ||||
| 	/*HAWK_ASSERT (HAWK_IN_QUICKINT_RANGE(rx));*/ | ||||
| 	hawk_rtx_setretval (rtx, hawk_rtx_makeintval(rtx, rx)); | ||||
| 	return 0; | ||||
| } | ||||
| @ -471,7 +455,7 @@ static int fnc_openfd (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 	if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 0), &fd) <= -1) | ||||
| 	{ | ||||
| 		rx = awkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 		rx = hawkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 		set_errmsg_on_sys_list (rtx, sys_list, HAWK_NULL); | ||||
| 	} | ||||
| 	else if (fd >= 0 && fd <= HAWK_TYPE_MAX(int)) | ||||
| @ -485,7 +469,7 @@ static int fnc_openfd (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		} | ||||
| 		else  | ||||
| 		{ | ||||
| 			rx = awkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 			rx = hawkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 			set_errmsg_on_sys_list (rtx, sys_list, HAWK_NULL); | ||||
| 		} | ||||
| 	} | ||||
| @ -495,7 +479,7 @@ static int fnc_openfd (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx)); | ||||
| 	} | ||||
|  | ||||
| 	HAWK_ASSERT (HAWK_IN_QUICKINT_RANGE(rx)); | ||||
| 	/*HAWK_ASSERT (HAWK_IN_QUICKINT_RANGE(rx));*/ | ||||
| 	hawk_rtx_setretval (rtx, hawk_rtx_makeintval(rtx, rx)); | ||||
| 	return 0; | ||||
| } | ||||
| @ -695,7 +679,7 @@ static int fnc_dup (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 				else  | ||||
| 				{ | ||||
| 					close (fd); | ||||
| 					rx = awkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 					rx = hawkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 					set_errmsg_on_sys_list (rtx, sys_list, HAWK_NULL); | ||||
| 				} | ||||
| 			} | ||||
| @ -855,7 +839,6 @@ static int fnc_pipe (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| /* ------------------------------------------------------------------------ */ | ||||
|  | ||||
| #if 0 | ||||
| /* | ||||
|         d = sys::opendir("/etc", sys::DIR_SORT); | ||||
|         if (d >= 0) | ||||
| @ -874,7 +857,6 @@ static int fnc_opendir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	hawk_oow_t plen; | ||||
| 	hawk_val_t* a0; | ||||
| 	hawk_dir_t* dir; | ||||
| 	hawk_dir_errnum_t oe; | ||||
|  | ||||
| 	sys_list = rtx_to_sys_list(rtx, fi); | ||||
|  | ||||
| @ -883,7 +865,7 @@ static int fnc_opendir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	a0 = hawk_rtx_getarg(rtx, 0); | ||||
| 	pstr = hawk_rtx_getvaloocstr(rtx, a0, &plen); | ||||
| 	if (!pstr) goto fail; | ||||
| 	dir = hawk_dir_open(hawk_rtx_getmmgr(rtx), 0, pstr, flags, &oe); | ||||
| 	dir = hawk_dir_open(hawk_rtx_getgem(rtx), 0, pstr, flags); | ||||
| 	hawk_rtx_freevaloocstr (rtx, a0, pstr); | ||||
|  | ||||
| 	if (dir) | ||||
| @ -902,11 +884,11 @@ static int fnc_opendir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		rx = direrr_to_rc(oe); | ||||
| 		rx = hawkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 		set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx)); | ||||
| 	} | ||||
|  | ||||
| 	HAWK_ASSERT (HAWK_IN_QUICKINT_RANGE(rx)); | ||||
| 	/*HAWK_ASSERT (HAWK_IN_QUICKINT_RANGE(rx));*/ | ||||
| 	hawk_rtx_setretval (rtx, hawk_rtx_makeintval(rtx, rx)); | ||||
| 	return 0; | ||||
| } | ||||
| @ -953,7 +935,7 @@ static int fnc_readdir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		y = hawk_dir_read(sys_node->ctx.u.dir, &ent); | ||||
| 		if (y <= -1)  | ||||
| 		{ | ||||
| 			rx = direrr_to_rc(hawk_dir_geterrnum(sys_node->ctx.u.dir)); | ||||
| 			rx = hawkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 			set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx)); | ||||
| 		} | ||||
| 		else if (y == 0)  | ||||
| @ -965,7 +947,7 @@ static int fnc_readdir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 			tmp = hawk_rtx_makestrvalwithoocstr(rtx, ent.name); | ||||
| 			if (!tmp) | ||||
| 			{ | ||||
| 				rx = awkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 				rx = hawkerr_to_rc(hawk_rtx_geterrnum(rtx)); | ||||
| 				set_errmsg_on_sys_list (rtx, sys_list, rc_to_errstr(rx)); | ||||
| 			} | ||||
| 			else | ||||
| @ -991,7 +973,7 @@ static int fnc_readdir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	hawk_rtx_setretval (rtx, hawk_rtx_makeintval(rtx, rx)); | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /* ------------------------------------------------------------------------ */ | ||||
|  | ||||
| static int fnc_fork (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| @ -1559,7 +1541,7 @@ static int fnc_mktime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		hawk_ooch_t* str, * p, * end; | ||||
| 		hawk_oow_t len; | ||||
| 		hawk_val_t* a0; | ||||
| 		hawk_btime_t bt; | ||||
| 		struct tm tm; | ||||
|  | ||||
| 		a0 = hawk_rtx_getarg(rtx, 0); | ||||
| 		str = hawk_rtx_getvaloocstr(rtx, a0, &len); | ||||
| @ -1568,54 +1550,58 @@ static int fnc_mktime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		/* the string must be of the format  YYYY MM DD HH MM SS[ DST] */ | ||||
| 		p = str; | ||||
| 		end = str + len; | ||||
| 		HAWK_MEMSET (&bt, 0, HAWK_SIZEOF(bt)); | ||||
| 		HAWK_MEMSET (&tm, 0, HAWK_SIZEOF(tm)); | ||||
|  | ||||
| 		sign = 1; | ||||
| 		if (p < end && *p == HAWK_T('-')) { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) bt.year = bt.year * 10 + (*p++ - HAWK_T('0')); | ||||
| 		bt.year *= sign; | ||||
| 		bt.year -= 1900; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == HAWK_T('\0'))) p++; | ||||
| 		if (p < end && *p == '-') { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) tm.tm_year = tm.tm_year * 10 + (*p++ - '0'); | ||||
| 		tm.tm_year *= sign; | ||||
| 		tm.tm_year -= 1900; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == '\0')) p++; | ||||
|  | ||||
| 		sign = 1; | ||||
| 		if (p < end && *p == HAWK_T('-')) { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) bt.mon = bt.mon * 10 + (*p++ - HAWK_T('0')); | ||||
| 		bt.mon *= sign; | ||||
| 		bt.mon -= 1; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == HAWK_T('\0'))) p++; | ||||
| 		if (p < end && *p == '-') { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) tm.tm_mon = tm.tm_mon * 10 + (*p++ - '0'); | ||||
| 		tm.tm_mon *= sign; | ||||
| 		tm.tm_mon -= 1; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == '\0')) p++; | ||||
|  | ||||
| 		sign = 1; | ||||
| 		if (p < end && *p == HAWK_T('-')) { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) bt.mday = bt.mday * 10 + (*p++ - HAWK_T('0')); | ||||
| 		bt.mday *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == HAWK_T('\0'))) p++; | ||||
| 		if (p < end && *p == '-') { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) tm.tm_mday = tm.tm_mday * 10 + (*p++ - '0'); | ||||
| 		tm.tm_mday *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == '\0')) p++; | ||||
|  | ||||
| 		sign = 1; | ||||
| 		if (p < end && *p == HAWK_T('-')) { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) bt.hour = bt.hour * 10 + (*p++ - HAWK_T('0')); | ||||
| 		bt.hour *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == HAWK_T('\0'))) p++; | ||||
| 		if (p < end && *p == '-') { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) tm.tm_hour = tm.tm_hour * 10 + (*p++ - '0'); | ||||
| 		tm.tm_hour *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == '\0')) p++; | ||||
|  | ||||
| 		sign = 1; | ||||
| 		if (p < end && *p == HAWK_T('-')) { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) bt.min = bt.min * 10 + (*p++ - HAWK_T('0')); | ||||
| 		bt.min *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == HAWK_T('\0'))) p++; | ||||
| 		if (p < end && *p == '-') { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) tm.tm_min = tm.tm_min * 10 + (*p++ - '0'); | ||||
| 		tm.tm_min *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == '\0')) p++; | ||||
|  | ||||
| 		sign = 1; | ||||
| 		if (p < end && *p == HAWK_T('-')) { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) bt.sec = bt.sec * 10 + (*p++ - HAWK_T('0')); | ||||
| 		bt.sec *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == HAWK_T('\0'))) p++; | ||||
| 		if (p < end && *p == '-') { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) tm.tm_sec = tm.tm_sec * 10 + (*p++ - '0'); | ||||
| 		tm.tm_sec *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == '\0')) p++; | ||||
|  | ||||
| 		sign = 1; | ||||
| 		if (p < end && *p == HAWK_T('-')) { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) bt.isdst = bt.isdst * 10 + (*p++ - HAWK_T('0')); | ||||
| 		bt.isdst *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == HAWK_T('\0'))) p++; | ||||
| 		if (p < end && *p == '-') { sign = -1; p++; } | ||||
| 		while (p < end && hawk_is_ooch_digit(*p)) tm.tm_isdst = tm.tm_isdst * 10 + (*p++ - '0'); | ||||
| 		tm.tm_isdst *= sign; | ||||
| 		while (p < end && (hawk_is_ooch_space(*p) || *p == '\0')) p++; | ||||
|  | ||||
| 		hawk_rtx_freevaloocstr (rtx, a0, str); | ||||
| 		hawk_timelocal (&bt, &nt); | ||||
| 	#if defined(HAVE_TIMELOCAL) | ||||
| 		nt.sec = timelocal(&tm); | ||||
| 	#else | ||||
| 		nt.sec = mktime(&tm); | ||||
| 	#endif | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| @ -1649,7 +1635,7 @@ static int fnc_strftime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	if (fmt)  | ||||
| 	{ | ||||
| 		hawk_ntime_t nt; | ||||
| 		hawk_btime_t bt; | ||||
| 		struct tm tm, * tmx; | ||||
| 		hawk_int_t tmpsec, flags = 0; | ||||
|  | ||||
| 		nt.nsec = 0; | ||||
| @ -1662,15 +1648,33 @@ static int fnc_strftime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 			nt.sec = tmpsec; | ||||
| 		} | ||||
|  | ||||
| 		 | ||||
| 		if (hawk_rtx_getnargs(rtx) >= 3 && (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 2), &flags) <= -1 || flags < 0)) flags = 0; | ||||
|  | ||||
| 		if (((flags & STRFTIME_UTC)? hawk_gmtime(&nt, &bt): hawk_localtime(&nt, &bt)) >= 0) | ||||
| 		if (flags & STRFTIME_UTC) | ||||
| 		{ | ||||
| 			time_t t = nt.sec; | ||||
| 		#if defined(HAVE_GMTIME_R) | ||||
| 			tmx = gmtime_r(&t, &tm); | ||||
| 		#else | ||||
| 			tmx = gmtime(&t.sec); | ||||
| 		#endif | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			time_t t = nt.sec; | ||||
| 		#if defined(HAVE_LOCALTIME_R) | ||||
| 			tmx = localtime_r(&t, &tm); | ||||
| 		#else | ||||
| 			tmx = localtime(&t.sec); | ||||
| 		#endif | ||||
| 		} | ||||
|  | ||||
| 		if (tmx) | ||||
| 		{ | ||||
| 			hawk_bch_t tmpbuf[64], * tmpptr; | ||||
| 			struct tm tm; | ||||
| 			hawk_oow_t sl; | ||||
|  | ||||
| #if 0 | ||||
| 			HAWK_MEMSET (&tm, 0, HAWK_SIZEOF(tm)); | ||||
| 			tm.tm_year = bt.year; | ||||
| 			tm.tm_mon = bt.mon; | ||||
| @ -1692,8 +1696,9 @@ static int fnc_strftime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 				tm.__tm_zone = "GMT"; | ||||
| 			#endif | ||||
| 			} | ||||
| #endif | ||||
|  | ||||
| 			sl = strftime(tmpbuf, HAWK_COUNTOF(tmpbuf), fmt, &tm); | ||||
| 			sl = strftime(tmpbuf, HAWK_COUNTOF(tmpbuf), fmt, tmx); | ||||
| 			if (sl <= 0 || sl >= HAWK_COUNTOF(tmpbuf)) | ||||
| 			{ | ||||
| 				/* buffer too small */ | ||||
| @ -1774,6 +1779,7 @@ I use 'count' to limit the maximum number of retries when 0 is returned. | ||||
| 			hawk_rtx_freemem (rtx, fmt); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -1783,7 +1789,7 @@ static int fnc_getenv (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	hawk_oow_t len; | ||||
| 	hawk_val_t* retv; | ||||
|  | ||||
| 	var = hawk_rtx_valtobcstrdup(rtx, hawk_rtx_getarg (rtx, 0), &len); | ||||
| 	var = hawk_rtx_valtobcstrdup(rtx, hawk_rtx_getarg(rtx, 0), &len); | ||||
| 	if (var) | ||||
| 	{ | ||||
| 		hawk_bch_t* val; | ||||
| @ -1805,6 +1811,8 @@ static int fnc_getenv (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| static int fnc_getnwifcfg (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| { | ||||
| #if 0 | ||||
| // TODO: put this back | ||||
| 	hawk_nwifcfg_t cfg; | ||||
| 	hawk_rtx_valtostr_out_t out; | ||||
| 	int ret = -1; | ||||
| @ -1889,6 +1897,7 @@ static int fnc_getnwifcfg (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 	/* no error check for hawk_rtx_makeintval() since ret is 0 or -1 */ | ||||
| 	hawk_rtx_setretval (rtx, hawk_rtx_makeintval (rtx, ret)); | ||||
| #endif | ||||
| 	return 0; | ||||
| } | ||||
| /* ------------------------------------------------------------ */ | ||||
| @ -1906,7 +1915,7 @@ static int fnc_system (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 	/* the target name contains a null character. | ||||
| 	 * make system return -1 */ | ||||
| 	if (hawk_strxchr (str, len, HAWK_T('\0'))) | ||||
| 	if (hawk_find_oochar(str, len, '\0')) | ||||
| 	{ | ||||
| 		n = -1; | ||||
| 		goto skip_system; | ||||
| @ -1920,7 +1929,7 @@ static int fnc_system (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 	{ | ||||
| 		hawk_bch_t* mbs; | ||||
| 		mbs = hawk_wcstombsdupwithcmgr(str, HAWK_NULL, hawk_rtx_getmmgr(rtx), hawk_rtx_getcmgr(rtx)); | ||||
| 		mbs = hawk_rtx_duputobcstr(rtx, str, HAWK_NULL); | ||||
| 		if (mbs == HAWK_NULL)  | ||||
| 		{ | ||||
| 			n = -1; | ||||
| @ -1951,13 +1960,13 @@ static int fnc_chmod (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	int n = 0; | ||||
| 	hawk_int_t mode; | ||||
|  | ||||
| 	a0 = hawk_rtx_getarg (rtx, 0); | ||||
| 	str = hawk_rtx_getvaloocstr (rtx, a0, &len); | ||||
| 	a0 = hawk_rtx_getarg(rtx, 0); | ||||
| 	str = hawk_rtx_getvaloocstr(rtx, a0, &len); | ||||
| 	if (!str) return -1; | ||||
|  | ||||
| 	/* the target name contains a null character. | ||||
| 	 * make system return -1 */ | ||||
| 	if (hawk_strxchr(str, len, HAWK_T('\0'))) | ||||
| 	if (hawk_find_oochar(str, len, '\0')) | ||||
| 	{ | ||||
| 		n = -1; | ||||
| 		goto skip_mkdir; | ||||
| @ -1970,10 +1979,9 @@ static int fnc_chmod (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| #elif defined(HAWK_OOCH_IS_BCH) | ||||
| 	n = chmod(str, mode); | ||||
| #else | ||||
|  | ||||
| 	{ | ||||
| 		hawk_bch_t* mbs; | ||||
| 		mbs = hawk_wcstombsdupwithcmgr(str, HAWK_NULL, hawk_rtx_getmmgr(rtx), hawk_rtx_getcmgr(rtx)); | ||||
| 		mbs = hawk_rtx_duputobcstr(rtx, str, HAWK_NULL); | ||||
| 		if (mbs == HAWK_NULL)  | ||||
| 		{ | ||||
| 			n = -1; | ||||
| @ -1982,7 +1990,6 @@ static int fnc_chmod (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		n = chmod(mbs, mode); | ||||
| 		hawk_rtx_freemem (rtx, mbs); | ||||
| 	} | ||||
|  | ||||
| #endif | ||||
|  | ||||
| skip_mkdir: | ||||
| @ -2003,13 +2010,13 @@ static int fnc_mkdir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	int n = 0; | ||||
| 	hawk_int_t mode; | ||||
|  | ||||
| 	a0 = hawk_rtx_getarg (rtx, 0); | ||||
| 	str = hawk_rtx_getvaloocstr (rtx, a0, &len); | ||||
| 	a0 = hawk_rtx_getarg(rtx, 0); | ||||
| 	str = hawk_rtx_getvaloocstr(rtx, a0, &len); | ||||
| 	if (!str) return -1; | ||||
|  | ||||
| 	/* the target name contains a null character. | ||||
| 	 * make system return -1 */ | ||||
| 	if (hawk_strxchr(str, len, HAWK_T('\0'))) | ||||
| 	if (hawk_find_oochar(str, len, '\0')) | ||||
| 	{ | ||||
| 		n = -1; | ||||
| 		goto skip_mkdir; | ||||
| @ -2025,7 +2032,7 @@ static int fnc_mkdir (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 	{ | ||||
| 		hawk_bch_t* mbs; | ||||
| 		mbs = hawk_wcstombsdupwithcmgr(str, HAWK_NULL, hawk_rtx_getmmgr(rtx), hawk_rtx_getcmgr(rtx)); | ||||
| 		mbs = hawk_rtx_duputobcstr(rtx, str, HAWK_NULL); | ||||
| 		if (mbs == HAWK_NULL)  | ||||
| 		{ | ||||
| 			n = -1; | ||||
| @ -2060,7 +2067,7 @@ static int fnc_unlink (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 	/* the target name contains a null character. | ||||
| 	 * make system return -1 */ | ||||
| 	if (hawk_strxchr(str, len, HAWK_T('\0'))) | ||||
| 	if (hawk_find_oochar(str, len, '\0')) | ||||
| 	{ | ||||
| 		n = -1; | ||||
| 		goto skip_unlink; | ||||
| @ -2074,7 +2081,7 @@ static int fnc_unlink (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 	{ | ||||
| 		hawk_bch_t* mbs; | ||||
| 		mbs = hawk_wcstombsdupwithcmgr(str, HAWK_NULL, hawk_rtx_getmmgr(rtx), hawk_rtx_getcmgr(rtx)); | ||||
| 		mbs = hawk_rtx_duputobcstr(rtx, str, HAWK_NULL); | ||||
| 		if (mbs == HAWK_NULL)  | ||||
| 		{ | ||||
| 			n = -1; | ||||
| @ -2098,6 +2105,7 @@ skip_unlink: | ||||
|  | ||||
| /* ------------------------------------------------------------ */ | ||||
| #if 0 | ||||
| // TODO: add back the syslog support  | ||||
| static void open_remote_log_socket (hawk_rtx_t* rtx, mod_ctx_t* mctx) | ||||
| { | ||||
| #if defined(_WIN32) | ||||
| @ -2168,19 +2176,19 @@ static int fnc_openlog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 	/* the target name contains a null character. | ||||
| 	 * make system return -1 */ | ||||
| 	if (hawk_strxchr(ident, ident_len, HAWK_T('\0'))) goto done; | ||||
| 	if (hawk_find_oochar(ident, ident_len, '\0')) goto done; | ||||
|  | ||||
| 	if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 1), &opt) <= -1) goto done; | ||||
| 	if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 2), &fac) <= -1) goto done; | ||||
|  | ||||
| 	if (hawk_strbeg(ident, HAWK_T("remote://"))) | ||||
| 	if (hawk_comp_bcstr_limited(ident, HAWK_T("remote://"), 9)) | ||||
| 	{ | ||||
| 		hawk_ooch_t* slash; | ||||
| 		/* "udp://remote-addr:remote-port/syslog-identifier" */ | ||||
|  | ||||
| 		log_type = SYSLOG_REMOTE; | ||||
| 		actual_ident = ident + 9; | ||||
| 		slash = hawk_strchr(actual_ident, HAWK_T('/')); | ||||
| 		slash = hawk_find_oochar_in_oocstr(actual_ident, '/'); | ||||
| 		if (!slash) goto done; | ||||
| 		if (hawk_strntonwad(actual_ident, slash - actual_ident, &nwad) <= -1) goto done; | ||||
| 		actual_ident = slash + 1; | ||||
| @ -2196,9 +2204,9 @@ static int fnc_openlog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	} | ||||
|  | ||||
| #if defined(HAWK_OOCH_IS_BCH) | ||||
| 	mbs_ident = hawk_becsdup(actual_ident, hawk_rtx_getmmgr(rtx)); | ||||
| 	mbs_ident = hawk_rtx_dupbcstr(rtx, actual_ident); | ||||
| #else | ||||
| 	mbs_ident = hawk_wcstombsdupwithcmgr(actual_ident, HAWK_NULL, hawk_rtx_getmmgr(rtx), hawk_rtx_getcmgr(rtx)); | ||||
| 	mbs_ident = hawk_rtx_duputobcstr(actual_ident, str, HAWK_NULL); | ||||
| #endif | ||||
| 	if (!mbs_ident) goto done; | ||||
|  | ||||
| @ -2323,7 +2331,7 @@ static int fnc_writelog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	msg = hawk_rtx_getvaloocstr(rtx, hawk_rtx_getarg(rtx, 1), &msglen); | ||||
| 	if (!msg) goto done; | ||||
|  | ||||
| 	if (hawk_strxchr(msg, msglen, HAWK_T('\0'))) goto done; | ||||
| 	if (hawk_find_oochar(msg, msglen, '\0')) goto done; | ||||
|  | ||||
| 	if (mctx->log.type == SYSLOG_LOCAL) | ||||
| 	{ | ||||
| @ -2333,7 +2341,7 @@ static int fnc_writelog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		#else | ||||
| 		{ | ||||
| 			hawk_bch_t* mbs; | ||||
| 			mbs = hawk_wcstombsdupwithcmgr(msg, HAWK_NULL, hawk_rtx_getmmgr(rtx), hawk_rtx_getcmgr(rtx)); | ||||
| 			mbs = hawk_rtx_duputobcstr(rtx, msg, HAWK_NULL); | ||||
| 			if (!mbs) goto done; | ||||
| 			syslog(pri, "%s", mbs); | ||||
| 			hawk_rtx_freemem (rtx, mbs); | ||||
| @ -2449,7 +2457,7 @@ static fnctab_t fnctab[] = | ||||
| 	{ HAWK_T("chmod"),       { { 2, 2, HAWK_NULL     }, fnc_chmod,       0  } }, | ||||
| 	{ HAWK_T("close"),       { { 1, 2, HAWK_NULL     }, fnc_close,       0  } }, | ||||
| 	{ HAWK_T("closedir"),    { { 1, 1, HAWK_NULL     }, fnc_closedir,    0  } }, | ||||
| 	{ HAWK_T("closelog"),    { { 0, 0, HAWK_NULL     }, fnc_closelog,    0  } }, | ||||
| 	//{ HAWK_T("closelog"),    { { 0, 0, HAWK_NULL     }, fnc_closelog,    0  } }, | ||||
| 	{ HAWK_T("dup"),         { { 1, 3, HAWK_NULL     }, fnc_dup,         0  } }, | ||||
| 	{ HAWK_T("errmsg"),      { { 0, 0, HAWK_NULL     }, fnc_errmsg,      0  } }, | ||||
| 	{ HAWK_T("fork"),        { { 0, 0, HAWK_NULL     }, fnc_fork,        0  } }, | ||||
| @ -2470,7 +2478,7 @@ static fnctab_t fnctab[] = | ||||
| 	{ HAWK_T("open"),        { { 2, 3, HAWK_NULL     }, fnc_open,        0  } }, | ||||
| 	{ HAWK_T("opendir"),     { { 1, 2, HAWK_NULL     }, fnc_opendir,     0  } }, | ||||
| 	{ HAWK_T("openfd"),      { { 1, 1, HAWK_NULL     }, fnc_openfd,      0  } }, | ||||
| 	{ HAWK_T("openlog"),     { { 3, 3, HAWK_NULL     }, fnc_openlog,     0  } }, | ||||
| 	//{ HAWK_T("openlog"),     { { 3, 3, HAWK_NULL     }, fnc_openlog,     0  } }, | ||||
| 	{ HAWK_T("pipe"),        { { 2, 3, HAWK_T("rrv") }, fnc_pipe,        0  } }, | ||||
| 	{ HAWK_T("read"),        { { 2, 3, HAWK_T("vrv") }, fnc_read,        0  } }, | ||||
| 	{ HAWK_T("readdir"),     { { 2, 2, HAWK_T("vr")  }, fnc_readdir,     0  } }, | ||||
| @ -2482,7 +2490,7 @@ static fnctab_t fnctab[] = | ||||
| 	{ HAWK_T("unlink"),      { { 1, 1, HAWK_NULL     }, fnc_unlink,      0  } }, | ||||
| 	{ HAWK_T("wait"),        { { 1, 3, HAWK_T("vrv") }, fnc_wait,        0  } }, | ||||
| 	{ HAWK_T("write"),       { { 2, 2, HAWK_NULL     }, fnc_write,       0  } }, | ||||
| 	{ HAWK_T("writelog"),    { { 2, 2, HAWK_NULL     }, fnc_writelog,    0  } } | ||||
| 	//{ HAWK_T("writelog"),    { { 2, 2, HAWK_NULL     }, fnc_writelog,    0  } } | ||||
| }; | ||||
|  | ||||
| #if !defined(SIGHUP) | ||||
| @ -2554,8 +2562,11 @@ static inttab_t inttab[] = | ||||
| 	{ HAWK_T("LOG_PRI_WARNING"),    { LOG_WARNING } }, | ||||
| #endif | ||||
|  | ||||
| #if 0 | ||||
| // PUT THESE BACK | ||||
| 	{ HAWK_T("NWIFCFG_IN4"), { HAWK_NWIFCFG_IN4 } }, | ||||
| 	{ HAWK_T("NWIFCFG_IN6"), { HAWK_NWIFCFG_IN6 } }, | ||||
| #endif | ||||
|  | ||||
| #if defined(O_APPEND) | ||||
| 	{ HAWK_T("O_APPEND"),    { O_APPEND } }, | ||||
|  | ||||
| @ -7036,7 +7036,7 @@ static struct | ||||
| 	{ HAWK_T("sed"),    hawk_mod_sed }, | ||||
| #endif | ||||
| 	{ HAWK_T("str"),    hawk_mod_str }, | ||||
| //	{ HAWK_T("sys"),    hawk_mod_sys }, | ||||
| 	{ HAWK_T("sys"),    hawk_mod_sys }, | ||||
| #if defined(HAWK_ENABLE_MOD_UCI) | ||||
| 	{ HAWK_T("uci"),    hawk_mod_uci } | ||||
| #endif | ||||
|  | ||||
| @ -48,10 +48,8 @@ | ||||
| #	endif | ||||
| #endif | ||||
|  | ||||
| static hawk_ooi_t pio_input ( | ||||
| 	hawk_tio_t* tio, hawk_tio_cmd_t cmd, void* buf, hawk_oow_t size); | ||||
| static hawk_ooi_t pio_output ( | ||||
| 	hawk_tio_t* tio, hawk_tio_cmd_t cmd, void* buf, hawk_oow_t size); | ||||
| static hawk_ooi_t pio_input (hawk_tio_t* tio, hawk_tio_cmd_t cmd, void* buf, hawk_oow_t size); | ||||
| static hawk_ooi_t pio_output (hawk_tio_t* tio, hawk_tio_cmd_t cmd, void* buf, hawk_oow_t size); | ||||
|  | ||||
| #include "syserr.h" | ||||
| IMPLEMENT_SYSERR_TO_ERRNUM (hawk, HAWK) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user