diff --git a/hawk/Makefile.in b/hawk/Makefile.in index c16c8e71..420d695e 100644 --- a/hawk/Makefile.in +++ b/hawk/Makefile.in @@ -354,6 +354,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/hawk/bin/Makefile.in b/hawk/bin/Makefile.in index b496cd1d..1c5b18b2 100644 --- a/hawk/bin/Makefile.in +++ b/hawk/bin/Makefile.in @@ -323,6 +323,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/hawk/configure b/hawk/configure index fa4fe4e2..c5bf3ff1 100755 --- a/hawk/configure +++ b/hawk/configure @@ -785,6 +785,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -886,6 +887,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1138,6 +1140,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1275,7 +1286,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1428,6 +1439,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -18050,7 +18062,7 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -18096,7 +18108,7 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -18120,7 +18132,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -18165,7 +18177,7 @@ else We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -18189,7 +18201,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -20808,6 +20820,34 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of unsetenv()" >&5 +$as_echo_n "checking return type of unsetenv()... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + return unsetenv("foo"); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: int" >&5 +$as_echo "int" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: void" >&5 +$as_echo "void" >&6; } + +$as_echo "#define UNSETENV_RETURNS_VOID 1" >>confdefs.h + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` diff --git a/hawk/configure.ac b/hawk/configure.ac index 1a3abbc4..9a839792 100644 --- a/hawk/configure.ac +++ b/hawk/configure.ac @@ -454,6 +454,18 @@ AC_TRY_RUN( ] ) +AC_MSG_CHECKING([return type of unsetenv()]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( [#include ], [ + return unsetenv("foo"); + ])], + + [AC_MSG_RESULT(int)] + + [AC_MSG_RESULT(void) + AC_DEFINE([UNSETENV_RETURNS_VOID], [1], [unsetenv returns int])] +) + dnl check struct members AC_STRUCT_DIRENT_D_TYPE AC_CHECK_MEMBERS([DIR.d_fd, DIR.dd_fd],,,[[#include ]]) diff --git a/hawk/lib/HawkStd.cpp b/hawk/lib/HawkStd.cpp index 09a19c82..9f7aa27f 100644 --- a/hawk/lib/HawkStd.cpp +++ b/hawk/lib/HawkStd.cpp @@ -1222,7 +1222,7 @@ hawk_flt_t HawkStd::mod (hawk_flt_t x, hawk_flt_t y) void* HawkStd::modopen (const hawk_mod_spec_t* spec) { void* h; - h = hawk_stdmodopen (this->hawk, spec); + h = hawk_stdmodopen(this->hawk, spec); if (!h) this->retrieveError (); return h; } diff --git a/hawk/lib/Makefile.in b/hawk/lib/Makefile.in index dc66aa1b..e543ab97 100644 --- a/hawk/lib/Makefile.in +++ b/hawk/lib/Makefile.in @@ -562,6 +562,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/hawk/lib/hawk-cfg.h.in b/hawk/lib/hawk-cfg.h.in index fe8216d4..658babaa 100644 --- a/hawk/lib/hawk-cfg.h.in +++ b/hawk/lib/hawk-cfg.h.in @@ -1036,6 +1036,9 @@ /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS +/* unsetenv returns int */ +#undef UNSETENV_RETURNS_VOID + /* Version number of package */ #undef VERSION diff --git a/hawk/lib/hawk.c b/hawk/lib/hawk.c index a3875e14..080b2300 100644 --- a/hawk/lib/hawk.c +++ b/hawk/lib/hawk.c @@ -613,27 +613,93 @@ int hawk_buildrex (hawk_t* hawk, const hawk_ooch_t* ptn, hawk_oow_t len, hawk_tr /* ------------------------------------------------------------------------ */ -int hawk_finmodsymfnc (hawk_t* hawk, hawk_mod_fnc_tab_t* fnctab, hawk_oow_t count, const hawk_ooch_t* name, hawk_oow_t namelen, hawk_mod_sym_t* sym) +int hawk_findmodsymfnc_noerr (hawk_t* hawk, hawk_mod_fnc_tab_t* fnctab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym) { int n; /* binary search */ - /* [NOTE] this algorithm is underflow safe with hawk_oow_t types */ hawk_oow_t base, mid, lim; for (base = 0, lim = count; lim > 0; lim >>= 1) { mid = base + (lim >> 1); - n = hawk_comp_oochars_oocstr(name, namelen, fnctab[mid].name); + n = hawk_comp_oocstr(name, fnctab[mid].name, 0); if (n == 0) { sym->type = HAWK_MOD_FNC; - sym->u.fnc = fnctab[mid].info; + sym->u.fnc_ = fnctab[mid].info; + return 0; + } + if (n > 0) { base = mid + 1; lim--; } + } + + return -1; +} + + +int hawk_findmodsymint_noerr (hawk_t* hawk, hawk_mod_int_tab_t* inttab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym) +{ + int n; + + /* binary search */ + hawk_oow_t base, mid, lim; + + for (base = 0, lim = count; lim > 0; lim >>= 1) + { + mid = base + (lim >> 1); + n = hawk_comp_oocstr(name, inttab[mid].name, 0); + if (n == 0) + { + sym->type = HAWK_MOD_INT; + sym->u.int_ = inttab[mid].info; return 0; } if (n > 0) { base = mid + 1; lim--; } } - hawk_seterrbfmt (hawk, HAWK_NULL, HAWK_ENOENT, "'%js' not found", name); return -1; } + +int hawk_findmodsymflt_noerr (hawk_t* hawk, hawk_mod_flt_tab_t* flttab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym) +{ + int n; + + /* binary search */ + hawk_oow_t base, mid, lim; + + for (base = 0, lim = count; lim > 0; lim >>= 1) + { + mid = base + (lim >> 1); + n = hawk_comp_oocstr(name, flttab[mid].name, 0); + if (n == 0) + { + sym->type = HAWK_MOD_FLT; + sym->u.flt_ = flttab[mid].info; + return 0; + } + if (n > 0) { base = mid + 1; lim--; } + } + + return -1; +} + +int hawk_findmodsymfnc (hawk_t* hawk, hawk_mod_fnc_tab_t* fnctab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym) +{ + int n = hawk_findmodsymfnc_noerr(hawk, fnctab, count, name, sym); + if (n <= -1) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); + return n; +} + +int hawk_findmodsymint (hawk_t* hawk, hawk_mod_int_tab_t* inttab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym) +{ + int n = hawk_findmodsymint_noerr(hawk, inttab, count, name, sym); + if (n <= -1) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); + return n; +} + +int hawk_findmodsymflt (hawk_t* hawk, hawk_mod_flt_tab_t* flttab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym) +{ + int n = hawk_findmodsymflt_noerr(hawk, flttab, count, name, sym); + if (n <= -1) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); + return n; +} diff --git a/hawk/lib/hawk.h b/hawk/lib/hawk.h index bff8fd72..c1ceec5b 100644 --- a/hawk/lib/hawk.h +++ b/hawk/lib/hawk.h @@ -1008,7 +1008,7 @@ struct hawk_mod_t hawk_mod_init_t init; /* per-rtx initialization */ hawk_mod_fini_t fini; /* per-rtx finalization */ - void* ctx; + void* ctx; }; enum hawk_mod_sym_type_t @@ -1028,11 +1028,13 @@ typedef struct hawk_mod_sym_flt_t hawk_mod_sym_flt_t; struct hawk_mod_sym_int_t { hawk_int_t val; + int trait; }; struct hawk_mod_sym_flt_t { hawk_flt_t val; + int trait; }; struct hawk_mod_sym_t @@ -1040,9 +1042,9 @@ struct hawk_mod_sym_t hawk_mod_sym_type_t type; union { - hawk_mod_sym_fnc_t fnc; - hawk_mod_sym_int_t in; - hawk_mod_sym_flt_t flt; + hawk_mod_sym_fnc_t fnc_; + hawk_mod_sym_int_t int_; + hawk_mod_sym_flt_t flt_; } u; }; @@ -1055,6 +1057,20 @@ struct hawk_mod_fnc_tab_t hawk_mod_sym_fnc_t info; }; +typedef struct hawk_mod_int_tab_t hawk_mod_int_tab_t; +struct hawk_mod_int_tab_t +{ + const hawk_ooch_t* name; + hawk_mod_sym_int_t info; +}; + +typedef struct hawk_mod_flt_tab_t hawk_mod_flt_tab_t; +struct hawk_mod_flt_tab_t +{ + const hawk_ooch_t* name; + hawk_mod_sym_flt_t info; +}; + /* ------------------------------------------------------------------------ */ /** @@ -1910,6 +1926,58 @@ HAWK_EXPORT int hawk_isvalidident ( const hawk_ooch_t* str ); +/* ----------------------------------------------------------------------- */ + +HAWK_EXPORT int hawk_findmodsymfnc_noerr ( + hawk_t* hawk, + hawk_mod_fnc_tab_t* fnctab, + hawk_oow_t count, + const hawk_ooch_t* name, + hawk_mod_sym_t* sym +); + +HAWK_EXPORT int hawk_findmodsymint_noerr ( + hawk_t* hawk, + hawk_mod_int_tab_t* inttab, + hawk_oow_t count, + const hawk_ooch_t* name, + hawk_mod_sym_t* sym +); + +HAWK_EXPORT int hawk_findmodsymflt_noerr ( + hawk_t* hawk, + hawk_mod_flt_tab_t* flttab, + hawk_oow_t count, + const hawk_ooch_t* name, + hawk_mod_sym_t* sym +); + +HAWK_EXPORT int hawk_findmodsymfnc ( + hawk_t* hawk, + hawk_mod_fnc_tab_t* fnctab, + hawk_oow_t count, + const hawk_ooch_t* name, + hawk_mod_sym_t* sym +); + +HAWK_EXPORT int hawk_findmodsymint ( + hawk_t* hawk, + hawk_mod_int_tab_t* inttab, + hawk_oow_t count, + const hawk_ooch_t* name, + hawk_mod_sym_t* sym +); + +HAWK_EXPORT int hawk_findmodsymflt ( + hawk_t* hawk, + hawk_mod_flt_tab_t* flttab, + hawk_oow_t count, + const hawk_ooch_t* name, + hawk_mod_sym_t* sym +); + +/* ----------------------------------------------------------------------- */ + #if defined(HAWK_HAVE_INLINE) static HAWK_INLINE void* hawk_allocmem (hawk_t* hawk, hawk_oow_t size) { return hawk_gem_allocmem(hawk_getgem(hawk), size); } static HAWK_INLINE void* hawk_reallocmem (hawk_t* hawk, void* ptr, hawk_oow_t size) { return hawk_gem_reallocmem(hawk_getgem(hawk), ptr, size); } diff --git a/hawk/lib/mod-hawk.c b/hawk/lib/mod-hawk.c index 9046356b..61e1c26f 100644 --- a/hawk/lib/mod-hawk.c +++ b/hawk/lib/mod-hawk.c @@ -393,23 +393,9 @@ static int fnc_typename (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* -------------------------------------------------------------------------- */ -typedef struct fnctab_t fnctab_t; -struct fnctab_t -{ - const hawk_ooch_t* name; - hawk_mod_sym_fnc_t info; -}; - -typedef struct inttab_t inttab_t; -struct inttab_t -{ - const hawk_ooch_t* name; - hawk_mod_sym_int_t info; -}; - #define A_MAX HAWK_TYPE_MAX(hawk_oow_t) -static fnctab_t fnctab[] = +static hawk_mod_fnc_tab_t fnctab[] = { /* keep this table sorted for binary search in query(). */ { HAWK_T("array"), { { 0, A_MAX, HAWK_NULL }, fnc_array, 0 } }, @@ -428,7 +414,7 @@ static fnctab_t fnctab[] = { HAWK_T("typename"), { { 1, 1, HAWK_NULL }, fnc_typename, 0 } } }; -static inttab_t inttab[] = +static hawk_mod_int_tab_t inttab[] = { /* keep this table sorted for binary search in query(). */ { HAWK_T("GC_NUM_GENS"), { HAWK_GC_NUM_GENS } } @@ -436,43 +422,8 @@ static inttab_t inttab[] = static int query (hawk_mod_t* mod, hawk_t* hawk, const hawk_ooch_t* name, hawk_mod_sym_t* sym) { - int left, right, mid, n; - - left = 0; right = HAWK_COUNTOF(fnctab) - 1; - - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(fnctab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_FNC; - sym->u.fnc = fnctab[mid].info; - return 0; - } - } - - left = 0; right = HAWK_COUNTOF(inttab) - 1; - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(inttab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_INT; - sym->u.in = inttab[mid].info; - return 0; - } - } - - hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); - return -1; + if (hawk_findmodsymfnc_noerr(hawk, fnctab, HAWK_COUNTOF(fnctab), name, sym) >= 0) return 0; + return hawk_findmodsymint(hawk, inttab, HAWK_COUNTOF(inttab), name, sym); } static int init (hawk_mod_t* mod, hawk_rtx_t* rtx) diff --git a/hawk/lib/mod-math.c b/hawk/lib/mod-math.c index 1c0cb4ce..d5b2e1c1 100644 --- a/hawk/lib/mod-math.c +++ b/hawk/lib/mod-math.c @@ -605,14 +605,7 @@ static int fnc_srand (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* ----------------------------------------------------------------------- */ -typedef struct fnctab_t fnctab_t; -struct fnctab_t -{ - const hawk_ooch_t* name; - hawk_mod_sym_fnc_t info; -}; - -static fnctab_t fnctab[] = +static hawk_mod_fnc_tab_t fnctab[] = { /* keep this table sorted for binary search in query(). */ { HAWK_T("acos"), { { 1, 1, HAWK_NULL }, fnc_acos, 0 } }, @@ -638,46 +631,8 @@ static fnctab_t fnctab[] = }; static int query (hawk_mod_t* mod, hawk_t* hawk, const hawk_ooch_t* name, hawk_mod_sym_t* sym) -{ - int left, right, mid, n; - - left = 0; right = HAWK_COUNTOF(fnctab) - 1; - - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(fnctab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_FNC; - sym->u.fnc = fnctab[mid].info; - return 0; - } - } - -#if 0 - left = 0; right = HAWK_COUNTOF(inttab) - 1; - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(inttab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_INT; - sym->u.in = inttab[mid].info; - return 0; - } - } -#endif - - hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); - return -1; +{ + return hawk_findmodsymfnc(hawk, fnctab, HAWK_COUNTOF(fnctab), name, sym); } /* TODO: proper resource management */ diff --git a/hawk/lib/mod-str.c b/hawk/lib/mod-str.c index a5d1b845..bc2b7150 100644 --- a/hawk/lib/mod-str.c +++ b/hawk/lib/mod-str.c @@ -745,23 +745,11 @@ static int fnc_subchar (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) return 0; } -typedef struct fnctab_t fnctab_t; -struct fnctab_t -{ - const hawk_ooch_t* name; - hawk_mod_sym_fnc_t info; -}; - -typedef struct inttab_t inttab_t; -struct inttab_t -{ - const hawk_ooch_t* name; - hawk_mod_sym_int_t info; -}; +/* ----------------------------------------------------------------------- */ #define A_MAX HAWK_TYPE_MAX(hawk_oow_t) -static fnctab_t fnctab[] = +static hawk_mod_fnc_tab_t fnctab[] = { /* keep this table sorted for binary search in query(). */ { HAWK_T("frombcharcode"), { { 0, A_MAX, HAWK_NULL }, fnc_frombcharcode, 0 } }, @@ -801,7 +789,7 @@ static fnctab_t fnctab[] = { HAWK_T("trim"), { { 1, 2, HAWK_NULL }, fnc_trim, 0 } } }; -static inttab_t inttab[] = +static hawk_mod_int_tab_t inttab[] = { /* keep this table sorted for binary search in query(). */ { HAWK_T("TRIM_PAC_SPACES"), { TRIM_FLAG_PAC_SPACES } } @@ -809,43 +797,8 @@ static inttab_t inttab[] = static int query (hawk_mod_t* mod, hawk_t* hawk, const hawk_ooch_t* name, hawk_mod_sym_t* sym) { - int left, right, mid, n; - - left = 0; right = HAWK_COUNTOF(fnctab) - 1; - - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(fnctab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_FNC; - sym->u.fnc = fnctab[mid].info; - return 0; - } - } - - left = 0; right = HAWK_COUNTOF(inttab) - 1; - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(inttab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_INT; - sym->u.in = inttab[mid].info; - return 0; - } - } - - hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); - return -1; + if (hawk_findmodsymfnc_noerr(hawk, fnctab, HAWK_COUNTOF(fnctab), name, sym) >= 0) return 0; + return hawk_findmodsymint(hawk, inttab, HAWK_COUNTOF(inttab), name, sym); } /* TODO: proper resource management */ diff --git a/hawk/lib/mod-sys.c b/hawk/lib/mod-sys.c index 4d4e2e3f..dfb625ab 100644 --- a/hawk/lib/mod-sys.c +++ b/hawk/lib/mod-sys.c @@ -2832,8 +2832,13 @@ static int fnc_unsetenv (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) goto done; } +#if defined(UNSETENV_RETURNS_VOID) + unsetenv(str); + rx = 0; +#else rx = unsetenv(str); if (rx <= -1) rx = set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL); +#endif done: if (str) hawk_rtx_freevalbcstr (rtx, a0, str); @@ -5794,25 +5799,11 @@ fail: goto done; } -/* -------------------------------------------------------------------------- */ - -typedef struct fnctab_t fnctab_t; -struct fnctab_t -{ - const hawk_ooch_t* name; - hawk_mod_sym_fnc_t info; -}; - -typedef struct inttab_t inttab_t; -struct inttab_t -{ - const hawk_ooch_t* name; - hawk_mod_sym_int_t info; -}; +/* ----------------------------------------------------------------------- */ #define A_MAX HAWK_TYPE_MAX(hawk_oow_t) -static fnctab_t fnctab[] = +static hawk_mod_fnc_tab_t fnctab[] = { /* keep this table sorted for binary search in query(). */ @@ -5921,7 +5912,7 @@ static fnctab_t fnctab[] = # define SIGTERM 15 #endif -static inttab_t inttab[] = +static hawk_mod_int_tab_t inttab[] = { /* keep this table sorted for binary search in query(). */ @@ -6217,43 +6208,8 @@ static inttab_t inttab[] = static int query (hawk_mod_t* mod, hawk_t* hawk, const hawk_ooch_t* name, hawk_mod_sym_t* sym) { - int left, right, mid, n; - - left = 0; right = HAWK_COUNTOF(fnctab) - 1; - - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(fnctab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_FNC; - sym->u.fnc = fnctab[mid].info; - return 0; - } - } - - left = 0; right = HAWK_COUNTOF(inttab) - 1; - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(inttab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_INT; - sym->u.in = inttab[mid].info; - return 0; - } - } - - hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); - return -1; + if (hawk_findmodsymfnc_noerr(hawk, fnctab, HAWK_COUNTOF(fnctab), name, sym) >= 0) return 0; + return hawk_findmodsymint(hawk, inttab, HAWK_COUNTOF(inttab), name, sym); } /* TODO: proper resource management */ diff --git a/hawk/lib/parse.c b/hawk/lib/parse.c index b8231efe..6cdf6bea 100644 --- a/hawk/lib/parse.c +++ b/hawk/lib/parse.c @@ -5639,7 +5639,7 @@ static hawk_nde_t* parse_primary_ident_segs (hawk_t* hawk, const hawk_loc_t* xlo hawk_fnc_t fnc; mod = query_module(hawk, segs, nsegs, &sym); - if (mod == HAWK_NULL) + if (!mod) { ADJERR_LOC (hawk, xloc); } @@ -5648,7 +5648,7 @@ static hawk_nde_t* parse_primary_ident_segs (hawk_t* hawk, const hawk_loc_t* xlo switch (sym.type) { case HAWK_MOD_FNC: - if ((hawk->opt.trait & sym.u.fnc.trait) != sym.u.fnc.trait) + if ((hawk->opt.trait & sym.u.fnc_.trait) != sym.u.fnc_.trait) { hawk_seterrfmt (hawk, xloc, HAWK_EUNDEF, FMT_EUNDEF, full->len, full->ptr); break; @@ -5659,9 +5659,9 @@ static hawk_nde_t* parse_primary_ident_segs (hawk_t* hawk, const hawk_loc_t* xlo HAWK_MEMSET (&fnc, 0, HAWK_SIZEOF(fnc)); fnc.name.ptr = full->ptr; fnc.name.len = full->len; - fnc.spec = sym.u.fnc; + fnc.spec = sym.u.fnc_; fnc.mod = mod; - nde = parse_fncall (hawk, full, &fnc, xloc, 0); + nde = parse_fncall(hawk, full, &fnc, xloc, 0); } else { @@ -5670,12 +5670,24 @@ static hawk_nde_t* parse_primary_ident_segs (hawk_t* hawk, const hawk_loc_t* xlo break; case HAWK_MOD_INT: - nde = new_int_node(hawk, sym.u.in.val, xloc); + if ((hawk->opt.trait & sym.u.int_.trait) != sym.u.int_.trait) + { + hawk_seterrfmt (hawk, xloc, HAWK_EUNDEF, FMT_EUNDEF, full->len, full->ptr); + break; + } + + nde = new_int_node(hawk, sym.u.int_.val, xloc); /* i don't remember the symbol in the original form */ break; case HAWK_MOD_FLT: - nde = new_flt_node(hawk, sym.u.flt.val, xloc); + if ((hawk->opt.trait & sym.u.flt_.trait) != sym.u.flt_.trait) + { + hawk_seterrfmt (hawk, xloc, HAWK_EUNDEF, FMT_EUNDEF, full->len, full->ptr); + break; + } + + nde = new_flt_node(hawk, sym.u.flt_.val, xloc); /* i don't remember the symbol in the original form */ break; diff --git a/hawk/mod/Makefile.in b/hawk/mod/Makefile.in index 37acae9e..adee6eb9 100644 --- a/hawk/mod/Makefile.in +++ b/hawk/mod/Makefile.in @@ -399,6 +399,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/hawk/mod/mod-ffi.c b/hawk/mod/mod-ffi.c index 10e27070..0e84ed43 100644 --- a/hawk/mod/mod-ffi.c +++ b/hawk/mod/mod-ffi.c @@ -23,10 +23,11 @@ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if 0 +#if 0 #include "mod-ffi.h" #include +#include "../lib/hawk-prv.h" #include #include @@ -154,6 +155,17 @@ struct ffi_t }; +#define __IDMAP_NODE_T_DATA ffi_t ffi; +#define __IDMAP_LIST_T_DATA int errnum; hawk_ooch_t errmsg[256]; +#define __IDMAP_LIST_T ffi_list_t +#define __IDMAP_NODE_T ffi_node_t +#define __INIT_IDMAP_LIST __init_ffi_list +#define __FINI_IDMAP_LIST __fini_ffi_list +#define __MAKE_IDMAP_NODE __new_ffi_node +#define __FREE_IDMAP_NODE __free_ffi_node +#include "../lib/idmap-imp.h" + + static HAWK_INLINE void link_ca (ffi_t* ffi, void* ptr) { link_t* l = (link_t*)((hawk_oob_t*)ptr - HAWK_SIZEOF_VOID_P); @@ -172,39 +184,17 @@ static void free_linked_cas (hawk_t* hawk, ffi_t* ffi) } } -static hawk_pfrc_t fnc_open (hawk_t* hawk, hawk_mod_t* mod, hawk_ooi_t nargs) +static int fnc_open (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) { + hawk_t* hawk = hawk_rtx_gethawk(rtx); ffi_t* ffi; - hawk_oop_t name; + hawk_mod_spec_t spec; void* handle; #if defined(USE_DYNCALL) DCCallVM* dc; #endif - HAWK_ASSERT (hawk, nargs == 1); - - ffi = (ffi_t*)hawk_getobjtrailer(hawk, HAWK_STACK_GETRCV(hawk, nargs), HAWK_NULL); - name = HAWK_STACK_GETARG(hawk, nargs, 0); - - if (!HAWK_OBJ_IS_CHAR_POINTER(name)) - { - hawk_seterrnum (hawk, HAWK_EINVAL); - goto softfail; - } - - if (!hawk->vmprim.dl_open) - { - hawk_seterrnum (hawk, HAWK_ENOIMPL); - goto softfail; - } - - if (ffi->handle) - { - hawk_seterrnum (hawk, HAWK_EPERM); /* no allowed to open again */ - goto softfail; - } - - handle = hawk->vmprim.dl_open(hawk, HAWK_OBJ_GET_CHAR_SLOT(name), 0); + handle = hawk->prm.modopen(hawk, &spec); if (!handle) goto softfail; #if defined(USE_DYNCALL) @@ -254,7 +244,6 @@ static hawk_pfrc_t fnc_open (hawk_t* hawk, hawk_mod_t* mod, hawk_ooi_t nargs) ffi->fmtc_to_type[1][FMTC_UCS] = &ffi_type_pointer; #endif - HAWK_DEBUG3 (hawk, " %.*js => %p\n", HAWK_OBJ_GET_SIZE(name), HAWK_OBJ_GET_CHAR_SLOT(name), ffi->handle); HAWK_STACK_SETRETTORCV (hawk, nargs); return HAWK_PF_SUCCESS; @@ -1199,12 +1188,7 @@ softfail: /* ------------------------------------------------------------------------ */ -#define C HAWK_METHOD_CLASS -#define I HAWK_METHOD_INSTANCE - -#define MA HAWK_TYPE_MAX(hawk_oow_t) - -static hawk_mod_fnc_tab_t pfinfos[] = +static hawk_mod_fnc_tab_t fnctab[] = { { HAWK_T("call"), { { 3, 3, HAWK_NULL }, fnc_call, 0 } }, { HAWK_T("close"), { { 0, 0, HAWK_NULL }, fnc_close, 0 } }, @@ -1214,18 +1198,11 @@ static hawk_mod_fnc_tab_t pfinfos[] = /* ------------------------------------------------------------------------ */ -static int import (hawk_t* hawk, hawk_mod_t* mod, hawk_oop_class_t _class) +static int query (hawk_mod_t* mod, hawk_t* hawk, const hawk_ooch_t* name, hawk_mod_sym_t* sym) { - if (hawk_setclasstrsize(hawk, _class, HAWK_SIZEOF(ffi_t), HAWK_NULL) <= -1) return -1; - return 0; + return hawk_findmodsymfnc(hawk, fnctab, HAWK_COUNTOF(fnctab), name, sym); } -static int query (hawk_mod_t* mod, hawk_t* awk, const hawk_ooch_t* name, hawk_mod_sym_t* sym) -{ - ///hawk_findmodsymfnc(hawk, pfinfos, HAWK_COUNTOF(pfinfos), name, namelen); -} - - static void unload (hawk_t* hawk, hawk_mod_t* mod) { /* TODO: anything? close open open dll handles? For that, fnc_open must store the value it returns to mod->ctx or somewhere..*/ @@ -1234,12 +1211,9 @@ static void unload (hawk_t* hawk, hawk_mod_t* mod) int hawk_mod_ffi (hawk_t* hawk, hawk_mod_t* mod) { - mod->import = import; mod->query = query; mod->unload = unload; mod->ctx = HAWK_NULL; return 0; } - - #endif diff --git a/hawk/mod/mod-mysql.c b/hawk/mod/mod-mysql.c index 0424ee07..35d6320e 100644 --- a/hawk/mod/mod-mysql.c +++ b/hawk/mod/mod-mysql.c @@ -1773,24 +1773,12 @@ done: hawk_rtx_setretval (rtx, hawk_rtx_makeintval(rtx, ret)); return 0; } -typedef struct fnctab_t fnctab_t; -struct fnctab_t -{ - const hawk_ooch_t* name; - hawk_mod_sym_fnc_t info; -}; - -typedef struct inttab_t inttab_t; -struct inttab_t -{ - const hawk_ooch_t* name; - hawk_mod_sym_int_t info; -}; +/* ----------------------------------------------------------------------- */ #define A_MAX HAWK_TYPE_MAX(int) -static fnctab_t fnctab[] = +static hawk_mod_fnc_tab_t fnctab[] = { /* keep this table sorted for binary search in query(). */ { HAWK_T("affected_rows"), { { 2, 2, HAWK_T("vr") }, fnc_affected_rows, 0 } }, @@ -1822,7 +1810,7 @@ static fnctab_t fnctab[] = { HAWK_T("store_result"), { { 1, 1, HAWK_NULL }, fnc_store_result, 0 } } }; -static inttab_t inttab[] = +static hawk_mod_int_tab_t inttab[] = { /* keep this table sorted for binary search in query(). */ { HAWK_T("OPT_CONNECT_TIMEOUT"), { MYSQL_OPT_CONNECT_TIMEOUT } }, @@ -1840,46 +1828,10 @@ static inttab_t inttab[] = { HAWK_T("TYPE_STR"), { MYSQL_TYPE_STRING } } }; -static int query (hawk_mod_t* mod, hawk_t* awk, const hawk_ooch_t* name, hawk_mod_sym_t* sym) +static int query (hawk_mod_t* mod, hawk_t* hawk, const hawk_ooch_t* name, hawk_mod_sym_t* sym) { - int left, right, mid, n; - - left = 0; right = HAWK_COUNTOF(fnctab) - 1; - - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(fnctab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_FNC; - sym->u.fnc = fnctab[mid].info; - return 0; - } - } - - left = 0; right = HAWK_COUNTOF(inttab) - 1; - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_comp_oocstr(inttab[mid].name, name, 0); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_INT; - sym->u.in = inttab[mid].info; - return 0; - } - } - - - hawk_seterrfmt (awk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); - return -1; + if (hawk_findmodsymfnc_noerr(hawk, fnctab, HAWK_COUNTOF(fnctab), name, sym) >= 0) return 0; + return hawk_findmodsymint(hawk, inttab, HAWK_COUNTOF(inttab), name, sym); } static int init (hawk_mod_t* mod, hawk_rtx_t* rtx) @@ -1955,7 +1907,6 @@ int hawk_mod_mysql (hawk_mod_t* mod, hawk_t* hawk) return 0; } - HAWK_EXPORT int hawk_mod_mysql_init (int argc, char* argv[]) { if (mysql_library_init(argc, argv, HAWK_NULL) != 0) return -1; diff --git a/hawk/mod/mod-uci.c b/hawk/mod/mod-uci.c index af3a737a..4944c924 100644 --- a/hawk/mod/mod-uci.c +++ b/hawk/mod/mod-uci.c @@ -1301,14 +1301,7 @@ static int fnc_uci_getsection (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* ------------------------------------------------------------------------ */ -typedef struct fnctab_t fnctab_t; -struct fnctab_t -{ - const hawk_char_t* name; - hawk_mod_sym_fnc_t info; -}; - -static fnctab_t fnctab[] = +static hawk_mod_fnc_tab_t fnctab[] = { { HAWK_T("adddeltapath"), { { 2, 2, HAWK_NULL }, fnc_uci_adddeltapath, 0 } }, { HAWK_T("addlist"), { { 2, 2, HAWK_NULL }, fnc_uci_addlist, 0 } }, @@ -1335,27 +1328,7 @@ static fnctab_t fnctab[] = static int query (hawk_mod_t* mod, hawk_t* awk, const hawk_char_t* name, hawk_mod_sym_t* sym) { - int left, right, mid, n; - - left = 0; right = HAWK_COUNTOF(fnctab) - 1; - - while (left <= right) - { - mid = left + (right - left) / 2; - - n = hawk_strcmp (fnctab[mid].name, name); - if (n > 0) right = mid - 1; - else if (n < 0) left = mid + 1; - else - { - sym->type = HAWK_MOD_FNC; - sym->u.fnc = fnctab[mid].info; - return 0; - } - } - - hawk_seterrfmt (awk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); - return -1; + return hawk_findmodsymfnc(hawk, fnctab, HAWK_COUNTOF(fnctab), name, sym); } static int init (hawk_mod_t* mod, hawk_rtx_t* rtx) @@ -1366,7 +1339,7 @@ static int init (hawk_mod_t* mod, hawk_rtx_t* rtx) rbt = (hawk_rbt_t*)mod->ctx; HAWK_MEMSET (&list, 0, HAWK_SIZEOF(list)); - if (hawk_rbt_insert (rbt, &rtx, HAWK_SIZEOF(rtx), &list, HAWK_SIZEOF(list)) == HAWK_NULL) + if (hawk_rbt_insert(rbt, &rtx, HAWK_SIZEOF(rtx), &list, HAWK_SIZEOF(list)) == HAWK_NULL) { hawk_rtx_seterrnum (rtx, HAWK_ENOMEM, HAWK_NULL); return -1; diff --git a/hawk/samples/Makefile.in b/hawk/samples/Makefile.in index 16f0ca48..211dcb10 100644 --- a/hawk/samples/Makefile.in +++ b/hawk/samples/Makefile.in @@ -353,6 +353,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/hawk/t/Makefile.in b/hawk/t/Makefile.in index 256a9651..67aec334 100644 --- a/hawk/t/Makefile.in +++ b/hawk/t/Makefile.in @@ -558,6 +558,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ diff --git a/hawk/tools/Makefile.in b/hawk/tools/Makefile.in index 02ca6a9d..d78932f1 100644 --- a/hawk/tools/Makefile.in +++ b/hawk/tools/Makefile.in @@ -330,6 +330,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@