diff --git a/configure b/configure index 9edbc11d..e1a6bef4 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for hawk 0.9.8. +# Generated by GNU Autoconf 2.71 for hawk 0.9.9. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='hawk' PACKAGE_TARNAME='hawk' -PACKAGE_VERSION='0.9.8' -PACKAGE_STRING='hawk 0.9.8' +PACKAGE_VERSION='0.9.9' +PACKAGE_STRING='hawk 0.9.9' PACKAGE_BUGREPORT='Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)' PACKAGE_URL='https://code.miflux.net/hyung-hwan/hawk' @@ -710,6 +710,8 @@ UNWIND_LIBS FFI_LIBS LTDL_LIBS DL_LIBS +ENABLE_WIDE_CHAR_FALSE +ENABLE_WIDE_CHAR_TRUE LIBM MACOSX_FALSE MACOSX_TRUE @@ -1435,7 +1437,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures hawk 0.9.8 to adapt to many kinds of systems. +\`configure' configures hawk 0.9.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1506,7 +1508,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of hawk 0.9.8:";; + short | recursive ) echo "Configuration of hawk 0.9.9:";; esac cat <<\_ACEOF @@ -1647,7 +1649,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -hawk configure 0.9.8 +hawk configure 0.9.9 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2376,7 +2378,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by hawk $as_me 0.9.8, which was +It was created by hawk $as_me 0.9.9, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3874,7 +3876,7 @@ fi # Define the identity of the package. PACKAGE='hawk' - VERSION='0.9.8' + VERSION='0.9.9' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -19791,6 +19793,29 @@ printf "%s\n" "#define HAWK_PREFER_PREFIX_L 1" >>confdefs.h fi fi +case "${enable_wide_char}" in +yes*) + if true; then + ENABLE_WIDE_CHAR_TRUE= + ENABLE_WIDE_CHAR_FALSE='#' +else + ENABLE_WIDE_CHAR_TRUE='#' + ENABLE_WIDE_CHAR_FALSE= +fi + + ;; +*) + if false; then + ENABLE_WIDE_CHAR_TRUE= + ENABLE_WIDE_CHAR_FALSE='#' +else + ENABLE_WIDE_CHAR_TRUE='#' + ENABLE_WIDE_CHAR_FALSE= +fi + + ;; +esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for char16_t literal" >&5 printf %s "checking for char16_t literal... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -26656,6 +26681,14 @@ if test -z "${MACOSX_TRUE}" && test -z "${MACOSX_FALSE}"; then as_fn_error $? "conditional \"MACOSX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${ENABLE_WIDE_CHAR_TRUE}" && test -z "${ENABLE_WIDE_CHAR_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_WIDE_CHAR\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_WIDE_CHAR_TRUE}" && test -z "${ENABLE_WIDE_CHAR_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_WIDE_CHAR\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${HAVE_LIBUCI_TRUE}" && test -z "${HAVE_LIBUCI_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBUCI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -27091,7 +27124,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by hawk $as_me 0.9.8, which was +This file was extended by hawk $as_me 0.9.9, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -27160,7 +27193,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -hawk config.status 0.9.8 +hawk config.status 0.9.9 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 83e09927..0be9d8ed 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl AC_PREREQ([2.71]) -AC_INIT([hawk],[0.9.8],[Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)],[],[https://code.miflux.net/hyung-hwan/hawk]) +AC_INIT([hawk],[0.9.9],[Chung, Hyung-Hwan (hyunghwan.chung@gmail.com)],[],[https://code.miflux.net/hyung-hwan/hawk]) AC_CONFIG_HEADERS([lib/hawk-cfg.h]) AC_CONFIG_AUX_DIR([ac]) @@ -174,6 +174,15 @@ else fi fi +case "${enable_wide_char}" in +yes*) + AM_CONDITIONAL(ENABLE_WIDE_CHAR, true) + ;; +*) + AM_CONDITIONAL(ENABLE_WIDE_CHAR, false) + ;; +esac + AC_MSG_CHECKING([for char16_t literal]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([], [const void* x = u"ab cd ef gh";])], diff --git a/lib/hawk-str.h b/lib/hawk-str.h index d0787634..2ffa08e0 100644 --- a/lib/hawk-str.h +++ b/lib/hawk-str.h @@ -614,8 +614,8 @@ HAWK_EXPORT int hawk_fnmat_bchars_i ( # define hawk_find_oochars_in_oochars hawk_find_bchars_in_bchars # define hawk_rfind_oochars_in_oochars hawk_rfind_bchars_in_bchars -# define hawk_compact_oochars hawk_compact_uchars -# define hawk_rotate_oochars hawk_rotate_uchars +# define hawk_compact_oochars hawk_compact_bchars +# define hawk_rotate_oochars hawk_rotate_bchars # define hawk_tokenize_oochars hawk_tokenize_bchars # define hawk_trim_oochars hawk_trim_bchars # define hawk_split_oocstr hawk_split_bcstr diff --git a/lib/json.c b/lib/json.c index 977aea73..3ff2547e 100644 --- a/lib/json.c +++ b/lib/json.c @@ -204,7 +204,7 @@ static int handle_string_value_char (hawk_json_t* json, hawk_ooci_t c) hawk_bch_t bcsbuf[HAWK_MBLEN_MAX]; hawk_oow_t n; - n = json->_cmgr->wctomb(json->state_stack->u.sv.acc, bcsbuf, HAWK_COUNTOF(bcsbuf)); + n = json->_gem.cmgr->uctobc(json->state_stack->u.sv.acc, bcsbuf, HAWK_COUNTOF(bcsbuf)); if (n == 0 || n > HAWK_COUNTOF(bcsbuf)) { /* illegal character or buffer to small */ diff --git a/lib/parse.c b/lib/parse.c index 7129f84e..ac69917b 100644 --- a/lib/parse.c +++ b/lib/parse.c @@ -6942,6 +6942,26 @@ retry: if (HAWK_UNLIKELY(hawk_ooecs_fmt(tok->name, HAWK_T("%zu"), tok->loc.line) == (hawk_oow_t)-1)) return -1; SET_TOKEN_TYPE (hawk, tok, TOK_INT); } + else if (hawk_comp_oochars_bcstr(HAWK_OOECS_PTR(tok->name), HAWK_OOECS_LEN(tok->name), "@UCH_ON", 0) == 0) + { + /* special parser-level word @SCRIPTLINE. subsitute an actual value for it */ + #if defined(HAWK_OOCH_IS_UCH) + if (HAWK_UNLIKELY(hawk_ooecs_fmt(tok->name, HAWK_T("%zu"), 1) == (hawk_oow_t)-1)) return -1; + #else + if (HAWK_UNLIKELY(hawk_ooecs_fmt(tok->name, HAWK_T("%zu"), 0) == (hawk_oow_t)-1)) return -1; + #endif + SET_TOKEN_TYPE (hawk, tok, TOK_INT); + } + else if (hawk_comp_oochars_bcstr(HAWK_OOECS_PTR(tok->name), HAWK_OOECS_LEN(tok->name), "@BCH_ON", 0) == 0) + { + /* special parser-level word @SCRIPTLINE. subsitute an actual value for it */ + #if defined(HAWK_OOCH_IS_UCH) + if (HAWK_UNLIKELY(hawk_ooecs_fmt(tok->name, HAWK_T("%zu"), 0) == (hawk_oow_t)-1)) return -1; + #else + if (HAWK_UNLIKELY(hawk_ooecs_fmt(tok->name, HAWK_T("%zu"), 1) == (hawk_oow_t)-1)) return -1; + #endif + SET_TOKEN_TYPE (hawk, tok, TOK_INT); + } else { type = classify_ident(hawk, HAWK_OOECS_OOCS(tok->name)); diff --git a/lib/std.c b/lib/std.c index bc6749ee..fd9e01df 100644 --- a/lib/std.c +++ b/lib/std.c @@ -1759,7 +1759,7 @@ static hawk_ooi_t sf_out (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t* arg, if (hawk_convbtouchars(hawk, data, &mbslen, HAWK_NULL, &wcslen, 0) <= -1) return -1; if (wcslen > HAWK_TYPE_MAX(hawk_ooi_t)) wcslen = HAWK_TYPE_MAX(hawk_ooi_t); - orglen = hawk_becs_getlen(xtn->s.out.u.ucs.buf); + orglen = hawk_uecs_getlen(xtn->s.out.u.ucs.buf); if (hawk_uecs_setlen(xtn->s.out.u.ucs.buf, orglen + wcslen) == (hawk_oow_t)-1) return -1; mbslen = size; @@ -3070,7 +3070,7 @@ hawk_rtx_t* hawk_rtx_openstdwithbcstr ( #if defined(HAWK_OOCH_IS_UCH) xocf[i] = hawk_dupbtoucstr(hawk, ocf[i], &wcslen, 0); #else - xocf[i] = hawk_dupucstr(hawk, ocf[i], HAWK_NULL); + xocf[i] = hawk_dupbcstr(hawk, ocf[i], HAWK_NULL); #endif if (!xocf[i]) goto done; } @@ -3149,7 +3149,7 @@ hawk_rtx_t* hawk_rtx_openstdwithucstr ( for (i = 0; ocf[i]; i++) { #if defined(HAWK_OOCH_IS_BCH) - xocf[i] = hawk_dupbtoucstr(hawk, ocf[i], &mbslen, 0); + xocf[i] = hawk_duputobcstr(hawk, ocf[i], &mbslen); #else xocf[i] = hawk_dupucstr(hawk, ocf[i], HAWK_NULL); #endif diff --git a/mod/mod-ffi.c b/mod/mod-ffi.c index 9469b3ff..a2b016d8 100644 --- a/mod/mod-ffi.c +++ b/mod/mod-ffi.c @@ -609,7 +609,7 @@ static HAWK_INLINE int add_ffi_arg (hawk_rtx_t* rtx, ffi_list_t* ffi_list, ffi_n case FMTC_STR: { - hawk_uch_t* ptr; + hawk_ooch_t* ptr; hawk_oow_t len; ptr = hawk_rtx_valtooocstrdup(rtx, arg, &len); diff --git a/t/Makefile.am b/t/Makefile.am index 54657119..490c2b92 100644 --- a/t/Makefile.am +++ b/t/Makefile.am @@ -13,7 +13,11 @@ LDFLAGS_COMMON=-L$(abs_builddir)/../lib -L$(libdir) ## for more information. LIBADD_COMMON = ../lib/libhawk.la $(LIBM) -check_SCRIPTS = h-001.hawk h-002.hawk h-003.hawk h-004.hawk h-009.hawk +check_SCRIPTS = +if ENABLE_WIDE_CHAR +check_SCRIPTS += h-001.hawk h-002.hawk +endif +check_SCRIPTS += h-003.hawk h-004.hawk h-009.hawk check_ERRORS = e-001.err diff --git a/t/Makefile.in b/t/Makefile.in index 7cc749c2..6d17178a 100644 --- a/t/Makefile.in +++ b/t/Makefile.in @@ -87,6 +87,7 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ +@ENABLE_WIDE_CHAR_TRUE@am__append_1 = h-001.hawk h-002.hawk check_PROGRAMS = t-001$(EXEEXT) t-002$(EXEEXT) t-003$(EXEEXT) \ t-004$(EXEEXT) t-005$(EXEEXT) t-006$(EXEEXT) t-007$(EXEEXT) subdir = t @@ -590,7 +591,7 @@ CPPFLAGS_COMMON = \ CFLAGS_COMMON = LDFLAGS_COMMON = -L$(abs_builddir)/../lib -L$(libdir) LIBADD_COMMON = ../lib/libhawk.la $(LIBM) -check_SCRIPTS = h-001.hawk h-002.hawk h-003.hawk h-004.hawk h-009.hawk +check_SCRIPTS = $(am__append_1) h-003.hawk h-004.hawk h-009.hawk check_ERRORS = e-001.err EXTRA_DIST = $(check_SCRIPTS) $(check_ERRORS) tap.inc err.sh \ journal-toc.hawk journal-toc.in journal-toc.out journal-toc-html.out \ diff --git a/t/h-001.hawk b/t/h-001.hawk index fbc88a97..d9fded71 100644 --- a/t/h-001.hawk +++ b/t/h-001.hawk @@ -307,6 +307,7 @@ function main() tap_ensure ((@b"hawk" %% '⚾') === @b"hawk\xe2\x9a\xbe", 1, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (("hawk" %% '⚾') === "hawk⚾", 1, @SCRIPTNAME, @SCRIPTLINE); + tap_ensure ((@b"hawk" %% str::fromcharcode(65)) === @b"hawkA", 1, @SCRIPTNAME, @SCRIPTLINE); tap_ensure ((@b"hawk" %% str::fromcharcode(0x26be)) === @b"hawk\xe2\x9a\xbe", 1, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (("hawk" %% str::fromcharcode(0x26be)) === "hawk⚾", 1, @SCRIPTNAME, @SCRIPTLINE); } diff --git a/t/t-007.c b/t/t-007.c new file mode 100644 index 00000000..43b5ba93 --- /dev/null +++ b/t/t-007.c @@ -0,0 +1,25 @@ + +#include +#include +#include "tap.h" + +static int on_json_element (hawk_json_t* json, hawk_json_inst_t inst, const hawk_oocs_t* str) +{ +printf ("%d\n", inst); + return 0; +} + +int main () +{ + hawk_json_t* json; + hawk_json_prim_t prim; + + no_plan(); + prim.instcb = on_json_element; + + json = hawk_json_openstd(0, &prim, HAWK_NULL); + OK (json != HAWK_NULL, "instantiation must be successful"); + + hawk_json_close(json); + return exit_status(); +}