From c23d902ad0ae2d2e2e273d241debe52f6bb7cdaa Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Fri, 20 Dec 2019 14:55:10 +0000 Subject: [PATCH] got mod-sys.c working partially --- hawk/Makefile.in | 4 +- hawk/configure | 119 +++++- hawk/configure.ac | 12 +- hawk/lib/Makefile.am | 6 +- hawk/lib/Makefile.in | 81 ++-- hawk/lib/dir.c | 844 +++++++++++++++++++++++++++++++++++++++++ hawk/lib/hawk-cfg.h.in | 33 ++ hawk/lib/hawk-dir.h | 87 +++++ hawk/lib/mod-sys.c | 233 ++++++------ hawk/lib/parse.c | 2 +- hawk/lib/pio.c | 6 +- 11 files changed, 1264 insertions(+), 163 deletions(-) create mode 100644 hawk/lib/dir.c create mode 100644 hawk/lib/hawk-dir.h diff --git a/hawk/Makefile.in b/hawk/Makefile.in index 4be8f379..6e2d3b40 100644 --- a/hawk/Makefile.in +++ b/hawk/Makefile.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) diff --git a/hawk/configure b/hawk/configure index 7f462b20..0d7fe85a 100755 --- a/hawk/configure +++ b/hawk/configure @@ -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 +" +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 +" +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 +" +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 +" +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 diff --git a/hawk/configure.ac b/hawk/configure.ac index ebc27d2e..6d821107 100644 --- a/hawk/configure.ac +++ b/hawk/configure.ac @@ -197,10 +197,10 @@ dnl [#include ]) 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 ]]) +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 ]]) +AC_CHECK_MEMBERS([struct tm.__tm_gmtoff],,,[[#include ]]) +AC_CHECK_MEMBERS([struct tm.tm_zone],,,[[#include ]]) +AC_CHECK_MEMBERS([struct tm.__tm_zone],,,[[#include ]]) + dnl check the size of primitive data types AC_CHECK_SIZEOF(char,,[[]]) diff --git a/hawk/lib/Makefile.am b/hawk/lib/Makefile.am index 52a80253..d6125669 100644 --- a/hawk/lib/Makefile.am +++ b/hawk/lib/Makefile.am @@ -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 diff --git a/hawk/lib/Makefile.in b/hawk/lib/Makefile.in index 0cfd91b9..9f118207 100644 --- a/hawk/lib/Makefile.in +++ b/hawk/lib/Makefile.in @@ -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 $@ $< &&\ diff --git a/hawk/lib/dir.c b/hawk/lib/dir.c new file mode 100644 index 00000000..e44c8e52 --- /dev/null +++ b/hawk/lib/dir.c @@ -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 +#include "hawk-prv.h" + +#if defined(_WIN32) +# include +#elif defined(__OS2__) +# define INCL_DOSFILEMGR +# define INCL_ERRORS +# include +#elif defined(__DOS__) +# include +# include +#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; + } +} diff --git a/hawk/lib/hawk-cfg.h.in b/hawk/lib/hawk-cfg.h.in index 13e99eeb..71bd5e36 100644 --- a/hawk/lib/hawk-cfg.h.in +++ b/hawk/lib/hawk-cfg.h.in @@ -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 header file. */ #undef HAVE_TIME_H diff --git a/hawk/lib/hawk-dir.h b/hawk/lib/hawk-dir.h new file mode 100644 index 00000000..e38f75a9 --- /dev/null +++ b/hawk/lib/hawk-dir.h @@ -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 + +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 diff --git a/hawk/lib/mod-sys.c b/hawk/lib/mod-sys.c index 2a9b3df6..acd22ed7 100644 --- a/hawk/lib/mod-sys.c +++ b/hawk/lib/mod-sys.c @@ -26,6 +26,7 @@ #include "mod-sys.h" #include "hawk-prv.h" +#include #if defined(_WIN32) # include @@ -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 } }, diff --git a/hawk/lib/parse.c b/hawk/lib/parse.c index 1bcd8fef..575f68e8 100644 --- a/hawk/lib/parse.c +++ b/hawk/lib/parse.c @@ -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 diff --git a/hawk/lib/pio.c b/hawk/lib/pio.c index 2cb8e4c4..82998066 100644 --- a/hawk/lib/pio.c +++ b/hawk/lib/pio.c @@ -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)