flush
authorMichael Wallner <mike@php.net>
Thu, 26 Nov 2015 07:33:09 +0000 (08:33 +0100)
committerMichael Wallner <mike@php.net>
Thu, 26 Nov 2015 07:57:25 +0000 (08:57 +0100)
40 files changed:
config.ax_check_sign.m4 [deleted file]
config.m4
config.psi.m4 [deleted file]
config.psi_const.m4 [deleted file]
config.psi_decl.m4 [deleted file]
config.psi_errno.m4 [deleted file]
config.psi_glob.m4 [deleted file]
config.psi_macro.m4 [deleted file]
config.psi_stddef.m4 [deleted file]
config.psi_stdint.m4 [deleted file]
config.psi_stdio.m4 [deleted file]
config.psi_struct.m4 [deleted file]
config.psi_sys_types.m4 [deleted file]
config.psi_type.m4 [deleted file]
m4/ax_check_sign.m4 [new file with mode: 0644]
m4/errno.m4 [new file with mode: 0644]
m4/glob.m4 [new file with mode: 0644]
m4/psi.m4 [new file with mode: 0644]
m4/psi_const.m4 [new file with mode: 0644]
m4/psi_decl.m4 [new file with mode: 0644]
m4/psi_macro.m4 [new file with mode: 0644]
m4/psi_struct.m4 [new file with mode: 0644]
m4/psi_type.m4 [new file with mode: 0644]
m4/stddef.m4 [new file with mode: 0644]
m4/stdint.m4 [new file with mode: 0644]
m4/stdio.m4 [new file with mode: 0644]
m4/stdlib.m4 [new file with mode: 0644]
m4/sys_stat.m4 [new file with mode: 0644]
m4/sys_time.m4 [new file with mode: 0644]
m4/sys_times.m4 [new file with mode: 0644]
m4/sys_types.m4 [new file with mode: 0644]
m4/sys_uio.m4 [new file with mode: 0644]
m4/time.m4 [new file with mode: 0644]
m4/wchar.m4 [new file with mode: 0644]
php_psi.h
psi.d/glob.psi
psi.d/stat.psi
psi.d/time.psi
src/context.c
src/module.c

diff --git a/config.ax_check_sign.m4 b/config.ax_check_sign.m4
deleted file mode 100644 (file)
index 244865f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-AC_DEFUN([AX_CHECK_SIGN], [
-       typename=`echo $1 | sed "s/@<:@^a-zA-Z0-9_@:>@/_/g"`
-       AC_CACHE_CHECK([whether $1 is signed], ax_cv_decl_${typename}_signed, [
-                       AC_TRY_COMPILE([$4],
-                                       [ int foo @<:@ 1 - 2 * !((($1) -1) < 0) @:>@ ],
-                                       [ eval "ax_cv_decl_${typename}_signed=\"yes\"" ],
-                                       [ eval "ax_cv_decl_${typename}_signed=\"no\"" ])])
-       symbolname=`echo $1 | sed "s/@<:@^a-zA-Z0-9_@:>@/_/g" | tr "a-z" "A-Z"`
-       if eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"yes\""; then
-                       $2
-       elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then
-                       $3
-       fi
-])
index 1207c0ca943a1b07f01687e838eb514e128dd064..c4eb5783a89c04a5335fc55848e866623b4354bc 100644 (file)
--- a/config.m4
+++ b/config.m4
@@ -7,21 +7,32 @@ if test "$PHP_PSI" != no; then
        PHP_PSI_SRCDIR=PHP_EXT_SRCDIR(psi)
        PHP_PSI_BUILDDIR=PHP_EXT_BUILDDIR(psi)
 
-       sinclude(config.ax_check_sign.m4)
-       sinclude(config.psi.m4)
-       sinclude(config.psi_type.m4)
-       sinclude(config.psi_const.m4)
-       sinclude(config.psi_decl.m4)
-       sinclude(config.psi_macro.m4)
-       sinclude(config.psi_struct.m4)
-
-       sinclude(config.psi_errno.m4)
-       sinclude(config.psi_glob.m4)
-       sinclude(config.psi_stddef.m4)
-       sinclude(config.psi_stdio.m4)
-       sinclude(config.psi_stdint.m4)
-       sinclude(config.psi_sys_types.m4)
-
+       m4_foreach(incfile, [
+               [ax_check_sign.m4],
+               [psi.m4],
+               [psi_type.m4],
+               [psi_const.m4],
+               [psi_decl.m4],
+               [psi_macro.m4],
+               [psi_struct.m4],
+               [errno.m4],
+               [glob.m4],
+               [stddef.m4],
+               [stdio.m4],
+               [stdint.m4],
+               [stdlib.m4],
+               [sys_stat.m4],
+               [sys_time.m4],
+               [sys_times.m4],
+               [sys_types.m4],
+               [sys_uio.m4],
+               [time.m4],
+               [wchar.m4]], [
+               dnl pecl build
+               sinclude([m4/]incfile)
+               dnl php-src build
+               sinclude([ext/psi/m4/]incfile)
+       ])
        PSI_LEMON
        PSI_CHECK_LIBJIT
        PSI_CHECK_LIBFFI
@@ -36,15 +47,25 @@ if test "$PHP_PSI" != no; then
        PSI_CHECK_ERRNO
        PSI_CHECK_GLOB
        PSI_CHECK_STDIO
-
-       echo PSI_TYPES=$PSI_TYPES
-       echo PSI_MACROS=$PSI_MACROS
-       echo PSI_REDIRS=$PSI_REDIRS
-       echo PSI_DECLS=$PSI_DECLS
-       echo PSI_STRUCTS=$PSI_STRUCTS
+       PSI_CHECK_STDLIB
+       PSI_CHECK_TIME
+       PSI_CHECK_SYS_TIME
+       PSI_CHECK_SYS_TIMES
+       PSI_CHECK_SYS_STAT
+       PSI_CHECK_SYS_UIO
+       PSI_CHECK_WCHAR
 
        PHP_SUBST(PSI_SHARED_LIBADD)
 
+       AC_DEFINE_UNQUOTED(PHP_PSI_SHLIB_SUFFIX, ["$SHLIB_SUFFIX_NAME"], DL suffix)
+
+       AC_DEFINE_UNQUOTED([PSI_TYPES], [$PSI_TYPES], [Predefined types])
+       AC_DEFINE_UNQUOTED([PSI_STRUCTS], [$PSI_STRUCTS], [Predefined structs])
+       AC_DEFINE_UNQUOTED([PSI_CONSTS], [$PSI_CONSTS], [Predefined constants])
+       AC_DEFINE_UNQUOTED([PSI_MACROS], [$PSI_MACROS], [Redirected Macros])
+       AC_DEFINE_UNQUOTED([PSI_REDIRS], [$PSI_REDIRS], [Redirected functions])
+       AC_DEFINE_UNQUOTED([PSI_DECLS], [$PSI_DECLS], [Predefined functions])
+
        PHP_ADD_INCLUDE($PHP_PSI_SRCDIR/src)
        PHP_ADD_BUILD_DIR($PHP_PSI_BUILDDIR/src)
 
