revived syslog functions in the sys module.
fixed script and stream file name handling issues. added the path field to the hawk_sio_arg_t structure. the field should be set by the I/O handler if the name field is not HAWK_NULL.
This commit is contained in:
parent
40bf6910e5
commit
d2ed09fe4d
@ -1158,10 +1158,11 @@ static HAWK_INLINE int execute_hawk (int argc, hawk_bch_t* argv[])
|
|||||||
goto oops;
|
goto oops;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*const char* ocf[] = { "/dev/stdout", "/dev/stderr", NULL };*/
|
||||||
rtx = hawk_rtx_openstdwithbcstr(
|
rtx = hawk_rtx_openstdwithbcstr(
|
||||||
awk, 0, "hawk",
|
awk, 0, "hawk",
|
||||||
(arg.call? HAWK_NULL: arg.icf.ptr), /* console input */
|
(arg.call? HAWK_NULL: arg.icf.ptr), /* console input */
|
||||||
HAWK_NULL, /* console output */
|
HAWK_NULL, /* ocf */ /* console output */
|
||||||
arg.console_cmgr
|
arg.console_cmgr
|
||||||
);
|
);
|
||||||
if (rtx == HAWK_NULL)
|
if (rtx == HAWK_NULL)
|
||||||
|
@ -85,6 +85,7 @@ libhawk_la_SOURCES = \
|
|||||||
fnc.c \
|
fnc.c \
|
||||||
htb.c \
|
htb.c \
|
||||||
gem.c \
|
gem.c \
|
||||||
|
gem-skad.c \
|
||||||
hawk-prv.h \
|
hawk-prv.h \
|
||||||
hawk.c \
|
hawk.c \
|
||||||
mb8.c \
|
mb8.c \
|
||||||
@ -119,6 +120,7 @@ libhawk_la_SOURCES = \
|
|||||||
utf8.c \
|
utf8.c \
|
||||||
utl-ass.c \
|
utl-ass.c \
|
||||||
utl-skad.c \
|
utl-skad.c \
|
||||||
|
utl-skad.h \
|
||||||
utl-sort.c \
|
utl-sort.c \
|
||||||
utl-str.c \
|
utl-str.c \
|
||||||
utl-sys.c \
|
utl-sys.c \
|
||||||
|
@ -165,16 +165,16 @@ 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-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 \
|
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 \
|
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 \
|
fmt.c fnc-prv.h fnc.c htb.c gem.c gem-skad.c hawk-prv.h hawk.c \
|
||||||
misc-prv.h misc.c parse-prv.h parse.c rbt.c rec.c rio-prv.h \
|
mb8.c misc-prv.h misc.c parse-prv.h parse.c rbt.c rec.c \
|
||||||
rio.c run-prv.h run.c tre-prv.h tre-ast.c tre-ast.h \
|
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-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-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 \
|
tre-stack.c tre-stack.h tre.c tree-prv.h tree.c utf16.c utf8.c \
|
||||||
utl-ass.c utl-skad.c utl-sort.c utl-str.c utl-sys.c utl.c \
|
utl-ass.c utl-skad.c utl-skad.h utl-sort.c utl-str.c utl-sys.c \
|
||||||
val-prv.h val.c hawk-cli.h hawk-fio.h hawk-mtx.h hawk-pio.h \
|
utl.c val-prv.h val.c hawk-cli.h hawk-fio.h hawk-mtx.h \
|
||||||
hawk-sio.h hawk-tio.h cli.c fio.c mtx.c pio.c sio.c syscall.h \
|
hawk-pio.h hawk-sio.h hawk-tio.h cli.c fio.c mtx.c pio.c sio.c \
|
||||||
syserr.h tio.c std-prv.h std.c imap-imp.h mod-math.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
|
mod-math.h mod-str.c mod-str.h mod-sys.c mod-sys.h
|
||||||
am__objects_1 =
|
am__objects_1 =
|
||||||
@ENABLE_STATIC_MODULE_TRUE@am__objects_2 = libhawk_la-mod-math.lo \
|
@ENABLE_STATIC_MODULE_TRUE@am__objects_2 = libhawk_la-mod-math.lo \
|
||||||
@ -183,10 +183,10 @@ am__objects_1 =
|
|||||||
am_libhawk_la_OBJECTS = $(am__objects_1) libhawk_la-arr.lo \
|
am_libhawk_la_OBJECTS = $(am__objects_1) libhawk_la-arr.lo \
|
||||||
libhawk_la-chr.lo libhawk_la-dir.lo libhawk_la-ecs.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-err.lo libhawk_la-fmt.lo libhawk_la-fnc.lo \
|
||||||
libhawk_la-htb.lo libhawk_la-gem.lo libhawk_la-hawk.lo \
|
libhawk_la-htb.lo libhawk_la-gem.lo libhawk_la-gem-skad.lo \
|
||||||
libhawk_la-mb8.lo libhawk_la-misc.lo libhawk_la-parse.lo \
|
libhawk_la-hawk.lo libhawk_la-mb8.lo libhawk_la-misc.lo \
|
||||||
libhawk_la-rbt.lo libhawk_la-rec.lo libhawk_la-rio.lo \
|
libhawk_la-parse.lo libhawk_la-rbt.lo libhawk_la-rec.lo \
|
||||||
libhawk_la-run.lo libhawk_la-tre-ast.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-compile.lo libhawk_la-tre-match-bt.lo \
|
||||||
libhawk_la-tre-match-pa.lo libhawk_la-tre-mem.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-parse.lo libhawk_la-tre-stack.lo \
|
||||||
@ -233,6 +233,7 @@ am__depfiles_remade = ./$(DEPDIR)/libhawk_la-arr.Plo \
|
|||||||
./$(DEPDIR)/libhawk_la-dir.Plo ./$(DEPDIR)/libhawk_la-ecs.Plo \
|
./$(DEPDIR)/libhawk_la-dir.Plo ./$(DEPDIR)/libhawk_la-ecs.Plo \
|
||||||
./$(DEPDIR)/libhawk_la-err.Plo ./$(DEPDIR)/libhawk_la-fio.Plo \
|
./$(DEPDIR)/libhawk_la-err.Plo ./$(DEPDIR)/libhawk_la-fio.Plo \
|
||||||
./$(DEPDIR)/libhawk_la-fmt.Plo ./$(DEPDIR)/libhawk_la-fnc.Plo \
|
./$(DEPDIR)/libhawk_la-fmt.Plo ./$(DEPDIR)/libhawk_la-fnc.Plo \
|
||||||
|
./$(DEPDIR)/libhawk_la-gem-skad.Plo \
|
||||||
./$(DEPDIR)/libhawk_la-gem.Plo ./$(DEPDIR)/libhawk_la-hawk.Plo \
|
./$(DEPDIR)/libhawk_la-gem.Plo ./$(DEPDIR)/libhawk_la-hawk.Plo \
|
||||||
./$(DEPDIR)/libhawk_la-htb.Plo ./$(DEPDIR)/libhawk_la-mb8.Plo \
|
./$(DEPDIR)/libhawk_la-htb.Plo ./$(DEPDIR)/libhawk_la-mb8.Plo \
|
||||||
./$(DEPDIR)/libhawk_la-misc.Plo \
|
./$(DEPDIR)/libhawk_la-misc.Plo \
|
||||||
@ -539,16 +540,16 @@ pkginclude_HEADERS = \
|
|||||||
pkglib_LTLIBRARIES = libhawk.la $(am__append_5)
|
pkglib_LTLIBRARIES = libhawk.la $(am__append_5)
|
||||||
libhawk_la_SOURCES = $(pkginclude_HEADERS) arr.c chr.c dir.c ecs-imp.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 \
|
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 \
|
gem.c gem-skad.c hawk-prv.h hawk.c mb8.c misc-prv.h misc.c \
|
||||||
parse.c rbt.c rec.c rio-prv.h rio.c run-prv.h run.c tre-prv.h \
|
parse-prv.h parse.c rbt.c rec.c rio-prv.h rio.c run-prv.h \
|
||||||
tre-ast.c tre-ast.h tre-compile.c tre-compile.h tre-match-bt.c \
|
run.c tre-prv.h tre-ast.c tre-ast.h tre-compile.c \
|
||||||
tre-match-pa.c tre-match-ut.h tre-mem.c tre-mem.h tre-parse.c \
|
tre-compile.h tre-match-bt.c tre-match-pa.c tre-match-ut.h \
|
||||||
tre-parse.h tre-stack.c tre-stack.h tre.c tree-prv.h tree.c \
|
tre-mem.c tre-mem.h tre-parse.c tre-parse.h tre-stack.c \
|
||||||
utf16.c utf8.c utl-ass.c utl-skad.c utl-sort.c utl-str.c \
|
tre-stack.h tre.c tree-prv.h tree.c utf16.c utf8.c utl-ass.c \
|
||||||
utl-sys.c utl.c val-prv.h val.c hawk-cli.h hawk-fio.h \
|
utl-skad.c utl-skad.h utl-sort.c utl-str.c utl-sys.c utl.c \
|
||||||
hawk-mtx.h hawk-pio.h hawk-sio.h hawk-tio.h cli.c fio.c mtx.c \
|
val-prv.h val.c hawk-cli.h hawk-fio.h hawk-mtx.h hawk-pio.h \
|
||||||
pio.c sio.c syscall.h syserr.h tio.c std-prv.h std.c \
|
hawk-sio.h hawk-tio.h cli.c fio.c mtx.c pio.c sio.c syscall.h \
|
||||||
$(am__append_6)
|
syserr.h tio.c std-prv.h std.c $(am__append_6)
|
||||||
libhawk_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON)
|
libhawk_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON)
|
||||||
libhawk_la_LDFLAGS = $(LDFLAGS_LIB_COMMON)
|
libhawk_la_LDFLAGS = $(LDFLAGS_LIB_COMMON)
|
||||||
libhawk_la_LIBADD = $(LIBADD_LIB_COMMON) $(am__append_7) \
|
libhawk_la_LIBADD = $(LIBADD_LIB_COMMON) $(am__append_7) \
|
||||||
@ -674,6 +675,7 @@ distclean-compile:
|
|||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-fio.Plo@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-fio.Plo@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-fmt.Plo@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-fmt.Plo@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-fnc.Plo@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-fnc.Plo@am__quote@ # am--include-marker
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-gem-skad.Plo@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-gem.Plo@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-gem.Plo@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-hawk.Plo@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-hawk.Plo@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-htb.Plo@am__quote@ # am--include-marker
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-htb.Plo@am__quote@ # am--include-marker
|
||||||
@ -806,6 +808,13 @@ libhawk_la-gem.lo: gem.c
|
|||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @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-gem.lo `test -f 'gem.c' || echo '$(srcdir)/'`gem.c
|
@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-gem.lo `test -f 'gem.c' || echo '$(srcdir)/'`gem.c
|
||||||
|
|
||||||
|
libhawk_la-gem-skad.lo: gem-skad.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-gem-skad.lo -MD -MP -MF $(DEPDIR)/libhawk_la-gem-skad.Tpo -c -o libhawk_la-gem-skad.lo `test -f 'gem-skad.c' || echo '$(srcdir)/'`gem-skad.c
|
||||||
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-gem-skad.Tpo $(DEPDIR)/libhawk_la-gem-skad.Plo
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gem-skad.c' object='libhawk_la-gem-skad.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-gem-skad.lo `test -f 'gem-skad.c' || echo '$(srcdir)/'`gem-skad.c
|
||||||
|
|
||||||
libhawk_la-hawk.lo: hawk.c
|
libhawk_la-hawk.lo: hawk.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-hawk.lo -MD -MP -MF $(DEPDIR)/libhawk_la-hawk.Tpo -c -o libhawk_la-hawk.lo `test -f 'hawk.c' || echo '$(srcdir)/'`hawk.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-hawk.lo -MD -MP -MF $(DEPDIR)/libhawk_la-hawk.Tpo -c -o libhawk_la-hawk.lo `test -f 'hawk.c' || echo '$(srcdir)/'`hawk.c
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-hawk.Tpo $(DEPDIR)/libhawk_la-hawk.Plo
|
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-hawk.Tpo $(DEPDIR)/libhawk_la-hawk.Plo
|
||||||
@ -1260,6 +1269,7 @@ distclean: distclean-am
|
|||||||
-rm -f ./$(DEPDIR)/libhawk_la-fio.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-fio.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-fmt.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-fmt.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-fnc.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-fnc.Plo
|
||||||
|
-rm -f ./$(DEPDIR)/libhawk_la-gem-skad.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-gem.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-gem.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-hawk.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-hawk.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-htb.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-htb.Plo
|
||||||
@ -1352,6 +1362,7 @@ maintainer-clean: maintainer-clean-am
|
|||||||
-rm -f ./$(DEPDIR)/libhawk_la-fio.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-fio.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-fmt.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-fmt.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-fnc.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-fnc.Plo
|
||||||
|
-rm -f ./$(DEPDIR)/libhawk_la-gem-skad.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-gem.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-gem.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-hawk.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-hawk.Plo
|
||||||
-rm -f ./$(DEPDIR)/libhawk_la-htb.Plo
|
-rm -f ./$(DEPDIR)/libhawk_la-htb.Plo
|
||||||
|
@ -588,7 +588,7 @@ static int gem_err_bchars (hawk_fmtout_t* fmtout, const hawk_bch_t* ptr, hawk_oo
|
|||||||
#else
|
#else
|
||||||
if (len > max) len = max;
|
if (len > max) len = max;
|
||||||
if (len <= 0) return 1;
|
if (len <= 0) return 1;
|
||||||
HAWK_MEMCPY (&gem->errinf.msg[gem->errmsg_len], ptr, len * HAWK_SIZEOF(*ptr));
|
HAWK_MEMCPY (&gem->errmsg[gem->errmsg_len], ptr, len * HAWK_SIZEOF(*ptr));
|
||||||
gem->errmsg_len += len;
|
gem->errmsg_len += len;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
404
hawk/lib/gem-skad.c
Normal file
404
hawk/lib/gem-skad.c
Normal file
@ -0,0 +1,404 @@
|
|||||||
|
/*
|
||||||
|
* $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-prv.h"
|
||||||
|
#include "utl-skad.h"
|
||||||
|
|
||||||
|
static int str_to_ipv4 (const hawk_ooch_t* str, hawk_oow_t len, struct in_addr* inaddr)
|
||||||
|
{
|
||||||
|
const hawk_ooch_t* end;
|
||||||
|
int dots = 0, digits = 0;
|
||||||
|
hawk_uint32_t acc = 0, addr = 0;
|
||||||
|
hawk_ooch_t c;
|
||||||
|
|
||||||
|
end = str + len;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (str >= end)
|
||||||
|
{
|
||||||
|
if (dots < 3 || digits == 0) return -1;
|
||||||
|
addr = (addr << 8) | acc;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = *str++;
|
||||||
|
|
||||||
|
if (c >= '0' && c <= '9')
|
||||||
|
{
|
||||||
|
if (digits > 0 && acc == 0) return -1;
|
||||||
|
acc = acc * 10 + (c - '0');
|
||||||
|
if (acc > 255) return -1;
|
||||||
|
digits++;
|
||||||
|
}
|
||||||
|
else if (c == '.')
|
||||||
|
{
|
||||||
|
if (dots >= 3 || digits == 0) return -1;
|
||||||
|
addr = (addr << 8) | acc;
|
||||||
|
dots++; acc = 0; digits = 0;
|
||||||
|
}
|
||||||
|
else return -1;
|
||||||
|
}
|
||||||
|
while (1);
|
||||||
|
|
||||||
|
inaddr->s_addr = hawk_hton32(addr);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
||||||
|
static int str_to_ipv6 (const hawk_ooch_t* src, hawk_oow_t len, struct in6_addr* inaddr)
|
||||||
|
{
|
||||||
|
hawk_uint8_t* tp, * endp, * colonp;
|
||||||
|
const hawk_ooch_t* curtok;
|
||||||
|
hawk_ooch_t ch;
|
||||||
|
int saw_xdigit;
|
||||||
|
unsigned int val;
|
||||||
|
const hawk_ooch_t* src_end;
|
||||||
|
|
||||||
|
src_end = src + len;
|
||||||
|
|
||||||
|
HAWK_MEMSET (inaddr, 0, HAWK_SIZEOF(*inaddr));
|
||||||
|
tp = &inaddr->s6_addr[0];
|
||||||
|
endp = &inaddr->s6_addr[HAWK_COUNTOF(inaddr->s6_addr)];
|
||||||
|
colonp = HAWK_NULL;
|
||||||
|
|
||||||
|
/* Leading :: requires some special handling. */
|
||||||
|
if (src < src_end && *src == ':')
|
||||||
|
{
|
||||||
|
src++;
|
||||||
|
if (src >= src_end || *src != ':') return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
curtok = src;
|
||||||
|
saw_xdigit = 0;
|
||||||
|
val = 0;
|
||||||
|
|
||||||
|
while (src < src_end)
|
||||||
|
{
|
||||||
|
int v1;
|
||||||
|
|
||||||
|
ch = *src++;
|
||||||
|
|
||||||
|
if (ch >= '0' && ch <= '9')
|
||||||
|
v1 = ch - '0';
|
||||||
|
else if (ch >= 'A' && ch <= 'F')
|
||||||
|
v1 = ch - 'A' + 10;
|
||||||
|
else if (ch >= 'a' && ch <= 'f')
|
||||||
|
v1 = ch - 'a' + 10;
|
||||||
|
else v1 = -1;
|
||||||
|
if (v1 >= 0)
|
||||||
|
{
|
||||||
|
val <<= 4;
|
||||||
|
val |= v1;
|
||||||
|
if (val > 0xffff) return -1;
|
||||||
|
saw_xdigit = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ch == ':')
|
||||||
|
{
|
||||||
|
curtok = src;
|
||||||
|
if (!saw_xdigit)
|
||||||
|
{
|
||||||
|
if (colonp) return -1;
|
||||||
|
colonp = tp;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (src >= src_end)
|
||||||
|
{
|
||||||
|
/* a colon can't be the last character */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*tp++ = (hawk_uint8_t)(val >> 8) & 0xff;
|
||||||
|
*tp++ = (hawk_uint8_t)val & 0xff;
|
||||||
|
saw_xdigit = 0;
|
||||||
|
val = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ch == '.' && ((tp + HAWK_SIZEOF(struct in_addr)) <= endp) &&
|
||||||
|
str_to_ipv4(curtok, src_end - curtok, (struct in_addr*)tp) == 0)
|
||||||
|
{
|
||||||
|
tp += HAWK_SIZEOF(struct in_addr*);
|
||||||
|
saw_xdigit = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (saw_xdigit)
|
||||||
|
{
|
||||||
|
if (tp + HAWK_SIZEOF(hawk_uint16_t) > endp) return -1;
|
||||||
|
*tp++ = (hawk_uint8_t)(val >> 8) & 0xff;
|
||||||
|
*tp++ = (hawk_uint8_t)val & 0xff;
|
||||||
|
}
|
||||||
|
if (colonp != HAWK_NULL)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Since some memmove()'s erroneously fail to handle
|
||||||
|
* overlapping regions, we'll do the shift by hand.
|
||||||
|
*/
|
||||||
|
hawk_oow_t n = tp - colonp;
|
||||||
|
hawk_oow_t i;
|
||||||
|
|
||||||
|
for (i = 1; i <= n; i++)
|
||||||
|
{
|
||||||
|
endp[-i] = colonp[n - i];
|
||||||
|
colonp[n - i] = 0;
|
||||||
|
}
|
||||||
|
tp = endp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tp != endp) return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int hawk_gem_oocharstoskad (hawk_gem_t* gem, const hawk_ooch_t* str, hawk_oow_t len, hawk_skad_t* _skad)
|
||||||
|
{
|
||||||
|
hawk_skad_alt_t* skad = (hawk_skad_alt_t*)_skad;
|
||||||
|
const hawk_ooch_t* p;
|
||||||
|
const hawk_ooch_t* end;
|
||||||
|
hawk_oocs_t tmp;
|
||||||
|
|
||||||
|
p = str;
|
||||||
|
end = str + len;
|
||||||
|
|
||||||
|
if (p >= end)
|
||||||
|
{
|
||||||
|
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "blank address");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
HAWK_MEMSET (skad, 0, HAWK_SIZEOF(*skad));
|
||||||
|
|
||||||
|
#if defined(AF_UNIX)
|
||||||
|
if (*p == '/' && len >= 2)
|
||||||
|
{
|
||||||
|
#if defined(HAWK_OOCH_IS_BCH)
|
||||||
|
hawk_copy_bcstr (skad->un.sun_path, HAWK_COUNTOF(skad->un.sun_path), str);
|
||||||
|
#else
|
||||||
|
hawk_oow_t dstlen;
|
||||||
|
dstlen = HAWK_COUNTOF(skad->un.sun_path) - 1;
|
||||||
|
if (hawk_gem_convutobchars(gem, p, &len, skad->un.sun_path, &dstlen) <= -1) return -1;
|
||||||
|
skad->un.sun_path[dstlen] = '\0';
|
||||||
|
#endif
|
||||||
|
skad->un.sun_family = AF_UNIX;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
||||||
|
if (*p == '[')
|
||||||
|
{
|
||||||
|
/* IPv6 address */
|
||||||
|
tmp.ptr = (hawk_ooch_t*)++p; /* skip [ and remember the position */
|
||||||
|
while (p < end && *p != '%' && *p != ']') p++;
|
||||||
|
|
||||||
|
if (p >= end) goto no_rbrack;
|
||||||
|
|
||||||
|
tmp.len = p - tmp.ptr;
|
||||||
|
if (*p == '%')
|
||||||
|
{
|
||||||
|
/* handle scope id */
|
||||||
|
hawk_uint32_t x;
|
||||||
|
|
||||||
|
p++; /* skip % */
|
||||||
|
|
||||||
|
if (p >= end)
|
||||||
|
{
|
||||||
|
/* premature end */
|
||||||
|
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "scope id blank");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*p >= '0' && *p <= '9')
|
||||||
|
{
|
||||||
|
/* numeric scope id */
|
||||||
|
skad->in6.sin6_scope_id = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
x = skad->in6.sin6_scope_id * 10 + (*p - '0');
|
||||||
|
if (x < skad->in6.sin6_scope_id)
|
||||||
|
{
|
||||||
|
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "scope id too large");
|
||||||
|
return -1; /* overflow */
|
||||||
|
}
|
||||||
|
skad->in6.sin6_scope_id = x;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
while (p < end && *p >= '0' && *p <= '9');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
TODO:
|
||||||
|
/* interface name as a scope id? */
|
||||||
|
const hawk_ooch_t* stmp = p;
|
||||||
|
unsigned int index;
|
||||||
|
do p++; while (p < end && *p != ']');
|
||||||
|
if (hawk_nwifwcsntoindex(stmp, p - stmp, &index) <= -1) return -1;
|
||||||
|
tmpad.u.in6.scope = index;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p >= end || *p != ']') goto no_rbrack;
|
||||||
|
}
|
||||||
|
p++; /* skip ] */
|
||||||
|
|
||||||
|
if (str_to_ipv6(tmp.ptr, tmp.len, &skad->in6.sin6_addr) <= -1) goto unrecog;
|
||||||
|
skad->in6.sin6_family = AF_INET6;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
/* IPv4 address */
|
||||||
|
tmp.ptr = (hawk_ooch_t*)p;
|
||||||
|
while (p < end && *p != ':') p++;
|
||||||
|
tmp.len = p - tmp.ptr;
|
||||||
|
|
||||||
|
if (str_to_ipv4(tmp.ptr, tmp.len, &skad->in4.sin_addr) <= -1)
|
||||||
|
{
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
||||||
|
/* check if it is an IPv6 address not enclosed in [].
|
||||||
|
* the port number can't be specified in this format. */
|
||||||
|
if (p >= end || *p != ':')
|
||||||
|
{
|
||||||
|
/* without :, it can't be an ipv6 address */
|
||||||
|
goto unrecog;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while (p < end && *p != '%') p++;
|
||||||
|
tmp.len = p - tmp.ptr;
|
||||||
|
|
||||||
|
if (str_to_ipv6(tmp.ptr, tmp.len, &skad->in6.sin6_addr) <= -1) goto unrecog;
|
||||||
|
|
||||||
|
if (p < end && *p == '%')
|
||||||
|
{
|
||||||
|
/* handle scope id */
|
||||||
|
hawk_uint32_t x;
|
||||||
|
|
||||||
|
p++; /* skip % */
|
||||||
|
|
||||||
|
if (p >= end)
|
||||||
|
{
|
||||||
|
/* premature end */
|
||||||
|
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "scope id blank");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*p >= '0' && *p <= '9')
|
||||||
|
{
|
||||||
|
/* numeric scope id */
|
||||||
|
skad->in6.sin6_scope_id = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
x = skad->in6.sin6_scope_id * 10 + (*p - '0');
|
||||||
|
if (x < skad->in6.sin6_scope_id)
|
||||||
|
{
|
||||||
|
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "scope id too large");
|
||||||
|
return -1; /* overflow */
|
||||||
|
}
|
||||||
|
skad->in6.sin6_scope_id = x;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
while (p < end && *p >= '0' && *p <= '9');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
TODO
|
||||||
|
/* interface name as a scope id? */
|
||||||
|
const hawk_ooch_t* stmp = p;
|
||||||
|
unsigned int index;
|
||||||
|
do p++; while (p < end);
|
||||||
|
if (hawk_nwifwcsntoindex (stmp, p - stmp, &index) <= -1) return -1;
|
||||||
|
skad->in6.sin6_scope_id = index;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p < end) goto unrecog; /* some gargage after the end? */
|
||||||
|
|
||||||
|
skad->in6.sin6_family = AF_INET6;
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
goto unrecog;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
skad->in4.sin_family = AF_INET;
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (p < end && *p == ':')
|
||||||
|
{
|
||||||
|
/* port number */
|
||||||
|
hawk_uint32_t port = 0;
|
||||||
|
|
||||||
|
p++; /* skip : */
|
||||||
|
|
||||||
|
tmp.ptr = (hawk_ooch_t*)p;
|
||||||
|
while (p < end && *p >= '0' && *p <= '9')
|
||||||
|
{
|
||||||
|
port = port * 10 + (*p - '0');
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp.len = p - tmp.ptr;
|
||||||
|
if (tmp.len <= 0 || tmp.len >= 6 ||
|
||||||
|
port > HAWK_TYPE_MAX(hawk_uint16_t))
|
||||||
|
{
|
||||||
|
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "port number blank or too large");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
||||||
|
if (skad->in4.sin_family == AF_INET)
|
||||||
|
skad->in4.sin_port = hawk_hton16(port);
|
||||||
|
else
|
||||||
|
skad->in6.sin6_port = hawk_hton16(port);
|
||||||
|
#else
|
||||||
|
skad->in4.sin_port = hawk_hton16(port);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
unrecog:
|
||||||
|
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "unrecognized address");
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
no_rbrack:
|
||||||
|
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "missing right bracket");
|
||||||
|
return -1;
|
||||||
|
}
|
@ -1313,4 +1313,34 @@ typedef enum hawk_log_mask_t hawk_log_mask_t;
|
|||||||
# error Unsupported platform
|
# error Unsupported platform
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* =========================================================================
|
||||||
|
* SOCKET ADDRESS
|
||||||
|
* ========================================================================= */
|
||||||
|
|
||||||
|
#define HAWK_SIZEOF_SKAD_T 1
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN > HAWK_SIZEOF_SKAD_T)
|
||||||
|
# undef HAWK_SIZEOF_SKAD_T
|
||||||
|
# define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_IN
|
||||||
|
#endif
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
||||||
|
# undef HAWK_SIZEOF_SKAD_T
|
||||||
|
# define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_IN6
|
||||||
|
#endif
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_LL > 0)
|
||||||
|
# undef HAWK_SIZEOF_SKAD_T
|
||||||
|
# define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_LL
|
||||||
|
#endif
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_UN > 0)
|
||||||
|
# undef HAWK_SIZEOF_SKAD_T
|
||||||
|
# define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_UN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct hawk_skad_t
|
||||||
|
{
|
||||||
|
hawk_uint8_t data[HAWK_SIZEOF_SKAD_T];
|
||||||
|
};
|
||||||
|
typedef struct hawk_skad_t hawk_skad_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -282,6 +282,13 @@ hawk_oow_t hawk_gem_fmttobcstr (
|
|||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int hawk_gem_oocharstoskad (
|
||||||
|
hawk_gem_t* gem,
|
||||||
|
const hawk_ooch_t* str,
|
||||||
|
hawk_oow_t len,
|
||||||
|
hawk_skad_t* skad
|
||||||
|
);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -183,8 +183,8 @@ HAWK_EXPORT hawk_rtx_t* hawk_rtx_openstdwithbcstr (
|
|||||||
hawk_t* awk,
|
hawk_t* awk,
|
||||||
hawk_oow_t xtnsize,
|
hawk_oow_t xtnsize,
|
||||||
const hawk_bch_t* id,
|
const hawk_bch_t* id,
|
||||||
const hawk_bch_t* icf[],
|
hawk_bch_t* icf[],
|
||||||
const hawk_bch_t* ocf[],
|
hawk_bch_t* ocf[],
|
||||||
hawk_cmgr_t* cmgr
|
hawk_cmgr_t* cmgr
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -198,8 +198,8 @@ HAWK_EXPORT hawk_rtx_t* hawk_rtx_openstdwithucstr (
|
|||||||
hawk_t* awk,
|
hawk_t* awk,
|
||||||
hawk_oow_t xtnsize,
|
hawk_oow_t xtnsize,
|
||||||
const hawk_uch_t* id,
|
const hawk_uch_t* id,
|
||||||
const hawk_uch_t* icf[],
|
hawk_uch_t* icf[],
|
||||||
const hawk_uch_t* ocf[],
|
hawk_uch_t* ocf[],
|
||||||
hawk_cmgr_t* cmgr
|
hawk_cmgr_t* cmgr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -353,34 +353,6 @@ typedef int (*hawk_sort_comperx_t) (
|
|||||||
int* cv
|
int* cv
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/* =========================================================================
|
|
||||||
* SOCKET ADDRESS
|
|
||||||
* ========================================================================= */
|
|
||||||
#define HAWK_SIZEOF_SKAD_T 1
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN > HAWK_SIZEOF_SKAD_T)
|
|
||||||
# undef HAWK_SIZEOF_SKAD_T
|
|
||||||
# define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_IN
|
|
||||||
#endif
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
|
||||||
# undef HAWK_SIZEOF_SKAD_T
|
|
||||||
# define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_IN6
|
|
||||||
#endif
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_LL > 0)
|
|
||||||
# undef HAWK_SIZEOF_SKAD_T
|
|
||||||
# define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_LL
|
|
||||||
#endif
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_UN > 0)
|
|
||||||
# undef HAWK_SIZEOF_SKAD_T
|
|
||||||
# define HAWK_SIZEOF_SKAD_T HAWK_SIZEOF_STRUCT_SOCKADDR_UN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct hawk_skad_t
|
|
||||||
{
|
|
||||||
hawk_uint8_t data[HAWK_SIZEOF_SKAD_T];
|
|
||||||
};
|
|
||||||
typedef struct hawk_skad_t hawk_skad_t;
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@ -1572,11 +1544,13 @@ HAWK_EXPORT void hawk_sub_time (
|
|||||||
/* =========================================================================
|
/* =========================================================================
|
||||||
* SOCKET ADDRESS
|
* SOCKET ADDRESS
|
||||||
* ========================================================================= */
|
* ========================================================================= */
|
||||||
HAWK_EXPORT int hawk_oochars_to_skad (
|
|
||||||
hawk_t* hawk,
|
HAWK_EXPORT int hawk_skad_family (
|
||||||
const hawk_ooch_t* str,
|
const hawk_skad_t* skad
|
||||||
hawk_oow_t len,
|
);
|
||||||
hawk_skad_t* skad
|
|
||||||
|
HAWK_EXPORT int hawk_skad_size (
|
||||||
|
const hawk_skad_t* skad
|
||||||
);
|
);
|
||||||
|
|
||||||
/* =========================================================================
|
/* =========================================================================
|
||||||
|
@ -553,9 +553,9 @@ typedef struct hawk_sio_arg_t hawk_sio_arg_t;
|
|||||||
struct hawk_sio_arg_t
|
struct hawk_sio_arg_t
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* [IN/OUT] name of I/O object.
|
* [IN] name of I/O object.
|
||||||
* It is #HAWK_NULL for the top-level stream. It points to a stream name
|
* It is #HAWK_NULL for the top-level stream. It points to a stream name
|
||||||
* for an included stream. This can be changed by an I/O handler.
|
* for an included stream.
|
||||||
*/
|
*/
|
||||||
const hawk_ooch_t* name;
|
const hawk_ooch_t* name;
|
||||||
|
|
||||||
@ -567,6 +567,12 @@ struct hawk_sio_arg_t
|
|||||||
*/
|
*/
|
||||||
void* handle;
|
void* handle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [OUT] path name resolved of the name above. the handler must set this
|
||||||
|
* to a proper path if the name is not #HAWK_NULL.
|
||||||
|
*/
|
||||||
|
hawk_ooch_t* path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [OUT] unique id set by an input handler. it is used for a single time inclusion check.
|
* [OUT] unique id set by an input handler. it is used for a single time inclusion check.
|
||||||
*/
|
*/
|
||||||
|
@ -93,7 +93,7 @@ struct mod_ctx_t
|
|||||||
{
|
{
|
||||||
syslog_type_t type;
|
syslog_type_t type;
|
||||||
char* ident;
|
char* ident;
|
||||||
// hawk_skad_t skad;
|
hawk_skad_t skad;
|
||||||
int syslog_opened; // has openlog() been called?
|
int syslog_opened; // has openlog() been called?
|
||||||
int opt;
|
int opt;
|
||||||
int fac;
|
int fac;
|
||||||
@ -2089,18 +2089,22 @@ skip_unlink:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
#if 0
|
|
||||||
// TODO: add back the syslog support
|
/*
|
||||||
|
* sys::openlog("remote://192.168.1.23:1234/test", sys::LOG_OPT_PID | sys::LOG_OPT_NDELAY, sys::LOG_FAC_LOCAL0);
|
||||||
|
* for (i = 0; i < 10; i++) sys::writelog(sys::LOG_PRI_DEBUG, "hello world " i);
|
||||||
|
* sys::closelog();
|
||||||
|
*/
|
||||||
static void open_remote_log_socket (hawk_rtx_t* rtx, mod_ctx_t* mctx)
|
static void open_remote_log_socket (hawk_rtx_t* rtx, mod_ctx_t* mctx)
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TODO: implement this */
|
/* TODO: implement this */
|
||||||
#else
|
#else
|
||||||
int sck, flags;
|
int sck, flags;
|
||||||
int domain = hawk_skadfamily(&mctx->log.skad);
|
int domain = hawk_skad_family(&mctx->log.skad);
|
||||||
int type = SOCK_DGRAM;
|
int type = SOCK_DGRAM;
|
||||||
|
|
||||||
//HAWK_ASSERT (mctx->log.sck <= -1);
|
HAWK_ASSERT (mctx->log.sck <= -1);
|
||||||
|
|
||||||
#if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC)
|
#if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC)
|
||||||
type |= SOCK_NONBLOCK;
|
type |= SOCK_NONBLOCK;
|
||||||
@ -2151,7 +2155,7 @@ static int fnc_openlog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
hawk_oow_t ident_len;
|
hawk_oow_t ident_len;
|
||||||
hawk_bch_t* mbs_ident;
|
hawk_bch_t* mbs_ident;
|
||||||
mod_ctx_t* mctx = (mod_ctx_t*)fi->mod->ctx;
|
mod_ctx_t* mctx = (mod_ctx_t*)fi->mod->ctx;
|
||||||
hawk_nwad_t nwad;
|
hawk_skad_t skad;
|
||||||
syslog_type_t log_type = SYSLOG_LOCAL;
|
syslog_type_t log_type = SYSLOG_LOCAL;
|
||||||
|
|
||||||
ident = hawk_rtx_getvaloocstr(rtx, hawk_rtx_getarg(rtx, 0), &ident_len);
|
ident = hawk_rtx_getvaloocstr(rtx, hawk_rtx_getarg(rtx, 0), &ident_len);
|
||||||
@ -2164,19 +2168,19 @@ static int fnc_openlog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 1), &opt) <= -1) 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_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 2), &fac) <= -1) goto done;
|
||||||
|
|
||||||
if (hawk_comp_oocstr_limited(ident, HAWK_T("remote://"), 9, 0))
|
if (hawk_comp_oocstr_limited(ident, HAWK_T("remote://"), 9, 0) == 0)
|
||||||
{
|
{
|
||||||
hawk_ooch_t* slash;
|
hawk_ooch_t* slash;
|
||||||
/* "udp://remote-addr:remote-port/syslog-identifier" */
|
/* "remote://remote-addr:remote-port/syslog-identifier" */
|
||||||
|
|
||||||
log_type = SYSLOG_REMOTE;
|
log_type = SYSLOG_REMOTE;
|
||||||
actual_ident = ident + 9;
|
actual_ident = ident + 9;
|
||||||
slash = hawk_find_oochar_in_oocstr(actual_ident, '/');
|
slash = hawk_find_oochar_in_oocstr(actual_ident, '/');
|
||||||
if (!slash) goto done;
|
if (!slash) goto done;
|
||||||
if (hawk_strntonwad(actual_ident, slash - actual_ident, &nwad) <= -1) goto done;
|
if (hawk_gem_oocharstoskad (hawk_rtx_getgem(rtx), actual_ident, slash - actual_ident, &skad) <= -1) goto done;
|
||||||
actual_ident = slash + 1;
|
actual_ident = slash + 1;
|
||||||
}
|
}
|
||||||
else if (hawk_comp_oocstr_limited(ident, HAWK_T("local://"), 8, 0))
|
else if (hawk_comp_oocstr_limited(ident, HAWK_T("local://"), 8, 0) == 0)
|
||||||
{
|
{
|
||||||
/* "local://syslog-identifier" */
|
/* "local://syslog-identifier" */
|
||||||
actual_ident = ident + 8;
|
actual_ident = ident + 8;
|
||||||
@ -2187,9 +2191,9 @@ static int fnc_openlog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAWK_OOCH_IS_BCH)
|
#if defined(HAWK_OOCH_IS_BCH)
|
||||||
mbs_ident = hawk_rtx_dupbcstr(rtx, actual_ident);
|
mbs_ident = hawk_rtx_dupbcstr(rtx, actual_ident, HAWK_NULL);
|
||||||
#else
|
#else
|
||||||
mbs_ident = hawk_rtx_duputobcstr(actual_ident, str, HAWK_NULL);
|
mbs_ident = hawk_rtx_duputobcstr(rtx, actual_ident, HAWK_NULL);
|
||||||
#endif
|
#endif
|
||||||
if (!mbs_ident) goto done;
|
if (!mbs_ident) goto done;
|
||||||
|
|
||||||
@ -2225,7 +2229,7 @@ static int fnc_openlog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
}
|
}
|
||||||
else if (mctx->log.type == SYSLOG_REMOTE)
|
else if (mctx->log.type == SYSLOG_REMOTE)
|
||||||
{
|
{
|
||||||
hawk_nwadtoskad (&nwad, &mctx->log.skad);
|
mctx->log.skad = skad;
|
||||||
if ((opt & LOG_NDELAY) && mctx->log.sck <= -1) open_remote_log_socket (rtx, mctx);
|
if ((opt & LOG_NDELAY) && mctx->log.sck <= -1) open_remote_log_socket (rtx, mctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2337,8 +2341,6 @@ static int fnc_writelog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
/* TODO: implement this */
|
/* TODO: implement this */
|
||||||
#else
|
#else
|
||||||
hawk_ntime_t now;
|
|
||||||
hawk_btime_t cnow;
|
|
||||||
|
|
||||||
static const hawk_bch_t* __syslog_month_names[] =
|
static const hawk_bch_t* __syslog_month_names[] =
|
||||||
{
|
{
|
||||||
@ -2350,16 +2352,28 @@ static int fnc_writelog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
|
|
||||||
if (mctx->log.sck >= 0)
|
if (mctx->log.sck >= 0)
|
||||||
{
|
{
|
||||||
if (!mctx->log.dmsgbuf) mctx->log.dmsgbuf = hawk_becs_open(hawk_rtx_getmmgr(rtx), 0, 0);
|
hawk_ntime_t now;
|
||||||
|
struct tm tm, * tmx;
|
||||||
|
time_t t;
|
||||||
|
|
||||||
|
if (!mctx->log.dmsgbuf) mctx->log.dmsgbuf = hawk_becs_open(hawk_rtx_getgem(rtx), 0, 0);
|
||||||
if (!mctx->log.dmsgbuf) goto done;
|
if (!mctx->log.dmsgbuf) goto done;
|
||||||
|
|
||||||
if (hawk_get_time(&now) || hawk_localtime(&now, &cnow) <= -1) goto done;
|
if (hawk_get_time(&now) <= -1) goto done;
|
||||||
|
|
||||||
|
t = now.sec;
|
||||||
|
#if defined(HAVE_LOCALTIME_R)
|
||||||
|
tmx = localtime_r(&t, &tm);
|
||||||
|
#else
|
||||||
|
tmx = localtime(&t);
|
||||||
|
#endif
|
||||||
|
if (!tmx) goto done;
|
||||||
|
|
||||||
if (hawk_becs_fmt(
|
if (hawk_becs_fmt(
|
||||||
mctx->log.dmsgbuf, HAWK_BT("<%d>%s %02d %02d:%02d:%02d "),
|
mctx->log.dmsgbuf, HAWK_BT("<%d>%s %02d %02d:%02d:%02d "),
|
||||||
(int)(mctx->log.fac | pri),
|
(int)(mctx->log.fac | pri),
|
||||||
__syslog_month_names[cnow.mon], cnow.mday,
|
__syslog_month_names[tmx->tm_mon], tmx->tm_mday,
|
||||||
cnow.hour, cnow.min, cnow.sec) == (hawk_oow_t)-1) goto done;
|
tmx->tm_hour, tmx->tm_min, tmx->tm_sec) == (hawk_oow_t)-1) goto done;
|
||||||
|
|
||||||
if (mctx->log.ident || (mctx->log.opt & LOG_PID))
|
if (mctx->log.ident || (mctx->log.opt & LOG_PID))
|
||||||
{
|
{
|
||||||
@ -2383,8 +2397,8 @@ static int fnc_writelog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* don't care about output failure */
|
/* don't care about output failure */
|
||||||
sendto (mctx->log.sck, HAWK_MBS_PTR(mctx->log.dmsgbuf), HAWK_MBS_LEN(mctx->log.dmsgbuf),
|
sendto (mctx->log.sck, HAWK_BECS_PTR(mctx->log.dmsgbuf), HAWK_BECS_LEN(mctx->log.dmsgbuf),
|
||||||
0, (struct sockaddr*)&mctx->log.skad, hawk_skadsize(&mctx->log.skad));
|
0, (struct sockaddr*)&mctx->log.skad, hawk_skad_size(&mctx->log.skad));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -2400,7 +2414,7 @@ done:
|
|||||||
hawk_rtx_setretval (rtx, retv);
|
hawk_rtx_setretval (rtx, retv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
typedef struct fnctab_t fnctab_t;
|
typedef struct fnctab_t fnctab_t;
|
||||||
@ -2429,7 +2443,7 @@ static fnctab_t fnctab[] =
|
|||||||
{ HAWK_T("chmod"), { { 2, 2, HAWK_NULL }, fnc_chmod, 0 } },
|
{ HAWK_T("chmod"), { { 2, 2, HAWK_NULL }, fnc_chmod, 0 } },
|
||||||
{ HAWK_T("close"), { { 1, 2, HAWK_NULL }, fnc_close, 0 } },
|
{ HAWK_T("close"), { { 1, 2, HAWK_NULL }, fnc_close, 0 } },
|
||||||
{ HAWK_T("closedir"), { { 1, 1, HAWK_NULL }, fnc_closedir, 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("dup"), { { 1, 3, HAWK_NULL }, fnc_dup, 0 } },
|
||||||
{ HAWK_T("errmsg"), { { 0, 0, HAWK_NULL }, fnc_errmsg, 0 } },
|
{ HAWK_T("errmsg"), { { 0, 0, HAWK_NULL }, fnc_errmsg, 0 } },
|
||||||
{ HAWK_T("fork"), { { 0, 0, HAWK_NULL }, fnc_fork, 0 } },
|
{ HAWK_T("fork"), { { 0, 0, HAWK_NULL }, fnc_fork, 0 } },
|
||||||
@ -2450,7 +2464,7 @@ static fnctab_t fnctab[] =
|
|||||||
{ HAWK_T("open"), { { 2, 3, HAWK_NULL }, fnc_open, 0 } },
|
{ HAWK_T("open"), { { 2, 3, HAWK_NULL }, fnc_open, 0 } },
|
||||||
{ HAWK_T("opendir"), { { 1, 2, HAWK_NULL }, fnc_opendir, 0 } },
|
{ HAWK_T("opendir"), { { 1, 2, HAWK_NULL }, fnc_opendir, 0 } },
|
||||||
{ HAWK_T("openfd"), { { 1, 1, HAWK_NULL }, fnc_openfd, 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("pipe"), { { 2, 3, HAWK_T("rrv") }, fnc_pipe, 0 } },
|
||||||
{ HAWK_T("read"), { { 2, 3, HAWK_T("vrv") }, fnc_read, 0 } },
|
{ HAWK_T("read"), { { 2, 3, HAWK_T("vrv") }, fnc_read, 0 } },
|
||||||
{ HAWK_T("readdir"), { { 2, 2, HAWK_T("vr") }, fnc_readdir, 0 } },
|
{ HAWK_T("readdir"), { { 2, 2, HAWK_T("vr") }, fnc_readdir, 0 } },
|
||||||
@ -2462,7 +2476,7 @@ static fnctab_t fnctab[] =
|
|||||||
{ HAWK_T("unlink"), { { 1, 1, HAWK_NULL }, fnc_unlink, 0 } },
|
{ HAWK_T("unlink"), { { 1, 1, HAWK_NULL }, fnc_unlink, 0 } },
|
||||||
{ HAWK_T("wait"), { { 1, 3, HAWK_T("vrv") }, fnc_wait, 0 } },
|
{ HAWK_T("wait"), { { 1, 3, HAWK_T("vrv") }, fnc_wait, 0 } },
|
||||||
{ HAWK_T("write"), { { 2, 2, HAWK_NULL }, fnc_write, 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)
|
#if !defined(SIGHUP)
|
||||||
@ -2668,11 +2682,9 @@ static int init (hawk_mod_t* mod, hawk_rtx_t* rtx)
|
|||||||
mod_ctx_t* mctx = (mod_ctx_t*)mod->ctx;
|
mod_ctx_t* mctx = (mod_ctx_t*)mod->ctx;
|
||||||
rtx_data_t data;
|
rtx_data_t data;
|
||||||
|
|
||||||
#if 0
|
|
||||||
mctx->log.type = SYSLOG_LOCAL;
|
mctx->log.type = SYSLOG_LOCAL;
|
||||||
mctx->log.syslog_opened = 0;
|
mctx->log.syslog_opened = 0;
|
||||||
mctx->log.sck = -1;
|
mctx->log.sck = -1;
|
||||||
#endif
|
|
||||||
|
|
||||||
HAWK_MEMSET (&data, 0, HAWK_SIZEOF(data));
|
HAWK_MEMSET (&data, 0, HAWK_SIZEOF(data));
|
||||||
if (hawk_rbt_insert(mctx->rtxtab, &rtx, HAWK_SIZEOF(rtx), &data, HAWK_SIZEOF(data)) == HAWK_NULL) return -1;
|
if (hawk_rbt_insert(mctx->rtxtab, &rtx, HAWK_SIZEOF(rtx), &data, HAWK_SIZEOF(data)) == HAWK_NULL) return -1;
|
||||||
@ -2717,7 +2729,6 @@ static void fini (hawk_mod_t* mod, hawk_rtx_t* rtx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#if defined(ENABLE_SYSLOG)
|
#if defined(ENABLE_SYSLOG)
|
||||||
if (mctx->log.syslog_opened)
|
if (mctx->log.syslog_opened)
|
||||||
{
|
{
|
||||||
@ -2752,7 +2763,6 @@ static void fini (hawk_mod_t* mod, hawk_rtx_t* rtx)
|
|||||||
hawk_rtx_freemem (rtx, mctx->log.ident);
|
hawk_rtx_freemem (rtx, mctx->log.ident);
|
||||||
mctx->log.ident = HAWK_NULL;
|
mctx->log.ident = HAWK_NULL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unload (hawk_mod_t* mod, hawk_t* awk)
|
static void unload (hawk_mod_t* mod, hawk_t* awk)
|
||||||
|
@ -65,35 +65,53 @@ typedef enum hawk_kwid_t hawk_kwid_t;
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int hawk_putsroocs (
|
int hawk_putsrcoocstr (
|
||||||
hawk_t* awk,
|
hawk_t* hawk,
|
||||||
const hawk_ooch_t* str
|
const hawk_ooch_t* str
|
||||||
);
|
);
|
||||||
|
|
||||||
int hawk_putsroocsn (
|
int hawk_putsrcoochars (
|
||||||
hawk_t* awk,
|
hawk_t* hawk,
|
||||||
const hawk_ooch_t* str,
|
const hawk_ooch_t* str,
|
||||||
hawk_oow_t len
|
hawk_oow_t len
|
||||||
);
|
);
|
||||||
|
|
||||||
const hawk_ooch_t* hawk_getgblname (
|
const hawk_ooch_t* hawk_getgblname (
|
||||||
hawk_t* awk,
|
hawk_t* hawk,
|
||||||
hawk_oow_t idx,
|
hawk_oow_t idx,
|
||||||
hawk_oow_t* len
|
hawk_oow_t* len
|
||||||
);
|
);
|
||||||
|
|
||||||
void hawk_getkwname (
|
void hawk_getkwname (
|
||||||
hawk_t* awk,
|
hawk_t* hawk,
|
||||||
hawk_kwid_t id,
|
hawk_kwid_t id,
|
||||||
hawk_oocs_t* s
|
hawk_oocs_t* s
|
||||||
);
|
);
|
||||||
|
|
||||||
int hawk_initgbls (
|
int hawk_initgbls (
|
||||||
hawk_t* awk
|
hawk_t* hawk
|
||||||
);
|
);
|
||||||
|
|
||||||
|
hawk_ooch_t* hawk_addsionamewithuchars (
|
||||||
|
hawk_t* hawk,
|
||||||
|
const hawk_uch_t* ptr,
|
||||||
|
hawk_oow_t len
|
||||||
|
);
|
||||||
|
|
||||||
|
hawk_ooch_t* hawk_addsionamewithbchars (
|
||||||
|
hawk_t* hawk,
|
||||||
|
const hawk_bch_t* ptr,
|
||||||
|
hawk_oow_t len
|
||||||
|
);
|
||||||
|
|
||||||
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
|
# define hawk_addsionamewithoochars hawk_addsionamewithuchars
|
||||||
|
#else
|
||||||
|
# define hawk_addsionamewithoochars hawk_addsionamewithbchars
|
||||||
|
#endif
|
||||||
|
|
||||||
void hawk_clearsionames (
|
void hawk_clearsionames (
|
||||||
hawk_t* awk
|
hawk_t* hawk
|
||||||
);
|
);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
|
151
hawk/lib/parse.c
151
hawk/lib/parse.c
@ -487,7 +487,7 @@ static int get_char (hawk_t* awk)
|
|||||||
awk->sio.inp->last.c = HAWK_OOCI_EOF;
|
awk->sio.inp->last.c = HAWK_OOCI_EOF;
|
||||||
awk->sio.inp->last.line = awk->sio.inp->line;
|
awk->sio.inp->last.line = awk->sio.inp->line;
|
||||||
awk->sio.inp->last.colm = awk->sio.inp->colm;
|
awk->sio.inp->last.colm = awk->sio.inp->colm;
|
||||||
awk->sio.inp->last.file = awk->sio.inp->name;
|
awk->sio.inp->last.file = awk->sio.inp->path;
|
||||||
awk->sio.last = awk->sio.inp->last;
|
awk->sio.last = awk->sio.inp->last;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -510,7 +510,7 @@ static int get_char (hawk_t* awk)
|
|||||||
awk->sio.inp->last.c = awk->sio.inp->b.buf[awk->sio.inp->b.pos++];
|
awk->sio.inp->last.c = awk->sio.inp->b.buf[awk->sio.inp->b.pos++];
|
||||||
awk->sio.inp->last.line = awk->sio.inp->line;
|
awk->sio.inp->last.line = awk->sio.inp->line;
|
||||||
awk->sio.inp->last.colm = awk->sio.inp->colm++;
|
awk->sio.inp->last.colm = awk->sio.inp->colm++;
|
||||||
awk->sio.inp->last.file = awk->sio.inp->name;
|
awk->sio.inp->last.file = awk->sio.inp->path;
|
||||||
awk->sio.last = awk->sio.inp->last;
|
awk->sio.last = awk->sio.inp->last;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -587,9 +587,7 @@ static int parse (hawk_t* awk)
|
|||||||
/* see parse_fncall() for what is
|
/* see parse_fncall() for what is
|
||||||
* stored into awk->tree.funs */
|
* stored into awk->tree.funs */
|
||||||
nde = (hawk_nde_t*)HAWK_HTB_VPTR(p);
|
nde = (hawk_nde_t*)HAWK_HTB_VPTR(p);
|
||||||
|
|
||||||
SETERR_ARG_LOC (awk, HAWK_EFUNNF, HAWK_HTB_KPTR(p), HAWK_HTB_KLEN(p), &nde->loc);
|
SETERR_ARG_LOC (awk, HAWK_EFUNNF, HAWK_HTB_KPTR(p), HAWK_HTB_KLEN(p), &nde->loc);
|
||||||
|
|
||||||
goto oops;
|
goto oops;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -611,9 +609,7 @@ oops:
|
|||||||
hawk_sio_arg_t* prev;
|
hawk_sio_arg_t* prev;
|
||||||
|
|
||||||
/* nothing much to do about a close error */
|
/* nothing much to do about a close error */
|
||||||
awk->sio.inf (
|
awk->sio.inf (awk, HAWK_SIO_CMD_CLOSE, awk->sio.inp, HAWK_NULL, 0);
|
||||||
awk, HAWK_SIO_CMD_CLOSE,
|
|
||||||
awk->sio.inp, HAWK_NULL, 0);
|
|
||||||
|
|
||||||
prev = awk->sio.inp->prev;
|
prev = awk->sio.inp->prev;
|
||||||
|
|
||||||
@ -651,14 +647,79 @@ oops:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hawk_clearsionames (hawk_t* awk)
|
hawk_ooch_t* hawk_addsionamewithuchars (hawk_t* hawk, const hawk_uch_t* ptr, hawk_oow_t len)
|
||||||
|
{
|
||||||
|
hawk_link_t* link;
|
||||||
|
|
||||||
|
/* TODO: duplication check? */
|
||||||
|
|
||||||
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
|
link = (hawk_link_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*link) + HAWK_SIZEOF(hawk_uch_t) * (len + 1));
|
||||||
|
if (!link) return HAWK_NULL;
|
||||||
|
|
||||||
|
hawk_copy_uchars_to_ucstr_unlimited ((hawk_uch_t*)(link + 1), ptr, len);
|
||||||
|
#else
|
||||||
|
hawk_oow_t bcslen, ucslen;
|
||||||
|
|
||||||
|
ucslen = len;
|
||||||
|
if (hawk_convutobchars(hawk, ptr, &ucslen, HAWK_NULL, &bcslen) <= -1) return HAWK_NULL;
|
||||||
|
|
||||||
|
link = (hawk_link_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*link) + HAWK_SIZEOF(hawk_bch_t) * (bcslen + 1));
|
||||||
|
if (!link) return HAWK_NULL;
|
||||||
|
|
||||||
|
ucslen = len;
|
||||||
|
bcslen = bcslen + 1;
|
||||||
|
hawk_convutobchars (hawk, ptr, &ucslen, (hawk_bch_t*)(link + 1), &bcslen);
|
||||||
|
((hawk_bch_t*)(link + 1))[bcslen] = '\0';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
link->link = hawk->sio_names;
|
||||||
|
hawk->sio_names = link;
|
||||||
|
|
||||||
|
return (hawk_ooch_t*)(link + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
hawk_ooch_t* hawk_addsionamewithbchars (hawk_t* hawk, const hawk_bch_t* ptr, hawk_oow_t len)
|
||||||
|
{
|
||||||
|
hawk_link_t* link;
|
||||||
|
|
||||||
|
/* TODO: duplication check? */
|
||||||
|
|
||||||
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
|
hawk_oow_t bcslen, ucslen;
|
||||||
|
|
||||||
|
bcslen = len;
|
||||||
|
if (hawk_convbtouchars (hawk, ptr, &bcslen, HAWK_NULL, &ucslen, 0) <= -1) return HAWK_NULL;
|
||||||
|
|
||||||
|
link = (hawk_link_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*link) + HAWK_SIZEOF(hawk_uch_t) * (ucslen + 1));
|
||||||
|
if (!link) return HAWK_NULL;
|
||||||
|
|
||||||
|
bcslen = len;
|
||||||
|
ucslen = ucslen + 1;
|
||||||
|
hawk_convbtouchars (hawk, ptr, &bcslen, (hawk_uch_t*)(link + 1), &ucslen, 0);
|
||||||
|
((hawk_uch_t*)(link + 1))[ucslen] = '\0';
|
||||||
|
|
||||||
|
#else
|
||||||
|
link = (hawk_link_t*)hawk_callocmem(hawk, HAWK_SIZEOF(*link) + HAWK_SIZEOF(hawk_bch_t) * (len + 1));
|
||||||
|
if (!link) return HAWK_NULL;
|
||||||
|
|
||||||
|
hawk_copy_bchars_to_bcstr_unlimited ((hawk_bch_t*)(link + 1), ptr, len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
link->link = hawk->sio_names;
|
||||||
|
hawk->sio_names = link;
|
||||||
|
|
||||||
|
return (hawk_ooch_t*)(link + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hawk_clearsionames (hawk_t* hawk)
|
||||||
{
|
{
|
||||||
hawk_link_t* cur;
|
hawk_link_t* cur;
|
||||||
while (awk->sio_names)
|
while (hawk->sio_names)
|
||||||
{
|
{
|
||||||
cur = awk->sio_names;
|
cur = hawk->sio_names;
|
||||||
awk->sio_names = cur->link;
|
hawk->sio_names = cur->link;
|
||||||
hawk_freemem (awk, cur);
|
hawk_freemem (hawk, cur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -688,6 +749,9 @@ int hawk_parse (hawk_t* awk, hawk_sio_cbs_t* sio)
|
|||||||
awk->sio.inf = sio->in;
|
awk->sio.inf = sio->in;
|
||||||
awk->sio.outf = sio->out;
|
awk->sio.outf = sio->out;
|
||||||
awk->sio.last.c = HAWK_OOCI_EOF;
|
awk->sio.last.c = HAWK_OOCI_EOF;
|
||||||
|
/*awk->sio.arg.name = HAWK_NULL;
|
||||||
|
awk->sio.arg.handle = HAWK_NULL;
|
||||||
|
awk->sio.arg.path = HAWK_NULL;*/
|
||||||
awk->sio.arg.line = 1;
|
awk->sio.arg.line = 1;
|
||||||
awk->sio.arg.colm = 1;
|
awk->sio.arg.colm = 1;
|
||||||
awk->sio.arg.pragma_trait = 0;
|
awk->sio.arg.pragma_trait = 0;
|
||||||
@ -775,6 +839,7 @@ static int begin_include (hawk_t* awk, int once)
|
|||||||
{
|
{
|
||||||
hawk_sio_arg_t* arg = HAWK_NULL;
|
hawk_sio_arg_t* arg = HAWK_NULL;
|
||||||
hawk_link_t* link;
|
hawk_link_t* link;
|
||||||
|
hawk_ooch_t* sio_name;
|
||||||
|
|
||||||
if (hawk_count_oocstr(HAWK_OOECS_PTR(awk->tok.name)) != HAWK_OOECS_LEN(awk->tok.name))
|
if (hawk_count_oocstr(HAWK_OOECS_PTR(awk->tok.name)) != HAWK_OOECS_LEN(awk->tok.name))
|
||||||
{
|
{
|
||||||
@ -798,27 +863,22 @@ static int begin_include (hawk_t* awk, int once)
|
|||||||
|
|
||||||
/* store the include-file name into a list
|
/* store the include-file name into a list
|
||||||
* and this list is not deleted after hawk_parse.
|
* and this list is not deleted after hawk_parse.
|
||||||
* the errinfo.loc.file can point to a include_oncestring here. */
|
* the errinfo.loc.file can point to the file name here. */
|
||||||
link = (hawk_link_t*)hawk_callocmem(awk, HAWK_SIZEOF(*link) +
|
sio_name = hawk_addsionamewithoochars(awk, HAWK_OOECS_PTR(awk->tok.name), HAWK_OOECS_LEN(awk->tok.name));
|
||||||
HAWK_SIZEOF(*arg) + HAWK_SIZEOF(hawk_ooch_t) * (HAWK_OOECS_LEN(awk->tok.name) + 1));
|
if (!sio_name)
|
||||||
if (!link)
|
|
||||||
{
|
{
|
||||||
ADJERR_LOC (awk, &awk->ptok.loc);
|
ADJERR_LOC (awk, &awk->ptok.loc);
|
||||||
goto oops;
|
goto oops;
|
||||||
}
|
}
|
||||||
|
|
||||||
hawk_copy_oochars_to_oocstr_unlimited ((hawk_ooch_t*)(link + 1), HAWK_OOECS_PTR(awk->tok.name), HAWK_OOECS_LEN(awk->tok.name));
|
arg = (hawk_sio_arg_t*)hawk_callocmem(awk, HAWK_SIZEOF(*arg));
|
||||||
link->link = awk->sio_names;
|
|
||||||
awk->sio_names = link;
|
|
||||||
|
|
||||||
arg = (hawk_sio_arg_t*)hawk_callocmem(awk, HAWK_SIZEOF(*awk));
|
|
||||||
if (!arg)
|
if (!arg)
|
||||||
{
|
{
|
||||||
ADJERR_LOC (awk, &awk->ptok.loc);
|
ADJERR_LOC (awk, &awk->ptok.loc);
|
||||||
goto oops;
|
goto oops;
|
||||||
}
|
}
|
||||||
|
|
||||||
arg->name = (const hawk_ooch_t*)(link + 1);
|
arg->name = sio_name;
|
||||||
arg->line = 1;
|
arg->line = 1;
|
||||||
arg->colm = 1;
|
arg->colm = 1;
|
||||||
|
|
||||||
@ -6227,7 +6287,7 @@ static int skip_comment (hawk_t* awk)
|
|||||||
hawk_loc_t loc;
|
hawk_loc_t loc;
|
||||||
loc.line = awk->sio.inp->line;
|
loc.line = awk->sio.inp->line;
|
||||||
loc.colm = awk->sio.inp->colm;
|
loc.colm = awk->sio.inp->colm;
|
||||||
loc.file = awk->sio.inp->name;
|
loc.file = awk->sio.inp->path;
|
||||||
SETERR_LOC (awk, HAWK_ECMTNC, &loc);
|
SETERR_LOC (awk, HAWK_ECMTNC, &loc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -6240,7 +6300,7 @@ static int skip_comment (hawk_t* awk)
|
|||||||
hawk_loc_t loc;
|
hawk_loc_t loc;
|
||||||
loc.line = awk->sio.inp->line;
|
loc.line = awk->sio.inp->line;
|
||||||
loc.colm = awk->sio.inp->colm;
|
loc.colm = awk->sio.inp->colm;
|
||||||
loc.file = awk->sio.inp->name;
|
loc.file = awk->sio.inp->path;
|
||||||
SETERR_LOC (awk, HAWK_ECMTNC, &loc);
|
SETERR_LOC (awk, HAWK_ECMTNC, &loc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -6713,9 +6773,9 @@ static int deparse (hawk_t* awk)
|
|||||||
hawk_oow_t len;
|
hawk_oow_t len;
|
||||||
|
|
||||||
len = hawk_int_to_oocstr((hawk_int_t)awk->parse.pragma.rtx_stack_limit, 10, HAWK_NULL, tmp, HAWK_COUNTOF(tmp));
|
len = hawk_int_to_oocstr((hawk_int_t)awk->parse.pragma.rtx_stack_limit, 10, HAWK_NULL, tmp, HAWK_COUNTOF(tmp));
|
||||||
if (hawk_putsroocs(awk, HAWK_T("@pragma stack_limit ")) <= -1 ||
|
if (hawk_putsrcoocstr(awk, HAWK_T("@pragma stack_limit ")) <= -1 ||
|
||||||
hawk_putsroocsn (awk, tmp, len) <= -1 ||
|
hawk_putsrcoochars (awk, tmp, len) <= -1 ||
|
||||||
hawk_putsroocs(awk, HAWK_T(";\n")) <= -1) EXIT_DEPARSE ();
|
hawk_putsrcoocstr(awk, HAWK_T(";\n")) <= -1) EXIT_DEPARSE ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (awk->tree.ngbls > awk->tree.ngbls_base)
|
if (awk->tree.ngbls > awk->tree.ngbls_base)
|
||||||
@ -6725,44 +6785,44 @@ static int deparse (hawk_t* awk)
|
|||||||
HAWK_ASSERT (awk->tree.ngbls > 0);
|
HAWK_ASSERT (awk->tree.ngbls > 0);
|
||||||
|
|
||||||
hawk_getkwname (awk, HAWK_KWID_XGLOBAL, &kw);
|
hawk_getkwname (awk, HAWK_KWID_XGLOBAL, &kw);
|
||||||
if (hawk_putsroocsn(awk, kw.ptr, kw.len) <= -1 || hawk_putsroocs (awk, HAWK_T(" ")) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoochars(awk, kw.ptr, kw.len) <= -1 || hawk_putsrcoocstr (awk, HAWK_T(" ")) <= -1) EXIT_DEPARSE ();
|
||||||
|
|
||||||
for (i = awk->tree.ngbls_base; i < awk->tree.ngbls - 1; i++)
|
for (i = awk->tree.ngbls_base; i < awk->tree.ngbls - 1; i++)
|
||||||
{
|
{
|
||||||
if (!(awk->opt.trait & HAWK_IMPLICIT))
|
if (!(awk->opt.trait & HAWK_IMPLICIT))
|
||||||
{
|
{
|
||||||
/* use the actual name if no named variable is allowed */
|
/* use the actual name if no named variable is allowed */
|
||||||
if (hawk_putsroocsn (awk, HAWK_ARR_DPTR(awk->parse.gbls, i), HAWK_ARR_DLEN(awk->parse.gbls, i)) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoochars (awk, HAWK_ARR_DPTR(awk->parse.gbls, i), HAWK_ARR_DLEN(awk->parse.gbls, i)) <= -1) EXIT_DEPARSE ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
len = hawk_int_to_oocstr((hawk_int_t)i, 10, HAWK_T("__g"), tmp, HAWK_COUNTOF(tmp));
|
len = hawk_int_to_oocstr((hawk_int_t)i, 10, HAWK_T("__g"), tmp, HAWK_COUNTOF(tmp));
|
||||||
HAWK_ASSERT (len != (hawk_oow_t)-1);
|
HAWK_ASSERT (len != (hawk_oow_t)-1);
|
||||||
if (hawk_putsroocsn (awk, tmp, len) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoochars (awk, tmp, len) <= -1) EXIT_DEPARSE ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hawk_putsroocs (awk, HAWK_T(", ")) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoocstr (awk, HAWK_T(", ")) <= -1) EXIT_DEPARSE ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(awk->opt.trait & HAWK_IMPLICIT))
|
if (!(awk->opt.trait & HAWK_IMPLICIT))
|
||||||
{
|
{
|
||||||
/* use the actual name if no named variable is allowed */
|
/* use the actual name if no named variable is allowed */
|
||||||
if (hawk_putsroocsn(awk, HAWK_ARR_DPTR(awk->parse.gbls,i), HAWK_ARR_DLEN(awk->parse.gbls,i)) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoochars(awk, HAWK_ARR_DPTR(awk->parse.gbls,i), HAWK_ARR_DLEN(awk->parse.gbls,i)) <= -1) EXIT_DEPARSE ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
len = hawk_int_to_oocstr((hawk_int_t)i, 10, HAWK_T("__g"), tmp, HAWK_COUNTOF(tmp));
|
len = hawk_int_to_oocstr((hawk_int_t)i, 10, HAWK_T("__g"), tmp, HAWK_COUNTOF(tmp));
|
||||||
HAWK_ASSERT (len != (hawk_oow_t)-1);
|
HAWK_ASSERT (len != (hawk_oow_t)-1);
|
||||||
if (hawk_putsroocsn (awk, tmp, len) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoochars (awk, tmp, len) <= -1) EXIT_DEPARSE ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (awk->opt.trait & HAWK_CRLF)
|
if (awk->opt.trait & HAWK_CRLF)
|
||||||
{
|
{
|
||||||
if (hawk_putsroocs(awk, HAWK_T(";\r\n\r\n")) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoocstr(awk, HAWK_T(";\r\n\r\n")) <= -1) EXIT_DEPARSE ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (hawk_putsroocs(awk, HAWK_T(";\n\n")) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoocstr(awk, HAWK_T(";\n\n")) <= -1) EXIT_DEPARSE ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6780,8 +6840,8 @@ static int deparse (hawk_t* awk)
|
|||||||
|
|
||||||
hawk_getkwname (awk, HAWK_KWID_BEGIN, &kw);
|
hawk_getkwname (awk, HAWK_KWID_BEGIN, &kw);
|
||||||
|
|
||||||
if (hawk_putsroocsn (awk, kw.ptr, kw.len) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoochars (awk, kw.ptr, kw.len) <= -1) EXIT_DEPARSE ();
|
||||||
if (hawk_putsroocs (awk, HAWK_T(" ")) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoocstr (awk, HAWK_T(" ")) <= -1) EXIT_DEPARSE ();
|
||||||
if (hawk_prnnde (awk, nde) <= -1) EXIT_DEPARSE ();
|
if (hawk_prnnde (awk, nde) <= -1) EXIT_DEPARSE ();
|
||||||
|
|
||||||
if (awk->opt.trait & HAWK_CRLF)
|
if (awk->opt.trait & HAWK_CRLF)
|
||||||
@ -6835,8 +6895,8 @@ static int deparse (hawk_t* awk)
|
|||||||
|
|
||||||
hawk_getkwname (awk, HAWK_KWID_END, &kw);
|
hawk_getkwname (awk, HAWK_KWID_END, &kw);
|
||||||
|
|
||||||
if (hawk_putsroocsn(awk, kw.ptr, kw.len) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoochars(awk, kw.ptr, kw.len) <= -1) EXIT_DEPARSE ();
|
||||||
if (hawk_putsroocs(awk, HAWK_T(" ")) <= -1) EXIT_DEPARSE ();
|
if (hawk_putsrcoocstr(awk, HAWK_T(" ")) <= -1) EXIT_DEPARSE ();
|
||||||
if (hawk_prnnde(awk, nde) <= -1) EXIT_DEPARSE ();
|
if (hawk_prnnde(awk, nde) <= -1) EXIT_DEPARSE ();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -6880,12 +6940,12 @@ static hawk_htb_walk_t deparse_func (hawk_htb_t* map, hawk_htb_pair_t* pair, voi
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define PUT_S(x,str) \
|
#define PUT_S(x,str) \
|
||||||
if (hawk_putsroocs(x->awk,str) <= -1) { \
|
if (hawk_putsrcoocstr(x->awk,str) <= -1) { \
|
||||||
x->ret = -1; return HAWK_HTB_WALK_STOP; \
|
x->ret = -1; return HAWK_HTB_WALK_STOP; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PUT_SX(x,str,len) \
|
#define PUT_SX(x,str,len) \
|
||||||
if (hawk_putsroocsn (x->awk, str, len) <= -1) { \
|
if (hawk_putsrcoochars (x->awk, str, len) <= -1) { \
|
||||||
x->ret = -1; return HAWK_HTB_WALK_STOP; \
|
x->ret = -1; return HAWK_HTB_WALK_STOP; \
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6963,25 +7023,24 @@ static int flush_out (hawk_t* awk)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hawk_putsroocs (hawk_t* awk, const hawk_ooch_t* str)
|
int hawk_putsrcoocstr (hawk_t* hawk, const hawk_ooch_t* str)
|
||||||
{
|
{
|
||||||
while (*str != HAWK_T('\0'))
|
while (*str != HAWK_T('\0'))
|
||||||
{
|
{
|
||||||
if (put_char (awk, *str) <= -1) return -1;
|
if (put_char(hawk, *str) <= -1) return -1;
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hawk_putsroocsn (
|
int hawk_putsrcoochars (hawk_t* hawk, const hawk_ooch_t* str, hawk_oow_t len)
|
||||||
hawk_t* awk, const hawk_ooch_t* str, hawk_oow_t len)
|
|
||||||
{
|
{
|
||||||
const hawk_ooch_t* end = str + len;
|
const hawk_ooch_t* end = str + len;
|
||||||
|
|
||||||
while (str < end)
|
while (str < end)
|
||||||
{
|
{
|
||||||
if (put_char (awk, *str) <= -1) return -1;
|
if (put_char(hawk, *str) <= -1) return -1;
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
266
hawk/lib/std.c
266
hawk/lib/std.c
@ -159,15 +159,16 @@ typedef struct rxtn_t
|
|||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
struct {
|
struct
|
||||||
const hawk_ooch_t** files;
|
{
|
||||||
|
hawk_ooch_t** files;
|
||||||
hawk_oow_t index;
|
hawk_oow_t index;
|
||||||
hawk_oow_t count;
|
hawk_oow_t count;
|
||||||
} in;
|
} in;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
const hawk_ooch_t** files;
|
hawk_ooch_t** files;
|
||||||
hawk_oow_t index;
|
hawk_oow_t index;
|
||||||
hawk_oow_t count;
|
hawk_oow_t count;
|
||||||
} out;
|
} out;
|
||||||
@ -974,28 +975,26 @@ static int open_parsestd (hawk_t* awk, hawk_sio_arg_t* arg, xtn_t* xtn, hawk_oow
|
|||||||
case HAWK_PARSESTD_FILEB:
|
case HAWK_PARSESTD_FILEB:
|
||||||
{
|
{
|
||||||
hawk_sio_t* tmp;
|
hawk_sio_t* tmp;
|
||||||
|
hawk_ooch_t* path = HAWK_NULL;
|
||||||
|
|
||||||
if (psin->u.fileb.path == HAWK_NULL || (psin->u.fileb.path[0] == '-' && psin->u.fileb.path[1] == '\0'))
|
if (psin->u.fileb.path == HAWK_NULL || (psin->u.fileb.path[0] == '-' && psin->u.fileb.path[1] == '\0'))
|
||||||
{
|
{
|
||||||
/* no path name or - -> stdin */
|
/* no path name or - -> stdin */
|
||||||
|
path = HAWK_NULL;
|
||||||
tmp = open_sio_std(awk, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
tmp = open_sio_std(awk, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if defined(HAWK_OOCH_IS_UCH)
|
path = hawk_addsionamewithbchars(awk, psin->u.fileb.path, hawk_count_bcstr(psin->u.fileb.path));
|
||||||
hawk_uch_t* upath;
|
if (!path) return -1;
|
||||||
upath = hawk_dupbtoucstr(awk, psin->u.fileb.path, HAWK_NULL, 1);
|
tmp = open_sio(awk, path, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR | HAWK_SIO_KEEPPATH);
|
||||||
if (!upath) return -1;
|
|
||||||
tmp = open_sio(awk, upath, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR | HAWK_SIO_KEEPPATH);
|
|
||||||
hawk_freemem (awk, upath);
|
|
||||||
#else
|
|
||||||
tmp = open_sio(awk, psin->u.fileb.path, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR | HAWK_SIO_KEEPPATH);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
if (tmp == HAWK_NULL) return -1;
|
if (tmp == HAWK_NULL) return -1;
|
||||||
|
|
||||||
if (index >= 1 && is_psin_file(&xtn->s.in.x[index - 1])) hawk_sio_close (arg->handle);
|
if (index >= 1 && is_psin_file(&xtn->s.in.x[index - 1])) hawk_sio_close (arg->handle);
|
||||||
|
|
||||||
arg->handle = tmp;
|
arg->handle = tmp;
|
||||||
|
arg->path = path;
|
||||||
if (psin->u.fileb.cmgr) hawk_sio_setcmgr (arg->handle, psin->u.fileb.cmgr);
|
if (psin->u.fileb.cmgr) hawk_sio_setcmgr (arg->handle, psin->u.fileb.cmgr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1008,29 +1007,26 @@ static int open_parsestd (hawk_t* awk, hawk_sio_arg_t* arg, xtn_t* xtn, hawk_oow
|
|||||||
case HAWK_PARSESTD_FILEU:
|
case HAWK_PARSESTD_FILEU:
|
||||||
{
|
{
|
||||||
hawk_sio_t* tmp;
|
hawk_sio_t* tmp;
|
||||||
|
hawk_ooch_t* path;
|
||||||
|
|
||||||
if (psin->u.fileu.path == HAWK_NULL || (psin->u.fileu.path[0] == '-' && psin->u.fileu.path[1] == '\0'))
|
if (psin->u.fileu.path == HAWK_NULL || (psin->u.fileu.path[0] == '-' && psin->u.fileu.path[1] == '\0'))
|
||||||
{
|
{
|
||||||
/* no path name or - -> stdin */
|
/* no path name or - -> stdin */
|
||||||
|
path = HAWK_NULL;
|
||||||
tmp = open_sio_std(awk, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
tmp = open_sio_std(awk, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if defined(HAWK_OOCH_IS_UCH)
|
path = hawk_addsionamewithuchars(awk, psin->u.fileu.path, hawk_count_ucstr(psin->u.fileu.path));
|
||||||
tmp = open_sio(awk, psin->u.fileu.path, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR | HAWK_SIO_KEEPPATH);
|
if (!path) return -1;
|
||||||
#else
|
tmp = open_sio(awk, path, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR | HAWK_SIO_KEEPPATH);
|
||||||
hawk_bch_t* bpath;
|
|
||||||
bpath = hawk_duputobcstr(awk, psin->u.fileu.path, HAWK_NULL);
|
|
||||||
if (!bpath) return -1;
|
|
||||||
tmp = open_sio(awk, bpath, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR | HAWK_SIO_KEEPPATH);
|
|
||||||
hawk_freemem (awk, bpath);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
if (tmp == HAWK_NULL) return -1;
|
if (tmp == HAWK_NULL) return -1;
|
||||||
|
|
||||||
if (index >= 1 && is_psin_file(&xtn->s.in.x[index - 1]))
|
if (index >= 1 && is_psin_file(&xtn->s.in.x[index - 1])) hawk_sio_close (arg->handle);
|
||||||
hawk_sio_close (arg->handle);
|
|
||||||
|
|
||||||
arg->handle = tmp;
|
arg->handle = tmp;
|
||||||
|
arg->path = path;
|
||||||
if (psin->u.fileu.cmgr) hawk_sio_setcmgr (arg->handle, psin->u.fileu.cmgr);
|
if (psin->u.fileu.cmgr) hawk_sio_setcmgr (arg->handle, psin->u.fileu.cmgr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1105,41 +1101,31 @@ static hawk_ooi_t sf_in_open (hawk_t* awk, hawk_sio_arg_t* arg, xtn_t* xtn)
|
|||||||
{
|
{
|
||||||
if (arg->prev == HAWK_NULL)
|
if (arg->prev == HAWK_NULL)
|
||||||
{
|
{
|
||||||
/* handle normal source input streams specified
|
/* handle top-level source input stream specified to hawk_parsestd() */
|
||||||
* to hawk_parsestd() */
|
|
||||||
|
|
||||||
hawk_ooi_t x;
|
hawk_ooi_t x;
|
||||||
|
|
||||||
HAWK_ASSERT (arg == &awk->sio.arg);
|
HAWK_ASSERT (arg == &awk->sio.arg);
|
||||||
|
|
||||||
x = open_parsestd(awk, arg, xtn, 0);
|
x = open_parsestd(awk, arg, xtn, 0);
|
||||||
if (x >= 0)
|
if (x >= 0) xtn->s.in.xindex = 0; /* update the current stream index */
|
||||||
{
|
|
||||||
xtn->s.in.xindex = 0; /* update the current stream index */
|
|
||||||
/* perform some manipulation about the top-level input information */
|
|
||||||
if (is_psin_file(&xtn->s.in.x[0]))
|
|
||||||
{
|
|
||||||
arg->name = hawk_sio_getpath(arg->handle);
|
|
||||||
if (arg->name == HAWK_NULL) arg->name = sio_std_names[HAWK_SIO_STDIN].ptr;
|
|
||||||
}
|
|
||||||
else arg->name = HAWK_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* handle the included source file - @include */
|
/* handle the included source file - @include */
|
||||||
|
hawk_ooch_t* xpath;
|
||||||
|
|
||||||
|
HAWK_ASSERT (arg->name != HAWK_NULL);
|
||||||
|
|
||||||
|
if (arg->prev->handle)
|
||||||
|
{
|
||||||
|
const hawk_ooch_t* outer;
|
||||||
const hawk_ooch_t* path;
|
const hawk_ooch_t* path;
|
||||||
hawk_ooch_t fbuf[64];
|
hawk_ooch_t fbuf[64];
|
||||||
hawk_ooch_t* dbuf = HAWK_NULL;
|
hawk_ooch_t* dbuf = HAWK_NULL;
|
||||||
|
|
||||||
HAWK_ASSERT (arg->name != HAWK_NULL);
|
|
||||||
|
|
||||||
path = arg->name;
|
path = arg->name;
|
||||||
if (arg->prev->handle)
|
|
||||||
{
|
|
||||||
const hawk_ooch_t* outer;
|
|
||||||
|
|
||||||
outer = hawk_sio_getpath(arg->prev->handle);
|
outer = hawk_sio_getpath(arg->prev->handle);
|
||||||
if (outer)
|
if (outer)
|
||||||
@ -1165,21 +1151,30 @@ static hawk_ooi_t sf_in_open (hawk_t* awk, hawk_sio_arg_t* arg, xtn_t* xtn)
|
|||||||
hawk_copy_oocstr_unlimited ((hawk_ooch_t*)path + tmplen, arg->name);
|
hawk_copy_oocstr_unlimited ((hawk_ooch_t*)path + tmplen, arg->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
arg->handle = hawk_sio_open(hawk_getgem(awk), 0, path, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR | HAWK_SIO_KEEPPATH);
|
|
||||||
|
|
||||||
|
xpath = hawk_addsionamewithoochars(awk, path, hawk_count_oocstr(path));
|
||||||
if (dbuf) hawk_freemem (awk, dbuf);
|
if (dbuf) hawk_freemem (awk, dbuf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xpath = hawk_addsionamewithoochars(awk, arg->name, hawk_count_oocstr(arg->name));
|
||||||
|
}
|
||||||
|
if (!xpath) goto fail;
|
||||||
|
|
||||||
|
arg->handle = hawk_sio_open(hawk_getgem(awk), 0, xpath, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR | HAWK_SIO_KEEPPATH);
|
||||||
if (!arg->handle)
|
if (!arg->handle)
|
||||||
{
|
{
|
||||||
const hawk_ooch_t* bem = hawk_backuperrmsg(awk);
|
const hawk_ooch_t* bem;
|
||||||
|
fail:
|
||||||
|
bem = hawk_backuperrmsg(awk);
|
||||||
hawk_seterrbfmt (awk, HAWK_NULL, HAWK_EOPEN, "unable to open %js - %js", arg->name, bem);
|
hawk_seterrbfmt (awk, HAWK_NULL, HAWK_EOPEN, "unable to open %js - %js", arg->name, bem);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arg->path = xpath;
|
||||||
/* TODO: use the system handle(file descriptor) instead of the path? */
|
/* TODO: use the system handle(file descriptor) instead of the path? */
|
||||||
/*syshnd = hawk_sio_gethnd(arg->handle);*/
|
/*syshnd = hawk_sio_gethnd(arg->handle);*/
|
||||||
fill_sio_arg_unique_id(awk, arg, path); /* ignore failure */
|
fill_sio_arg_unique_id(awk, arg, xpath); /* ignore failure */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1342,18 +1337,6 @@ static hawk_ooi_t sf_in_read (hawk_t* awk, hawk_sio_arg_t* arg, hawk_ooch_t* dat
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
xtn->s.in.xindex = next; /* update the next to the current */
|
xtn->s.in.xindex = next; /* update the next to the current */
|
||||||
|
|
||||||
/* update the I/O object name */
|
|
||||||
if (is_psin_file(&xtn->s.in.x[next]))
|
|
||||||
{
|
|
||||||
arg->name = hawk_sio_getpath(arg->handle);
|
|
||||||
if (arg->name == HAWK_NULL) arg->name = sio_std_names[HAWK_SIO_STDIN].ptr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
arg->name = HAWK_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
arg->line = 0; /* reset the line number */
|
arg->line = 0; /* reset the line number */
|
||||||
arg->colm = 0;
|
arg->colm = 0;
|
||||||
goto again;
|
goto again;
|
||||||
@ -2199,8 +2182,7 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
|
|||||||
|
|
||||||
if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr);
|
if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr);
|
||||||
|
|
||||||
if (hawk_rtx_setofilename (
|
if (hawk_rtx_setofilename(rtx, file, hawk_count_oocstr(file)) <= -1)
|
||||||
rtx, file, hawk_count_oocstr(file)) <= -1)
|
|
||||||
{
|
{
|
||||||
hawk_sio_close (sio);
|
hawk_sio_close (sio);
|
||||||
return -1;
|
return -1;
|
||||||
@ -2290,6 +2272,26 @@ static void fini_rxtn (hawk_rtx_t* rtx)
|
|||||||
rxtn_t* rxtn = GET_RXTN(rtx);
|
rxtn_t* rxtn = GET_RXTN(rtx);
|
||||||
/*xtn_t* xtn = (xtn_t*)GET_XTN(rtx->awk);*/
|
/*xtn_t* xtn = (xtn_t*)GET_XTN(rtx->awk);*/
|
||||||
|
|
||||||
|
if (rxtn->c.in.files)
|
||||||
|
{
|
||||||
|
hawk_oow_t i;
|
||||||
|
for (i = 0; rxtn->c.in.files[i]; i++) hawk_rtx_freemem(rtx, rxtn->c.in.files[i]);
|
||||||
|
hawk_rtx_freemem (rtx, rxtn->c.in.files);
|
||||||
|
rxtn->c.in.files = HAWK_NULL;
|
||||||
|
rxtn->c.in.count = 0;
|
||||||
|
rxtn->c.in.index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rxtn->c.out.files)
|
||||||
|
{
|
||||||
|
hawk_oow_t i;
|
||||||
|
for (i = 0; rxtn->c.out.files[i]; i++) hawk_rtx_freemem(rtx, rxtn->c.out.files[i]);
|
||||||
|
hawk_rtx_freemem (rtx, rxtn->c.out.files);
|
||||||
|
rxtn->c.out.files = HAWK_NULL;
|
||||||
|
rxtn->c.out.count = 0;
|
||||||
|
rxtn->c.out.index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (rxtn->cmgrtab_inited)
|
if (rxtn->cmgrtab_inited)
|
||||||
{
|
{
|
||||||
hawk_htb_fini (&rxtn->cmgrtab);
|
hawk_htb_fini (&rxtn->cmgrtab);
|
||||||
@ -2297,11 +2299,9 @@ static void fini_rxtn (hawk_rtx_t* rtx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int build_argcv (
|
static int build_argcv (hawk_rtx_t* rtx, int argc_id, int argv_id, const hawk_ooch_t* id, hawk_ooch_t* icf[])
|
||||||
hawk_rtx_t* rtx, int argc_id, int argv_id,
|
|
||||||
const hawk_ooch_t* id, const hawk_ooch_t*const icf[])
|
|
||||||
{
|
{
|
||||||
const hawk_ooch_t*const* p;
|
hawk_ooch_t** p;
|
||||||
hawk_oow_t argc;
|
hawk_oow_t argc;
|
||||||
hawk_val_t* v_argc;
|
hawk_val_t* v_argc;
|
||||||
hawk_val_t* v_argv;
|
hawk_val_t* v_argv;
|
||||||
@ -2531,7 +2531,7 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int make_additional_globals (hawk_rtx_t* rtx, xtn_t* xtn, const hawk_ooch_t* id, const hawk_ooch_t*const icf[])
|
static int make_additional_globals (hawk_rtx_t* rtx, xtn_t* xtn, const hawk_ooch_t* id, hawk_ooch_t* icf[])
|
||||||
{
|
{
|
||||||
if (build_argcv(rtx, xtn->gbl_argc, xtn->gbl_argv, id, icf) <= -1 ||
|
if (build_argcv(rtx, xtn->gbl_argc, xtn->gbl_argv, id, icf) <= -1 ||
|
||||||
build_environ(rtx, xtn->gbl_environ, environ) <= -1) return -1;
|
build_environ(rtx, xtn->gbl_environ, environ) <= -1) return -1;
|
||||||
@ -2542,8 +2542,8 @@ static hawk_rtx_t* open_rtx_std (
|
|||||||
hawk_t* awk,
|
hawk_t* awk,
|
||||||
hawk_oow_t xtnsize,
|
hawk_oow_t xtnsize,
|
||||||
const hawk_ooch_t* id,
|
const hawk_ooch_t* id,
|
||||||
const hawk_ooch_t* icf[],
|
hawk_ooch_t* icf[],
|
||||||
const hawk_ooch_t* ocf[],
|
hawk_ooch_t* ocf[],
|
||||||
hawk_cmgr_t* cmgr)
|
hawk_cmgr_t* cmgr)
|
||||||
{
|
{
|
||||||
hawk_rtx_t* rtx;
|
hawk_rtx_t* rtx;
|
||||||
@ -2622,140 +2622,162 @@ hawk_rtx_t* hawk_rtx_openstdwithbcstr (
|
|||||||
hawk_t* awk,
|
hawk_t* awk,
|
||||||
hawk_oow_t xtnsize,
|
hawk_oow_t xtnsize,
|
||||||
const hawk_bch_t* id,
|
const hawk_bch_t* id,
|
||||||
const hawk_bch_t* icf[],
|
hawk_bch_t* icf[],
|
||||||
const hawk_bch_t* ocf[],
|
hawk_bch_t* ocf[],
|
||||||
hawk_cmgr_t* cmgr)
|
hawk_cmgr_t* cmgr)
|
||||||
{
|
{
|
||||||
#if defined(HAWK_OOCH_IS_BCH)
|
|
||||||
return open_rtx_std(awk, xtnsize, id, icf, ocf, cmgr);
|
|
||||||
#else
|
|
||||||
hawk_rtx_t* rtx = HAWK_NULL;
|
hawk_rtx_t* rtx = HAWK_NULL;
|
||||||
hawk_oow_t wcslen, i;
|
hawk_oow_t wcslen, i;
|
||||||
hawk_uch_t* wid = HAWK_NULL, ** wicf = HAWK_NULL, ** wocf = HAWK_NULL;
|
hawk_ooch_t* xid, ** xicf = HAWK_NULL, ** xocf = HAWK_NULL;
|
||||||
|
|
||||||
wid = hawk_dupbtoucstr(awk, id, &wcslen, 0);
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
if (!wid) return HAWK_NULL;
|
xid = hawk_dupbtoucstr(awk, id, &wcslen, 0);
|
||||||
|
if (!xid) return HAWK_NULL;
|
||||||
|
#else
|
||||||
|
xid = (hawk_ooch_t*)id;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (icf)
|
if (icf)
|
||||||
{
|
{
|
||||||
for (i = 0; icf[i]; i++) ;
|
for (i = 0; icf[i]; i++) ;
|
||||||
|
|
||||||
wicf = (hawk_uch_t**)hawk_callocmem(awk, HAWK_SIZEOF(*wicf) * (i + 1));
|
xicf = (hawk_ooch_t**)hawk_callocmem(awk, HAWK_SIZEOF(*xicf) * (i + 1));
|
||||||
if (!wicf) goto done;
|
if (!xicf) goto done;
|
||||||
|
|
||||||
for (i = 0; icf[i]; i++)
|
for (i = 0; icf[i]; i++)
|
||||||
{
|
{
|
||||||
wicf[i] = hawk_dupbtoucstr(awk, icf[i], &wcslen, 0);
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
if (!wicf[i]) goto done;
|
xicf[i] = hawk_dupbtoucstr(awk, icf[i], &wcslen, 0);
|
||||||
|
#else
|
||||||
|
xicf[i] = hawk_dupbcstr(awk, icf[i], HAWK_NULL);
|
||||||
|
#endif
|
||||||
|
if (!xicf[i]) goto done;
|
||||||
}
|
}
|
||||||
wicf[i] = HAWK_NULL;
|
xicf[i] = HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ocf)
|
if (ocf)
|
||||||
{
|
{
|
||||||
for (i = 0; ocf[i]; i++) ;
|
for (i = 0; ocf[i]; i++) ;
|
||||||
|
|
||||||
wocf = (hawk_uch_t**)hawk_callocmem(awk, HAWK_SIZEOF(*wocf) * (i + 1));
|
xocf = (hawk_ooch_t**)hawk_callocmem(awk, HAWK_SIZEOF(*xocf) * (i + 1));
|
||||||
if (!wocf) goto done;
|
if (!xocf) goto done;
|
||||||
|
|
||||||
for (i = 0; ocf[i]; i++)
|
for (i = 0; ocf[i]; i++)
|
||||||
{
|
{
|
||||||
wocf[i] = hawk_dupbtoucstr(awk, ocf[i], &wcslen, 0);
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
if (!wocf[i]) goto done;
|
xocf[i] = hawk_dupbtoucstr(awk, ocf[i], &wcslen, 0);
|
||||||
|
#else
|
||||||
|
xocf[i] = hawk_dupucstr(awk, ocf[i], HAWK_NULL);
|
||||||
|
#endif
|
||||||
|
if (!xocf[i]) goto done;
|
||||||
}
|
}
|
||||||
wocf[i] = HAWK_NULL;
|
xocf[i] = HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtx = open_rtx_std(awk, xtnsize, wid, (const hawk_uch_t**)wicf, (const hawk_uch_t**)wocf, cmgr);
|
rtx = open_rtx_std(awk, xtnsize, xid, xicf, xocf, cmgr);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (!rtx)
|
if (!rtx)
|
||||||
{
|
{
|
||||||
if (wocf)
|
if (xocf)
|
||||||
{
|
{
|
||||||
for (i = 0; wocf[i]; i++) hawk_freemem (awk, wocf[i]);
|
for (i = 0; xocf[i]; i++) hawk_freemem (awk, xocf[i]);
|
||||||
hawk_freemem (awk, wocf);
|
hawk_freemem (awk, xocf);
|
||||||
}
|
}
|
||||||
if (wicf)
|
if (xicf)
|
||||||
{
|
{
|
||||||
for (i = 0; wicf[i]; i++) hawk_freemem (awk, wicf[i]);
|
for (i = 0; xicf[i]; i++) hawk_freemem (awk, xicf[i]);
|
||||||
hawk_freemem (awk, wicf);
|
hawk_freemem (awk, xicf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (wid) hawk_freemem (awk, wid);
|
|
||||||
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
|
hawk_freemem (awk, xid);
|
||||||
|
#endif
|
||||||
|
|
||||||
return rtx;
|
return rtx;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hawk_rtx_t* hawk_rtx_openstdwithucstr (
|
hawk_rtx_t* hawk_rtx_openstdwithucstr (
|
||||||
hawk_t* awk,
|
hawk_t* awk,
|
||||||
hawk_oow_t xtnsize,
|
hawk_oow_t xtnsize,
|
||||||
const hawk_uch_t* id,
|
const hawk_uch_t* id,
|
||||||
const hawk_uch_t* icf[],
|
hawk_uch_t* icf[],
|
||||||
const hawk_uch_t* ocf[],
|
hawk_uch_t* ocf[],
|
||||||
hawk_cmgr_t* cmgr)
|
hawk_cmgr_t* cmgr)
|
||||||
{
|
{
|
||||||
#if defined(HAWK_OOCH_IS_BCH)
|
|
||||||
hawk_rtx_t* rtx = HAWK_NULL;
|
hawk_rtx_t* rtx = HAWK_NULL;
|
||||||
hawk_oow_t mbslen, i;
|
hawk_oow_t mbslen, i;
|
||||||
hawk_bch_t* mid = HAWK_NULL, ** micf = HAWK_NULL, ** mocf = HAWK_NULL;
|
hawk_ooch_t* xid, ** xicf = HAWK_NULL, ** xocf = HAWK_NULL;
|
||||||
|
|
||||||
mid = hawk_duputobcstr(awk, id, &mbslen);
|
#if defined(HAWK_OOCH_IS_BCH)
|
||||||
if (!mid) return HAWK_NULL;
|
xid = hawk_duputobcstr(awk, id, &mbslen);
|
||||||
|
if (!xid) return HAWK_NULL;
|
||||||
|
#else
|
||||||
|
xid = (hawk_ooch_t*)id;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (icf)
|
if (icf)
|
||||||
{
|
{
|
||||||
for (i = 0; icf[i]; i++) ;
|
for (i = 0; icf[i]; i++) ;
|
||||||
|
|
||||||
micf = (hawk_bch_t**)hawk_callocmem(awk, HAWK_SIZEOF(*micf) * (i + 1));
|
xicf = (hawk_ooch_t**)hawk_callocmem(awk, HAWK_SIZEOF(*xicf) * (i + 1));
|
||||||
if (!micf) goto done;
|
if (!xicf) goto done;
|
||||||
|
|
||||||
for (i = 0; icf[i]; i++)
|
for (i = 0; icf[i]; i++)
|
||||||
{
|
{
|
||||||
micf[i] = hawk_duputobcstr(awk, icf[i], &mbslen);
|
#if defined(HAWK_OOCH_IS_BCH)
|
||||||
if (!micf[i]) goto done;
|
xicf[i] = hawk_duputobcstr(awk, icf[i], &mbslen);
|
||||||
|
#else
|
||||||
|
xicf[i] = hawk_dupucstr(awk, icf[i], HAWK_NULL);
|
||||||
|
#endif
|
||||||
|
if (!xicf[i]) goto done;
|
||||||
}
|
}
|
||||||
micf[i] = HAWK_NULL;
|
xicf[i] = HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ocf)
|
if (ocf)
|
||||||
{
|
{
|
||||||
for (i = 0; ocf[i]; i++) ;
|
for (i = 0; ocf[i]; i++) ;
|
||||||
|
|
||||||
mocf = (hawk_uch_t**)hawk_callocmem(awk, HAWK_SIZEOF(*mocf) * (i + 1));
|
xocf = (hawk_ooch_t**)hawk_callocmem(awk, HAWK_SIZEOF(*xocf) * (i + 1));
|
||||||
if (!mocf) goto done;
|
if (!xocf) goto done;
|
||||||
|
|
||||||
for (i = 0; ocf[i]; i++)
|
for (i = 0; ocf[i]; i++)
|
||||||
{
|
{
|
||||||
mocf[i] = hawk_dupbtoucstr(awk, ocf[i], &mbslen, 0);
|
#if defined(HAWK_OOCH_IS_BCH)
|
||||||
if (!mocf[i]) goto done;
|
xocf[i] = hawk_dupbtoucstr(awk, ocf[i], &mbslen, 0);
|
||||||
|
#else
|
||||||
|
xocf[i] = hawk_dupucstr(awk, ocf[i], HAWK_NULL);
|
||||||
|
#endif
|
||||||
|
if (!xocf[i]) goto done;
|
||||||
}
|
}
|
||||||
mocf[i] = HAWK_NULL;
|
xocf[i] = HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtx = open_rtx_std(awk, xtnsize, mid, (const hawk_bch_t**)micf, (const hawk_bch_t**)mocf, cmgr);
|
rtx = open_rtx_std(awk, xtnsize, xid, xicf, xocf, cmgr);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (!rtx)
|
if (!rtx)
|
||||||
{
|
{
|
||||||
if (mocf)
|
if (xocf)
|
||||||
{
|
{
|
||||||
for (i = 0; mocf[i]; i++) hawk_freemem (awk, mocf[i]);
|
for (i = 0; xocf[i]; i++) hawk_freemem (awk, xocf[i]);
|
||||||
hawk_freemem (awk, mocf);
|
hawk_freemem (awk, xocf);
|
||||||
}
|
}
|
||||||
if (micf)
|
if (xicf)
|
||||||
{
|
{
|
||||||
for (i = 0; micf[i]; i++) hawk_freemem (awk, micf[i]);
|
for (i = 0; xicf[i]; i++) hawk_freemem (awk, xicf[i]);
|
||||||
hawk_freemem (awk, micf);
|
hawk_freemem (awk, xicf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mid) hawk_freemem (awk, mid);
|
|
||||||
|
#if defined(HAWK_OOCH_IS_BCH)
|
||||||
|
hawk_freemem (awk, xid);
|
||||||
|
#endif
|
||||||
|
|
||||||
return rtx;
|
return rtx;
|
||||||
#else
|
|
||||||
return open_rtx_std(awk, xtnsize, id, icf, ocf, cmgr);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int timeout_code (const hawk_ooch_t* name)
|
static int timeout_code (const hawk_ooch_t* name)
|
||||||
|
@ -114,7 +114,7 @@ static const hawk_ooch_t* print_outop_str[] =
|
|||||||
HAWK_T("")
|
HAWK_T("")
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PUT_SRCSTR(awk,str) do { if (hawk_putsroocs (awk, str) == -1) return -1; } while(0)
|
#define PUT_SRCSTR(awk,str) do { if (hawk_putsrcoocstr (awk, str) == -1) return -1; } while(0)
|
||||||
|
|
||||||
#define PUT_NL(awk) do { \
|
#define PUT_NL(awk) do { \
|
||||||
if (awk->opt.trait & HAWK_CRLF) PUT_SRCSTR (awk, HAWK_T("\r")); \
|
if (awk->opt.trait & HAWK_CRLF) PUT_SRCSTR (awk, HAWK_T("\r")); \
|
||||||
@ -122,7 +122,7 @@ static const hawk_ooch_t* print_outop_str[] =
|
|||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define PUT_SRCSTRN(awk,str,len) do { \
|
#define PUT_SRCSTRN(awk,str,len) do { \
|
||||||
if (hawk_putsroocsn (awk, str, len) == -1) return -1; \
|
if (hawk_putsrcoochars (awk, str, len) == -1) return -1; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define PRINT_TABS(awk,depth) do { \
|
#define PRINT_TABS(awk,depth) do { \
|
||||||
|
@ -25,413 +25,35 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <hawk-utl.h>
|
#include <hawk-utl.h>
|
||||||
#include "hawk-prv.h"
|
#include "utl-skad.h"
|
||||||
|
|
||||||
#include <sys/types.h>
|
int hawk_skad_family (const hawk_skad_t* _skad)
|
||||||
#include <sys/socket.h>
|
{
|
||||||
#if defined(HAVE_NETINET_IN_H)
|
const hawk_skad_alt_t* skad = (const hawk_skad_alt_t*)_skad;
|
||||||
# include <netinet/in.h>
|
HAWK_ASSERT (HAWK_SIZEOF(*_skad) >= HAWK_SIZEOF(*skad));
|
||||||
|
return skad->sa.sa_family;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hawk_skad_size (const hawk_skad_t* _skad)
|
||||||
|
{
|
||||||
|
const hawk_skad_alt_t* skad = (const hawk_skad_alt_t*)_skad;
|
||||||
|
HAWK_ASSERT (HAWK_SIZEOF(*_skad) >= HAWK_SIZEOF(*skad));
|
||||||
|
|
||||||
|
switch (skad->sa.sa_family)
|
||||||
|
{
|
||||||
|
#if defined(AF_INET) && (HAWK_SIZEOF_STRUCT_SOCKADDR_IN > 0)
|
||||||
|
case AF_INET: return HAWK_SIZEOF(struct sockaddr_in);
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_SYS_UN_H)
|
#if defined(AF_INET6) && (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
||||||
# include <sys/un.h>
|
case AF_INET6: return HAWK_SIZEOF(struct sockaddr_in6);
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_NETPACKET_PACKET_H)
|
#if defined(AF_PACKET) && (HAWK_SIZEOF_STRUCT_SOCKADDR_LL > 0)
|
||||||
# include <netpacket/packet.h>
|
case AF_PACKET: return HAWK_SIZEOF(struct sockaddr_ll);
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_NET_IF_DL_H)
|
#if defined(AF_UNIX) && (HAWK_SIZEOF_STRUCT_SOCKADDR_UN > 0)
|
||||||
# include <net/if_dl.h>
|
case AF_UNIX: return HAWK_SIZEOF(struct sockaddr_un);
|
||||||
#endif
|
|
||||||
|
|
||||||
union hawk_skad_alt_t
|
|
||||||
{
|
|
||||||
struct sockaddr sa;
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN > 0)
|
|
||||||
struct sockaddr_in in4;
|
|
||||||
#endif
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
|
||||||
struct sockaddr_in6 in6;
|
|
||||||
#endif
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_LL > 0)
|
|
||||||
struct sockaddr_ll ll;
|
|
||||||
#endif
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_UN > 0)
|
|
||||||
struct sockaddr_un un;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
typedef union hawk_skad_alt_t hawk_skad_alt_t;
|
|
||||||
|
|
||||||
static int str_to_ipv4 (const hawk_ooch_t* str, hawk_oow_t len, struct in_addr* inaddr)
|
|
||||||
{
|
|
||||||
const hawk_ooch_t* end;
|
|
||||||
int dots = 0, digits = 0;
|
|
||||||
hawk_uint32_t acc = 0, addr = 0;
|
|
||||||
hawk_ooch_t c;
|
|
||||||
|
|
||||||
end = str + len;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (str >= end)
|
|
||||||
{
|
|
||||||
if (dots < 3 || digits == 0) return -1;
|
|
||||||
addr = (addr << 8) | acc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
c = *str++;
|
|
||||||
|
|
||||||
if (c >= '0' && c <= '9')
|
|
||||||
{
|
|
||||||
if (digits > 0 && acc == 0) return -1;
|
|
||||||
acc = acc * 10 + (c - '0');
|
|
||||||
if (acc > 255) return -1;
|
|
||||||
digits++;
|
|
||||||
}
|
|
||||||
else if (c == '.')
|
|
||||||
{
|
|
||||||
if (dots >= 3 || digits == 0) return -1;
|
|
||||||
addr = (addr << 8) | acc;
|
|
||||||
dots++; acc = 0; digits = 0;
|
|
||||||
}
|
|
||||||
else return -1;
|
|
||||||
}
|
|
||||||
while (1);
|
|
||||||
|
|
||||||
inaddr->s_addr = hawk_hton32(addr);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
|
||||||
static int str_to_ipv6 (const hawk_ooch_t* src, hawk_oow_t len, struct in6_addr* inaddr)
|
|
||||||
{
|
|
||||||
hawk_uint8_t* tp, * endp, * colonp;
|
|
||||||
const hawk_ooch_t* curtok;
|
|
||||||
hawk_ooch_t ch;
|
|
||||||
int saw_xdigit;
|
|
||||||
unsigned int val;
|
|
||||||
const hawk_ooch_t* src_end;
|
|
||||||
|
|
||||||
src_end = src + len;
|
|
||||||
|
|
||||||
HAWK_MEMSET (inaddr, 0, HAWK_SIZEOF(*inaddr));
|
|
||||||
tp = &inaddr->s6_addr[0];
|
|
||||||
endp = &inaddr->s6_addr[HAWK_COUNTOF(inaddr->s6_addr)];
|
|
||||||
colonp = HAWK_NULL;
|
|
||||||
|
|
||||||
/* Leading :: requires some special handling. */
|
|
||||||
if (src < src_end && *src == ':')
|
|
||||||
{
|
|
||||||
src++;
|
|
||||||
if (src >= src_end || *src != ':') return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
curtok = src;
|
|
||||||
saw_xdigit = 0;
|
|
||||||
val = 0;
|
|
||||||
|
|
||||||
while (src < src_end)
|
|
||||||
{
|
|
||||||
int v1;
|
|
||||||
|
|
||||||
ch = *src++;
|
|
||||||
|
|
||||||
if (ch >= '0' && ch <= '9')
|
|
||||||
v1 = ch - '0';
|
|
||||||
else if (ch >= 'A' && ch <= 'F')
|
|
||||||
v1 = ch - 'A' + 10;
|
|
||||||
else if (ch >= 'a' && ch <= 'f')
|
|
||||||
v1 = ch - 'a' + 10;
|
|
||||||
else v1 = -1;
|
|
||||||
if (v1 >= 0)
|
|
||||||
{
|
|
||||||
val <<= 4;
|
|
||||||
val |= v1;
|
|
||||||
if (val > 0xffff) return -1;
|
|
||||||
saw_xdigit = 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ch == ':')
|
|
||||||
{
|
|
||||||
curtok = src;
|
|
||||||
if (!saw_xdigit)
|
|
||||||
{
|
|
||||||
if (colonp) return -1;
|
|
||||||
colonp = tp;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (src >= src_end)
|
|
||||||
{
|
|
||||||
/* a colon can't be the last character */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*tp++ = (hawk_uint8_t)(val >> 8) & 0xff;
|
|
||||||
*tp++ = (hawk_uint8_t)val & 0xff;
|
|
||||||
saw_xdigit = 0;
|
|
||||||
val = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ch == '.' && ((tp + HAWK_SIZEOF(struct in_addr)) <= endp) &&
|
|
||||||
str_to_ipv4(curtok, src_end - curtok, (struct in_addr*)tp) == 0)
|
|
||||||
{
|
|
||||||
tp += HAWK_SIZEOF(struct in_addr*);
|
|
||||||
saw_xdigit = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (saw_xdigit)
|
|
||||||
{
|
|
||||||
if (tp + HAWK_SIZEOF(hawk_uint16_t) > endp) return -1;
|
|
||||||
*tp++ = (hawk_uint8_t)(val >> 8) & 0xff;
|
|
||||||
*tp++ = (hawk_uint8_t)val & 0xff;
|
|
||||||
}
|
|
||||||
if (colonp != HAWK_NULL)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Since some memmove()'s erroneously fail to handle
|
|
||||||
* overlapping regions, we'll do the shift by hand.
|
|
||||||
*/
|
|
||||||
hawk_oow_t n = tp - colonp;
|
|
||||||
hawk_oow_t i;
|
|
||||||
|
|
||||||
for (i = 1; i <= n; i++)
|
|
||||||
{
|
|
||||||
endp[-i] = colonp[n - i];
|
|
||||||
colonp[n - i] = 0;
|
|
||||||
}
|
|
||||||
tp = endp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tp != endp) return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int hawk_gem_oochars_to_skad (hawk_gem_t* gem, const hawk_ooch_t* str, hawk_oow_t len, hawk_skad_t* _skad)
|
|
||||||
{
|
|
||||||
hawk_skad_alt_t* skad = (hawk_skad_alt_t*)_skad;
|
|
||||||
const hawk_ooch_t* p;
|
|
||||||
const hawk_ooch_t* end;
|
|
||||||
hawk_oocs_t tmp;
|
|
||||||
|
|
||||||
p = str;
|
|
||||||
end = str + len;
|
|
||||||
|
|
||||||
if (p >= end)
|
|
||||||
{
|
|
||||||
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "blank address");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
HAWK_MEMSET (skad, 0, HAWK_SIZEOF(*skad));
|
|
||||||
|
|
||||||
#if defined(AF_UNIX)
|
|
||||||
if (*p == '/' && len >= 2)
|
|
||||||
{
|
|
||||||
#if defined(HAWK_OOCH_IS_BCH)
|
|
||||||
hawk_copy_bcstr (skad->un.sun_path, HAWK_COUNTOF(skad->un.sun_path), str);
|
|
||||||
#else
|
|
||||||
hawk_oow_t dstlen;
|
|
||||||
dstlen = HAWK_COUNTOF(skad->un.sun_path) - 1;
|
|
||||||
if (hawk_gem_convutobchars(gem, p, &len, skad->un.sun_path, &dstlen) <= -1) return -1;
|
|
||||||
skad->un.sun_path[dstlen] = '\0';
|
|
||||||
#endif
|
|
||||||
skad->un.sun_family = AF_UNIX;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
|
||||||
if (*p == '[')
|
|
||||||
{
|
|
||||||
/* IPv6 address */
|
|
||||||
tmp.ptr = (hawk_ooch_t*)++p; /* skip [ and remember the position */
|
|
||||||
while (p < end && *p != '%' && *p != ']') p++;
|
|
||||||
|
|
||||||
if (p >= end) goto no_rbrack;
|
|
||||||
|
|
||||||
tmp.len = p - tmp.ptr;
|
|
||||||
if (*p == '%')
|
|
||||||
{
|
|
||||||
/* handle scope id */
|
|
||||||
hawk_uint32_t x;
|
|
||||||
|
|
||||||
p++; /* skip % */
|
|
||||||
|
|
||||||
if (p >= end)
|
|
||||||
{
|
|
||||||
/* premature end */
|
|
||||||
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "scope id blank");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*p >= '0' && *p <= '9')
|
|
||||||
{
|
|
||||||
/* numeric scope id */
|
|
||||||
skad->in6.sin6_scope_id = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
x = skad->in6.sin6_scope_id * 10 + (*p - '0');
|
|
||||||
if (x < skad->in6.sin6_scope_id)
|
|
||||||
{
|
|
||||||
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "scope id too large");
|
|
||||||
return -1; /* overflow */
|
|
||||||
}
|
|
||||||
skad->in6.sin6_scope_id = x;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
while (p < end && *p >= '0' && *p <= '9');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
TODO:
|
|
||||||
/* interface name as a scope id? */
|
|
||||||
const hawk_ooch_t* stmp = p;
|
|
||||||
unsigned int index;
|
|
||||||
do p++; while (p < end && *p != ']');
|
|
||||||
if (hawk_nwifwcsntoindex(stmp, p - stmp, &index) <= -1) return -1;
|
|
||||||
tmpad.u.in6.scope = index;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p >= end || *p != ']') goto no_rbrack;
|
|
||||||
}
|
|
||||||
p++; /* skip ] */
|
|
||||||
|
|
||||||
if (str_to_ipv6(tmp.ptr, tmp.len, &skad->in6.sin6_addr) <= -1) goto unrecog;
|
|
||||||
skad->in6.sin6_family = AF_INET6;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
/* IPv4 address */
|
|
||||||
tmp.ptr = (hawk_ooch_t*)p;
|
|
||||||
while (p < end && *p != ':') p++;
|
|
||||||
tmp.len = p - tmp.ptr;
|
|
||||||
|
|
||||||
if (str_to_ipv4(tmp.ptr, tmp.len, &skad->in4.sin_addr) <= -1)
|
|
||||||
{
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
|
||||||
/* check if it is an IPv6 address not enclosed in [].
|
|
||||||
* the port number can't be specified in this format. */
|
|
||||||
if (p >= end || *p != ':')
|
|
||||||
{
|
|
||||||
/* without :, it can't be an ipv6 address */
|
|
||||||
goto unrecog;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
while (p < end && *p != '%') p++;
|
|
||||||
tmp.len = p - tmp.ptr;
|
|
||||||
|
|
||||||
if (str_to_ipv6(tmp.ptr, tmp.len, &skad->in6.sin6_addr) <= -1) goto unrecog;
|
|
||||||
|
|
||||||
if (p < end && *p == '%')
|
|
||||||
{
|
|
||||||
/* handle scope id */
|
|
||||||
hawk_uint32_t x;
|
|
||||||
|
|
||||||
p++; /* skip % */
|
|
||||||
|
|
||||||
if (p >= end)
|
|
||||||
{
|
|
||||||
/* premature end */
|
|
||||||
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "scope id blank");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*p >= '0' && *p <= '9')
|
|
||||||
{
|
|
||||||
/* numeric scope id */
|
|
||||||
skad->in6.sin6_scope_id = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
x = skad->in6.sin6_scope_id * 10 + (*p - '0');
|
|
||||||
if (x < skad->in6.sin6_scope_id)
|
|
||||||
{
|
|
||||||
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "scope id too large");
|
|
||||||
return -1; /* overflow */
|
|
||||||
}
|
|
||||||
skad->in6.sin6_scope_id = x;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
while (p < end && *p >= '0' && *p <= '9');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
TODO
|
|
||||||
/* interface name as a scope id? */
|
|
||||||
const hawk_ooch_t* stmp = p;
|
|
||||||
unsigned int index;
|
|
||||||
do p++; while (p < end);
|
|
||||||
if (hawk_nwifwcsntoindex (stmp, p - stmp, &index) <= -1) return -1;
|
|
||||||
skad->in6.sin6_scope_id = index;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p < end) goto unrecog; /* some gargage after the end? */
|
|
||||||
|
|
||||||
skad->in6.sin6_family = AF_INET6;
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
goto unrecog;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
skad->in4.sin_family = AF_INET;
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (p < end && *p == ':')
|
|
||||||
{
|
|
||||||
/* port number */
|
|
||||||
hawk_uint32_t port = 0;
|
|
||||||
|
|
||||||
p++; /* skip : */
|
|
||||||
|
|
||||||
tmp.ptr = (hawk_ooch_t*)p;
|
|
||||||
while (p < end && *p >= '0' && *p <= '9')
|
|
||||||
{
|
|
||||||
port = port * 10 + (*p - '0');
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp.len = p - tmp.ptr;
|
|
||||||
if (tmp.len <= 0 || tmp.len >= 6 ||
|
|
||||||
port > HAWK_TYPE_MAX(hawk_uint16_t))
|
|
||||||
{
|
|
||||||
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "port number blank or too large");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
|
||||||
if (skad->in4.sin_family == AF_INET)
|
|
||||||
skad->in4.sin_port = hawk_hton16(port);
|
|
||||||
else
|
|
||||||
skad->in6.sin6_port = hawk_hton16(port);
|
|
||||||
#else
|
|
||||||
skad->in4.sin_port = hawk_hton16(port);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
unrecog:
|
|
||||||
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "unrecognized address");
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
no_rbrack:
|
|
||||||
hawk_gem_seterrbfmt (gem, HAWK_NULL, HAWK_EINVAL, "missing right bracket");
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
64
hawk/lib/utl-skad.h
Normal file
64
hawk/lib/utl-skad.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* $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_UTL_SKAD_H_
|
||||||
|
#define _HAWK_UTL_SKAD_H_
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#if defined(HAVE_NETINET_IN_H)
|
||||||
|
# include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_SYS_UN_H)
|
||||||
|
# include <sys/un.h>
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_NETPACKET_PACKET_H)
|
||||||
|
# include <netpacket/packet.h>
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_NET_IF_DL_H)
|
||||||
|
# include <net/if_dl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
union hawk_skad_alt_t
|
||||||
|
{
|
||||||
|
struct sockaddr sa;
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN > 0)
|
||||||
|
struct sockaddr_in in4;
|
||||||
|
#endif
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
|
||||||
|
struct sockaddr_in6 in6;
|
||||||
|
#endif
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_LL > 0)
|
||||||
|
struct sockaddr_ll ll;
|
||||||
|
#endif
|
||||||
|
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_UN > 0)
|
||||||
|
struct sockaddr_un un;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
typedef union hawk_skad_alt_t hawk_skad_alt_t;
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user