got mod-sys.c working partially

This commit is contained in:
hyung-hwan 2019-12-20 14:55:10 +00:00
parent baae1c4bf6
commit c23d902ad0
11 changed files with 1264 additions and 163 deletions

View File

@ -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
View File

@ -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

View File

@ -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,,[[]])

View File

@ -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

View File

@ -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
View 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;
}
}

View File

@ -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
View 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

View File

@ -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 } },

View File

@ -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

View File

@ -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)