diff --git a/config.psi.m4 b/config.psi.m4
deleted file mode 100644 (file)
index 09ca497..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-psi_includes() {
-       local have_
-       have_=`AS_ECHO($ac_header) | $as_tr_cpp`
-       cat <<EOF
-#ifdef HAVE_$have_
-# include <$ac_header>
-#endif
-EOF
-}
-
-AC_DEFUN(PSI_INCLUDES, [AC_INCLUDES_DEFAULT()
-`psi_includes`])
-
-AC_DEFUN(PSI_LEMON, [
-       AC_ARG_VAR(LEMON, The lemon parser generator of the SQLite project)
-       AC_PATH_PROG(LEMON, lemon, ./lemon)
-       PHP_SUBST(LEMON)
-])
-
-AC_DEFUN([PSI_PKG_CONFIG], [
-       if test -z "$PKG_CONFIG"
-       then
-               AC_PATH_PROG(PKG_CONFIG, pkg-config, false)
-       fi
-       export PKG_CONFIG_PATH="$PHP_PSI_LIBFFI/lib/pkgconfig:$PHP_PSI_LIBJIT/lib/pkgconfig:$PKG_CONFIG_PATH"
-])
-
-AC_DEFUN(PSI_CHECK_OFFSETOF, [
-       _AC_CACHE_CHECK_INT(
-               [offset of $2 in $1],
-               [AS_TR_SH([ac_cv_offsetof_$1_$2])],
-               [(long int) (offsetof ($1, $2))],
-               [PSI_INCLUDES],
-               [AC_MSG_FAILURE([cannot compute offsetof ($1, $2)])]
-       )
-       AC_DEFINE_UNQUOTED(
-               AS_TR_CPP(offsetof_$1_$2),
-               $AS_TR_SH([ac_cv_offsetof_$1_$2]),
-               [The offset of `$2' in `$1', as computed by offsetof.]
-       )
-])
-
-AC_DEFUN(PSI_CHECK_LIBJIT, [
-       PHP_ARG_WITH(psi-libjit, where to find libjit,
-       [  --with-psi-libjit=DIR   PSI: path to libjit], [ ], [ ])
-       AC_CACHE_CHECK(for libjit, psi_cv_libjit_dir, [
-               for psi_cv_libjit_dir in $PHP_PSI_LIBJIT {/usr{,/local},/opt}{,/libjit}
-               do
-                       if test -e $psi_cv_libjit_dir/include/jit/jit.h
-                       then
-                               break
-                       fi
-                       psi_cv_libjit_dir=
-               done
-       ])
-       if test -n "$psi_cv_libjit_dir"
-       then
-               PHP_ADD_INCLUDE($psi_cv_libjit_dir/include)
-               PHP_ADD_LIBRARY_WITH_PATH(jit, $psi_cv_libjit_dir/$PHP_LIBDIR, PSI_SHARED_LIBADD)
-               AC_DEFINE(HAVE_LIBJIT, 1, Have libjit)
-       else
-               AC_MSG_WARN([Could not find libjit, please provide the base install path])
-       fi
-])
-
-AC_DEFUN(PSI_CHECK_LIBFFI, [
-       AC_REQUIRE([PSI_PKG_CONFIG])dnl
-       PHP_ARG_WITH(psi-libffi, where to find libffi,
-       [  --with-psi-libffi=DIR   PSI: path to libffi], [ ], [ ])
-
-       AC_CACHE_CHECK(for libffi through pkg-config, psi_cv_libffi, [
-       if $PKG_CONFIG --exists libffi
-       then
-               psi_cv_libffi=true
-       else
-               psi_cv_libffi=false
-       fi])
-       if $psi_cv_libffi
-       then
-               AC_MSG_CHECKING(for libffi)
-               psi_cv_libffi_dir=`$PKG_CONFIG --variable=prefix libffi`
-               AC_MSG_RESULT($psi_cv_libffi_dir)
-               PHP_EVAL_INCLINE(`$PKG_CONFIG --cflags libffi`)
-               PHP_EVAL_LIBLINE(`$PKG_CONFIG --libs libffi`, PSI_SHARED_LIBADD)
-               AC_DEFINE(HAVE_LIBFFI, 1, Have libffi)
-       else
-               AC_CACHE_CHECK(for libffi, psi_cv_libffi_dir, [
-               for psi_cv_libffi_dir in $PHP_PSI_LIBFFI {/usr{,/local},/opt}{,/libffi}
-               do
-                       if test -e $psi_cv_libffi_dir/include/ffi/ffi.h
-                       then
-                               break
-                       fi
-                       psi_cv_libffi_dir=
-               done])
-               if test -n "$psi_cv_libffi_dir"
-               then
-                       PHP_ADD_INCLUDE($psi_cv_libffi_dir/include/ffi)
-                       PHP_ADD_LIBRARY_WITH_PATH(ffi, $psi_cv_libffi_dir/$PHP_LIBDIR, PSI_SHARED_LIBADD)
-                       AC_DEFINE(HAVE_LIBFFI, 1, Have libffi)
-               else
-                       AC_MSG_WARN([Could not find libffi, please provide the base install path])
-               fi
-       fi
-       PHP_CHECK_LIBRARY(ffi, ffi_closure_alloc, [
-               PHP_CHECK_LIBRARY(ffi, ffi_prep_closure_loc, [
-                       AC_DEFINE(PSI_HAVE_FFI_PREP_CLOSURE_LOC, 1, [ ])
-               ], [], -L$psi_cv_libffi_dir/$PHP_LIBDIR)
-               AC_DEFINE(PSI_HAVE_FFI_CLOSURE_ALLOC, 1, [ ])
-       ], [
-               PHP_CHECK_LIBRARY(ffi, ffi_prep_closure, [
-                       AC_CHECK_HEADERS(sys/mman.h)
-                       PHP_CHECK_FUNC(mmap)
-                       AC_DEFINE(PSI_HAVE_FFI_PREP_CLOSURE, 1, [ ])
-               ], [
-               ], -L$psi_cv_libffi_dir/$PHP_LIBDIR)
-       ], -L$psi_cv_libffi_dir/$PHP_LIBDIR)
-])
-
-dnl PSI_COMPUTE_STR(variable, string or expression)
-AC_DEFUN(PSI_COMPUTE_STR, [
-       AC_TRY_RUN(
-               PSI_INCLUDES
-               [int main() {
-                       return EOF == fputs($2, fopen("conftest.out", "w"));
-               }
-       ], [
-               eval $1=\\\"`cat conftest.out`\\\"
-       ])
-])
diff --git a/config.psi_const.m4 b/config.psi_const.m4
deleted file mode 100644 (file)
index db08f62..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-PSI_CONSTS=""
-# add_str_const(name, value)
-add_str_const() {
-       PSI_CONSTS="{PSI_T_STRING, \"string\", \"psi\\\\$1\", $2, PSI_T_QUOTED_STRING}, $PSI_CONSTS"
-}
-# add_int_const(name, value)
-add_int_const() {
-       PSI_CONSTS="{PSI_T_INT, \"int\", \"psi\\\\$1\", \"$2\", PSI_T_NUMBER}, $PSI_CONSTS"
-}
-dnl PSI_CONST(const name, type)
-AC_DEFUN(PSI_CONST, [
-       AC_CACHE_CHECK(value of $1, psi_cv_const_$1, [
-               psi_const_val=
-               case $2 in
-               str*)
-                       if test "$cross_compiling" = "yes"
-                       then
-                               AC_TRY_CPP(PSI_INCLUDES $1, psi_const_val=`eval "$ac_try|tail -n1"`, psi_const_val=)
-                       else
-                               PSI_COMPUTE_STR(psi_const_val, $1, PSI_INCLUDES)
-                       fi
-                       ;;
-               int)
-                       AC_COMPUTE_INT(psi_const_val, $1, PSI_INCLUDES)
-                       ;;
-               esac
-               psi_cv_const_$1=$psi_const_val
-       ])
-       if test "$psi_cv_const_$1"
-       then
-               case $2 in
-               str*)
-                       add_str_const "$1" "$psi_cv_const_$1"
-                       ;;
-               int)
-                       add_int_const "$1" "$psi_cv_const_$1"
-                       ;;
-               esac
-       fi
-])
diff --git a/config.psi_decl.m4 b/config.psi_decl.m4
deleted file mode 100644 (file)
index 2a89205..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-PSI_REDIRS=
-AC_DEFUN(PSI_REDIR, [psi_symbol=ifelse([$2],[],[$1],[$2])
-       PSI_REDIRS="{\"$1\", (void(*)(void))$psi_symbol}, $PSI_REDIRS"])
-
-dnl PSI_FUNC(fn, action-if-yes, action-if-no)
-AC_DEFUN(PSI_FUNC, [
-       AC_REQUIRE([AC_PROG_NM])
-       AC_REQUIRE([AC_PROG_AWK])
-       psi_symbol=$1
-       AC_CACHE_CHECK(for $1, psi_cv_fn_$1, [
-               psi_symbol_redirect=
-               AC_TRY_LINK(PSI_INCLUDES, [
-                       void (*fn)(void) = (void (*)(void)) $psi_symbol;
-               ], [
-                       psi_symbol_redirect=`$NM -g conftest$ac_exeext | $AWK -F" *|@" '/ U .*$1.*/ {print$[]3; exit}'`
-               ])
-               psi_cv_fn_$1=$psi_symbol_redirect
-       ])
-       case "$psi_cv_fn_$1" in
-       "")
-               $3
-               ;;
-       "$psi_symbol"|"_$psi_symbol")
-               $2
-               ;;
-       *)
-               $2
-               PSI_REDIR($1)
-               ;;
-       esac
-])
-
-AC_DEFUN(PSI_DECL_ARG, [
-    m4_define([member_name], PSI_VAR_NAME($1))
-    m4_define([member_type], PSI_TYPE_NAME($1))
-    m4_define([pointer_level], m4_len(m4_bpatsubst($1, [[^*]])))
-       m4_define([array_size], m4_bregexp($1, [\[\([0-9]+\)\]], [\1]))
-       ifelse(array_size, [],
-               [m4_define([array_size], 0)],
-               [m4_define([pointer_level], m4_incr(pointer_level))]
-       )
-    if test -n "$psi_decl_args"; then
-        psi_decl_args="$psi_decl_args, "
-    fi
-    psi_decl_args="[$psi_decl_args{]PSI_TYPE_PAIR(member_type)[, \"]member_name[\",] pointer_level, array_size[}]"
-])
-
-dnl PSI_DECL(type func, args)
-AC_DEFUN(PSI_DECL, [
-       psi_decl_args=
-       PSI_DECL_ARG($1)
-       m4_case([$2],
-               [(void)], [],
-               [()], [],
-               [m4_map_args_sep([PSI_DECL_ARG(], [)], [], m4_bregexp($2, [(\(.*\))], [\1]))])
-       PSI_FUNC(PSI_VAR_NAME($1), [
-               PSI_DECLS="{$psi_decl_args}, $PSI_DECLS"
-       ], [
-               PSI_MACRO(PSI_VAR_NAME($1), $3, [
-                       add_macro "PSI_TYPE_NAME($1)" "PSI_VAR_NAME($1)" "$3"
-                       PSI_DECLS="{$psi_decl_args}, $PSI_DECLS"
-               ])
-       ])
-])
diff --git a/config.psi_errno.m4 b/config.psi_errno.m4
deleted file mode 100644 (file)
index 8f147e1..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-AC_DEFUN(PSI_CHECK_ERRNO, [
-    AC_CHECK_HEADERS(errno.h)
-    PSI_EXTVAR(errno, int)
-    PSI_CONST(E2BIG, int)
-    PSI_CONST(EACCES, int)
-    PSI_CONST(EADDRINUSE, int)
-    PSI_CONST(EADDRNOTAVAIL, int)
-    PSI_CONST(EAFNOSUPPORT, int)
-    PSI_CONST(EAGAIN, int)
-    PSI_CONST(EALREADY, int)
-    PSI_CONST(EBADF, int)
-    PSI_CONST(EBADMSG, int)
-    PSI_CONST(EBUSY, int)
-    PSI_CONST(ECANCELED, int)
-    PSI_CONST(ECHILD, int)
-    PSI_CONST(ECONNABORTED, int)
-    PSI_CONST(ECONNREFUSED, int)
-    PSI_CONST(ECONNRESET, int)
-    PSI_CONST(EDEADLK, int)
-    PSI_CONST(EDESTADDRREQ, int)
-    PSI_CONST(EDOM, int)
-    PSI_CONST(EDQUOT, int)
-    PSI_CONST(EEXIST, int)
-    PSI_CONST(EFAULT, int)
-    PSI_CONST(EFBIG, int)
-    PSI_CONST(EHOSTUNREACH, int)
-    PSI_CONST(EIDRM, int)
-    PSI_CONST(EILSEQ, int)
-    PSI_CONST(EINPROGRESS, int)
-    PSI_CONST(EINTR, int)
-    PSI_CONST(EINVAL, int)
-    PSI_CONST(EIO, int)
-    PSI_CONST(EISCONN, int)
-    PSI_CONST(EISDIR, int)
-    PSI_CONST(ELOOP, int)
-    PSI_CONST(EMFILE, int)
-    PSI_CONST(EMLINK, int)
-    PSI_CONST(EMSGSIZE, int)
-    PSI_CONST(EMULTIHOP, int)
-    PSI_CONST(ENAMETOOLONG, int)
-    PSI_CONST(ENETDOWN, int)
-    PSI_CONST(ENETRESET, int)
-    PSI_CONST(ENETUNREACH, int)
-    PSI_CONST(ENFILE, int)
-    PSI_CONST(ENOBUFS, int)
-    PSI_CONST(ENODATA, int)
-    PSI_CONST(ENODEV, int)
-    PSI_CONST(ENOENT, int)
-    PSI_CONST(ENOEXEC, int)
-    PSI_CONST(ENOLCK, int)
-    PSI_CONST(ENOLINK, int)
-    PSI_CONST(ENOMEM, int)
-    PSI_CONST(ENOMSG, int)
-    PSI_CONST(ENOPROTOOPT, int)
-    PSI_CONST(ENOSPC, int)
-    PSI_CONST(ENOSR, int)
-    PSI_CONST(ENOSTR, int)
-    PSI_CONST(ENOSYS, int)
-    PSI_CONST(ENOTCONN, int)
-    PSI_CONST(ENOTDIR, int)
-    PSI_CONST(ENOTEMPTY, int)
-    PSI_CONST(ENOTRECOVERABLE, int)
-    PSI_CONST(ENOTSOCK, int)
-    PSI_CONST(ENOTSUP, int)
-    PSI_CONST(ENOTTY, int)
-    PSI_CONST(ENXIO, int)
-    PSI_CONST(EOPNOTSUPP, int)
-    PSI_CONST(EOVERFLOW, int)
-    PSI_CONST(EOWNERDEAD, int)
-    PSI_CONST(EPERM, int)
-    PSI_CONST(EPIPE, int)
-    PSI_CONST(EPROTO, int)
-    PSI_CONST(EPROTONOSUPPORT, int)
-    PSI_CONST(EPROTOTYPE, int)
-    PSI_CONST(ERANGE, int)
-    PSI_CONST(EROFS, int)
-    PSI_CONST(ESPIPE, int)
-    PSI_CONST(ESRCH, int)
-    PSI_CONST(ESTALE, int)
-    PSI_CONST(ETIME, int)
-    PSI_CONST(ETIMEDOUT, int)
-    PSI_CONST(ETXTBSY, int)
-    PSI_CONST(EWOULDBLOCK, int)
-    PSI_CONST(EXDEV, int)
-])
diff --git a/config.psi_glob.m4 b/config.psi_glob.m4
deleted file mode 100644 (file)
index fbb036e..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-AC_DEFUN(PSI_CHECK_GLOB, [
-    AC_CHECK_HEADERS(glob.h)
-    PSI_STRUCT(glob_t, [
-        size_t gl_pathc,
-        int gl_matchc,
-        size_t gl_offs,
-        int gl_flags,
-        char **gl_pathv])
-
-    PSI_DECL(int glob, [(char *path, int flags, void *err, glob_t *buf)])
-    PSI_DECL(void globfree, [(glob_t *buf)])
-
-    PSI_CONST(GLOB_APPEND, int)
-    PSI_CONST(GLOB_BRACE, int)
-    PSI_CONST(GLOB_DOOFFS, int)
-    PSI_CONST(GLOB_ERR, int)
-    PSI_CONST(GLOB_MARK, int)
-    PSI_CONST(GLOB_NOCHECK, int)
-    PSI_CONST(GLOB_NOESCAPE, int)
-    PSI_CONST(GLOB_NOMAGIC, int)
-    PSI_CONST(GLOB_NOSORT, int)
-    PSI_CONST(GLOB_ONLYDIR, int)
-    PSI_CONST(GLOB_PERIOD, int)
-    PSI_CONST(GLOB_TILDE, int)
-    PSI_CONST(GLOB_TILDE_CHECK, int)
-    PSI_CONST(GLOB_ABORTED, int)
-    PSI_CONST(GLOB_NOMATCH, int)
-    PSI_CONST(GLOB_NOSPACE, int)
-])
diff --git a/config.psi_macro.m4 b/config.psi_macro.m4
deleted file mode 100644 (file)
index 88702a9..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-# arg_names(typed args)
-arg_names() {
-       AS_ECHO_N([$1]) \
-               | tr -cd '()' \
-               | $AWK -F, '{for (i=1;i<NF;++i) print $i ","; print $NF}' \
-               | $AWK '{print $NF}' \
-               | xargs
-}
-PSI_MACROS=
-# gen_macro(ret type, symbol, args)
-gen_macro() {
-       local dargs="$3"
-       test -z "$3" && dargs="()"
-       AS_ECHO_N(["static $1 psi_macro_$2$dargs {"])
-       if test "$1" != "void"; then
-               AS_ECHO_N(["return "])
-       fi
-       arg_names "$3"
-       AS_ECHO_N(["$2`arg_names \"$3\"`;}"])
-}
-# add_macro(ret type, symbol, args)
-add_macro() {
-       local psi_macro
-       psi_macro=`gen_macro "$1" "$2" "$3"`
-       PSI_MACROS="$psi_macro $PSI_MACROS"
-       PSI_REDIR([$2], [psi_macro_$2])
-}
-
-dnl PSI_MACRO(macro, decl args, action-if-true)
-AC_DEFUN(PSI_MACRO, [
-       AC_CHECK_DECL($1$2, $3, [], PSI_INCLUDES)
-])
-
-dnl PSI_EXTVAR(var, type)
-AC_DEFUN(PSI_EXTVAR, [
-       AC_CHECK_DECL($1, [
-               add_macro "$2" "$1"
-       ], [], PSI_INCLUDES)
-])
diff --git a/config.psi_stddef.m4 b/config.psi_stddef.m4
deleted file mode 100644 (file)
index 7c99d6c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-AC_DEFUN(PSI_CHECK_STDDEF, [
-    AC_CHECK_HEADERS(stddef.h)
-    PSI_TYPE(ptrdiff_t, int)
-    PSI_CONST(PTRDIFF_MIN, int)
-    PSI_CONST(PTRDIFF_MAX, int)
-    PSI_TYPE(size_t, uint)
-    PSI_CONST(SIZE_MAX, int)
-    PSI_TYPE(wchar_t, int)
-    PSI_CONST(WCHAR_MIN, int)
-    PSI_CONST(WCHAR_MAX, int)
-])
diff --git a/config.psi_stdint.m4 b/config.psi_stdint.m4
deleted file mode 100644 (file)
index 65afe65..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-AC_DEFUN(PSI_CHECK_STDINT, [
-       AC_CHECK_HEADERS(stdint.h)
-
-       PSI_TYPE(int_least8_t, int)
-       PSI_TYPE(int_least16_t, int)
-       PSI_TYPE(int_least32_t, int)
-       PSI_TYPE(int_least64_t, int)
-       PSI_TYPE(uint_least8_t, uint)
-       PSI_TYPE(uint_least16_t, uint)
-       PSI_TYPE(uint_least32_t, uint)
-       PSI_TYPE(uint_least64_t, uint)
-       PSI_TYPE(int_fast8_t, int)
-       PSI_TYPE(int_fast16_t, int)
-       PSI_TYPE(int_fast32_t, int)
-       PSI_TYPE(int_fast64_t, int)
-       PSI_TYPE(uint_fast8_t, uint)
-       PSI_TYPE(uint_fast16_t, uint)
-       PSI_TYPE(uint_fast32_t, uint)
-       PSI_TYPE(uint_fast64_t, uint)
-       PSI_TYPE(intptr_t, int)
-       PSI_TYPE(uintptr_t, uint)
-       PSI_TYPE(intmax_t, int)
-       PSI_TYPE(uintmax_t, uint)
-
-       PSI_CONST(INT8_MIN, int)
-       PSI_CONST(INT8_MAX, int)
-       PSI_CONST(UINT8_MAX, int)
-       PSI_CONST(INT16_MIN, int)
-       PSI_CONST(INT16_MAX, int)
-       PSI_CONST(UINT16_MAX, int)
-       PSI_CONST(INT32_MIN, int)
-       PSI_CONST(INT32_MAX, int)
-       PSI_CONST(UINT32_MAX, int)
-       PSI_CONST(INT64_MIN, int)
-       PSI_CONST(INT64_MAX, int)
-       PSI_CONST(UINT64_MAX, int)
-
-       PSI_CONST(INT_LEAST8_MIN, int)
-       PSI_CONST(INT_LEAST8_MAX, int)
-       PSI_CONST(UINT_LEAST8_MAX, int)
-       PSI_CONST(INT_LEAST16_MIN, int)
-       PSI_CONST(INT_LEAST16_MAX, int)
-       PSI_CONST(UINT_LEAST16_MAX, int)
-       PSI_CONST(INT_LEAST32_MIN, int)
-       PSI_CONST(INT_LEAST32_MAX, int)
-       PSI_CONST(UINT_LEAST32_MAX, int)
-       PSI_CONST(INT_LEAST64_MIN, int)
-       PSI_CONST(INT_LEAST64_MAX, int)
-       PSI_CONST(UINT_LEAST64_MAX, int)
-
-       PSI_CONST(INT_FAST8_MIN, int)
-       PSI_CONST(INT_FAST8_MAX, int)
-       PSI_CONST(UINT_FAST8_MAX, int)
-       PSI_CONST(INT_FAST16_MIN, int)
-       PSI_CONST(INT_FAST16_MAX, int)
-       PSI_CONST(UINT_FAST16_MAX, int)
-       PSI_CONST(INT_FAST32_MIN, int)
-       PSI_CONST(INT_FAST32_MAX, int)
-       PSI_CONST(UINT_FAST32_MAX, int)
-       PSI_CONST(INT_FAST64_MIN, int)
-       PSI_CONST(INT_FAST64_MAX, int)
-       PSI_CONST(UINT_FAST64_MAX, int)
-
-       PSI_CONST(INTPTR_MIN, int)
-       PSI_CONST(INTPTR_MAX, int)
-       PSI_CONST(UINTPTR_MAX, int)
-       PSI_CONST(INTMAX_MIN, int)
-       PSI_CONST(INTMAX_MAX, int)
-       PSI_CONST(UINTMAX_MAX, int)
-])
diff --git a/config.psi_stdio.m4 b/config.psi_stdio.m4
deleted file mode 100644 (file)
index a6f8a2e..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-AC_DEFUN(PSI_CHECK_STDIO, [
-    AC_CHECK_HEADER(stdio.h)
-
-    PSI_STRUCT(FILE)
-    PSI_STRUCT(fpos_t)
-
-    PSI_CONST(BUFSIZ, int)
-    PSI_CONST(_IOFBF, int)
-    PSI_CONST(_IOLBF, int)
-    PSI_CONST(_IONBF, int)
-    PSI_CONST(SEEK_CUR, int)
-    PSI_CONST(SEEK_END, int)
-    PSI_CONST(SEEK_SET, int)
-    PSI_CONST(FILENAME_MAX, int)
-    PSI_CONST(FOPEN_MAX, int)
-    PSI_CONST(TMP_MAX, int)
-    PSI_CONST(EOF, int)
-    PSI_CONST(P_tmpdir, string)
-    PSI_CONST(L_ctermid, int)
-    PSI_CONST(L_tmpnam, int)
-
-    PSI_DECL(void clearerr, [(FILE *stream)])
-    PSI_DECL(char *ctermid, [(char *s)])
-    PSI_DECL(int fclose, [(FILE *stream)])
-    PSI_DECL(FILE *fdopen, [(int fd, char *mode)])
-    PSI_DECL(int feof, [(FILE *stream)])
-    PSI_DECL(int ferror, [(FILE *stream)])
-    PSI_DECL(int fflush, [(FILE *stream)])
-    PSI_DECL(int fgetc, [(FILE *stream)])
-    PSI_DECL(int fgetpos, [(FILE *stream, fpos_t *pos)])
-    PSI_DECL(char *fgets, [(char *buf, int len, FILE *stream)])
-    PSI_DECL(int fileno, [(FILE *stream)])
-    PSI_DECL(void flockfile, [(FILE *stream)])
-    PSI_DECL(FILE *fmemopen, [(void *buf, size_t len, char *mode)])
-    PSI_DECL(FILE *fopen, [(char *path, char *mode)])
-    PSI_DECL(int fputc, [(int c, FILE *stream)])
-    PSI_DECL(int fputs, [(char *s, FILE *stream)])
-    PSI_DECL(size_t fread, [(void *buf, size_t len, size_t n, FILE *stream)])
-    PSI_DECL(FILE *freopen, [(char *path, char *mode, FILE *stream)])
-    PSI_DECL(int fseek, [(FILE *stream, long offset, int whence)])
-    PSI_DECL(int fseeko, [(FILE *stream, off_t offset, int whence)])
-    PSI_DECL(int fsetpos, [(FILE *stream, fpos_t *pos)])
-    PSI_DECL(long ftell, [(FILE *stream)])
-    PSI_DECL(off_t ftello, [(FILE *stream)])
-    PSI_DECL(int ftrylockfile, [(FILE *stream)])
-    PSI_DECL(void funlockfile, [(FILE *stream)])
-    PSI_DECL(size_t fwrite, [(void *buf, size_t len, size_t n, FILE *stream)])
-    PSI_DECL(int getc, [(FILE *stream)])
-    PSI_DECL(int getchar, [(void)])
-    PSI_DECL(int getc_unlocked, [(FILE *stream)])
-    PSI_DECL(int getchar_unlocked, [(void)])
-    PSI_DECL(ssize_t getdelim, [(char **lineptr, size_t *n, int delim, FILE *stream)])
-    PSI_DECL(ssize_t getline, [(char **lineptr, size_t *n, FILE *stream)])
-    PSI_DECL(char *gets, [(char *buf)])
-    PSI_DECL(FILE *open_memstream, [(char **ptr, size_t *sizeloc)])
-    PSI_DECL(int pclose, [(FILE *stream)])
-    PSI_DECL(void perror, [(char *s)])
-    PSI_DECL(FILE *popen, [(char *command, char *type)])
-    PSI_DECL(int putc, [(int c, FILE *stream)])
-    PSI_DECL(int putchar, [(int c)])
-    PSI_DECL(int putc_unlocked, [(int c, FILE *stream)])
-    PSI_DECL(int putchar_unlocked, [(int c)])
-    PSI_DECL(int puts, [(char *s)])
-    PSI_DECL(int remove, [(char *path)])
-    PSI_DECL(int rename, [(char *old, char *new)])
-    PSI_DECL(int renameat, [(int oldfd, char *oldpath, int newfd, char *newpath)])
-    PSI_DECL(void rewind, [(FILE *stream)])
-    PSI_DECL(void setbuf, [(FILE *stream, char *buf)])
-    PSI_DECL(int setvbuf, [(FILE *stream, char *buf, int mode, size_t size)])
-    PSI_DECL(char *tempnam, [(char *dir, char *prefix)])
-    PSI_DECL(FILE *tmpfile, [(void)])
-    PSI_DECL(char *tmpnam, [(char *s)])
-    PSI_DECL(int ungetc, [(int c, FILE *stream)])
-
-])
diff --git a/config.psi_struct.m4 b/config.psi_struct.m4
deleted file mode 100644 (file)
index 1d6f0c4..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-PSI_STRUCTS=
-# add_struct(name, size, members)
-add_struct() {
-    local members="$3"
-    if test -z "$members"; then
-        members="{0}"
-    else
-        members="$members, {0}"
-    fi
-    PSI_STRUCTS="{\"$1\", $2, {$members}}, $PSI_STRUCTS"
-}
-
-AC_DEFUN(PSI_STRUCT_MEMBER, [
-       m4_define([member_name], PSI_VAR_NAME($2))
-       m4_define([member_type], PSI_TYPE_NAME($2))
-       AC_CHECK_SIZEOF(AS_TR_SH($1)[_]member_name, [], PSI_INCLUDES
-               [#define ]AS_TR_SH($1)[_]member_name (($1 *)0)->member_name
-       )
-       PSI_CHECK_OFFSETOF($1, member_name)
-       m4_define([pointer_level], m4_len(m4_bpatsubst($2, [[^*]])))
-       m4_define([array_size], m4_bregexp($2, [\[\([0-9]+\)\]], [\1]))
-       ifelse(array_size, [],
-               [m4_define([array_size], 0)],
-               [m4_define([pointer_level], m4_incr(pointer_level))]
-       )
-       m4_define([member_size], PSI_TYPE_SIZE(member_type, pointer_level, array_size))
-       if test -n "$psi_struct_members"; then
-               psi_struct_members="$psi_struct_members, "
-       fi
-       psi_struct_members="[$psi_struct_members{]PSI_TYPE_PAIR(member_type)[, \"]member_name[\", $]AS_TR_SH([ac_cv_offsetof_]$1[_]member_name)[, ]member_size, pointer_level, array_size[}]"
-])
-
-AC_DEFUN(PSI_STRUCT, [
-       AC_CHECK_SIZEOF($1, [], PSI_INCLUDES)
-       psi_struct_members=
-       ifelse([$2],[],[],[m4_map_args_sep([PSI_STRUCT_MEMBER($1,], [)], [], $2)])
-       add_struct "$1" $AS_TR_SH([ac_cv_sizeof_]$1) "$psi_struct_members"
-])
diff --git a/config.psi_sys_types.m4 b/config.psi_sys_types.m4
deleted file mode 100644 (file)
index 352d8b5..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-AC_DEFUN(PSI_CHECK_SYS_TYPES, [
-       AC_CHECK_HEADERS(sys/types.h)
-
-       PSI_TYPE(blkcnt_t, int)
-       PSI_TYPE(blksize_t, int)
-       PSI_TYPE(clock_t, int)
-       PSI_TYPE(clockid_t, int)
-       PSI_TYPE(dev_t, int)
-       PSI_TYPE(fsblkcnt_t, uint)
-       PSI_TYPE(fsfilcnt_t, uint)
-       PSI_TYPE(gid_t, int)
-       PSI_TYPE(id_t, int)
-       PSI_TYPE(ino_t, uint)
-       PSI_TYPE(key_t, int)
-       PSI_TYPE(mode_t, int)
-       PSI_TYPE(nlink_t, int)
-       PSI_TYPE(off_t, int)
-       PSI_TYPE(pid_t, int)
-       PSI_TYPE(ssize_t, int)
-       PSI_TYPE(suseconds_t, int)
-       PSI_TYPE(time_t, int)
-       PSI_TYPE(timer_t, int)
-       PSI_TYPE(uid_t, int)
-])
diff --git a/config.psi_type.m4 b/config.psi_type.m4
deleted file mode 100644 (file)
index 4e9aa16..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-# psi_type_pair(type, size)
-psi_type_pair() {
-       local psi_type_name=`tr -cd A-Za-z0-9_ <<<$1`
-       local psi_type_lower=`tr A-Z a-z <<<$psi_type_name`
-       case $psi_type_lower in
-       int*|uint*)
-               local psi_type_upper=`tr a-z A-Z <<<$psi_type_name`
-               local psi_type_bits=`expr $2 \* 8`
-               echo psi_type_bits=$psi_type_bits "expr $2 \* 8" "$@" >&2
-               echo "PSI_T_${psi_type_upper}${psi_type_bits}, \"${psi_type_lower}${psi_type_bits}_t\""
-               eval AS_TR_SH([psi_standard_type_]$1)="${psi_type_lower}${psi_type_bits}_t"
-               ;;
-       struct*)
-               echo "PSI_T_STRUCT, \"$2\""
-               ;;
-       void)
-               echo "PSI_T_VOID, \"void\""
-               ;;
-       *)
-               echo "PSI_T_NAME, \"$psi_type_name\""
-               ;;
-       esac
-}
-
-PSI_TYPES=""
-dnl PSI_TYPE(type name, basic type, includes)
-AC_DEFUN(PSI_TYPE, [
-       ifdef(AS_TR_CPP(AC_TYPE_$1), AS_TR_CPP(AC_TYPE_$1))
-       AC_CHECK_SIZEOF($1, [], PSI_INCLUDES)
-       psi_basic_type=$2
-       case $psi_basic_type in
-       int)
-               AX_CHECK_SIGN($1, :, [
-                       psi_basic_type=uint
-               ], $psi_header)
-               ;;
-       sint)
-               psi_basic_type=int
-               ;;
-       esac
-       if test "$2" && test "$AS_TR_SH([ac_cv_sizeof_]$1)" -gt 0; then
-               AS_TR_SH(psi_basic_type_$1)=$psi_basic_type
-               PSI_TYPES="{`psi_type_pair $psi_basic_type $AS_TR_SH([ac_cv_sizeof_]$1)`, \"$1\"}, $PSI_TYPES"
-       fi
-])
-
-dnl unsigned char* buf[16] -> char
-AC_DEFUN(PSI_TYPE_NAME, [m4_bregexp([$1], [\(\(struct \)?[^ ]+\)[ *]+[^ ]+$], [\1])])
-dnl unsigned char* buf[16] -> buf
-AC_DEFUN(PSI_VAR_NAME, [m4_bregexp(m4_bregexp([$1], [[^ ]+$], [\&]), [\w+], [\&])])
-dnl PSI_TYPE_SIZE(type, pointer level, array size)
-AC_DEFUN(PSI_TYPE_SIZE, [ifelse(
-       [$3], 0,
-               [ifelse([$2], 0, $AS_TR_SH([ac_cv_sizeof_]$1), $ac_cv_sizeof_void_p)],
-               [ifelse([$2], 1, [`expr $3 \* $AS_TR_SH([ac_cv_sizeof_]$1)`], $ac_cv_sizeof_void_p)]
-)])
-dnl PSI_TYPE_BITS(type)
-AC_DEFUN(PSI_TYPE_BITS, [`expr 8 \* $AS_TR_SH([ac_cv_sizeof_]$1)`])
-
-AC_DEFUN(PSI_TYPE_PAIR, [m4_case(m4_bregexp([$1], [^\w+], [\&]),
-       [void], [PSI_T_VOID, \"void\"],
-       [struct], [PSI_T_STRUCT, \"m4_bregexp($1, [^struct \(\w+\)], [\1])\"],
-       [PSI_T_NAME, \"$1\"]
-)])
-
-AC_DEFUN(PSI_CHECK_STD_TYPES, [
-       AC_CHECK_HEADERS(stdint.h)
-
-       AC_TYPE_INT8_T
-       AC_CHECK_SIZEOF(int8_t)
-       AC_CHECK_ALIGNOF(int8_t)
-       AC_TYPE_UINT8_T
-       AC_CHECK_SIZEOF(uint8_t)
-       AC_CHECK_ALIGNOF(uint8_t)
-       AC_TYPE_INT16_T
-       AC_CHECK_SIZEOF(int16_t)
-       AC_CHECK_ALIGNOF(int16_t)
-       AC_TYPE_UINT16_T
-       AC_CHECK_SIZEOF(uint16_t)
-       AC_CHECK_ALIGNOF(uint16_t)
-       AC_TYPE_INT32_T
-       AC_CHECK_SIZEOF(int32_t)
-       AC_CHECK_ALIGNOF(int32_t)
-       AC_TYPE_UINT32_T
-       AC_CHECK_SIZEOF(uint32_t)
-       AC_CHECK_ALIGNOF(uint32_t)
-       AC_TYPE_INT64_T
-       AC_CHECK_SIZEOF(int64_t)
-       AC_CHECK_ALIGNOF(int64_t)
-       AC_TYPE_UINT64_T
-       AC_CHECK_SIZEOF(uint64_t)
-       AC_CHECK_ALIGNOF(uint64_t)
-
-       PSI_TYPE(float)
-       AC_CHECK_ALIGNOF(float)
-       PSI_TYPE(double)
-       AC_CHECK_ALIGNOF(double)
-       PSI_TYPE(void *)
-       AC_CHECK_ALIGNOF(void *)
-
-       PSI_TYPE(char, int)
-       PSI_TYPE(unsigned char, uint)
-       PSI_TYPE(short, int)
-       PSI_TYPE(unsigned short, uint)
-       PSI_TYPE(int, int)
-       PSI_TYPE(unsigned int, uint)
-       PSI_TYPE(unsigned, uint)
-       PSI_TYPE(long, int)
-       PSI_TYPE(unsigned long, uint)
-])
diff --git a/m4/ax_check_sign.m4 b/m4/ax_check_sign.m4
new file mode 100644 (file)
index 0000000..244865f
--- /dev/null
@@ -0,0 +1,14 @@
+AC_DEFUN([AX_CHECK_SIGN], [
+       typename=`echo $1 | sed "s/@<:@^a-zA-Z0-9_@:>@/_/g"`
+       AC_CACHE_CHECK([whether $1 is signed], ax_cv_decl_${typename}_signed, [
+                       AC_TRY_COMPILE([$4],
+                                       [ int foo @<:@ 1 - 2 * !((($1) -1) < 0) @:>@ ],
+                                       [ eval "ax_cv_decl_${typename}_signed=\"yes\"" ],
+                                       [ eval "ax_cv_decl_${typename}_signed=\"no\"" ])])
+       symbolname=`echo $1 | sed "s/@<:@^a-zA-Z0-9_@:>@/_/g" | tr "a-z" "A-Z"`
+       if eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"yes\""; then
+                       $2
+       elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then
+                       $3
+       fi
+])
diff --git a/m4/errno.m4 b/m4/errno.m4
new file mode 100644 (file)
index 0000000..99311b7
--- /dev/null
@@ -0,0 +1,87 @@
+AC_DEFUN(PSI_CHECK_ERRNO, [
+    AC_CHECK_HEADERS(errno.h)
+    
+    PSI_EXTVAR(int errno)
+    
+    PSI_CONST(E2BIG, int)
+    PSI_CONST(EACCES, int)
+    PSI_CONST(EADDRINUSE, int)
+    PSI_CONST(EADDRNOTAVAIL, int)
+    PSI_CONST(EAFNOSUPPORT, int)
+    PSI_CONST(EAGAIN, int)
+    PSI_CONST(EALREADY, int)
+    PSI_CONST(EBADF, int)
+    PSI_CONST(EBADMSG, int)
+    PSI_CONST(EBUSY, int)
+    PSI_CONST(ECANCELED, int)
+    PSI_CONST(ECHILD, int)
+    PSI_CONST(ECONNABORTED, int)
+    PSI_CONST(ECONNREFUSED, int)
+    PSI_CONST(ECONNRESET, int)
+    PSI_CONST(EDEADLK, int)
+    PSI_CONST(EDESTADDRREQ, int)
+    PSI_CONST(EDOM, int)
+    PSI_CONST(EDQUOT, int)
+    PSI_CONST(EEXIST, int)
+    PSI_CONST(EFAULT, int)
+    PSI_CONST(EFBIG, int)
+    PSI_CONST(EHOSTUNREACH, int)
+    PSI_CONST(EIDRM, int)
+    PSI_CONST(EILSEQ, int)
+    PSI_CONST(EINPROGRESS, int)
+    PSI_CONST(EINTR, int)
+    PSI_CONST(EINVAL, int)
+    PSI_CONST(EIO, int)
+    PSI_CONST(EISCONN, int)
+    PSI_CONST(EISDIR, int)
+    PSI_CONST(ELOOP, int)
+    PSI_CONST(EMFILE, int)
+    PSI_CONST(EMLINK, int)
+    PSI_CONST(EMSGSIZE, int)
+    PSI_CONST(EMULTIHOP, int)
+    PSI_CONST(ENAMETOOLONG, int)
+    PSI_CONST(ENETDOWN, int)
+    PSI_CONST(ENETRESET, int)
+    PSI_CONST(ENETUNREACH, int)
+    PSI_CONST(ENFILE, int)
+    PSI_CONST(ENOBUFS, int)
+    PSI_CONST(ENODATA, int)
+    PSI_CONST(ENODEV, int)
+    PSI_CONST(ENOENT, int)
+    PSI_CONST(ENOEXEC, int)
+    PSI_CONST(ENOLCK, int)
+    PSI_CONST(ENOLINK, int)
+    PSI_CONST(ENOMEM, int)
+    PSI_CONST(ENOMSG, int)
+    PSI_CONST(ENOPROTOOPT, int)
+    PSI_CONST(ENOSPC, int)
+    PSI_CONST(ENOSR, int)
+    PSI_CONST(ENOSTR, int)
+    PSI_CONST(ENOSYS, int)
+    PSI_CONST(ENOTCONN, int)
+    PSI_CONST(ENOTDIR, int)
+    PSI_CONST(ENOTEMPTY, int)
+    PSI_CONST(ENOTRECOVERABLE, int)
+    PSI_CONST(ENOTSOCK, int)
+    PSI_CONST(ENOTSUP, int)
+    PSI_CONST(ENOTTY, int)
+    PSI_CONST(ENXIO, int)
+    PSI_CONST(EOPNOTSUPP, int)
+    PSI_CONST(EOVERFLOW, int)
+    PSI_CONST(EOWNERDEAD, int)
+    PSI_CONST(EPERM, int)
+    PSI_CONST(EPIPE, int)
+    PSI_CONST(EPROTO, int)
+    PSI_CONST(EPROTONOSUPPORT, int)
+    PSI_CONST(EPROTOTYPE, int)
+    PSI_CONST(ERANGE, int)
+    PSI_CONST(EROFS, int)
+    PSI_CONST(ESPIPE, int)
+    PSI_CONST(ESRCH, int)
+    PSI_CONST(ESTALE, int)
+    PSI_CONST(ETIME, int)
+    PSI_CONST(ETIMEDOUT, int)
+    PSI_CONST(ETXTBSY, int)
+    PSI_CONST(EWOULDBLOCK, int)
+    PSI_CONST(EXDEV, int)
+])
diff --git a/m4/glob.m4 b/m4/glob.m4
new file mode 100644 (file)
index 0000000..fbb036e
--- /dev/null
@@ -0,0 +1,29 @@
+AC_DEFUN(PSI_CHECK_GLOB, [
+    AC_CHECK_HEADERS(glob.h)
+    PSI_STRUCT(glob_t, [
+        size_t gl_pathc,
+        int gl_matchc,
+        size_t gl_offs,
+        int gl_flags,
+        char **gl_pathv])
+
+    PSI_DECL(int glob, [(char *path, int flags, void *err, glob_t *buf)])
+    PSI_DECL(void globfree, [(glob_t *buf)])
+
+    PSI_CONST(GLOB_APPEND, int)
+    PSI_CONST(GLOB_BRACE, int)
+    PSI_CONST(GLOB_DOOFFS, int)
+    PSI_CONST(GLOB_ERR, int)
+    PSI_CONST(GLOB_MARK, int)
+    PSI_CONST(GLOB_NOCHECK, int)
+    PSI_CONST(GLOB_NOESCAPE, int)
+    PSI_CONST(GLOB_NOMAGIC, int)
+    PSI_CONST(GLOB_NOSORT, int)
+    PSI_CONST(GLOB_ONLYDIR, int)
+    PSI_CONST(GLOB_PERIOD, int)
+    PSI_CONST(GLOB_TILDE, int)
+    PSI_CONST(GLOB_TILDE_CHECK, int)
+    PSI_CONST(GLOB_ABORTED, int)
+    PSI_CONST(GLOB_NOMATCH, int)
+    PSI_CONST(GLOB_NOSPACE, int)
+])
diff --git a/m4/psi.m4 b/m4/psi.m4
new file mode 100644 (file)
index 0000000..ea8d7fb
--- /dev/null
+++ b/m4/psi.m4
@@ -0,0 +1,137 @@
+PSI_TYPES=
+PSI_STRUCTS=
+PSI_CONSTS=
+PSI_REDIRS=
+PSI_MACROS=
+PSI_DECLS=
+
+psi_includes() {
+       local have_
+       have_=`AS_ECHO($ac_header) | $as_tr_cpp`
+       cat <<EOF
+#ifdef HAVE_$have_
+# include <$ac_header>
+#endif
+EOF
+}
+
+AC_DEFUN(PSI_INCLUDES, [AC_INCLUDES_DEFAULT()
+`psi_includes`])
+
+AC_DEFUN(PSI_LEMON, [
+       AC_ARG_VAR(LEMON, The lemon parser generator of the SQLite project)
+       AC_PATH_PROG(LEMON, lemon, ./lemon)
+       PHP_SUBST(LEMON)
+])
+
+AC_DEFUN([PSI_PKG_CONFIG], [
+       if test -z "$PKG_CONFIG"
+       then
+               AC_PATH_PROG(PKG_CONFIG, pkg-config, false)
+       fi
+       export PKG_CONFIG_PATH="$PHP_PSI_LIBFFI/lib/pkgconfig:$PHP_PSI_LIBJIT/lib/pkgconfig:$PKG_CONFIG_PATH"
+])
+
+AC_DEFUN(PSI_CHECK_OFFSETOF, [
+       _AC_CACHE_CHECK_INT(
+               [offset of $2 in $1],
+               [AS_TR_SH([ac_cv_offsetof_$1_$2])],
+               [(long int) (offsetof ($1, $2))],
+               [PSI_INCLUDES],
+               [AC_MSG_FAILURE([cannot compute offsetof ($1, $2)])]
+       )
+       AC_DEFINE_UNQUOTED(
+               AS_TR_CPP(offsetof_$1_$2),
+               $AS_TR_SH([ac_cv_offsetof_$1_$2]),
+               [The offset of `$2' in `$1', as computed by offsetof.]
+       )
+])
+
+AC_DEFUN(PSI_CHECK_LIBJIT, [
+       PHP_ARG_WITH(psi-libjit, where to find libjit,
+       [  --with-psi-libjit=DIR   PSI: path to libjit], [ ], [ ])
+       AC_CACHE_CHECK(for libjit, psi_cv_libjit_dir, [
+               for psi_cv_libjit_dir in $PHP_PSI_LIBJIT {/usr{,/local},/opt}{,/libjit}
+               do
+                       if test -e $psi_cv_libjit_dir/include/jit/jit.h
+                       then
+                               break
+                       fi
+                       psi_cv_libjit_dir=
+               done
+       ])
+       if test -n "$psi_cv_libjit_dir"
+       then
+               PHP_ADD_INCLUDE($psi_cv_libjit_dir/include)
+               PHP_ADD_LIBRARY_WITH_PATH(jit, $psi_cv_libjit_dir/$PHP_LIBDIR, PSI_SHARED_LIBADD)
+               AC_DEFINE(HAVE_LIBJIT, 1, Have libjit)
+       else
+               AC_MSG_WARN([Could not find libjit, please provide the base install path])
+       fi
+])
+
+AC_DEFUN(PSI_CHECK_LIBFFI, [
+       AC_REQUIRE([PSI_PKG_CONFIG])dnl
+       PHP_ARG_WITH(psi-libffi, where to find libffi,
+       [  --with-psi-libffi=DIR   PSI: path to libffi], [ ], [ ])
+
+       AC_CACHE_CHECK(for libffi through pkg-config, psi_cv_libffi, [
+       if $PKG_CONFIG --exists libffi
+       then
+               psi_cv_libffi=true
+       else
+               psi_cv_libffi=false
+       fi])
+       if $psi_cv_libffi
+       then
+               AC_MSG_CHECKING(for libffi)
+               psi_cv_libffi_dir=`$PKG_CONFIG --variable=prefix libffi`
+               AC_MSG_RESULT($psi_cv_libffi_dir)
+               PHP_EVAL_INCLINE(`$PKG_CONFIG --cflags libffi`)
+               PHP_EVAL_LIBLINE(`$PKG_CONFIG --libs libffi`, PSI_SHARED_LIBADD)
+               AC_DEFINE(HAVE_LIBFFI, 1, Have libffi)
+       else
+               AC_CACHE_CHECK(for libffi, psi_cv_libffi_dir, [
+               for psi_cv_libffi_dir in $PHP_PSI_LIBFFI {/usr{,/local},/opt}{,/libffi}
+               do
+                       if test -e $psi_cv_libffi_dir/include/ffi/ffi.h
+                       then
+                               break
+                       fi
+                       psi_cv_libffi_dir=
+               done])
+               if test -n "$psi_cv_libffi_dir"
+               then
+                       PHP_ADD_INCLUDE($psi_cv_libffi_dir/include/ffi)
+                       PHP_ADD_LIBRARY_WITH_PATH(ffi, $psi_cv_libffi_dir/$PHP_LIBDIR, PSI_SHARED_LIBADD)
+                       AC_DEFINE(HAVE_LIBFFI, 1, Have libffi)
+               else
+                       AC_MSG_WARN([Could not find libffi, please provide the base install path])
+               fi
+       fi
+       PHP_CHECK_LIBRARY(ffi, ffi_closure_alloc, [
+               PHP_CHECK_LIBRARY(ffi, ffi_prep_closure_loc, [
+                       AC_DEFINE(PSI_HAVE_FFI_PREP_CLOSURE_LOC, 1, [ ])
+               ], [], -L$psi_cv_libffi_dir/$PHP_LIBDIR)
+               AC_DEFINE(PSI_HAVE_FFI_CLOSURE_ALLOC, 1, [ ])
+       ], [
+               PHP_CHECK_LIBRARY(ffi, ffi_prep_closure, [
+                       AC_CHECK_HEADERS(sys/mman.h)
+                       PHP_CHECK_FUNC(mmap)
+                       AC_DEFINE(PSI_HAVE_FFI_PREP_CLOSURE, 1, [ ])
+               ], [
+               ], -L$psi_cv_libffi_dir/$PHP_LIBDIR)
+       ], -L$psi_cv_libffi_dir/$PHP_LIBDIR)
+])
+
+dnl PSI_COMPUTE_STR(variable, string or expression)
+AC_DEFUN(PSI_COMPUTE_STR, [
+       AC_TRY_RUN(
+               PSI_INCLUDES
+               [int main() {
+                       return EOF == fputs($2, fopen("conftest.out", "w"));
+               }
+       ], [
+               eval $1=\\\"`cat conftest.out`\\\"
+       ])
+])
diff --git a/m4/psi_const.m4 b/m4/psi_const.m4
new file mode 100644 (file)
index 0000000..cea747e
--- /dev/null
@@ -0,0 +1,39 @@
+# add_str_const(name, value)
+add_str_const() {
+       PSI_CONSTS="{PSI_T_STRING, \"string\", \"psi\\\\$1\", $2, PSI_T_QUOTED_STRING}, $PSI_CONSTS"
+}
+# add_int_const(name, value)
+add_int_const() {
+       PSI_CONSTS="{PSI_T_INT, \"int\", \"psi\\\\$1\", \"$2\", PSI_T_NUMBER}, $PSI_CONSTS"
+}
+dnl PSI_CONST(const name, type)
+AC_DEFUN(PSI_CONST, [
+       AC_CACHE_CHECK(value of $1, psi_cv_const_$1, [
+               psi_const_val=
+               case $2 in
+               str*)
+                       if test "$cross_compiling" = "yes"
+                       then
+                               AC_TRY_CPP(PSI_INCLUDES $1, psi_const_val=`eval "$ac_try|tail -n1"`, psi_const_val=)
+                       else
+                               PSI_COMPUTE_STR(psi_const_val, $1, PSI_INCLUDES)
+                       fi
+                       ;;
+               int)
+                       AC_COMPUTE_INT(psi_const_val, $1, PSI_INCLUDES)
+                       ;;
+               esac
+               psi_cv_const_$1=$psi_const_val
+       ])
+       if test "$psi_cv_const_$1"
+       then
+               case $2 in
+               str*)
+                       add_str_const "$1" "$psi_cv_const_$1"
+                       ;;
+               int)
+                       add_int_const "$1" "$psi_cv_const_$1"
+                       ;;
+               esac
+       fi
+])
diff --git a/m4/psi_decl.m4 b/m4/psi_decl.m4
new file mode 100644 (file)
index 0000000..9b2d3eb
--- /dev/null
@@ -0,0 +1,73 @@
+AC_DEFUN(PSI_REDIR, [psi_symbol=ifelse([$2],[],[$1],[$2])
+       PSI_REDIRS="{\"$1\", (void(*)(void))$psi_symbol}, $PSI_REDIRS"])
+
+AC_DEFUN(PSI_FUNC_LIBC_MAIN, [
+       AC_REQUIRE([AC_PROG_NM])
+       AC_REQUIRE([AC_PROG_AWK])
+       AC_CACHE_CHECK(for libc start main symbol, psi_cv_libc_main, [
+               psi_libc_main=
+               AC_TRY_LINK(PSI_INCLUDES, [(void)0;], [
+                       psi_libc_main=`$NM -g conftest$ac_exeext | $AWK -F" *|@" '/^\s+U / {print$[]3; exit}'`
+               ])
+               psi_cv_libc_main=$psi_libc_main
+       ])
+])
+
+dnl PSI_FUNC(fn, action-if-yes, action-if-no)
+AC_DEFUN(PSI_FUNC, [
+       AC_REQUIRE([PSI_FUNC_LIBC_MAIN])
+       psi_symbol=$1
+       AC_CACHE_CHECK(for $1, psi_cv_fn_$1, [
+               psi_symbol_redirect=
+               AC_TRY_LINK(PSI_INCLUDES, [
+                       void (*fn)(void) = (void (*)(void)) $psi_symbol;
+               ], [
+                       psi_symbol_redirect=`$NM -g conftest$ac_exeext | $AWK -F" *|@" '/^\s+U '$psi_cv_libc_main'/ {next} /^\s+U / {print$[]3; exit}'`
+               ])
+               psi_cv_fn_$1=$psi_symbol_redirect
+       ])
+       case "$psi_cv_fn_$1" in
+       "")
+               $3
+               ;;
+       "$psi_symbol"|"_$psi_symbol")
+               $2
+               ;;
+       *)
+               $2
+               PSI_REDIR($1)
+               ;;
+       esac
+])
+
+AC_DEFUN(PSI_DECL_ARG, [
+    m4_define([member_name], PSI_VAR_NAME($1))
+    m4_define([member_type], PSI_VAR_TYPE($1))
+    m4_define([pointer_level], m4_len(m4_bpatsubst([$1], [[^*]])))
+       m4_define([array_size], [m4_bregexp([$1], [@<:@\([0-9]+\)@:>@], [\1])])
+       ifelse(array_size, [],
+               [m4_define([array_size], 0)],
+               [m4_define([pointer_level], m4_incr(pointer_level))]
+       )
+    if test -n "$psi_decl_args"; then
+        psi_decl_args="$psi_decl_args, "
+    fi
+    psi_decl_args="[$psi_decl_args{]PSI_TYPE_PAIR(member_type)[, \"]member_name[\",] pointer_level, array_size[}]"
+])
+
+dnl PSI_DECL(type func, args)
+AC_DEFUN(PSI_DECL, [
+       psi_decl_args=
+       PSI_DECL_ARG($1)
+       m4_case([$2],
+               [(void)], [],
+               [()], [],
+               [m4_map_args_sep([PSI_DECL_ARG(], [)], [], [m4_bregexp([$2], [(\(.*\))], [\1])])])
+       PSI_FUNC(PSI_VAR_NAME($1), [
+               PSI_DECLS="$psi_decl_args, {0}, $PSI_DECLS"
+       ], [
+               PSI_MACRO($1, $2, [
+                       PSI_DECLS="$psi_decl_args, {0}, $PSI_DECLS"
+               ])
+       ])
+])
diff --git a/m4/psi_macro.m4 b/m4/psi_macro.m4
new file mode 100644 (file)
index 0000000..439098f
--- /dev/null
@@ -0,0 +1,26 @@
+dnl PSI_MACRO(macro, decl args, action-if-true)
+AC_DEFUN(PSI_MACRO, [
+       AC_CHECK_DECL(PSI_VAR_NAME($1)$2, [
+               $3
+               macro_type=PSI_VAR_TYPE($1)
+               macro_name=PSI_VAR_NAME($1)
+               ifelse([$2], [], [
+                       macro_decl="()"
+                       macro_call=""
+               ], [
+                       macro_decl="$2"
+                       macro_call="(m4_map_args_sep([PSI_VAR_NAME(], [)], [, ], m4_bregexp($2, [(\(.*\))], [\1])))"
+               ])
+               ifelse(PSI_VAR_TYPE($1), [void], [
+                       macro_body="$macro_name$macro_call;"
+               ], [
+                       macro_body="return $macro_name$macro_call;"
+               ])
+               psi_macro="$macro_type psi_macro_$macro_name$macro_decl { $macro_body }"
+               PSI_MACROS="$PSI_MACROS $psi_macro"
+               PSI_REDIR($macro_name, psi_macro_$macro_name)
+       ], [], PSI_INCLUDES)
+])
+
+dnl PSI_EXTVAR(type var)
+AC_DEFUN(PSI_EXTVAR, [PSI_MACRO($1)])
diff --git a/m4/psi_struct.m4 b/m4/psi_struct.m4
new file mode 100644 (file)
index 0000000..f0d273e
--- /dev/null
@@ -0,0 +1,30 @@
+AC_DEFUN(PSI_STRUCT_MEMBER, [
+       m4_define([member_name], PSI_VAR_NAME($2))
+       m4_define([member_type], PSI_VAR_TYPE($2))
+       AC_CHECK_SIZEOF(AS_TR_SH($1)[_]member_name, [], PSI_INCLUDES
+               [#define ]AS_TR_SH($1)[_]member_name (($1 *)0)->member_name
+       )
+       if test -n "$AS_TR_SH([ac_cv_sizeof_$1][_]member_name)" \
+       && test "$AS_TR_SH([ac_cv_sizeof_$1][_]member_name)" -gt 0; then
+               PSI_CHECK_OFFSETOF($1, member_name)
+               m4_define([pointer_level], m4_len(m4_bpatsubst([$2], [[^*]])))
+               m4_define([array_size], [m4_bregexp([$2], [@<:@\([0-9]+\)@:>@], [\1])])
+               ifelse(array_size, [],
+                       [m4_define([array_size], 0)],
+                       [m4_define([pointer_level], m4_incr(pointer_level))]
+               )
+               m4_define([member_size], PSI_TYPE_SIZE(member_type, pointer_level, array_size))
+               psi_struct_members="[$psi_struct_members, {]PSI_TYPE_PAIR(member_type)[, \"]member_name[\", $]AS_TR_SH([ac_cv_offsetof_]$1[_]member_name)[, ]member_size, pointer_level, array_size[}]"
+       fi
+])
+
+AC_DEFUN(PSI_STRUCT, [
+       AC_CHECK_SIZEOF($1, [], PSI_INCLUDES)
+       psi_struct_name=m4_bregexp([$1], [^\(struct \)?\(\w+\)], [\2])
+       psi_struct_members="{PSI_T_STRUCT, \"struct\", \"$psi_struct_name\", 0, $AS_TR_SH([ac_cv_sizeof_]$1), 0, 0}"
+       ifelse([$2],,,[m4_map_args_sep([PSI_STRUCT_MEMBER($1,], [)], [], $2)])
+       PSI_STRUCTS="$psi_struct_members, {0}, $PSI_STRUCTS"
+       if test "$1" = "$psi_struct_name"; then
+               PSI_TYPES="{PSI_T_STRUCT, \"$1\", \"$1\"}, $PSI_TYPES"
+       fi
+])
diff --git a/m4/psi_type.m4 b/m4/psi_type.m4
new file mode 100644 (file)
index 0000000..2cd9191
--- /dev/null
@@ -0,0 +1,107 @@
+# psi_type_pair(type, size)
+psi_type_pair() {
+       local psi_type_name=`tr -cd A-Za-z0-9_ <<<$1`
+       local psi_type_lower=`tr A-Z a-z <<<$psi_type_name`
+       case $psi_type_lower in
+       int*|uint*)
+               local psi_type_upper=`tr a-z A-Z <<<$psi_type_name`
+               local psi_type_bits=`expr $2 \* 8`
+               echo "PSI_T_${psi_type_upper}${psi_type_bits}, \"${psi_type_lower}${psi_type_bits}_t\""
+               eval AS_TR_SH([psi_standard_type_]$1)="${psi_type_lower}${psi_type_bits}_t"
+               ;;
+       struct*)
+               echo "PSI_T_STRUCT, \"$2\""
+               ;;
+       void)
+               echo "PSI_T_VOID, \"void\""
+               ;;
+       *)
+               echo "PSI_T_NAME, \"$psi_type_name\""
+               ;;
+       esac
+}
+
+dnl PSI_TYPE(type name, basic type, includes)
+AC_DEFUN(PSI_TYPE, [
+       ifdef(AS_TR_CPP(AC_TYPE_$1), AS_TR_CPP(AC_TYPE_$1))
+       AC_CHECK_SIZEOF($1, [], PSI_INCLUDES)
+       psi_basic_type=$2
+       case $psi_basic_type in
+       int)
+               AX_CHECK_SIGN($1, :, [
+                       psi_basic_type=uint
+               ], $psi_header)
+               ;;
+       sint)
+               psi_basic_type=int
+               ;;
+       esac
+       if test "$2" && test "$AS_TR_SH([ac_cv_sizeof_]$1)" -gt 0; then
+               AS_TR_SH(psi_basic_type_$1)=$psi_basic_type
+               PSI_TYPES="{`psi_type_pair $psi_basic_type $AS_TR_SH([ac_cv_sizeof_]$1)`, \"$1\"}, $PSI_TYPES"
+       fi
+])
+
+dnl unsigned char* buf[16] -> char
+AC_DEFUN(PSI_VAR_TYPE, [m4_bregexp([$1], [\(\(struct \)?[^ ]+\)[ *]+[^ ]+$], [\1])])
+dnl unsigned char* buf[16] -> buf
+AC_DEFUN(PSI_VAR_NAME, [m4_bregexp(m4_bregexp([$1], [\([^ ]+\)$], [\1]), [\w+], [\&])])
+dnl PSI_TYPE_SIZE(type, pointer level, array size)
+AC_DEFUN(PSI_TYPE_SIZE, [ifelse(
+       [$3], 0,
+               [ifelse([$2], 0, $AS_TR_SH([ac_cv_sizeof_]$1), $ac_cv_sizeof_void_p)],
+               [ifelse([$2], 1, [`expr $3 \* $AS_TR_SH([ac_cv_sizeof_]$1)`], $ac_cv_sizeof_void_p)]
+)])
+dnl PSI_TYPE_BITS(type)
+AC_DEFUN(PSI_TYPE_BITS, [`expr 8 \* $AS_TR_SH([ac_cv_sizeof_]$1)`])
+
+AC_DEFUN(PSI_TYPE_PAIR, [m4_case(m4_bregexp([$1], [^\w+], [\&]),
+       [void], [PSI_T_VOID, \"void\"],
+       [struct], [PSI_T_STRUCT, \"m4_bregexp([$1], [^struct \(\w+\)], [\1])\"],
+       [PSI_T_NAME, \"$1\"])])
+
+AC_DEFUN(PSI_CHECK_STD_TYPES, [
+       AC_CHECK_HEADERS(stdint.h)
+
+       AC_TYPE_INT8_T
+       AC_CHECK_SIZEOF(int8_t)
+       AC_CHECK_ALIGNOF(int8_t)
+       AC_TYPE_UINT8_T
+       AC_CHECK_SIZEOF(uint8_t)
+       AC_CHECK_ALIGNOF(uint8_t)
+       AC_TYPE_INT16_T
+       AC_CHECK_SIZEOF(int16_t)
+       AC_CHECK_ALIGNOF(int16_t)
+       AC_TYPE_UINT16_T
+       AC_CHECK_SIZEOF(uint16_t)
+       AC_CHECK_ALIGNOF(uint16_t)
+       AC_TYPE_INT32_T
+       AC_CHECK_SIZEOF(int32_t)
+       AC_CHECK_ALIGNOF(int32_t)
+       AC_TYPE_UINT32_T
+       AC_CHECK_SIZEOF(uint32_t)
+       AC_CHECK_ALIGNOF(uint32_t)
+       AC_TYPE_INT64_T
+       AC_CHECK_SIZEOF(int64_t)
+       AC_CHECK_ALIGNOF(int64_t)
+       AC_TYPE_UINT64_T
+       AC_CHECK_SIZEOF(uint64_t)
+       AC_CHECK_ALIGNOF(uint64_t)
+
+       PSI_TYPE(float)
+       AC_CHECK_ALIGNOF(float)
+       PSI_TYPE(double)
+       AC_CHECK_ALIGNOF(double)
+       PSI_TYPE(void *)
+       AC_CHECK_ALIGNOF(void *)
+
+       PSI_TYPE(char, int)
+       PSI_TYPE(unsigned char, uint)
+       PSI_TYPE(short, int)
+       PSI_TYPE(unsigned short, uint)
+       PSI_TYPE(int, int)
+       PSI_TYPE(unsigned int, uint)
+       PSI_TYPE(unsigned, uint)
+       PSI_TYPE(long, int)
+       PSI_TYPE(unsigned long, uint)
+])
diff --git a/m4/stddef.m4 b/m4/stddef.m4
new file mode 100644 (file)
index 0000000..7c99d6c
--- /dev/null
@@ -0,0 +1,11 @@
+AC_DEFUN(PSI_CHECK_STDDEF, [
+    AC_CHECK_HEADERS(stddef.h)
+    PSI_TYPE(ptrdiff_t, int)
+    PSI_CONST(PTRDIFF_MIN, int)
+    PSI_CONST(PTRDIFF_MAX, int)
+    PSI_TYPE(size_t, uint)
+    PSI_CONST(SIZE_MAX, int)
+    PSI_TYPE(wchar_t, int)
+    PSI_CONST(WCHAR_MIN, int)
+    PSI_CONST(WCHAR_MAX, int)
+])
diff --git a/m4/stdint.m4 b/m4/stdint.m4
new file mode 100644 (file)
index 0000000..65afe65
--- /dev/null
@@ -0,0 +1,70 @@
+AC_DEFUN(PSI_CHECK_STDINT, [
+       AC_CHECK_HEADERS(stdint.h)
+
+       PSI_TYPE(int_least8_t, int)
+       PSI_TYPE(int_least16_t, int)
+       PSI_TYPE(int_least32_t, int)
+       PSI_TYPE(int_least64_t, int)
+       PSI_TYPE(uint_least8_t, uint)
+       PSI_TYPE(uint_least16_t, uint)
+       PSI_TYPE(uint_least32_t, uint)
+       PSI_TYPE(uint_least64_t, uint)
+       PSI_TYPE(int_fast8_t, int)
+       PSI_TYPE(int_fast16_t, int)
+       PSI_TYPE(int_fast32_t, int)
+       PSI_TYPE(int_fast64_t, int)
+       PSI_TYPE(uint_fast8_t, uint)
+       PSI_TYPE(uint_fast16_t, uint)
+       PSI_TYPE(uint_fast32_t, uint)
+       PSI_TYPE(uint_fast64_t, uint)
+       PSI_TYPE(intptr_t, int)
+       PSI_TYPE(uintptr_t, uint)
+       PSI_TYPE(intmax_t, int)
+       PSI_TYPE(uintmax_t, uint)
+
+       PSI_CONST(INT8_MIN, int)
+       PSI_CONST(INT8_MAX, int)
+       PSI_CONST(UINT8_MAX, int)
+       PSI_CONST(INT16_MIN, int)
+       PSI_CONST(INT16_MAX, int)
+       PSI_CONST(UINT16_MAX, int)
+       PSI_CONST(INT32_MIN, int)
+       PSI_CONST(INT32_MAX, int)
+       PSI_CONST(UINT32_MAX, int)
+       PSI_CONST(INT64_MIN, int)
+       PSI_CONST(INT64_MAX, int)
+       PSI_CONST(UINT64_MAX, int)
+
+       PSI_CONST(INT_LEAST8_MIN, int)
+       PSI_CONST(INT_LEAST8_MAX, int)
+       PSI_CONST(UINT_LEAST8_MAX, int)
+       PSI_CONST(INT_LEAST16_MIN, int)
+       PSI_CONST(INT_LEAST16_MAX, int)
+       PSI_CONST(UINT_LEAST16_MAX, int)
+       PSI_CONST(INT_LEAST32_MIN, int)
+       PSI_CONST(INT_LEAST32_MAX, int)
+       PSI_CONST(UINT_LEAST32_MAX, int)
+       PSI_CONST(INT_LEAST64_MIN, int)
+       PSI_CONST(INT_LEAST64_MAX, int)
+       PSI_CONST(UINT_LEAST64_MAX, int)
+
+       PSI_CONST(INT_FAST8_MIN, int)
+       PSI_CONST(INT_FAST8_MAX, int)
+       PSI_CONST(UINT_FAST8_MAX, int)
+       PSI_CONST(INT_FAST16_MIN, int)
+       PSI_CONST(INT_FAST16_MAX, int)
+       PSI_CONST(UINT_FAST16_MAX, int)
+       PSI_CONST(INT_FAST32_MIN, int)
+       PSI_CONST(INT_FAST32_MAX, int)
+       PSI_CONST(UINT_FAST32_MAX, int)
+       PSI_CONST(INT_FAST64_MIN, int)
+       PSI_CONST(INT_FAST64_MAX, int)
+       PSI_CONST(UINT_FAST64_MAX, int)
+
+       PSI_CONST(INTPTR_MIN, int)
+       PSI_CONST(INTPTR_MAX, int)
+       PSI_CONST(UINTPTR_MAX, int)
+       PSI_CONST(INTMAX_MIN, int)
+       PSI_CONST(INTMAX_MAX, int)
+       PSI_CONST(UINTMAX_MAX, int)
+])
diff --git a/m4/stdio.m4 b/m4/stdio.m4
new file mode 100644 (file)
index 0000000..a6f8a2e
--- /dev/null
@@ -0,0 +1,75 @@
+AC_DEFUN(PSI_CHECK_STDIO, [
+    AC_CHECK_HEADER(stdio.h)
+
+    PSI_STRUCT(FILE)
+    PSI_STRUCT(fpos_t)
+
+    PSI_CONST(BUFSIZ, int)
+    PSI_CONST(_IOFBF, int)
+    PSI_CONST(_IOLBF, int)
+    PSI_CONST(_IONBF, int)
+    PSI_CONST(SEEK_CUR, int)
+    PSI_CONST(SEEK_END, int)
+    PSI_CONST(SEEK_SET, int)
+    PSI_CONST(FILENAME_MAX, int)
+    PSI_CONST(FOPEN_MAX, int)
+    PSI_CONST(TMP_MAX, int)
+    PSI_CONST(EOF, int)
+    PSI_CONST(P_tmpdir, string)
+    PSI_CONST(L_ctermid, int)
+    PSI_CONST(L_tmpnam, int)
+
+    PSI_DECL(void clearerr, [(FILE *stream)])
+    PSI_DECL(char *ctermid, [(char *s)])
+    PSI_DECL(int fclose, [(FILE *stream)])
+    PSI_DECL(FILE *fdopen, [(int fd, char *mode)])
+    PSI_DECL(int feof, [(FILE *stream)])
+    PSI_DECL(int ferror, [(FILE *stream)])
+    PSI_DECL(int fflush, [(FILE *stream)])
+    PSI_DECL(int fgetc, [(FILE *stream)])
+    PSI_DECL(int fgetpos, [(FILE *stream, fpos_t *pos)])
+    PSI_DECL(char *fgets, [(char *buf, int len, FILE *stream)])
+    PSI_DECL(int fileno, [(FILE *stream)])
+    PSI_DECL(void flockfile, [(FILE *stream)])
+    PSI_DECL(FILE *fmemopen, [(void *buf, size_t len, char *mode)])
+    PSI_DECL(FILE *fopen, [(char *path, char *mode)])
+    PSI_DECL(int fputc, [(int c, FILE *stream)])
+    PSI_DECL(int fputs, [(char *s, FILE *stream)])
+    PSI_DECL(size_t fread, [(void *buf, size_t len, size_t n, FILE *stream)])
+    PSI_DECL(FILE *freopen, [(char *path, char *mode, FILE *stream)])
+    PSI_DECL(int fseek, [(FILE *stream, long offset, int whence)])
+    PSI_DECL(int fseeko, [(FILE *stream, off_t offset, int whence)])
+    PSI_DECL(int fsetpos, [(FILE *stream, fpos_t *pos)])
+    PSI_DECL(long ftell, [(FILE *stream)])
+    PSI_DECL(off_t ftello, [(FILE *stream)])
+    PSI_DECL(int ftrylockfile, [(FILE *stream)])
+    PSI_DECL(void funlockfile, [(FILE *stream)])
+    PSI_DECL(size_t fwrite, [(void *buf, size_t len, size_t n, FILE *stream)])
+    PSI_DECL(int getc, [(FILE *stream)])
+    PSI_DECL(int getchar, [(void)])
+    PSI_DECL(int getc_unlocked, [(FILE *stream)])
+    PSI_DECL(int getchar_unlocked, [(void)])
+    PSI_DECL(ssize_t getdelim, [(char **lineptr, size_t *n, int delim, FILE *stream)])
+    PSI_DECL(ssize_t getline, [(char **lineptr, size_t *n, FILE *stream)])
+    PSI_DECL(char *gets, [(char *buf)])
+    PSI_DECL(FILE *open_memstream, [(char **ptr, size_t *sizeloc)])
+    PSI_DECL(int pclose, [(FILE *stream)])
+    PSI_DECL(void perror, [(char *s)])
+    PSI_DECL(FILE *popen, [(char *command, char *type)])
+    PSI_DECL(int putc, [(int c, FILE *stream)])
+    PSI_DECL(int putchar, [(int c)])
+    PSI_DECL(int putc_unlocked, [(int c, FILE *stream)])
+    PSI_DECL(int putchar_unlocked, [(int c)])
+    PSI_DECL(int puts, [(char *s)])
+    PSI_DECL(int remove, [(char *path)])
+    PSI_DECL(int rename, [(char *old, char *new)])
+    PSI_DECL(int renameat, [(int oldfd, char *oldpath, int newfd, char *newpath)])
+    PSI_DECL(void rewind, [(FILE *stream)])
+    PSI_DECL(void setbuf, [(FILE *stream, char *buf)])
+    PSI_DECL(int setvbuf, [(FILE *stream, char *buf, int mode, size_t size)])
+    PSI_DECL(char *tempnam, [(char *dir, char *prefix)])
+    PSI_DECL(FILE *tmpfile, [(void)])
+    PSI_DECL(char *tmpnam, [(char *s)])
+    PSI_DECL(int ungetc, [(int c, FILE *stream)])
+
+])
diff --git a/m4/stdlib.m4 b/m4/stdlib.m4
new file mode 100644 (file)
index 0000000..c84d44d
--- /dev/null
@@ -0,0 +1,60 @@
+AC_DEFUN(PSI_CHECK_STDLIB, [
+       AC_CHECK_HEADERS(stdlib.h)
+
+       PSI_CONST(EXIT_FAILURE, int)
+       PSI_CONST(EXIT_SUCCESS, int)
+       PSI_CONST(RAND_MAX, int)
+       PSI_CONST(MB_CUR_MAX, int)
+
+       PSI_DECL(void _Exit, [(int status)])
+       PSI_DECL(void abort, [()])
+       PSI_DECL(int abs, [(int n)])
+       PSI_DECL(double atof, [(char *str)])
+       PSI_DECL(int atoi, [(char *str)])
+       PSI_DECL(long atol, [(char *str)])
+       PSI_DECL(div_t div, [(int numerator, int denominator)])
+       PSI_DECL(double drand48, [()])
+       PSI_DECL(double erand48, [(unsigned short xsubi@<:@3@:>@)])
+       PSI_DECL(void exit, [(int status)])
+       PSI_DECL(void free, [(void *ptr)])
+       PSI_DECL(char *getenv, [(char *var)])
+       PSI_DECL(int grantpt, [(int fd)])
+       PSI_DECL(char *initstate, [(unsigned int seed, char *state, size_t n)])
+       PSI_DECL(long jrand48, [(unsigned short xsubi@<:@3@:>@)])
+       PSI_DECL(long labs, [(long l)])
+       PSI_DECL(void lcong48, [(unsigned short param@<:@7@:>@)])
+       PSI_DECL(long ldiv, [(long numerator, long denominator)])
+       PSI_DECL(long lrand48, [()])
+       PSI_DECL(int mblen, [(const char *s, size_t n)])
+       PSI_DECL(size_t mbstowcs, [(wchar_t *dest, char *src, size_t n)])
+       PSI_DECL(int mbtowc, [(wchar_t *pwc, char *s, size_t n)])
+       PSI_DECL(char *mkdtemp, [(char *template)])
+       PSI_DECL(char *mkdstemp, [(char *template)])
+       PSI_DECL(long mrand48, [()])
+       PSI_DECL(long nrand48, [(unsigned short xsubi@<:@3@:>@)])
+       PSI_DECL(int posix_openpt, [(int flags)])
+       PSI_DECL(char *ptsname, [(int fd)])
+       PSI_DECL(char *pstname_r, [(int fd, char *buf, size_t buflen)])
+       PSI_DECL(int putenv, [(char *var)])
+       PSI_DECL(int rand, [()])
+       PSI_DECL(int rand_r, [(unsigned *seed_p)])
+       PSI_DECL(long random, [()])
+       PSI_DECL(char *realpath, [(char *path, char *resolved)])
+       PSI_DECL(unsigned short *seed48, [(unsigned short seed16v@<:@3@:>@)])
+       PSI_DECL(int setenv, [(char *var)])
+       PSI_DECL(void setkey, [(char *key)])
+       PSI_DECL(char *setstate, [(char *state)])
+       PSI_DECL(void srand, [(unsigned seed)])
+       PSI_DECL(void srand48, [(long seed)])
+       PSI_DECL(void srandom, [(unsigned seed)])
+       PSI_DECL(double strtod, [(char *nptr, char **endptr)])
+       PSI_DECL(float strtof, [(char *nptr, char **endptr)])
+       PSI_DECL(long strtol, [(char *nptr, char **endptr)])
+       PSI_DECL(unsigned long strtoul, [(char *nptr, char **endptr)])
+       PSI_DECL(int system, [(char *command)])
+       PSI_DECL(int unlockpt, [(int fd)])
+       PSI_DECL(int unsetenv, [(char *var)])
+       PSI_DECL(size_t wcstombs, [(char *dest, wchar_t *src, size_t n)])
+       PSI_DECL(int wctomb, [(char *s, wchar_t wc)])
+])
+
diff --git a/m4/sys_stat.m4 b/m4/sys_stat.m4
new file mode 100644 (file)
index 0000000..1d8e52c
--- /dev/null
@@ -0,0 +1,83 @@
+AC_DEFUN(PSI_CHECK_SYS_STAT, [
+       AC_CHECK_HEADERS([sys/stat.h])
+
+       PSI_STRUCT(struct stat, [
+               dev_t st_dev,
+               ino_t st_ino,
+               mode_t st_mode,
+               nlink_t st_nlink,
+               uid_t st_uid,
+               gid_t st_gid,
+               dev_t st_rdev,
+               off_t st_size,
+               blksize_t st_blksize,
+               blkcnt_t st_blocks,
+               time_t st_atime,
+               time_t st_mtime,
+               time_t st_ctime,
+               struct timespec st_atim,
+               struct timespec st_mtim,
+               struct timespec st_ctim,
+               struct timespec st_atimespec,
+               struct timespec st_mtimespec,
+               struct timespec st_ctimespec,
+               struct timespec st_birthtimespec,
+               time_t st_birthtime,
+               int st_flags]
+       )
+
+       PSI_CONST(S_IFMT, int)
+       PSI_CONST(S_IFBLK, int)
+       PSI_CONST(S_IFCHR, int)
+       PSI_CONST(S_IFIFO, int)
+       PSI_CONST(S_IFREG, int)
+       PSI_CONST(S_IFDIR, int)
+       PSI_CONST(S_IFLNK, int)
+       PSI_CONST(S_IFSOCK, int)
+       PSI_CONST(S_IRWXU, int)
+       PSI_CONST(S_IRUSR, int)
+       PSI_CONST(S_IWUSR, int)
+       PSI_CONST(S_IXUSR, int)
+       PSI_CONST(S_IRWXG, int)
+       PSI_CONST(S_IRGRP, int)
+       PSI_CONST(S_IWGRP, int)
+       PSI_CONST(S_IXGRP, int)
+       PSI_CONST(S_IRWXO, int)
+       PSI_CONST(S_IROTH, int)
+       PSI_CONST(S_IWOTH, int)
+       PSI_CONST(S_IXOTH, int)
+       PSI_CONST(S_ISUID, int)
+       PSI_CONST(S_ISGID, int)
+       PSI_CONST(UTIME_NOW, int)
+       PSI_CONST(UTIME_OMIT, int)
+
+       PSI_MACRO(int S_ISBLK, [(mode_t m)])
+       PSI_MACRO(int S_ISCHR, [(mode_t m)])
+       PSI_MACRO(int S_ISDIR, [(mode_t m)])
+       PSI_MACRO(int S_ISFIFO, [(mode_t m)])
+       PSI_MACRO(int S_ISREG, [(mode_t m)])
+       PSI_MACRO(int S_ISLNK, [(mode_t m)])
+       PSI_MACRO(int S_ISSOCK, [(mode_t m)])
+
+       PSI_MACRO(int S_TYPEISMQ, [(struct stat *s)])
+       PSI_MACRO(int S_TYPEISSEM, [(struct stat *s)])
+       PSI_MACRO(int S_TYPEISSHM, [(struct stat *s)])
+       PSI_MACRO(int S_TYPEISTMO, [(struct stat *s)])
+
+       PSI_DECL(int chmod, [(char *path, mode_t mode)])
+       PSI_DECL(int fchmod, [(int fd, mode_t mode)])
+       PSI_DECL(int fchmodat, [(int fd, char *path, mode_t mode, int flag)])
+       PSI_DECL(int fstat, [(int fd, struct stat *buf)])
+       PSI_DECL(int fstatat, [(int fd, char *path, struct stat *buf, int flag)])
+       PSI_DECL(int futimens, [(int fd, struct timespec times@<:@2@:>@)])
+       PSI_DECL(int lstat, [(char *path, struct stat *buf)])
+       PSI_DECL(int mkdir, [(char *path, mode_t mode)])
+       PSI_DECL(int mkdirat, [(int fd, char *path, mode_t mode)])
+       PSI_DECL(int mkfifo, [(char *path, mode_t mode)])
+       PSI_DECL(int mkfifoat, [(int fd, char *path, mode_t mode)])
+       PSI_DECL(int mknod, [(char *path, mode_t mode, dev_t dev)])
+       PSI_DECL(int mknodat, [(int fd, char *path, mode_t mode, dev_t dev)])
+       PSI_DECL(int stat, [(char *path, struct stat *buf)])
+       PSI_DECL(mode_t umask, [(mode_t mode)])
+       PSI_DECL(int utimensat, [(int fd, char *path, struct timespec times@<:@2@:>@, int flag)])
+])
diff --git a/m4/sys_time.m4 b/m4/sys_time.m4
new file mode 100644 (file)
index 0000000..861fa41
--- /dev/null
@@ -0,0 +1,26 @@
+AC_DEFUN(PSI_CHECK_SYS_TIME, [
+       AC_CHECK_HEADERS(sys/time.h)
+
+       PSI_CONST(ITIMER_REAL, int)
+       PSI_CONST(ITIMER_VIRTUAL, int)
+       PSI_CONST(ITIMER_PROF, int)
+
+       PSI_STRUCT(struct timeval, [
+               time_t tv_sec,
+               suseconds_t tv_usec]
+       )
+       PSI_STRUCT(struct itimerval, [
+               struct timeval it_interval,
+               struct timeval it_value]
+       )
+       PSI_STRUCT(struct timezone, [
+               int tz_minuteswest,
+               int tz_dsttime]
+       )
+
+       PSI_DECL(int getitimer, [(int which, struct itimerval *value)])
+       PSI_DECL(int setitimer, [(int which struct itimerval *value, struct itimerval *ovalue)])
+       PSI_DECL(int gettimeofday, [(struct timeval *tp, struct timezone *tz)])
+       PSI_DECL(int utimes, [(char *path, struct timeval times@<:@2@:>@)])
+       PSI_DECL(int utimensat, [(int fd, char *path, struct timespec times@<:@2@:>@)])
+])
diff --git a/m4/sys_times.m4 b/m4/sys_times.m4
new file mode 100644 (file)
index 0000000..cbaa6fe
--- /dev/null
@@ -0,0 +1,12 @@
+AC_DEFUN(PSI_CHECK_SYS_TIMES, [
+       AC_CHECK_HEADERS(sys/times.h)
+       
+       PSI_STRUCT(struct tms, [
+               clock_t tms_utime,
+               clock_t tms_stime,
+               clock_t tms_cutime,
+               clock_t tms_cstime]
+       )
+       
+       PSI_DECL(clock_t times, [(struct tms *buf)])
+])
diff --git a/m4/sys_types.m4 b/m4/sys_types.m4
new file mode 100644 (file)
index 0000000..352d8b5
--- /dev/null
@@ -0,0 +1,24 @@
+AC_DEFUN(PSI_CHECK_SYS_TYPES, [
+       AC_CHECK_HEADERS(sys/types.h)
+
+       PSI_TYPE(blkcnt_t, int)
+       PSI_TYPE(blksize_t, int)
+       PSI_TYPE(clock_t, int)
+       PSI_TYPE(clockid_t, int)
+       PSI_TYPE(dev_t, int)
+       PSI_TYPE(fsblkcnt_t, uint)
+       PSI_TYPE(fsfilcnt_t, uint)
+       PSI_TYPE(gid_t, int)
+       PSI_TYPE(id_t, int)
+       PSI_TYPE(ino_t, uint)
+       PSI_TYPE(key_t, int)
+       PSI_TYPE(mode_t, int)
+       PSI_TYPE(nlink_t, int)
+       PSI_TYPE(off_t, int)
+       PSI_TYPE(pid_t, int)
+       PSI_TYPE(ssize_t, int)
+       PSI_TYPE(suseconds_t, int)
+       PSI_TYPE(time_t, int)
+       PSI_TYPE(timer_t, int)
+       PSI_TYPE(uid_t, int)
+])
diff --git a/m4/sys_uio.m4 b/m4/sys_uio.m4
new file mode 100644 (file)
index 0000000..d57f901
--- /dev/null
@@ -0,0 +1,11 @@
+AC_DEFUN(PSI_CHECK_SYS_UIO, [
+       AC_CHECK_HEADERS(sys/uio.h)
+       
+       PSI_STRUCT(struct iovec, [
+               void *iov_base,
+               size_t iov_len]
+       )
+       
+       PSI_DECL(ssize_t readv, [(int fd, struct iovec *iov, int iovcnt)])
+       PSI_DECL(ssize_t writev, [(int fd, struct iovec *iov, int iovcnt)])
+])
diff --git a/m4/time.m4 b/m4/time.m4
new file mode 100644 (file)
index 0000000..3d50e69
--- /dev/null
@@ -0,0 +1,59 @@
+AC_DEFUN(PSI_CHECK_TIME, [
+       AC_CHECK_HEADERS(time.h)
+
+       PSI_CONST(CLOCKS_PER_SEC, int)
+       PSI_CONST(CLOCK_MONOTONIC, int)
+       PSI_CONST(CLOCK_PROCESS_CPUTIME_ID, int)
+       PSI_CONST(CLOCK_REALTIME, int)
+       PSI_CONST(CLOCK_THREAD_CPUTIME_ID, int)
+       PSI_CONST(TIMER_ABSTIME, int)
+
+       PSI_STRUCT(struct tm, [
+               int tm_sec,
+               int tm_min,
+               int tm_hour,
+               int tm_mday,
+               int tm_mon,
+               int tm_year,
+               int tm_wday,
+               int tm_yday,
+               int tm_isdst]
+       )
+       PSI_STRUCT(struct timespec, [
+               time_t tv_sec,
+               long tv_nsec]
+       )
+       PSI_STRUCT(struct itimerspec, [
+               struct timespec it_interval,
+               struct timespec it_value]
+       )
+
+       PSI_DECL(char *asctime, [(struct tm *tm)])
+       PSI_DECL(char *asctime_r, [(struct tm *tm, char *buf)])
+       PSI_DECL(clock_t clock, [()])
+       PSI_DECL(int clock_getcpuclockid, [(pid_t pid, clockid_t *clock_id)])
+       PSI_DECL(int clock_getres, [(clockid_t clk_id, struct timespec *res)])
+       PSI_DECL(int clock_gettime, [(clockid_t clk_id, struct timespec *tp)])
+       PSI_DECL(int clock_nanosleep, [(clockid_t clk_id, int flags, struct timespec *rqtp, struct timespec *rmtp)])
+       PSI_DECL(int clock_settime, [(clockid_t clk_id, struct timespec *tp)])
+       PSI_DECL(char *ctime, [(time_t *t)])
+       PSI_DECL(char *ctime_r, [(time_t *t, char *buf)])
+       PSI_DECL(double difftime, [(time_t time1, time_t time0)])
+       PSI_DECL(struct tm *getdate, [(char *string)])
+       PSI_DECL(struct tm *gmtime, [(time_t *t)])
+       PSI_DECL(struct tm *gmtime_r, [(time_t *t, struct tm *buf)])
+       PSI_DECL(struct tm *localtime, [(time_t *t)])
+       PSI_DECL(struct tm *localtime_r, [(time_t *t, struct tm *buf)])
+       PSI_DECL(time_t mktime, [(struct tm *tm)])
+       PSI_DECL(int nanosleep, [(struct timespec *rqts, struct timespec *rmts)])
+       PSI_DECL(size_t strftime, [(char *s, size_t max, char *fmt, struct tm *tm)])
+       dnl PSI_DECL(size_t strftime_l, [(char *s, size_t max, char *fmt, struct tm *tm, locale_t l)])
+       PSI_DECL(char *strptime, [(char *s, char *fmt, struct tm *tm)])
+       PSI_DECL(time_t time, [(time_t *t)])
+       dnl PSI_DECL(int timer_create, [(clockid_t clk_id, struct sigevent *se, timer_t *t)])
+       PSI_DECL(int timer_delete, [(timer_t t)])
+       PSI_DECL(int timer_getoverrun, [(timer_t t)])
+       PSI_DECL(int timer_gettime, [(timer_t t, struct itimerspec *ts)])
+       PSI_DECL(int timer_settime, [(timer_t t, struct itimerspec *value, struct itimerspec *ovalue)])
+       PSI_DECL(void tzset, [()])
+])
diff --git a/m4/wchar.m4 b/m4/wchar.m4
new file mode 100644 (file)
index 0000000..97a0b9e
--- /dev/null
@@ -0,0 +1,9 @@
+AC_DEFUN(PSI_CHECK_WCHAR, [
+       AC_CHECK_HEADERS(wchar.h)
+       
+       PSI_TYPE(wint_t, int)
+       
+       PSI_CONST(WINT_MIN, int)
+       PSI_CONST(WINT_MAX, int)
+       PSI_CONST(WEOF, int)
+])
index 066d9d69d8371e6dba77a6572a7fa4b79fac3ac0..84b73c2101a4ed0a17a8eb794774e4e85448f203 100644 (file)
--- a/php_psi.h
+++ b/php_psi.h
@@ -24,6 +24,11 @@ extern zend_module_entry psi_module_entry;
 
 void psi_error(int type, const char *msg, ...);
 
+static inline int psi_check_env(const char *var) {
+       char *set = getenv(var);
+       return (set && *set && '0' != *set);
+}
+
 size_t psi_t_alignment(token_t t);
 size_t psi_t_size(token_t t);
 size_t psi_t_align(token_t t, size_t s);
index 3f8ee1e37e16f105941f75029ae148a10ae2eea6..2bb952e57e6c7dc8bbae6d446abd555549544c06 100644 (file)
@@ -1,8 +1,5 @@
-extern void globfree(glob_t *buf);
-
-extern int glob(char *pat, int flags, void *err, glob_t *buf);
 function psi\glob(string $pattern, int $flags, array &$glob = NULL) : int {
-       let pat = strval($pattern);
+       let path = strval($pattern);
        let flags = intval($flags);
        let err = NULL;
        let buf = arrval($glob);
@@ -14,5 +11,5 @@ function psi\glob(string $pattern, int $flags, array &$glob = NULL) : int {
                to_int(gl_flags),
                to_array(**gl_pathv, gl_pathc, gl_offs, to_string(*gl_pathv))
        );
-       //free globfree(buf);
+       free globfree(buf);
 }
index 0b222250120dab30d2b2f791cb54689eefd6927e..82d624976162301b1687dd8d90c5183209aa4232 100644 (file)
@@ -1,4 +1,3 @@
-extern int stat(char *path, struct stat *buf);
 function psi\stat(string $path, array &$buf = NULL) : int {
        let path = strval($path);
        let buf = calloc(1, struct stat);
index 1281c51d988867b3eb624fdb3266e83ce4ae2423..e01bd1be6c037a5bded943b5e3bb1cc562dfe7da 100644 (file)
@@ -1,4 +1,3 @@
-extern time_t time(time_t *t);
 function psi\time() : int {
        let t = NULL;
        return to_int(time);
@@ -9,11 +8,11 @@ function psi\gettimeofday(array &$tv = NULL, array &$tz = NULL) : int {
        let tv = calloc(1, struct timeval);
        let tz = calloc(1, struct timezone);
        return to_int(gettimeofday);
-       set $tv = to_array(*tv, 
-               to_int(tv_sec), 
+       set $tv = to_array(*tv,
+               to_int(tv_sec),
                to_int(tv_usec));
-       set $tz = to_array(*tz, 
-               to_int(tz_minuteswest), 
+       set $tz = to_array(*tz,
+               to_int(tz_minuteswest),
                to_int(tz_dsttime));
 }
 
index 727388bcca095f9e521903ac5810bba2eddbd6bb..5e66a45f0d4a41b155f5b780ccdb8f832c0b6410 100644 (file)
 #include "libjit.h"
 #include "libffi.h"
 
-#define psi_predef_count(of) ((sizeof(psi_predef ##of## s)/sizeof(psi_predef ##of))-1)
-typedef struct psi_predef_type {
+static struct psi_std_type {
+       token_t type_tag;
+       const char *type_name;
+} psi_std_types[] = {
+       {PSI_T_FLOAT, "float"},
+       {PSI_T_DOUBLE, "double"},
+       {PSI_T_INT8, "int8_t"},
+       {PSI_T_INT16, "int16_t"},
+       {PSI_T_INT32, "int32_t"},
+       {PSI_T_INT64, "int64_t"},
+       {PSI_T_UINT8, "uint8_t"},
+       {PSI_T_UINT16, "uint16_t"},
+       {PSI_T_UINT32, "uint32_t"},
+       {PSI_T_UINT64, "uint64_t"},
+       {0}
+};
+
+static struct psi_predef_type {
        token_t type_tag;
        const char *type_name;
        const char *alias;
-} psi_predef_type;
-static const psi_predef_type psi_predef_types[] = {
-       PHP_PSI_TYPES{0}
+} psi_predef_types[] = {
+       PSI_TYPES
+       {0}
 };
-#define psi_predef_type_count() psi_predef_count(_type)
 
-typedef struct psi_predef_const {
+static struct psi_predef_const {
        token_t type_tag;
        const char *type_name;
-       const char *name;
+       const char *var_name;
        const char *val_text;
        token_t val_type_tag;
-} psi_predef_const;
-static const psi_predef_const psi_predef_consts[] = {
-       PHP_PSI_CONSTS{0}
+} psi_predef_consts[] = {
+       PSI_CONSTS
+       {0}
 };
-#define psi_predef_const_count() psi_predef_count(_const)
 
-typedef struct psi_predef_struct_member {
+PSI_MACROS
+
+static struct psi_func_redir {
+       const char *name;
+       void (*func)(void);
+} psi_func_redirs[] = {
+       PSI_REDIRS
+       {0}
+};
+
+static struct psi_predef_decl {
        token_t type_tag;
        const char *type_name;
-       const char *name;
-       size_t off;
-       size_t len;
+       const char *var_name;
        size_t pointer_level;
        size_t array_size;
-} psi_predef_struct_member;
-#define PSI_PREDEF_STRUCT_MEMBERS 32
-typedef struct psi_predef_struct {
-       const char *name;
-       size_t size;
-       psi_predef_struct_member members[PSI_PREDEF_STRUCT_MEMBERS];
-} psi_predef_struct;
-static const psi_predef_struct psi_predef_structs[] = {
-       PHP_PSI_STRUCTS{0}
+} psi_predef_decls[] = {
+       PSI_DECLS
+       {0}
 };
-#define psi_predef_struct_count() psi_predef_count(_struct)
 
-PHP_PSI_MACROS
-
-typedef struct psi_predef_func {
-       const char *name;
-       void (*func)(void);
-} psi_predef_func;
-static psi_predef_func psi_predef_funcs[] = {
-       PHP_PSI_FUNCS{0}
+static struct psi_predef_struct {
+       token_t type_tag;
+       const char *type_name;
+       const char *var_name;
+       size_t offset;
+       size_t size;
+       size_t pointer_level;
+       size_t array_size;
+} psi_predef_structs[] = {
+       PSI_STRUCTS
+       {0}
 };
-#define psi_predef_func_count() psi_predef_count(_func)
 
 static int validate_lib(PSI_Data *data, void **dlopened) {
        char lib[MAXPATHLEN];
@@ -191,16 +208,26 @@ static int validate_lib(PSI_Data *data, void **dlopened) {
 
 static inline int locate_decl_type_alias(decl_typedefs *defs, decl_type *type) {
        size_t i;
+       struct psi_std_type *stdtyp;
 
        if (type->real) {
                return 1;
        }
        for (i = 0; i < defs->count; ++i) {
-               if (!strcmp(defs->list[i]->alias, type->name)) {
-                       type->real = defs->list[i]->type;
+               decl_typedef *def = defs->list[i];
+
+               if (def->type->type != type->type && !strcmp(def->alias, type->name)) {
+                       type->real = def->type;
                        return 1;
                }
        }
+       for (stdtyp = &psi_std_types[0]; stdtyp->type_tag; ++stdtyp) {
+               if (!strcmp(type->name, stdtyp->type_name)) {
+                       type->type = stdtyp->type_tag;
+               }
+               return 1;
+       }
+
        return 0;
 }
 static inline int locate_decl_type_struct(decl_structs *structs, decl_type *type) {
@@ -221,10 +248,13 @@ static inline int locate_decl_type_struct(decl_structs *structs, decl_type *type
 static inline int validate_decl_type(PSI_Data *data, decl_type *type) {
        switch (type->type) {
        case PSI_T_NAME:
-               if (!data->defs |!locate_decl_type_alias(data->defs, type)) {
+               if (!data->defs |!locate_decl_type_alias(data->defs, type)) {
                        return 0;
                }
-               return validate_decl_type(data, type->real);
+               if (type->real) {
+                       return validate_decl_type(data, type->real);
+               }
+               return 1;
        case PSI_T_STRUCT:
                if (!data->structs || !locate_decl_type_struct(data->structs, type)) {
                        return 0;
@@ -235,8 +265,8 @@ static inline int validate_decl_type(PSI_Data *data, decl_type *type) {
 }
 static inline int validate_decl_typedef(PSI_Data *data, decl_typedef *def) {
        if (!validate_decl_type(data, def->type)) {
-               data->error(PSI_WARNING, "Type '%s' cannot be aliased to '%s'",
-                       def->type->name, def->alias);
+               data->error(PSI_WARNING, "Type '%s' cannot be aliased to %s'%s'",
+                       def->type->name, def->type->type == PSI_T_STRUCT?"struct ":"",def->alias);
                return 0;
        }
        /* FIXME: check def->alias */
@@ -321,7 +351,7 @@ static inline int validate_decl_abi(PSI_Data *data, decl_abi *abi) {
 }
 static inline int validate_decl_func(PSI_Data *data, void *dl, decl *decl, decl_arg *func)
 {
-       size_t i;
+       struct psi_func_redir *redir;
 
        if (!strcmp(func->var->name, "dlsym")) {
                data->error(PSI_WARNING, "Cannot dlsym dlsym (sic!)");
@@ -331,12 +361,9 @@ static inline int validate_decl_func(PSI_Data *data, void *dl, decl *decl, decl_
        if (!validate_decl_arg(data, func)) {
                return 0;
        }
-       for (i = 0; i < psi_predef_func_count(); ++i) {
-               psi_predef_func *pre = &psi_predef_funcs[i];
-
-               if (!strcmp(func->var->name, pre->name)) {
-                       decl->call.sym = pre->func;
-                       break;
+       for (redir = &psi_func_redirs[0]; redir->name; ++redir) {
+               if (!strcmp(func->var->name, redir->name)) {
+                       decl->call.sym = redir->func;
                }
        }
        if (!decl->call.sym) {
@@ -703,8 +730,12 @@ static inline int validate_impl_stmts(PSI_Data *data, impl *impl) {
 
 PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErrorFunc error)
 {
-       size_t i, j;
+       size_t i;
        PSI_Data T;
+       struct psi_predef_type *predef_type;
+       struct psi_predef_const *predef_const;
+       struct psi_predef_struct *predef_struct;
+       struct psi_predef_decl *predef_decl;
 
        if (!C) {
                C = malloc(sizeof(*C));
@@ -725,49 +756,61 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr
        memset(&T, 0, sizeof(T));
        T.error = error;
 
-       for (i = 0; i < psi_predef_type_count(); ++i) {
-               const psi_predef_type *pre = &psi_predef_types[i];
-               decl_type *type = init_decl_type(pre->type_tag, pre->type_name);
-               decl_typedef *def = init_decl_typedef(pre->alias, type);
+       for (predef_type = &psi_predef_types[0]; predef_type->type_tag; ++predef_type) {
+               decl_type *type = init_decl_type(predef_type->type_tag, predef_type->type_name);
+               decl_typedef *def = init_decl_typedef(predef_type->alias, type);
 
                T.defs = add_decl_typedef(T.defs, def);
        }
-       for (i = 0; i < psi_predef_const_count(); ++i) {
-               const psi_predef_const *pre = &psi_predef_consts[i];
-               impl_def_val *val = init_impl_def_val(pre->val_type_tag, pre->val_text);
-               const_type *type = init_const_type(pre->type_tag, pre->type_name);
-               constant *constant = init_constant(type, pre->name, val);
+       for (predef_const = &psi_predef_consts[0]; predef_const->type_tag; ++predef_const) {
+               impl_def_val *val = init_impl_def_val(predef_const->val_type_tag, predef_const->val_text);
+               const_type *type = init_const_type(predef_const->type_tag, predef_const->type_name);
+               constant *constant = init_constant(type, predef_const->var_name, val);
 
                T.consts = add_constant(T.consts, constant);
        }
-       for (i = 0; i < psi_predef_struct_count(); ++i) {
-               const psi_predef_struct *pre = &psi_predef_structs[i];
+       for (predef_struct = &psi_predef_structs[0]; predef_struct->type_tag; ++predef_struct) {
+               struct psi_predef_struct *member;
                decl_args *dargs = init_decl_args(NULL);
-               decl_struct *dstruct;
+               decl_struct *dstruct = init_decl_struct(predef_struct->var_name, dargs);
 
-               for (j = 0; j < PSI_PREDEF_STRUCT_MEMBERS; ++j) {
-                       const psi_predef_struct_member *member = &pre->members[j];
+               dstruct->size = predef_struct->size;
+               for (member = &predef_struct[1]; member->type_tag; ++member) {
                        decl_type *type;
                        decl_var *dvar;
                        decl_arg *darg;
 
-                       if (!member->name) {
-                               break;
-                       }
-
                        type = init_decl_type(member->type_tag, member->type_name);
-                       dvar = init_decl_var(member->name, member->pointer_level, member->array_size);
+                       dvar = init_decl_var(member->var_name, member->pointer_level, member->array_size);
                        darg = init_decl_arg(type, dvar);
-                       darg->layout = init_decl_struct_layout(member->off, member->len);
+                       darg->layout = init_decl_struct_layout(member->offset, member->size);
                        dargs = add_decl_arg(dargs, darg);
                }
 
-               dstruct = init_decl_struct(pre->name, dargs);
-               dstruct->size = pre->size;
                T.structs = add_decl_struct(T.structs, dstruct);
+               predef_struct = member;
+       }
+       for (predef_decl = &psi_predef_decls[0]; predef_decl->type_tag; ++predef_decl) {
+               struct psi_predef_decl *farg;
+               decl_type *ftype = init_decl_type(predef_decl->type_tag, predef_decl->type_name);
+               decl_var *fname = init_decl_var(predef_decl->var_name, predef_decl->pointer_level, predef_decl->array_size);
+               decl_arg *func = init_decl_arg(ftype, fname);
+               decl_args *args = init_decl_args(NULL);
+               decl *decl = init_decl(init_decl_abi("default"), func, args);
+
+
+               for (farg = &predef_decl[1]; farg->type_tag; ++farg) {
+                       decl_type *arg_type = init_decl_type(farg->type_tag, farg->type_name);
+                       decl_var *arg_var = init_decl_var(farg->var_name, farg->pointer_level, farg->array_size);
+                       decl_arg *darg = init_decl_arg(arg_type, arg_var);
+                       args = add_decl_arg(args, darg);
+               }
+
+               T.decls = add_decl(T.decls, decl);
+               predef_decl = farg;
        }
 
-       for (i = 0; i < psi_predef_type_count(); ++i) {
+       for (i = 0; i < T.defs->count; ++i) {
                decl_typedef *def = T.defs->list[i];
 
                if (validate_decl_typedef(&T, def)) {
@@ -775,7 +818,7 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr
                }
        }
 
-       for (i = 0; i < psi_predef_const_count(); ++i) {
+       for (i = 0; i < T.consts->count; ++i) {
                constant *constant = T.consts->list[i];
 
                if (validate_constant(&T, constant)) {
@@ -783,7 +826,7 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr
                }
        }
 
-       for (i = 0; i < psi_predef_struct_count(); ++i) {
+       for (i = 0; i < T.structs->count; ++i) {
                decl_struct *dstruct = T.structs->list[i];
 
                if (validate_decl_struct(&T, dstruct)) {
@@ -791,6 +834,14 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr
                }
        }
 
+       for (i = 0; i < T.decls->count; ++i) {
+               decl *decl = T.decls->list[i];
+
+               if (validate_decl(&T, NULL, decl)) {
+                       C->decls = add_decl(C->decls, decl);
+               }
+       }
+
        C->count = 1;
        C->data = malloc(sizeof(*C->data));
        PSI_DataExchange(C->data, &T);
@@ -873,7 +924,7 @@ static int psi_select_dirent(const struct dirent *entry)
 
 void PSI_ContextBuild(PSI_Context *C, const char *paths)
 {
-       int i, n, flags = getenv("PSI_DEBUG") ? PSI_PARSER_DEBUG : 0;
+       int i, n, flags = psi_check_env("PSI_DEBUG") ? PSI_PARSER_DEBUG : 0;
        char *sep = NULL, *cpy = strdup(paths), *ptr = cpy;
        struct dirent **entries = NULL;
 
index 0994630984786b3205d33ce08a77cece05c313e7..469fb4d6f72498ea7f5ecf9c70e0c87b66e5941f 100644 (file)
@@ -740,7 +740,7 @@ PHP_MINIT_FUNCTION(psi)
        PSI_ContextInit(&PSI_G(context), ops, psi_error);
        PSI_ContextBuild(&PSI_G(context), PSI_G(directory));
 
-       if (getenv("PSI_DUMP")) {
+       if (psi_check_env("PSI_DUMP")) {
                PSI_ContextDump(&PSI_G(context), STDOUT_FILENO);
        }