diff options
455 files changed, 42831 insertions, 20892 deletions
diff --git a/.travis.yml b/.travis.yml index 48d8031bd0..43bf0c7fb5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,9 +32,12 @@ script: - ./otp_build all -a after_success: + - $ERL_TOP/bin/dialyzer --build_plt --apps asn1 compiler crypto dialyzer edoc erts et hipe inets kernel mnesia observer public_key runtime_tools snmp ssh ssl stdlib syntax_tools wx xmerl --statistics + - $ERL_TOP/bin/dialyzer -n -Wunknown -Wunmatched_returns --apps compiler erts kernel stdlib --statistics + - $ERL_TOP/bin/dialyzer -n -Wunknown -Wunmatched_returns --apps asn1 crypto dialyzer --statistics + - $ERL_TOP/bin/dialyzer -n -Wunknown -Wunmatched_returns --apps hipe parsetools public_key --statistics + - $ERL_TOP/bin/dialyzer -n -Wunknown -Wunmatched_returns --apps runtime_tools sasl tools --statistics - ./otp_build tests && make release_docs after_script: - cd $ERL_TOP/release/tests/test_server && $ERL_TOP/bin/erl -s ts install -s ts smoke_test batch -s init stop - - diff --git a/HOWTO/INSTALL-WIN32.md b/HOWTO/INSTALL-WIN32.md index d7be255e9f..c74107d749 100644 --- a/HOWTO/INSTALL-WIN32.md +++ b/HOWTO/INSTALL-WIN32.md @@ -392,7 +392,7 @@ tools: LIB="$WIN_VISUAL_STUDIO_ROOT\\VC\\lib\\;$WIN_SDK\\lib\\winv6.3\\um\\x86" - INCLUDE="$WIN_VISUAL_STUDIO_ROOT\\VC\\include\\;$WIN_SDK\\include\\shared\\; + INCLUDE="$WIN_VISUAL_STUDIO_ROOT\\VC\\include\\;$WIN_SDK\\include\\shared\\;\ $WIN_SDK\\include\\um;$WIN_SDK\\include\\winrt\\;$WIN_SDK\\include\\um\\gl" export CYGWIN PATH LIBPATH LIB INCLUDE diff --git a/HOWTO/INSTALL.md b/HOWTO/INSTALL.md index 551ecdd224..447a23128f 100644 --- a/HOWTO/INSTALL.md +++ b/HOWTO/INSTALL.md @@ -568,6 +568,10 @@ as before, but the build process will take a much longer time. > automatically when `make` is invoked from `$ERL_TOP` with either the > `clean` target, or the default target. It is also automatically invoked > if `./otp_build remove_prebuilt_files` is invoked. +> +> If you need to verify the bootstrap beam files match the provided +> source files, use `./otp_build update_primary` to create a new commit that +> contains differences, if any exist. #### How to Build a Debug Enabled Erlang RunTime System #### diff --git a/bootstrap/bin/start.boot b/bootstrap/bin/start.boot Binary files differindex 4a1f656c3c..9956d75a24 100644 --- a/bootstrap/bin/start.boot +++ b/bootstrap/bin/start.boot diff --git a/bootstrap/bin/start_clean.boot b/bootstrap/bin/start_clean.boot Binary files differindex 4a1f656c3c..9956d75a24 100644 --- a/bootstrap/bin/start_clean.boot +++ b/bootstrap/bin/start_clean.boot diff --git a/bootstrap/lib/compiler/ebin/beam_asm.beam b/bootstrap/lib/compiler/ebin/beam_asm.beam Binary files differindex 481d43c967..1214600cc5 100644 --- a/bootstrap/lib/compiler/ebin/beam_asm.beam +++ b/bootstrap/lib/compiler/ebin/beam_asm.beam diff --git a/bootstrap/lib/compiler/ebin/beam_block.beam b/bootstrap/lib/compiler/ebin/beam_block.beam Binary files differindex b6a4b6f10f..95846cdda9 100644 --- a/bootstrap/lib/compiler/ebin/beam_block.beam +++ b/bootstrap/lib/compiler/ebin/beam_block.beam diff --git a/bootstrap/lib/compiler/ebin/beam_bsm.beam b/bootstrap/lib/compiler/ebin/beam_bsm.beam Binary files differindex 48e8f80f79..fbea0b152b 100644 --- a/bootstrap/lib/compiler/ebin/beam_bsm.beam +++ b/bootstrap/lib/compiler/ebin/beam_bsm.beam diff --git a/bootstrap/lib/compiler/ebin/beam_dict.beam b/bootstrap/lib/compiler/ebin/beam_dict.beam Binary files differindex 4e12260e65..5561744faa 100644 --- a/bootstrap/lib/compiler/ebin/beam_dict.beam +++ b/bootstrap/lib/compiler/ebin/beam_dict.beam diff --git a/bootstrap/lib/compiler/ebin/beam_jump.beam b/bootstrap/lib/compiler/ebin/beam_jump.beam Binary files differindex 2d1961570f..bceb7936d6 100644 --- a/bootstrap/lib/compiler/ebin/beam_jump.beam +++ b/bootstrap/lib/compiler/ebin/beam_jump.beam diff --git a/bootstrap/lib/compiler/ebin/beam_split.beam b/bootstrap/lib/compiler/ebin/beam_split.beam Binary files differindex 4a63468419..524e9a3078 100644 --- a/bootstrap/lib/compiler/ebin/beam_split.beam +++ b/bootstrap/lib/compiler/ebin/beam_split.beam diff --git a/bootstrap/lib/compiler/ebin/beam_utils.beam b/bootstrap/lib/compiler/ebin/beam_utils.beam Binary files differindex 25cd7ce430..36f23e98cc 100644 --- a/bootstrap/lib/compiler/ebin/beam_utils.beam +++ b/bootstrap/lib/compiler/ebin/beam_utils.beam diff --git a/bootstrap/lib/compiler/ebin/beam_validator.beam b/bootstrap/lib/compiler/ebin/beam_validator.beam Binary files differindex 9d952f0a64..07cfa5a87a 100644 --- a/bootstrap/lib/compiler/ebin/beam_validator.beam +++ b/bootstrap/lib/compiler/ebin/beam_validator.beam diff --git a/bootstrap/lib/compiler/ebin/compile.beam b/bootstrap/lib/compiler/ebin/compile.beam Binary files differindex 044ed03d93..163d9b8432 100644 --- a/bootstrap/lib/compiler/ebin/compile.beam +++ b/bootstrap/lib/compiler/ebin/compile.beam diff --git a/bootstrap/lib/compiler/ebin/compiler.app b/bootstrap/lib/compiler/ebin/compiler.app index ebd5205219..fd908e3c3f 100644 --- a/bootstrap/lib/compiler/ebin/compiler.app +++ b/bootstrap/lib/compiler/ebin/compiler.app @@ -19,7 +19,7 @@ {application, compiler, [{description, "ERTS CXC 138 10"}, - {vsn, "7.0.1"}, + {vsn, "7.0.2"}, {modules, [ beam_a, beam_asm, diff --git a/bootstrap/lib/compiler/ebin/core_parse.beam b/bootstrap/lib/compiler/ebin/core_parse.beam Binary files differindex 2599138a8c..c85f2ec140 100644 --- a/bootstrap/lib/compiler/ebin/core_parse.beam +++ b/bootstrap/lib/compiler/ebin/core_parse.beam diff --git a/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam b/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam Binary files differindex 81da8b62c5..47b804d61d 100644 --- a/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam +++ b/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam diff --git a/bootstrap/lib/compiler/ebin/sys_core_fold.beam b/bootstrap/lib/compiler/ebin/sys_core_fold.beam Binary files differindex 75a6570461..f3bbc3401c 100644 --- a/bootstrap/lib/compiler/ebin/sys_core_fold.beam +++ b/bootstrap/lib/compiler/ebin/sys_core_fold.beam diff --git a/bootstrap/lib/compiler/ebin/v3_codegen.beam b/bootstrap/lib/compiler/ebin/v3_codegen.beam Binary files differindex 6afb674a9f..cb64a1a2ac 100644 --- a/bootstrap/lib/compiler/ebin/v3_codegen.beam +++ b/bootstrap/lib/compiler/ebin/v3_codegen.beam diff --git a/bootstrap/lib/kernel/ebin/code_server.beam b/bootstrap/lib/kernel/ebin/code_server.beam Binary files differindex 7f073fe932..8cd118bc9d 100644 --- a/bootstrap/lib/kernel/ebin/code_server.beam +++ b/bootstrap/lib/kernel/ebin/code_server.beam diff --git a/bootstrap/lib/kernel/ebin/disk_log_1.beam b/bootstrap/lib/kernel/ebin/disk_log_1.beam Binary files differindex 6b10d652de..4e819c4899 100644 --- a/bootstrap/lib/kernel/ebin/disk_log_1.beam +++ b/bootstrap/lib/kernel/ebin/disk_log_1.beam diff --git a/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam b/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam Binary files differindex f6715adbfe..c8edaa58d1 100644 --- a/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam +++ b/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam diff --git a/bootstrap/lib/kernel/ebin/inet.beam b/bootstrap/lib/kernel/ebin/inet.beam Binary files differindex ff7f0ba7e6..b11c8fa56d 100644 --- a/bootstrap/lib/kernel/ebin/inet.beam +++ b/bootstrap/lib/kernel/ebin/inet.beam diff --git a/bootstrap/lib/kernel/ebin/kernel.app b/bootstrap/lib/kernel/ebin/kernel.app index a4600713e5..1c82da1c01 100644 --- a/bootstrap/lib/kernel/ebin/kernel.app +++ b/bootstrap/lib/kernel/ebin/kernel.app @@ -22,7 +22,7 @@ {application, kernel, [ {description, "ERTS CXC 138 10"}, - {vsn, "5.0"}, + {vsn, "5.1"}, {modules, [application, application_controller, application_master, @@ -118,6 +118,6 @@ {applications, []}, {env, [{error_logger, tty}]}, {mod, {kernel, []}}, - {runtime_dependencies, ["erts-8.0", "stdlib-3.0", "sasl-3.0"]} + {runtime_dependencies, ["erts-8.1", "stdlib-3.0", "sasl-3.0"]} ] }. diff --git a/bootstrap/lib/kernel/ebin/kernel.appup b/bootstrap/lib/kernel/ebin/kernel.appup index 1ed9771492..28f35f54d2 100644 --- a/bootstrap/lib/kernel/ebin/kernel.appup +++ b/bootstrap/lib/kernel/ebin/kernel.appup @@ -16,11 +16,11 @@ %% limitations under the License. %% %% %CopyrightEnd% -{"5.0", +{"5.1", %% Up from - max one major revision back - [{<<"5\\.0(\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* + [{<<"5\\.[0-1](\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* {<<"4\\.[0-2](\\.[0-9]+)*">>,[restart_new_emulator]}], % OTP-18.* %% Down to - max one major revision back - [{<<"5\\.0(\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* + [{<<"5\\.[0-1](\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* {<<"4\\.[0-2](\\.[0-9]+)*">>,[restart_new_emulator]}] % OTP-18.* }. diff --git a/bootstrap/lib/kernel/ebin/os.beam b/bootstrap/lib/kernel/ebin/os.beam Binary files differindex 9ebe6c770f..f5f81c5838 100644 --- a/bootstrap/lib/kernel/ebin/os.beam +++ b/bootstrap/lib/kernel/ebin/os.beam diff --git a/bootstrap/lib/stdlib/ebin/edlin_expand.beam b/bootstrap/lib/stdlib/ebin/edlin_expand.beam Binary files differindex adc0f4ba1c..9c368c5e90 100644 --- a/bootstrap/lib/stdlib/ebin/edlin_expand.beam +++ b/bootstrap/lib/stdlib/ebin/edlin_expand.beam diff --git a/bootstrap/lib/stdlib/ebin/erl_parse.beam b/bootstrap/lib/stdlib/ebin/erl_parse.beam Binary files differindex d75b490162..d58ca32495 100644 --- a/bootstrap/lib/stdlib/ebin/erl_parse.beam +++ b/bootstrap/lib/stdlib/ebin/erl_parse.beam diff --git a/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam b/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam Binary files differindex 0e61e87708..b845a64248 100644 --- a/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam +++ b/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam diff --git a/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam b/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam Binary files differindex 46eafce18e..af784cf79d 100644 --- a/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam +++ b/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam diff --git a/bootstrap/lib/stdlib/ebin/gen_statem.beam b/bootstrap/lib/stdlib/ebin/gen_statem.beam Binary files differindex 3dc104f1c3..c52a159368 100644 --- a/bootstrap/lib/stdlib/ebin/gen_statem.beam +++ b/bootstrap/lib/stdlib/ebin/gen_statem.beam diff --git a/bootstrap/lib/stdlib/ebin/ms_transform.beam b/bootstrap/lib/stdlib/ebin/ms_transform.beam Binary files differindex 2c0eb8a742..c72dd5c717 100644 --- a/bootstrap/lib/stdlib/ebin/ms_transform.beam +++ b/bootstrap/lib/stdlib/ebin/ms_transform.beam diff --git a/bootstrap/lib/stdlib/ebin/stdlib.app b/bootstrap/lib/stdlib/ebin/stdlib.app index 81b30526ab..3172169b30 100644 --- a/bootstrap/lib/stdlib/ebin/stdlib.app +++ b/bootstrap/lib/stdlib/ebin/stdlib.app @@ -20,7 +20,7 @@ %% {application, stdlib, [{description, "ERTS CXC 138 10"}, - {vsn, "3.0.1"}, + {vsn, "3.1"}, {modules, [array, base64, beam_lib, diff --git a/bootstrap/lib/stdlib/ebin/stdlib.appup b/bootstrap/lib/stdlib/ebin/stdlib.appup index 322a329931..db27ef6efd 100644 --- a/bootstrap/lib/stdlib/ebin/stdlib.appup +++ b/bootstrap/lib/stdlib/ebin/stdlib.appup @@ -16,11 +16,11 @@ %% limitations under the License. %% %% %CopyrightEnd% -{"3.0.1", +{"3.1", %% Up from - max one major revision back - [{<<"3\\.0(\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* + [{<<"3\\.[0-1](\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* {<<"2\\.[5-8](\\.[0-9]+)*">>,[restart_new_emulator]}], % OTP-18.* %% Down to - max one major revision back - [{<<"3\\.0(\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* + [{<<"3\\.[0-1](\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* {<<"2\\.[5-8](\\.[0-9]+)*">>,[restart_new_emulator]}] % OTP-18.* }. diff --git a/bootstrap/lib/stdlib/ebin/supervisor.beam b/bootstrap/lib/stdlib/ebin/supervisor.beam Binary files differindex c7534b5438..a05ae66941 100644 --- a/bootstrap/lib/stdlib/ebin/supervisor.beam +++ b/bootstrap/lib/stdlib/ebin/supervisor.beam diff --git a/bootstrap/lib/stdlib/ebin/zip.beam b/bootstrap/lib/stdlib/ebin/zip.beam Binary files differindex 919166fe89..a0b09cd576 100644 --- a/bootstrap/lib/stdlib/ebin/zip.beam +++ b/bootstrap/lib/stdlib/ebin/zip.beam diff --git a/configure.in b/configure.in index 8dd4e588d7..a149acbb55 100644 --- a/configure.in +++ b/configure.in @@ -105,7 +105,6 @@ else fi AC_SUBST(CROSS_COMPILING) - AC_ARG_ENABLE(bootstrap-only, AS_HELP_STRING([--enable-bootstrap-only], [enable bootstrap only configuration]), @@ -371,6 +370,49 @@ if test X${enable_native_libs} = Xyes -a X${enable_hipe} != Xno; then fi AC_SUBST(NATIVE_LIBS_ENABLED) +if test $CROSS_COMPILING = no; then + case $host_os in + darwin*) + macosx_version=`sw_vers -productVersion` + test $? -eq 0 || { + AC_MSG_ERROR([Failed to execute 'sw_vers'; please provide it in PATH]) + } + [case "$macosx_version" in + [1-9][0-9].[0-9]) + int_macosx_version=`echo $macosx_version | sed 's|\([^\.]*\)\.\([^\.]*\)|\1\2|'`;; + [1-9][0-9].[0-9].[0-9]) + int_macosx_version=`echo $macosx_version | sed 's|\([^\.]*\)\.\([^\.]*\)\.\([^\.]*\)|\1\2\3|'`;; + [1-9][0-9].[1-9][0-9]) + int_macosx_version=`echo $macosx_version | sed 's|\([^\.]*\)\.\([^\.]*\)|\1\200|'`;; + [1-9][0-9].[1-9][0-9].[0-9]) + int_macosx_version=`echo $macosx_version | sed 's|\([^\.]*\)\.\([^\.]*\)\.\([^\.]*\)|\1\20\3|'`;; + [1-9][0-9].[1-9][0-9].[1-9][0-9]) + int_macosx_version=`echo $macosx_version | sed 's|\([^\.]*\)\.\([^\.]*\)\.\([^\.]*\)|\1\2\3|'`;; + *) + int_macosx_version=unexpected;; + esac] + test $int_macosx_version != unexpected || { + AC_MSG_ERROR([Unexpected MacOSX version ($macosx_version) returned by 'sw_vers -productVersion'; this configure script probably needs to be updated]) + } + AC_TRY_COMPILE([ +#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > $int_macosx_version +#error Compiling for a newer MacOSX version... +#endif + ], [;], + [], + [AC_MSG_ERROR([ + + You are natively building Erlang/OTP for a later version of MacOSX + than current version ($macosx_version). You either need to + cross-build Erlang/OTP, or set the environment variable + MACOSX_DEPLOYMENT_TARGET to $macosx_version (or a lower version). + +])]) + ;; + *) + ;; + esac +fi rm -f $ERL_TOP/lib/SKIP-APPLICATIONS for app in `cd lib && ls -d *`; do diff --git a/erts/aclocal.m4 b/erts/aclocal.m4 index 013bfe5652..6c0544da31 100644 --- a/erts/aclocal.m4 +++ b/erts/aclocal.m4 @@ -736,10 +736,23 @@ AC_DEFUN(ERL_MONOTONIC_CLOCK, ;; esac + clock_gettime_lib="" + AC_CHECK_LIB(rt, clock_gettime, [clock_gettime_lib="-lrt"]) + + save_LIBS="$LIBS" + LIBS="$LIBS $clock_gettime_lib" + + if test "$LD_MAY_BE_WEAK" != "no"; then + trust_test="#error May not be there due to weak linking" + else + trust_test="" + fi + AC_CACHE_CHECK([for clock_gettime(CLOCK_MONOTONIC_RAW, _)], erl_cv_clock_gettime_monotonic_raw, [ - AC_TRY_COMPILE([ + AC_TRY_LINK([ #include <time.h> +$trust_test ], [ struct timespec ts; @@ -755,8 +768,9 @@ AC_DEFUN(ERL_MONOTONIC_CLOCK, AC_CACHE_CHECK([for clock_gettime() with ${check_msg}monotonic clock type], erl_cv_clock_gettime_monotonic_$1, [ for clock_type in $prefer_resolution_clock_gettime_monotonic $default_resolution_clock_gettime_monotonic $high_resolution_clock_gettime_monotonic $low_resolution_clock_gettime_monotonic; do - AC_TRY_COMPILE([ + AC_TRY_LINK([ #include <time.h> +$trust_test ], [ struct timespec ts; @@ -771,7 +785,15 @@ AC_DEFUN(ERL_MONOTONIC_CLOCK, done ]) - AC_CHECK_FUNCS([clock_getres clock_get_attributes gethrtime]) + LIBS="$save_LIBS" + + if test "$LD_MAY_BE_WEAK" != "no"; then + check_for_clock_getres= + else + check_for_clock_getres=clock_getres + fi + + AC_CHECK_FUNCS([$check_for_clock_getres clock_get_attributes gethrtime]) AC_CACHE_CHECK([for mach clock_get_time() with monotonic clock type], erl_cv_mach_clock_get_time_monotonic, [ @@ -840,7 +862,7 @@ AC_DEFUN(ERL_MONOTONIC_CLOCK, break fi done - AC_CHECK_LIB(rt, clock_gettime, [erl_monotonic_clock_lib="-lrt"]) + erl_monotonic_clock_lib=$clock_gettime_lib ;; mach_clock_get_time) erl_monotonic_clock_id=SYSTEM_CLOCK @@ -879,11 +901,24 @@ AC_DEFUN(ERL_WALL_CLOCK, ;; esac + clock_gettime_lib="" + AC_CHECK_LIB(rt, clock_gettime, [clock_gettime_lib="-lrt"]) + + save_LIBS="$LIBS" + LIBS="$LIBS $clock_gettime_lib" + + if test "$LD_MAY_BE_WEAK" != "no"; then + trust_test="#error May not be there due to weak linking" + else + trust_test="" + fi + AC_CACHE_CHECK([for clock_gettime() with ${check_msg}wall clock type], erl_cv_clock_gettime_wall_$1, [ for clock_type in $prefer_resolution_clock_gettime_wall $default_resolution_clock_gettime_wall $high_resolution_clock_gettime_wall $low_resolution_clock_gettime_wall; do - AC_TRY_COMPILE([ + AC_TRY_LINK([ #include <time.h> +$trust_test ], [ struct timespec ts; @@ -898,7 +933,15 @@ AC_DEFUN(ERL_WALL_CLOCK, done ]) - AC_CHECK_FUNCS([clock_getres clock_get_attributes gettimeofday]) + LIBS="$save_LIBS" + + if test "$LD_MAY_BE_WEAK" != "no"; then + check_for_clock_getres= + else + check_for_clock_getres=clock_getres + fi + + AC_CHECK_FUNCS([$check_for_clock_getres clock_get_attributes gettimeofday]) AC_CACHE_CHECK([for mach clock_get_time() with wall clock type], erl_cv_mach_clock_get_time_wall, [ @@ -919,6 +962,7 @@ AC_DEFUN(ERL_WALL_CLOCK, erl_cv_mach_clock_get_time_wall=no) ]) + erl_wall_clock_lib= erl_wall_clock_low_resolution=no erl_wall_clock_id= case $1-$erl_cv_clock_gettime_wall_$1-$erl_cv_mach_clock_get_time_wall-$ac_cv_func_gettimeofday-$host_os in @@ -932,6 +976,7 @@ AC_DEFUN(ERL_WALL_CLOCK, ;; *-CLOCK_*-*-*-*) erl_wall_clock_func=clock_gettime + erl_wall_clock_lib=$clock_gettime_lib erl_wall_clock_id=$erl_cv_clock_gettime_wall_$1 for low_res_id in $low_resolution_clock_gettime_wall; do if test $erl_wall_clock_id = $low_res_id; then @@ -1680,7 +1725,7 @@ case "$THR_LIB_NAME" in AC_DEFINE(ETHR_HAVE_SCHED_YIELD, 1, [Define if you have the sched_yield() function.]) AC_MSG_CHECKING([whether sched_yield() returns an int]) sched_yield_ret_int=no - AC_TRY_COMPILE([ + AC_TRY_LINK([ #ifdef ETHR_HAVE_SCHED_H #include <sched.h> #endif @@ -1699,7 +1744,7 @@ case "$THR_LIB_NAME" in AC_DEFINE(ETHR_HAVE_PTHREAD_YIELD, 1, [Define if you have the pthread_yield() function.]) AC_MSG_CHECKING([whether pthread_yield() returns an int]) pthread_yield_ret_int=no - AC_TRY_COMPILE([ + AC_TRY_LINK([ #if defined(ETHR_NEED_NPTL_PTHREAD_H) #include <nptl/pthread.h> #elif defined(ETHR_HAVE_MIT_PTHREAD_H) @@ -2436,7 +2481,13 @@ if test $erl_monotonic_clock_low_resolution = yes; then AC_DEFINE(ERTS_HAVE_LOW_RESOLUTION_OS_MONOTONIC_LOW, [1], [Define if you have a low resolution OS monotonic clock]) fi -xrtlib="$erl_monotonic_clock_lib" +xrtlib= +if test "$erl_monotonic_clock_lib" != ""; then + xrtlib="$erl_monotonic_clock_lib" +fi +if test "$erl_wall_clock_lib" != ""; then + xrtlib="$erl_wall_clock_lib" +fi if test "x$erl_monotonic_clock_id" != "x"; then AC_DEFINE_UNQUOTED(MONOTONIC_CLOCK_ID_STR, ["$erl_monotonic_clock_id"], [Define as a string of monotonic clock id to use]) AC_DEFINE_UNQUOTED(MONOTONIC_CLOCK_ID, [$erl_monotonic_clock_id], [Define to monotonic clock id to use]) diff --git a/erts/configure.in b/erts/configure.in index 7455516def..ad9a66126f 100644 --- a/erts/configure.in +++ b/erts/configure.in @@ -881,6 +881,22 @@ dnl for now that is the way we do it. USER_LD=$LD USER_LDFLAGS="$LDFLAGS" LD='$(CC)' +case $host_os in + darwin*) + saved_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,-no_weak_imports" + AC_TRY_LINK([],[], + [ + LD_MAY_BE_WEAK=no + ], + [ + LD_MAY_BE_WEAK=yes + LDFLAGS="$saved_LDFLAGS" + ]);; + *) + LD_MAY_BE_WEAK=no;; +esac + AC_SUBST(LD) LDFLAG_RUNTIME_LIBRARY_PATH="$CFLAG_RUNTIME_LIBRARY_PATH" @@ -1971,7 +1987,7 @@ getaddrinfo("","",NULL,NULL); if test $have_getaddrinfo = yes; then AC_MSG_RESULT([yes]) AC_MSG_CHECKING([whether getaddrinfo accepts enough flags]) - AC_TRY_COMPILE([ + AC_TRY_LINK([ #include <stdlib.h> #include <string.h> #ifdef HAVE_WINSOCK2_H @@ -2086,7 +2102,7 @@ int main(void) { fi]);; esac -if test $have_posix_memalign = yes; then +if test "$have_posix_memalign" = "yes"; then AC_DEFINE(HAVE_POSIX_MEMALIGN,[1], [Define to 1 if you have the `posix_memalign' function.]) fi @@ -2228,7 +2244,7 @@ dnl Checks for features/quirks in the system that affects Erlang. dnl ---------------------------------------------------------------------- AC_MSG_CHECKING([for sched_getaffinity/sched_setaffinity]) -AC_TRY_COMPILE([#include <sched.h>], +AC_TRY_LINK([#include <sched.h>], [ #ifndef CPU_SETSIZE #error no CPU_SETSIZE @@ -2251,7 +2267,7 @@ fi AC_MSG_CHECKING([for pset functionality]) -AC_TRY_COMPILE([#include <sys/pset.h>], +AC_TRY_LINK([#include <sys/pset.h>], [ int res; psetid_t id = PS_MYID; @@ -2269,7 +2285,7 @@ if test $pset_functionality = yes; then fi AC_MSG_CHECKING([for processor_bind functionality]) -AC_TRY_COMPILE([ +AC_TRY_LINK([ #include <sys/types.h> #include <sys/processor.h> #include <sys/procset.h> @@ -2285,7 +2301,7 @@ if test $processor_bind_functionality = yes; then fi AC_MSG_CHECKING([for cpuset_getaffinity/cpuset_setaffinity]) -AC_TRY_COMPILE([ +AC_TRY_LINK([ #include <sys/param.h> #include <sys/cpuset.h> ], @@ -2484,7 +2500,7 @@ if test "x$ac_cv_func_sbrk" = "xyes"; then for rtype in $ret_types; do for atype in $arg_types; do IFS=$save_ifs - AC_TRY_COMPILE([#include <sys/types.h> + AC_TRY_LINK([#include <sys/types.h> #include <unistd.h>], [$rtype sbrk($atype incr);], [erts_cv_sbrk_ret_arg_types="$rtype,$atype"]) @@ -2521,7 +2537,7 @@ if test $ac_cv_func_brk = yes; then for rtype in $ret_types; do for atype in $arg_types; do IFS=$save_ifs - AC_TRY_COMPILE([#include <sys/types.h> + AC_TRY_LINK([#include <sys/types.h> #include <unistd.h>], [$rtype brk($atype endds);], [erts_cv_brk_ret_arg_types="$rtype,$atype"]) @@ -2778,6 +2794,23 @@ if test "$cross_compiling" != "yes" && test X${enable_hipe} != Xno; then fi fi +dnl Check to disable -fPIE and friends for HiPE on amd64 +if test X${enable_hipe} = Xyes && test X$ARCH = Xamd64; then + AC_TRY_COMPILE(, [#if defined(__pie__) || defined(__PIE__) + #error -fPIE is enabled by default + #endif], + [AC_MSG_NOTICE([No -fPIE enabled by default])], + [AC_MSG_WARN([Security feature -fPIE will be disabled for HiPE]) + STATIC_CFLAGS="-fno-PIE $STATIC_CFLAGS" + saved_LDFLAGS=$LDFLAGS + LDFLAGS="-no-pie $LDFLAGS" + AC_TRY_LINK(,, [], + [AC_MSG_WARN([Linked does not accept option -no-pie]) + LDFLAGS=$saved_LDFLAGS])]) + +fi + + if test X${enable_fp_exceptions} = Xauto ; then case $host_os in *linux*) @@ -2805,7 +2838,7 @@ if test X${enable_fp_exceptions} != Xyes ; then FPE=unreliable else - AC_MSG_CHECKING([for unreliable floating point execptions]) + AC_MSG_CHECKING([for unreliable floating point exceptions]) AC_TRY_RUN([ @@ -3543,7 +3576,7 @@ fi # if test $have_kernel_poll = epoll; then AC_MSG_CHECKING([whether epoll is level triggered]) - AC_TRY_COMPILE([#include <sys/epoll.h>],[ + AC_TRY_LINK([#include <sys/epoll.h>],[ #ifdef EPOLLET /* Edge triggered option exist, assume level triggered is default */ diff --git a/erts/doc/src/erl.xml b/erts/doc/src/erl.xml index f62d3fb170..f2a55f6298 100644 --- a/erts/doc/src/erl.xml +++ b/erts/doc/src/erl.xml @@ -250,6 +250,11 @@ environment variable <c><![CDATA[DISPLAY]]></c> set to <c><![CDATA[gin:0]]></c>.</p> </item> + <tag><c><![CDATA[-epmd_module Module]]></c> (init flag)</tag> + <item> + <p>Configures the module responsible to communicate to + <seealso marker="epmd">epmd</seealso>. Defaults to <c>erl_epmd</c>.</p> + </item> <tag><c><![CDATA[-eval Expr]]></c> (init flag)</tag> <item> <p>Makes <c><![CDATA[init]]></c> evaluate the expression @@ -393,9 +398,11 @@ <tag><c><![CDATA[-pa Dir1 Dir2 ...]]></c></tag> <item> <p>Adds the specified directories to the beginning of the code - path, similar to <c><![CDATA[code:add_pathsa/1]]></c>; see - <seealso marker="kernel:code"><c>code(3)</c></seealso>. - As an alternative to <c>-pa</c>, if several directories are + path, similar to <seealso marker="kernel:code#add_pathsa/1"> + <c><![CDATA[code:add_pathsa/1]]></c></seealso>. Note that the + order of the given directories will be reversed in the + resulting path.</p> + <p>As an alternative to <c>-pa</c>, if several directories are to be prepended to the code path and the directories have a common parent directory, that parent directory can be specified in environment variable <c>ERL_LIBS</c>; see @@ -1533,6 +1540,15 @@ </item> </taglist> </item> + <tag><c><![CDATA[ERL_CRASH_DUMP_BYTES]]></c></tag> + <item> + <p>This variable sets the maximum size of a crash dump file in bytes. + The crash dump will be truncated if this limit is exceeded. If the + variable is not set, no size limit is enforced by default. If the + variable is set to <c>0</c>, the runtime system does not even attempt + to write a crash dump file.</p> + <p>Introduced in ERTS 8.1.2 (Erlang/OTP 19.2).</p> + </item> <tag><marker id="ERL_AFLAGS"/><c><![CDATA[ERL_AFLAGS]]></c></tag> <item> <p>The content of this variable is added to the beginning of the diff --git a/erts/doc/src/erl_driver.xml b/erts/doc/src/erl_driver.xml index 836a58a676..d8bf45c523 100644 --- a/erts/doc/src/erl_driver.xml +++ b/erts/doc/src/erl_driver.xml @@ -1916,9 +1916,9 @@ r = driver_async(myPort, &myKey, myData, myFunc); ]]></code> returned. Another thread can still be using the event object internally. To safely close an event object, call <c>driver_select</c> with <c>ERL_DRV_USE</c> and <c>on==0</c>, which - clears all events. Then call - <seealso marker="driver_entry#stop_select"> - <c>stop_select</c></seealso> when it is safe to close the event + clears all events and then either calls + <seealso marker="driver_entry#stop_select"><c>stop_select</c></seealso> + or schedules it to be called when it is safe to close the event object. <c>ERL_DRV_USE</c> is to be set together with the first event for an event object. It is harmless to set <c>ERL_DRV_USE</c> even if it already has been done. Clearing all events but keeping @@ -2039,7 +2039,7 @@ r = driver_async(myPort, &myKey, myData, myFunc); ]]></code> <fsummary>Set and get limits for busy port message queue.</fsummary> <desc> <marker id="erl_drv_busy_msgq_limits"></marker> - <p>Sets and gets limits that will be used for controling the + <p>Sets and gets limits that will be used for controlling the busy state of the port message queue.</p> <p>The port message queue is set into a busy state when the amount of command data queued on the @@ -2112,7 +2112,7 @@ r = driver_async(myPort, &myKey, myData, myFunc); ]]></code> It is used to identify the condition variable in planned future debug functionality.</p> <p>Returns <c>NULL</c> on failure. The driver - creating the condition variable is responsibile for + creating the condition variable is responsible for destroying it before the driver is unloaded.</p> <p>This function is thread-safe.</p> </desc> diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml index 950a5fe189..9646953518 100644 --- a/erts/doc/src/erlang.xml +++ b/erts/doc/src/erlang.xml @@ -516,7 +516,14 @@ Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).</code> <desc> <p>Returns an Erlang term that is the result of decoding binary object <c><anno>Binary</anno></c>, which must be encoded - according to the Erlang external term format.</p> + according to the <seealso marker="erts:erl_ext_dist"> + Erlang external term format</seealso>.</p> + <pre> +> <input>Bin = term_to_binary(hello).</input> +<<131,100,0,5,104,101,108,108,111>> +> <input>hello = binary_to_term(Bin).</input> +hello +</pre> <warning> <p>When decoding binaries from untrusted sources, consider using <c>binary_to_term/2</c> to prevent Denial @@ -555,6 +562,14 @@ Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).</code> </taglist> <p>Failure: <c>badarg</c> if <c>safe</c> is specified and unsafe data is decoded.</p> + <pre> +> <input>binary_to_term(<<131,100,0,5,104,101,108,108,111>>, [safe]).</input> +** exception error: bad argument +> <input>hello.</input> +hello +> <input>binary_to_term(<<131,100,0,5,104,101,108,108,111>>, [safe]).</input> +hello +</pre> <p>See also <seealso marker="#term_to_binary/1"><c>term_to_binary/1</c></seealso>, <seealso marker="#binary_to_term/1"> @@ -8599,12 +8614,19 @@ ok </fsummary> <desc> <p>Returns a binary data object that is the result of encoding - <c><anno>Term</anno></c> according to the Erlang external - term format.</p> + <c><anno>Term</anno></c> according to the + <seealso marker="erts:erl_ext_dist">Erlang external + term format.</seealso></p> <p>This can be used for various purposes, for example, writing a term to a file in an efficient way, or sending an Erlang term to some type of communications channel not supported by distributed Erlang.</p> + <pre> +> <input>Bin = term_to_binary(hello).</input> +<<131,100,0,5,104,101,108,108,111>> +> <input>hello = binary_to_term(Bin).</input> +hello +</pre> <p>See also <seealso marker="#binary_to_term/1"> <c>binary_to_term/1</c></seealso>.</p> </desc> @@ -9507,6 +9529,10 @@ timestamp() -> <type name="trace_info_item_result"/> <type name="trace_info_flag"/> <type name="trace_match_spec"/> + <type name="match_variable"/> + <type_desc name="match_variable"> + Approximation of '$1' | '$2' | '$3' | ... + </type_desc> <desc> <p>Returns trace information about a port, process, function, or event.</p> @@ -9638,6 +9664,10 @@ timestamp() -> </fsummary> <type name="trace_pattern_mfa"/> <type name="trace_match_spec"/> + <type_desc name="match_variable"> + Approximation of '$1' | '$2' | '$3' | ... + </type_desc> + <type name="match_variable"/> <desc> <p>The same as <seealso marker="#trace_pattern/3"> @@ -9650,6 +9680,10 @@ timestamp() -> <name name="trace_pattern" arity="3" clause_i="1"/> <fsummary>Set trace pattern for message sending.</fsummary> <type name="trace_match_spec"/> + <type name="match_variable"/> + <type_desc name="match_variable"> + Approximation of '$1' | '$2' | '$3' | ... + </type_desc> <desc> <p>Sets trace pattern for <em>message sending</em>. Must be combined with @@ -9717,6 +9751,10 @@ timestamp() -> <name name="trace_pattern" arity="3" clause_i="2"/> <fsummary>Set trace pattern for tracing of message receiving.</fsummary> <type name="trace_match_spec"/> + <type name="match_variable"/> + <type_desc name="match_variable"> + Approximation of '$1' | '$2' | '$3' | ... + </type_desc> <desc> <p>Sets trace pattern for <em>message receiving</em>. Must be combined with @@ -9787,6 +9825,10 @@ timestamp() -> <type name="trace_pattern_mfa"/> <type name="trace_match_spec"/> <type name="trace_pattern_flag"/> + <type name="match_variable"/> + <type_desc name="match_variable"> + Approximation of '$1' | '$2' | '$3' | ... + </type_desc> <desc> <p>Enables or disables <em>call tracing</em> for one or more functions. Must be combined with diff --git a/erts/doc/src/run_erl.xml b/erts/doc/src/run_erl.xml index ad7b2c5b85..a9b6a7e2c6 100644 --- a/erts/doc/src/run_erl.xml +++ b/erts/doc/src/run_erl.xml @@ -49,7 +49,7 @@ <funcs> <func> <name>run_erl [-daemon] pipe_dir/ log_dir "exec command - [command_arguments]"</name> + arg1 arg2 ..."</name> <fsummary>Start the Erlang emulator without attached terminal.</fsummary> <desc> <p>Arguments:</p> @@ -92,11 +92,10 @@ </item> </list> </item> - <tag><c>"exec command [command_arguments]"</c></tag> + <tag><c>"exec command arg1 arg2 ..."</c></tag> <item> - <p>In the third argument, <c><![CDATA[command]]></c> is the - executable to execute where everything written to <c>stdin</c> - and <c>stdout</c> is logged to <c><![CDATA[log_dir]]></c>.</p> + <p>A space-separated string specifying the program to be executed. + The second field is typically a command name such as <c>erl</c>.</p> </item> </taglist> </desc> @@ -105,7 +104,7 @@ <section> <title>Notes concerning the Log Files</title> - <p>While running, <c>run_erl</c> (as stated earlier) sends all output, + <p>While running, <c>run_erl</c> sends all output, uninterpreted, to a log file. The file is named <c><![CDATA[erlang.log.N]]></c>, where <c>N</c> is an integer. When the log is "full" (default log size is 100 KB), <c>run_erl</c> starts to log diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in index e0260205e3..8772befe27 100644 --- a/erts/emulator/Makefile.in +++ b/erts/emulator/Makefile.in @@ -49,6 +49,7 @@ CREATE_DIRS= LDFLAGS=@LDFLAGS@ ARFLAGS=rc OMIT_OMIT_FP=no +TYPE_LIBS= DIRTY_SCHEDULER_SUPPORT=@DIRTY_SCHEDULER_SUPPORT@ NEW_PURGE_STRATEGY=@NEW_PURGE_STRATEGY@ @@ -90,7 +91,7 @@ PURIFY = TYPEMARKER = .gcov TYPE_FLAGS = $(DEBUG_CFLAGS) -DERTS_GCOV -DNO_JUMP_TABLE -fprofile-arcs -ftest-coverage -O0 -DERTS_CAN_INLINE=0 -DERTS_INLINE= ifneq ($(findstring solaris,$(TARGET)),solaris) -LIBS += -lgcov +TYPE_LIBS = -lgcov endif ENABLE_ALLOC_TYPE_VARS += debug else @@ -146,6 +147,8 @@ endif endif endif +LIBS += $(TYPE_LIBS) + comma:=, space:= space+= @@ -931,7 +934,7 @@ $(OBJDIR)/%.o: hipe/%.c $(V_CC) $(subst O2,O3, $(CFLAGS)) $(INCLUDES) -c $< -o $@ $(BINDIR)/hipe_mkliterals$(TF_MARKER): $(OBJDIR)/hipe_mkliterals.o - $(ld_verbose)$(CC) $(CFLAGS) $(INCLUDES) -o $@ $< + $(ld_verbose)$(CC) $(LDFLAGS) -o $@ $< $(TYPE_LIBS) $(OBJDIR)/hipe_mkliterals.o: $(HIPE_ASM) $(TTF_DIR)/erl_alloc_types.h $(DTRACE_HEADERS) \ $(TTF_DIR)/OPCODES-GENERATED $(TARGET)/TABLES-GENERATED diff --git a/erts/emulator/beam/atom.c b/erts/emulator/beam/atom.c index a5e778e4aa..2052afe52b 100644 --- a/erts/emulator/beam/atom.c +++ b/erts/emulator/beam/atom.c @@ -68,7 +68,7 @@ static Uint atom_space; /* Amount of atom text space used */ /* * Print info about atom tables */ -void atom_info(int to, void *to_arg) +void atom_info(fmtfn_t to, void *to_arg) { int lock = !ERTS_IS_CRASH_DUMPING; if (lock) @@ -470,7 +470,7 @@ init_atom_table(void) } void -dump_atoms(int to, void *to_arg) +dump_atoms(fmtfn_t to, void *to_arg) { int i = erts_atom_table.entries; diff --git a/erts/emulator/beam/atom.h b/erts/emulator/beam/atom.h index ae60904785..a82efabb9f 100644 --- a/erts/emulator/beam/atom.h +++ b/erts/emulator/beam/atom.h @@ -136,8 +136,8 @@ Eterm erts_atom_put(const byte *name, int len, ErtsAtomEncoding enc, int trunc); int atom_erase(byte*, int); int atom_static_put(byte*, int); void init_atom_table(void); -void atom_info(int, void *); -void dump_atoms(int, void *); +void atom_info(fmtfn_t, void *); +void dump_atoms(fmtfn_t, void *); int erts_atom_get(const char* name, int len, Eterm* ap, ErtsAtomEncoding enc); void erts_atom_get_text_space_sizes(Uint *reserved, Uint *used); #endif diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c index 74a333ecbe..ea1323d651 100644 --- a/erts/emulator/beam/beam_bif_load.c +++ b/erts/emulator/beam/beam_bif_load.c @@ -1634,10 +1634,10 @@ erts_purge_state_add_fun(ErlFunEntry *fe) } Export * -erts_suspend_process_on_pending_purge_lambda(Process *c_p) +erts_suspend_process_on_pending_purge_lambda(Process *c_p, ErlFunEntry* fe) { erts_smp_mtx_lock(&purge_state.mtx); - if (is_value(purge_state.module)) { + if (purge_state.module == fe->module) { /* * The process c_p is about to call a fun in the code * that we are trying to purge. Suspend it and call diff --git a/erts/emulator/beam/beam_debug.c b/erts/emulator/beam/beam_debug.c index a4ad3e7886..21d336049f 100644 --- a/erts/emulator/beam/beam_debug.c +++ b/erts/emulator/beam/beam_debug.c @@ -50,7 +50,7 @@ void dbg_bt(Process* p, Eterm* sp); void dbg_where(BeamInstr* addr, Eterm x0, Eterm* reg); -static int print_op(int to, void *to_arg, int op, int size, BeamInstr* addr); +static int print_op(fmtfn_t to, void *to_arg, int op, int size, BeamInstr* addr); BIF_RETTYPE erts_debug_same_2(BIF_ALIST_2) @@ -377,7 +377,7 @@ dbg_where(BeamInstr* addr, Eterm x0, Eterm* reg) } static int -print_op(int to, void *to_arg, int op, int size, BeamInstr* addr) +print_op(fmtfn_t to, void *to_arg, int op, int size, BeamInstr* addr) { int i; BeamInstr tag; diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index ef4cdf9d5a..3be5c0d24c 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -6555,7 +6555,7 @@ call_fun(Process* p, /* Current process. */ * and let it try again when the purge operation is * done (may succeed or not). */ - ep = erts_suspend_process_on_pending_purge_lambda(p); + ep = erts_suspend_process_on_pending_purge_lambda(p, fe); ASSERT(ep); } else { diff --git a/erts/emulator/beam/beam_load.h b/erts/emulator/beam/beam_load.h index 1200bb9c6f..9be5e14e40 100644 --- a/erts/emulator/beam/beam_load.h +++ b/erts/emulator/beam/beam_load.h @@ -124,7 +124,8 @@ int erts_is_module_native(BeamCodeHeader* code); void erts_beam_bif_load_init(void); struct erl_fun_entry; void erts_purge_state_add_fun(struct erl_fun_entry *fe); -Export *erts_suspend_process_on_pending_purge_lambda(Process *c_p); +Export *erts_suspend_process_on_pending_purge_lambda(Process *c_p, + struct erl_fun_entry*); /* * Layout of the line table. diff --git a/erts/emulator/beam/break.c b/erts/emulator/beam/break.c index 3c19e82b66..33433df68a 100644 --- a/erts/emulator/beam/break.c +++ b/erts/emulator/beam/break.c @@ -44,23 +44,22 @@ static void process_killer(void); void do_break(void); void erl_crash_dump_v(char *file, int line, char* fmt, va_list args); -void erl_crash_dump(char* file, int line, char* fmt, ...); #ifdef DEBUG static void bin_check(void); #endif -static void print_garb_info(int to, void *to_arg, Process* p); +static void print_garb_info(fmtfn_t to, void *to_arg, Process* p); #ifdef OPPROF static void dump_frequencies(void); #endif -static void dump_attributes(int to, void *to_arg, byte* ptr, int size); +static void dump_attributes(fmtfn_t to, void *to_arg, byte* ptr, int size); extern char* erts_system_version[]; static void -port_info(int to, void *to_arg) +port_info(fmtfn_t to, void *to_arg) { int i, max = erts_ptab_max(&erts_port); for (i = 0; i < max; i++) { @@ -71,7 +70,7 @@ port_info(int to, void *to_arg) } void -process_info(int to, void *to_arg) +process_info(fmtfn_t to, void *to_arg) { int i, max = erts_ptab_max(&erts_proc); for (i = 0; i < max; i++) { @@ -148,14 +147,14 @@ process_killer(void) typedef struct { int is_first; - int to; + fmtfn_t to; void *to_arg; } PrintMonitorContext; static void doit_print_link(ErtsLink *lnk, void *vpcontext) { PrintMonitorContext *pcontext = vpcontext; - int to = pcontext->to; + fmtfn_t to = pcontext->to; void *to_arg = pcontext->to_arg; if (pcontext->is_first) { @@ -170,7 +169,7 @@ static void doit_print_link(ErtsLink *lnk, void *vpcontext) static void doit_print_monitor(ErtsMonitor *mon, void *vpcontext) { PrintMonitorContext *pcontext = vpcontext; - int to = pcontext->to; + fmtfn_t to = pcontext->to; void *to_arg = pcontext->to_arg; char *prefix = ", "; @@ -197,7 +196,7 @@ static void doit_print_monitor(ErtsMonitor *mon, void *vpcontext) /* Display info about an individual Erlang process */ void -print_process_info(int to, void *to_arg, Process *p) +print_process_info(fmtfn_t to, void *to_arg, Process *p) { time_t approx_started; int garbing = 0; @@ -300,7 +299,7 @@ print_process_info(int to, void *to_arg, Process *p) /* display the links only if there are any*/ if (ERTS_P_LINKS(p) || ERTS_P_MONITORS(p)) { - PrintMonitorContext context = {1,to}; + PrintMonitorContext context = {1, to, to_arg}; erts_print(to, to_arg,"Link list: ["); erts_doforall_links(ERTS_P_LINKS(p), &doit_print_link, &context); erts_doforall_monitors(ERTS_P_MONITORS(p), &doit_print_monitor, &context); @@ -348,7 +347,7 @@ print_process_info(int to, void *to_arg, Process *p) } static void -print_garb_info(int to, void *to_arg, Process* p) +print_garb_info(fmtfn_t to, void *to_arg, Process* p) { #ifdef ERTS_SMP /* ERTS_SMP: A scheduler is probably concurrently doing gc... */ @@ -365,7 +364,7 @@ print_garb_info(int to, void *to_arg, Process* p) } void -info(int to, void *to_arg) +info(fmtfn_t to, void *to_arg) { erts_memory(&to, to_arg, NULL, THE_NON_VALUE); atom_info(to, to_arg); @@ -381,7 +380,7 @@ info(int to, void *to_arg) } void -loaded(int to, void *to_arg) +loaded(fmtfn_t to, void *to_arg) { int i; int old = 0; @@ -478,7 +477,7 @@ loaded(int to, void *to_arg) static void -dump_attributes(int to, void *to_arg, byte* ptr, int size) +dump_attributes(fmtfn_t to, void *to_arg, byte* ptr, int size) { while (size-- > 0) { erts_print(to, to_arg, "%02X", *ptr++); @@ -662,6 +661,26 @@ bin_check(void) #endif +static Sint64 crash_dump_limit = ERTS_SINT64_MAX; +static Sint64 crash_dump_written = 0; + +static int crash_dump_limited_writer(void* vfdp, char* buf, size_t len) +{ + const char stop_msg[] = "\n=abort: CRASH DUMP SIZE LIMIT REACHED\n"; + + crash_dump_written += len; + if (crash_dump_written <= crash_dump_limit) { + return erts_write_fd(vfdp, buf, len); + } + + len -= (crash_dump_written - crash_dump_limit); + erts_write_fd(vfdp, buf, len); + erts_write_fd(vfdp, (char*)stop_msg, sizeof(stop_msg)-1); + + /* We assume that crash dump was called from erts_exit_vv() */ + erts_exit_epilogue(); +} + /* XXX THIS SHOULD BE IN SYSTEM !!!! */ void erl_crash_dump_v(char *file, int line, char* fmt, va_list args) @@ -679,6 +698,8 @@ erl_crash_dump_v(char *file, int line, char* fmt, va_list args) int secs; int env_erl_crash_dump_seconds_set = 1; int i; + fmtfn_t to = &erts_write_fd; + void* to_arg; if (ERTS_SOMEONE_IS_CRASH_DUMPING) return; @@ -759,6 +780,21 @@ erl_crash_dump_v(char *file, int line, char* fmt, va_list args) return; } + crash_dump_limit = ERTS_SINT64_MAX; + envsz = sizeof(env); + if (erts_sys_getenv__("ERL_CRASH_DUMP_BYTES", env, &envsz) == 0) { + Sint64 limit; + char* endptr; + errno = 0; + limit = ErtsStrToSint64(env, &endptr, 10); + if (errno == 0 && limit >= 0 && endptr != env && *endptr == 0) { + if (limit == 0) + return; + crash_dump_limit = limit; + to = &crash_dump_limited_writer; + } + } + if (erts_sys_getenv__("ERL_CRASH_DUMP",&dumpnamebuf[0],&dumpnamebufsize) != 0) dumpname = "erl_crash.dump"; else @@ -769,39 +805,40 @@ erl_crash_dump_v(char *file, int line, char* fmt, va_list args) fd = open(dumpname,O_WRONLY | O_CREAT | O_TRUNC,0640); if (fd < 0) return; /* Can't create the crash dump, skip it */ + to_arg = (void*)&fd; time(&now); - erts_fdprintf(fd, "=erl_crash_dump:0.3\n%s", ctime(&now)); + erts_cbprintf(to, to_arg, "=erl_crash_dump:0.3\n%s", ctime(&now)); if (file != NULL) - erts_fdprintf(fd, "The error occurred in file %s, line %d\n", file, line); + erts_cbprintf(to, to_arg, "The error occurred in file %s, line %d\n", file, line); if (fmt != NULL && *fmt != '\0') { - erts_fdprintf(fd, "Slogan: "); - erts_vfdprintf(fd, fmt, args); + erts_cbprintf(to, to_arg, "Slogan: "); + erts_vcbprintf(to, to_arg, fmt, args); } - erts_fdprintf(fd, "System version: "); - erts_print_system_version(fd, NULL, NULL); + erts_cbprintf(to, to_arg, "System version: "); + erts_print_system_version(to, to_arg, NULL); #if ERTS_SAVED_COMPILE_TIME - erts_fdprintf(fd, "%s\n", "Compiled: " ERLANG_COMPILE_DATE); + erts_cbprintf(to, to_arg, "%s\n", "Compiled: " ERLANG_COMPILE_DATE); #endif - erts_fdprintf(fd, "Taints: "); - erts_print_nif_taints(fd, NULL); - erts_fdprintf(fd, "Atoms: %d\n", atom_table_size()); + erts_cbprintf(to, to_arg, "Taints: "); + erts_print_nif_taints(to, to_arg); + erts_cbprintf(to, to_arg, "Atoms: %d\n", atom_table_size()); #ifdef USE_THREADS /* We want to note which thread it was that called erts_exit */ if (erts_get_scheduler_data()) { - erts_fdprintf(fd, "Calling Thread: scheduler:%d\n", + erts_cbprintf(to, to_arg, "Calling Thread: scheduler:%d\n", erts_get_scheduler_data()->no); } else { if (!erts_thr_getname(erts_thr_self(), dumpnamebuf, MAXPATHLEN)) - erts_fdprintf(fd, "Calling Thread: %s\n", dumpnamebuf); + erts_cbprintf(to, to_arg, "Calling Thread: %s\n", dumpnamebuf); else - erts_fdprintf(fd, "Calling Thread: %p\n", erts_thr_self()); + erts_cbprintf(to, to_arg, "Calling Thread: %p\n", erts_thr_self()); } #else - erts_fdprintf(fd, "Calling Thread: scheduler:1\n"); + erts_cbprintf(to, to_arg, "Calling Thread: scheduler:1\n"); #endif #if defined(ERTS_HAVE_TRY_CATCH) @@ -816,8 +853,8 @@ erl_crash_dump_v(char *file, int line, char* fmt, va_list args) */ for (i = 0; i < erts_no_schedulers; i++) { ERTS_SYS_TRY_CATCH( - erts_print_scheduler_info(fd, NULL, ERTS_SCHEDULER_IX(i)), - erts_fdprintf(fd, "** crashed **\n")); + erts_print_scheduler_info(to, to_arg, ERTS_SCHEDULER_IX(i)), + erts_cbprintf(to, to_arg, "** crashed **\n")); } #endif @@ -848,48 +885,39 @@ erl_crash_dump_v(char *file, int line, char* fmt, va_list args) #ifndef ERTS_HAVE_TRY_CATCH /* This is safe to call here, as all schedulers are blocked */ for (i = 0; i < erts_no_schedulers; i++) { - erts_print_scheduler_info(fd, NULL, ERTS_SCHEDULER_IX(i)); + erts_print_scheduler_info(to, to_arg, ERTS_SCHEDULER_IX(i)); } #endif - info(fd, NULL); /* General system info */ + info(to, to_arg); /* General system info */ if (erts_ptab_initialized(&erts_proc)) - process_info(fd, NULL); /* Info about each process and port */ - db_info(fd, NULL, 0); - erts_print_bif_timer_info(fd, NULL); - distribution_info(fd, NULL); - erts_fdprintf(fd, "=loaded_modules\n"); - loaded(fd, NULL); - erts_dump_fun_entries(fd, NULL); - erts_deep_process_dump(fd, NULL); - erts_fdprintf(fd, "=atoms\n"); - dump_atoms(fd, NULL); + process_info(to, to_arg); /* Info about each process and port */ + db_info(to, to_arg, 0); + erts_print_bif_timer_info(to, to_arg); + distribution_info(to, to_arg); + erts_cbprintf(to, to_arg, "=loaded_modules\n"); + loaded(to, to_arg); + erts_dump_fun_entries(to, to_arg); + erts_deep_process_dump(to, to_arg); + erts_cbprintf(to, to_arg, "=atoms\n"); + dump_atoms(to, to_arg); /* Keep the instrumentation data at the end of the dump */ if (erts_instr_memory_map || erts_instr_stat) { - erts_fdprintf(fd, "=instr_data\n"); + erts_cbprintf(to, to_arg, "=instr_data\n"); if (erts_instr_stat) { - erts_fdprintf(fd, "=memory_status\n"); - erts_instr_dump_stat_to_fd(fd, 0); + erts_cbprintf(to, to_arg, "=memory_status\n"); + erts_instr_dump_stat_to(to, to_arg, 0); } if (erts_instr_memory_map) { - erts_fdprintf(fd, "=memory_map\n"); - erts_instr_dump_memory_map_to_fd(fd); + erts_cbprintf(to, to_arg, "=memory_map\n"); + erts_instr_dump_memory_map_to(to, to_arg); } } - erts_fdprintf(fd, "=end\n"); + erts_cbprintf(to, to_arg, "=end\n"); close(fd); erts_fprintf(stderr,"done\n"); } -void -erl_crash_dump(char* file, int line, char* fmt, ...) -{ - va_list args; - - va_start(args, fmt); - erl_crash_dump_v(file, line, fmt, args); - va_end(args); -} diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c index 09c83f1117..d79245e0e6 100644 --- a/erts/emulator/beam/dist.c +++ b/erts/emulator/beam/dist.c @@ -2402,13 +2402,13 @@ erts_kill_dist_connection(DistEntry *dep, Uint32 connection_id) } struct print_to_data { - int to; + fmtfn_t to; void *arg; }; static void doit_print_monitor_info(ErtsMonitor *mon, void *vptdp) { - int to = ((struct print_to_data *) vptdp)->to; + fmtfn_t to = ((struct print_to_data *) vptdp)->to; void *arg = ((struct print_to_data *) vptdp)->arg; Process *rp; ErtsMonitor *rmon; @@ -2431,7 +2431,7 @@ static void doit_print_monitor_info(ErtsMonitor *mon, void *vptdp) } } -static void print_monitor_info(int to, void *arg, ErtsMonitor *mon) +static void print_monitor_info(fmtfn_t to, void *arg, ErtsMonitor *mon) { struct print_to_data ptd = {to, arg}; erts_doforall_monitors(mon,&doit_print_monitor_info,&ptd); @@ -2457,7 +2457,7 @@ static void doit_print_link_info(ErtsLink *lnk, void *vptdp) } } -static void print_link_info(int to, void *arg, ErtsLink *lnk) +static void print_link_info(fmtfn_t to, void *arg, ErtsLink *lnk) { struct print_to_data ptd = {to, arg}; erts_doforall_links(lnk, &doit_print_link_info, (void *) &ptd); @@ -2478,7 +2478,7 @@ static void doit_print_nodelink_info(ErtsLink *lnk, void *vpcontext) "Remote monitoring: %T %T\n", lnk->pid, pcontext->sysname); } -static void print_nodelink_info(int to, void *arg, ErtsLink *lnk, Eterm sysname) +static void print_nodelink_info(fmtfn_t to, void *arg, ErtsLink *lnk, Eterm sysname) { PrintNodeLinkContext context = {{to, arg}, sysname}; erts_doforall_links(lnk, &doit_print_nodelink_info, &context); @@ -2486,7 +2486,7 @@ static void print_nodelink_info(int to, void *arg, ErtsLink *lnk, Eterm sysname) static int -info_dist_entry(int to, void *arg, DistEntry *dep, int visible, int connected) +info_dist_entry(fmtfn_t to, void *arg, DistEntry *dep, int visible, int connected) { if (visible && connected) { @@ -2535,7 +2535,7 @@ info_dist_entry(int to, void *arg, DistEntry *dep, int visible, int connected) return 0; } -int distribution_info(int to, void *arg) /* Called by break handler */ +int distribution_info(fmtfn_t to, void *arg) /* Called by break handler */ { DistEntry *dep; diff --git a/erts/emulator/beam/erl_afit_alloc.c b/erts/emulator/beam/erl_afit_alloc.c index eda3ad870a..4ebe37ee1d 100644 --- a/erts/emulator/beam/erl_afit_alloc.c +++ b/erts/emulator/beam/erl_afit_alloc.c @@ -54,7 +54,7 @@ static void link_free_block (Allctr_t *, Block_t *); static void unlink_free_block (Allctr_t *, Block_t *); -static Eterm info_options (Allctr_t *, char *, int *, +static Eterm info_options (Allctr_t *, char *, fmtfn_t *, void *arg, Uint **, Uint *); static void init_atoms (void); @@ -227,7 +227,7 @@ add_2tup(Uint **hpp, Uint *szp, Eterm *lp, Eterm el1, Eterm el2) static Eterm info_options(Allctr_t *allctr, char *prefix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c index 3c2c9def3b..214fb1f2af 100644 --- a/erts/emulator/beam/erl_alloc.c +++ b/erts/emulator/beam/erl_alloc.c @@ -2113,7 +2113,7 @@ add_fix_values(UWord *ap, UWord *up, ErtsAlcUFixInfo_t *fi, ErtsAlcType_t type) } Eterm -erts_memory(int *print_to_p, void *print_to_arg, void *proc, Eterm earg) +erts_memory(fmtfn_t *print_to_p, void *print_to_arg, void *proc, Eterm earg) { /* * NOTE! When updating this function, make sure to also update @@ -2476,7 +2476,7 @@ erts_memory(int *print_to_p, void *print_to_arg, void *proc, Eterm earg) if (print_to_p) { int i; - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; /* Print result... */ @@ -2530,7 +2530,7 @@ struct aa_values { }; Eterm -erts_allocated_areas(int *print_to_p, void *print_to_arg, void *proc) +erts_allocated_areas(fmtfn_t *print_to_p, void *print_to_arg, void *proc) { #define MAX_AA_VALUES (24) struct aa_values values[MAX_AA_VALUES]; @@ -2665,7 +2665,7 @@ erts_allocated_areas(int *print_to_p, void *print_to_arg, void *proc) if (print_to_p) { /* Print result... */ - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; erts_print(to, arg, "=allocated_areas\n"); @@ -2779,7 +2779,7 @@ erts_alloc_util_allocators(void *proc) } void -erts_allocator_info(int to, void *arg) +erts_allocator_info(fmtfn_t to, void *arg) { ErtsAlcType_t a; @@ -3110,7 +3110,7 @@ reply_alloc_info(void *vair) Eterm (*info_func)(Allctr_t *, int, int, - int *, + fmtfn_t *, void *, Uint **, Uint *) = (air->only_sz diff --git a/erts/emulator/beam/erl_alloc.h b/erts/emulator/beam/erl_alloc.h index 925a081a02..56a3b73bf9 100644 --- a/erts/emulator/beam/erl_alloc.h +++ b/erts/emulator/beam/erl_alloc.h @@ -69,11 +69,11 @@ void *erts_sys_aligned_realloc(UWord alignment, void *ptr, UWord size, UWord old void erts_sys_aligned_free(UWord alignment, void *ptr); #endif -Eterm erts_memory(int *, void *, void *, Eterm); -Eterm erts_allocated_areas(int *, void *, void *); +Eterm erts_memory(fmtfn_t *, void *, void *, Eterm); +Eterm erts_allocated_areas(fmtfn_t *, void *, void *); Eterm erts_alloc_util_allocators(void *proc); -void erts_allocator_info(int, void *); +void erts_allocator_info(fmtfn_t, void *); Eterm erts_allocator_options(void *proc); struct process; diff --git a/erts/emulator/beam/erl_alloc_util.c b/erts/emulator/beam/erl_alloc_util.c index 2995f2f822..f4ca689040 100644 --- a/erts/emulator/beam/erl_alloc_util.c +++ b/erts/emulator/beam/erl_alloc_util.c @@ -4473,7 +4473,7 @@ add_fix_types(Allctr_t *allctr, int internal, Uint **hpp, Uint *szp, static Eterm sz_info_fix(Allctr_t *allctr, int internal, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -4494,7 +4494,7 @@ sz_info_fix(Allctr_t *allctr, UWord used = fix->type_size * fix->u.cpool.used; if (print_to_p) { - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; erts_print(to, arg, @@ -4522,7 +4522,7 @@ sz_info_fix(Allctr_t *allctr, UWord used = fix->type_size*fix->u.nocpool.used; if (print_to_p) { - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; erts_print(to, arg, @@ -4548,7 +4548,7 @@ static Eterm sz_info_carriers(Allctr_t *allctr, CarriersStats_t *cs, char *prefix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -4557,7 +4557,7 @@ sz_info_carriers(Allctr_t *allctr, UWord curr_size = cs->curr.norm.mseg.size + cs->curr.norm.sys_alloc.size; if (print_to_p) { - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; erts_print(to, arg, @@ -4598,7 +4598,7 @@ static Eterm info_cpool(Allctr_t *allctr, int sz_only, char *prefix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -4615,7 +4615,7 @@ info_cpool(Allctr_t *allctr, } if (print_to_p) { - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; if (!sz_only) erts_print(to, arg, "%sblocks: %bpu\n", prefix, nob); @@ -4652,7 +4652,7 @@ static Eterm info_carriers(Allctr_t *allctr, CarriersStats_t *cs, char *prefix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -4664,7 +4664,7 @@ info_carriers(Allctr_t *allctr, curr_size = cs->curr.norm.mseg.size + cs->curr.norm.sys_alloc.size; if (print_to_p) { - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; erts_print(to, arg, @@ -4790,7 +4790,7 @@ make_name_atoms(Allctr_t *allctr) static Eterm info_calls(Allctr_t *allctr, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -4807,7 +4807,7 @@ info_calls(Allctr_t *allctr, erts_print(TO, TOA, "%s%s calls: %b64u\n",PRFX,NAME,CC) char *prefix = allctr->name_prefix; - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; PRINT_CC_5(to, arg, prefix, "alloc", allctr->calls.this_alloc); @@ -4883,7 +4883,7 @@ info_calls(Allctr_t *allctr, static Eterm info_options(Allctr_t *allctr, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -5035,7 +5035,7 @@ reset_max_values(CarriersStats_t *cs) \* */ Eterm -erts_alcu_au_info_options(int *print_to_p, void *print_to_arg, +erts_alcu_au_info_options(fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) { Eterm res = THE_NON_VALUE; @@ -5078,7 +5078,7 @@ erts_alcu_au_info_options(int *print_to_p, void *print_to_arg, Eterm erts_alcu_info_options(Allctr_t *allctr, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -5110,7 +5110,7 @@ Eterm erts_alcu_sz_info(Allctr_t *allctr, int internal, int begin_max_period, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -5196,7 +5196,7 @@ Eterm erts_alcu_info(Allctr_t *allctr, int internal, int begin_max_period, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) diff --git a/erts/emulator/beam/erl_alloc_util.h b/erts/emulator/beam/erl_alloc_util.h index f50f09907a..81180382af 100644 --- a/erts/emulator/beam/erl_alloc_util.h +++ b/erts/emulator/beam/erl_alloc_util.h @@ -178,10 +178,10 @@ void * erts_alcu_realloc_mv_thr_pref(ErtsAlcType_t, void *, void *, Uint); void erts_alcu_free_thr_pref(ErtsAlcType_t, void *, void *); #endif #endif -Eterm erts_alcu_au_info_options(int *, void *, Uint **, Uint *); -Eterm erts_alcu_info_options(Allctr_t *, int *, void *, Uint **, Uint *); -Eterm erts_alcu_sz_info(Allctr_t *, int, int, int *, void *, Uint **, Uint *); -Eterm erts_alcu_info(Allctr_t *, int, int, int *, void *, Uint **, Uint *); +Eterm erts_alcu_au_info_options(fmtfn_t *, void *, Uint **, Uint *); +Eterm erts_alcu_info_options(Allctr_t *, fmtfn_t *, void *, Uint **, Uint *); +Eterm erts_alcu_sz_info(Allctr_t *, int, int, fmtfn_t *, void *, Uint **, Uint *); +Eterm erts_alcu_info(Allctr_t *, int, int, fmtfn_t *, void *, Uint **, Uint *); void erts_alcu_init(AlcUInit_t *); void erts_alcu_current_size(Allctr_t *, AllctrSize_t *, ErtsAlcUFixInfo_t *, int); @@ -586,7 +586,7 @@ struct Allctr_t_ { Block_t *, Uint); void (*link_free_block) (Allctr_t *, Block_t *); void (*unlink_free_block) (Allctr_t *, Block_t *); - Eterm (*info_options) (Allctr_t *, char *, int *, + Eterm (*info_options) (Allctr_t *, char *, fmtfn_t *, void *, Uint **, Uint *); Uint (*get_next_mbc_size) (Allctr_t *); diff --git a/erts/emulator/beam/erl_ao_firstfit_alloc.c b/erts/emulator/beam/erl_ao_firstfit_alloc.c index 7e239d1f5d..05ba1f9891 100644 --- a/erts/emulator/beam/erl_ao_firstfit_alloc.c +++ b/erts/emulator/beam/erl_ao_firstfit_alloc.c @@ -224,7 +224,7 @@ static AOFF_RBTree_t* rbt_search(AOFF_RBTree_t* root, Uint size); static int rbt_assert_is_member(AOFF_RBTree_t* root, AOFF_RBTree_t* node); #endif -static Eterm info_options(Allctr_t *, char *, int *, void *, Uint **, Uint *); +static Eterm info_options(Allctr_t *, char *, fmtfn_t *, void *, Uint **, Uint *); static void init_atoms(void); @@ -1014,7 +1014,7 @@ add_2tup(Uint **hpp, Uint *szp, Eterm *lp, Eterm el1, Eterm el2) static Eterm info_options(Allctr_t *allctr, char *prefix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) diff --git a/erts/emulator/beam/erl_bestfit_alloc.c b/erts/emulator/beam/erl_bestfit_alloc.c index 379cee39a1..6173c408e1 100644 --- a/erts/emulator/beam/erl_bestfit_alloc.c +++ b/erts/emulator/beam/erl_bestfit_alloc.c @@ -104,7 +104,7 @@ static void bf_link_free_block (Allctr_t *, Block_t *); static ERTS_INLINE void bf_unlink_free_block (Allctr_t *, Block_t *); -static Eterm info_options (Allctr_t *, char *, int *, +static Eterm info_options (Allctr_t *, char *, fmtfn_t *, void *, Uint **, Uint *); static void init_atoms (void); @@ -921,7 +921,7 @@ add_2tup(Uint **hpp, Uint *szp, Eterm *lp, Eterm el1, Eterm el2) static Eterm info_options(Allctr_t *allctr, char *prefix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c index 29ba12dfdb..735aabbee3 100644 --- a/erts/emulator/beam/erl_bif_info.c +++ b/erts/emulator/beam/erl_bif_info.c @@ -317,7 +317,7 @@ make_link_list(Process *p, ErtsLink *root, Eterm tail) } int -erts_print_system_version(int to, void *arg, Process *c_p) +erts_print_system_version(fmtfn_t to, void *arg, Process *c_p) { int i, rc = -1; char *rc_str = ""; diff --git a/erts/emulator/beam/erl_bif_trace.c b/erts/emulator/beam/erl_bif_trace.c index 66e5146da0..96275eb228 100644 --- a/erts/emulator/beam/erl_bif_trace.c +++ b/erts/emulator/beam/erl_bif_trace.c @@ -512,7 +512,7 @@ start_trace(Process *c_p, ErtsTracer tracer, && !ERTS_TRACER_COMPARE(ERTS_TRACER(port), tracer)) { /* This tracee is already being traced, and not by the * tracer to be */ - if (erts_is_tracer_enabled(tracer, common)) { + if (erts_is_tracer_enabled(ERTS_TRACER(port), common)) { /* The tracer is still in use */ return 1; } @@ -715,8 +715,8 @@ Eterm erts_internal_trace_3(BIF_ALIST_3) Process* tracee_p = erts_pix2proc(i); if (! tracee_p) continue; - start_trace(p, tracer, &tracee_p->common, on, mask); - matches++; + if (!start_trace(p, tracer, &tracee_p->common, on, mask)) + matches++; } } if (ports || mods) { @@ -730,8 +730,8 @@ Eterm erts_internal_trace_3(BIF_ALIST_3) state = erts_atomic32_read_nob(&tracee_port->state); if (state & ERTS_PORT_SFLGS_DEAD) continue; - start_trace(p, tracer, &tracee_port->common, on, mask); - matches++; + if (!start_trace(p, tracer, &tracee_port->common, on, mask)) + matches++; } } } diff --git a/erts/emulator/beam/erl_db.c b/erts/emulator/beam/erl_db.c index 128a7b3865..dceadc46f4 100644 --- a/erts/emulator/beam/erl_db.c +++ b/erts/emulator/beam/erl_db.c @@ -201,7 +201,7 @@ static int free_table_cont(Process *p, DbTable *tb, int first, int clean_meta_tab); -static void print_table(int to, void *to_arg, int show, DbTable* tb); +static void print_table(fmtfn_t to, void *to_arg, int show, DbTable* tb); static BIF_RETTYPE ets_select_delete_1(BIF_ALIST_1); static BIF_RETTYPE ets_select_count_1(BIF_ALIST_1); static BIF_RETTYPE ets_select_trap_1(BIF_ALIST_1); @@ -3871,7 +3871,7 @@ static Eterm table_info(Process* p, DbTable* tb, Eterm What) return ret; } -static void print_table(int to, void *to_arg, int show, DbTable* tb) +static void print_table(fmtfn_t to, void *to_arg, int show, DbTable* tb) { erts_print(to, to_arg, "Table: %T\n", tb->common.id); erts_print(to, to_arg, "Name: %T\n", tb->common.the_name); @@ -3891,7 +3891,7 @@ static void print_table(int to, void *to_arg, int show, DbTable* tb) erts_print(to, to_arg, "Read Concurrency: %T\n", table_info(NULL, tb, am_read_concurrency)); } -void db_info(int to, void *to_arg, int show) /* Called by break handler */ +void db_info(fmtfn_t to, void *to_arg, int show) /* Called by break handler */ { int i; for (i=0; i < db_max_tabs; i++) diff --git a/erts/emulator/beam/erl_db.h b/erts/emulator/beam/erl_db.h index 1d26c49652..b0508f2e74 100644 --- a/erts/emulator/beam/erl_db.h +++ b/erts/emulator/beam/erl_db.h @@ -74,7 +74,7 @@ typedef enum { void init_db(ErtsDbSpinCount); int erts_db_process_exiting(Process *, ErtsProcLocks); -void db_info(int, void *, int); +void db_info(fmtfn_t, void *, int); void erts_db_foreach_table(void (*)(DbTable *, void *), void *); void erts_db_foreach_offheap(DbTable *, void (*func)(ErlOffHeap *, void *), diff --git a/erts/emulator/beam/erl_db_hash.c b/erts/emulator/beam/erl_db_hash.c index 5e6fe4f460..390369fdb9 100644 --- a/erts/emulator/beam/erl_db_hash.c +++ b/erts/emulator/beam/erl_db_hash.c @@ -437,7 +437,7 @@ static int db_select_count_continue_hash(Process *p, DbTable *tbl, static int db_select_delete_continue_hash(Process *p, DbTable *tbl, Eterm continuation, Eterm *ret); static int db_take_hash(Process *, DbTable *, Eterm, Eterm *); -static void db_print_hash(int to, +static void db_print_hash(fmtfn_t to, void *to_arg, int show, DbTable *tbl); @@ -2155,7 +2155,7 @@ int db_mark_all_deleted_hash(DbTable *tbl) /* Display hash table contents (for dump) */ -static void db_print_hash(int to, void *to_arg, int show, DbTable *tbl) +static void db_print_hash(fmtfn_t to, void *to_arg, int show, DbTable *tbl) { DbTableHash *tb = &tbl->hash; DbHashStats stats; diff --git a/erts/emulator/beam/erl_db_tree.c b/erts/emulator/beam/erl_db_tree.c index 02d211a4bb..dd9403e132 100644 --- a/erts/emulator/beam/erl_db_tree.c +++ b/erts/emulator/beam/erl_db_tree.c @@ -385,7 +385,7 @@ static int db_select_delete_tree(Process *p, DbTable *tbl, static int db_select_delete_continue_tree(Process *p, DbTable *tbl, Eterm continuation, Eterm *ret); static int db_take_tree(Process *, DbTable *, Eterm, Eterm *); -static void db_print_tree(int to, void *to_arg, +static void db_print_tree(fmtfn_t to, void *to_arg, int show, DbTable *tbl); static int db_free_table_tree(DbTable *tbl); @@ -1740,7 +1740,7 @@ static int db_take_tree(Process *p, DbTable *tbl, Eterm key, Eterm *ret) /* Display tree contents (for dump) */ -static void db_print_tree(int to, void *to_arg, +static void db_print_tree(fmtfn_t to, void *to_arg, int show, DbTable *tbl) { diff --git a/erts/emulator/beam/erl_db_util.h b/erts/emulator/beam/erl_db_util.h index 4acedbfed0..49e5f6b4cf 100644 --- a/erts/emulator/beam/erl_db_util.h +++ b/erts/emulator/beam/erl_db_util.h @@ -175,7 +175,7 @@ typedef struct db_table_method int (*db_free_table)(DbTable* db /* [in out] */ ); int (*db_free_table_continue)(DbTable* db); /* [in out] */ - void (*db_print)(int to, + void (*db_print)(fmtfn_t to, void* to_arg, int show, DbTable* tb /* [in out] */ ); diff --git a/erts/emulator/beam/erl_debug.c b/erts/emulator/beam/erl_debug.c index 3e3bfa03a2..3526bb684d 100644 --- a/erts/emulator/beam/erl_debug.c +++ b/erts/emulator/beam/erl_debug.c @@ -60,10 +60,10 @@ static const char dashes[PTR_SIZE+3] = { void pps(Process*, Eterm*); void ptd(Process*, Eterm); -void paranoid_display(int, void*, Process*, Eterm); +void paranoid_display(fmtfn_t, void*, Process*, Eterm); static int dcount; -static int pdisplay1(int to, void *to_arg, Process* p, Eterm obj); +static int pdisplay1(fmtfn_t to, void *to_arg, Process* p, Eterm obj); void ptd(Process* p, Eterm x) { @@ -77,14 +77,14 @@ void ptd(Process* p, Eterm x) */ void -paranoid_display(int to, void *to_arg, Process* p, Eterm obj) +paranoid_display(fmtfn_t to, void *to_arg, Process* p, Eterm obj) { dcount = 100000; pdisplay1(to, to_arg, p, obj); } static int -pdisplay1(int to, void *to_arg, Process* p, Eterm obj) +pdisplay1(fmtfn_t to, void *to_arg, Process* p, Eterm obj) { int i, k; Eterm* nobj; @@ -201,7 +201,7 @@ pdisplay1(int to, void *to_arg, Process* p, Eterm obj) void pps(Process* p, Eterm* stop) { - int to = ERTS_PRINT_STDOUT; + fmtfn_t to = ERTS_PRINT_STDOUT; void *to_arg = NULL; Eterm* sp = STACK_START(p) - 1; diff --git a/erts/emulator/beam/erl_fun.c b/erts/emulator/beam/erl_fun.c index c639ba623f..d0a57f0ad0 100644 --- a/erts/emulator/beam/erl_fun.c +++ b/erts/emulator/beam/erl_fun.c @@ -74,7 +74,7 @@ erts_init_fun_table(void) } void -erts_fun_info(int to, void *to_arg) +erts_fun_info(fmtfn_t to, void *to_arg) { int lock = !ERTS_IS_CRASH_DUMPING; if (lock) @@ -236,7 +236,6 @@ erts_fun_purge_abort_prepare(ErlFunEntry **funs, Uint no) ErlFunEntry *fe = funs[ix]; if (fe->address == unloaded_fun) fe->address = fe->pend_purge_address; - fe->pend_purge_address = NULL; } } @@ -264,7 +263,7 @@ erts_fun_purge_complete(ErlFunEntry **funs, Uint no) } void -erts_dump_fun_entries(int to, void *to_arg) +erts_dump_fun_entries(fmtfn_t to, void *to_arg) { int limit; HashBucket** bucket; diff --git a/erts/emulator/beam/erl_fun.h b/erts/emulator/beam/erl_fun.h index 73c3e19c1c..caa55c730c 100644 --- a/erts/emulator/beam/erl_fun.h +++ b/erts/emulator/beam/erl_fun.h @@ -71,7 +71,7 @@ typedef struct erl_fun_thing { #define ERL_FUN_SIZE ((sizeof(ErlFunThing)/sizeof(Eterm))-1) void erts_init_fun_table(void); -void erts_fun_info(int, void *); +void erts_fun_info(fmtfn_t, void *); int erts_fun_table_sz(void); ErlFunEntry* erts_put_fun_entry(Eterm mod, int uniq, int index); @@ -86,6 +86,6 @@ void erts_fun_purge_prepare(BeamInstr* start, BeamInstr* end); void erts_fun_purge_abort_prepare(ErlFunEntry **funs, Uint no); void erts_fun_purge_abort_finalize(ErlFunEntry **funs, Uint no); void erts_fun_purge_complete(ErlFunEntry **funs, Uint no); -void erts_dump_fun_entries(int, void *); +void erts_dump_fun_entries(fmtfn_t, void *); #endif diff --git a/erts/emulator/beam/erl_goodfit_alloc.c b/erts/emulator/beam/erl_goodfit_alloc.c index 223ba193da..50aa41b4d2 100644 --- a/erts/emulator/beam/erl_goodfit_alloc.c +++ b/erts/emulator/beam/erl_goodfit_alloc.c @@ -168,7 +168,7 @@ static Block_t * get_free_block (Allctr_t *, Uint, static void link_free_block (Allctr_t *, Block_t *); static void unlink_free_block (Allctr_t *, Block_t *); static void update_last_aux_mbc (Allctr_t *, Carrier_t *); -static Eterm info_options (Allctr_t *, char *, int *, +static Eterm info_options (Allctr_t *, char *, fmtfn_t *, void *, Uint **, Uint *); static void init_atoms (void); @@ -551,7 +551,7 @@ add_2tup(Uint **hpp, Uint *szp, Eterm *lp, Eterm el1, Eterm el2) static Eterm info_options(Allctr_t *allctr, char *prefix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) diff --git a/erts/emulator/beam/erl_hl_timer.c b/erts/emulator/beam/erl_hl_timer.c index f1bef28186..d29d079fc5 100644 --- a/erts/emulator/beam/erl_hl_timer.c +++ b/erts/emulator/beam/erl_hl_timer.c @@ -2851,7 +2851,7 @@ erts_read_port_timer(Port *c_prt) */ typedef struct { - int to; + fmtfn_t to; void *to_arg; ErtsMonotonicTime now; } ErtsBTMPrint; @@ -2881,7 +2881,7 @@ btm_print(ErtsHLTimer *tmr, void *vbtmp) } void -erts_print_bif_timer_info(int to, void *to_arg) +erts_print_bif_timer_info(fmtfn_t to, void *to_arg) { ErtsBTMPrint btmp; int six; diff --git a/erts/emulator/beam/erl_hl_timer.h b/erts/emulator/beam/erl_hl_timer.h index 0931bb8965..705be94532 100644 --- a/erts/emulator/beam/erl_hl_timer.h +++ b/erts/emulator/beam/erl_hl_timer.h @@ -72,7 +72,7 @@ erts_handle_canceled_timers(void *vesdp, #endif Uint erts_bif_timer_memory_size(void); -void erts_print_bif_timer_info(int to, void *to_arg); +void erts_print_bif_timer_info(fmtfn_t to, void *to_arg); void erts_debug_bif_timer_foreach(void (*func)(Eterm, Eterm, diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index 781bf024dd..362239f765 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -2374,6 +2374,8 @@ system_cleanup(int flush_async) erts_exit_flush_async(); } +static int erts_exit_code; + static __decl_noreturn void __noreturn erts_exit_vv(int n, int flush_async, char *fmt, va_list args1, va_list args2) { @@ -2385,12 +2387,21 @@ erts_exit_vv(int n, int flush_async, char *fmt, va_list args1, va_list args2) if (fmt != NULL && *fmt != '\0') erl_error(fmt, args2); /* Print error message. */ - /* Produce an Erlang core dump if error */ + erts_exit_code = n; + + /* Produce an Erlang crash dump if error */ if (((n == ERTS_ERROR_EXIT && erts_no_crash_dump == 0) || n == ERTS_DUMP_EXIT) && erts_initialized) { erl_crash_dump_v((char*) NULL, 0, fmt, args1); } + erts_exit_epilogue(); +} + +__decl_noreturn void __noreturn erts_exit_epilogue(void) +{ + int n = erts_exit_code; + sys_tty_reset(n); if (n == ERTS_INTR_EXIT) diff --git a/erts/emulator/beam/erl_instrument.c b/erts/emulator/beam/erl_instrument.c index f84c63e7a4..4d4defd8b5 100644 --- a/erts/emulator/beam/erl_instrument.c +++ b/erts/emulator/beam/erl_instrument.c @@ -539,7 +539,7 @@ map_stat_free(ErtsAlcType_t n, void *extra, void *ptr) } -static void dump_memory_map_to_stream(FILE *fp) +static void dump_memory_map_to_stream(fmtfn_t to, void* to_arg) { ErtsAlcType_t n; MapStatBlock_t *bp; @@ -551,7 +551,7 @@ static void dump_memory_map_to_stream(FILE *fp) /* Write header */ - fprintf(fp, + erts_cbprintf(to, to_arg, "{instr_hdr,\n" " %lu,\n" " %lu,\n" @@ -574,7 +574,7 @@ static void dump_memory_map_to_stream(FILE *fp) else astr = ERTS_ALC_A2AD(ERTS_ALC_A_SYSTEM); - fprintf(fp, + erts_cbprintf(to, to_arg, "%s{%s,%s,%s}%s", (n == ERTS_ALC_N_MIN) ? "" : " ", ERTS_ALC_N2TD(n), @@ -583,12 +583,12 @@ static void dump_memory_map_to_stream(FILE *fp) (n == ERTS_ALC_N_MAX) ? "" : ",\n"); } - fprintf(fp, "}}.\n"); + erts_cbprintf(to, to_arg, "}}.\n"); /* Write memory data */ for (bp = mem_anchor; bp; bp = bp->next) { if (is_internal_pid(bp->pid)) - fprintf(fp, + erts_cbprintf(to, to_arg, "{%lu, %lu, %lu, {%lu,%lu,%lu}}.\n", (UWord) bp->type_no, (UWord) bp->mem, @@ -597,7 +597,7 @@ static void dump_memory_map_to_stream(FILE *fp) (UWord) pid_number(bp->pid), (UWord) pid_serial(bp->pid)); else - fprintf(fp, + erts_cbprintf(to, to_arg, "{%lu, %lu, %lu, undefined}.\n", (UWord) bp->type_no, (UWord) bp->mem, @@ -608,40 +608,29 @@ static void dump_memory_map_to_stream(FILE *fp) erts_mtx_unlock(&instr_mutex); } -int erts_instr_dump_memory_map_to_fd(int fd) +int erts_instr_dump_memory_map_to(fmtfn_t to, void* to_arg) { - char buf[BUFSIZ]; - FILE *f; - if (!erts_instr_memory_map) return 0; - f = fdopen(fd, "w"); - if (f == NULL) - return 0; - - /* Avoid allocating memory; we may have run out of it at this point. */ - setbuf(f, buf); - - dump_memory_map_to_stream(f); - fflush(f); + dump_memory_map_to_stream(to, to_arg); return 1; } int erts_instr_dump_memory_map(const char *name) { - FILE *f; + int fd; if (!erts_instr_memory_map) return 0; - f = fopen(name, "w"); - if (f == NULL) + fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0640); + if (fd < 0) return 0; - dump_memory_map_to_stream(f); + dump_memory_map_to_stream(erts_write_fd, (void*)&fd); - fclose(f); + close(fd); return 1; } @@ -998,19 +987,19 @@ erts_instr_get_stat(Process *proc, Eterm what, int begin_max_period) } static void -dump_stat_to_stream(FILE *fp, int begin_max_period) +dump_stat_to_stream(fmtfn_t to, void* to_arg, int begin_max_period) { ErtsAlcType_t i, a_max, a_min; erts_mtx_lock(&instr_mutex); - fprintf(fp, + erts_cbprintf(to, to_arg, "{instr_vsn,%lu}.\n", (unsigned long) ERTS_INSTR_VSN); update_max_ever_values(&stats->tot, 0, 0); - fprintf(fp, + erts_cbprintf(to, to_arg, "{total,[{total,[{sizes,%lu,%lu,%lu},{blocks,%lu,%lu,%lu}]}]}.\n", (UWord) stats->tot.size, (UWord) stats->tot.max_size, @@ -1038,7 +1027,7 @@ dump_stat_to_stream(FILE *fp, int begin_max_period) for (i = ERTS_ALC_A_MIN; i <= ERTS_ALC_A_MAX; i++) { if (erts_allctrs_info[i].enabled) { - fprintf(fp, + erts_cbprintf(to, to_arg, "%s{%s,[{sizes,%lu,%lu,%lu},{blocks,%lu,%lu,%lu}]}%s", i == a_min ? "{allocators,\n [" : " ", ERTS_ALC_A2AD(i), @@ -1055,7 +1044,7 @@ dump_stat_to_stream(FILE *fp, int begin_max_period) update_max_ever_values(stats->c, ERTS_ALC_C_MIN, ERTS_ALC_C_MAX); for (i = ERTS_ALC_C_MIN; i <= ERTS_ALC_C_MAX; i++) { - fprintf(fp, + erts_cbprintf(to, to_arg, "%s{%s,[{sizes,%lu,%lu,%lu},{blocks,%lu,%lu,%lu}]}%s", i == ERTS_ALC_C_MIN ? "{classes,\n [" : " ", ERTS_ALC_C2CD(i), @@ -1071,7 +1060,7 @@ dump_stat_to_stream(FILE *fp, int begin_max_period) update_max_ever_values(stats->n, ERTS_ALC_N_MIN, ERTS_ALC_N_MAX); for (i = ERTS_ALC_N_MIN; i <= ERTS_ALC_N_MAX; i++) { - fprintf(fp, + erts_cbprintf(to, to_arg, "%s{%s,[{sizes,%lu,%lu,%lu},{blocks,%lu,%lu,%lu}]}%s", i == ERTS_ALC_N_MIN ? "{types,\n [" : " ", ERTS_ALC_N2TD(i), @@ -1095,40 +1084,29 @@ dump_stat_to_stream(FILE *fp, int begin_max_period) } -int erts_instr_dump_stat_to_fd(int fd, int begin_max_period) +int erts_instr_dump_stat_to(fmtfn_t to, void* to_arg, int begin_max_period) { - char buf[BUFSIZ]; - FILE *fp; - if (!erts_instr_stat) return 0; - fp = fdopen(fd, "w"); - if (fp == NULL) - return 0; - - /* Avoid allocating memory; we may have run out of it at this point. */ - setbuf(fp, buf); - - dump_stat_to_stream(fp, begin_max_period); - fflush(fp); + dump_stat_to_stream(to, to_arg, begin_max_period); return 1; } int erts_instr_dump_stat(const char *name, int begin_max_period) { - FILE *file; + int fd; if (!erts_instr_stat) return 0; - file = fopen(name, "w"); - if (file == NULL) + fd = open(name, O_WRONLY | O_CREAT | O_TRUNC,0640); + if (fd < 0) return 0; - dump_stat_to_stream(file, begin_max_period); + dump_stat_to_stream(erts_write_fd, (void*)&fd, begin_max_period); - fclose(file); + close(fd); return 1; } diff --git a/erts/emulator/beam/erl_instrument.h b/erts/emulator/beam/erl_instrument.h index 1f04c91d5e..351172b2fa 100644 --- a/erts/emulator/beam/erl_instrument.h +++ b/erts/emulator/beam/erl_instrument.h @@ -29,10 +29,10 @@ extern int erts_instr_memory_map; extern int erts_instr_stat; Uint erts_instr_init(int stat, int map_stat); -int erts_instr_dump_memory_map_to_fd(int fd); +int erts_instr_dump_memory_map_to(fmtfn_t to, void* to_arg); int erts_instr_dump_memory_map(const char *name); Eterm erts_instr_get_memory_map(Process *process); -int erts_instr_dump_stat_to_fd(int fd, int begin_max_period); +int erts_instr_dump_stat_to(fmtfn_t to, void* to_arg, int begin_max_period); int erts_instr_dump_stat(const char *name, int begin_max_period); Eterm erts_instr_get_stat(Process *proc, Eterm what, int begin_max_period); Eterm erts_instr_get_type_info(Process *proc); diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c index e2f208badf..6b265a8b80 100644 --- a/erts/emulator/beam/erl_nif.c +++ b/erts/emulator/beam/erl_nif.c @@ -3081,16 +3081,16 @@ Eterm erts_nif_taints(Process* p) return list; } -void erts_print_nif_taints(int to, void* to_arg) +void erts_print_nif_taints(fmtfn_t to, void* to_arg) { struct tainted_module_t* t; const char* delim = ""; for (t=first_tainted_module ; t!=NULL; t=t->next) { const Atom* atom = atom_tab(atom_val(t->module_atom)); - erts_print(to,to_arg,"%s%.*s", delim, atom->len, atom->name); + erts_cbprintf(to,to_arg,"%s%.*s", delim, atom->len, atom->name); delim = ","; } - erts_print(to,to_arg,"\n"); + erts_cbprintf(to,to_arg,"\n"); } @@ -3373,7 +3373,7 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) veto = entry->reload(&env, &lib->priv_data, BIF_ARG_2); erts_post_nif(&env); if (veto) { - ret = load_nif_error(BIF_P, reload, "Library reload-call unsuccessful."); + ret = load_nif_error(BIF_P, reload, "Library reload-call unsuccessful (%d).", veto); } else { commit_opened_resource_types(lib); @@ -3395,7 +3395,7 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) erts_post_nif(&env); if (veto) { prev_mi->nif->priv_data = prev_old_data; - ret = load_nif_error(BIF_P, upgrade, "Library upgrade-call unsuccessful."); + ret = load_nif_error(BIF_P, upgrade, "Library upgrade-call unsuccessful (%d).", veto); } else commit_opened_resource_types(lib); @@ -3405,7 +3405,7 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) veto = entry->load(&env, &lib->priv_data, BIF_ARG_2); erts_post_nif(&env); if (veto) { - ret = load_nif_error(BIF_P, "load", "Library load-call unsuccessful."); + ret = load_nif_error(BIF_P, "load", "Library load-call unsuccessful (%d).", veto); } else commit_opened_resource_types(lib); diff --git a/erts/emulator/beam/erl_node_tables.c b/erts/emulator/beam/erl_node_tables.c index 646f786651..70500ed6e1 100644 --- a/erts/emulator/beam/erl_node_tables.c +++ b/erts/emulator/beam/erl_node_tables.c @@ -188,7 +188,7 @@ dist_table_free(void *vdep) void -erts_dist_table_info(int to, void *to_arg) +erts_dist_table_info(fmtfn_t to, void *to_arg) { int lock = !ERTS_IS_CRASH_DUMPING; if (lock) @@ -564,7 +564,7 @@ erts_node_table_size(void) } void -erts_node_table_info(int to, void *to_arg) +erts_node_table_info(fmtfn_t to, void *to_arg) { int lock = !ERTS_IS_CRASH_DUMPING; if (lock) @@ -649,7 +649,7 @@ void erts_schedule_delete_node(ErlNode *enp) } struct pn_data { - int to; + fmtfn_t to; void *to_arg; Eterm sysname; int no_sysname; @@ -679,7 +679,7 @@ static void print_node(void *venp, void *vpndp) pndp->no_total++; } -void erts_print_node_info(int to, +void erts_print_node_info(fmtfn_t to, void *to_arg, Eterm sysname, int *no_sysname, diff --git a/erts/emulator/beam/erl_node_tables.h b/erts/emulator/beam/erl_node_tables.h index 7a4434acbf..47a6724c21 100644 --- a/erts/emulator/beam/erl_node_tables.h +++ b/erts/emulator/beam/erl_node_tables.h @@ -179,7 +179,7 @@ DistEntry *erts_find_or_insert_dist_entry(Eterm); DistEntry *erts_find_dist_entry(Eterm); void erts_schedule_delete_dist_entry(DistEntry *); Uint erts_dist_table_size(void); -void erts_dist_table_info(int, void *); +void erts_dist_table_info(fmtfn_t, void *); void erts_set_dist_entry_not_connected(DistEntry *); void erts_set_dist_entry_connected(DistEntry *, Eterm, Uint); ErlNode *erts_find_or_insert_node(Eterm, Uint32); @@ -187,8 +187,8 @@ void erts_schedule_delete_node(ErlNode *); void erts_set_this_node(Eterm, Uint); Uint erts_node_table_size(void); void erts_init_node_tables(int); -void erts_node_table_info(int, void *); -void erts_print_node_info(int, void *, Eterm, int*, int*); +void erts_node_table_info(fmtfn_t, void *); +void erts_print_node_info(fmtfn_t, void *, Eterm, int*, int*); Eterm erts_get_node_and_dist_references(struct process *); #if defined(ERTS_SMP) && defined(ERTS_ENABLE_LOCK_CHECK) int erts_lc_is_de_rwlocked(DistEntry *); diff --git a/erts/emulator/beam/erl_port.h b/erts/emulator/beam/erl_port.h index f90844ccc8..c59b42cdae 100644 --- a/erts/emulator/beam/erl_port.h +++ b/erts/emulator/beam/erl_port.h @@ -369,7 +369,7 @@ Eterm erts_request_io_bytes(Process *c_p); #define ERTS_PORT_REDS_INFO (CONTEXT_REDS/100) #define ERTS_PORT_REDS_TERMINATE (CONTEXT_REDS/50) -void print_port_info(Port *, int, void *); +void print_port_info(Port *, fmtfn_t, void *); void erts_port_free(Port *); #ifndef ERTS_SMP void erts_port_cleanup(Port *); diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index bc59147c6c..b989d3be7a 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -557,8 +557,8 @@ do { \ */ static void exec_misc_ops(ErtsRunQueue *); -static void print_function_from_pc(int to, void *to_arg, BeamInstr* x); -static int stack_element_dump(int to, void *to_arg, Eterm* sp, int yreg); +static void print_function_from_pc(fmtfn_t to, void *to_arg, BeamInstr* x); +static int stack_element_dump(fmtfn_t to, void *to_arg, Eterm* sp, int yreg); static void aux_work_timeout(void *unused); static void aux_work_timeout_early_init(int no_schedulers); @@ -13171,7 +13171,7 @@ erts_continue_exit_process(Process *p) */ void -erts_stack_dump(int to, void *to_arg, Process *p) +erts_stack_dump(fmtfn_t to, void *to_arg, Process *p) { Eterm* sp; int yreg = -1; @@ -13186,7 +13186,7 @@ erts_stack_dump(int to, void *to_arg, Process *p) } void -erts_program_counter_info(int to, void *to_arg, Process *p) +erts_program_counter_info(fmtfn_t to, void *to_arg, Process *p) { erts_aint32_t state; int i; @@ -13216,7 +13216,7 @@ erts_program_counter_info(int to, void *to_arg, Process *p) } static void -print_function_from_pc(int to, void *to_arg, BeamInstr* x) +print_function_from_pc(fmtfn_t to, void *to_arg, BeamInstr* x) { BeamInstr* addr = find_function_from_pc(x); if (addr == NULL) { @@ -13238,7 +13238,7 @@ print_function_from_pc(int to, void *to_arg, BeamInstr* x) } static int -stack_element_dump(int to, void *to_arg, Eterm* sp, int yreg) +stack_element_dump(fmtfn_t to, void *to_arg, Eterm* sp, int yreg) { Eterm x = *sp; @@ -13270,7 +13270,7 @@ stack_element_dump(int to, void *to_arg, Eterm* sp, int yreg) * Print scheduler information */ void -erts_print_scheduler_info(int to, void *to_arg, ErtsSchedulerData *esdp) { +erts_print_scheduler_info(fmtfn_t to, void *to_arg, ErtsSchedulerData *esdp) { int i; erts_aint32_t flg; Process *p; diff --git a/erts/emulator/beam/erl_process.h b/erts/emulator/beam/erl_process.h index 435b53fb5f..d7eff3605a 100644 --- a/erts/emulator/beam/erl_process.h +++ b/erts/emulator/beam/erl_process.h @@ -1838,12 +1838,12 @@ void erts_cleanup_empty_process(Process* p); #ifdef DEBUG void erts_debug_verify_clean_empty_process(Process* p); #endif -void erts_stack_dump(int to, void *to_arg, Process *); -void erts_limited_stack_trace(int to, void *to_arg, Process *); -void erts_program_counter_info(int to, void *to_arg, Process *); -void erts_print_scheduler_info(int to, void *to_arg, ErtsSchedulerData *esdp); -void erts_dump_extended_process_state(int to, void *to_arg, erts_aint32_t psflg); -void erts_dump_process_state(int to, void *to_arg, erts_aint32_t psflg); +void erts_stack_dump(fmtfn_t to, void *to_arg, Process *); +void erts_limited_stack_trace(fmtfn_t to, void *to_arg, Process *); +void erts_program_counter_info(fmtfn_t to, void *to_arg, Process *); +void erts_print_scheduler_info(fmtfn_t to, void *to_arg, ErtsSchedulerData *esdp); +void erts_dump_extended_process_state(fmtfn_t to, void *to_arg, erts_aint32_t psflg); +void erts_dump_process_state(fmtfn_t to, void *to_arg, erts_aint32_t psflg); Eterm erts_get_process_priority(Process *p); Eterm erts_set_process_priority(Process *p, Eterm prio); @@ -1879,7 +1879,7 @@ void erts_handle_pending_exit(Process *, ErtsProcLocks); #define ERTS_PROC_PENDING_EXIT(P) 0 #endif -void erts_deep_process_dump(int, void *); +void erts_deep_process_dump(fmtfn_t, void *); Eterm erts_get_reader_groups_map(Process *c_p); Eterm erts_debug_reader_groups_map(Process *c_p, int groups); diff --git a/erts/emulator/beam/erl_process_dict.c b/erts/emulator/beam/erl_process_dict.c index d8c2eaba94..42654604cb 100644 --- a/erts/emulator/beam/erl_process_dict.c +++ b/erts/emulator/beam/erl_process_dict.c @@ -156,7 +156,7 @@ erts_pd_set_initial_size(int size) * Called from break handler */ void -erts_dictionary_dump(int to, void *to_arg, ProcDict *pd) +erts_dictionary_dump(fmtfn_t to, void *to_arg, ProcDict *pd) { unsigned int i; #ifdef DEBUG @@ -196,8 +196,8 @@ erts_dictionary_dump(int to, void *to_arg, ProcDict *pd) } void -erts_deep_dictionary_dump(int to, void *to_arg, - ProcDict* pd, void (*cb)(int, void *, Eterm)) +erts_deep_dictionary_dump(fmtfn_t to, void *to_arg, + ProcDict* pd, void (*cb)(fmtfn_t, void *, Eterm)) { unsigned int i; Eterm t; diff --git a/erts/emulator/beam/erl_process_dict.h b/erts/emulator/beam/erl_process_dict.h index 387562058c..b50a2af72c 100644 --- a/erts/emulator/beam/erl_process_dict.h +++ b/erts/emulator/beam/erl_process_dict.h @@ -37,9 +37,9 @@ typedef struct proc_dict { int erts_pd_set_initial_size(int size); Uint erts_dicts_mem_size(struct process *p); void erts_erase_dicts(struct process *p); -void erts_dictionary_dump(int to, void *to_arg, ProcDict *pd); -void erts_deep_dictionary_dump(int to, void *to_arg, - ProcDict* pd, void (*cb)(int, void *, Eterm obj)); +void erts_dictionary_dump(fmtfn_t to, void *to_arg, ProcDict *pd); +void erts_deep_dictionary_dump(fmtfn_t to, void *to_arg, + ProcDict* pd, void (*cb)(fmtfn_t, void *, Eterm obj)); Eterm erts_dictionary_copy(struct process *p, ProcDict *pd); Eterm erts_pd_hash_get(struct process *p, Eterm id); diff --git a/erts/emulator/beam/erl_process_dump.c b/erts/emulator/beam/erl_process_dump.c index a70dfb8e73..d8bb00e8c6 100644 --- a/erts/emulator/beam/erl_process_dump.c +++ b/erts/emulator/beam/erl_process_dump.c @@ -40,17 +40,17 @@ #define OUR_NIL _make_header(0,_TAG_HEADER_FLOAT) -static void dump_process_info(int to, void *to_arg, Process *p); -static void dump_element(int to, void *to_arg, Eterm x); -static void dump_dist_ext(int to, void *to_arg, ErtsDistExternal *edep); -static void dump_element_nl(int to, void *to_arg, Eterm x); -static int stack_element_dump(int to, void *to_arg, Eterm* sp, +static void dump_process_info(fmtfn_t to, void *to_arg, Process *p); +static void dump_element(fmtfn_t to, void *to_arg, Eterm x); +static void dump_dist_ext(fmtfn_t to, void *to_arg, ErtsDistExternal *edep); +static void dump_element_nl(fmtfn_t to, void *to_arg, Eterm x); +static int stack_element_dump(fmtfn_t to, void *to_arg, Eterm* sp, int yreg); -static void stack_trace_dump(int to, void *to_arg, Eterm* sp); -static void print_function_from_pc(int to, void *to_arg, BeamInstr* x); -static void heap_dump(int to, void *to_arg, Eterm x); -static void dump_binaries(int to, void *to_arg, Binary* root); -static void dump_externally(int to, void *to_arg, Eterm term); +static void stack_trace_dump(fmtfn_t to, void *to_arg, Eterm* sp); +static void print_function_from_pc(fmtfn_t to, void *to_arg, BeamInstr* x); +static void heap_dump(fmtfn_t to, void *to_arg, Eterm x); +static void dump_binaries(fmtfn_t to, void *to_arg, Binary* root); +static void dump_externally(fmtfn_t to, void *to_arg, Eterm term); static Binary* all_binaries; @@ -60,7 +60,7 @@ extern BeamInstr beam_continue_exit[]; void -erts_deep_process_dump(int to, void *to_arg) +erts_deep_process_dump(fmtfn_t to, void *to_arg) { int i, max = erts_ptab_max(&erts_proc); @@ -117,7 +117,7 @@ Uint erts_process_memory(Process *p, int incl_msg_inq) { } static void -dump_process_info(int to, void *to_arg, Process *p) +dump_process_info(fmtfn_t to, void *to_arg, Process *p) { Eterm* sp; ErtsMessage* mp; @@ -176,7 +176,7 @@ dump_process_info(int to, void *to_arg, Process *p) } static void -dump_dist_ext(int to, void *to_arg, ErtsDistExternal *edep) +dump_dist_ext(fmtfn_t to, void *to_arg, ErtsDistExternal *edep) { if (!edep) erts_print(to, to_arg, "D0:E0:"); @@ -210,7 +210,7 @@ dump_dist_ext(int to, void *to_arg, ErtsDistExternal *edep) } static void -dump_element(int to, void *to_arg, Eterm x) +dump_element(fmtfn_t to, void *to_arg, Eterm x) { if (is_list(x)) { erts_print(to, to_arg, "H" PTR_FMT, list_val(x)); @@ -240,14 +240,14 @@ dump_element(int to, void *to_arg, Eterm x) } static void -dump_element_nl(int to, void *to_arg, Eterm x) +dump_element_nl(fmtfn_t to, void *to_arg, Eterm x) { dump_element(to, to_arg, x); erts_putc(to, to_arg, '\n'); } static void -stack_trace_dump(int to, void *to_arg, Eterm *sp) { +stack_trace_dump(fmtfn_t to, void *to_arg, Eterm *sp) { Eterm x = *sp; if (is_CP(x)) { erts_print(to, to_arg, "%p:", sp); @@ -258,7 +258,7 @@ stack_trace_dump(int to, void *to_arg, Eterm *sp) { } void -erts_limited_stack_trace(int to, void *to_arg, Process *p) +erts_limited_stack_trace(fmtfn_t to, void *to_arg, Process *p) { Eterm* sp; @@ -304,7 +304,7 @@ erts_limited_stack_trace(int to, void *to_arg, Process *p) } static int -stack_element_dump(int to, void *to_arg, Eterm* sp, int yreg) +stack_element_dump(fmtfn_t to, void *to_arg, Eterm* sp, int yreg) { Eterm x = *sp; @@ -332,7 +332,7 @@ stack_element_dump(int to, void *to_arg, Eterm* sp, int yreg) } static void -print_function_from_pc(int to, void *to_arg, BeamInstr* x) +print_function_from_pc(fmtfn_t to, void *to_arg, BeamInstr* x) { BeamInstr* addr = find_function_from_pc(x); if (addr == NULL) { @@ -352,7 +352,7 @@ print_function_from_pc(int to, void *to_arg, BeamInstr* x) } static void -heap_dump(int to, void *to_arg, Eterm x) +heap_dump(fmtfn_t to, void *to_arg, Eterm x) { DeclareTmpHeapNoproc(last,1); Eterm* next = last; @@ -512,7 +512,7 @@ heap_dump(int to, void *to_arg, Eterm x) } static void -dump_binaries(int to, void *to_arg, Binary* current) +dump_binaries(fmtfn_t to, void *to_arg, Binary* current) { while (current) { long i; @@ -530,7 +530,7 @@ dump_binaries(int to, void *to_arg, Binary* current) } static void -dump_externally(int to, void *to_arg, Eterm term) +dump_externally(fmtfn_t to, void *to_arg, Eterm term) { byte sbuf[1024]; /* encode and hope for the best ... */ byte* s; @@ -573,7 +573,7 @@ dump_externally(int to, void *to_arg, Eterm term) } } -void erts_dump_process_state(int to, void *to_arg, erts_aint32_t psflg) +void erts_dump_process_state(fmtfn_t to, void *to_arg, erts_aint32_t psflg) { char *s; switch (erts_process_state2status(psflg)) { @@ -591,7 +591,7 @@ void erts_dump_process_state(int to, void *to_arg, erts_aint32_t psflg) } void -erts_dump_extended_process_state(int to, void *to_arg, erts_aint32_t psflg) { +erts_dump_extended_process_state(fmtfn_t to, void *to_arg, erts_aint32_t psflg) { int i; diff --git a/erts/emulator/beam/export.c b/erts/emulator/beam/export.c index 2a19211987..7f043e191b 100644 --- a/erts/emulator/beam/export.c +++ b/erts/emulator/beam/export.c @@ -83,7 +83,7 @@ static struct export_blob* entry_to_blob(struct export_entry* ee) } void -export_info(int to, void *to_arg) +export_info(fmtfn_t to, void *to_arg) { #ifdef ERTS_SMP int lock = !ERTS_IS_CRASH_DUMPING; diff --git a/erts/emulator/beam/export.h b/erts/emulator/beam/export.h index 1e7bb8514b..17fc4828ca 100644 --- a/erts/emulator/beam/export.h +++ b/erts/emulator/beam/export.h @@ -53,7 +53,7 @@ typedef struct export void init_export_table(void); -void export_info(int, void *); +void export_info(fmtfn_t, void *); ERTS_GLB_INLINE Export* erts_active_export_entry(Eterm m, Eterm f, unsigned a); Export* erts_export_put(Eterm mod, Eterm func, unsigned int arity); diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index b2c76aa605..d6df85034c 100644 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -68,7 +68,7 @@ extern void erts_pre_dirty_nif(ErtsSchedulerData *, extern void erts_post_dirty_nif(struct enif_environment_t* env); #endif extern Eterm erts_nif_taints(Process* p); -extern void erts_print_nif_taints(int to, void* to_arg); +extern void erts_print_nif_taints(fmtfn_t to, void* to_arg); void erts_unload_nif(struct erl_module_nif* nif); extern void erl_nif_init(void); extern int erts_nif_get_funcs(struct erl_module_nif*, @@ -1069,16 +1069,17 @@ void erts_lookup_function_info(FunctionInfo* fi, BeamInstr* pc, int full_info); void init_break_handler(void); void erts_set_ignore_break(void); void erts_replace_intr(void); -void process_info(int, void *); -void print_process_info(int, void *, Process*); -void info(int, void *); -void loaded(int, void *); +void process_info(fmtfn_t, void *); +void print_process_info(fmtfn_t, void *, Process*); +void info(fmtfn_t, void *); +void loaded(fmtfn_t, void *); /* erl_arith.c */ double erts_get_positive_zero_float(void); /* config.c */ +__decl_noreturn void __noreturn erts_exit_epilogue(void); __decl_noreturn void __noreturn erts_exit(int n, char*, ...); __decl_noreturn void __noreturn erts_flush_async_exit(int n, char*, ...); void erl_error(char*, va_list); @@ -1161,7 +1162,7 @@ extern void erts_delete_nodes_monitors(Process *, ErtsProcLocks); extern Eterm erts_monitor_nodes(Process *, Eterm, Eterm); extern Eterm erts_processes_monitoring_nodes(Process *); extern int erts_do_net_exits(DistEntry*, Eterm); -extern int distribution_info(int, void *); +extern int distribution_info(fmtfn_t, void *); extern int is_node_name_atom(Eterm a); extern int erts_net_message(Port *, DistEntry *, @@ -1350,7 +1351,7 @@ int erts_utf8_to_latin1(byte* dest, const byte* source, int slen); #define ERTS_UTF8_ANALYZE_MORE 3 #define ERTS_UTF8_OK_MAX_CHARS 4 -void bin_write(int, void*, byte*, size_t); +void bin_write(fmtfn_t, void*, byte*, size_t); Sint intlist_to_buf(Eterm, char*, Sint); /* most callers pass plain char*'s */ struct Sint_buf { @@ -1466,7 +1467,7 @@ Eterm erts_gc_binary_part_2(Process* p, Eterm* reg, Uint live); Uint erts_current_reductions(Process* current, Process *p); -int erts_print_system_version(int to, void *arg, Process *c_p); +int erts_print_system_version(fmtfn_t to, void *arg, Process *c_p); int erts_hibernate(Process* c_p, Eterm module, Eterm function, Eterm args, Eterm* reg); diff --git a/erts/emulator/beam/hash.c b/erts/emulator/beam/hash.c index cd038d100b..8548e30e8b 100644 --- a/erts/emulator/beam/hash.c +++ b/erts/emulator/beam/hash.c @@ -95,7 +95,7 @@ void hash_get_info(HashInfo *hi, Hash *h) ** */ -void hash_info(int to, void *arg, Hash* h) +void hash_info(fmtfn_t to, void *arg, Hash* h) { HashInfo hi; diff --git a/erts/emulator/beam/hash.h b/erts/emulator/beam/hash.h index 4e769c0119..d319aaca83 100644 --- a/erts/emulator/beam/hash.h +++ b/erts/emulator/beam/hash.h @@ -37,7 +37,7 @@ typedef void (*HFREE_FUN)(void*); /* Meta functions */ typedef void* (*HMALLOC_FUN)(int,size_t); typedef void (*HMFREE_FUN)(int,void*); -typedef int (*HMPRINT_FUN)(int,void*,char*, ...); +typedef int (*HMPRINT_FUN)(fmtfn_t,void*,char*, ...); /* ** This bucket must be placed in top of @@ -89,7 +89,7 @@ Hash* hash_init(int, Hash*, char*, int, HashFunctions); void hash_delete(Hash*); void hash_get_info(HashInfo*, Hash*); -void hash_info(int, void *, Hash*); +void hash_info(fmtfn_t, void *, Hash*); int hash_table_sz(Hash *); void* hash_get(Hash*, void*); diff --git a/erts/emulator/beam/index.c b/erts/emulator/beam/index.c index 26d6c04ea0..c86a2122f6 100644 --- a/erts/emulator/beam/index.c +++ b/erts/emulator/beam/index.c @@ -27,7 +27,7 @@ #include "global.h" #include "index.h" -void index_info(int to, void *arg, IndexTable *t) +void index_info(fmtfn_t to, void *arg, IndexTable *t) { hash_info(to, arg, &t->htable); erts_print(to, arg, "=index_table:%s\n", t->htable.name); diff --git a/erts/emulator/beam/index.h b/erts/emulator/beam/index.h index 0a109d8699..b2e3c0eab5 100644 --- a/erts/emulator/beam/index.h +++ b/erts/emulator/beam/index.h @@ -51,7 +51,7 @@ typedef struct index_table #define INDEX_PAGE_MASK ((1 << INDEX_PAGE_SHIFT)-1) IndexTable *erts_index_init(ErtsAlcType_t,IndexTable*,char*,int,int,HashFunctions); -void index_info(int, void *, IndexTable*); +void index_info(fmtfn_t, void *, IndexTable*); int index_table_sz(IndexTable *); int index_get(IndexTable*, void*); diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c index 77dbe92241..4f131c74de 100644 --- a/erts/emulator/beam/io.c +++ b/erts/emulator/beam/io.c @@ -5480,7 +5480,7 @@ erts_request_io_bytes(Process *c_p) typedef struct { - int to; + fmtfn_t to; void *arg; } prt_one_lnk_data; @@ -5497,7 +5497,7 @@ static void prt_one_lnk(ErtsLink *lnk, void *vprtd) } void -print_port_info(Port *p, int to, void *arg) +print_port_info(Port *p, fmtfn_t to, void *arg) { erts_aint32_t state = erts_atomic32_read_nob(&p->state); diff --git a/erts/emulator/beam/module.c b/erts/emulator/beam/module.c index 4f36377450..5978478323 100644 --- a/erts/emulator/beam/module.c +++ b/erts/emulator/beam/module.c @@ -50,7 +50,7 @@ static erts_smp_atomic_t tot_module_bytes; #include "erl_smp.h" -void module_info(int to, void *to_arg) +void module_info(fmtfn_t to, void *to_arg) { index_info(to, to_arg, &module_tables[erts_active_code_ix()]); } diff --git a/erts/emulator/beam/module.h b/erts/emulator/beam/module.h index 1c1afc8461..f105b3f401 100644 --- a/erts/emulator/beam/module.h +++ b/erts/emulator/beam/module.h @@ -48,7 +48,7 @@ Module* erts_put_module(Eterm mod); void init_module_table(void); void module_start_staging(void); void module_end_staging(int commit); -void module_info(int, void *); +void module_info(fmtfn_t, void *); Module *module_code(int, ErtsCodeIndex); int module_code_size(ErtsCodeIndex); diff --git a/erts/emulator/beam/register.c b/erts/emulator/beam/register.c index ac7096745e..acda51c9fc 100644 --- a/erts/emulator/beam/register.c +++ b/erts/emulator/beam/register.c @@ -102,7 +102,7 @@ is_proc_alive(Process *p) return !ERTS_PROC_IS_EXITING(p); } -void register_info(int to, void *to_arg) +void register_info(fmtfn_t to, void *to_arg) { int lock = !ERTS_IS_CRASH_DUMPING; if (lock) diff --git a/erts/emulator/beam/register.h b/erts/emulator/beam/register.h index d839f55d6b..27a314ca78 100644 --- a/erts/emulator/beam/register.h +++ b/erts/emulator/beam/register.h @@ -44,7 +44,7 @@ typedef struct reg_proc int process_reg_size(void); int process_reg_sz(void); void init_register_table(void); -void register_info(int, void *); +void register_info(fmtfn_t, void *); int erts_register_name(Process *, Eterm, Eterm); Eterm erts_whereis_name_to_id(Process *, Eterm); void erts_whereis_name(Process *, ErtsProcLocks, diff --git a/erts/emulator/beam/sys.h b/erts/emulator/beam/sys.h index dfe82cab44..7740dd4373 100644 --- a/erts/emulator/beam/sys.h +++ b/erts/emulator/beam/sys.h @@ -378,6 +378,7 @@ typedef long Sint64; # ifdef LONG_MIN # define ERTS_SINT64_MIN LONG_MIN # endif +# define ErtsStrToSint64 strtol # elif SIZEOF_LONG_LONG == 8 # define HAVE_INT64 1 typedef unsigned long long Uint64; @@ -391,6 +392,7 @@ typedef long long Sint64; # ifdef LLONG_MIN # define ERTS_SINT64_MIN LLONG_MIN # endif +# define ErtsStrToSint64 strtoll # else # error "No 64-bit integer type found" # endif @@ -610,22 +612,21 @@ Uint erts_sys_misc_mem_sz(void); #include "erl_printf.h" /* Io constants to erts_print and erts_putc */ -#define ERTS_PRINT_STDERR (2) -#define ERTS_PRINT_STDOUT (1) -#define ERTS_PRINT_FILE (-1) -#define ERTS_PRINT_SBUF (-2) -#define ERTS_PRINT_SNBUF (-3) -#define ERTS_PRINT_DSBUF (-4) - -#define ERTS_PRINT_MIN ERTS_PRINT_DSBUF +#define ERTS_PRINT_STDERR ((fmtfn_t)0) +#define ERTS_PRINT_STDOUT ((fmtfn_t)1) +#define ERTS_PRINT_FILE ((fmtfn_t)2) +#define ERTS_PRINT_SBUF ((fmtfn_t)3) +#define ERTS_PRINT_SNBUF ((fmtfn_t)4) +#define ERTS_PRINT_DSBUF ((fmtfn_t)5) +#define ERTS_PRINT_FD ((fmtfn_t)6) typedef struct { char *buf; size_t size; } erts_print_sn_buf; -int erts_print(int to, void *arg, char *format, ...); /* in utils.c */ -int erts_putc(int to, void *arg, char); /* in utils.c */ +int erts_print(fmtfn_t to, void *arg, char *format, ...); /* in utils.c */ +int erts_putc(fmtfn_t to, void *arg, char); /* in utils.c */ /* logger stuff is declared here instead of in global.h, so sys files won't have to include global.h */ diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c index 6786657faf..87ea4f05a1 100644 --- a/erts/emulator/beam/utils.c +++ b/erts/emulator/beam/utils.c @@ -348,40 +348,41 @@ int erts_fit_in_bits_uint(Uint value) } int -erts_print(int to, void *arg, char *format, ...) +erts_print(fmtfn_t to, void *arg, char *format, ...) { int res; va_list arg_list; va_start(arg_list, format); - if (to < ERTS_PRINT_MIN) - res = -EINVAL; - else { - switch (to) { - case ERTS_PRINT_STDOUT: + { + switch ((UWord)to) { + case (UWord)ERTS_PRINT_STDOUT: res = erts_vprintf(format, arg_list); break; - case ERTS_PRINT_STDERR: + case (UWord)ERTS_PRINT_STDERR: res = erts_vfprintf(stderr, format, arg_list); break; - case ERTS_PRINT_FILE: + case (UWord)ERTS_PRINT_FILE: res = erts_vfprintf((FILE *) arg, format, arg_list); break; - case ERTS_PRINT_SBUF: + case (UWord)ERTS_PRINT_SBUF: res = erts_vsprintf((char *) arg, format, arg_list); break; - case ERTS_PRINT_SNBUF: + case (UWord)ERTS_PRINT_SNBUF: res = erts_vsnprintf(((erts_print_sn_buf *) arg)->buf, ((erts_print_sn_buf *) arg)->size, format, arg_list); break; - case ERTS_PRINT_DSBUF: + case (UWord)ERTS_PRINT_DSBUF: res = erts_vdsprintf((erts_dsprintf_buf_t *) arg, format, arg_list); break; - default: - res = erts_vfdprintf((int) to, format, arg_list); + case (UWord)ERTS_PRINT_FD: + res = erts_vfdprintf((int)(SWord) arg, format, arg_list); break; + default: + res = erts_vcbprintf(to, arg, format, arg_list); + break; } } @@ -390,7 +391,7 @@ erts_print(int to, void *arg, char *format, ...) } int -erts_putc(int to, void *arg, char c) +erts_putc(fmtfn_t to, void *arg, char c) { return erts_print(to, arg, "%c", c); } @@ -3876,7 +3877,7 @@ store_external_or_ref_in_proc_(Process *proc, Eterm ns) return store_external_or_ref_(&hp, &MSO(proc), ns); } -void bin_write(int to, void *to_arg, byte* buf, size_t sz) +void bin_write(fmtfn_t to, void *to_arg, byte* buf, size_t sz) { size_t i; diff --git a/erts/emulator/hipe/hipe_bif0.c b/erts/emulator/hipe/hipe_bif0.c index 3336fded7a..dcb6c35bfa 100644 --- a/erts/emulator/hipe/hipe_bif0.c +++ b/erts/emulator/hipe/hipe_bif0.c @@ -1476,6 +1476,10 @@ int hipe_find_mfa_from_ra(const void *ra, Eterm *m, Eterm *f, unsigned int *a) struct hipe_mfa_info **bucket; unsigned int i, nrbuckets; + if (hipe_is_ra_mode_switch(ra)) { + return 0; + } + /* Note about locking: the table is only updated from the loader, which runs with the rest of the system suspended. */ /* XXX: alas not true; see comment at hipe_mfa_info_table.lock */ diff --git a/erts/emulator/hipe/hipe_mode_switch.h b/erts/emulator/hipe/hipe_mode_switch.h index c40077d558..e54b81cf78 100644 --- a/erts/emulator/hipe/hipe_mode_switch.h +++ b/erts/emulator/hipe/hipe_mode_switch.h @@ -64,6 +64,7 @@ Eterm hipe_build_stacktrace(Process *p, struct StackTrace *s); ERTS_GLB_INLINE void hipe_reserve_beam_trap_frame(Process*, Eterm reg[], unsigned arity); ERTS_GLB_INLINE void hipe_unreserve_beam_trap_frame(Process*); +ERTS_GLB_INLINE int hipe_is_ra_mode_switch(const void* ra); extern Uint hipe_beam_pc_return[]; extern Uint hipe_beam_pc_throw[]; @@ -112,6 +113,11 @@ ERTS_GLB_INLINE void hipe_unreserve_beam_trap_frame(Process *p) p->stop += 2; } +ERTS_GLB_INLINE int hipe_is_ra_mode_switch(const void* ra) +{ + return ra == nbif_return; +} + #endif /* ERTS_GLB_INLINE_INCL_FUNC_DEF */ #endif /* ASM */ diff --git a/erts/emulator/sys/common/erl_mmap.c b/erts/emulator/sys/common/erl_mmap.c index 7bbb406f29..a5714f8325 100644 --- a/erts/emulator/sys/common/erl_mmap.c +++ b/erts/emulator/sys/common/erl_mmap.c @@ -2390,7 +2390,7 @@ add_2tup(Uint **hpp, Uint *szp, Eterm *lp, Eterm el1, Eterm el2) } Eterm erts_mmap_info(ErtsMemMapper* mm, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Eterm** hpp, Uint* szp, struct erts_mmap_info_struct* emis) @@ -2431,7 +2431,7 @@ Eterm erts_mmap_info(ErtsMemMapper* mm, if (print_to_p) { - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; if (mm->supercarrier) { const char* prefix = "supercarrier "; @@ -2485,7 +2485,7 @@ Eterm erts_mmap_info(ErtsMemMapper* mm, Eterm erts_mmap_info_options(ErtsMemMapper* mm, char *prefix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -2496,7 +2496,7 @@ Eterm erts_mmap_info_options(ErtsMemMapper* mm, Eterm res = THE_NON_VALUE; if (print_to_p) { - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; erts_print(to, arg, "%sscs: %bpu\n", prefix, scs); if (mm->supercarrier) { diff --git a/erts/emulator/sys/common/erl_mmap.h b/erts/emulator/sys/common/erl_mmap.h index fa51b663fa..623b5188ac 100644 --- a/erts/emulator/sys/common/erl_mmap.h +++ b/erts/emulator/sys/common/erl_mmap.h @@ -22,6 +22,7 @@ #define ERL_MMAP_H__ #include "sys.h" +#include "erl_printf.h" #define ERTS_MMAP_SUPERALIGNED_BITS (18) /* Affects hard limits for sbct and lmbcs documented in erts_alloc.xml */ @@ -146,10 +147,10 @@ struct erts_mmap_info_struct UWord segs[6]; UWord os_used; }; -Eterm erts_mmap_info(ErtsMemMapper*, int *print_to_p, void *print_to_arg, +Eterm erts_mmap_info(ErtsMemMapper*, fmtfn_t *print_to_p, void *print_to_arg, Eterm** hpp, Uint* szp, struct erts_mmap_info_struct*); Eterm erts_mmap_info_options(ErtsMemMapper*, - char *prefix, int *print_to_p, void *print_to_arg, + char *prefix, fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp); diff --git a/erts/emulator/sys/common/erl_mseg.c b/erts/emulator/sys/common/erl_mseg.c index f3306a888c..882c93a83c 100644 --- a/erts/emulator/sys/common/erl_mseg.c +++ b/erts/emulator/sys/common/erl_mseg.c @@ -991,7 +991,7 @@ add_4tup(Uint **hpp, Uint *szp, Eterm *lp, static Eterm info_options(ErtsMsegAllctr_t *ma, char *prefix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) @@ -999,7 +999,7 @@ info_options(ErtsMsegAllctr_t *ma, Eterm res = NIL; if (print_to_p) { - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; erts_print(to, arg, "%samcbf: %beu\n", prefix, ma->abs_max_cache_bad_fit); erts_print(to, arg, "%srmcbf: %beu\n", prefix, ma->rel_max_cache_bad_fit); @@ -1027,7 +1027,7 @@ info_options(ErtsMsegAllctr_t *ma, } static Eterm -info_calls(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) +info_calls(ErtsMsegAllctr_t *ma, fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) { Eterm res = THE_NON_VALUE; @@ -1040,7 +1040,7 @@ info_calls(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_arg, Uint **hpp erts_print(TO, TOA, "mseg_%s calls: %b32u%09b32u\n", #CC, \ ma->calls.CC.giga_no, ma->calls.CC.no) - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; PRINT_CC(to, arg, alloc); @@ -1106,7 +1106,7 @@ info_calls(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_arg, Uint **hpp } static Eterm -info_status(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_arg, +info_status(ErtsMsegAllctr_t *ma, fmtfn_t *print_to_p, void *print_to_arg, int begin_new_max_period, int only_sz, Uint **hpp, Uint *szp) { Eterm res = THE_NON_VALUE; @@ -1117,7 +1117,7 @@ info_status(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_arg, ma->segments.max_ever.sz = ma->segments.max.sz; if (print_to_p) { - int to = *print_to_p; + fmtfn_t to = *print_to_p; void *arg = print_to_arg; if (!only_sz) { @@ -1165,7 +1165,7 @@ info_status(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_arg, return res; } -static Eterm info_memkind(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_arg, +static Eterm info_memkind(ErtsMsegAllctr_t *ma, fmtfn_t *print_to_p, void *print_to_arg, int begin_max_per, int only_sz, Uint **hpp, Uint *szp) { Eterm res = THE_NON_VALUE; @@ -1196,7 +1196,7 @@ static Eterm info_memkind(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_ } static Eterm -info_version(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) +info_version(ErtsMsegAllctr_t *ma, fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) { Eterm res = THE_NON_VALUE; @@ -1218,7 +1218,7 @@ info_version(ErtsMsegAllctr_t *ma, int *print_to_p, void *print_to_arg, Uint **h Eterm erts_mseg_info_options(int ix, - int *print_to_p, void *print_to_arg, + fmtfn_t *print_to_p, void *print_to_arg, Uint **hpp, Uint *szp) { ErtsMsegAllctr_t *ma = ERTS_MSEG_ALLCTR_IX(ix); @@ -1231,7 +1231,7 @@ erts_mseg_info_options(int ix, Eterm erts_mseg_info(int ix, - int *print_to_p, + fmtfn_t *print_to_p, void *print_to_arg, int begin_max_per, int only_sz, diff --git a/erts/emulator/sys/common/erl_mseg.h b/erts/emulator/sys/common/erl_mseg.h index a43b409e94..bba0dec499 100644 --- a/erts/emulator/sys/common/erl_mseg.h +++ b/erts/emulator/sys/common/erl_mseg.h @@ -98,8 +98,8 @@ Uint erts_mseg_unit_size(void); void erts_mseg_init(ErtsMsegInit_t *init); void erts_mseg_late_init(void); /* Have to be called after all allocators, threads and timers have been initialized. */ -Eterm erts_mseg_info_options(int, int *, void*, Uint **, Uint *); -Eterm erts_mseg_info(int, int *, void*, int, int, Uint **, Uint *); +Eterm erts_mseg_info_options(int, fmtfn_t*, void*, Uint **, Uint *); +Eterm erts_mseg_info(int, fmtfn_t *, void*, int, int, Uint **, Uint *); #endif /* #if HAVE_ERTS_MSEG */ diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c index ba22a100c2..51366adf1d 100644 --- a/erts/emulator/sys/unix/sys.c +++ b/erts/emulator/sys/unix/sys.c @@ -90,8 +90,6 @@ extern void erl_sys_args(int*, char**); extern void erts_sys_init_float(void); -extern void erl_crash_dump(char* file, int line, char* fmt, ...); - #ifdef DEBUG static int debug_log = 0; @@ -715,13 +713,13 @@ static RETSIGTYPE suspend_signal(void) static RETSIGTYPE suspend_signal(int signum) #endif { - int res, buf[1], __errno = errno; + int res, buf[1], tmp_errno = errno; do { res = read(sig_suspend_fds[0], buf, sizeof(int)); } while (res < 0 && errno == EINTR); /* restore previous errno in case read changed it */ - errno = __errno; + errno = tmp_errno; } #endif /* #ifdef ERTS_SYS_SUSPEND_SIGNAL */ diff --git a/erts/emulator/sys/win32/erl_win_sys.h b/erts/emulator/sys/win32/erl_win_sys.h index 04fbf23109..78005aada9 100644 --- a/erts/emulator/sys/win32/erl_win_sys.h +++ b/erts/emulator/sys/win32/erl_win_sys.h @@ -182,6 +182,8 @@ typedef LONGLONG ErtsMonotonicTime; typedef LONGLONG ErtsSysHrTime; #endif +#define ErtsStrToSint64 _strtoi64 + typedef ErtsMonotonicTime ErtsSystemTime; typedef ErtsMonotonicTime ErtsSysPerfCounter; diff --git a/erts/emulator/sys/win32/sys.c b/erts/emulator/sys/win32/sys.c index cf821b05cb..404e72d176 100644 --- a/erts/emulator/sys/win32/sys.c +++ b/erts/emulator/sys/win32/sys.c @@ -40,7 +40,6 @@ void erts_sys_init_float(void); void erl_start(int, char**); void erts_exit(int n, char*, ...); void erl_error(char*, va_list); -void erl_crash_dump(char*, int, char*, ...); /* * Microsoft-specific function to map a WIN32 error code to a Posix errno. diff --git a/erts/emulator/test/bif_SUITE.erl b/erts/emulator/test/bif_SUITE.erl index d31399e4af..b8d89126fe 100644 --- a/erts/emulator/test/bif_SUITE.erl +++ b/erts/emulator/test/bif_SUITE.erl @@ -31,6 +31,7 @@ t_list_to_existing_atom/1,os_env/1,otp_7526/1, binary_to_atom/1,binary_to_existing_atom/1, atom_to_binary/1,min_max/1, erlang_halt/1, + erl_crash_dump_bytes/1, is_builtin/1]). suite() -> @@ -43,6 +44,7 @@ all() -> t_list_to_existing_atom, os_env, otp_7526, display, atom_to_binary, binary_to_atom, binary_to_existing_atom, + erl_crash_dump_bytes, min_max, erlang_halt, is_builtin]. %% Uses erlang:display to test that erts_printf does not do deep recursion @@ -664,7 +666,7 @@ erlang_halt(Config) when is_list(Config) -> [available_internal_state, true]), {badrpc,nodedown} = rpc:call(N4, erts_debug, set_internal_state, [broken_halt, "Validate correct crash dump"]), - ok = wait_until_stable_size(CrashDump,-1), + {ok,_} = wait_until_stable_size(CrashDump,-1), {ok, Bin} = file:read_file(CrashDump), case {string:str(binary_to_list(Bin),"\n=end\n"), string:str(binary_to_list(Bin),"\r\n=end\r\n")} of @@ -681,11 +683,34 @@ wait_until_stable_size(File,PrevSz) -> wait_until_stable_size(File,PrevSz-1); {ok,#file_info{size = PrevSz }} when PrevSz /= -1 -> io:format("Crashdump file size was: ~p (~s)~n",[PrevSz,File]), - ok; + {ok,PrevSz}; {ok,#file_info{size = NewSz }} -> wait_until_stable_size(File,NewSz) end. +% Test erlang:halt with ERL_CRASH_DUMP_BYTES +erl_crash_dump_bytes(Config) when is_list(Config) -> + Bytes = 1000, + CrashDump = do_limited_crash_dump(Config, Bytes), + {ok,ActualBytes} = wait_until_stable_size(CrashDump,-1), + true = ActualBytes < (Bytes + 100), + + NoDump = do_limited_crash_dump(Config,0), + {error,enoent} = wait_until_stable_size(NoDump,-8), + ok. + +do_limited_crash_dump(Config, Bytes) -> + H = hostname(), + {ok,N} = slave:start(H, halt_node), + BytesStr = integer_to_list(Bytes), + CrashDump = filename:join(proplists:get_value(priv_dir,Config), + "erl_crash." ++ BytesStr ++ ".dump"), + true = rpc:call(N, os, putenv, ["ERL_CRASH_DUMP",CrashDump]), + true = rpc:call(N, os, putenv, ["ERL_CRASH_DUMP_BYTES",BytesStr]), + {badrpc,nodedown} = rpc:call(N, erlang, halt, ["Testing ERL_CRASH_DUMP_BYTES"]), + CrashDump. + + is_builtin(_Config) -> Exp0 = [{M,F,A} || {M,_} <- code:all_loaded(), {F,A} <- M:module_info(exports)], diff --git a/erts/emulator/test/port_SUITE.erl b/erts/emulator/test/port_SUITE.erl index 4323849465..d4e77d634a 100644 --- a/erts/emulator/test/port_SUITE.erl +++ b/erts/emulator/test/port_SUITE.erl @@ -976,21 +976,21 @@ try_bad_env(Env) -> %% Test that we can handle a very very large environment gracefully. huge_env(Config) when is_list(Config) -> ct:timetrap({minutes, 2}), - Vars = case os:type() of - {win32,_} -> 500; - _ -> - %% We create a huge environment, - %% 20000 variables is about 25MB - %% which seems to be the limit on Linux. - 20000 - end, + {Vars, Cmd} = case os:type() of + {win32,_} -> {500, "cmd /q /c ls"}; + _ -> + %% We create a huge environment, + %% 20000 variables is about 25MB + %% which seems to be the limit on Linux. + {20000, "ls"} + end, Env = [{[$a + I div (25*25*25*25) rem 25, $a + I div (25*25*25) rem 25, $a + I div (25*25) rem 25, $a+I div 25 rem 25, $a+I rem 25], lists:duplicate(100,$a+I rem 25)} || I <- lists:seq(1,Vars)], - try erlang:open_port({spawn,"ls"},[exit_status, {env, Env}]) of + try erlang:open_port({spawn,Cmd},[exit_status, {env, Env}]) of P -> receive {P, {exit_status,N}} = M -> @@ -1009,7 +1009,10 @@ huge_env(Config) when is_list(Config) -> %% Test to spawn program with command payload buffer %% just around pipe capacity (9f779819f6bda734c5953468f7798) pipe_limit_env(Config) when is_list(Config) -> - Cmd = "true", + Cmd = case os:type() of + {win32,_} -> "cmd /q /c true"; + _ -> "true" + end, CmdSize = command_payload_size(Cmd), Limits = [4096, 16384, 65536], % Try a couple of common pipe buffer sizes @@ -1026,7 +1029,7 @@ pipe_limit_env_do(Bytes, Cmd, CmdSize) -> try erlang:open_port({spawn,Cmd},[exit_status, {env, Env}]) of P -> receive - {P, {exit_status,N}} = M -> + {P, {exit_status,N}} -> %% Bug caused exit_status 150 (EINVAL+128) 0 = N end diff --git a/erts/emulator/test/trace_SUITE.erl b/erts/emulator/test/trace_SUITE.erl index da6a6bdea4..f846b0f4b9 100644 --- a/erts/emulator/test/trace_SUITE.erl +++ b/erts/emulator/test/trace_SUITE.erl @@ -30,7 +30,7 @@ procs_trace/1, dist_procs_trace/1, procs_new_trace/1, suspend/1, mutual_suspend/1, suspend_exit/1, suspender_exit/1, suspend_system_limit/1, suspend_opts/1, suspend_waiting/1, - new_clear/1, existing_clear/1, + new_clear/1, existing_clear/1, tracer_die/1, set_on_spawn/1, set_on_first_spawn/1, cpu_timestamp/1, set_on_link/1, set_on_first_link/1, system_monitor_args/1, more_system_monitor_args/1, @@ -54,7 +54,7 @@ all() -> send_trace, procs_trace, dist_procs_trace, suspend, mutual_suspend, suspend_exit, suspender_exit, suspend_system_limit, suspend_opts, suspend_waiting, - new_clear, existing_clear, set_on_spawn, + new_clear, existing_clear, tracer_die, set_on_spawn, set_on_first_spawn, set_on_link, set_on_first_link, system_monitor_args, more_system_monitor_args, system_monitor_long_gc_1, @@ -1636,6 +1636,34 @@ existing_clear(Config) when is_list(Config) -> ok. +%% Test that erlang:trace/3 can be called on processes where the +%% tracer has died. OTP-13928 +tracer_die(Config) when is_list(Config) -> + Proc = spawn(fun receiver/0), + + Tracer = spawn(fun receiver/0), + timer:sleep(1), + N = erlang:trace(existing, true, [send, {tracer, Tracer}]), + {flags, [send]} = erlang:trace_info(Proc, flags), + {tracer, Tracer} = erlang:trace_info(Proc, tracer), + exit(Tracer, die), + + Tracer2 = spawn(fun receiver/0), + timer:sleep(1), + N = erlang:trace(existing, true, [send, {tracer, Tracer2}]), + {flags, [send]} = erlang:trace_info(Proc, flags), + {tracer, Tracer2} = erlang:trace_info(Proc, tracer), + exit(Tracer2, die), + + Tracer3 = spawn(fun receiver/0), + timer:sleep(1), + 1 = erlang:trace(Proc, true, [send, {tracer, Tracer3}]), + {flags, [send]} = erlang:trace_info(Proc, flags), + {tracer, Tracer3} = erlang:trace_info(Proc, tracer), + exit(Tracer3, die), + + ok. + %% Test that an invalid flag cause badarg bad_flag(Config) when is_list(Config) -> %% A bad flag could deadlock the SMP emulator in erts-5.5 diff --git a/erts/etc/unix/cerl.src b/erts/etc/unix/cerl.src index c5422ab2ed..30f2d831b5 100644 --- a/erts/etc/unix/cerl.src +++ b/erts/etc/unix/cerl.src @@ -399,19 +399,29 @@ elif [ "x$GDB" = "xdump" ]; then cmdfile="/tmp/.cerlgdb.$$" case "x$core" in x/*) - gdbcmd="$EMU_NAME ${core}" ;; *) dir=`pwd` - gdbcmd="$EMU_NAME ${dir}/${core}" + core="${dir}/${core}" ;; esac - echo "set width 0 + case `uname` in + Darwin) + echo " +thread backtrace all +quit +" > $cmdfile + exec lldb -s $cmdfile -c ${core} $EMU_NAME + ;; + *) + echo "set width 0 set height 0 set verbose off source $ROOTDIR/erts/etc/unix/etp-commands thread apply all bt " > $cmdfile - exec gdb --batch --command=$cmdfile $gdbcmd + exec gdb --batch --command=$cmdfile $EMU_NAME $core + ;; + esac fi diff --git a/erts/etc/unix/etp-commands.in b/erts/etc/unix/etp-commands.in index e2bf302cca..1a4f641301 100644 --- a/erts/etc/unix/etp-commands.in +++ b/erts/etc/unix/etp-commands.in @@ -52,7 +52,7 @@ document etp-help % etpf-cons, etpf-boxed, % % Special commands for not really terms: -% etp-mfa, etp-cp, +% etp-mfa, etp-cp, etp-disasm, % etp-msgq, etpf-msgq, % etp-stacktrace, etp-stackdump, etpf-stackdump, etp-dictdump % etp-process-info, etp-process-memory-info @@ -1090,12 +1090,10 @@ document etp-mfa %--------------------------------------------------------------------------- end - - -define etp-cp-1 +define etp-cp-func-info-1 # Args: Eterm cp # -# Non-reentrant +# Non-reentrant, takes cp, sets $etp_cp_p to MFA in func_info # set $etp_cp = (Eterm)($arg0) set $etp_ranges = &r[(int)the_active_code_index] @@ -1137,8 +1135,21 @@ define etp-cp-1 end end if $etp_cp_p + set $cp_cp_p_offset = ($etp_cp-((Eterm)($etp_cp_p-2))) + else + set $cp_cp_p_offset = 0 + end +end + +define etp-cp-1 +# Args: Eterm cp +# +# Non-reentrant +# + etp-cp-func-info-1 $arg0 + if $etp_cp_p printf "#Cp" - etp-mfa-1 ($etp_cp_p) ($etp_cp-((Eterm)($etp_cp_p-2))) + etp-mfa-1 $etp_cp_p $cp_cp_p_offset else if $etp_cp == beam_apply+1 printf "#Cp<terminate process normally>" @@ -2478,11 +2489,58 @@ end document etp-schedulers %--------------------------------------------------------------------------- % etp-schedulers -% +% % Print misc info about all schedulers %--------------------------------------------------------------------------- end +define etp-disasm-1 + set $code_ptr = ((BeamInstr*)$arg0) + set $addr = *$code_ptr + set $i = 0 + while $i < (sizeof(opc) / sizeof(OpEntry)) + if $addr == beam_ops[$i] + printf "%s %d", opc[$i].name, opc[$i].sz + set $next_i = $code_ptr + opc[$i].sz + set $i += 4999 + end + set $i++ + end +end + +define etp-disasm + etp-cp-func-info-1 $arg0 + if $etp_cp_p == 0 + printf "invalid argument" + else + etp-mfa-1 $etp_cp_p $cp_cp_p_offset + printf ": " + etp-disasm-1 $arg0 + printf "\r\n" + while $next_i < ((BeamInstr*)$arg1) + set $prev_i = $next_i + etp-cp-func-info-1 $next_i + etp-mfa-1 $etp_cp_p $cp_cp_p_offset + printf ": " + etp-disasm-1 $next_i + if $prev_i == $next_i + # ptr did not advance, we are inside some strange opcode with argument + set $next_i++ + printf "instr argument" + end + printf "\r\n" + end + end +end + +document etp-disasm +%--------------------------------------------------------------------------- +% etp-disasm StartI EndI +% +% Disassemble the code inbetween StartI and EndI +%--------------------------------------------------------------------------- +end + define etp-migration-info set $minfo = (ErtsMigrationPaths *) *((UWord *) &erts_migration_paths) set $rq_ix = 0 diff --git a/erts/include/internal/erl_printf.h b/erts/include/internal/erl_printf.h index c4565dfafc..f180a53f18 100644 --- a/erts/include/internal/erl_printf.h +++ b/erts/include/internal/erl_printf.h @@ -41,12 +41,18 @@ struct erts_dsprintf_buf_t_ { #define ERTS_DSPRINTF_BUF_INITER(GFUNC) {NULL, 0, 0, (GFUNC)} +typedef int (*fmtfn_t)(void*, char*, size_t); + +int erts_write_fd(void *vfdp, char* buf, size_t len); +int erts_write_ds(void *vdsbufp, char* buf, size_t len); + int erts_printf(const char *, ...); int erts_fprintf(FILE *, const char *, ...); int erts_fdprintf(int, const char *, ...); int erts_sprintf(char *, const char *, ...); int erts_snprintf(char *, size_t, const char *, ...); int erts_dsprintf(erts_dsprintf_buf_t *, const char *, ...); +int erts_cbprintf(fmtfn_t, void*, const char*, ...); int erts_vprintf(const char *, va_list); int erts_vfprintf(FILE *, const char *, va_list); @@ -54,5 +60,6 @@ int erts_vfdprintf(int, const char *, va_list); int erts_vsprintf(char *, const char *, va_list); int erts_vsnprintf(char *, size_t, const char *, va_list); int erts_vdsprintf(erts_dsprintf_buf_t *, const char *, va_list); +int erts_vcbprintf(fmtfn_t, void*, const char*, va_list); #endif /* #ifndef ERL_PRINTF_H_ */ diff --git a/erts/include/internal/erl_printf_format.h b/erts/include/internal/erl_printf_format.h index 4f969bdbcb..56ec032bd1 100644 --- a/erts/include/internal/erl_printf_format.h +++ b/erts/include/internal/erl_printf_format.h @@ -30,6 +30,7 @@ #include <stdlib.h> #include "erl_int_sizes_config.h" +#include "erl_printf.h" #if SIZEOF_VOID_P == SIZEOF_LONG typedef unsigned long ErlPfUWord; @@ -44,8 +45,6 @@ typedef long long ErlPfSWord; #error Found no appropriate type to use for 'Eterm', 'Uint' and 'Sint' #endif -typedef int (*fmtfn_t)(void*, char*, size_t); - extern int erts_printf_format(fmtfn_t, void*, char*, va_list); extern int erts_printf_char(fmtfn_t, void*, char); diff --git a/erts/lib_src/common/erl_printf.c b/erts/lib_src/common/erl_printf.c index b5e90dfeef..7781fc2196 100644 --- a/erts/lib_src/common/erl_printf.c +++ b/erts/lib_src/common/erl_printf.c @@ -165,8 +165,8 @@ write_f(void *vfp, char* buf, size_t len) return len; } -static int -write_fd(void *vfdp, char* buf, size_t len) +int +erts_write_fd(void *vfdp, char* buf, size_t len) { ssize_t size; size_t res = len; @@ -226,8 +226,8 @@ write_sn(void *vwsnap, char* buf, size_t len) return rv; } -static int -write_ds(void *vdsbufp, char* buf, size_t len) +int +erts_write_ds(void *vdsbufp, char* buf, size_t len) { erts_dsprintf_buf_t *dsbufp = (erts_dsprintf_buf_t *) vdsbufp; size_t need_len = len + 1; /* Also trailing '\0' */ @@ -301,7 +301,7 @@ erts_fdprintf(int fd, const char *format, ...) va_list arglist; va_start(arglist, format); errno = 0; - res = erts_printf_format(write_fd,(void *)&fd,(char *)format,arglist); + res = erts_printf_format(erts_write_fd,(void *)&fd,(char *)format,arglist); va_end(arglist); return res; } @@ -355,7 +355,7 @@ erts_dsprintf(erts_dsprintf_buf_t *dsbufp, const char *format, ...) return -EINVAL; va_start(arglist, format); errno = 0; - res = erts_printf_format(write_ds, (void *)dsbufp, (char *)format, arglist); + res = erts_printf_format(erts_write_ds, (void *)dsbufp, (char *)format, arglist); if (dsbufp->str) { if (res < 0) dsbufp->str[0] = '\0'; @@ -366,6 +366,20 @@ erts_dsprintf(erts_dsprintf_buf_t *dsbufp, const char *format, ...) return res; } +/* + * Callback printf + */ +int erts_cbprintf(fmtfn_t cb_fn, void* cb_arg, const char* format, ...) +{ + int res; + va_list arglist; + va_start(arglist, format); + errno = 0; + res = erts_printf_format(cb_fn, cb_arg, (char *)format, arglist); + va_end(arglist); + return res; +} + int erts_vprintf(const char *format, va_list arglist) { @@ -411,7 +425,7 @@ erts_vfdprintf(int fd, const char *format, va_list arglist) { int res; errno = 0; - res = erts_printf_format(write_fd,(void *)&fd,(char *)format,arglist); + res = erts_printf_format(erts_write_fd,(void *)&fd,(char *)format,arglist); return res; } @@ -456,7 +470,7 @@ erts_vdsprintf(erts_dsprintf_buf_t *dsbufp, const char *format, va_list arglist) if (!dsbufp) return -EINVAL; errno = 0; - res = erts_printf_format(write_ds, (void *)dsbufp, (char *)format, arglist); + res = erts_printf_format(erts_write_ds, (void *)dsbufp, (char *)format, arglist); if (dsbufp->str) { if (res < 0) dsbufp->str[0] = '\0'; @@ -465,3 +479,10 @@ erts_vdsprintf(erts_dsprintf_buf_t *dsbufp, const char *format, va_list arglist) } return res; } + +int +erts_vcbprintf(fmtfn_t cb_fn, void* cb_arg, const char *format, va_list arglist) +{ + errno = 0; + return erts_printf_format(cb_fn, cb_arg, (char *)format, arglist); +} diff --git a/erts/preloaded/ebin/erlang.beam b/erts/preloaded/ebin/erlang.beam Binary files differindex c68debeabc..fbbfefa462 100644 --- a/erts/preloaded/ebin/erlang.beam +++ b/erts/preloaded/ebin/erlang.beam diff --git a/erts/preloaded/ebin/erts_internal.beam b/erts/preloaded/ebin/erts_internal.beam Binary files differindex 227b62b7d3..2a7bfb8b86 100644 --- a/erts/preloaded/ebin/erts_internal.beam +++ b/erts/preloaded/ebin/erts_internal.beam diff --git a/erts/preloaded/ebin/init.beam b/erts/preloaded/ebin/init.beam Binary files differindex 849273f746..74a0184818 100644 --- a/erts/preloaded/ebin/init.beam +++ b/erts/preloaded/ebin/init.beam diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl index 652a954807..8771089b65 100644 --- a/erts/preloaded/src/erlang.erl +++ b/erts/preloaded/src/erlang.erl @@ -2408,10 +2408,11 @@ term_to_binary(_Term, _Options) -> tl(_List) -> erlang:nif_error(undefined). +-type match_variable() :: atom(). % Approximation of '$1' | '$2' | ... -type trace_pattern_mfa() :: {atom(),atom(),arity() | '_'} | on_load. -type trace_match_spec() :: - [{[term()] | '_' ,[term()],[term()]}]. + [{[term()] | '_' | match_variable() ,[term()],[term()]}]. -spec erlang:trace_pattern(MFA, MatchSpec) -> non_neg_integer() when MFA :: trace_pattern_mfa() | send | 'receive', diff --git a/erts/preloaded/src/erts_internal.erl b/erts/preloaded/src/erts_internal.erl index 6aae5ba38c..f4518c4008 100644 --- a/erts/preloaded/src/erts_internal.erl +++ b/erts/preloaded/src/erts_internal.erl @@ -438,10 +438,11 @@ microstate_accounting(Ref, Threads) -> trace(_PidSpec, _How, _FlagList) -> erlang:nif_error(undefined). +-type match_variable() :: atom(). % Approximation of '$1' | '$2' | ... -type trace_pattern_mfa() :: {atom(),atom(),arity() | '_'} | on_load. -type trace_match_spec() :: - [{[term()] | '_' ,[term()],[term()]}]. + [{[term()] | '_' | match_variable() ,[term()],[term()]}]. -spec trace_pattern(MFA, MatchSpec, FlagList) -> non_neg_integer() when MFA :: trace_pattern_mfa(), diff --git a/erts/preloaded/src/init.erl b/erts/preloaded/src/init.erl index 962528f7ab..551ca4ea40 100644 --- a/erts/preloaded/src/init.erl +++ b/erts/preloaded/src/init.erl @@ -205,7 +205,7 @@ boot(BootArgs) -> {Start0,Flags,Args} = parse_boot_args(BootArgs), %% We don't get to profile parsing of BootArgs - case get_flag(profile_boot, Flags, false) of + case b2a(get_flag(profile_boot, Flags, false)) of false -> ok; true -> debug_profile_start() end, @@ -782,7 +782,7 @@ do_boot(Init,Flags,Start) -> (catch erlang:system_info({purify, "Node: " ++ atom_to_list(node())})), start_em(Start), - case get_flag(profile_boot,Flags,false) of + case b2a(get_flag(profile_boot,Flags,false)) of false -> ok; true -> debug_profile_format_mfas(debug_profile_mfas()), diff --git a/lib/common_test/doc/src/ct_telnet.xml b/lib/common_test/doc/src/ct_telnet.xml index eba3c3030d..8e85cccc99 100644 --- a/lib/common_test/doc/src/ct_telnet.xml +++ b/lib/common_test/doc/src/ct_telnet.xml @@ -337,7 +337,7 @@ <c>FullMatch</c> is the string matched by the whole regular expression, and <c>SubMatchN</c> is the string that matched subexpression number <c>N</c>. Subexpressions are denoted with - <c>(' ')</c> in the regular expression.</p> + <c>'(' ')'</c> in the regular expression.</p> <p>If a <c>Tag</c> is speciifed, the returned <c>Match</c> also includes the matched <c>Tag</c>. Otherwise, only <c>RxMatch</c> diff --git a/lib/common_test/src/Makefile b/lib/common_test/src/Makefile index 0f9e044f9e..9d751996ad 100644 --- a/lib/common_test/src/Makefile +++ b/lib/common_test/src/Makefile @@ -80,6 +80,7 @@ MODULES= \ ct_groups \ ct_property_test \ ct_release_test \ + ct_default_gl \ erl2html2 \ test_server_ctrl \ test_server_gl \ diff --git a/lib/common_test/src/ct_default_gl.erl b/lib/common_test/src/ct_default_gl.erl new file mode 100644 index 0000000000..d1b52e5f4f --- /dev/null +++ b/lib/common_test/src/ct_default_gl.erl @@ -0,0 +1,83 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2012-2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +-module(ct_default_gl). +-export([start_link/1, stop/0]). + +-export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2]). + +%% start_link() +%% Start a new group leader process. +start_link(ParentGL) -> + do_start(ParentGL, 3). + +do_start(_ParentGL, 0) -> + exit({?MODULE,startup}); +do_start(ParentGL, Retries) -> + case whereis(?MODULE) of + undefined -> + case gen_server:start_link(?MODULE, [ParentGL], []) of + {ok,Pid} -> + {ok,Pid}; + Other -> + Other + end; + Pid -> + exit(Pid, kill), + timer:sleep(1000), + do_start(ParentGL, Retries-1) + end. + +%% stop(Pid) +%% Stop a group leader process. +stop() -> + gen_server:cast(whereis(?MODULE), stop). + + +%%% Internal functions. + +init([ParentGL]) -> + register(?MODULE, self()), + {ok,#{parent_gl_pid => ParentGL, + parent_gl_monitor => erlang:monitor(process,ParentGL)}}. + +handle_cast(stop, St) -> + {stop,normal,St}. + +%% If the parent group leader dies, fall back on using the local user process +handle_info({'DOWN',Ref,process,_,_Reason}, #{parent_gl_monitor := Ref} = St) -> + User = whereis(user), + {noreply,St#{parent_gl_pid => User, + parent_gl_monitor => erlang:monitor(process,User)}}; + +handle_info({io_request,_From,_ReplyAs,_Req} = IoReq, + #{parent_gl_pid := ParentGL} = St) -> + ParentGL ! IoReq, + {noreply,St}; + +handle_info(Msg, St) -> + io:format(user, "Common Test Group Leader process got: ~tp~n", [Msg]), + {noreply,St}. + +handle_call(_Req, _From, St) -> + {reply,ok,St}. + +terminate(_, _) -> + ok. diff --git a/lib/common_test/src/ct_framework.erl b/lib/common_test/src/ct_framework.erl index 104515e57e..291a4d716c 100644 --- a/lib/common_test/src/ct_framework.erl +++ b/lib/common_test/src/ct_framework.erl @@ -307,7 +307,7 @@ add_defaults(Mod,Func, GroupPath) -> "~w:suite/0 failed: ~p~n", [Suite,Reason]), io:format(ErrStr, []), - io:format(user, ErrStr, []), + io:format(?def_gl, ErrStr, []), {suite0_failed,{exited,Reason}}; SuiteInfo when is_list(SuiteInfo) -> case lists:all(fun(E) when is_tuple(E) -> true; @@ -330,7 +330,7 @@ add_defaults(Mod,Func, GroupPath) -> "~w:suite/0: ~p~n", [Suite,SuiteInfo]), io:format(ErrStr, []), - io:format(user, ErrStr, []), + io:format(?def_gl, ErrStr, []), {suite0_failed,bad_return_value} end; SuiteInfo -> @@ -338,7 +338,7 @@ add_defaults(Mod,Func, GroupPath) -> "Invalid return value from " "~w:suite/0: ~p~n", [Suite,SuiteInfo]), io:format(ErrStr, []), - io:format(user, ErrStr, []), + io:format(?def_gl, ErrStr, []), {suite0_failed,bad_return_value} end. @@ -366,7 +366,7 @@ add_defaults1(Mod,Func, GroupPath, SuiteInfo) -> "~w:group(~w): ~p~n", [Mod,GrName,BadGr0Val]), io:format(Gr0ErrStr, []), - io:format(user, Gr0ErrStr, []), + io:format(?def_gl, Gr0ErrStr, []), {group0_failed,bad_return_value}; _ -> Args = if Func == init_per_group ; Func == end_per_group -> @@ -388,7 +388,7 @@ add_defaults1(Mod,Func, GroupPath, SuiteInfo) -> "~w:~w/0: ~p~n", [Mod,Func,BadTC0Val]), io:format(TC0ErrStr, []), - io:format(user, TC0ErrStr, []), + io:format(?def_gl, TC0ErrStr, []), {testcase0_failed,bad_return_value}; _ -> %% let test case info (also for all config funcs) override @@ -927,7 +927,7 @@ error_notification(Mod,Func,_Args,{Error,Loc}) -> Div = "~n- - - - - - - - - - - - - - - - - - - " "- - - - - - - - - - - - - - - - - - - - -~n", ErrorStr2 = io_lib:format(ErrorFormat, ErrorArgs), - io:format(user, lists:concat([Div,ErrorStr2,Div,"~n"]), + io:format(?def_gl, lists:concat([Div,ErrorStr2,Div,"~n"]), []), Link = "\n\n<a href=\"#end\">" @@ -1133,7 +1133,7 @@ get_all(Mod, ConfTests) -> ErrStr = io_lib:format("~n*** ERROR *** " "~w:all/0 failed: ~p~n", [Mod,ExitReason]), - io:format(user, ErrStr, []), + io:format(?def_gl, ErrStr, []), %% save the error info so it doesn't get printed twice ct_util:set_testdata_async({{error_in_suite,Mod}, ExitReason}); diff --git a/lib/common_test/src/ct_logs.erl b/lib/common_test/src/ct_logs.erl index 9282a9f81d..0daed60dba 100644 --- a/lib/common_test/src/ct_logs.erl +++ b/lib/common_test/src/ct_logs.erl @@ -531,8 +531,13 @@ tc_print(Category,Importance,Format,Args) -> Val end, if Importance >= (100-VLvl) -> - Head = get_heading(Category), - io:format(user, lists:concat([Head,Format,"\n\n"]), Args), + Str = lists:concat([get_heading(Category),Format,"\n\n"]), + try + io:format(?def_gl, Str, Args) + catch + %% default group leader probably not started, or has stopped + _:_ -> io:format(user, Str, Args) + end, ok; true -> ok @@ -679,7 +684,7 @@ logger(Parent, Mode, Verbosity) -> PrivFilesDestRun = [filename:join(AbsDir, F) || F <- PrivFiles], case copy_priv_files(PrivFilesSrc, PrivFilesDestTop) of {error,Src1,Dest1,Reason1} -> - io:format(user, "ERROR! "++ + io:format(?def_gl, "ERROR! "++ "Priv file ~p could not be copied to ~p. "++ "Reason: ~p~n", [Src1,Dest1,Reason1]), @@ -687,7 +692,7 @@ logger(Parent, Mode, Verbosity) -> ok -> case copy_priv_files(PrivFilesSrc, PrivFilesDestRun) of {error,Src2,Dest2,Reason2} -> - io:format(user, + io:format(?def_gl, "ERROR! "++ "Priv file ~p could not be copied to ~p. " ++"Reason: ~p~n", diff --git a/lib/common_test/src/ct_run.erl b/lib/common_test/src/ct_run.erl index fbb9c7ab60..a049ef5695 100644 --- a/lib/common_test/src/ct_run.erl +++ b/lib/common_test/src/ct_run.erl @@ -2155,8 +2155,8 @@ continue(_MakeErrors, true) -> false; continue(_MakeErrors, _AbortIfMissingSuites) -> io:nl(), - OldGl = group_leader(), - case set_group_leader_same_as_shell() of + OldGL = group_leader(), + case set_group_leader_same_as_shell(OldGL) of true -> S = self(), io:format("Failed to compile or locate one " @@ -2172,7 +2172,7 @@ continue(_MakeErrors, _AbortIfMissingSuites) -> S ! false end end), - group_leader(OldGl, self()), + group_leader(OldGL, self()), receive R when R==true; R==false -> R after 15000 -> @@ -2184,7 +2184,9 @@ continue(_MakeErrors, _AbortIfMissingSuites) -> true end. -set_group_leader_same_as_shell() -> +set_group_leader_same_as_shell(OldGL) -> + %% find the group leader process on the node in a dirty fashion + %% (check initial function call and look in the process dictionary) GS2or3 = fun(P) -> case process_info(P,initial_call) of {initial_call,{group,server,X}} when X == 2 ; X == 3 -> @@ -2197,7 +2199,10 @@ set_group_leader_same_as_shell() -> true == lists:keymember(shell,1, element(2,process_info(P,dictionary)))] of [GL|_] -> - group_leader(GL, self()); + %% check if started from remote node (skip interaction) + if node(OldGL) /= node(GL) -> false; + true -> group_leader(GL, self()) + end; [] -> false end. diff --git a/lib/common_test/src/ct_util.erl b/lib/common_test/src/ct_util.erl index 82a8743cf0..4d3a2ae7e3 100644 --- a/lib/common_test/src/ct_util.erl +++ b/lib/common_test/src/ct_util.erl @@ -188,6 +188,8 @@ do_start(Parent, Mode, LogDir, Verbosity) -> ok end, + ct_default_gl:start_link(group_leader()), + {StartTime,TestLogDir} = ct_logs:init(Mode, Verbosity), ct_event:notify(#event{name=test_start, @@ -474,6 +476,7 @@ loop(Mode,TestData,StartDir) -> ct_logs:close(Info, StartDir), ct_event:stop(), ct_config:stop(), + ct_default_gl:stop(), ok = file:set_cwd(StartDir), return(From, Info); {Ref, _Msg} when is_reference(Ref) -> @@ -926,7 +929,8 @@ warn_duplicates(Suites) -> [] -> ok; _ -> - io:format(user,"~nWARNING! Deprecated function: ~w:sequences/0.~n" + io:format(?def_gl, + "~nWARNING! Deprecated function: ~w:sequences/0.~n" " Use group with sequence property instead.~n",[Mod]) end end, @@ -980,12 +984,12 @@ get_profile_data(Profile, Key, StartDir) -> end, case Result of {error,enoent} when Profile /= default -> - io:format(user, "~nERROR! Missing profile file ~p~n", [File]), + io:format(?def_gl, "~nERROR! Missing profile file ~p~n", [File]), undefined; {error,enoent} when Profile == default -> undefined; {error,Reason} -> - io:format(user,"~nERROR! Error in profile file ~p: ~p~n", + io:format(?def_gl,"~nERROR! Error in profile file ~p: ~p~n", [WhichFile,Reason]), undefined; {ok,Data} -> @@ -995,7 +999,7 @@ get_profile_data(Profile, Key, StartDir) -> _ when is_list(Data) -> Data; _ -> - io:format(user, + io:format(?def_gl, "~nERROR! Invalid profile data in ~p~n", [WhichFile]), [] @@ -1082,10 +1086,10 @@ open_url(iexplore, Args, URL) -> Path = proplists:get_value(default, Paths), [Cmd | _] = string:tokens(Path, "%"), Cmd1 = Cmd ++ " " ++ Args ++ " " ++ URL, - io:format(user, "~nOpening ~ts with command:~n ~ts~n", [URL,Cmd1]), + io:format(?def_gl, "~nOpening ~ts with command:~n ~ts~n", [URL,Cmd1]), open_port({spawn,Cmd1}, []); _ -> - io:format("~nNo path to iexplore.exe~n",[]) + io:format(?def_gl, "~nNo path to iexplore.exe~n",[]) end, win32reg:close(R), ok; @@ -1095,6 +1099,6 @@ open_url(Prog, Args, URL) -> is_list(Prog) -> Prog end, Cmd = ProgStr ++ " " ++ Args ++ " " ++ URL, - io:format(user, "~nOpening ~ts with command:~n ~ts~n", [URL,Cmd]), + io:format(?def_gl, "~nOpening ~ts with command:~n ~ts~n", [URL,Cmd]), open_port({spawn,Cmd},[]), ok. diff --git a/lib/common_test/src/ct_util.hrl b/lib/common_test/src/ct_util.hrl index d7efa26863..039c8168ec 100644 --- a/lib/common_test/src/ct_util.hrl +++ b/lib/common_test/src/ct_util.hrl @@ -23,6 +23,7 @@ -define(board_table,ct_boards). -define(suite_table,ct_suite_data). -define(verbosity_table,ct_verbosity_table). +-define(def_gl, ct_default_gl). -record(conn, {handle, targetref, diff --git a/lib/compiler/src/beam_block.erl b/lib/compiler/src/beam_block.erl index ec41925beb..6a35191f6e 100644 --- a/lib/compiler/src/beam_block.erl +++ b/lib/compiler/src/beam_block.erl @@ -58,13 +58,6 @@ blockify(Is) -> blockify([{loop_rec,{f,Fail},{x,0}},{loop_rec_end,_Lbl},{label,Fail}|Is], Acc) -> %% Useless instruction sequence. blockify(Is, Acc); -blockify([{get_map_elements,F,S,{list,Gets}}|Is0], Acc) -> - %% A get_map_elements instruction is only safe at the beginning of - %% a block because of the failure label. - {Ss,Ds} = beam_utils:split_even(Gets), - I = {set,Ds,[S|Ss],{get_map_elements,F}}, - {Block,Is} = collect_block(Is0, [I]), - blockify(Is, [{block,Block}|Acc]); blockify([I|Is0]=IsAll, Acc) -> case collect(I) of error -> blockify(Is0, [I|Acc]); @@ -220,7 +213,6 @@ move_allocates_1([], Acc) -> Acc. alloc_may_pass({set,_,_,{alloc,_,_}}) -> false; alloc_may_pass({set,_,_,{set_tuple_element,_}}) -> false; -alloc_may_pass({set,_,_,{get_map_elements,_}}) -> false; alloc_may_pass({set,_,_,put_list}) -> false; alloc_may_pass({set,_,_,put}) -> false; alloc_may_pass({set,_,_,_}) -> true. @@ -235,8 +227,6 @@ opt([{set,_,_,{line,_}}=Line1, {set,[D2],[{integer,Idx2},Reg],{bif,element,{f,0}}}=I2|Is]) when Idx1 < Idx2, D1 =/= D2, D1 =/= Reg, D2 =/= Reg -> opt([Line2,I2,Line1,I1|Is]); -opt([{set,[_|_],_Ss,{get_map_elements,_F}}=I|Is]) -> - [I|opt(Is)]; opt([{set,Ds0,Ss,Op}|Is0]) -> {Ds,Is} = opt_moves(Ds0, Is0), [{set,Ds,Ss,Op}|opt(Is)]; diff --git a/lib/compiler/src/beam_bsm.erl b/lib/compiler/src/beam_bsm.erl index 286307a4be..ae1b34ba49 100644 --- a/lib/compiler/src/beam_bsm.erl +++ b/lib/compiler/src/beam_bsm.erl @@ -205,8 +205,15 @@ btb_reaches_match_1(Is, Regs, D) -> btb_reaches_match_2([{block,Bl}|Is], Regs0, D) -> Regs = btb_reaches_match_block(Bl, Regs0), btb_reaches_match_1(Is, Regs, D); -btb_reaches_match_2([{call,Arity,{f,Lbl}}|Is], Regs, D) -> - btb_call(Arity, Lbl, Regs, Is, D); +btb_reaches_match_2([{call,Arity,{f,Lbl}}|Is], Regs0, D) -> + case is_tail_call(Is) of + true -> + Regs1 = btb_kill_not_live(Arity, Regs0), + Regs = btb_kill_yregs(Regs1), + btb_tail_call(Lbl, Regs, D); + false -> + btb_call(Arity, Lbl, Regs0, Is, D) + end; btb_reaches_match_2([{apply,Arity}|Is], Regs, D) -> btb_call(Arity+2, apply, Regs, Is, D); btb_reaches_match_2([{call_fun,Live}=I|Is], Regs, D) -> @@ -360,6 +367,10 @@ btb_reaches_match_2([{line,_}|Is], Regs, D) -> btb_reaches_match_2([I|_], Regs, _) -> btb_error({btb_context_regs(Regs),I,not_handled}). +is_tail_call([{deallocate,_}|_]) -> true; +is_tail_call([return|_]) -> true; +is_tail_call(_) -> false. + btb_call(Arity, Lbl, Regs0, Is, D0) -> Regs = btb_kill_not_live(Arity, Regs0), case btb_are_x_registers_empty(Regs) of @@ -369,15 +380,15 @@ btb_call(Arity, Lbl, Regs0, Is, D0) -> D = btb_tail_call(Lbl, Regs, D0), %% No problem so far (the called function can handle a - %% match context). Now we must make sure that the rest - %% of this function following the call does not attempt - %% to use the match context in case there is a copy - %% tucked away in a y register. + %% match context). Now we must make sure that we don't + %% have any copies of the match context tucked away in an + %% y register. RegList = btb_context_regs(Regs), - YRegs = [R || {y,_}=R <- RegList], - case btb_are_all_unused(YRegs, Is, D) of - true -> D; - false -> btb_error({multiple_uses,RegList}) + case [R || {y,_}=R <- RegList] of + [] -> + D; + [_|_] -> + btb_error({multiple_uses,RegList}) end; true -> %% No match context in any x register. It could have been diff --git a/lib/compiler/src/beam_flatten.erl b/lib/compiler/src/beam_flatten.erl index 36369bd0b4..c9ff07b496 100644 --- a/lib/compiler/src/beam_flatten.erl +++ b/lib/compiler/src/beam_flatten.erl @@ -64,7 +64,6 @@ norm({set,[],[S,D],{set_tuple_element,I}}) -> {set_tuple_element,S,D,I}; norm({set,[D1,D2],[S],get_list}) -> {get_list,S,D1,D2}; norm({set,[D],[S|Puts],{alloc,R,{put_map,Op,F}}}) -> {put_map,F,Op,S,D,R,{list,Puts}}; -%% get_map_elements is always handled in beam_split (moved out of block) norm({set,[],[],remove_message}) -> remove_message; norm({set,[],[],fclearerror}) -> fclearerror; norm({set,[],[],fcheckerror}) -> {fcheckerror,{f,0}}. diff --git a/lib/compiler/src/beam_split.erl b/lib/compiler/src/beam_split.erl index c83c686953..feeab0af50 100644 --- a/lib/compiler/src/beam_split.erl +++ b/lib/compiler/src/beam_split.erl @@ -56,9 +56,6 @@ split_block([{set,[D],[S|Puts],{alloc,R,{put_map,Op,{f,Lbl}=Fail}}}|Is], Bl, Acc) when Lbl =/= 0 -> split_block(Is, [], [{put_map,Fail,Op,S,D,R,{list,Puts}}| make_block(Bl, Acc)]); -split_block([{set,Ds,[S|Ss],{get_map_elements,Fail}}|Is], Bl, Acc) -> - Gets = beam_utils:join_even(Ss,Ds), - split_block(Is, [], [{get_map_elements,Fail,S,{list,Gets}}|make_block(Bl, Acc)]); split_block([{set,[R],[],{try_catch,Op,L}}|Is], Bl, Acc) -> split_block(Is, [], [{Op,R,L}|make_block(Bl, Acc)]); split_block([{set,[],[],{line,_}=Line}|Is], Bl, Acc) -> diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl index a15ecf633e..249d9395ca 100644 --- a/lib/compiler/src/beam_utils.erl +++ b/lib/compiler/src/beam_utils.erl @@ -26,7 +26,7 @@ empty_label_index/0,index_label/3,index_labels/1, code_at/2,bif_to_test/3,is_pure_test/1, live_opt/1,delete_live_annos/1,combine_heap_needs/2, - join_even/2,split_even/1]). + split_even/1]). -import(lists, [member/2,sort/1,reverse/1,splitwith/2]). @@ -233,11 +233,6 @@ combine_heap_needs(H1, H2) when is_integer(H1), is_integer(H2) -> split_even(Rs) -> split_even(Rs, [], []). -%% join_even/1 -%% {[1,3,5],[2,4,6]} -> [1,2,3,4,5,6] - -join_even([], []) -> []; -join_even([S|Ss], [D|Ds]) -> [S,D|join_even(Ss, Ds)]. %%% %%% Local functions. @@ -753,6 +748,11 @@ live_opt([timeout=I|Is], _, D, Acc) -> live_opt(Is, 0, D, [I|Acc]); live_opt([{wait,_}=I|Is], _, D, Acc) -> live_opt(Is, 0, D, [I|Acc]); +live_opt([{get_map_elements,Fail,Src,{list,List}}=I|Is], Regs0, D, Acc) -> + {Ss,Ds} = split_even(List), + Regs1 = x_live([Src|Ss], x_dead(Ds, Regs0)), + Regs = live_join_label(Fail, D, Regs1), + live_opt(Is, Regs, D, [I|Acc]); %% Transparent instructions - they neither use nor modify x registers. live_opt([{deallocate,_}=I|Is], Regs, D, Acc) -> diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl index e951a25e04..97d63d399a 100644 --- a/lib/compiler/src/compile.erl +++ b/lib/compiler/src/compile.erl @@ -684,7 +684,7 @@ kernel_passes() -> {iff,core,?pass(save_core_code)}, %% Kernel Erlang and code generation. - {pass,v3_kernel}, + ?pass(v3_kernel), {iff,dkern,{listing,"kernel"}}, {iff,'to_kernel',{done,"kernel"}}, {pass,v3_life}, @@ -1241,6 +1241,17 @@ core_fold_module_after_inlining(#compile{code=Code0,options=Opts}=St) -> {ok,Code,_Ws} = sys_core_fold:module(Code0, Opts), {ok,St#compile{code=Code}}. +v3_kernel(#compile{code=Code0,options=Opts,warnings=Ws0}=St) -> + {ok,Code,Ws} = v3_kernel:module(Code0, Opts), + case Ws =:= [] orelse test_core_inliner(St) of + false -> + {ok,St#compile{code=Code,warnings=Ws0++Ws}}; + true -> + %% cerl_inline may produce code that generates spurious + %% warnings. Ignore any such warnings. + {ok,St#compile{code=Code}} + end. + test_old_inliner(#compile{options=Opts}) -> %% The point of this test is to avoid loading the old inliner %% if we know that it will not be used. diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl index 08b02101a6..4922953407 100644 --- a/lib/compiler/src/sys_core_fold.erl +++ b/lib/compiler/src/sys_core_fold.erl @@ -734,7 +734,7 @@ call(#c_call{args=As}=Call, #c_literal{val=M}=M0, #c_literal{val=N}=N0, Sub) -> false -> case sys_core_fold_lists:call(Call, M, N, As) of none -> - call_1(Call, M, N, As, Sub); + call_1(Call, M0, N0, As, Sub); Core -> expr(Core, Sub) end @@ -1130,7 +1130,13 @@ clause_1(#c_clause{guard=G0,body=B0}=Cl, Ps1, Cexpr, Ctxt, Sub1) -> %% %% case A of NewVar when true -> ... %% - sub_set_var(Var, Cexpr, Sub2); + case cerl:is_c_fname(Cexpr) of + false -> + sub_set_var(Var, Cexpr, Sub2); + true -> + %% We must not copy funs, and especially not into guards. + Sub2 + end; _ -> Sub2 end, diff --git a/lib/compiler/test/beam_block_SUITE.erl b/lib/compiler/test/beam_block_SUITE.erl index 9fcb6e497d..55d5f2dbe8 100644 --- a/lib/compiler/test/beam_block_SUITE.erl +++ b/lib/compiler/test/beam_block_SUITE.erl @@ -22,7 +22,7 @@ -export([all/0,suite/0,groups/0,init_per_suite/1,end_per_suite/1, init_per_group/2,end_per_group/2, get_map_elements/1,otp_7345/1,move_opt_across_gc_bif/1, - erl_202/1]). + erl_202/1,repro/1]). %% The only test for the following functions is that %% the code compiles and is accepted by beam_validator. @@ -39,7 +39,8 @@ groups() -> [get_map_elements, otp_7345, move_opt_across_gc_bif, - erl_202 + erl_202, + repro ]}]. init_per_suite(Config) -> @@ -158,6 +159,27 @@ erl_202({{_, _},X}, _) -> erl_202({_, _}, #erl_202_r1{y=R2}) -> {R2#erl_202_r2.x}. +%% See https://bugs.erlang.org/browse/ERL-266. +%% Instructions with failure labels are not safe to include +%% in a block. Including get_map_elements in a block would +%% lead to unsafe code. + +repro(_Config) -> + [] = maps:to_list(repro([], #{}, #{})), + [{tmp1,n}] = maps:to_list(repro([{tmp1,0}], #{}, #{})), + [{tmp1,name}] = maps:to_list(repro([{tmp1,0}], #{}, #{0=>name})), + ok. + +repro([], TempNames, _Slots) -> + TempNames; +repro([{Temp, Slot}|Xs], TempNames, Slots0) -> + {Name, Slots} = + case Slots0 of + #{Slot := Name0} -> {Name0, Slots0}; + #{} -> {n, Slots0#{Slot => n}} + end, + repro(Xs, TempNames#{Temp => Name}, Slots). + %%% %%% The only test of the following code is that it compiles. %%% diff --git a/lib/compiler/test/bs_match_SUITE.erl b/lib/compiler/test/bs_match_SUITE.erl index 224abf6c29..a9bee888d9 100644 --- a/lib/compiler/test/bs_match_SUITE.erl +++ b/lib/compiler/test/bs_match_SUITE.erl @@ -38,7 +38,8 @@ no_partition/1,calling_a_binary/1,binary_in_map/1, match_string_opt/1,select_on_integer/1, map_and_binary/1,unsafe_branch_caching/1, - bad_literals/1,good_literals/1,constant_propagation/1]). + bad_literals/1,good_literals/1,constant_propagation/1 + ]). -export([coverage_id/1,coverage_external_ignore/2]). @@ -768,6 +769,11 @@ multiple_uses(Config) when is_list(Config) -> {344,62879,345,<<245,159,1,89>>} = multiple_uses_1(<<1,88,245,159,1,89>>), true = multiple_uses_2(<<0,0,197,18>>), <<42,43>> = multiple_uses_3(<<0,0,42,43>>, fun id/1), + + ok = first_after(<<>>, 42), + <<1>> = first_after(<<1,2,3>>, 0), + <<2>> = first_after(<<1,2,3>>, 1), + ok. multiple_uses_1(<<X:16,Tail/binary>>) -> @@ -789,6 +795,24 @@ multiple_uses_match(<<Y:16,Z:16>>) -> multiple_uses_cmp(<<Y:16>>, <<Y:16>>) -> true; multiple_uses_cmp(<<_:16>>, <<_:16>>) -> false. +first_after(Data, Offset) -> + case byte_size(Data) > Offset of + false -> + {First, Rest} = {ok, ok}, + ok; + true -> + <<_:Offset/binary, Rest/binary>> = Data, + %% 'Rest' saved in y(0) before the call. + {First, _} = match_first(Data, Rest), + %% When beam_bsm sees the code, the following line + %% which uses y(0) has been optimized away. + {First, Rest} = {First, Rest}, + First + end. + +match_first(_, <<First:1/binary, Rest/binary>>) -> + {First, Rest}. + zero_label(Config) when is_list(Config) -> <<"nosemouth">> = read_pols(<<"FACE","nose","mouth">>), <<"CE">> = read_pols(<<"noFACE">>), diff --git a/lib/compiler/test/guard_SUITE.erl b/lib/compiler/test/guard_SUITE.erl index 6302f82f29..429d6b79e0 100644 --- a/lib/compiler/test/guard_SUITE.erl +++ b/lib/compiler/test/guard_SUITE.erl @@ -87,6 +87,7 @@ misc(Config) when is_list(Config) -> {ok,buf,<<>>} = get_data({o,true,0}, 42, buf), {ok,buf,<<>>} = get_data({o,false,0}, 0, buf), error = get_data({o,false,0}, 42, buf), + ok. @@ -343,6 +344,11 @@ complex_semicolon(Config) when is_list(Config) -> ok = csemi7(#{a=>1}, 3, 3), ok = csemi7(#{a=>1, b=>3}, 0, 0), + %% 8: Make sure that funs cannot be copied into guards. + ok = csemi8(true), + error = csemi8(false), + error = csemi8(42), + ok. csemi1(Type, Val) when is_list(Val), Type == float; @@ -457,6 +463,13 @@ csemi6(_, _) -> error. csemi7(A, B, C) when A#{a:=B} > #{a=>1}; abs(C) > 2 -> ok; csemi7(_, _, _) -> error. +csemi8(Together) -> + case fun csemi8/1 of + Typically when Together; Typically, Together -> ok; + _ -> error + end. + + comma(Config) when is_list(Config) -> %% ',' combinations of literal true/false. diff --git a/lib/compiler/test/warnings_SUITE.erl b/lib/compiler/test/warnings_SUITE.erl index f884e6e7d6..ff9bddc1e2 100644 --- a/lib/compiler/test/warnings_SUITE.erl +++ b/lib/compiler/test/warnings_SUITE.erl @@ -42,7 +42,7 @@ comprehensions/1,maps/1,maps_bin_opt_info/1, redundant_boolean_clauses/1, latin1_fallback/1,underscore/1,no_warnings/1, - bit_syntax/1]). + bit_syntax/1,inlining/1]). init_per_testcase(_Case, Config) -> Config. @@ -65,7 +65,7 @@ groups() -> bin_opt_info,bin_construction,comprehensions,maps, maps_bin_opt_info, redundant_boolean_clauses,latin1_fallback, - underscore,no_warnings,bit_syntax]}]. + underscore,no_warnings,bit_syntax,inlining]}]. init_per_suite(Config) -> Config. @@ -823,6 +823,30 @@ bit_syntax(Config) -> run(Config, Ts), ok. +inlining(Config) -> + %% Make sure that no spurious warnings are generated + %% when inlining. + Ts = [{inlining_1, + <<"-compile(inline). + compute1(X) -> add(X, 0). + add(1, 0) -> 1; + add(1, Y) -> 1 + Y; + add(X, Y) -> X + Y. + ">>, + [], + []}, + {inlining_2, + <<"-compile({inline,[add/2]}). + compute1(X) -> add(X, 0). + add(1, 0) -> 1; + add(1, Y) -> 1 + Y; + add(X, Y) -> X + Y. + ">>, + [], + []} + ], + run(Config, Ts), + ok. %%% %%% End of test cases. diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c index 00fc81c84f..c100fc8ee2 100644 --- a/lib/crypto/c_src/crypto.c +++ b/lib/crypto/c_src/crypto.c @@ -50,8 +50,12 @@ #include <openssl/ripemd.h> #include <openssl/bn.h> #include <openssl/objects.h> -#include <openssl/rc4.h> -#include <openssl/rc2.h> +#ifndef OPENSSL_NO_RC4 + #include <openssl/rc4.h> +#endif /* OPENSSL_NO_RC4 */ +#ifndef OPENSSL_NO_RC2 + #include <openssl/rc2.h> +#endif #include <openssl/blowfish.h> #include <openssl/rand.h> #include <openssl/evp.h> @@ -468,7 +472,13 @@ struct cipher_type_t { struct cipher_type_t cipher_types[] = { - {{"rc2_cbc"}, {&EVP_rc2_cbc}}, + {{"rc2_cbc"}, +#ifndef OPENSSL_NO_RC2 + {&EVP_rc2_cbc} +#else + {NULL} +#endif + }, {{"des_cbc"}, {COND_NO_DES_PTR(&EVP_des_cbc)}}, {{"des_cfb"}, {COND_NO_DES_PTR(&EVP_des_cfb8)}}, {{"des_ecb"}, {COND_NO_DES_PTR(&EVP_des_ecb)}}, @@ -578,7 +588,7 @@ static void error_handler(void* null, const char* errstr) } #endif /* HAVE_DYNAMIC_CRYPTO_LIB */ -static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) +static int initialize(ErlNifEnv* env, ERL_NIF_TERM load_info) { #ifdef OPENSSL_THREADS ErlNifSysInfo sys_info; @@ -593,7 +603,7 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) char lib_buf[1000]; if (!verify_lib_version()) - return 0; + return __LINE__; /* load_info: {301, <<"/full/path/of/this/library">>} */ if (!enif_get_tuple(env, load_info, &tpl_arity, &tpl_array) @@ -603,7 +613,7 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) || !enif_inspect_binary(env, tpl_array[1], &lib_bin)) { PRINTF_ERR1("CRYPTO: Invalid load_info '%T'", load_info); - return 0; + return __LINE__; } hmac_context_rtype = enif_open_resource_type(env, NULL, "hmac_context", @@ -612,7 +622,7 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) NULL); if (!hmac_context_rtype) { PRINTF_ERR0("CRYPTO: Could not open resource type 'hmac_context'"); - return 0; + return __LINE__; } #if OPENSSL_VERSION_NUMBER >= OpenSSL_version_plain(1,0,0) evp_md_ctx_rtype = enif_open_resource_type(env, NULL, "EVP_MD_CTX", @@ -621,7 +631,7 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) NULL); if (!evp_md_ctx_rtype) { PRINTF_ERR0("CRYPTO: Could not open resource type 'EVP_MD_CTX'"); - return 0; + return __LINE__; } #endif #ifdef HAVE_EVP_AES_CTR @@ -631,14 +641,14 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) NULL); if (!evp_cipher_ctx_rtype) { PRINTF_ERR0("CRYPTO: Could not open resource type 'EVP_CIPHER_CTX'"); - return 0; + return __LINE__; } #endif if (library_refc > 0) { /* Repeated loading of this library (module upgrade). * Atoms and callbacks are already set, we are done. */ - return 1; + return 0; } atom_true = enif_make_atom(env,"true"); @@ -684,14 +694,14 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) { void* handle; if (!change_basename(&lib_bin, lib_buf, sizeof(lib_buf), crypto_callback_name)) { - return 0; + return __LINE__; } if (!(handle = enif_dlopen(lib_buf, &error_handler, NULL))) { - return 0; + return __LINE__; } if (!(funcp = (get_crypto_callbacks_t*) enif_dlsym(handle, "get_crypto_callbacks", &error_handler, NULL))) { - return 0; + return __LINE__; } } #else /* !HAVE_DYNAMIC_CRYPTO_LIB */ @@ -710,7 +720,7 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) if (!ccb || ccb->sizeof_me != sizeof(*ccb)) { PRINTF_ERR0("Invalid 'crypto_callbacks'"); - return 0; + return __LINE__; } CRYPTO_set_mem_functions(ccb->crypto_alloc, ccb->crypto_realloc, ccb->crypto_free); @@ -724,13 +734,14 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) CRYPTO_set_dynlock_destroy_callback(ccb->dyn_destroy_function); } #endif /* OPENSSL_THREADS */ - return 1; + return 0; } static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) { - if (!init(env, load_info)) { - return -1; + int errline = initialize(env, load_info); + if (errline) { + return errline; } *priv_data = NULL; @@ -741,14 +752,16 @@ static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info) { + int errline; if (*old_priv_data != NULL) { - return -1; /* Don't know how to do that */ + return __LINE__; /* Don't know how to do that */ } if (*priv_data != NULL) { - return -1; /* Don't know how to do that */ + return __LINE__; /* Don't know how to do that */ } - if (!init(env, load_info)) { - return -1; + errline = initialize(env, load_info); + if (errline) { + return errline; } library_refc++; return 0; @@ -827,8 +840,12 @@ static void init_algorithms_types(ErlNifEnv* env) algo_cipher[algo_cipher_cnt++] = enif_make_atom(env,"blowfish_cfb64"); algo_cipher[algo_cipher_cnt++] = enif_make_atom(env,"blowfish_ofb64"); algo_cipher[algo_cipher_cnt++] = enif_make_atom(env,"blowfish_ecb"); +#ifndef OPENSSL_NO_RC2 algo_cipher[algo_cipher_cnt++] = enif_make_atom(env,"rc2_cbc"); +#endif +#ifndef OPENSSL_NO_RC4 algo_cipher[algo_cipher_cnt++] = enif_make_atom(env,"rc4"); +#endif #if defined(HAVE_GCM) algo_cipher[algo_cipher_cnt++] = enif_make_atom(env,"aes_gcm"); #endif @@ -2327,6 +2344,7 @@ static ERL_NIF_TERM do_exor(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) static ERL_NIF_TERM rc4_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {/* (Key, Data) */ +#ifndef OPENSSL_NO_RC4 ErlNifBinary key, data; RC4_KEY rc4_key; ERL_NIF_TERM ret; @@ -2340,10 +2358,14 @@ static ERL_NIF_TERM rc4_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg enif_make_new_binary(env, data.size, &ret)); CONSUME_REDS(env,data); return ret; -} +#else + return enif_raise_exception(env, atom_notsup); +#endif +} static ERL_NIF_TERM rc4_set_key(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {/* (Key) */ +#ifndef OPENSSL_NO_RC4 ErlNifBinary key; ERL_NIF_TERM ret; @@ -2353,11 +2375,14 @@ static ERL_NIF_TERM rc4_set_key(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg RC4_set_key((RC4_KEY*)enif_make_new_binary(env, sizeof(RC4_KEY), &ret), key.size, key.data); return ret; +#else + return enif_raise_exception(env, atom_notsup); +#endif } static ERL_NIF_TERM rc4_encrypt_with_state(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {/* (State, Data) */ - +#ifndef OPENSSL_NO_RC4 ErlNifBinary state, data; RC4_KEY* rc4_key; ERL_NIF_TERM new_state, new_data; @@ -2373,7 +2398,10 @@ static ERL_NIF_TERM rc4_encrypt_with_state(ErlNifEnv* env, int argc, const ERL_N enif_make_new_binary(env, data.size, &new_data)); CONSUME_REDS(env,data); return enif_make_tuple2(env,new_state,new_data); -} +#else + return enif_raise_exception(env, atom_notsup); +#endif +} static int get_rsa_private_key(ErlNifEnv* env, ERL_NIF_TERM key, RSA *rsa) { diff --git a/lib/crypto/test/old_crypto_SUITE.erl b/lib/crypto/test/old_crypto_SUITE.erl index 4a6753b2ed..324ed39c6d 100644 --- a/lib/crypto/test/old_crypto_SUITE.erl +++ b/lib/crypto/test/old_crypto_SUITE.erl @@ -1080,7 +1080,9 @@ rc2_cbc(doc) -> "Encrypt and decrypt according to RC2 CBC and check the result. " "Example stripped out from public_key application test"; rc2_cbc(Config) when is_list(Config) -> - + if_supported(rc2_cbc, fun rc2_cbc_do/0). + +rc2_cbc_do() -> Key = <<146,210,160,124,215,227,153,239,227,17,222,140,3,93,27,191>>, IV = <<72,91,135,182,25,42,35,210>>, @@ -2117,6 +2119,9 @@ rc4_test(doc) -> rc4_test(suite) -> []; rc4_test(Config) when is_list(Config) -> + if_supported(rc4, fun rc4_test_do/0). + +rc4_test_do() -> CT1 = <<"Yo baby yo">>, R1 = <<118,122,68,110,157,166,141,212,139,39>>, K = "apaapa", @@ -2132,6 +2137,9 @@ rc4_stream_test(doc) -> rc4_stream_test(suite) -> []; rc4_stream_test(Config) when is_list(Config) -> + if_supported(rc4, fun rc4_stream_test_do/0). + +rc4_stream_test_do() -> CT1 = <<"Yo ">>, CT2 = <<"baby yo">>, K = "apaapa", diff --git a/lib/dialyzer/RELEASE_NOTES b/lib/dialyzer/RELEASE_NOTES index 4e311bb543..2457faa07a 100644 --- a/lib/dialyzer/RELEASE_NOTES +++ b/lib/dialyzer/RELEASE_NOTES @@ -135,7 +135,7 @@ Version 1.9.1 (in Erlang/OTP R13B) Version 1.9.0 (in Erlang/OTP R13A) ---------------------------------- - The analysis accepts opaque type declarations and detects violations of - opaqueness of terms of such types. Starting with R13, many Erlang/OTP + opacity of terms of such types. Starting with R13, many Erlang/OTP standard libraries (array, dict, digraph, ets, gb_sets, gb_trees, queue, and sets) contain opaque type declarations of their main data types. Dialyzer will spit out warnings in code that explicitly depends on the diff --git a/lib/dialyzer/doc/manual.txt b/lib/dialyzer/doc/manual.txt index be1fd2f8bc..a571cd2e2b 100644 --- a/lib/dialyzer/doc/manual.txt +++ b/lib/dialyzer/doc/manual.txt @@ -255,7 +255,7 @@ Warning options: -Wno_match Suppress warnings for patterns that are unused or cannot match. -Wno_opaque - Suppress warnings for violations of opaqueness of data types. + Suppress warnings for violations of opacity of data types. -Wunmatched_returns *** Include warnings for function calls which ignore a structured return value or do not match against one of many possible return value(s). diff --git a/lib/dialyzer/doc/src/book.xml b/lib/dialyzer/doc/src/book.xml index aecc0e5bfa..46df8b81b8 100644 --- a/lib/dialyzer/doc/src/book.xml +++ b/lib/dialyzer/doc/src/book.xml @@ -25,7 +25,7 @@ <title>Dialyzer</title> <prepared></prepared> <docno></docno> - <date></date> + <date>2016-09-19</date> <rev></rev> <file>book.xml</file> </header> diff --git a/lib/dialyzer/doc/src/dialyzer.xml b/lib/dialyzer/doc/src/dialyzer.xml index 619db125b1..4b7eb4ad68 100644 --- a/lib/dialyzer/doc/src/dialyzer.xml +++ b/lib/dialyzer/doc/src/dialyzer.xml @@ -4,7 +4,7 @@ <erlref> <header> <copyright> - <year>2006</year><year>2015</year> + <year>2006</year><year>2016</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -25,341 +25,477 @@ <title>dialyzer</title> <prepared></prepared> <docno></docno> - <date></date> + <date>2016-09-20</date> <rev></rev> + <file>dialyzer.xml</file> </header> <module>dialyzer</module> - <modulesummary>The Dialyzer, a DIscrepancy AnalYZer for ERlang programs</modulesummary> + <modulesummary>Dialyzer, a DIscrepancy AnaLYZer for ERlang programs. + </modulesummary> <description> - <p>The Dialyzer is a static analysis tool that identifies software - discrepancies such as definite type errors, code which has become - dead or unreachable due to some programming error, unnecessary - tests, etc. in single Erlang modules or entire (sets of) - applications. Dialyzer starts its analysis from either - debug-compiled BEAM bytecode or from Erlang source code. The file - and line number of a discrepancy is reported along with an - indication of what the discrepancy is about. Dialyzer bases its - analysis on the concept of success typings which allows for sound - warnings (no false positives).</p> - <p>Read more about Dialyzer and about how to use it from the GUI - in <seealso marker="dialyzer_chapter">Dialyzer User's - Guide</seealso>.</p> + <p>Dialyzer is a static analysis tool that identifies software + discrepancies, such as definite type errors, code that has become dead + or unreachable because of programming error, and unnecessary tests, + in single Erlang modules or entire (sets of) applications.</p> + + <p>Dialyzer starts its analysis from either + debug-compiled BEAM bytecode or from Erlang source code. The file + and line number of a discrepancy is reported along with an + indication of what the discrepancy is about. Dialyzer bases its + analysis on the concept of success typings, which allows for sound + warnings (no false positives).</p> </description> <section> - <title>Using the Dialyzer from the command line</title> - <p>Dialyzer also has a command line version for automated use. Below is a - brief description of the list of its options. The same information can - be obtained by writing</p> - <code type="none"> - dialyzer --help</code> - <p>in a shell. Please refer to the GUI description for more details on - the operation of Dialyzer.</p> - <p>The exit status of the command line version is:</p> + <marker id="command_line"></marker> + <title>Using Dialyzer from the Command Line</title> + <p>Dialyzer has a command-line version for automated use. This + section provides a brief description of the options. The same information + can be obtained by writing the following in a shell:</p> + <code type="none"> - 0 - No problems were encountered during the analysis and no - warnings were emitted. - 1 - Problems were encountered during the analysis. - 2 - No problems were encountered, but warnings were emitted.</code> - <p>Usage:</p> +dialyzer --help</code> + + <p>For more details about the operation of Dialyzer, see section + <seealso marker="dialyzer_chapter#dialyzer_gui"> + Using Dialyzer from the GUI</seealso> in the User's Guide.</p> + + <p><em>Exit status of the command-line version:</em></p> + + <taglist> + <tag><c>0</c></tag> + <item> + <p>No problems were found during the analysis and no warnings were + emitted.</p> + </item> + <tag><c>1</c></tag> + <item> + <p>Problems were found during the analysis.</p> + </item> + <tag><c>2</c></tag> + <item> + <p>No problems were found during the analysis, but warnings were + emitted.</p> + </item> + </taglist> + + <p><em>Usage:</em></p> + <code type="none"> - dialyzer [--help] [--version] [--shell] [--quiet] [--verbose] - [-pa dir]* [--plt plt] [--plts plt*] [-Ddefine]* - [-I include_dir]* [--output_plt file] [-Wwarn]* [--raw] - [--src] [--gui] [files_or_dirs] [-r dirs] - [--apps applications] [-o outfile] - [--build_plt] [--add_to_plt] [--remove_from_plt] - [--check_plt] [--no_check_plt] [--plt_info] [--get_warnings] - [--dump_callgraph file] [--no_native] [--fullpath] - [--statistics] [--no_native_cache]</code> - <p>Options:</p> +dialyzer [--add_to_plt] [--apps applications] [--build_plt] + [--check_plt] [-Ddefine]* [-Dname] [--dump_callgraph file] + [files_or_dirs] [--fullpath] [--get_warnings] [--gui] [--help] + [-I include_dir]* [--no_check_plt] [--no_native] + [--no_native_cache] [-o outfile] [--output_plt file] [-pa dir]* + [--plt plt] [--plt_info] [--plts plt*] [--quiet] [-r dirs] + [--raw] [--remove_from_plt] [--shell] [--src] [--statistics] + [--verbose] [--version] [-Wwarn]*</code> + + <note> + <p>* denotes that multiple occurrences of the option are possible.</p> + </note> + + <p><em>Options:</em></p> + <taglist> - <tag><c><![CDATA[files_or_dirs]]></c> (for backwards compatibility also - as: <c><![CDATA[-c files_or_dirs]]></c>)</tag> - <item>Use Dialyzer from the command line to detect defects in the - specified files or directories containing <c><![CDATA[.erl]]></c> or - <c><![CDATA[.beam]]></c> files, depending on the type of the - analysis.</item> - <tag><c><![CDATA[-r dirs]]></c></tag> - <item>Same as the previous but the specified directories are searched - recursively for subdirectories containing <c><![CDATA[.erl]]></c> or - <c><![CDATA[.beam]]></c> files in them, depending on the type of - analysis.</item> - <tag><c><![CDATA[--apps applications]]></c></tag> - <item>Option typically used when building or modifying a plt as in: + <tag><c>--add_to_plt</c></tag> + <item> + <p>The PLT is extended to also include the files specified with + <c>-c</c> and <c>-r</c>. Use + <c>--plt</c> to specify which PLT to start from, + and <c>--output_plt</c> to specify where to put the PLT. + Notice that the analysis possibly can include files from the PLT if + they depend on the new files. This option only works for BEAM + files.</p> + </item> + <tag><c>--apps applications</c></tag> + <item> + <p>This option is typically used when building or modifying a PLT as + in:</p> <code type="none"> - dialyzer --build_plt --apps erts kernel stdlib mnesia ...</code> - to conveniently refer to library applications corresponding to the - Erlang/OTP installation. However, the option is general and can also - be used during analysis in order to refer to Erlang/OTP applications. - In addition, file or directory names can also be included, as in: +dialyzer --build_plt --apps erts kernel stdlib mnesia ...</code> + <p>to refer conveniently to library applications corresponding to the + Erlang/OTP installation. However, this option is general and can also + be used during analysis to refer to Erlang/OTP applications. + File or directory names can also be included, as in:</p> <code type="none"> - dialyzer --apps inets ssl ./ebin ../other_lib/ebin/my_module.beam</code></item> - <tag><c><![CDATA[-o outfile]]></c> (or - <c><![CDATA[--output outfile]]></c>)</tag> - <item>When using Dialyzer from the command line, send the analysis - results to the specified outfile rather than to stdout.</item> - <tag><c><![CDATA[--raw]]></c></tag> - <item>When using Dialyzer from the command line, output the raw analysis - results (Erlang terms) instead of the formatted result. The raw format - is easier to post-process (for instance, to filter warnings or to - output HTML pages).</item> - <tag><c><![CDATA[--src]]></c></tag> - <item>Override the default, which is to analyze BEAM files, and - analyze starting from Erlang source code instead.</item> - <tag><c><![CDATA[-Dname]]></c> (or <c><![CDATA[-Dname=value]]></c>)</tag> - <item>When analyzing from source, pass the define to Dialyzer. (**)</item> - <tag><c><![CDATA[-I include_dir]]></c></tag> - <item>When analyzing from source, pass the <c><![CDATA[include_dir]]></c> - to Dialyzer. (**)</item> - <tag><c><![CDATA[-pa dir]]></c></tag> - <item>Include <c><![CDATA[dir]]></c> in the path for Erlang (useful when - analyzing files that have <c><![CDATA['-include_lib()']]></c> - directives).</item> - <tag><c><![CDATA[--output_plt file]]></c></tag> - <item>Store the plt at the specified file after building it.</item> - <tag><c><![CDATA[--plt plt]]></c></tag> - <item>Use the specified plt as the initial plt (if the plt was built - during setup the files will be checked for consistency).</item> - <tag><c><![CDATA[--plts plt*]]></c></tag> - <item>Merge the specified plts to create the initial plt -- requires - that the plts are disjoint (i.e., do not have any module - appearing in more than one plt). - The plts are created in the usual way: +dialyzer --apps inets ssl ./ebin ../other_lib/ebin/my_module.beam</code> + </item> + <tag><c>--build_plt</c></tag> + <item> + <p>The analysis starts from an empty PLT and creates a new one from + the files specified with <c>-c</c> and + <c>-r</c>. This option only works for BEAM files. + To override the default PLT location, use + <c>--plt</c> or <c>--output_plt</c>.</p> + </item> + <tag><c>--check_plt</c></tag> + <item> + <p>Check the PLT for consistency and rebuild it if it is not + up-to-date.</p> + </item> + <tag><c>-Dname</c> (or <c>-Dname=value</c>)</tag> + <item> + <p>When analyzing from source, pass the define to Dialyzer. + (**)</p> + </item> + <tag><c>--dump_callgraph file</c></tag> + <item> + <p>Dump the call graph into the specified file whose format is + determined by the filename extension. Supported extensions are: + <c>raw</c>, <c>dot</c>, and <c>ps</c>. If something else is used as + filename extension, default format <c>.raw</c> is used.</p> + </item> + <tag><c>files_or_dirs</c> (for backward compatibility also + as <c>-c files_or_dirs</c>)</tag> + <item> + <p>Use Dialyzer from the command line to detect defects in the + specified files or directories containing <c>.erl</c> or + <c>.beam</c> files, depending on the type of the + analysis.</p> + </item> + <tag><c>--fullpath</c></tag> + <item> + <p>Display the full path names of files for which warnings are + emitted.</p> + </item> + <tag><c>--get_warnings</c></tag> + <item> + <p>Make Dialyzer emit warnings even when manipulating the PLT. + Warnings are only emitted for files that are analyzed.</p> + </item> + <tag><c>--gui</c></tag> + <item> + <p>Use the GUI.</p></item> + <tag><c>--help</c> (or <c>-h</c>)</tag> + <item> + <p>Print this message and exit.</p> + </item> + <tag><c>-I include_dir</c></tag> + <item> + <p>When analyzing from source, pass the <c>include_dir</c> + to Dialyzer. (**)</p> + </item> + <tag><c>--no_check_plt</c></tag> + <item> + <p>Skip the PLT check when running Dialyzer. This is useful when + working with installed PLTs that never change.</p> + </item> + <tag><c>--no_native</c> (or <c>-nn</c>)</tag> + <item> + <p>Bypass the native code compilation of some key files that + Dialyzer heuristically performs when dialyzing many files. + This avoids the compilation time, but can result in (much) longer + analysis time.</p> + </item> + <tag><c>--no_native_cache</c></tag> + <item> + <p>By default, Dialyzer caches the results of native compilation + in directory <c>$XDG_CACHE_HOME/erlang/dialyzer_hipe_cache</c>. + <c>XDG_CACHE_HOME</c> defaults to <c>$HOME/.cache</c>. + Use this option to disable caching.</p> + </item> + <tag><c>-o outfile</c> (or + <c>--output outfile</c>)</tag> + <item> + <p>When using Dialyzer from the command line, send the analysis + results to the specified outfile rather than to <c>stdout</c>.</p> + </item> + <tag><c>--output_plt file</c></tag> + <item> + <p>Store the PLT at the specified file after building it.</p> + </item> + <tag><c>-pa dir</c></tag> + <item> + <p>Include <c>dir</c> in the path for Erlang. This is useful + when analyzing files that have <c>-include_lib()</c> + directives.</p> + </item> + <tag><c>--plt plt</c></tag> + <item> + <p>Use the specified PLT as the initial PLT. If the PLT was built + during setup, the files are checked for consistency.</p> + </item> + <tag><c>--plt_info</c></tag> + <item> + <p>Make Dialyzer print information about the PLT and then quit. + The PLT can be specified with <c>--plt(s)</c>.</p> + </item> + <tag><c>--plts plt*</c></tag> + <item> + <p>Merge the specified PLTs to create the initial PLT. This requires + that the PLTs are disjoint (that is, do not have any module + appearing in more than one PLT). + The PLTs are created in the usual way:</p> <code type="none"> - dialyzer --build_plt --output_plt plt_1 files_to_include - ... - dialyzer --build_plt --output_plt plt_n files_to_include</code> - and then can be used in either of the following ways: +dialyzer --build_plt --output_plt plt_1 files_to_include +... +dialyzer --build_plt --output_plt plt_n files_to_include</code> + <p>They can then be used in either of the following ways:</p> <code type="none"> - dialyzer files_to_analyze --plts plt_1 ... plt_n</code> - or: +dialyzer files_to_analyze --plts plt_1 ... plt_n</code> + <p>or</p> <code type="none"> - dialyzer --plts plt_1 ... plt_n -- files_to_analyze</code> - (Note the -- delimiter in the second case)</item> - <tag><c><![CDATA[-Wwarn]]></c></tag> - <item>A family of options which selectively turn on/off warnings - (for help on the names of warnings use - <c><![CDATA[dialyzer -Whelp]]></c>). - Note that the options can also be given in the file with a - <c>-dialyzer()</c> attribute. See <seealso - marker="#suppression">Requesting or Suppressing Warnings in - Source Files</seealso> below for details.</item> - <tag><c><![CDATA[--shell]]></c></tag> - <item>Do not disable the Erlang shell while running the GUI.</item> - <tag><c><![CDATA[--version]]></c> (or <c><![CDATA[-v]]></c>)</tag> - <item>Print the Dialyzer version and some more information and - exit.</item> - <tag><c><![CDATA[--help]]></c> (or <c><![CDATA[-h]]></c>)</tag> - <item>Print this message and exit.</item> - <tag><c><![CDATA[--quiet]]></c> (or <c><![CDATA[-q]]></c>)</tag> - <item>Make Dialyzer a bit more quiet.</item> - <tag><c><![CDATA[--verbose]]></c></tag> - <item>Make Dialyzer a bit more verbose.</item> - <tag><c><![CDATA[--statistics]]></c></tag> - <item>Prints information about the progress of execution (analysis phases, - time spent in each and size of the relative input).</item> - <tag><c><![CDATA[--build_plt]]></c></tag> - <item>The analysis starts from an empty plt and creates a new one from - the files specified with <c><![CDATA[-c]]></c> and - <c><![CDATA[-r]]></c>. Only works for beam files. Use - <c><![CDATA[--plt]]></c> or <c><![CDATA[--output_plt]]></c> to - override the default plt location.</item> - <tag><c><![CDATA[--add_to_plt]]></c></tag> - <item>The plt is extended to also include the files specified with - <c><![CDATA[-c]]></c> and <c><![CDATA[-r]]></c>. Use - <c><![CDATA[--plt]]></c> to specify which plt to start from, - and <c><![CDATA[--output_plt]]></c> to specify where to put the plt. - Note that the analysis might include files from the plt if they depend - on the new files. This option only works with beam files.</item> - <tag><c><![CDATA[--remove_from_plt]]></c></tag> - <item>The information from the files specified with - <c><![CDATA[-c]]></c> and <c><![CDATA[-r]]></c> is removed - from the plt. Note that this may cause a re-analysis of the remaining - dependent files.</item> - <tag><c><![CDATA[--check_plt]]></c></tag> - <item>Check the plt for consistency and rebuild it if it is not - up-to-date.</item> - <tag><c><![CDATA[--no_check_plt]]></c></tag> - <item>Skip the plt check when running Dialyzer. Useful when working with - installed plts that never change.</item> - <tag><c><![CDATA[--plt_info]]></c></tag> - <item>Make Dialyzer print information about the plt and then quit. The - plt can be specified with <c><![CDATA[--plt(s)]]></c>.</item> - <tag><c><![CDATA[--get_warnings]]></c></tag> - <item>Make Dialyzer emit warnings even when manipulating the plt. - Warnings are only emitted for files that are actually analyzed.</item> - <tag><c><![CDATA[--dump_callgraph file]]></c></tag> - <item>Dump the call graph into the specified file whose format is - determined by the file name extension. Supported extensions are: raw, - dot, and ps. If something else is used as file name extension, default - format '.raw' will be used.</item> - <tag><c><![CDATA[--no_native]]></c> (or <c><![CDATA[-nn]]></c>)</tag> - <item>Bypass the native code compilation of some key files that Dialyzer - heuristically performs when dialyzing many files; this avoids the - compilation time but it may result in (much) longer analysis - time.</item> - <tag><c><![CDATA[--no_native_cache]]></c></tag> - <item>By default, Dialyzer caches the results of native compilation in the - <c>$XDG_CACHE_HOME/erlang/dialyzer_hipe_cache</c> directory. - <c>XDG_CACHE_HOME</c> defaults to <c>$HOME/.cache</c>. - Use this option to disable caching.</item> - <tag><c><![CDATA[--fullpath]]></c></tag> - <item>Display the full path names of files for which warnings are emitted.</item> - <tag><c><![CDATA[--gui]]></c></tag> - <item>Use the GUI.</item> +dialyzer --plts plt_1 ... plt_n -- files_to_analyze</code> + <p>Notice the <c>--</c> delimiter in the second case.</p> + </item> + <tag><c>--quiet</c> (or <c>-q</c>)</tag> + <item> + <p>Make Dialyzer a bit more quiet.</p> + </item> + <tag><c>-r dirs</c></tag> + <item> + <p>Same as <c>files_or_dirs</c>, but the specified + directories are searched + recursively for subdirectories containing <c>.erl</c> or + <c>.beam</c> files in them, depending on the type of + analysis.</p> + </item> + <tag><c>--raw</c></tag> + <item> + <p>When using Dialyzer from the command line, output the raw + analysis results (Erlang terms) instead of the formatted result. + The raw format + is easier to post-process (for example, to filter warnings or to + output HTML pages).</p> + </item> + <tag><c>--remove_from_plt</c></tag> + <item> + <p>The information from the files specified with + <c>-c</c> and <c>-r</c> is removed from + the PLT. Notice that this can cause a reanalysis of the remaining + dependent files.</p> + </item> + <tag><c>--shell</c></tag> + <item> + <p>Do not disable the Erlang shell while running the GUI.</p> + </item> + <tag><c>--src</c></tag> + <item> + <p>Override the default, which is to analyze BEAM files, and + analyze starting from Erlang source code instead.</p> + </item> + <tag><c>--statistics</c></tag> + <item> + <p>Print information about the progress of execution (analysis phases, + time spent in each, and size of the relative input).</p> + </item> + <tag><c>--verbose</c></tag> + <item> + <p>Make Dialyzer a bit more verbose.</p> + </item> + <tag><c>--version</c> (or <c>-v</c>)</tag> + <item> + <p>Print the Dialyzer version and some more information and + exit.</p> + </item> + <tag><c>-Wwarn</c></tag> + <item> + <p>A family of options that selectively turn on/off warnings. + (For help on the names of warnings, use + <c>dialyzer -Whelp</c>.) + Notice that the options can also be specified in the file with a + <c>-dialyzer()</c> attribute. For details, see section <seealso + marker="#suppression">Requesting or Suppressing Warnings in + Source Files</seealso>.</p> + </item> </taglist> + <note> - <p>* denotes that multiple occurrences of these options are possible.</p> - <p>** options <c><![CDATA[-D]]></c> and <c><![CDATA[-I]]></c> work both from command-line and in the Dialyzer GUI; - the syntax of defines and includes is the same as that used by <c><![CDATA[erlc]]></c>.</p> + <p>** options <c>-D</c> and <c>-I</c> work both + from the command line and in the Dialyzer GUI; the syntax of + defines and includes is the same as that used by + <seealso marker="erts:erlc">erlc(1)</seealso>.</p> </note> - <p>Warning options:</p> + + <p><em>Warning options:</em></p> + <taglist> - <tag><c><![CDATA[-Wno_return]]></c></tag> - <item>Suppress warnings for functions that will never return a - value.</item> - <tag><c><![CDATA[-Wno_unused]]></c></tag> - <item>Suppress warnings for unused functions.</item> - <tag><c><![CDATA[-Wno_improper_lists]]></c></tag> - <item>Suppress warnings for construction of improper lists.</item> - <tag><c><![CDATA[-Wno_fun_app]]></c></tag> - <item>Suppress warnings for fun applications that will fail.</item> - <tag><c><![CDATA[-Wno_match]]></c></tag> - <item>Suppress warnings for patterns that are unused or cannot - match.</item> - <tag><c><![CDATA[-Wno_opaque]]></c></tag> - <item>Suppress warnings for violations of opaqueness of data types.</item> - <tag><c><![CDATA[-Wno_fail_call]]></c></tag> - <item>Suppress warnings for failing calls.</item> - <tag><c><![CDATA[-Wno_contracts]]></c></tag> - <item>Suppress warnings about invalid contracts.</item> - <tag><c><![CDATA[-Wno_behaviours]]></c></tag> - <item>Suppress warnings about behaviour callbacks which drift from the - published recommended interfaces.</item> - <tag><c><![CDATA[-Wno_missing_calls]]></c></tag> - <item>Suppress warnings about calls to missing functions.</item> - <tag><c><![CDATA[-Wno_undefined_callbacks]]></c></tag> - <item>Suppress warnings about behaviours that have no - <c>-callback</c> attributes for their callbacks.</item> - <tag><c><![CDATA[-Wunmatched_returns]]></c>***</tag> - <item>Include warnings for function calls which ignore a structured return - value or do not match against one of many possible return - value(s).</item> - <tag><c><![CDATA[-Werror_handling]]></c>***</tag> - <item>Include warnings for functions that only return by means of an - exception.</item> - <tag><c><![CDATA[-Wrace_conditions]]></c>***</tag> - <item>Include warnings for possible race conditions. Note that the - analysis that finds data races performs intra-procedural data flow analysis - and can sometimes explode in time. Enable it at your own risk. - </item> - <tag><c><![CDATA[-Wunderspecs]]></c>***</tag> - <item>Warn about underspecified functions - (the -spec is strictly more allowing than the success typing).</item> - <tag><c><![CDATA[-Wunknown]]></c>***</tag> - <item>Let warnings about unknown functions and types affect the - exit status of the command line version. The default is to ignore - warnings about unknown functions and types when setting the exit - status. When using the Dialyzer from Erlang, warnings about unknown - functions and types are returned; the default is not to return - these warnings.</item> + <tag><c>-Werror_handling</c> (***)</tag> + <item> + <p>Include warnings for functions that only return by an exception.</p> + </item> + <tag><c>-Wno_behaviours</c></tag> + <item> + <p>Suppress warnings about behavior callbacks that drift from the + published recommended interfaces.</p> + </item> + <tag><c>-Wno_contracts</c></tag> + <item> + <p>Suppress warnings about invalid contracts.</p> + </item> + <tag><c>-Wno_fail_call</c></tag> + <item> + <p>Suppress warnings for failing calls.</p> + </item> + <tag><c>-Wno_fun_app</c></tag> + <item> + <p>Suppress warnings for fun applications that will fail.</p> + </item> + <tag><c>-Wno_improper_lists</c></tag> + <item> + <p>Suppress warnings for construction of improper lists.</p> + </item> + <tag><c>-Wno_match</c></tag> + <item> + <p>Suppress warnings for patterns that are unused or cannot match.</p> + </item> + <tag><c>-Wno_missing_calls</c></tag> + <item> + <p>Suppress warnings about calls to missing functions.</p> + </item> + <tag><c>-Wno_opaque</c></tag> + <item> + <p>Suppress warnings for violations of opacity of data types.</p> + </item> + <tag><c>-Wno_return</c></tag> + <item> + <p>Suppress warnings for functions that will never return a value.</p> + </item> + <tag><c>-Wno_undefined_callbacks</c></tag> + <item> + <p>Suppress warnings about behaviors that have no + <c>-callback</c> attributes for their callbacks.</p> + </item> + <tag><c>-Wno_unused</c></tag> + <item> + <p>Suppress warnings for unused functions.</p> + </item> + <tag><c>-Wrace_conditions</c> (***)</tag> + <item> + <p>Include warnings for possible race conditions. Notice that the + analysis that finds data races performs intra-procedural data flow + analysis and can sometimes explode in time. Enable it at your own + risk.</p> + </item> + <tag><c>-Wunderspecs</c> (***)</tag> + <item> + <p>Warn about underspecified functions (the specification is strictly + more allowing than the success typing).</p> + </item> + <tag><c>-Wunknown</c> (***)</tag> + <item> + <p>Let warnings about unknown functions and types affect the + exit status of the command-line version. The default is to ignore + warnings about unknown functions and types when setting the exit + status. When using Dialyzer from Erlang, warnings about unknown + functions and types are returned; the default is not to return + these warnings.</p> + </item> + <tag><c>-Wunmatched_returns</c> (***)</tag> + <item> + <p>Include warnings for function calls that ignore a structured return + value or do not match against one of many possible return + value(s).</p> + </item> </taglist> - <p>The following options are also available but their use is not - recommended: (they are mostly for Dialyzer developers and internal - debugging)</p> + + <p>The following options are also available, but their use is not + recommended (they are mostly for Dialyzer developers and internal + debugging):</p> + <taglist> - <tag><c><![CDATA[-Woverspecs]]></c>***</tag> - <item>Warn about overspecified functions - (the -spec is strictly less allowing than the success typing).</item> - <tag><c><![CDATA[-Wspecdiffs]]></c>***</tag> - <item>Warn when the -spec is different than the success typing.</item> + <tag><c>-Woverspecs</c> (***)</tag> + <item> + <p>Warn about overspecified functions (the specification is strictly + less allowing than the success typing).</p> + </item> + <tag><c>-Wspecdiffs</c> (***)</tag> + <item> + <p>Warn when the specification is different than the success typing.</p> + </item> </taglist> + <note> - <p>*** Identifies options that turn on warnings rather than - turning them off.</p> + <p>*** denotes options that turn on warnings rather than + turning them off.</p> </note> </section> <section> - <title>Using the Dialyzer from Erlang</title> - <p>You can also use Dialyzer directly from Erlang. Both the GUI and the - command line versions are available. The options are similar to the ones - given from the command line, so please refer to the sections above for - a description of these.</p> + <title>Using Dialyzer from Erlang</title> + <p>Dialyzer can be used directly from Erlang. Both the GUI and the + command-line versions are also available. The options are similar to the + ones given from the command line, see section + <seealso marker="#command_line"> + Using Dialyzer from the Command Line</seealso>.</p> </section> <section> <marker id="suppression"></marker> <title>Requesting or Suppressing Warnings in Source Files</title> - <p> - The <c>-dialyzer()</c> attribute can be used for turning off + <p>Attribute <c>-dialyzer()</c> can be used for turning off warnings in a module by specifying functions or warning options. For example, to turn off all warnings for the function - <c>f/0</c>, include the following line: - </p> -<code type="none"> --dialyzer({nowarn_function, f/0}). -</code> + <c>f/0</c>, include the following line:</p> + + <code type="none"> +-dialyzer({nowarn_function, f/0}).</code> + <p>To turn off warnings for improper lists, add the following line - to the source file: - </p> -<code type="none"> --dialyzer(no_improper_lists). -</code> - <p>The <c>-dialyzer()</c> attribute is allowed after function - declarations. Lists of warning options or functions are allowed: - </p> -<code type="none"> --dialyzer([{nowarn_function, [f/0]}, no_improper_lists]). -</code> - <p> - Warning options can be restricted to functions: - </p> -<code type="none"> --dialyzer({no_improper_lists, g/0}). -</code> -<code type="none"> --dialyzer({[no_return, no_match], [g/0, h/0]}). -</code> - <p> - For help on the warning options use <c>dialyzer -Whelp</c>. The - options are also enumerated <seealso - marker="#gui/1">below</seealso> (<c>WarnOpts</c>). - </p> + to the source file:</p> + + <code type="none"> +-dialyzer(no_improper_lists).</code> + + <p>Attribute <c>-dialyzer()</c> is allowed after function + declarations. Lists of warning options or functions are allowed:</p> + + <code type="none"> +-dialyzer([{nowarn_function, [f/0]}, no_improper_lists]).</code> + + <p>Warning options can be restricted to functions:</p> + + <code type="none"> +-dialyzer({no_improper_lists, g/0}).</code> + + <code type="none"> +-dialyzer({[no_return, no_match], [g/0, h/0]}).</code> + + <p>For help on the warning options, use <c>dialyzer -Whelp</c>. The + options are also enumerated, see function <seealso marker="#gui/1"> + <c>gui/1</c></seealso> below (<c>WarnOpts</c>).</p> + <note> - <p> - The <c>-dialyzer()</c> attribute is not checked by the Erlang - Compiler, but by the Dialyzer itself. - </p> + <p>Attribute <c>-dialyzer()</c> is not checked by the Erlang + compiler, but by Dialyzer itself.</p> </note> + <note> - <p> - The warning option <c>-Wrace_conditions</c> has no effect when - set in source files. - </p> + <p>Warning option <c>-Wrace_conditions</c> has no effect when + set in source files.</p> </note> - <p> - The <c>-dialyzer()</c> attribute can also be used for turning on - warnings. For instance, if a module has been fixed regarding - unmatched returns, adding the line - </p> -<code type="none"> --dialyzer(unmatched_returns). -</code> - <p> - can help in assuring that no new unmatched return warnings are - introduced. - </p> + + <p>Attribute <c>-dialyzer()</c> can also be used for turning on + warnings. For example, if a module has been fixed regarding + unmatched returns, adding the following line can help in assuring + that no new unmatched return warnings are introduced:</p> + + <code type="none"> +-dialyzer(unmatched_returns).</code> </section> <funcs> <func> + <name>format_warning(Msg) -> string()</name> + <fsummary>Get the string version of a warning message.</fsummary> + <type> + <v>Msg = {Tag, Id, msg()}</v> + <d>See <c>run/1</c>.</d> + </type> + <desc> + <p>Get a string from warnings as returned by + <seealso marker="#run/1"><c>run/1</c></seealso>.</p> + </desc> + </func> + + <func> <name>gui() -> ok | {error, Msg}</name> <name>gui(OptList) -> ok | {error, Msg}</name> - <fsummary>Dialyzer GUI version</fsummary> + <fsummary>Dialyzer GUI version.</fsummary> <type> - <v>OptList -- see below</v> + <v>OptList</v> + <d>See below.</d> </type> <desc> <p>Dialyzer GUI version.</p> @@ -368,9 +504,12 @@ OptList :: [Option] Option :: {files, [Filename :: string()]} | {files_rec, [DirName :: string()]} | {defines, [{Macro :: atom(), Value :: term()}]} - | {from, src_code | byte_code} %% Defaults to byte_code - | {init_plt, FileName :: string()} %% If changed from default - | {plts, [FileName :: string()]} %% If changed from default + | {from, src_code | byte_code} + %% Defaults to byte_code + | {init_plt, FileName :: string()} + %% If changed from default + | {plts, [FileName :: string()]} + %% If changed from default | {include_dirs, [DirName :: string()]} | {output_file, FileName :: string()} | {output_plt, FileName :: string()} @@ -383,76 +522,71 @@ Option :: {files, [Filename :: string()]} | {warnings, [WarnOpts]} | {get_warnings, bool()} -WarnOpts :: no_return - | no_unused - | no_improper_lists +WarnOpts :: error_handling + | no_behaviours + | no_contracts + | no_fail_call | no_fun_app + | no_improper_lists | no_match + | no_missing_calls | no_opaque - | no_fail_call - | no_contracts - | no_behaviours + | no_return | no_undefined_callbacks - | unmatched_returns - | error_handling + | no_unused | race_conditions - | overspecs | underspecs - | specdiffs - | unknown</code> + | unknown + | unmatched_returns + | overspecs + | specdiffs</code> </desc> </func> + <func> - <name>run(OptList) -> Warnings</name> - <fsummary>Dialyzer command line version</fsummary> - <type> - <v>OptList -- see gui/0,1</v> - <v>Warnings -- see below </v> - </type> + <name>plt_info(string()) -> {'ok', [{atom(), any()}]} | {'error', atom()}</name> + <fsummary>Return information about the specified PLT.</fsummary> <desc> - <p>Dialyzer command line version.</p> - <code type="none"> -Warnings :: [{Tag, Id, Msg}] -Tag :: 'warn_behaviour' - | 'warn_bin_construction' - | 'warn_callgraph' - | 'warn_contract_not_equal' - | 'warn_contract_range' - | 'warn_contract_subtype' - | 'warn_contract_supertype' - | 'warn_contract_syntax' - | 'warn_contract_types' - | 'warn_failing_call' - | 'warn_fun_app' - | 'warn_matching' - | 'warn_non_proper_list' - | 'warn_not_called' - | 'warn_opaque' - | 'warn_race_condition' - | 'warn_return_no_exit' - | 'warn_return_only_exit' - | 'warn_umatched_return' - | 'warn_undefined_callbacks' - | 'warn_unknown' -Id = {File :: string(), Line :: integer()} -Msg = msg() -- Undefined</code> + <p>Returns information about the specified PLT.</p> </desc> </func> + <func> - <name>format_warning(Msg) -> string()</name> - <fsummary>Get the string version of a warning message.</fsummary> + <name>run(OptList) -> Warnings</name> + <fsummary>Dialyzer command-line version.</fsummary> <type> - <v>Msg = {Tag, Id, msg()} -- See run/1</v> + <v>OptList</v> + <d>See <c>gui/0,1</c>.</d> + <v>Warnings</v> + <d>See below.</d> </type> <desc> - <p>Get a string from warnings as returned by dialyzer:run/1.</p> - </desc> - </func> - <func> - <name>plt_info(string()) -> {'ok', [{atom(), any()}]} | {'error', atom()}</name> - <fsummary>Returns information about the specified plt.</fsummary> - <desc> - <p>Returns information about the specified plt.</p> + <p>Dialyzer command-line version.</p> + <code type="none"> +Warnings :: [{Tag, Id, Msg}] +Tag :: 'warn_behaviour' + | 'warn_bin_construction' + | 'warn_callgraph' + | 'warn_contract_not_equal' + | 'warn_contract_range' + | 'warn_contract_subtype' + | 'warn_contract_supertype' + | 'warn_contract_syntax' + | 'warn_contract_types' + | 'warn_failing_call' + | 'warn_fun_app' + | 'warn_matching' + | 'warn_non_proper_list' + | 'warn_not_called' + | 'warn_opaque' + | 'warn_race_condition' + | 'warn_return_no_exit' + | 'warn_return_only_exit' + | 'warn_umatched_return' + | 'warn_undefined_callbacks' + | 'warn_unknown' +Id = {File :: string(), Line :: integer()} +Msg = msg() -- Undefined</code> </desc> </func> </funcs> diff --git a/lib/dialyzer/doc/src/dialyzer_chapter.xml b/lib/dialyzer/doc/src/dialyzer_chapter.xml index c445f2633f..b5acf3732e 100644 --- a/lib/dialyzer/doc/src/dialyzer_chapter.xml +++ b/lib/dialyzer/doc/src/dialyzer_chapter.xml @@ -25,196 +25,211 @@ <title>Dialyzer</title> <prepared></prepared> <docno></docno> - <date></date> + <date>2016-09-19</date> <rev></rev> <file>dialyzer_chapter.xml</file> </header> <section> <title>Introduction</title> - <p><em>Dialyzer</em> is a static analysis tool that identifies software discrepancies - such as type errors, unreachable code, unnecessary tests, etc in single Erlang modules - or entire (sets of) applications.</p> - </section> - - <section> - <title>Using the Dialyzer from the GUI</title> - <section> - <title>Choosing the applications or modules</title> - <p>In the "File" window you will find a listing of the current directory. - Click your way to the directories/modules you want to add or type the - correct path in the entry.</p> - <p>Mark the directories/modules you want to analyze for discrepancies and - click "Add". You can either add the <c><![CDATA[.beam]]></c> and <c><![CDATA[.erl]]></c>-files directly, or - you can add directories that contain these kinds of files. Note that - you are only allowed to add the type of files that can be analyzed in - the current mode of operation (see below), and that you cannot mix - <c><![CDATA[.beam]]></c> and <c><![CDATA[.erl]]></c>-files.</p> + <title>Scope</title> + <p>Dialyzer is a static analysis tool that identifies software + discrepancies, such as definite type errors, code that has become dead + or unreachable because of programming error, and unnecessary tests, + in single Erlang modules or entire (sets of) applications.</p> + + <p>Dialyzer can be called from the command line, from Erlang, + and from a GUI.</p> </section> <section> - <title>The analysis modes</title> - <p>Dialyzer has two modes of analysis, "Byte Code" or "Source Code". - These are controlled by the buttons in the top-middle part of the - main window, under "Analysis Options".</p> - </section> - - <section> - <title>Controlling the discrepancies reported by the Dialyzer</title> - <p>Under the "Warnings" pull-down menu, there are buttons that control - which discrepancies are reported to the user in the "Warnings" window. - By clicking on these buttons, one can enable/disable a whole class of - warnings. Information about the classes of warnings can be found on - the "Warnings" item under the "Help" menu (at the rightmost top corner).</p> - <p>If modules are compiled with inlining, spurious warnings may be emitted. - In the "Options" menu you can choose to ignore inline-compiled modules - when analyzing byte code. When starting from source code this is not a - problem since the inlining is explicitly turned off by Dialyzer. The - option causes Dialyzer to suppress all warnings from inline-compiled - modules, since there is currently no way for Dialyzer to find what - parts of the code have been produced by inlining. </p> + <title>Prerequisites</title> + <p>It is assumed that the reader is familiar with the Erlang programming + language.</p> </section> + </section> - <section> - <title>Running the analysis</title> - <p>Once you have chosen the modules or directories you want to analyze, - click the "Run" button to start the analysis. If for some reason you - want to stop the analysis while it is running, push the "Stop" button.</p> - <p>The information from the analysis will be displayed in the Log and the - Warnings windows.</p> - </section> + <section> + <marker id="plt"/> + <title>The Persistent Lookup Table</title> + <p>Dialyzer stores the result of an analysis in a Persistent + Lookup Table (PLT). The PLT can then be used as a starting + point for later analyses. It is recommended to build a PLT with the + Erlang/OTP applications that you are using, but also to include your + own applications that you are using frequently.</p> + + <p>The PLT is built using option <c>--build_plt</c> to Dialyzer. + The following command builds the recommended minimal PLT for + Erlang/OTP:</p> - <section> - <title>Include directories and macro definitions</title> - <p>When analyzing from source you might have to supply Dialyzer with a - list of include directories and macro definitions (as you can do with - the <c><![CDATA[erlc]]></c> flags <c><![CDATA[-I]]></c> and <c><![CDATA[-D]]></c>). This can be done either by starting Dialyzer - with these flags from the command line as in:</p> - <code type="none"> + <code type="none"> +dialyzer --build_plt --apps erts kernel stdlib mnesia</code> - dialyzer -I my_includes -DDEBUG -Dvsn=42 -I one_more_dir - </code> - <p>or by adding these explicitly using the "Manage Macro Definitions" or - "Manage Include Directories" sub-menus in the "Options" menu.</p> - </section> + <p>Dialyzer looks if there is an environment variable called + <c>DIALYZER_PLT</c> and places the PLT at this location. If no such + variable is set, Dialyzer places the PLT at + <c>$HOME/.dialyzer_plt</c>. The placement can also be specified using + the options <c>--plt</c> or <c>--output_plt</c>.</p> - <section> - <title>Saving the information on the Log and Warnings windows</title> - <p>In the "File" menu there are options to save the contents of the Log - and the Warnings window. Just choose the options and enter the file to - save the contents in.</p> - <p>There are also buttons to clear the contents of each window.</p> - </section> + <p>Information can be added to an existing PLT using option + <c>--add_to_plt</c>. If you also want to include the Erlang compiler in + the PLT and place it in a new PLT, then use the following command:</p> - <section> - <title>Inspecting the inferred types of the analyzed functions</title> - <p>Dialyzer stores the information of the analyzed functions in a - Persistent Lookup Table (PLT). After an analysis you can inspect this - information. In the PLT menu you can choose to either search the PLT - or inspect the contents of the whole PLT. The information is presented - in edoc format.</p> - </section> - </section> + <code type="none"> +dialyzer --add_to_plt --apps compiler --output_plt my.plt</code> - <section> - <title>Using the Dialyzer from the command line</title> - <p>See <seealso marker="dialyzer">dialyzer(3)</seealso>.</p> - </section> + <p>Then you can add your favorite application my_app to the new + PLT:</p> - <section> - <title>Using the Dialyzer from Erlang</title> - <p>See <seealso marker="dialyzer">dialyzer(3)</seealso>.</p> - </section> + <code type="none"> +dialyzer --add_to_plt --plt my.plt -r my_app/ebin</code> - <section> - <title>More on the Persistent Lookup Table (PLT)</title> + <p>But you realize that it is unnecessary to have the Erlang compiler in this + one:</p> - <p> The persistent lookup table, or PLT, is used to store the - result of an analysis. The PLT can then be used as a starting - point for later analyses. It is recommended to build a PLT with - the otp applications that you are using, but also to include your - own applications that you are using frequently.</p> + <code type="none"> +dialyzer --remove_from_plt --plt my.plt --apps compiler</code> - <p>The PLT is built using the --build_plt option to dialyzer. The - following command builds the recommended minimal PLT for OTP.</p> + <p>Later, when you have fixed a bug in your application my_app, + you want to update the PLT so that it becomes fresh the next time + you run Dialyzer. In this case, run the following command:</p> <code type="none"> +dialyzer --check_plt --plt my.plt</code> - dialyzer --build_plt -r $ERL_TOP/lib/stdlib/ebin\ - $ERL_TOP/lib/kernel/ebin \ - $ERL_TOP/lib/mnesia/ebin - </code> + <p>Dialyzer then reanalyzes the changed files + and the files that depend on these files. Notice that this + consistency check is performed automatically the next time you + run Dialyzer with this PLT. Option <c>--check_plt</c> is only + for doing so without doing any other analysis.</p> - <p>Dialyzer will look if there is an environment variable called - $DIALYZER_PLT and place the PLT at this location. If no such - variable is set, Dialyzer will place the PLT at - $HOME/.dialyzer_plt. The placement can also be specified using the - --plt, or --output_plt options.</p> - - <p>You can also add information to an existing plt using the - --add_to_plt option. Suppose you want to also include the compiler - in the PLT and place it in a new PLT, then give the command</p> + <p>To get information about a PLT, use the following option:</p> <code type="none"> +dialyzer --plt_info</code> - dialyzer --add_to_plt -r $ERL_TOP/lib/compiler/ebin --output_plt my.plt - </code> + <p>To specify which PLT, use option <c>--plt</c>.</p> - <p>Then you would like to add your favorite application my_app to - the new plt.</p> + <p>To get the output printed to a file, use option <c>--output_file</c>.</p> - <code type="none"> + <p>Notice that when manipulating the PLT, no warnings are + emitted. To turn on warnings during (re)analysis of the PLT, use + option <c>--get_warnings</c>.</p> + </section> - dialyzer --add_to_plt --plt my.plt -r my_app/ebin - </code> + <section> + <title>Using Dialyzer from the Command Line</title> + <p>Dialyzer has a command-line version for automated use. + See <seealso marker="dialyzer"><c>dialyzer(3)</c></seealso>.</p> + </section> - <p>But you realize that it is unnecessary to have compiler in this one.</p> + <section> + <title>Using Dialyzer from Erlang</title> + <p>Dialyzer can also be used directly from Erlang. + See <seealso marker="dialyzer"><c>dialyzer(3)</c></seealso>.</p> + </section> - <code type="none"> + <section> + <marker id="dialyzer_gui"/> + <title>Using Dialyzer from the GUI</title> + <section> + <title>Choosing the Applications or Modules</title> + <p>The <em>File</em> window displays a listing of the current directory. + Click your way to the directories/modules you want to add or type the + correct path in the entry.</p> - dialyzer --remove_from_plt --plt my.plt -r $ERL_TOP/lib/compiler/ebin - </code> + <p>Mark the directories/modules you want to analyze for discrepancies and + click <em>Add</em>. You can either add the <c>.beam</c> and + <c>.erl</c> files directly, or add directories that contain + these kind of files. Notice that + you are only allowed to add the type of files that can be analyzed in + the current mode of operation (see below), and that you cannot mix + <c>.beam</c> and <c>.erl</c> files.</p> + </section> - <p> Later, when you have fixed a bug in your application my_app, - you want to update the plt so that it will be fresh the next time - you run Dialyzer, run the command</p> + <section> + <title>Analysis Modes</title> + <p>Dialyzer has two analysis modes: "Byte Code" and "Source Code". + They are controlled by the buttons in the top-middle part of the + main window, under <em>Analysis Options</em>.</p> + </section> - <code type="none"> + <section> + <title>Controlling the Discrepancies Reported by Dialyzer</title> + <p>Under the <em>Warnings</em> pull-down menu, there are buttons that + control which discrepancies are reported to the user in the + <em>Warnings</em> window. By clicking these buttons, you can + enable/disable a whole class of warnings. Information about the classes + of warnings is found on the "Warnings" item under the <em>Help</em> + menu (in the rightmost top corner).</p> + + <p>If modules are compiled with inlining, spurious warnings can be + emitted. In the <em>Options</em> menu you can choose to ignore + inline-compiled modules when analyzing byte code. + When starting from source code, this is not a problem because + inlining is explicitly turned off by Dialyzer. The option causes + Dialyzer to suppress all warnings from inline-compiled + modules, as there is currently no way for Dialyzer to find what + parts of the code have been produced by inlining.</p> + </section> - dialyzer --check_plt --plt my.plt - </code> + <section> + <title>Running the Analysis</title> + <p>Once you have chosen the modules or directories you want to analyze, + click the <em>Run</em> button to start the analysis. If you for some + reason want to stop the analysis while it is running, click the + <em>Stop</em> button.</p> - <p> Dialyzer will then reanalyze the files that have been changed, - and the files that depend on these files. Note that this - consistency check will be performed automatically the next time - you run Dialyzer with this plt. The --check_plt option is merely - for doing so without doing any other analysis.</p> + <p>The information from the analysis is displayed in the <em>Log</em> + window and the <em>Warnings</em> window.</p> + </section> - <p> To get some information about a plt use the option</p> - <code type="none"> + <section> + <title>Include Directories and Macro Definitions</title> + <p>When analyzing from source, you might have to supply Dialyzer + with a list of include directories and macro definitions (as you can do + with the <seealso marker="erts:erlc"><c>erlc</c></seealso> flags + <c>-I</c> and <c>-D</c>). This can be done + either by starting Dialyzer with these flags from the command + line as in:</p> + + <code type="none"> +dialyzer -I my_includes -DDEBUG -Dvsn=42 -I one_more_dir</code> - dialyzer --plt_info - </code> + <p>or by adding these explicitly using submenu + <em>Manage Macro Definitions</em> or + <em>Manage Include Directories</em> in the <em>Options</em> menu.</p> + </section> - <p>You can also specify which plt with the --plt option, and get the - output printed to a file with --output_file</p> + <section> + <title>Saving the Information on the Log and Warnings Windows</title> + <p>The <em>File</em> menu includes options to save the contents of the + <em>Log</em> window and the <em>Warnings</em> window. Simply choose the + options and enter the file to save the contents in.</p> - <p>Note that when manipulating the plt, no warnings are - emitted. To turn on warnings during (re)analysis of the plt, use - the option --get_warnings.</p> + <p>There are also buttons to clear the contents of each window.</p> + </section> + <section> + <title>Inspecting the Inferred Types of the Analyzed Functions</title> + <p>Dialyzer stores the information of the analyzed functions in a + Persistent Lookup Table (PLT), see section + <seealso marker="#plt">The Persistent Lookup Table</seealso>.</p> + + <p>After an analysis, you can inspect this information. + In the <em>PLT</em> menu you can choose to either search the PLT + or inspect the contents of the whole PLT. The information is presented + in <seealso marker="edoc:edoc"><c>EDoc</c></seealso> format.</p> + </section> </section> <section> - <title>Feedback and bug reports</title> - <p>At this point, we very much welcome user feedback (even wish-lists!). - If you notice something weird, especially if the Dialyzer reports any - discrepancy that is a false positive, please send an error report - describing the symptoms and how to reproduce them to:</p> - <code type="none"><![CDATA[ - ]]></code> + <title>Feedback and Bug Reports</title> + <p>We very much welcome user feedback - even wishlists! + If you notice anything weird, especially if Dialyzer reports + any discrepancy that is a false positive, please send an error report + describing the symptoms and how to reproduce them.</p> </section> </chapter> diff --git a/lib/dialyzer/doc/src/notes.xml b/lib/dialyzer/doc/src/notes.xml index b0f0a9aef0..d86deba48d 100644 --- a/lib/dialyzer/doc/src/notes.xml +++ b/lib/dialyzer/doc/src/notes.xml @@ -522,7 +522,7 @@ or modifying opaque types within the scope of a module. </p> <p> Hitherto the shape of terms (tuple, list, etc.) has been used to determine the opaque terms, but now the - contracts are used for decorating types with opaqueness. + contracts are used for decorating types with opacity. </p> <p> Own Id: OTP-10397</p> @@ -1505,7 +1505,7 @@ <list> <item> <p>The analysis accepts opaque type declarations and - detects violations of opaqueness of terms of such types. + detects violations of opacity of terms of such types. Starting with R13, many Erlang/OTP standard libraries (array, dict, digraph, ets, gb_sets, gb_trees, queue, and sets) contain opaque type declarations of their main data diff --git a/lib/dialyzer/doc/src/part.xml b/lib/dialyzer/doc/src/part.xml index 575f77549a..9bfcf21a66 100644 --- a/lib/dialyzer/doc/src/part.xml +++ b/lib/dialyzer/doc/src/part.xml @@ -25,12 +25,11 @@ <title>Dialyzer User's Guide</title> <prepared></prepared> <docno></docno> - <date></date> + <date>2016-09-19</date> <rev></rev> <file>part.xml</file> </header> <description> - <p><em>Dialyzer</em> is a static analysis tool that identifies software discrepancies such as type errors, unreachable code, unnecessary tests, etc in single Erlang modules or entire (sets of) applications.</p> </description> <xi:include href="dialyzer_chapter.xml"/> </part> diff --git a/lib/dialyzer/doc/src/ref_man.xml b/lib/dialyzer/doc/src/ref_man.xml index 01478cfb40..ddac047f2e 100644 --- a/lib/dialyzer/doc/src/ref_man.xml +++ b/lib/dialyzer/doc/src/ref_man.xml @@ -25,11 +25,10 @@ <title>Dialyzer Reference Manual</title> <prepared></prepared> <docno></docno> - <date></date> + <date>2016-09-19</date> <rev></rev> </header> <description> - <p><em>Dialyzer</em> is a static analysis tool that identifies software discrepancies such as type errors, unreachable code, unnecessary tests, etc in single Erlang modules or entire (sets of) applications.</p> </description> <xi:include href="dialyzer.xml"/> </application> diff --git a/lib/dialyzer/src/dialyzer.erl b/lib/dialyzer/src/dialyzer.erl index 7f86520c06..d25ffd02a2 100644 --- a/lib/dialyzer/src/dialyzer.erl +++ b/lib/dialyzer/src/dialyzer.erl @@ -2,7 +2,7 @@ %%----------------------------------------------------------------------- %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2015. All Rights Reserved. +%% Copyright Ericsson AB 2006-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -407,6 +407,10 @@ message_to_string({contract_range, [Contract, M, F, ArgStrings, Line, CRet]}) -> message_to_string({invalid_contract, [M, F, A, Sig]}) -> io_lib:format("Invalid type specification for function ~w:~w/~w." " The success typing is ~s\n", [M, F, A, Sig]); +message_to_string({contract_with_opaque, [M, F, A, OpaqueType, SigType]}) -> + io_lib:format("The specification for ~w:~w/~w" + " has an opaque subtype ~s which is violated by the" + " success typing ~s\n", [M, F, A, OpaqueType, SigType]); message_to_string({extra_range, [M, F, A, ExtraRanges, SigRange]}) -> io_lib:format("The specification for ~w:~w/~w states that the function" " might also return ~s but the inferred return is ~s\n", @@ -432,25 +436,25 @@ message_to_string({opaque_guard, [Arg1, Infix, Arg2, ArgNs]}) -> io_lib:format("Guard test ~s ~s ~s contains ~s\n", [Arg1, Infix, Arg2, form_positions(ArgNs)]); message_to_string({opaque_guard, [Guard, Args]}) -> - io_lib:format("Guard test ~w~s breaks the opaqueness of its argument\n", + io_lib:format("Guard test ~w~s breaks the opacity of its argument\n", [Guard, Args]); message_to_string({opaque_match, [Pat, OpaqueType, OpaqueTerm]}) -> Term = if OpaqueType =:= OpaqueTerm -> "the term"; true -> OpaqueTerm end, io_lib:format("The attempt to match a term of type ~s against the ~s" - " breaks the opaqueness of ~s\n", [OpaqueType, Pat, Term]); + " breaks the opacity of ~s\n", [OpaqueType, Pat, Term]); message_to_string({opaque_neq, [Type, _Op, OpaqueType]}) -> io_lib:format("Attempt to test for inequality between a term of type ~s" " and a term of opaque type ~s\n", [Type, OpaqueType]); message_to_string({opaque_type_test, [Fun, Args, Arg, ArgType]}) -> - io_lib:format("The type test ~s~s breaks the opaqueness of the term ~s~s\n", + io_lib:format("The type test ~s~s breaks the opacity of the term ~s~s\n", [Fun, Args, Arg, ArgType]); message_to_string({opaque_size, [SizeType, Size]}) -> - io_lib:format("The size ~s breaks the opaqueness of ~s\n", + io_lib:format("The size ~s breaks the opacity of ~s\n", [SizeType, Size]); message_to_string({opaque_call, [M, F, Args, Culprit, OpaqueType]}) -> - io_lib:format("The call ~s:~s~s breaks the opaqueness of the term ~s :: ~s\n", + io_lib:format("The call ~s:~s~s breaks the opacity of the term ~s :: ~s\n", [M, F, Args, Culprit, OpaqueType]); %%----- Warnings for concurrency errors -------------------- message_to_string({race_condition, [M, F, Args, Reason]}) -> diff --git a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl index 50fc1d8471..08e55a78bd 100644 --- a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl +++ b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl @@ -406,24 +406,28 @@ compile_common(File, AbstrCode, CompOpts, Callgraph, CServer, {ok, RecInfo} -> CServer1 = dialyzer_codeserver:store_temp_records(Mod, RecInfo, CServer), - MetaFunInfo = - dialyzer_utils:get_fun_meta_info(Mod, AbstrCode, LegalWarnings), - CServer2 = - dialyzer_codeserver:insert_fun_meta_info(MetaFunInfo, CServer1), - case UseContracts of - true -> - case dialyzer_utils:get_spec_info(Mod, AbstrCode, RecInfo) of - {error, _} = Error -> Error; - {ok, SpecInfo, CallbackInfo} -> - CServer3 = - dialyzer_codeserver:store_temp_contracts(Mod, SpecInfo, - CallbackInfo, - CServer2), - store_core(Mod, Core, Callgraph, CServer3) - end; - false -> - store_core(Mod, Core, Callgraph, CServer2) - end + case + dialyzer_utils:get_fun_meta_info(Mod, AbstrCode, LegalWarnings) + of + {error, _} = Error -> Error; + MetaFunInfo -> + CServer2 = + dialyzer_codeserver:insert_fun_meta_info(MetaFunInfo, CServer1), + case UseContracts of + true -> + case dialyzer_utils:get_spec_info(Mod, AbstrCode, RecInfo) of + {error, _} = Error -> Error; + {ok, SpecInfo, CallbackInfo} -> + CServer3 = + dialyzer_codeserver:store_temp_contracts(Mod, SpecInfo, + CallbackInfo, + CServer2), + store_core(Mod, Core, Callgraph, CServer3) + end; + false -> + store_core(Mod, Core, Callgraph, CServer2) + end + end end end. diff --git a/lib/dialyzer/src/dialyzer_cl_parse.erl b/lib/dialyzer/src/dialyzer_cl_parse.erl index 934351aeeb..f668b81cd3 100644 --- a/lib/dialyzer/src/dialyzer_cl_parse.erl +++ b/lib/dialyzer/src/dialyzer_cl_parse.erl @@ -2,7 +2,7 @@ %%----------------------------------------------------------------------- %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2015. All Rights Reserved. +%% Copyright Ericsson AB 2006-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -510,7 +510,7 @@ warning_options_msg() -> -Wno_match Suppress warnings for patterns that are unused or cannot match. -Wno_opaque - Suppress warnings for violations of opaqueness of data types. + Suppress warnings for violations of opacity of data types. -Wno_fail_call Suppress warnings for failing calls. -Wno_contracts diff --git a/lib/dialyzer/src/dialyzer_contracts.erl b/lib/dialyzer/src/dialyzer_contracts.erl index a72368f9f8..73b04b305b 100644 --- a/lib/dialyzer/src/dialyzer_contracts.erl +++ b/lib/dialyzer/src/dialyzer_contracts.erl @@ -232,7 +232,7 @@ check_contract(#contract{contracts = Contracts}, SuccType, Opaques) -> error -> {error, {overlapping_contract, []}}; ok -> - InfList = [erl_types:t_inf(Contract, SuccType, Opaques) + InfList = [{Contract, erl_types:t_inf(Contract, SuccType, Opaques)} || Contract <- Contracts2], case check_contract_inf_list(InfList, SuccType, Opaques) of {error, _} = Invalid -> Invalid; @@ -256,10 +256,21 @@ check_domains([Dom|Doms]) -> %% Allow a contract if one of the overloaded contracts is possible. %% We used to be more strict, e.g., all overloaded contracts had to be %% possible. -check_contract_inf_list([FunType|Left], SuccType, Opaques) -> +check_contract_inf_list(List, SuccType, Opaques) -> + case check_contract_inf_list(List, SuccType, Opaques, []) of + ok -> ok; + {error, []} -> {error, invalid_contract}; + {error, [{SigRange, ContrRange}|_]} -> + case erl_types:t_find_opaque_mismatch(SigRange, ContrRange, Opaques) of + error -> {error, invalid_contract}; + {ok, _T1, T2} -> {error, {opaque_mismatch, T2}} + end + end. + +check_contract_inf_list([{Contract, FunType}|Left], SuccType, Opaques, OM) -> FunArgs = erl_types:t_fun_args(FunType), case lists:any(fun erl_types:t_is_none_or_unit/1, FunArgs) of - true -> check_contract_inf_list(Left, SuccType, Opaques); + true -> check_contract_inf_list(Left, SuccType, Opaques, OM); false -> STRange = erl_types:t_fun_range(SuccType), case erl_types:t_is_none_or_unit(STRange) of @@ -267,13 +278,16 @@ check_contract_inf_list([FunType|Left], SuccType, Opaques) -> false -> Range = erl_types:t_fun_range(FunType), case erl_types:t_is_none(erl_types:t_inf(STRange, Range)) of - true -> check_contract_inf_list(Left, SuccType, Opaques); + true -> + CR = erl_types:t_fun_range(Contract), + NewOM = [{STRange, CR}|OM], + check_contract_inf_list(Left, SuccType, Opaques, NewOM); false -> ok end end end; -check_contract_inf_list([], _SuccType, _Opaques) -> - {error, invalid_contract}. +check_contract_inf_list([], _SuccType, _Opaques, OM) -> + {error, OM}. check_extraneous([], _SuccType) -> ok; check_extraneous([C|Cs], SuccType) -> @@ -687,6 +701,9 @@ get_invalid_contract_warnings_funs([{MFA, {FileLine, Contract, _Xtra}}|Left], case check_contract(Contract, Sig, Opaques) of {error, invalid_contract} -> [invalid_contract_warning(MFA, WarningInfo, Sig, RecDict)|Acc]; + {error, {opaque_mismatch, T2}} -> + W = contract_opaque_warning(MFA, WarningInfo, T2, Sig, RecDict), + [W|Acc]; {error, {overlapping_contract, []}} -> [overlapping_contract_warning(MFA, WarningInfo)|Acc]; {error, {extra_range, ExtraRanges, STRange}} -> @@ -740,6 +757,12 @@ invalid_contract_warning({M, F, A}, WarningInfo, SuccType, RecDict) -> SuccTypeStr = dialyzer_utils:format_sig(SuccType, RecDict), {?WARN_CONTRACT_TYPES, WarningInfo, {invalid_contract, [M, F, A, SuccTypeStr]}}. +contract_opaque_warning({M, F, A}, WarningInfo, OpType, SuccType, RecDict) -> + OpaqueStr = erl_types:t_to_string(OpType), + SuccTypeStr = dialyzer_utils:format_sig(SuccType, RecDict), + {?WARN_CONTRACT_TYPES, WarningInfo, + {contract_with_opaque, [M, F, A, OpaqueStr, SuccTypeStr]}}. + overlapping_contract_warning({M, F, A}, WarningInfo) -> {?WARN_CONTRACT_TYPES, WarningInfo, {overlapping_contract, [M, F, A]}}. diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl index 963c953447..639ed426df 100644 --- a/lib/dialyzer/src/dialyzer_dataflow.erl +++ b/lib/dialyzer/src/dialyzer_dataflow.erl @@ -1211,7 +1211,7 @@ handle_tuple(Tree, Map, State) -> TagVal = cerl:atom_val(Tag), case state__lookup_record(TagVal, length(Left), State1) of error -> {State1, Map1, TupleType}; - {ok, RecType} -> + {ok, RecType, FieldNames} -> InfTupleType = t_inf(RecType, TupleType), case t_is_none(InfTupleType) of true -> @@ -1232,10 +1232,13 @@ handle_tuple(Tree, Map, State) -> Tree, Msg), {State2, Map1, t_none()}; {error, opaque, ErrorPat, ErrorType, OpaqueType} -> + OpaqueStr = format_type(OpaqueType, State1), + Name = field_name(Elements, ErrorPat, FieldNames), Msg = {opaque_match, - [format_patterns(ErrorPat), - format_type(ErrorType, State1), - format_type(OpaqueType, State1)]}, + ["record field" ++ Name ++ + " declared to be of type " ++ + format_type(ErrorType, State1), + OpaqueStr, OpaqueStr]}, State2 = state__add_warning(State1, ?WARN_OPAQUE, Tree, Msg), {State2, Map1, t_none()}; @@ -1252,6 +1255,15 @@ handle_tuple(Tree, Map, State) -> end end. +field_name(Elements, ErrorPat, FieldNames) -> + try + [Pat] = ErrorPat, + Take = lists:takewhile(fun(X) -> X =/= Pat end, Elements), + " " ++ format_atom(lists:nth(length(Take), FieldNames)) + catch + _:_ -> "" + end. + %%---------------------------------------- %% Clauses %% @@ -1632,7 +1644,7 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) -> TagAtom = cerl:atom_val(Tag), case state__lookup_record(TagAtom, length(Left), State) of error -> {false, t_tuple(length(Es))}; - {ok, Record} -> + {ok, Record, _FieldNames} -> [_Head|AnyTail] = [t_any() || _ <- Es], UntypedRecord = t_tuple([t_atom(TagAtom)|AnyTail]), {not t_is_equal(Record, UntypedRecord), Record} @@ -2160,7 +2172,7 @@ handle_guard_is_record(Guard, Map, Env, Eval, State) -> TupleType = case state__lookup_record(Tag, ArityMin1, State) of error -> Tuple; - {ok, Prototype} -> Prototype + {ok, Prototype, _FieldNames} -> Prototype end, Type = t_inf(TupleType, RecType, State#state.opaques), case t_is_none(Type) of @@ -2610,7 +2622,7 @@ bind_guard_case_clauses(Arg, Clauses, Map0, Env, Eval, State) -> Map = join_maps_begin(Map0), {GenMap, GenArgType} = bind_guard(Arg, Map, Env, dont_know, State), bind_guard_case_clauses(GenArgType, GenMap, Arg, Clauses1, Map, Env, Eval, - t_none(), [], State). + t_none(), [], [], State). filter_fail_clauses([Clause|Left]) -> case (cerl:clause_pats(Clause) =:= []) of @@ -2629,7 +2641,7 @@ filter_fail_clauses([]) -> []. bind_guard_case_clauses(GenArgType, GenMap, ArgExpr, [Clause|Left], - Map, Env, Eval, AccType, AccMaps, State) -> + Map, Env, Eval, AccType, AccMaps, Throws, State) -> Pats = cerl:clause_pats(Clause), {NewMap0, ArgType} = case Pats of @@ -2673,9 +2685,9 @@ bind_guard_case_clauses(GenArgType, GenMap, ArgExpr, [Clause|Left], case (NewMap1 =:= none) orelse t_is_none(GenArgType) of true -> bind_guard_case_clauses(NewGenArgType, GenMap, ArgExpr, Left, Map, Env, - Eval, AccType, AccMaps, State); + Eval, AccType, AccMaps, Throws, State); false -> - {NewAccType, NewAccMaps} = + {NewAccType, NewAccMaps, NewThrows} = try {NewMap2, GuardType} = bind_guard(Guard, NewMap1, Env, pos, State), case t_is_none(t_inf(t_atom(true), GuardType)) of @@ -2699,17 +2711,26 @@ bind_guard_case_clauses(GenArgType, GenMap, ArgExpr, [Clause|Left], dont_know -> ok end, - {t_sup(AccType, CType), [NewMap3|AccMaps]} + {t_sup(AccType, CType), [NewMap3|AccMaps], Throws} catch - throw:{fail, _What} -> {AccType, AccMaps} + throw:{fail, Reason} -> + Throws1 = case Reason of + none -> Throws; + _ -> Throws ++ [Reason] + end, + {AccType, AccMaps, Throws1} end, bind_guard_case_clauses(NewGenArgType, GenMap, ArgExpr, Left, Map, Env, - Eval, NewAccType, NewAccMaps, State) + Eval, NewAccType, NewAccMaps, NewThrows, State) end; bind_guard_case_clauses(_GenArgType, _GenMap, _ArgExpr, [], Map, _Env, _Eval, - AccType, AccMaps, _State) -> + AccType, AccMaps, Throws, _State) -> case t_is_none(AccType) of - true -> throw({fail, none}); + true -> + case Throws of + [Throw|_] -> throw({fail, Throw}); + [] -> throw({fail, none}) + end; false -> {join_maps_end(AccMaps, Map), AccType} end. @@ -3207,7 +3228,8 @@ state__lookup_record(Tag, Arity, #state{records = Records}) -> RecType = t_tuple([t_atom(Tag)| [FieldType || {_FieldName, _Abstr, FieldType} <- Fields]]), - {ok, RecType}; + FieldNames = [FieldName || {FieldName, _Abstr, _FieldType} <- Fields], + {ok, RecType, FieldNames}; error -> error end. @@ -3660,6 +3682,9 @@ map_pats(Pats) -> fold_literals(TreeList) -> [cerl:fold_literal(Tree) || Tree <- TreeList]. +format_atom(A) -> + format_cerl(cerl:c_atom(A)). + type(Tree) -> Folded = cerl:fold_literal(Tree), case cerl:type(Folded) of diff --git a/lib/dialyzer/src/dialyzer_gui_wx.erl b/lib/dialyzer/src/dialyzer_gui_wx.erl index 30d2bdeca4..4caf64d007 100644 --- a/lib/dialyzer/src/dialyzer_gui_wx.erl +++ b/lib/dialyzer/src/dialyzer_gui_wx.erl @@ -2,7 +2,7 @@ %%------------------------------------------------------------------------ %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2009-2015. All Rights Reserved. +%% Copyright Ericsson AB 2009-2016. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -310,7 +310,7 @@ createWarningsMenu() -> addCheckedItem(WarningsMenu, ?menuID_WARN_FAIL_FUN_CALLS, "Failing function calls"), addCheckedItem(WarningsMenu, ?menuID_WARN_BAD_FUN, "Bad fun applications"), - addCheckedItem(WarningsMenu, ?menuID_WARN_OPAQUE, "Opaqueness violations"), + addCheckedItem(WarningsMenu, ?menuID_WARN_OPAQUE, "Opacity violations"), addCheckedItem(WarningsMenu, ?menuID_WARN_LIST_CONSTR, "Improper list constructions"), addCheckedItem(WarningsMenu, ?menuID_WARN_UNUSED_FUN, "Unused functions"), diff --git a/lib/dialyzer/src/dialyzer_utils.erl b/lib/dialyzer/src/dialyzer_utils.erl index 76a5cf3d0b..1f2d3e3aaa 100644 --- a/lib/dialyzer/src/dialyzer_utils.erl +++ b/lib/dialyzer/src/dialyzer_utils.erl @@ -514,16 +514,21 @@ get_spec_info([], SpecDict, CallbackDict, {ok, SpecDict, CallbackDict}. -spec get_fun_meta_info(module(), abstract_code(), [dial_warn_tag()]) -> - dialyzer_codeserver:fun_meta_info(). + dialyzer_codeserver:fun_meta_info() | {'error', string()}. get_fun_meta_info(M, Abs, LegalWarnings) -> - NoWarn = get_nowarn_unused_function(M, Abs), - FuncSupp = get_func_suppressions(M, Abs), - Warnings0 = get_options(Abs, LegalWarnings), - Warnings = ordsets:to_list(Warnings0), - ModuleWarnings = [{M, W} || W <- Warnings], - RawProps = lists:append([NoWarn, FuncSupp, ModuleWarnings]), - process_options(dialyzer_utils:family(RawProps), Warnings0). + try + {get_nowarn_unused_function(M, Abs), get_func_suppressions(M, Abs)} + of + {NoWarn, FuncSupp} -> + Warnings0 = get_options(Abs, LegalWarnings), + Warnings = ordsets:to_list(Warnings0), + ModuleWarnings = [{M, W} || W <- Warnings], + RawProps = lists:append([NoWarn, FuncSupp, ModuleWarnings]), + process_options(dialyzer_utils:family(RawProps), Warnings0) + catch throw:{error, _} = Error -> + Error + end. process_options([{M, _}=Mod|Left], Warnings) when is_atom(M) -> [Mod|process_options(Left, Warnings)]; diff --git a/lib/dialyzer/test/map_SUITE_data/results/map_in_guard2 b/lib/dialyzer/test/map_SUITE_data/results/map_in_guard2 index f6fb98a863..46e2e8d36c 100644 --- a/lib/dialyzer/test/map_SUITE_data/results/map_in_guard2 +++ b/lib/dialyzer/test/map_SUITE_data/results/map_in_guard2 @@ -2,11 +2,11 @@ map_in_guard2.erl:10: The call map_in_guard2:assoc_guard_clause('not_a_map') will never return since it differs in the 1st argument from the success typing arguments: (map()) map_in_guard2.erl:12: The pattern 'true' can never match the type 'false' map_in_guard2.erl:14: The call map_in_guard2:exact_guard_clause(#{}) will never return since it differs in the 1st argument from the success typing arguments: (#{'a':=_, _=>_}) -map_in_guard2.erl:17: Clause guard cannot succeed. The variable M was matched against the type 'not_a_map' +map_in_guard2.erl:17: Guard test is_map(M::'not_a_map') can never succeed map_in_guard2.erl:20: Function assoc_update/1 has no local return map_in_guard2.erl:20: Guard test is_map(M::'not_a_map') can never succeed -map_in_guard2.erl:22: Clause guard cannot succeed. The variable M was matched against the type 'not_a_map' map_in_guard2.erl:22: Function assoc_guard_clause/1 has no local return +map_in_guard2.erl:22: Guard test is_map(M::'not_a_map') can never succeed map_in_guard2.erl:24: Clause guard cannot succeed. The variable M was matched against the type #{} map_in_guard2.erl:27: Clause guard cannot succeed. The variable M was matched against the type #{} map_in_guard2.erl:27: Function exact_guard_clause/1 has no local return diff --git a/lib/dialyzer/test/map_SUITE_data/results/opaque_key b/lib/dialyzer/test/map_SUITE_data/results/opaque_key index fb7080cdc5..2ae0e0c5c6 100644 --- a/lib/dialyzer/test/map_SUITE_data/results/opaque_key +++ b/lib/dialyzer/test/map_SUITE_data/results/opaque_key @@ -6,10 +6,10 @@ opaque_key_adt.erl:59: Invalid type specification for function opaque_key_adt:sm opaque_key_use.erl:13: The test opaque_key_use:t() =:= opaque_key_use:t(integer()) can never evaluate to 'true' opaque_key_use.erl:24: Attempt to test for equality between a term of type opaque_key_adt:t(integer()) and a term of opaque type opaque_key_adt:t() opaque_key_use.erl:37: Function adt_mm1/0 has no local return -opaque_key_use.erl:40: The attempt to match a term of type opaque_key_adt:m() against the pattern #{A:=R} breaks the opaqueness of the term +opaque_key_use.erl:40: The attempt to match a term of type opaque_key_adt:m() against the pattern #{A:=R} breaks the opacity of the term opaque_key_use.erl:48: Function adt_mu1/0 has no local return -opaque_key_use.erl:51: Guard test is_map(M::opaque_key_adt:m()) breaks the opaqueness of its argument +opaque_key_use.erl:51: Guard test is_map(M::opaque_key_adt:m()) breaks the opacity of its argument opaque_key_use.erl:53: Function adt_mu2/0 has no local return -opaque_key_use.erl:56: Guard test is_map(M::opaque_key_adt:m()) breaks the opaqueness of its argument +opaque_key_use.erl:56: Guard test is_map(M::opaque_key_adt:m()) breaks the opacity of its argument opaque_key_use.erl:58: Function adt_mu3/0 has no local return -opaque_key_use.erl:60: Guard test is_map(M::opaque_key_adt:m()) breaks the opaqueness of its argument +opaque_key_use.erl:60: Guard test is_map(M::opaque_key_adt:m()) breaks the opacity of its argument diff --git a/lib/dialyzer/test/opaque_SUITE_data/dialyzer_options b/lib/dialyzer/test/opaque_SUITE_data/dialyzer_options index ffdf8270c8..06ed52043a 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/dialyzer_options +++ b/lib/dialyzer/test/opaque_SUITE_data/dialyzer_options @@ -1,2 +1,2 @@ {dialyzer_options, [{warnings, [no_unused, no_return]}]}. -{time_limit, 2}. +{time_limit, 20}. diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/array b/lib/dialyzer/test/opaque_SUITE_data/results/array index 9921b61669..6f1aa1ce3d 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/array +++ b/lib/dialyzer/test/opaque_SUITE_data/results/array @@ -1,3 +1,3 @@ -array_use.erl:12: The type test is_tuple(array:array(_)) breaks the opaqueness of the term array:array(_) -array_use.erl:9: The attempt to match a term of type array:array(_) against the pattern {'array', _, _, 'undefined', _} breaks the opaqueness of the term +array_use.erl:12: The type test is_tuple(array:array(_)) breaks the opacity of the term array:array(_) +array_use.erl:9: The attempt to match a term of type array:array(_) against the pattern {'array', _, _, 'undefined', _} breaks the opacity of the term diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/dict b/lib/dialyzer/test/opaque_SUITE_data/results/dict index 42f6663191..3f8242c72d 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/dict +++ b/lib/dialyzer/test/opaque_SUITE_data/results/dict @@ -1,15 +1,15 @@ -dict_use.erl:41: The attempt to match a term of type dict:dict(_,_) against the pattern 'gazonk' breaks the opaqueness of the term -dict_use.erl:45: The attempt to match a term of type dict:dict(_,_) against the pattern [] breaks the opaqueness of the term -dict_use.erl:46: The attempt to match a term of type dict:dict(_,_) against the pattern 42 breaks the opaqueness of the term -dict_use.erl:51: The attempt to match a term of type dict:dict(_,_) against the pattern [] breaks the opaqueness of the term -dict_use.erl:52: The attempt to match a term of type dict:dict(_,_) against the pattern 42 breaks the opaqueness of the term +dict_use.erl:41: The attempt to match a term of type dict:dict(_,_) against the pattern 'gazonk' breaks the opacity of the term +dict_use.erl:45: The attempt to match a term of type dict:dict(_,_) against the pattern [] breaks the opacity of the term +dict_use.erl:46: The attempt to match a term of type dict:dict(_,_) against the pattern 42 breaks the opacity of the term +dict_use.erl:51: The attempt to match a term of type dict:dict(_,_) against the pattern [] breaks the opacity of the term +dict_use.erl:52: The attempt to match a term of type dict:dict(_,_) against the pattern 42 breaks the opacity of the term dict_use.erl:58: Attempt to test for equality between a term of type maybe_improper_list() and a term of opaque type dict:dict(_,_) dict_use.erl:60: Attempt to test for inequality between a term of type atom() and a term of opaque type dict:dict(_,_) -dict_use.erl:64: Guard test length(D::dict:dict(_,_)) breaks the opaqueness of its argument -dict_use.erl:65: Guard test is_atom(D::dict:dict(_,_)) breaks the opaqueness of its argument -dict_use.erl:66: Guard test is_list(D::dict:dict(_,_)) breaks the opaqueness of its argument -dict_use.erl:70: The type test is_list(dict:dict(_,_)) breaks the opaqueness of the term dict:dict(_,_) +dict_use.erl:64: Guard test length(D::dict:dict(_,_)) breaks the opacity of its argument +dict_use.erl:65: Guard test is_atom(D::dict:dict(_,_)) breaks the opacity of its argument +dict_use.erl:66: Guard test is_list(D::dict:dict(_,_)) breaks the opacity of its argument +dict_use.erl:70: The type test is_list(dict:dict(_,_)) breaks the opacity of the term dict:dict(_,_) dict_use.erl:73: The call dict:fetch('foo',[1 | 2 | 3,...]) does not have an opaque term of type dict:dict(_,_) as 2nd argument dict_use.erl:76: The call dict:merge(Fun::any(),42,[1 | 2,...]) does not have opaque terms as 2nd and 3rd arguments dict_use.erl:79: The call dict:store(42,'elli',{'dict',0,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}) does not have an opaque term of type dict:dict(_,_) as 3rd argument diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/ets b/lib/dialyzer/test/opaque_SUITE_data/results/ets index e11c7a8352..5dde23fb15 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/ets +++ b/lib/dialyzer/test/opaque_SUITE_data/results/ets @@ -1,4 +1,4 @@ -ets_use.erl:12: Guard test is_integer(T::atom() | ets:tid()) breaks the opaqueness of its argument -ets_use.erl:20: The type test is_integer(atom() | ets:tid()) breaks the opaqueness of the term atom() | ets:tid() -ets_use.erl:7: Guard test is_integer(T::ets:tid()) breaks the opaqueness of its argument +ets_use.erl:12: Guard test is_integer(T::atom() | ets:tid()) breaks the opacity of its argument +ets_use.erl:20: The type test is_integer(atom() | ets:tid()) breaks the opacity of the term atom() | ets:tid() +ets_use.erl:7: Guard test is_integer(T::ets:tid()) breaks the opacity of its argument diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/my_queue b/lib/dialyzer/test/opaque_SUITE_data/results/my_queue index 1f25a6f9c3..67999b0e20 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/my_queue +++ b/lib/dialyzer/test/opaque_SUITE_data/results/my_queue @@ -1,7 +1,7 @@ my_queue_use.erl:15: The call my_queue_adt:is_empty([]) does not have an opaque term of type my_queue_adt:my_queue() as 1st argument my_queue_use.erl:19: The call my_queue_adt:add(42,Q0::[]) does not have an opaque term of type my_queue_adt:my_queue() as 2nd argument -my_queue_use.erl:24: The attempt to match a term of type my_queue_adt:my_queue() against the pattern [42 | Q2] breaks the opaqueness of the term +my_queue_use.erl:24: The attempt to match a term of type my_queue_adt:my_queue() against the pattern [42 | Q2] breaks the opacity of the term my_queue_use.erl:30: Attempt to test for equality between a term of type [] and a term of opaque type my_queue_adt:my_queue() my_queue_use.erl:34: Cons will produce an improper list since its 2nd argument is my_queue_adt:my_queue() my_queue_use.erl:34: The call my_queue_adt:dequeue(nonempty_maybe_improper_list(42,my_queue_adt:my_queue())) does not have an opaque term of type my_queue_adt:my_queue() as 1st argument diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/opaque b/lib/dialyzer/test/opaque_SUITE_data/results/opaque index 5747f9061f..864e0d853c 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/opaque +++ b/lib/dialyzer/test/opaque_SUITE_data/results/opaque @@ -1,3 +1,3 @@ opaque_bug3.erl:19: The pattern 'a' can never match the type #c{} -opaque_bug4.erl:20: The attempt to match a term of type opaque_adt:abc() against the pattern 'a' breaks the opaqueness of the term +opaque_bug4.erl:20: The attempt to match a term of type opaque_adt:abc() against the pattern 'a' breaks the opacity of the term diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/para b/lib/dialyzer/test/opaque_SUITE_data/results/para index 8fe67e39ad..37b5b7b44e 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/para +++ b/lib/dialyzer/test/opaque_SUITE_data/results/para @@ -16,12 +16,12 @@ para2.erl:88: The test para2:circ(integer()) =:= para2:circ(integer(),integer()) para3.erl:28: Invalid type specification for function para3:ot2/0. The success typing is () -> 'foo' para3.erl:36: The pattern {{{17}}} can never match the type {{{{{{_,_,_,_,_}}}}}} para3.erl:55: Invalid type specification for function para3:t2/0. The success typing is () -> 'foo' -para3.erl:65: The attempt to match a term of type {{{{{para3_adt:ot1(_,_,_,_,_)}}}}} against the pattern {{{{{17}}}}} breaks the opaqueness of para3_adt:ot1(_,_,_,_,_) +para3.erl:65: The attempt to match a term of type {{{{{para3_adt:ot1(_,_,_,_,_)}}}}} against the pattern {{{{{17}}}}} breaks the opacity of para3_adt:ot1(_,_,_,_,_) para3.erl:68: The pattern {{{{17}}}} can never match the type {{{{{para3_adt:ot1(_,_,_,_,_)}}}}} -para3.erl:74: Invalid type specification for function para3:exp_adt/0. The success typing is () -> 3 -para4.erl:21: Invalid type specification for function para4:a/1. The success typing is (dict:dict(atom() | integer(),atom() | integer()) | para4:d_all()) -> [{atom() | integer(),atom() | integer()}] -para4.erl:26: Invalid type specification for function para4:i/1. The success typing is (dict:dict(atom() | integer(),atom() | integer()) | para4:d_all()) -> [{atom() | integer(),atom() | integer()}] -para4.erl:31: Invalid type specification for function para4:t/1. The success typing is (dict:dict(atom() | integer(),atom() | integer()) | para4:d_all()) -> [{atom() | integer(),atom() | integer()}] +para3.erl:74: The specification for para3:exp_adt/0 has an opaque subtype para3_adt:exp1(para3_adt:exp2()) which is violated by the success typing () -> 3 +para4.erl:21: Invalid type specification for function para4:a/1. The success typing is (para4:d_all() | para4:d_atom()) -> [{atom() | integer(),atom() | integer()}] +para4.erl:26: Invalid type specification for function para4:i/1. The success typing is (para4:d_all() | para4:d_integer()) -> [{atom() | integer(),atom() | integer()}] +para4.erl:31: Invalid type specification for function para4:t/1. The success typing is (para4:d_all() | para4:d_tuple()) -> [{atom() | integer(),atom() | integer()}] para4.erl:59: Attempt to test for equality between a term of type para4_adt:t(atom() | integer()) and a term of opaque type para4_adt:t(integer()) para4.erl:64: Attempt to test for equality between a term of type para4_adt:t(atom() | integer()) and a term of opaque type para4_adt:t(atom()) para4.erl:69: Attempt to test for equality between a term of type para4_adt:int(1 | 2 | 3 | 4) and a term of opaque type para4_adt:int(1 | 2) diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/queue b/lib/dialyzer/test/opaque_SUITE_data/results/queue index 5b3813c418..9822b7168f 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/queue +++ b/lib/dialyzer/test/opaque_SUITE_data/results/queue @@ -1,11 +1,11 @@ queue_use.erl:18: The call queue:is_empty({[],[]}) does not have an opaque term of type queue:queue(_) as 1st argument queue_use.erl:22: The call queue:in(42,Q0::{[],[]}) does not have an opaque term of type queue:queue(_) as 2nd argument -queue_use.erl:27: The attempt to match a term of type queue:queue(_) against the pattern {"*", Q2} breaks the opaqueness of the term +queue_use.erl:27: The attempt to match a term of type queue:queue(_) against the pattern {"*", Q2} breaks the opacity of the term queue_use.erl:33: Attempt to test for equality between a term of type {[42,...],[]} and a term of opaque type queue:queue(_) -queue_use.erl:36: The attempt to match a term of type queue:queue(_) against the pattern {F, _R} breaks the opaqueness of the term +queue_use.erl:36: The attempt to match a term of type queue:queue(_) against the pattern {F, _R} breaks the opacity of the term queue_use.erl:40: The call queue:out({[42,...],[]}) does not have an opaque term of type queue:queue(_) as 1st argument queue_use.erl:51: The call queue_use:is_in_queue(E::42,DB::#db{p::[],q::queue:queue(_)}) contains an opaque term as 2nd argument when terms of different types are expected in these positions -queue_use.erl:56: The attempt to match a term of type #db{p::[],q::queue:queue(_)} against the pattern {'db', _, {L1, L2}} breaks the opaqueness of queue:queue(_) +queue_use.erl:56: The attempt to match a term of type #db{p::[],q::queue:queue(_)} against the pattern {'db', _, {L1, L2}} breaks the opacity of queue:queue(_) queue_use.erl:62: The call queue_use:tuple_queue({42,'gazonk'}) does not have a term of type {_,queue:queue(_)} (with opaque subterms) as 1st argument queue_use.erl:65: The call queue:in(F::42,Q::'gazonk') does not have an opaque term of type queue:queue(_) as 2nd argument diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/rec b/lib/dialyzer/test/opaque_SUITE_data/results/rec index 72736b3b3c..e9b217a93f 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/rec +++ b/lib/dialyzer/test/opaque_SUITE_data/results/rec @@ -1,6 +1,6 @@ -rec_use.erl:17: The attempt to match a term of type rec_adt:rec() against the pattern {'rec', _, 42} breaks the opaqueness of the term -rec_use.erl:18: Guard test tuple_size(R::rec_adt:rec()) breaks the opaqueness of its argument +rec_use.erl:17: The attempt to match a term of type rec_adt:rec() against the pattern {'rec', _, 42} breaks the opacity of the term +rec_use.erl:18: Guard test tuple_size(R::rec_adt:rec()) breaks the opacity of its argument rec_use.erl:23: The call rec_adt:get_a(R::tuple()) does not have an opaque term of type rec_adt:rec() as 1st argument rec_use.erl:27: Attempt to test for equality between a term of type {'rec','gazonk',42} and a term of opaque type rec_adt:rec() rec_use.erl:30: The call erlang:tuple_size(rec_adt:rec()) contains an opaque term as 1st argument when a structured term of type tuple() is expected diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/simple b/lib/dialyzer/test/opaque_SUITE_data/results/simple index 391c37664e..5cd8916aee 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/simple +++ b/lib/dialyzer/test/opaque_SUITE_data/results/simple @@ -1,29 +1,29 @@ exact_api.erl:17: The call exact_api:set_type(A::#digraph{vtab::'notable',etab::'notable',ntab::'notable',cyclic::'true'}) does not have an opaque term of type digraph:graph() as 1st argument exact_api.erl:23: The call digraph:delete(G::#digraph{vtab::'notable',etab::'notable',ntab::'notable',cyclic::'true'}) does not have an opaque term of type digraph:graph() as 1st argument -exact_api.erl:55: The attempt to match a term of type exact_adt:exact_adt() against the pattern {'exact_adt'} breaks the opaqueness of the term +exact_api.erl:55: The attempt to match a term of type exact_adt:exact_adt() against the pattern {'exact_adt'} breaks the opacity of the term exact_api.erl:59: The call exact_adt:exact_adt_set_type2(A::#exact_adt{}) does not have an opaque term of type exact_adt:exact_adt() as 1st argument is_rec.erl:10: The call erlang:is_record(simple1_adt:d1(),'r',2) contains an opaque term as 1st argument when terms of different types are expected in these positions is_rec.erl:15: The call erlang:is_record(A::simple1_adt:d1(),'r',I::1 | 2 | 3) contains an opaque term as 1st argument when terms of different types are expected in these positions -is_rec.erl:19: Guard test is_record(A::simple1_adt:d1(),'r',2) breaks the opaqueness of its argument -is_rec.erl:23: Guard test is_record({simple1_adt:d1(),1},'r',2) breaks the opaqueness of its argument +is_rec.erl:19: Guard test is_record(A::simple1_adt:d1(),'r',2) breaks the opacity of its argument +is_rec.erl:23: Guard test is_record({simple1_adt:d1(),1},'r',2) breaks the opacity of its argument is_rec.erl:41: The call erlang:is_record(A::simple1_adt:d1(),R::'a') contains an opaque term as 1st argument when terms of different types are expected in these positions is_rec.erl:45: The call erlang:is_record(A::simple1_adt:d1(),A::simple1_adt:d1(),1) contains an opaque term as 2nd argument when terms of different types are expected in these positions is_rec.erl:49: The call erlang:is_record(A::simple1_adt:d1(),any(),1) contains an opaque term as 1st argument when terms of different types are expected in these positions is_rec.erl:53: The call erlang:is_record(A::simple1_adt:d1(),A::simple1_adt:d1(),any()) contains an opaque term as 2nd argument when terms of different types are expected in these positions -is_rec.erl:57: Guard test is_record(A::simple1_adt:d1(),'r',2) breaks the opaqueness of its argument +is_rec.erl:57: Guard test is_record(A::simple1_adt:d1(),'r',2) breaks the opacity of its argument is_rec.erl:61: The record #r{f1::simple1_adt:d1()} violates the declared type for #r{} is_rec.erl:65: The call erlang:is_record({simple1_adt:d1(),1},'r',2) contains an opaque term as 1st argument when terms of different types are expected in these positions rec_api.erl:104: Matching of pattern {'r2', 10} tagged with a record name violates the declared type of #r2{f1::10} -rec_api.erl:113: The attempt to match a term of type #r3{f1::queue:queue(_)} against the pattern {'r3', 'a'} breaks the opaqueness of queue:queue(_) +rec_api.erl:113: The attempt to match a term of type #r3{f1::queue:queue(_)} against the pattern {'r3', 'a'} breaks the opacity of queue:queue(_) rec_api.erl:118: Record construction #r3{f1::10} violates the declared type of field f1::queue:queue(_) -rec_api.erl:123: The attempt to match a term of type #r3{f1::10} against the pattern {'r3', 10} breaks the opaqueness of queue:queue(_) +rec_api.erl:123: The attempt to match a term of type #r3{f1::10} against the pattern {'r3', 10} breaks the opacity of queue:queue(_) rec_api.erl:24: Record construction #r1{f1::10} violates the declared type of field f1::rec_api:a() rec_api.erl:29: Matching of pattern {'r1', 10} tagged with a record name violates the declared type of #r1{f1::10} -rec_api.erl:33: The attempt to match a term of type rec_adt:r1() against the pattern {'r1', 'a'} breaks the opaqueness of the term +rec_api.erl:33: The attempt to match a term of type rec_adt:r1() against the pattern {'r1', 'a'} breaks the opacity of the term rec_api.erl:35: Invalid type specification for function rec_api:adt_t1/1. The success typing is (#r1{f1::'a'}) -> #r1{f1::'a'} -rec_api.erl:40: Invalid type specification for function rec_api:adt_r1/0. The success typing is () -> #r1{f1::'a'} -rec_api.erl:85: The attempt to match a term of type rec_api:f() against the variable _ breaks the opaqueness of rec_adt:f() +rec_api.erl:40: The specification for rec_api:adt_r1/0 has an opaque subtype rec_adt:r1() which is violated by the success typing () -> #r1{f1::'a'} +rec_api.erl:85: The attempt to match a term of type rec_adt:f() against the record field 'f' declared to be of type rec_api:f() breaks the opacity of the term rec_api.erl:99: Record construction #r2{f1::10} violates the declared type of field f1::rec_api:a() simple1_api.erl:113: The test simple1_api:d1() =:= simple1_api:d2() can never evaluate to 'true' simple1_api.erl:118: Guard test simple1_api:d2() =:= A::simple1_api:d1() can never succeed @@ -35,20 +35,20 @@ simple1_api.erl:165: Attempt to test for equality between a term of type simple1 simple1_api.erl:181: Guard test A::simple1_adt:d1() =< B::simple1_adt:d2() contains opaque terms as 1st and 2nd arguments simple1_api.erl:185: Guard test 'a' =< B::simple1_adt:d2() contains an opaque term as 2nd argument simple1_api.erl:189: Guard test A::simple1_adt:d1() =< 'd' contains an opaque term as 1st argument -simple1_api.erl:197: The type test is_integer(A::simple1_adt:d1()) breaks the opaqueness of the term A::simple1_adt:d1() +simple1_api.erl:197: The type test is_integer(A::simple1_adt:d1()) breaks the opacity of the term A::simple1_adt:d1() simple1_api.erl:221: Guard test A::simple1_api:i1() > 3 can never succeed simple1_api.erl:225: Guard test A::simple1_adt:i1() > 3 contains an opaque term as 1st argument simple1_api.erl:233: Guard test A::simple1_adt:i1() < 3 contains an opaque term as 1st argument simple1_api.erl:239: Guard test A::1 > 3 can never succeed simple1_api.erl:243: Guard test A::1 > 3 can never succeed simple1_api.erl:257: Guard test is_function(T::simple1_api:o1()) can never succeed -simple1_api.erl:265: Guard test is_function(T::simple1_adt:o1()) breaks the opaqueness of its argument -simple1_api.erl:269: The type test is_function(T::simple1_adt:o1()) breaks the opaqueness of the term T::simple1_adt:o1() +simple1_api.erl:265: Guard test is_function(T::simple1_adt:o1()) breaks the opacity of its argument +simple1_api.erl:269: The type test is_function(T::simple1_adt:o1()) breaks the opacity of the term T::simple1_adt:o1() simple1_api.erl:274: Guard test is_function(T::simple1_api:o1(),A::simple1_api:i1()) can never succeed -simple1_api.erl:284: Guard test is_function(T::simple1_adt:o1(),A::simple1_adt:i1()) breaks the opaqueness of its argument -simple1_api.erl:289: The type test is_function(T::simple1_adt:o1(),A::simple1_adt:i1()) breaks the opaqueness of the term T::simple1_adt:o1() +simple1_api.erl:284: Guard test is_function(T::simple1_adt:o1(),A::simple1_adt:i1()) breaks the opacity of its argument +simple1_api.erl:289: The type test is_function(T::simple1_adt:o1(),A::simple1_adt:i1()) breaks the opacity of the term T::simple1_adt:o1() simple1_api.erl:294: The call erlang:is_function(T::simple1_api:o1(),A::simple1_adt:i1()) contains an opaque term as 2nd argument when terms of different types are expected in these positions -simple1_api.erl:300: The type test is_function(T::simple1_adt:o1(),A::simple1_api:i1()) breaks the opaqueness of the term T::simple1_adt:o1() +simple1_api.erl:300: The type test is_function(T::simple1_adt:o1(),A::simple1_api:i1()) breaks the opacity of the term T::simple1_adt:o1() simple1_api.erl:306: Guard test B::simple1_api:b2() =:= 'true' can never succeed simple1_api.erl:315: Guard test A::simple1_api:b1() =:= 'false' can never succeed simple1_api.erl:319: Guard test not('and'('true','true')) can never succeed @@ -60,14 +60,14 @@ simple1_api.erl:365: Clause guard cannot succeed. simple1_api.erl:368: Invalid type specification for function simple1_api:bool_adt_t8/2. The success typing is (boolean(),boolean()) -> 1 simple1_api.erl:378: Clause guard cannot succeed. simple1_api.erl:381: Invalid type specification for function simple1_api:bool_adt_t9/2. The success typing is ('false','false') -> 1 -simple1_api.erl:407: The size simple1_adt:i1() breaks the opaqueness of A -simple1_api.erl:418: The attempt to match a term of type non_neg_integer() against the variable A breaks the opaqueness of simple1_adt:i1() -simple1_api.erl:425: The attempt to match a term of type non_neg_integer() against the variable B breaks the opaqueness of simple1_adt:i1() +simple1_api.erl:407: The size simple1_adt:i1() breaks the opacity of A +simple1_api.erl:418: The attempt to match a term of type non_neg_integer() against the variable A breaks the opacity of simple1_adt:i1() +simple1_api.erl:425: The attempt to match a term of type non_neg_integer() against the variable B breaks the opacity of simple1_adt:i1() simple1_api.erl:432: The pattern <<_:B/integer-unit:1>> can never match the type any() -simple1_api.erl:448: The attempt to match a term of type non_neg_integer() against the variable Sz breaks the opaqueness of simple1_adt:i1() -simple1_api.erl:460: The attempt to match a term of type simple1_adt:bit1() against the pattern <<_/binary-unit:8>> breaks the opaqueness of the term -simple1_api.erl:478: The call 'foo':A(A::simple1_adt:a()) breaks the opaqueness of the term A :: simple1_adt:a() -simple1_api.erl:486: The call A:'foo'(A::simple1_adt:a()) breaks the opaqueness of the term A :: simple1_adt:a() +simple1_api.erl:448: The attempt to match a term of type non_neg_integer() against the variable Sz breaks the opacity of simple1_adt:i1() +simple1_api.erl:460: The attempt to match a term of type simple1_adt:bit1() against the pattern <<_/binary-unit:8>> breaks the opacity of the term +simple1_api.erl:478: The call 'foo':A(A::simple1_adt:a()) breaks the opacity of the term A :: simple1_adt:a() +simple1_api.erl:486: The call A:'foo'(A::simple1_adt:a()) breaks the opacity of the term A :: simple1_adt:a() simple1_api.erl:499: The call 'foo':A(A::simple1_api:i()) requires that A is of type atom() not simple1_api:i() simple1_api.erl:503: The call 'foo':A(A::simple1_adt:i()) requires that A is of type atom() not simple1_adt:i() simple1_api.erl:507: The call A:'foo'(A::simple1_api:i()) requires that A is of type atom() not simple1_api:i() @@ -79,7 +79,7 @@ simple1_api.erl:538: Guard test A::simple1_adt:d1() =:= 3 contains an opaque ter simple1_api.erl:548: The call erlang:'<'(A::simple1_adt:d1(),3) contains an opaque term as 1st argument when terms of different types are expected in these positions simple1_api.erl:558: The call erlang:'=<'(A::simple1_adt:d1(),B::simple1_adt:d2()) contains opaque terms as 1st and 2nd arguments when terms of different types are expected in these positions simple1_api.erl:565: Guard test {digraph:graph(),3} > {digraph:graph(),atom() | ets:tid()} contains an opaque term as 2nd argument -simple1_api.erl:91: Invalid type specification for function simple1_api:tup/0. The success typing is () -> {'a','b'} +simple1_api.erl:91: The specification for simple1_api:tup/0 has an opaque subtype simple1_adt:tuple1() which is violated by the success typing () -> {'a','b'} simple2_api.erl:100: The call lists:flatten(A::simple1_adt:tuple1()) contains an opaque term as 1st argument when a structured term of type [any()] is expected simple2_api.erl:116: The call lists:flatten({simple1_adt:tuple1()}) will never return since it differs in the 1st argument from the success typing arguments: ([any()]) simple2_api.erl:121: Guard test {simple1_adt:d1(),3} > {simple1_adt:d1(),simple1_adt:tuple1()} contains an opaque term as 2nd argument diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/timer b/lib/dialyzer/test/opaque_SUITE_data/results/timer index b1cfcd4e9f..46c5a86307 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/timer +++ b/lib/dialyzer/test/opaque_SUITE_data/results/timer @@ -1,4 +1,4 @@ timer_use.erl:16: The pattern 'gazonk' can never match the type {'error',_} | {'ok',timer:tref()} -timer_use.erl:17: The attempt to match a term of type {'error',_} | {'ok',timer:tref()} against the pattern {'ok', 42} breaks the opaqueness of timer:tref() -timer_use.erl:18: The attempt to match a term of type {'error',_} | {'ok',timer:tref()} against the pattern {Tag, 'gazonk'} breaks the opaqueness of timer:tref() +timer_use.erl:17: The attempt to match a term of type {'error',_} | {'ok',timer:tref()} against the pattern {'ok', 42} breaks the opacity of timer:tref() +timer_use.erl:18: The attempt to match a term of type {'error',_} | {'ok',timer:tref()} against the pattern {Tag, 'gazonk'} breaks the opacity of timer:tref() diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/union b/lib/dialyzer/test/opaque_SUITE_data/results/union index 98829b424a..8763088bf0 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/union +++ b/lib/dialyzer/test/opaque_SUITE_data/results/union @@ -1,5 +1,5 @@ -union_use.erl:12: The attempt to match a term of type union_adt:u() against the pattern 'aaa' breaks the opaqueness of the term -union_use.erl:16: The type test is_tuple(union_adt:u()) breaks the opaqueness of the term union_adt:u() -union_use.erl:7: Guard test is_atom(A::union_adt:u()) breaks the opaqueness of its argument -union_use.erl:8: Guard test is_tuple(T::union_adt:u()) breaks the opaqueness of its argument +union_use.erl:12: The attempt to match a term of type union_adt:u() against the pattern 'aaa' breaks the opacity of the term +union_use.erl:16: The type test is_tuple(union_adt:u()) breaks the opacity of the term union_adt:u() +union_use.erl:7: Guard test is_atom(A::union_adt:u()) breaks the opacity of its argument +union_use.erl:8: Guard test is_tuple(T::union_adt:u()) breaks the opacity of its argument diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/wings b/lib/dialyzer/test/opaque_SUITE_data/results/wings index 511263b70a..391501d86f 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/results/wings +++ b/lib/dialyzer/test/opaque_SUITE_data/results/wings @@ -1,11 +1,11 @@ -wings_dissolve.erl:103: Guard test is_list(List::gb_sets:set(_)) breaks the opaqueness of its argument -wings_dissolve.erl:19: Guard test is_list(Faces::gb_sets:set(_)) breaks the opaqueness of its argument -wings_dissolve.erl:272: Guard test is_list(Faces::gb_sets:set(_)) breaks the opaqueness of its argument +wings_dissolve.erl:103: Guard test is_list(List::gb_sets:set(_)) breaks the opacity of its argument +wings_dissolve.erl:19: Guard test is_list(Faces::gb_sets:set(_)) breaks the opacity of its argument +wings_dissolve.erl:272: Guard test is_list(Faces::gb_sets:set(_)) breaks the opacity of its argument wings_dissolve.erl:31: The call gb_sets:is_empty(Faces::[any(),...]) does not have an opaque term of type gb_sets:set(_) as 1st argument wings_edge.erl:205: The pattern <Edge, 'hard', Htab> can never match the type <_,'soft',_> wings_edge_cmd.erl:30: The call gb_trees:size(P::gb_sets:set(_)) does not have an opaque term of type gb_trees:tree(_,_) as 1st argument wings_edge_cmd.erl:32: The pattern [_ | Parts] can never match the type [] wings_edge_cmd.erl:32: The pattern [{_, P} | _] can never match the type [] -wings_io.erl:30: The attempt to match a term of type {'empty',queue:queue(_)} against the pattern {'empty', {In, Out}} breaks the opaqueness of queue:queue(_) +wings_io.erl:30: The attempt to match a term of type {'empty',queue:queue(_)} against the pattern {'empty', {In, Out}} breaks the opacity of queue:queue(_) wings_we.erl:155: The call wings_util:gb_trees_largest_key(Etab::gb_trees:tree(_,_)) contains an opaque term as 1st argument when a structured term of type {_,{_,_,_,'nil' | {_,_,_,'nil' | {_,_,_,_}}}} is expected diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/dict/dict_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/dict/dict_use.erl index a4cec065ab..2527f166f2 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/src/dict/dict_use.erl +++ b/lib/dialyzer/test/opaque_SUITE_data/src/dict/dict_use.erl @@ -34,7 +34,7 @@ middle() -> {w1(), w2()}. %%--------------------------------------------------------------------- -%% Cases that are problematic w.r.t. opaqueness of types +%% Cases that are problematic w.r.t. opacity of types %%--------------------------------------------------------------------- w1() -> diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/hipe_vectors/hipe_ig_moves.erl b/lib/dialyzer/test/opaque_SUITE_data/src/hipe_vectors/hipe_ig_moves.erl new file mode 100644 index 0000000000..2a70606dab --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/hipe_vectors/hipe_ig_moves.erl @@ -0,0 +1,83 @@ +%% -*- erlang-indent-level: 2 -*- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%%============================================================================= + +-module(hipe_ig_moves). +-export([new/1, + new_move/3, + get_moves/1]). + +%%----------------------------------------------------------------------------- +%% The main data structure; its fields are: +%% - movelist : mapping from temp to set of associated move numbers +%% - nrmoves : number of distinct move instructions seen so far +%% - moveinsns : list of move instructions, in descending move number order +%% - moveset : set of move instructions + +-record(ig_moves, {movelist :: movelist(), + nrmoves = 0 :: non_neg_integer(), + moveinsns = [] :: [{_,_}], + moveset = gb_sets:empty() :: gb_sets:set()}). + +-type movelist() :: hipe_vectors:vector(ordsets:ordset(non_neg_integer())). + +%%----------------------------------------------------------------------------- + +-spec new(non_neg_integer()) -> #ig_moves{}. + +new(NrTemps) -> + MoveList = hipe_vectors:new(NrTemps, ordsets:new()), + #ig_moves{movelist = MoveList}. + +-spec new_move(_, _, #ig_moves{}) -> #ig_moves{}. + +new_move(Dst, Src, IG_moves) -> + MoveSet = IG_moves#ig_moves.moveset, + MoveInsn = {Dst, Src}, + case gb_sets:is_member(MoveInsn, MoveSet) of + true -> + IG_moves; + false -> + MoveNr = IG_moves#ig_moves.nrmoves, + Movelist0 = IG_moves#ig_moves.movelist, + Movelist1 = add_movelist(MoveNr, Dst, + add_movelist(MoveNr, Src, Movelist0)), + IG_moves#ig_moves{nrmoves = MoveNr+1, + movelist = Movelist1, + moveinsns = [MoveInsn|IG_moves#ig_moves.moveinsns], + moveset = gb_sets:insert(MoveInsn, MoveSet)} + end. + +-spec add_movelist(non_neg_integer(), non_neg_integer(), movelist()) + -> movelist(). + +add_movelist(MoveNr, Temp, MoveList) -> + AssocMoves = hipe_vectors:get(MoveList, Temp), + %% XXX: MoveNr does not occur in moveList[Temp], but the new list must be an + %% ordset due to the ordsets:union in hipe_coalescing_regalloc:combine(). + hipe_vectors:set(MoveList, Temp, ordsets:add_element(MoveNr, AssocMoves)). + +-spec get_moves(#ig_moves{}) -> {movelist(), non_neg_integer(), tuple()}. + +get_moves(IG_moves) -> % -> {MoveList, NrMoves, MoveInsns} + {IG_moves#ig_moves.movelist, + IG_moves#ig_moves.nrmoves, + list_to_tuple(lists:reverse(IG_moves#ig_moves.moveinsns))}. diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/hipe_vectors/hipe_vectors.erl b/lib/dialyzer/test/opaque_SUITE_data/src/hipe_vectors/hipe_vectors.erl new file mode 100644 index 0000000000..279f244586 --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/hipe_vectors/hipe_vectors.erl @@ -0,0 +1,136 @@ +%% -*- erlang-indent-level: 2 -*- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% VECTORS IN ERLANG +%% +%% Abstract interface to vectors, indexed from 0 to size-1. + +-module(hipe_vectors). +-export([new/2, + set/3, + get/2, + size/1, + vector_to_list/1, + %% list_to_vector/1, + list/1]). + +%%-define(USE_TUPLES, true). +%%-define(USE_GBTREES, true). +-define(USE_ARRAYS, true). + +-type vector() :: vector(_). +-export_type([vector/0, vector/1]). + +-spec new(non_neg_integer(), V) -> vector(E) when V :: E. +-spec set(vector(E), non_neg_integer(), V :: E) -> vector(E). +-spec get(vector(E), non_neg_integer()) -> E. +-spec size(vector(_)) -> non_neg_integer(). +-spec vector_to_list(vector(E)) -> [E]. +%% -spec list_to_vector([E]) -> vector(E). +-spec list(vector(E)) -> [{non_neg_integer(), E}]. + +%% --------------------------------------------------------------------- + +-ifdef(USE_TUPLES). +-opaque vector(_) :: tuple(). + +new(N, V) -> + erlang:make_tuple(N, V). + +size(V) -> erlang:tuple_size(V). + +list(Vec) -> + index(tuple_to_list(Vec), 0). + +index([X|Xs],N) -> + [{N,X} | index(Xs,N+1)]; +index([],_) -> + []. + +%% list_to_vector(Xs) -> +%% list_to_tuple(Xs). + +vector_to_list(V) -> + tuple_to_list(V). + +set(Vec, Ix, V) -> + setelement(Ix+1, Vec, V). + +get(Vec, Ix) -> element(Ix+1, Vec). + +-endif. %% ifdef USE_TUPLES + +%% --------------------------------------------------------------------- + +-ifdef(USE_GBTREES). +-opaque vector(E) :: gb_trees:tree(non_neg_integer(), E). + +new(N, V) when is_integer(N), N >= 0 -> + gb_trees:from_orddict(mklist(N, V)). + +mklist(N, V) -> + mklist(0, N, V). + +mklist(M, N, V) when M < N -> + [{M, V} | mklist(M+1, N, V)]; +mklist(_, _, _) -> + []. + +size(V) -> gb_trees:size(V). + +list(Vec) -> + gb_trees:to_list(Vec). + +%% list_to_vector(Xs) -> +%% gb_trees:from_orddict(index(Xs, 0)). +%% +%% index([X|Xs], N) -> +%% [{N, X} | index(Xs, N+1)]; +%% index([],_) -> +%% []. + +vector_to_list(V) -> + gb_trees:values(V). + +set(Vec, Ix, V) -> + gb_trees:update(Ix, V, Vec). + +get(Vec, Ix) -> + gb_trees:get(Ix, Vec). + +-endif. %% ifdef USE_GBTREES + +%% --------------------------------------------------------------------- + +-ifdef(USE_ARRAYS). +-opaque vector(E) :: array:array(E). +%%-type vector(E) :: array:array(E). % Work around dialyzer bug + +new(N, V) -> array:new(N, {default, V}). +size(V) -> array:size(V). +list(Vec) -> array:to_orddict(Vec). +%% list_to_vector(Xs) -> array:from_list(Xs). +vector_to_list(V) -> array:to_list(V). +set(Vec, Ix, V) -> array:set(Ix, V, Vec). +get(Vec, Ix) -> array:get(Ix, Vec). + +-endif. %% ifdef USE_ARRAYS diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/para/para3.erl b/lib/dialyzer/test/opaque_SUITE_data/src/para/para3.erl index 102215b28d..d8c1f561f7 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/src/para/para3.erl +++ b/lib/dialyzer/test/opaque_SUITE_data/src/para/para3.erl @@ -62,7 +62,7 @@ t2() -> %% Shows that the list TypeNames in t_from_form must include ArgsLen. t1_adt() -> - {{{{{17}}}}} = para3_adt:t1(3). % breaks the opaqueness + {{{{{17}}}}} = para3_adt:t1(3). % breaks the opacity t2_adt() -> {{{{17}}}} = para3_adt:t1(3). % can never match diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/recrec/cerl.erl b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/cerl.erl new file mode 100644 index 0000000000..a4fdbfd5f0 --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/cerl.erl @@ -0,0 +1,4602 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% + +%% ===================================================================== +%% @doc Core Erlang abstract syntax trees. +%% +%% <p> This module defines an abstract data type for representing Core +%% Erlang source code as syntax trees.</p> +%% +%% <p>A recommended starting point for the first-time user is the +%% documentation of the function <a +%% href="#type-1"><code>type/1</code></a>.</p> +%% +%% <h3><b>NOTES:</b></h3> +%% +%% <p>This module deals with the composition and decomposition of +%% <em>syntactic</em> entities (as opposed to semantic ones); its +%% purpose is to hide all direct references to the data structures +%% used to represent these entities. With few exceptions, the +%% functions in this module perform no semantic interpretation of +%% their inputs, and in general, the user is assumed to pass +%% type-correct arguments - if this is not done, the effects are not +%% defined.</p> +%% +%% <p>Currently, the internal data structure used is the same as +%% the record-based data structures used traditionally in the Beam +%% compiler.</p> +%% +%% <p>The internal representations of abstract syntax trees are +%% subject to change without notice, and should not be documented +%% outside this module. Furthermore, we do not give any guarantees on +%% how an abstract syntax tree may or may not be represented, <em>with +%% the following exceptions</em>: no syntax tree is represented by a +%% single atom, such as <code>none</code>, by a list constructor +%% <code>[X | Y]</code>, or by the empty list <code>[]</code>. This +%% can be relied on when writing functions that operate on syntax +%% trees.</p> +%% +%% @type cerl(). An abstract Core Erlang syntax tree. +%% +%% <p>Every abstract syntax tree has a <em>type</em>, given by the +%% function <a href="#type-1"><code>type/1</code></a>. In addition, +%% each syntax tree has a list of <em>user annotations</em> (cf. <a +%% href="#get_ann-1"><code>get_ann/1</code></a>), which are included +%% in the Core Erlang syntax.</p> + +-module(cerl). + +-export([abstract/1, add_ann/2, alias_pat/1, alias_var/1, + ann_abstract/2, ann_c_alias/3, ann_c_apply/3, ann_c_atom/2, + ann_c_call/4, ann_c_case/3, ann_c_catch/2, ann_c_char/2, + ann_c_clause/3, ann_c_clause/4, ann_c_cons/3, ann_c_float/2, + ann_c_fname/3, ann_c_fun/3, ann_c_int/2, ann_c_let/4, + ann_c_letrec/3, ann_c_module/4, ann_c_module/5, ann_c_nil/1, + ann_c_cons_skel/3, ann_c_tuple_skel/2, ann_c_primop/3, + ann_c_receive/2, ann_c_receive/4, ann_c_seq/3, ann_c_string/2, + ann_c_try/6, ann_c_tuple/2, ann_c_values/2, ann_c_var/2, + ann_make_data/3, ann_make_list/2, ann_make_list/3, + ann_make_data_skel/3, ann_make_tree/3, apply_args/1, + apply_arity/1, apply_op/1, atom_lit/1, atom_name/1, atom_val/1, + c_alias/2, c_apply/2, c_atom/1, c_call/3, c_case/2, c_catch/1, + c_char/1, c_clause/2, c_clause/3, c_cons/2, c_float/1, + c_fname/2, c_fun/2, c_int/1, c_let/3, c_letrec/2, c_module/3, + c_module/4, c_nil/0, c_cons_skel/2, c_tuple_skel/1, c_primop/2, + c_receive/1, c_receive/3, c_seq/2, c_string/1, c_try/5, + c_tuple/1, c_values/1, c_var/1, call_args/1, call_arity/1, + call_module/1, call_name/1, case_arg/1, case_arity/1, + case_clauses/1, catch_body/1, char_lit/1, char_val/1, + clause_arity/1, clause_body/1, clause_guard/1, clause_pats/1, + clause_vars/1, concrete/1, cons_hd/1, cons_tl/1, copy_ann/2, + data_arity/1, data_es/1, data_type/1, float_lit/1, float_val/1, + fname_arity/1, fname_id/1, fold_literal/1, from_records/1, + fun_arity/1, fun_body/1, fun_vars/1, get_ann/1, int_lit/1, + int_val/1, is_c_alias/1, is_c_apply/1, is_c_atom/1, + is_c_call/1, is_c_case/1, is_c_catch/1, is_c_char/1, + is_c_clause/1, is_c_cons/1, is_c_float/1, is_c_fname/1, + is_c_fun/1, is_c_int/1, is_c_let/1, is_c_letrec/1, is_c_list/1, + is_c_module/1, is_c_nil/1, is_c_primop/1, is_c_receive/1, + is_c_seq/1, is_c_string/1, is_c_try/1, is_c_tuple/1, + is_c_values/1, is_c_var/1, is_data/1, is_leaf/1, is_literal/1, + is_literal_term/1, is_print_char/1, is_print_string/1, + let_arg/1, let_arity/1, let_body/1, let_vars/1, letrec_body/1, + letrec_defs/1, letrec_vars/1, list_elements/1, list_length/1, + make_data/2, make_list/1, make_list/2, make_data_skel/2, + make_tree/2, meta/1, module_attrs/1, module_defs/1, + module_exports/1, module_name/1, module_vars/1, + pat_list_vars/1, pat_vars/1, primop_args/1, primop_arity/1, + primop_name/1, receive_action/1, receive_clauses/1, + receive_timeout/1, seq_arg/1, seq_body/1, set_ann/2, + string_lit/1, string_val/1, subtrees/1, to_records/1, + try_arg/1, try_body/1, try_vars/1, try_evars/1, try_handler/1, + tuple_arity/1, tuple_es/1, type/1, unfold_literal/1, + update_c_alias/3, update_c_apply/3, update_c_call/4, + update_c_case/3, update_c_catch/2, update_c_clause/4, + update_c_cons/3, update_c_cons_skel/3, update_c_fname/2, + update_c_fname/3, update_c_fun/3, update_c_let/4, + update_c_letrec/3, update_c_module/5, update_c_primop/3, + update_c_receive/4, update_c_seq/3, update_c_try/6, + update_c_tuple/2, update_c_tuple_skel/2, update_c_values/2, + update_c_var/2, update_data/3, update_list/2, update_list/3, + update_data_skel/3, update_tree/2, update_tree/3, + values_arity/1, values_es/1, var_name/1, c_binary/1, + update_c_binary/2, ann_c_binary/2, is_c_binary/1, + binary_segments/1, c_bitstr/3, c_bitstr/4, c_bitstr/5, + update_c_bitstr/5, update_c_bitstr/6, ann_c_bitstr/5, + ann_c_bitstr/6, is_c_bitstr/1, bitstr_val/1, bitstr_size/1, + bitstr_bitsize/1, bitstr_unit/1, bitstr_type/1, bitstr_flags/1, + + %% keep map exports here for now + c_map_pattern/1, + is_c_map/1, + is_c_map_pattern/1, + map_es/1, + map_arg/1, + update_c_map/3, + c_map/1, is_c_map_empty/1, + ann_c_map/2, ann_c_map/3, + ann_c_map_pattern/2, + map_pair_op/1,map_pair_key/1,map_pair_val/1, + update_c_map_pair/4, + c_map_pair/2, c_map_pair_exact/2, + ann_c_map_pair/4 + ]). + +-export_type([c_binary/0, c_bitstr/0, c_call/0, c_clause/0, c_cons/0, c_fun/0, + c_let/0, c_literal/0, c_map/0, c_map_pair/0, + c_module/0, c_tuple/0, + c_values/0, c_var/0, cerl/0, + anns/0, attrs/0, defs/0, litval/0, var_name/0]). + +-include("core_parse.hrl"). + +-type c_alias() :: #c_alias{}. +-type c_apply() :: #c_apply{}. +-type c_binary() :: #c_binary{}. +-type c_bitstr() :: #c_bitstr{}. +-type c_call() :: #c_call{}. +-type c_case() :: #c_case{}. +-type c_catch() :: #c_catch{}. +-type c_clause() :: #c_clause{}. +-type c_cons() :: #c_cons{}. +-type c_fun() :: #c_fun{}. +-type c_let() :: #c_let{}. +-type c_letrec() :: #c_letrec{}. +-type c_literal() :: #c_literal{}. +-type c_map() :: #c_map{}. +-type c_map_pair() :: #c_map_pair{}. +-type c_module() :: #c_module{}. +-type c_primop() :: #c_primop{}. +-type c_receive() :: #c_receive{}. +-type c_seq() :: #c_seq{}. +-type c_try() :: #c_try{}. +-type c_tuple() :: #c_tuple{}. +-type c_values() :: #c_values{}. +-type c_var() :: #c_var{}. + +-type cerl() :: c_alias() | c_apply() | c_binary() | c_bitstr() + | c_call() | c_case() | c_catch() | c_clause() | c_cons() + | c_fun() | c_let() | c_letrec() | c_literal() + | c_map() | c_map_pair() + | c_module() | c_primop() | c_receive() | c_seq() + | c_try() | c_tuple() | c_values() | c_var(). + +-type anns() :: [term()]. +-type attr() :: {c_literal(), c_literal()}. +-type attrs() :: [attr()]. +-type def() :: {c_var(), c_fun()}. +-type defs() :: [def()]. + +-type litval() :: atom() | bitstring() | map() | number() + | string() | tuple() | [litval()]. + +-type var_name() :: integer() | atom() | {atom(), arity()}. + + +%% ===================================================================== +%% Representation (general) +%% +%% All nodes are represented by tuples of arity 2 or (generally) +%% greater, whose first element is an atom which uniquely identifies the +%% type of the node, and whose second element is a (proper) list of +%% annotation terms associated with the node - this is by default empty. +%% +%% For most node constructor functions, there are analogous functions +%% named 'ann_...', taking one extra argument 'As' (always the first +%% argument), specifying an annotation list at node creation time. +%% Similarly, there are also functions named 'update_...', taking one +%% extra argument 'Old', specifying a node from which all fields not +%% explicitly given as arguments should be copied (generally, this is +%% the annotation field only). +%% ===================================================================== + +%% @spec type(Node::cerl()) -> atom() +%% +%% @doc Returns the type tag of <code>Node</code>. Current node types +%% are: +%% +%% <p><center><table border="1"> +%% <tr> +%% <td>alias</td> +%% <td>apply</td> +%% <td>binary</td> +%% <td>bitstr</td> +%% <td>call</td> +%% <td>case</td> +%% <td>catch</td> +%% <td>clause</td> +%% </tr><tr> +%% <td>cons</td> +%% <td>fun</td> +%% <td>let</td> +%% <td>letrec</td> +%% <td>literal</td> +%% <td>map</td> +%% <td>map_pair</td> +%% <td>module</td> +%% </tr><tr> +%% <td>primop</td> +%% <td>receive</td> +%% <td>seq</td> +%% <td>try</td> +%% <td>tuple</td> +%% <td>values</td> +%% <td>var</td> +%% </tr> +%% </table></center></p> +%% +%% <p>Note: The name of the primary constructor function for a node +%% type is always the name of the type itself, prefixed by +%% "<code>c_</code>"; recognizer predicates are correspondingly +%% prefixed by "<code>is_c_</code>". Furthermore, to simplify +%% preservation of annotations (cf. <code>get_ann/1</code>), there are +%% analogous constructor functions prefixed by "<code>ann_c_</code>" +%% and "<code>update_c_</code>", for setting the annotation list of +%% the new node to either a specific value or to the annotations of an +%% existing node, respectively.</p> +%% +%% @see abstract/1 +%% @see c_alias/2 +%% @see c_apply/2 +%% @see c_binary/1 +%% @see c_bitstr/5 +%% @see c_call/3 +%% @see c_case/2 +%% @see c_catch/1 +%% @see c_clause/3 +%% @see c_cons/2 +%% @see c_fun/2 +%% @see c_let/3 +%% @see c_letrec/2 +%% @see c_module/3 +%% @see c_primop/2 +%% @see c_receive/1 +%% @see c_seq/2 +%% @see c_try/5 +%% @see c_tuple/1 +%% @see c_values/1 +%% @see c_var/1 +%% @see get_ann/1 +%% @see to_records/1 +%% @see from_records/1 +%% @see data_type/1 +%% @see subtrees/1 +%% @see meta/1 + +-type ctype() :: 'alias' | 'apply' | 'binary' | 'bitrst' | 'call' | 'case' + | 'catch' | 'clause' | 'cons' | 'fun' | 'let' | 'letrec' + | 'literal' | 'map' | 'map_pair' | 'module' | 'primop' + | 'receive' | 'seq' | 'try' | 'tuple' | 'values' | 'var'. + +-spec type(cerl()) -> ctype(). + +type(#c_alias{}) -> alias; +type(#c_apply{}) -> apply; +type(#c_binary{}) -> binary; +type(#c_bitstr{}) -> bitstr; +type(#c_call{}) -> call; +type(#c_case{}) -> 'case'; +type(#c_catch{}) -> 'catch'; +type(#c_clause{}) -> clause; +type(#c_cons{}) -> cons; +type(#c_fun{}) -> 'fun'; +type(#c_let{}) -> 'let'; +type(#c_letrec{}) -> letrec; +type(#c_literal{}) -> literal; +type(#c_map{}) -> map; +type(#c_map_pair{}) -> map_pair; +type(#c_module{}) -> module; +type(#c_primop{}) -> primop; +type(#c_receive{}) -> 'receive'; +type(#c_seq{}) -> seq; +type(#c_try{}) -> 'try'; +type(#c_tuple{}) -> tuple; +type(#c_values{}) -> values; +type(#c_var{}) -> var. + + +%% @spec is_leaf(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is a leaf node, +%% otherwise <code>false</code>. The current leaf node types are +%% <code>literal</code> and <code>var</code>. +%% +%% <p>Note: all literals (cf. <code>is_literal/1</code>) are leaf +%% nodes, even if they represent structured (constant) values such as +%% <code>{foo, [bar, baz]}</code>. Also note that variables are leaf +%% nodes but not literals.</p> +%% +%% @see type/1 +%% @see is_literal/1 + +-spec is_leaf(cerl()) -> boolean(). + +is_leaf(Node) -> + case type(Node) of + literal -> true; + var -> true; + _ -> false + end. + + +%% @spec get_ann(cerl()) -> anns() +%% +%% @doc Returns the list of user annotations associated with a syntax +%% tree node. For a newly created node, this is the empty list. The +%% annotations may be any terms. +%% +%% @see set_ann/2 + +-spec get_ann(cerl()) -> anns(). + +get_ann(Node) -> + element(2, Node). + + +%% @spec set_ann(Node::cerl(), Annotations::anns()) -> cerl() +%% +%% @doc Sets the list of user annotations of <code>Node</code> to +%% <code>Annotations</code>. +%% +%% @see get_ann/1 +%% @see add_ann/2 +%% @see copy_ann/2 + +-spec set_ann(cerl(), anns()) -> cerl(). + +set_ann(Node, List) -> + setelement(2, Node, List). + + +%% @spec add_ann(Annotations::anns(), Node::cerl()) -> cerl() +%% +%% @doc Appends <code>Annotations</code> to the list of user +%% annotations of <code>Node</code>. +%% +%% <p>Note: this is equivalent to <code>set_ann(Node, Annotations ++ +%% get_ann(Node))</code>, but potentially more efficient.</p> +%% +%% @see get_ann/1 +%% @see set_ann/2 + +-spec add_ann(anns(), cerl()) -> cerl(). + +add_ann(Terms, Node) -> + set_ann(Node, Terms ++ get_ann(Node)). + + +%% @spec copy_ann(Source::cerl(), Target::cerl()) -> cerl() +%% +%% @doc Copies the list of user annotations from <code>Source</code> +%% to <code>Target</code>. +%% +%% <p>Note: this is equivalent to <code>set_ann(Target, +%% get_ann(Source))</code>, but potentially more efficient.</p> +%% +%% @see get_ann/1 +%% @see set_ann/2 + +-spec copy_ann(cerl(), cerl()) -> cerl(). + +copy_ann(Source, Target) -> + set_ann(Target, get_ann(Source)). + + +%% @spec abstract(Term::litval()) -> cerl() +%% +%% @doc Creates a syntax tree corresponding to an Erlang term. +%% <code>Term</code> must be a literal term, i.e., one that can be +%% represented as a source code literal. Thus, it may not contain a +%% process identifier, port, reference or function value as a subterm. +%% +%% <p>Note: This is a constant time operation.</p> +%% +%% @see ann_abstract/2 +%% @see concrete/1 +%% @see is_literal/1 +%% @see is_literal_term/1 + +-spec abstract(litval()) -> c_literal(). + +abstract(T) -> + #c_literal{val = T}. + + +%% @spec ann_abstract(Annotations::anns(), Term::litval()) -> cerl() +%% @see abstract/1 + +-spec ann_abstract(anns(), litval()) -> c_literal(). + +ann_abstract(As, T) -> + #c_literal{val = T, anno = As}. + + +%% @spec is_literal_term(Term::term()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Term</code> can be +%% represented as a literal, otherwise <code>false</code>. This +%% function takes time proportional to the size of <code>Term</code>. +%% +%% @see abstract/1 + +-spec is_literal_term(term()) -> boolean(). + +is_literal_term(T) when is_integer(T) -> true; +is_literal_term(T) when is_float(T) -> true; +is_literal_term(T) when is_atom(T) -> true; +is_literal_term([]) -> true; +is_literal_term([H | T]) -> + is_literal_term(H) andalso is_literal_term(T); +is_literal_term(T) when is_tuple(T) -> + is_literal_term_list(tuple_to_list(T)); +is_literal_term(B) when is_bitstring(B) -> true; +is_literal_term(M) when is_map(M) -> + is_literal_term_list(maps:to_list(M)); +is_literal_term(_) -> + false. + +-spec is_literal_term_list([term()]) -> boolean(). + +is_literal_term_list([T | Ts]) -> + case is_literal_term(T) of + true -> + is_literal_term_list(Ts); + false -> + false + end; +is_literal_term_list([]) -> + true. + + +%% @spec concrete(Node::c_literal()) -> litval() +%% +%% @doc Returns the Erlang term represented by a syntax tree. An +%% exception is thrown if <code>Node</code> does not represent a +%% literal term. +%% +%% <p>Note: This is a constant time operation.</p> +%% +%% @see abstract/1 +%% @see is_literal/1 + +%% Because the normal tuple and list constructor operations always +%% return a literal if the arguments are literals, 'concrete' and +%% 'is_literal' never need to traverse the structure. + +-spec concrete(c_literal()) -> litval(). + +concrete(#c_literal{val = V}) -> + V. + + +%% @spec is_literal(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> represents a +%% literal term, otherwise <code>false</code>. This function returns +%% <code>true</code> if and only if the value of +%% <code>concrete(Node)</code> is defined. +%% +%% <p>Note: This is a constant time operation.</p> +%% +%% @see abstract/1 +%% @see concrete/1 +%% @see fold_literal/1 + +-spec is_literal(cerl()) -> boolean(). + +is_literal(#c_literal{}) -> + true; +is_literal(_) -> + false. + + +%% @spec fold_literal(Node::cerl()) -> cerl() +%% +%% @doc Assures that literals have a compact representation. This is +%% occasionally useful if <code>c_cons_skel/2</code>, +%% <code>c_tuple_skel/1</code> or <code>unfold_literal/1</code> were +%% used in the construction of <code>Node</code>, and you want to revert +%% to the normal "folded" representation of literals. If +%% <code>Node</code> represents a tuple or list constructor, its +%% elements are rewritten recursively, and the node is reconstructed +%% using <code>c_cons/2</code> or <code>c_tuple/1</code>, respectively; +%% otherwise, <code>Node</code> is not changed. +%% +%% @see is_literal/1 +%% @see c_cons_skel/2 +%% @see c_tuple_skel/1 +%% @see c_cons/2 +%% @see c_tuple/1 +%% @see unfold_literal/1 + +-spec fold_literal(cerl()) -> cerl(). + +fold_literal(Node) -> + case type(Node) of + tuple -> + update_c_tuple(Node, fold_literal_list(tuple_es(Node))); + cons -> + update_c_cons(Node, fold_literal(cons_hd(Node)), + fold_literal(cons_tl(Node))); + _ -> + Node + end. + +fold_literal_list([E | Es]) -> + [fold_literal(E) | fold_literal_list(Es)]; +fold_literal_list([]) -> + []. + + +%% @spec unfold_literal(Node::cerl()) -> cerl() +%% +%% @doc Assures that literals have a fully expanded representation. If +%% <code>Node</code> represents a literal tuple or list constructor, its +%% elements are rewritten recursively, and the node is reconstructed +%% using <code>c_cons_skel/2</code> or <code>c_tuple_skel/1</code>, +%% respectively; otherwise, <code>Node</code> is not changed. The {@link +%% fold_literal/1} can be used to revert to the normal compact +%% representation. +%% +%% @see is_literal/1 +%% @see c_cons_skel/2 +%% @see c_tuple_skel/1 +%% @see c_cons/2 +%% @see c_tuple/1 +%% @see fold_literal/1 + +-spec unfold_literal(cerl()) -> cerl(). + +unfold_literal(Node) -> + case type(Node) of + literal -> + copy_ann(Node, unfold_concrete(concrete(Node))); + _ -> + Node + end. + +unfold_concrete(Val) -> + case Val of + _ when is_tuple(Val) -> + c_tuple_skel(unfold_concrete_list(tuple_to_list(Val))); + [H|T] -> + c_cons_skel(unfold_concrete(H), unfold_concrete(T)); + _ -> + abstract(Val) + end. + +unfold_concrete_list([E | Es]) -> + [unfold_concrete(E) | unfold_concrete_list(Es)]; +unfold_concrete_list([]) -> + []. + + +%% --------------------------------------------------------------------- + +%% @spec c_module(Name::c_literal(), Exports, Definitions) -> c_module() +%% +%% Exports = [c_var()] +%% Definitions = defs() +%% +%% @equiv c_module(Name, Exports, [], Definitions) + +-spec c_module(c_literal(), [c_var()], defs()) -> c_module(). + +c_module(Name, Exports, Defs) -> + #c_module{name = Name, exports = Exports, attrs = [], defs = Defs}. + + +%% @spec c_module(Name::c_literal(), Exports, Attributes, Definitions) -> +%% c_module() +%% +%% Exports = [c_var()] +%% Attributes = attrs() +%% Definitions = defs() +%% +%% @doc Creates an abstract module definition. The result represents +%% <pre> +%% module <em>Name</em> [<em>E1</em>, ..., <em>Ek</em>] +%% attributes [<em>K1</em> = <em>T1</em>, ..., +%% <em>Km</em> = <em>Tm</em>] +%% <em>V1</em> = <em>F1</em> +%% ... +%% <em>Vn</em> = <em>Fn</em> +%% end</pre> +%% +%% if <code>Exports</code> = <code>[E1, ..., Ek]</code>, +%% <code>Attributes</code> = <code>[{K1, T1}, ..., {Km, Tm}]</code>, +%% and <code>Definitions</code> = <code>[{V1, F1}, ..., {Vn, +%% Fn}]</code>. +%% +%% <p><code>Name</code> and all the <code>Ki</code> must be atom +%% literals, and all the <code>Ti</code> must be constant literals. All +%% the <code>Vi</code> and <code>Ei</code> must have type +%% <code>var</code> and represent function names. All the +%% <code>Fi</code> must have type <code>'fun'</code>.</p> +%% +%% @see c_module/3 +%% @see module_name/1 +%% @see module_exports/1 +%% @see module_attrs/1 +%% @see module_defs/1 +%% @see module_vars/1 +%% @see ann_c_module/4 +%% @see ann_c_module/5 +%% @see update_c_module/5 +%% @see c_atom/1 +%% @see c_var/1 +%% @see c_fun/2 +%% @see is_literal/1 + +-spec c_module(c_literal(), [c_var()], attrs(), defs()) -> c_module(). + +c_module(Name, Exports, Attrs, Defs) -> + #c_module{name = Name, exports = Exports, attrs = Attrs, defs = Defs}. + + +%% @spec ann_c_module(As::anns(), Name::c_literal(), Exports, +%% Definitions) -> c_module() +%% +%% Exports = [c_var()] +%% Definitions = defs() +%% +%% @see c_module/3 +%% @see ann_c_module/5 + +-spec ann_c_module(anns(), c_literal(), [c_var()], defs()) -> c_module(). + +ann_c_module(As, Name, Exports, Defs) -> + #c_module{name = Name, exports = Exports, attrs = [], defs = Defs, + anno = As}. + + +%% @spec ann_c_module(As::anns(), Name::c_literal(), Exports, +%% Attributes, Definitions) -> c_module() +%% +%% Exports = [c_var()] +%% Attributes = attrs() +%% Definitions = defs() +%% +%% @see c_module/4 +%% @see ann_c_module/4 + +-spec ann_c_module(anns(), c_literal(), [c_var()], attrs(), defs()) -> + c_module(). + +ann_c_module(As, Name, Exports, Attrs, Defs) -> + #c_module{name = Name, exports = Exports, attrs = Attrs, defs = Defs, + anno = As}. + + +%% @spec update_c_module(Old::cerl(), Name::c_literal(), Exports, +%% Attributes, Definitions) -> c_module() +%% +%% Exports = [c_var()] +%% Attributes = attrs() +%% Definitions = defs() +%% +%% @see c_module/4 + +-spec update_c_module(c_module(), c_literal(), [c_var()], attrs(), defs()) -> + c_module(). + +update_c_module(Node, Name, Exports, Attrs, Defs) -> + #c_module{name = Name, exports = Exports, attrs = Attrs, defs = Defs, + anno = get_ann(Node)}. + + +%% @spec is_c_module(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% module definition, otherwise <code>false</code>. +%% +%% @see type/1 + +-spec is_c_module(cerl()) -> boolean(). + +is_c_module(#c_module{}) -> + true; +is_c_module(_) -> + false. + + +%% @spec module_name(Node::c_module()) -> c_literal() +%% +%% @doc Returns the name subtree of an abstract module definition. +%% +%% @see c_module/4 + +-spec module_name(c_module()) -> c_literal(). + +module_name(Node) -> + Node#c_module.name. + + +%% @spec module_exports(Node::c_module()) -> [c_var()] +%% +%% @doc Returns the list of exports subtrees of an abstract module +%% definition. +%% +%% @see c_module/4 + +-spec module_exports(c_module()) -> [c_var()]. + +module_exports(Node) -> + Node#c_module.exports. + + +%% @spec module_attrs(Node::c_module()) -> [{cerl(), cerl()}] +%% +%% @doc Returns the list of pairs of attribute key/value subtrees of +%% an abstract module definition. +%% +%% @see c_module/4 + +-spec module_attrs(c_module()) -> attrs(). + +module_attrs(Node) -> + Node#c_module.attrs. + + +%% @spec module_defs(Node::c_module()) -> defs() +%% +%% @doc Returns the list of function definitions of an abstract module +%% definition. +%% +%% @see c_module/4 + +-spec module_defs(c_module()) -> defs(). + +module_defs(Node) -> + Node#c_module.defs. + + +%% @spec module_vars(Node::c_module()) -> [c_var()] +%% +%% @doc Returns the list of left-hand side function variable subtrees +%% of an abstract module definition. +%% +%% @see c_module/4 + +-spec module_vars(c_module()) -> [c_var()]. + +module_vars(Node) -> + [F || {F, _} <- module_defs(Node)]. + + +%% --------------------------------------------------------------------- + +%% @spec c_int(Value::integer()) -> c_literal() +%% +%% @doc Creates an abstract integer literal. The lexical +%% representation is the canonical decimal numeral of +%% <code>Value</code>. +%% +%% @see ann_c_int/2 +%% @see is_c_int/1 +%% @see int_val/1 +%% @see int_lit/1 +%% @see c_char/1 + +-spec c_int(integer()) -> c_literal(). + +c_int(Value) -> + #c_literal{val = Value}. + + +%% @spec ann_c_int(As::anns(), Value::integer()) -> c_literal() +%% @see c_int/1 + +-spec ann_c_int(anns(), integer()) -> c_literal(). + +ann_c_int(As, Value) -> + #c_literal{val = Value, anno = As}. + + +%% @spec is_c_int(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> represents an +%% integer literal, otherwise <code>false</code>. +%% @see c_int/1 + +-spec is_c_int(cerl()) -> boolean(). + +is_c_int(#c_literal{val = V}) when is_integer(V) -> + true; +is_c_int(_) -> + false. + + +%% @spec int_val(c_literal()) -> integer() +%% +%% @doc Returns the value represented by an integer literal node. +%% @see c_int/1 + +-spec int_val(c_literal()) -> integer(). + +int_val(Node) -> + Node#c_literal.val. + + +%% @spec int_lit(c_literal()) -> string() +%% +%% @doc Returns the numeral string represented by an integer literal +%% node. +%% @see c_int/1 + +-spec int_lit(c_literal()) -> string(). + +int_lit(Node) -> + integer_to_list(int_val(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_float(Value::float()) -> c_literal() +%% +%% @doc Creates an abstract floating-point literal. The lexical +%% representation is the decimal floating-point numeral of +%% <code>Value</code>. +%% +%% @see ann_c_float/2 +%% @see is_c_float/1 +%% @see float_val/1 +%% @see float_lit/1 + +%% Note that not all floating-point numerals can be represented with +%% full precision. + +-spec c_float(float()) -> c_literal(). + +c_float(Value) -> + #c_literal{val = Value}. + + +%% @spec ann_c_float(As::anns(), Value::float()) -> c_literal() +%% @see c_float/1 + +-spec ann_c_float(anns(), float()) -> c_literal(). + +ann_c_float(As, Value) -> + #c_literal{val = Value, anno = As}. + + +%% @spec is_c_float(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> represents a +%% floating-point literal, otherwise <code>false</code>. +%% @see c_float/1 + +-spec is_c_float(cerl()) -> boolean(). + +is_c_float(#c_literal{val = V}) when is_float(V) -> + true; +is_c_float(_) -> + false. + + +%% @spec float_val(c_literal()) -> float() +%% +%% @doc Returns the value represented by a floating-point literal +%% node. +%% @see c_float/1 + +-spec float_val(c_literal()) -> float(). + +float_val(Node) -> + Node#c_literal.val. + + +%% @spec float_lit(c_literal()) -> string() +%% +%% @doc Returns the numeral string represented by a floating-point +%% literal node. +%% @see c_float/1 + +-spec float_lit(c_literal()) -> string(). + +float_lit(Node) -> + float_to_list(float_val(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_atom(Name) -> c_literal() +%% Name = atom() | string() +%% +%% @doc Creates an abstract atom literal. The print name of the atom +%% is the character sequence represented by <code>Name</code>. +%% +%% <p>Note: passing a string as argument to this function causes a +%% corresponding atom to be created for the internal representation.</p> +%% +%% @see ann_c_atom/2 +%% @see is_c_atom/1 +%% @see atom_val/1 +%% @see atom_name/1 +%% @see atom_lit/1 + +-spec c_atom(atom() | string()) -> c_literal(). + +c_atom(Name) when is_atom(Name) -> + #c_literal{val = Name}; +c_atom(Name) -> + #c_literal{val = list_to_atom(Name)}. + + +%% @spec ann_c_atom(As::anns(), Name) -> cerl() +%% Name = atom() | string() +%% @see c_atom/1 + +-spec ann_c_atom(anns(), atom() | string()) -> c_literal(). + +ann_c_atom(As, Name) when is_atom(Name) -> + #c_literal{val = Name, anno = As}; +ann_c_atom(As, Name) -> + #c_literal{val = list_to_atom(Name), anno = As}. + + +%% @spec is_c_atom(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> represents an +%% atom literal, otherwise <code>false</code>. +%% +%% @see c_atom/1 + +-spec is_c_atom(cerl()) -> boolean(). + +is_c_atom(#c_literal{val = V}) when is_atom(V) -> + true; +is_c_atom(_) -> + false. + +%% @spec atom_val(c_literal()) -> atom() +%% +%% @doc Returns the value represented by an abstract atom. +%% +%% @see c_atom/1 + +-spec atom_val(c_literal()) -> atom(). + +atom_val(Node) -> + Node#c_literal.val. + + +%% @spec atom_name(c_literal()) -> string() +%% +%% @doc Returns the printname of an abstract atom. +%% +%% @see c_atom/1 + +-spec atom_name(c_literal()) -> string(). + +atom_name(Node) -> + atom_to_list(atom_val(Node)). + + +%% @spec atom_lit(cerl()) -> string() +%% +%% @doc Returns the literal string represented by an abstract +%% atom. This always includes surrounding single-quote characters. +%% +%% <p>Note that an abstract atom may have several literal +%% representations, and that the representation yielded by this +%% function is not fixed; e.g., +%% <code>atom_lit(c_atom("a\012b"))</code> could yield the string +%% <code>"\'a\\nb\'"</code>.</p> +%% +%% @see c_atom/1 + +%% TODO: replace the use of the unofficial 'write_string/2'. + +-spec atom_lit(cerl()) -> nonempty_string(). + +atom_lit(Node) -> + io_lib:write_string(atom_name(Node), $'). %' stupid Emacs. + + +%% --------------------------------------------------------------------- + +%% @spec c_char(Value) -> c_literal() +%% +%% Value = char() | integer() +%% +%% @doc Creates an abstract character literal. If the local +%% implementation of Erlang defines <code>char()</code> as a subset of +%% <code>integer()</code>, this function is equivalent to +%% <code>c_int/1</code>. Otherwise, if the given value is an integer, +%% it will be converted to the character with the corresponding +%% code. The lexical representation of a character is +%% "<code>$<em>Char</em></code>", where <code>Char</code> is a single +%% printing character or an escape sequence. +%% +%% @see c_int/1 +%% @see c_string/1 +%% @see ann_c_char/2 +%% @see is_c_char/1 +%% @see char_val/1 +%% @see char_lit/1 +%% @see is_print_char/1 + +-spec c_char(non_neg_integer()) -> c_literal(). + +c_char(Value) when is_integer(Value), Value >= 0 -> + #c_literal{val = Value}. + + +%% @spec ann_c_char(As::anns(), Value::char()) -> c_literal() +%% @see c_char/1 + +-spec ann_c_char(anns(), char()) -> c_literal(). + +ann_c_char(As, Value) -> + #c_literal{val = Value, anno = As}. + + +%% @spec is_c_char(Node::c_literal()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> may represent a +%% character literal, otherwise <code>false</code>. +%% +%% <p>If the local implementation of Erlang defines +%% <code>char()</code> as a subset of <code>integer()</code>, then +%% <code>is_c_int(<em>Node</em>)</code> will also yield +%% <code>true</code>.</p> +%% +%% @see c_char/1 +%% @see is_print_char/1 + +-spec is_c_char(c_literal()) -> boolean(). + +is_c_char(#c_literal{val = V}) when is_integer(V), V >= 0 -> + is_char_value(V); +is_c_char(_) -> + false. + + +%% @spec is_print_char(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> may represent a +%% "printing" character, otherwise <code>false</code>. (Cf. +%% <code>is_c_char/1</code>.) A "printing" character has either a +%% given graphical representation, or a "named" escape sequence such +%% as "<code>\n</code>". Currently, only ISO 8859-1 (Latin-1) +%% character values are recognized. +%% +%% @see c_char/1 +%% @see is_c_char/1 + +-spec is_print_char(cerl()) -> boolean(). + +is_print_char(#c_literal{val = V}) when is_integer(V), V >= 0 -> + is_print_char_value(V); +is_print_char(_) -> + false. + + +%% @spec char_val(c_literal()) -> char() +%% +%% @doc Returns the value represented by an abstract character literal. +%% +%% @see c_char/1 + +-spec char_val(c_literal()) -> char(). + +char_val(Node) -> + Node#c_literal.val. + + +%% @spec char_lit(c_literal()) -> string() +%% +%% @doc Returns the literal string represented by an abstract +%% character. This includes a leading <code>$</code> +%% character. Currently, all characters that are not in the set of ISO +%% 8859-1 (Latin-1) "printing" characters will be escaped. +%% +%% @see c_char/1 + +-spec char_lit(c_literal()) -> nonempty_string(). + +char_lit(Node) -> + io_lib:write_char(char_val(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_string(Value::string()) -> c_literal() +%% +%% @doc Creates an abstract string literal. Equivalent to creating an +%% abstract list of the corresponding character literals +%% (cf. <code>is_c_string/1</code>), but is typically more +%% efficient. The lexical representation of a string is +%% "<code>"<em>Chars</em>"</code>", where <code>Chars</code> is a +%% sequence of printing characters or spaces. +%% +%% @see c_char/1 +%% @see ann_c_string/2 +%% @see is_c_string/1 +%% @see string_val/1 +%% @see string_lit/1 +%% @see is_print_string/1 + +-spec c_string(string()) -> c_literal(). + +c_string(Value) -> + #c_literal{val = Value}. + + +%% @spec ann_c_string(As::anns(), Value::string()) -> c_literal() +%% @see c_string/1 + +-spec ann_c_string(anns(), string()) -> c_literal(). + +ann_c_string(As, Value) -> + #c_literal{val = Value, anno = As}. + + +%% @spec is_c_string(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> may represent a +%% string literal, otherwise <code>false</code>. Strings are defined +%% as lists of characters; see <code>is_c_char/1</code> for details. +%% +%% @see c_string/1 +%% @see is_c_char/1 +%% @see is_print_string/1 + +-spec is_c_string(cerl()) -> boolean(). + +is_c_string(#c_literal{val = V}) -> + is_char_list(V); +is_c_string(_) -> + false. + + +%% @spec is_print_string(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> may represent a +%% string literal containing only "printing" characters, otherwise +%% <code>false</code>. See <code>is_c_string/1</code> and +%% <code>is_print_char/1</code> for details. Currently, only ISO +%% 8859-1 (Latin-1) character values are recognized. +%% +%% @see c_string/1 +%% @see is_c_string/1 +%% @see is_print_char/1 + +-spec is_print_string(cerl()) -> boolean(). + +is_print_string(#c_literal{val = V}) -> + is_print_char_list(V); +is_print_string(_) -> + false. + + +%% @spec string_val(cerl()) -> string() +%% +%% @doc Returns the value represented by an abstract string literal. +%% +%% @see c_string/1 + +-spec string_val(c_literal()) -> string(). + +string_val(Node) -> + Node#c_literal.val. + + +%% @spec string_lit(cerl()) -> string() +%% +%% @doc Returns the literal string represented by an abstract string. +%% This includes surrounding double-quote characters +%% <code>"..."</code>. Currently, characters that are not in the set +%% of ISO 8859-1 (Latin-1) "printing" characters will be escaped, +%% except for spaces. +%% +%% @see c_string/1 + +-spec string_lit(c_literal()) -> nonempty_string(). + +string_lit(Node) -> + io_lib:write_string(string_val(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_nil() -> cerl() +%% +%% @doc Creates an abstract empty list. The result represents +%% "<code>[]</code>". The empty list is traditionally called "nil". +%% +%% @see ann_c_nil/1 +%% @see is_c_list/1 +%% @see c_cons/2 + +-spec c_nil() -> c_literal(). + +c_nil() -> + #c_literal{val = []}. + + +%% @spec ann_c_nil(As::anns()) -> cerl() +%% @see c_nil/0 + +-spec ann_c_nil(anns()) -> c_literal(). + +ann_c_nil(As) -> + #c_literal{val = [], anno = As}. + + +%% @spec is_c_nil(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% empty list, otherwise <code>false</code>. + +-spec is_c_nil(cerl()) -> boolean(). + +is_c_nil(#c_literal{val = []}) -> + true; +is_c_nil(_) -> + false. + + +%% --------------------------------------------------------------------- + +%% @spec c_cons(Head::cerl(), Tail::cerl()) -> cerl() +%% +%% @doc Creates an abstract list constructor. The result represents +%% "<code>[<em>Head</em> | <em>Tail</em>]</code>". Note that if both +%% <code>Head</code> and <code>Tail</code> have type +%% <code>literal</code>, then the result will also have type +%% <code>literal</code>, and annotations on <code>Head</code> and +%% <code>Tail</code> are lost. +%% +%% <p>Recall that in Erlang, the tail element of a list constructor is +%% not necessarily a list.</p> +%% +%% @see ann_c_cons/3 +%% @see update_c_cons/3 +%% @see c_cons_skel/2 +%% @see is_c_cons/1 +%% @see cons_hd/1 +%% @see cons_tl/1 +%% @see is_c_list/1 +%% @see c_nil/0 +%% @see list_elements/1 +%% @see list_length/1 +%% @see make_list/2 + +%% *Always* collapse literals. + +-spec c_cons(cerl(), cerl()) -> c_literal() | c_cons(). + +c_cons(#c_literal{val = Head}, #c_literal{val = Tail}) -> + #c_literal{val = [Head | Tail]}; +c_cons(Head, Tail) -> + #c_cons{hd = Head, tl = Tail}. + + +%% @spec ann_c_cons(As::anns(), Head::cerl(), Tail::cerl()) -> cerl() +%% @see c_cons/2 + +-spec ann_c_cons(anns(), cerl(), cerl()) -> c_literal() | c_cons(). + +ann_c_cons(As, #c_literal{val = Head}, #c_literal{val = Tail}) -> + #c_literal{val = [Head | Tail], anno = As}; +ann_c_cons(As, Head, Tail) -> + #c_cons{hd = Head, tl = Tail, anno = As}. + + +%% @spec update_c_cons(Old::cerl(), Head::cerl(), Tail::cerl()) -> +%% cerl() +%% @see c_cons/2 + +-spec update_c_cons(c_literal() | c_cons(), cerl(), cerl()) -> + c_literal() | c_cons(). + +update_c_cons(Node, #c_literal{val = Head}, #c_literal{val = Tail}) -> + #c_literal{val = [Head | Tail], anno = get_ann(Node)}; +update_c_cons(Node, Head, Tail) -> + #c_cons{hd = Head, tl = Tail, anno = get_ann(Node)}. + + +%% @spec c_cons_skel(Head::cerl(), Tail::cerl()) -> c_cons() +%% +%% @doc Creates an abstract list constructor skeleton. Does not fold +%% constant literals, i.e., the result always has type +%% <code>cons</code>, representing "<code>[<em>Head</em> | +%% <em>Tail</em>]</code>". +%% +%% <p>This function is occasionally useful when it is necessary to have +%% annotations on the subnodes of a list constructor node, even when the +%% subnodes are constant literals. Note however that +%% <code>is_literal/1</code> will yield <code>false</code> and +%% <code>concrete/1</code> will fail if passed the result from this +%% function.</p> +%% +%% <p><code>fold_literal/1</code> can be used to revert a node to the +%% normal-form representation.</p> +%% +%% @see ann_c_cons_skel/3 +%% @see update_c_cons_skel/3 +%% @see c_cons/2 +%% @see is_c_cons/1 +%% @see is_c_list/1 +%% @see c_nil/0 +%% @see is_literal/1 +%% @see fold_literal/1 +%% @see concrete/1 + +%% *Never* collapse literals. + +-spec c_cons_skel(cerl(), cerl()) -> c_cons(). + +c_cons_skel(Head, Tail) -> + #c_cons{hd = Head, tl = Tail}. + + +%% @spec ann_c_cons_skel(As::anns(), Head::cerl(), Tail::cerl()) -> +%% c_cons() +%% @see c_cons_skel/2 + +-spec ann_c_cons_skel(anns(), cerl(), cerl()) -> c_cons(). + +ann_c_cons_skel(As, Head, Tail) -> + #c_cons{hd = Head, tl = Tail, anno = As}. + + +%% @spec update_c_cons_skel(Old::cerl(), Head::cerl(), Tail::cerl()) -> +%% c_cons() +%% @see c_cons_skel/2 + +-spec update_c_cons_skel(c_cons() | c_literal(), cerl(), cerl()) -> c_cons(). + +update_c_cons_skel(Node, Head, Tail) -> + #c_cons{hd = Head, tl = Tail, anno = get_ann(Node)}. + + +%% @spec is_c_cons(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% list constructor, otherwise <code>false</code>. + +-spec is_c_cons(cerl()) -> boolean(). + +is_c_cons(#c_cons{}) -> + true; +is_c_cons(#c_literal{val = [_ | _]}) -> + true; +is_c_cons(_) -> + false. + + +%% @spec cons_hd(cerl()) -> cerl() +%% +%% @doc Returns the head subtree of an abstract list constructor. +%% +%% @see c_cons/2 + +-spec cons_hd(c_cons() | c_literal()) -> cerl(). + +cons_hd(#c_cons{hd = Head}) -> + Head; +cons_hd(#c_literal{val = [Head | _]}) -> + #c_literal{val = Head}. + + +%% @spec cons_tl(c_cons() | c_literal()) -> cerl() +%% +%% @doc Returns the tail subtree of an abstract list constructor. +%% +%% <p>Recall that the tail does not necessarily represent a proper +%% list.</p> +%% +%% @see c_cons/2 + +-spec cons_tl(c_cons() | c_literal()) -> cerl(). + +cons_tl(#c_cons{tl = Tail}) -> + Tail; +cons_tl(#c_literal{val = [_ | Tail]}) -> + #c_literal{val = Tail}. + + +%% @spec is_c_list(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> represents a +%% proper list, otherwise <code>false</code>. A proper list is either +%% the empty list <code>[]</code>, or a cons cell <code>[<em>Head</em> | +%% <em>Tail</em>]</code>, where recursively <code>Tail</code> is a +%% proper list. +%% +%% <p>Note: Because <code>Node</code> is a syntax tree, the actual +%% run-time values corresponding to its subtrees may often be partially +%% or completely unknown. Thus, if <code>Node</code> represents e.g. +%% "<code>[... | Ns]</code>" (where <code>Ns</code> is a variable), then +%% the function will return <code>false</code>, because it is not known +%% whether <code>Ns</code> will be bound to a list at run-time. If +%% <code>Node</code> instead represents e.g. "<code>[1, 2, 3]</code>" or +%% "<code>[A | []]</code>", then the function will return +%% <code>true</code>.</p> +%% +%% @see c_cons/2 +%% @see c_nil/0 +%% @see list_elements/1 +%% @see list_length/1 + +-spec is_c_list(cerl()) -> boolean(). + +is_c_list(#c_cons{tl = Tail}) -> + is_c_list(Tail); +is_c_list(#c_literal{val = V}) -> + is_proper_list(V); +is_c_list(_) -> + false. + +is_proper_list([_ | Tail]) -> + is_proper_list(Tail); +is_proper_list([]) -> + true; +is_proper_list(_) -> + false. + +%% @spec list_elements(c_cons() | c_literal()) -> [cerl()] +%% +%% @doc Returns the list of element subtrees of an abstract list. +%% <code>Node</code> must represent a proper list. E.g., if +%% <code>Node</code> represents "<code>[<em>X1</em>, <em>X2</em> | +%% [<em>X3</em>, <em>X4</em> | []]</code>", then +%% <code>list_elements(Node)</code> yields the list <code>[X1, X2, X3, +%% X4]</code>. +%% +%% @see c_cons/2 +%% @see c_nil/0 +%% @see is_c_list/1 +%% @see list_length/1 +%% @see make_list/2 + +-spec list_elements(c_cons() | c_literal()) -> [cerl()]. + +list_elements(#c_cons{hd = Head, tl = Tail}) -> + [Head | list_elements(Tail)]; +list_elements(#c_literal{val = V}) -> + abstract_list(V). + +abstract_list([X | Xs]) -> + [abstract(X) | abstract_list(Xs)]; +abstract_list([]) -> + []. + + +%% @spec list_length(Node::c_cons() | c_literal()) -> integer() +%% +%% @doc Returns the number of element subtrees of an abstract list. +%% <code>Node</code> must represent a proper list. E.g., if +%% <code>Node</code> represents "<code>[X1 | [X2, X3 | [X4, X5, +%% X6]]]</code>", then <code>list_length(Node)</code> returns the +%% integer 6. +%% +%% <p>Note: this is equivalent to +%% <code>length(list_elements(Node))</code>, but potentially more +%% efficient.</p> +%% +%% @see c_cons/2 +%% @see c_nil/0 +%% @see is_c_list/1 +%% @see list_elements/1 + +-spec list_length(c_cons() | c_literal()) -> non_neg_integer(). + +list_length(L) -> + list_length(L, 0). + +list_length(#c_cons{tl = Tail}, A) -> + list_length(Tail, A + 1); +list_length(#c_literal{val = V}, A) -> + A + length(V). + + +%% @spec make_list(List) -> Node +%% @equiv make_list(List, none) + +-spec make_list([cerl()]) -> cerl(). + +make_list(List) -> + ann_make_list([], List). + + +%% @spec make_list(List::[cerl()], Tail) -> cerl() +%% +%% Tail = cerl() | none +%% +%% @doc Creates an abstract list from the elements in <code>List</code> +%% and the optional <code>Tail</code>. If <code>Tail</code> is +%% <code>none</code>, the result will represent a nil-terminated list, +%% otherwise it represents "<code>[... | <em>Tail</em>]</code>". +%% +%% @see c_cons/2 +%% @see c_nil/0 +%% @see ann_make_list/3 +%% @see update_list/3 +%% @see list_elements/1 + +-spec make_list([cerl()], cerl() | 'none') -> cerl(). + +make_list(List, Tail) -> + ann_make_list([], List, Tail). + + +%% @spec update_list(Old::cerl(), List::[cerl()]) -> cerl() +%% @equiv update_list(Old, List, none) + +-spec update_list(cerl(), [cerl()]) -> cerl(). + +update_list(Node, List) -> + ann_make_list(get_ann(Node), List). + + +%% @spec update_list(Old::cerl(), List::[cerl()], Tail) -> cerl() +%% +%% Tail = cerl() | none +%% +%% @see make_list/2 +%% @see update_list/2 + +-spec update_list(cerl(), [cerl()], cerl() | 'none') -> cerl(). + +update_list(Node, List, Tail) -> + ann_make_list(get_ann(Node), List, Tail). + + +%% @spec ann_make_list(As::anns(), List::[cerl()]) -> cerl() +%% @equiv ann_make_list(As, List, none) + +-spec ann_make_list(anns(), [cerl()]) -> cerl(). + +ann_make_list(As, List) -> + ann_make_list(As, List, none). + + +%% @spec ann_make_list(As::anns(), List::[cerl()], Tail) -> cerl() +%% +%% Tail = cerl() | none +%% +%% @see make_list/2 +%% @see ann_make_list/2 + +-spec ann_make_list(anns(), [cerl()], cerl() | 'none') -> cerl(). + +ann_make_list(As, [H | T], Tail) -> + ann_c_cons(As, H, make_list(T, Tail)); % `c_cons' folds literals +ann_make_list(As, [], none) -> + ann_c_nil(As); +ann_make_list(_, [], Node) -> + Node. + + +%% --------------------------------------------------------------------- +%% maps + +%% @spec is_c_map(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% map constructor, otherwise <code>false</code>. + +-spec is_c_map(cerl()) -> boolean(). + +is_c_map(#c_map{}) -> + true; +is_c_map(#c_literal{val = V}) when is_map(V) -> + true; +is_c_map(_) -> + false. + +-spec map_es(c_map() | c_literal()) -> [c_map_pair()]. + +map_es(#c_literal{anno=As,val=M}) when is_map(M) -> + [ann_c_map_pair(As, + #c_literal{anno=As,val='assoc'}, + #c_literal{anno=As,val=K}, + #c_literal{anno=As,val=V}) || {K,V} <- maps:to_list(M)]; +map_es(#c_map{es = Es}) -> + Es. + +-spec map_arg(c_map() | c_literal()) -> c_map() | c_literal(). + +map_arg(#c_literal{anno=As,val=M}) when is_map(M) -> + #c_literal{anno=As,val=#{}}; +map_arg(#c_map{arg=M}) -> + M. + +-spec c_map([c_map_pair()]) -> c_map(). + +c_map(Pairs) -> + ann_c_map([], Pairs). + +-spec c_map_pattern([c_map_pair()]) -> c_map(). + +c_map_pattern(Pairs) -> + #c_map{es=Pairs, is_pat=true}. + +-spec ann_c_map_pattern([term()], [c_map_pair()]) -> c_map(). + +ann_c_map_pattern(As, Pairs) -> + #c_map{anno=As, es=Pairs, is_pat=true}. + +-spec is_c_map_empty(c_map() | c_literal()) -> boolean(). + +is_c_map_empty(#c_map{ es=[] }) -> true; +is_c_map_empty(#c_literal{val=M}) when is_map(M),map_size(M) =:= 0 -> true; +is_c_map_empty(_) -> false. + +-spec is_c_map_pattern(c_map()) -> boolean(). + +is_c_map_pattern(#c_map{is_pat=IsPat}) -> + IsPat. + +-spec ann_c_map([term()], [c_map_pair()]) -> c_map() | c_literal(). + +ann_c_map(As, Es) -> + ann_c_map(As, #c_literal{val=#{}}, Es). + +-spec ann_c_map(anns(), c_map() | c_literal(), [c_map_pair()]) -> c_map() | c_literal(). + +ann_c_map(As, #c_literal{val=M}, Es) when is_map(M) -> + fold_map_pairs(As,Es,M); +ann_c_map(As, M, Es) -> + #c_map{arg=M, es=Es, anno=As}. + +fold_map_pairs(As,[],M) -> #c_literal{anno=As,val=M}; +%% M#{ K => V} +fold_map_pairs(As,[#c_map_pair{op=#c_literal{val=assoc},key=Ck,val=Cv}=E|Es],M) -> + case is_lit_list([Ck,Cv]) of + true -> + [K,V] = lit_list_vals([Ck,Cv]), + fold_map_pairs(As,Es,maps:put(K,V,M)); + false -> + #c_map{arg=#c_literal{val=M,anno=As}, es=[E|Es], anno=As} + end; +%% M#{ K := V} +fold_map_pairs(As,[#c_map_pair{op=#c_literal{val=exact},key=Ck,val=Cv}=E|Es],M) -> + case is_lit_list([Ck,Cv]) of + true -> + [K,V] = lit_list_vals([Ck,Cv]), + case maps:is_key(K,M) of + true -> fold_map_pairs(As,Es,maps:put(K,V,M)); + false -> + #c_map{arg=#c_literal{val=M,anno=As}, es=[E|Es], anno=As } + end; + false -> + #c_map{arg=#c_literal{val=M,anno=As}, es=[E|Es], anno=As } + end. + +-spec update_c_map(c_map(), cerl(), [cerl()]) -> c_map() | c_literal(). + +update_c_map(#c_map{is_pat=true}=Old, M, Es) -> + Old#c_map{arg=M, es=Es}; +update_c_map(#c_map{is_pat=false}=Old, M, Es) -> + ann_c_map(get_ann(Old), M, Es). + +map_pair_key(#c_map_pair{key=K}) -> K. +map_pair_val(#c_map_pair{val=V}) -> V. +map_pair_op(#c_map_pair{op=Op}) -> Op. + +-spec c_map_pair(cerl(), cerl()) -> c_map_pair(). + +c_map_pair(Key,Val) -> + #c_map_pair{op=#c_literal{val=assoc},key=Key,val=Val}. + +-spec c_map_pair_exact(cerl(), cerl()) -> c_map_pair(). + +c_map_pair_exact(Key,Val) -> + #c_map_pair{op=#c_literal{val=exact},key=Key,val=Val}. + +-spec ann_c_map_pair(anns(), cerl(), cerl(), cerl()) -> + c_map_pair(). + +ann_c_map_pair(As,Op,K,V) -> + #c_map_pair{op = Op, key = K, val = V, anno = As}. + +update_c_map_pair(Old,Op,K,V) -> + #c_map_pair{op = Op, key = K, val = V, anno = get_ann(Old)}. + + +%% --------------------------------------------------------------------- + +%% @spec c_tuple(Elements::[cerl()]) -> cerl() +%% +%% @doc Creates an abstract tuple. If <code>Elements</code> is +%% <code>[E1, ..., En]</code>, the result represents +%% "<code>{<em>E1</em>, ..., <em>En</em>}</code>". Note that if all +%% nodes in <code>Elements</code> have type <code>literal</code>, or if +%% <code>Elements</code> is empty, then the result will also have type +%% <code>literal</code> and annotations on nodes in +%% <code>Elements</code> are lost. +%% +%% <p>Recall that Erlang has distinct 1-tuples, i.e., <code>{X}</code> +%% is always distinct from <code>X</code> itself.</p> +%% +%% @see ann_c_tuple/2 +%% @see update_c_tuple/2 +%% @see is_c_tuple/1 +%% @see tuple_es/1 +%% @see tuple_arity/1 +%% @see c_tuple_skel/1 + +%% *Always* collapse literals. + +-spec c_tuple([cerl()]) -> c_tuple() | c_literal(). + +c_tuple(Es) -> + case is_lit_list(Es) of + false -> + #c_tuple{es = Es}; + true -> + #c_literal{val = list_to_tuple(lit_list_vals(Es))} + end. + + +%% @spec ann_c_tuple(As::anns(), Elements::[cerl()]) -> cerl() +%% @see c_tuple/1 + +-spec ann_c_tuple(anns(), [cerl()]) -> c_tuple() | c_literal(). + +ann_c_tuple(As, Es) -> + case is_lit_list(Es) of + false -> + #c_tuple{es = Es, anno = As}; + true -> + #c_literal{val = list_to_tuple(lit_list_vals(Es)), anno = As} + end. + + +%% @spec update_c_tuple(Old::cerl(), Elements::[cerl()]) -> cerl() +%% @see c_tuple/1 + +-spec update_c_tuple(c_tuple() | c_literal(), [cerl()]) -> c_tuple() | c_literal(). + +update_c_tuple(Node, Es) -> + case is_lit_list(Es) of + false -> + #c_tuple{es = Es, anno = get_ann(Node)}; + true -> + #c_literal{val = list_to_tuple(lit_list_vals(Es)), + anno = get_ann(Node)} + end. + + +%% @spec c_tuple_skel(Elements::[cerl()]) -> cerl() +%% +%% @doc Creates an abstract tuple skeleton. Does not fold constant +%% literals, i.e., the result always has type <code>tuple</code>, +%% representing "<code>{<em>E1</em>, ..., <em>En</em>}</code>", if +%% <code>Elements</code> is <code>[E1, ..., En]</code>. +%% +%% <p>This function is occasionally useful when it is necessary to have +%% annotations on the subnodes of a tuple node, even when all the +%% subnodes are constant literals. Note however that +%% <code>is_literal/1</code> will yield <code>false</code> and +%% <code>concrete/1</code> will fail if passed the result from this +%% function.</p> +%% +%% <p><code>fold_literal/1</code> can be used to revert a node to the +%% normal-form representation.</p> +%% +%% @see ann_c_tuple_skel/2 +%% @see update_c_tuple_skel/2 +%% @see c_tuple/1 +%% @see tuple_es/1 +%% @see is_c_tuple/1 +%% @see is_literal/1 +%% @see fold_literal/1 +%% @see concrete/1 + +%% *Never* collapse literals. + +-spec c_tuple_skel([cerl()]) -> c_tuple(). + +c_tuple_skel(Es) -> + #c_tuple{es = Es}. + + +%% @spec ann_c_tuple_skel(As::anns(), Elements::[cerl()]) -> cerl() +%% @see c_tuple_skel/1 + +-spec ann_c_tuple_skel(anns(), [cerl()]) -> c_tuple(). + +ann_c_tuple_skel(As, Es) -> + #c_tuple{es = Es, anno = As}. + + +%% @spec update_c_tuple_skel(Old::cerl(), Elements::[cerl()]) -> cerl() +%% @see c_tuple_skel/1 + +-spec update_c_tuple_skel(c_tuple(), [cerl()]) -> c_tuple(). + +update_c_tuple_skel(Old, Es) -> + #c_tuple{es = Es, anno = get_ann(Old)}. + + +%% @spec is_c_tuple(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% tuple, otherwise <code>false</code>. +%% +%% @see c_tuple/1 + +-spec is_c_tuple(cerl()) -> boolean(). + +is_c_tuple(#c_tuple{}) -> + true; +is_c_tuple(#c_literal{val = V}) when is_tuple(V) -> + true; +is_c_tuple(_) -> + false. + + +%% @spec tuple_es(cerl()) -> [cerl()] +%% +%% @doc Returns the list of element subtrees of an abstract tuple. +%% +%% @see c_tuple/1 + +-spec tuple_es(c_tuple() | c_literal()) -> [cerl()]. + +tuple_es(#c_tuple{es = Es}) -> + Es; +tuple_es(#c_literal{val = V}) -> + make_lit_list(tuple_to_list(V)). + + +%% @spec tuple_arity(Node::cerl()) -> integer() +%% +%% @doc Returns the number of element subtrees of an abstract tuple. +%% +%% <p>Note: this is equivalent to <code>length(tuple_es(Node))</code>, +%% but potentially more efficient.</p> +%% +%% @see tuple_es/1 +%% @see c_tuple/1 + +-spec tuple_arity(c_tuple() | c_literal()) -> non_neg_integer(). + +tuple_arity(#c_tuple{es = Es}) -> + length(Es); +tuple_arity(#c_literal{val = V}) when is_tuple(V) -> + tuple_size(V). + + +%% --------------------------------------------------------------------- + +%% @spec c_var(Name::var_name()) -> cerl() +%% +%% var_name() = integer() | atom() | {atom(), arity()} +%% +%% @doc Creates an abstract variable. A variable is identified by its +%% name, given by the <code>Name</code> parameter. +%% +%% <p>If a name is given by a single atom, it should either be a +%% "simple" atom which does not need to be single-quoted in Erlang, or +%% otherwise its print name should correspond to a proper Erlang +%% variable, i.e., begin with an uppercase character or an +%% underscore. Names on the form <code>{A, N}</code> represent +%% function name variables "<code><em>A</em>/<em>N</em></code>"; these +%% are special variables which may be bound only in the function +%% definitions of a module or a <code>letrec</code>. They may not be +%% bound in <code>let</code> expressions and cannot occur in clause +%% patterns. The atom <code>A</code> in a function name may be any +%% atom; the integer <code>N</code> must be nonnegative. The functions +%% <code>c_fname/2</code> etc. are utilities for handling function +%% name variables.</p> +%% +%% <p>When printing variable names, they must have the form of proper +%% Core Erlang variables and function names. E.g., a name represented +%% by an integer such as <code>42</code> could be formatted as +%% "<code>_42</code>", an atom <code>'Xxx'</code> simply as +%% "<code>Xxx</code>", and an atom <code>foo</code> as +%% "<code>_foo</code>". However, one must assure that any two valid +%% distinct names are never mapped to the same strings. Tuples such +%% as <code>{foo, 2}</code> representing function names can simply by +%% formatted as "<code>'foo'/2</code>", with no risk of conflicts.</p> +%% +%% @see ann_c_var/2 +%% @see update_c_var/2 +%% @see is_c_var/1 +%% @see var_name/1 +%% @see c_fname/2 +%% @see c_module/4 +%% @see c_letrec/2 + +-spec c_var(var_name()) -> c_var(). + +c_var(Name) -> + #c_var{name = Name}. + + +%% @spec ann_c_var(As::anns(), Name::var_name()) -> c_var() +%% +%% @see c_var/1 + +-spec ann_c_var(anns(), var_name()) -> c_var(). + +ann_c_var(As, Name) -> + #c_var{name = Name, anno = As}. + +%% @spec update_c_var(Old::cerl(), Name::var_name()) -> c_var() +%% +%% @see c_var/1 + +-spec update_c_var(c_var(), var_name()) -> c_var(). + +update_c_var(Node, Name) -> + #c_var{name = Name, anno = get_ann(Node)}. + + +%% @spec is_c_var(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% variable, otherwise <code>false</code>. +%% +%% @see c_var/1 + +-spec is_c_var(cerl()) -> boolean(). + +is_c_var(#c_var{}) -> + true; +is_c_var(_) -> + false. + + +%% @spec c_fname(Name::atom(), Arity::arity()) -> c_var() +%% @equiv c_var({Name, Arity}) +%% @see fname_id/1 +%% @see fname_arity/1 +%% @see is_c_fname/1 +%% @see ann_c_fname/3 +%% @see update_c_fname/3 + +-spec c_fname(atom(), arity()) -> c_var(). + +c_fname(Atom, Arity) -> + c_var({Atom, Arity}). + + +%% @spec ann_c_fname(As::anns(), Name::atom(), Arity::arity()) -> c_var() +%% +%% @equiv ann_c_var(As, {Atom, Arity}) +%% @see c_fname/2 + +-spec ann_c_fname(anns(), atom(), arity()) -> c_var(). + +ann_c_fname(As, Atom, Arity) -> + ann_c_var(As, {Atom, Arity}). + + +%% @spec update_c_fname(Old::c_var(), Name::atom()) -> c_var() +%% @doc Like <code>update_c_fname/3</code>, but takes the arity from +%% <code>Node</code>. +%% @see update_c_fname/3 +%% @see c_fname/2 + +-spec update_c_fname(c_var(), atom()) -> c_var(). + +update_c_fname(#c_var{name = {_, Arity}, anno = As}, Atom) -> + #c_var{name = {Atom, Arity}, anno = As}. + + +%% @spec update_c_fname(Old::var(), Name::atom(), Arity::arity()) -> c_var() +%% +%% @equiv update_c_var(Old, {Atom, Arity}) +%% @see update_c_fname/2 +%% @see c_fname/2 + +-spec update_c_fname(c_var(), atom(), arity()) -> c_var(). + +update_c_fname(Node, Atom, Arity) -> + update_c_var(Node, {Atom, Arity}). + + +%% @spec is_c_fname(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% function name variable, otherwise <code>false</code>. +%% +%% @see c_fname/2 +%% @see c_var/1 +%% @see var_name/1 + +-spec is_c_fname(cerl()) -> boolean(). + +is_c_fname(#c_var{name = {A, N}}) when is_atom(A), is_integer(N), N >= 0 -> + true; +is_c_fname(_) -> + false. + + +%% @spec var_name(c_var()) -> var_name() +%% +%% @doc Returns the name of an abstract variable. +%% +%% @see c_var/1 + +-spec var_name(c_var()) -> var_name(). + +var_name(Node) -> + Node#c_var.name. + + +%% @spec fname_id(c_var()) -> atom() +%% +%% @doc Returns the identifier part of an abstract function name +%% variable. +%% +%% @see fname_arity/1 +%% @see c_fname/2 + +-spec fname_id(c_var()) -> atom(). + +fname_id(#c_var{name={A,_}}) -> + A. + + +%% @spec fname_arity(c_var()) -> arity() +%% +%% @doc Returns the arity part of an abstract function name variable. +%% +%% @see fname_id/1 +%% @see c_fname/2 + +-spec fname_arity(c_var()) -> arity(). + +fname_arity(#c_var{name={_,N}}) -> + N. + + +%% --------------------------------------------------------------------- + +%% @spec c_values(Elements::[cerl()]) -> c_values() +%% +%% @doc Creates an abstract value list. If <code>Elements</code> is +%% <code>[E1, ..., En]</code>, the result represents +%% "<code><<em>E1</em>, ..., <em>En</em>></code>". +%% +%% @see ann_c_values/2 +%% @see update_c_values/2 +%% @see is_c_values/1 +%% @see values_es/1 +%% @see values_arity/1 + +-spec c_values([cerl()]) -> c_values(). + +c_values(Es) -> + #c_values{es = Es}. + + +%% @spec ann_c_values(As::anns(), Elements::[cerl()]) -> c_values() +%% @see c_values/1 + +-spec ann_c_values(anns(), [cerl()]) -> c_values(). + +ann_c_values(As, Es) -> + #c_values{es = Es, anno = As}. + + +%% @spec update_c_values(Old::cerl(), Elements::[cerl()]) -> c_values() +%% @see c_values/1 + +-spec update_c_values(c_values(), [cerl()]) -> c_values(). + +update_c_values(Node, Es) -> + #c_values{es = Es, anno = get_ann(Node)}. + + +%% @spec is_c_values(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% value list; otherwise <code>false</code>. +%% +%% @see c_values/1 + +-spec is_c_values(cerl()) -> boolean(). + +is_c_values(#c_values{}) -> + true; +is_c_values(_) -> + false. + + +%% @spec values_es(c_values()) -> [cerl()] +%% +%% @doc Returns the list of element subtrees of an abstract value +%% list. +%% +%% @see c_values/1 +%% @see values_arity/1 + +-spec values_es(c_values()) -> [cerl()]. + +values_es(Node) -> + Node#c_values.es. + + +%% @spec values_arity(Node::c_values()) -> non_neg_integer() +%% +%% @doc Returns the number of element subtrees of an abstract value +%% list. +%% +%% <p>Note: This is equivalent to +%% <code>length(values_es(Node))</code>, but potentially more +%% efficient.</p> +%% +%% @see c_values/1 +%% @see values_es/1 + +-spec values_arity(c_values()) -> non_neg_integer(). + +values_arity(Node) -> + length(values_es(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_binary(Segments::[c_bitstr()]) -> c_binary() +%% +%% @doc Creates an abstract binary-template. A binary object is a +%% sequence of 8-bit bytes. It is specified by zero or more bit-string +%% template <em>segments</em> of arbitrary lengths (in number of bits), +%% such that the sum of the lengths is evenly divisible by 8. If +%% <code>Segments</code> is <code>[S1, ..., Sn]</code>, the result +%% represents "<code>#{<em>S1</em>, ..., <em>Sn</em>}#</code>". All the +%% <code>Si</code> must have type <code>bitstr</code>. +%% +%% @see ann_c_binary/2 +%% @see update_c_binary/2 +%% @see is_c_binary/1 +%% @see binary_segments/1 +%% @see c_bitstr/5 + +-spec c_binary([c_bitstr()]) -> c_binary(). + +c_binary(Segments) -> + #c_binary{segments = Segments}. + + +%% @spec ann_c_binary(As::anns(), Segments::[c_bitstr()]) -> c_binary() +%% @see c_binary/1 + +-spec ann_c_binary(anns(), [c_bitstr()]) -> c_binary(). + +ann_c_binary(As, Segments) -> + #c_binary{segments = Segments, anno = As}. + + +%% @spec update_c_binary(Old::cerl(), Segments::[c_bitstr()]) -> cerl() +%% @see c_binary/1 + +-spec update_c_binary(c_binary(), [c_bitstr()]) -> c_binary(). + +update_c_binary(Node, Segments) -> + #c_binary{segments = Segments, anno = get_ann(Node)}. + + +%% @spec is_c_binary(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% binary-template; otherwise <code>false</code>. +%% +%% @see c_binary/1 + +-spec is_c_binary(cerl()) -> boolean(). + +is_c_binary(#c_binary{}) -> + true; +is_c_binary(_) -> + false. + + +%% @spec binary_segments(cerl()) -> [c_bitstr()] +%% +%% @doc Returns the list of segment subtrees of an abstract +%% binary-template. +%% +%% @see c_binary/1 +%% @see c_bitstr/5 + +-spec binary_segments(c_binary()) -> [c_bitstr()]. + +binary_segments(Node) -> + Node#c_binary.segments. + + +%% @spec c_bitstr(Value::cerl(), Size::cerl(), Unit::cerl(), +%% Type::cerl(), Flags::cerl()) -> c_bitstr() +%% +%% @doc Creates an abstract bit-string template. These can only occur as +%% components of an abstract binary-template (see {@link c_binary/1}). +%% The result represents "<code>#<<em>Value</em>>(<em>Size</em>, +%% <em>Unit</em>, <em>Type</em>, <em>Flags</em>)</code>", where +%% <code>Unit</code> must represent a positive integer constant, +%% <code>Type</code> must represent a constant atom (one of +%% <code>'integer'</code>, <code>'float'</code>, or +%% <code>'binary'</code>), and <code>Flags</code> must represent a +%% constant list <code>"[<em>F1</em>, ..., <em>Fn</em>]"</code> where +%% all the <code>Fi</code> are atoms. +%% +%% @see c_binary/1 +%% @see ann_c_bitstr/6 +%% @see update_c_bitstr/6 +%% @see is_c_bitstr/1 +%% @see bitstr_val/1 +%% @see bitstr_size/1 +%% @see bitstr_unit/1 +%% @see bitstr_type/1 +%% @see bitstr_flags/1 + +-spec c_bitstr(cerl(), cerl(), cerl(), cerl(), cerl()) -> c_bitstr(). + +c_bitstr(Val, Size, Unit, Type, Flags) -> + #c_bitstr{val = Val, size = Size, unit = Unit, type = Type, + flags = Flags}. + + +%% @spec c_bitstr(Value::cerl(), Size::cerl(), Type::cerl(), +%% Flags::cerl()) -> c_bitstr() +%% @equiv c_bitstr(Value, Size, abstract(1), Type, Flags) + +-spec c_bitstr(cerl(), cerl(), cerl(), cerl()) -> c_bitstr(). + +c_bitstr(Val, Size, Type, Flags) -> + c_bitstr(Val, Size, abstract(1), Type, Flags). + + +%% @spec c_bitstr(Value::cerl(), Type::cerl(), +%% Flags::cerl()) -> c_bitstr() +%% @equiv c_bitstr(Value, abstract(all), abstract(1), Type, Flags) + +-spec c_bitstr(cerl(), cerl(), cerl()) -> c_bitstr(). + +c_bitstr(Val, Type, Flags) -> + c_bitstr(Val, abstract(all), abstract(1), Type, Flags). + + +%% @spec ann_c_bitstr(As::anns(), Value::cerl(), Size::cerl(), +%% Unit::cerl(), Type::cerl(), Flags::cerl()) -> cerl() +%% @see c_bitstr/5 +%% @see ann_c_bitstr/5 + +-spec ann_c_bitstr(anns(), cerl(), cerl(), cerl(), cerl(), cerl()) -> + c_bitstr(). + +ann_c_bitstr(As, Val, Size, Unit, Type, Flags) -> + #c_bitstr{val = Val, size = Size, unit = Unit, type = Type, + flags = Flags, anno = As}. + +%% @spec ann_c_bitstr(As::anns(), Value::cerl(), Size::cerl(), +%% Type::cerl(), Flags::cerl()) -> c_bitstr() +%% @equiv ann_c_bitstr(As, Value, Size, abstract(1), Type, Flags) + +-spec ann_c_bitstr(anns(), cerl(), cerl(), cerl(), cerl()) -> c_bitstr(). + +ann_c_bitstr(As, Value, Size, Type, Flags) -> + ann_c_bitstr(As, Value, Size, abstract(1), Type, Flags). + + +%% @spec update_c_bitstr(Old::c_bitstr(), Value::cerl(), Size::cerl(), +%% Unit::cerl(), Type::cerl(), Flags::cerl()) -> c_bitstr() +%% @see c_bitstr/5 +%% @see update_c_bitstr/5 + +-spec update_c_bitstr(c_bitstr(), cerl(), cerl(), cerl(), cerl(), cerl()) -> + c_bitstr(). + +update_c_bitstr(Node, Val, Size, Unit, Type, Flags) -> + #c_bitstr{val = Val, size = Size, unit = Unit, type = Type, + flags = Flags, anno = get_ann(Node)}. + + +%% @spec update_c_bitstr(Old::c_bitstr(), Value::cerl(), Size::cerl(), +%% Type::cerl(), Flags::cerl()) -> c_bitstr() +%% @equiv update_c_bitstr(Node, Value, Size, abstract(1), Type, Flags) + +-spec update_c_bitstr(c_bitstr(), cerl(), cerl(), cerl(), cerl()) -> c_bitstr(). + +update_c_bitstr(Node, Value, Size, Type, Flags) -> + update_c_bitstr(Node, Value, Size, abstract(1), Type, Flags). + +%% @spec is_c_bitstr(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% bit-string template; otherwise <code>false</code>. +%% +%% @see c_bitstr/5 + +-spec is_c_bitstr(cerl()) -> boolean(). + +is_c_bitstr(#c_bitstr{}) -> + true; +is_c_bitstr(_) -> + false. + + +%% @spec bitstr_val(c_bitstr()) -> cerl() +%% +%% @doc Returns the value subtree of an abstract bit-string template. +%% +%% @see c_bitstr/5 + +-spec bitstr_val(c_bitstr()) -> cerl(). + +bitstr_val(Node) -> + Node#c_bitstr.val. + + +%% @spec bitstr_size(c_bitstr()) -> cerl() +%% +%% @doc Returns the size subtree of an abstract bit-string template. +%% +%% @see c_bitstr/5 + +-spec bitstr_size(c_bitstr()) -> cerl(). + +bitstr_size(Node) -> + Node#c_bitstr.size. + + +%% @spec bitstr_bitsize(c_bitstr()) -> any | all | utf | integer() +%% +%% @doc Returns the total size in bits of an abstract bit-string +%% template. If the size field is an integer literal, the result is the +%% product of the size and unit values; if the size field is the atom +%% literal <code>all</code>, the atom <code>all</code> is returned. +%% If the size is not a literal, the atom <code>any</code> is returned. +%% +%% @see c_bitstr/5 + +-spec bitstr_bitsize(c_bitstr()) -> 'all' | 'any' | 'utf' | non_neg_integer(). + +bitstr_bitsize(Node) -> + Size = Node#c_bitstr.size, + case is_literal(Size) of + true -> + case concrete(Size) of + all -> + all; + undefined -> + %% just an assertion below + "utf" ++ _ = atom_to_list(concrete(Node#c_bitstr.type)), + utf; + S when is_integer(S) -> + S * concrete(Node#c_bitstr.unit) + end; + false -> + any + end. + + +%% @spec bitstr_unit(c_bitstr()) -> cerl() +%% +%% @doc Returns the unit subtree of an abstract bit-string template. +%% +%% @see c_bitstr/5 + +-spec bitstr_unit(c_bitstr()) -> cerl(). + +bitstr_unit(Node) -> + Node#c_bitstr.unit. + + +%% @spec bitstr_type(c_bitstr()) -> cerl() +%% +%% @doc Returns the type subtree of an abstract bit-string template. +%% +%% @see c_bitstr/5 + +-spec bitstr_type(c_bitstr()) -> cerl(). + +bitstr_type(Node) -> + Node#c_bitstr.type. + + +%% @spec bitstr_flags(c_bitstr()) -> cerl() +%% +%% @doc Returns the flags subtree of an abstract bit-string template. +%% +%% @see c_bitstr/5 + +-spec bitstr_flags(c_bitstr()) -> cerl(). + +bitstr_flags(Node) -> + Node#c_bitstr.flags. + + +%% --------------------------------------------------------------------- + +%% @spec c_fun(Variables::[c_var()], Body::cerl()) -> c_fun() +%% +%% @doc Creates an abstract fun-expression. If <code>Variables</code> +%% is <code>[V1, ..., Vn]</code>, the result represents "<code>fun +%% (<em>V1</em>, ..., <em>Vn</em>) -> <em>Body</em></code>". All the +%% <code>Vi</code> must have type <code>var</code>. +%% +%% @see ann_c_fun/3 +%% @see update_c_fun/3 +%% @see is_c_fun/1 +%% @see fun_vars/1 +%% @see fun_body/1 +%% @see fun_arity/1 + +-spec c_fun([c_var()], cerl()) -> c_fun(). + +c_fun(Variables, Body) -> + #c_fun{vars = Variables, body = Body}. + + +%% @spec ann_c_fun(As::anns(), Variables::[c_var()], Body::cerl()) -> +%% c_fun() +%% @see c_fun/2 + +-spec ann_c_fun(anns(), [c_var()], cerl()) -> c_fun(). + +ann_c_fun(As, Variables, Body) -> + #c_fun{vars = Variables, body = Body, anno = As}. + + +%% @spec update_c_fun(Old::c_fun(), Variables::[c_var()], +%% Body::cerl()) -> c_fun() +%% @see c_fun/2 + +-spec update_c_fun(c_fun(), [c_var()], cerl()) -> c_fun(). + +update_c_fun(Node, Variables, Body) -> + #c_fun{vars = Variables, body = Body, anno = get_ann(Node)}. + + +%% @spec is_c_fun(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% fun-expression, otherwise <code>false</code>. +%% +%% @see c_fun/2 + +-spec is_c_fun(cerl()) -> boolean(). + +is_c_fun(#c_fun{}) -> + true; % Now this is fun! +is_c_fun(_) -> + false. + + +%% @spec fun_vars(c_fun()) -> [c_var()] +%% +%% @doc Returns the list of parameter subtrees of an abstract +%% fun-expression. +%% +%% @see c_fun/2 +%% @see fun_arity/1 + +-spec fun_vars(c_fun()) -> [c_var()]. + +fun_vars(Node) -> + Node#c_fun.vars. + + +%% @spec fun_body(c_fun()) -> cerl() +%% +%% @doc Returns the body subtree of an abstract fun-expression. +%% +%% @see c_fun/2 + +-spec fun_body(c_fun()) -> cerl(). + +fun_body(Node) -> + Node#c_fun.body. + + +%% @spec fun_arity(Node::c_fun()) -> arity() +%% +%% @doc Returns the number of parameter subtrees of an abstract +%% fun-expression. +%% +%% <p>Note: this is equivalent to <code>length(fun_vars(Node))</code>, +%% but potentially more efficient.</p> +%% +%% @see c_fun/2 +%% @see fun_vars/1 + +-spec fun_arity(c_fun()) -> arity(). + +fun_arity(Node) -> + length(fun_vars(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_seq(Argument::cerl(), Body::cerl()) -> c_seq() +%% +%% @doc Creates an abstract sequencing expression. The result +%% represents "<code>do <em>Argument</em> <em>Body</em></code>". +%% +%% @see ann_c_seq/3 +%% @see update_c_seq/3 +%% @see is_c_seq/1 +%% @see seq_arg/1 +%% @see seq_body/1 + +-spec c_seq(cerl(), cerl()) -> c_seq(). + +c_seq(Argument, Body) -> + #c_seq{arg = Argument, body = Body}. + + +%% @spec ann_c_seq(As::anns(), Argument::cerl(), Body::cerl()) -> c_seq() +%% +%% @see c_seq/2 + +-spec ann_c_seq(anns(), cerl(), cerl()) -> c_seq(). + +ann_c_seq(As, Argument, Body) -> + #c_seq{arg = Argument, body = Body, anno = As}. + + +%% @spec update_c_seq(Old::c_seq(), Argument::cerl(), Body::cerl()) -> +%% c_seq() +%% @see c_seq/2 + +-spec update_c_seq(c_seq(), cerl(), cerl()) -> c_seq(). + +update_c_seq(Node, Argument, Body) -> + #c_seq{arg = Argument, body = Body, anno = get_ann(Node)}. + + +%% @spec is_c_seq(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% sequencing expression, otherwise <code>false</code>. +%% +%% @see c_seq/2 + +-spec is_c_seq(cerl()) -> boolean(). + +is_c_seq(#c_seq{}) -> + true; +is_c_seq(_) -> + false. + + +%% @spec seq_arg(c_seq()) -> cerl() +%% +%% @doc Returns the argument subtree of an abstract sequencing +%% expression. +%% +%% @see c_seq/2 + +-spec seq_arg(c_seq()) -> cerl(). + +seq_arg(Node) -> + Node#c_seq.arg. + + +%% @spec seq_body(c_seq()) -> cerl() +%% +%% @doc Returns the body subtree of an abstract sequencing expression. +%% +%% @see c_seq/2 + +-spec seq_body(c_seq()) -> cerl(). + +seq_body(Node) -> + Node#c_seq.body. + + +%% --------------------------------------------------------------------- + +%% @spec c_let(Variables::[c_var()], Argument::cerl(), Body::cerl()) -> +%% c_let() +%% +%% @doc Creates an abstract let-expression. If <code>Variables</code> +%% is <code>[V1, ..., Vn]</code>, the result represents "<code>let +%% <<em>V1</em>, ..., <em>Vn</em>> = <em>Argument</em> in +%% <em>Body</em></code>". All the <code>Vi</code> must have type +%% <code>var</code>. +%% +%% @see ann_c_let/4 +%% @see update_c_let/4 +%% @see is_c_let/1 +%% @see let_vars/1 +%% @see let_arg/1 +%% @see let_body/1 +%% @see let_arity/1 + +-spec c_let([c_var()], cerl(), cerl()) -> c_let(). + +c_let(Variables, Argument, Body) -> + #c_let{vars = Variables, arg = Argument, body = Body}. + + +%% ann_c_let(As, Variables, Argument, Body) -> c_let() +%% @see c_let/3 + +-spec ann_c_let(anns(), [c_var()], cerl(), cerl()) -> c_let(). + +ann_c_let(As, Variables, Argument, Body) -> + #c_let{vars = Variables, arg = Argument, body = Body, anno = As}. + + +%% update_c_let(Old, Variables, Argument, Body) -> c_let() +%% @see c_let/3 + +-spec update_c_let(c_let(), [c_var()], cerl(), cerl()) -> c_let(). + +update_c_let(Node, Variables, Argument, Body) -> + #c_let{vars = Variables, arg = Argument, body = Body, + anno = get_ann(Node)}. + + +%% @spec is_c_let(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% let-expression, otherwise <code>false</code>. +%% +%% @see c_let/3 + +-spec is_c_let(cerl()) -> boolean(). + +is_c_let(#c_let{}) -> + true; +is_c_let(_) -> + false. + + +%% @spec let_vars(c_let()) -> [c_var()] +%% +%% @doc Returns the list of left-hand side variables of an abstract +%% let-expression. +%% +%% @see c_let/3 +%% @see let_arity/1 + +-spec let_vars(c_let()) -> [c_var()]. + +let_vars(Node) -> + Node#c_let.vars. + + +%% @spec let_arg(c_let()) -> cerl() +%% +%% @doc Returns the argument subtree of an abstract let-expression. +%% +%% @see c_let/3 + +-spec let_arg(c_let()) -> cerl(). + +let_arg(Node) -> + Node#c_let.arg. + + +%% @spec let_body(c_let()) -> cerl() +%% +%% @doc Returns the body subtree of an abstract let-expression. +%% +%% @see c_let/3 + +-spec let_body(c_let()) -> cerl(). + +let_body(Node) -> + Node#c_let.body. + + +%% @spec let_arity(Node::c_let()) -> non_neg_integer() +%% +%% @doc Returns the number of left-hand side variables of an abstract +%% let-expression. +%% +%% <p>Note: this is equivalent to <code>length(let_vars(Node))</code>, +%% but potentially more efficient.</p> +%% +%% @see c_let/3 +%% @see let_vars/1 + +-spec let_arity(c_let()) -> non_neg_integer(). + +let_arity(Node) -> + length(let_vars(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_letrec(Definitions::defs(), Body::cerl()) -> c_letrec() +%% +%% @doc Creates an abstract letrec-expression. If +%% <code>Definitions</code> is <code>[{V1, F1}, ..., {Vn, Fn}]</code>, +%% the result represents "<code>letrec <em>V1</em> = <em>F1</em> +%% ... <em>Vn</em> = <em>Fn</em> in <em>Body</em></code>. All the +%% <code>Vi</code> must have type <code>var</code> and represent +%% function names. All the <code>Fi</code> must have type +%% <code>'fun'</code>. +%% +%% @see ann_c_letrec/3 +%% @see update_c_letrec/3 +%% @see is_c_letrec/1 +%% @see letrec_defs/1 +%% @see letrec_body/1 +%% @see letrec_vars/1 + +-spec c_letrec(defs(), cerl()) -> c_letrec(). + +c_letrec(Defs, Body) -> + #c_letrec{defs = Defs, body = Body}. + + +%% @spec ann_c_letrec(As::anns(), Definitions::defs(), +%% Body::cerl()) -> c_letrec() +%% @see c_letrec/2 + +-spec ann_c_letrec(anns(), defs(), cerl()) -> c_letrec(). + +ann_c_letrec(As, Defs, Body) -> + #c_letrec{defs = Defs, body = Body, anno = As}. + + +%% @spec update_c_letrec(Old::c_letrec(), Definitions::defs(), +%% Body::cerl()) -> c_letrec() +%% @see c_letrec/2 + +-spec update_c_letrec(c_letrec(), defs(), cerl()) -> c_letrec(). + +update_c_letrec(Node, Defs, Body) -> + #c_letrec{defs = Defs, body = Body, anno = get_ann(Node)}. + + +%% @spec is_c_letrec(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% letrec-expression, otherwise <code>false</code>. +%% +%% @see c_letrec/2 + +-spec is_c_letrec(cerl()) -> boolean(). + +is_c_letrec(#c_letrec{}) -> + true; +is_c_letrec(_) -> + false. + + +%% @spec letrec_defs(Node::c_letrec()) -> defs() +%% +%% @doc Returns the list of definitions of an abstract +%% letrec-expression. If <code>Node</code> represents "<code>letrec +%% <em>V1</em> = <em>F1</em> ... <em>Vn</em> = <em>Fn</em> in +%% <em>Body</em></code>", the returned value is <code>[{V1, F1}, ..., +%% {Vn, Fn}]</code>. +%% +%% @see c_letrec/2 + +-spec letrec_defs(c_letrec()) -> defs(). + +letrec_defs(Node) -> + Node#c_letrec.defs. + + +%% @spec letrec_body(c_letrec()) -> cerl() +%% +%% @doc Returns the body subtree of an abstract letrec-expression. +%% +%% @see c_letrec/2 + +-spec letrec_body(c_letrec()) -> cerl(). + +letrec_body(Node) -> + Node#c_letrec.body. + + +%% @spec letrec_vars(c_letrec()) -> [cerl()] +%% +%% @doc Returns the list of left-hand side function variable subtrees +%% of a letrec-expression. If <code>Node</code> represents +%% "<code>letrec <em>V1</em> = <em>F1</em> ... <em>Vn</em> = +%% <em>Fn</em> in <em>Body</em></code>", the returned value is +%% <code>[V1, ..., Vn]</code>. +%% +%% @see c_letrec/2 + +-spec letrec_vars(c_letrec()) -> [cerl()]. + +letrec_vars(Node) -> + [F || {F, _} <- letrec_defs(Node)]. + + +%% --------------------------------------------------------------------- + +%% @spec c_case(Argument::cerl(), Clauses::[cerl()]) -> c_case() +%% +%% @doc Creates an abstract case-expression. If <code>Clauses</code> +%% is <code>[C1, ..., Cn]</code>, the result represents "<code>case +%% <em>Argument</em> of <em>C1</em> ... <em>Cn</em> +%% end</code>". <code>Clauses</code> must not be empty. +%% +%% @see ann_c_case/3 +%% @see update_c_case/3 +%% @see is_c_case/1 +%% @see c_clause/3 +%% @see case_arg/1 +%% @see case_clauses/1 +%% @see case_arity/1 + +-spec c_case(cerl(), [cerl()]) -> c_case(). + +c_case(Expr, Clauses) -> + #c_case{arg = Expr, clauses = Clauses}. + + +%% @spec ann_c_case(As::anns(), Argument::cerl(), +%% Clauses::[cerl()]) -> c_case() +%% @see c_case/2 + +-spec ann_c_case(anns(), cerl(), [cerl()]) -> c_case(). + +ann_c_case(As, Expr, Clauses) -> + #c_case{arg = Expr, clauses = Clauses, anno = As}. + + +%% @spec update_c_case(Old::cerl(), Argument::cerl(), +%% Clauses::[cerl()]) -> c_case() +%% @see c_case/2 + +-spec update_c_case(c_case(), cerl(), [cerl()]) -> c_case(). + +update_c_case(Node, Expr, Clauses) -> + #c_case{arg = Expr, clauses = Clauses, anno = get_ann(Node)}. + + +%% is_c_case(Node) -> boolean() +%% +%% Node = cerl() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% case-expression; otherwise <code>false</code>. +%% +%% @see c_case/2 + +-spec is_c_case(cerl()) -> boolean(). + +is_c_case(#c_case{}) -> + true; +is_c_case(_) -> + false. + + +%% @spec case_arg(c_case()) -> cerl() +%% +%% @doc Returns the argument subtree of an abstract case-expression. +%% +%% @see c_case/2 + +-spec case_arg(c_case()) -> cerl(). + +case_arg(Node) -> + Node#c_case.arg. + + +%% @spec case_clauses(c_case()) -> [cerl()] +%% +%% @doc Returns the list of clause subtrees of an abstract +%% case-expression. +%% +%% @see c_case/2 +%% @see case_arity/1 + +-spec case_clauses(c_case()) -> [cerl()]. + +case_clauses(Node) -> + Node#c_case.clauses. + + +%% @spec case_arity(Node::c_case()) -> non_neg_integer() +%% +%% @doc Equivalent to +%% <code>clause_arity(hd(case_clauses(Node)))</code>, but potentially +%% more efficient. +%% +%% @see c_case/2 +%% @see case_clauses/1 +%% @see clause_arity/1 + +-spec case_arity(c_case()) -> non_neg_integer(). + +case_arity(Node) -> + clause_arity(hd(case_clauses(Node))). + + +%% --------------------------------------------------------------------- + +%% @spec c_clause(Patterns::[cerl()], Body::cerl()) -> c_clause() +%% @equiv c_clause(Patterns, c_atom(true), Body) +%% @see c_atom/1 + +-spec c_clause([cerl()], cerl()) -> c_clause(). + +c_clause(Patterns, Body) -> + c_clause(Patterns, c_atom(true), Body). + + +%% @spec c_clause(Patterns::[cerl()], Guard::cerl(), Body::cerl()) -> +%% c_clause() +%% +%% @doc Creates an an abstract clause. If <code>Patterns</code> is +%% <code>[P1, ..., Pn]</code>, the result represents +%% "<code><<em>P1</em>, ..., <em>Pn</em>> when <em>Guard</em> -> +%% <em>Body</em></code>". +%% +%% @see c_clause/2 +%% @see ann_c_clause/4 +%% @see update_c_clause/4 +%% @see is_c_clause/1 +%% @see c_case/2 +%% @see c_receive/3 +%% @see clause_pats/1 +%% @see clause_guard/1 +%% @see clause_body/1 +%% @see clause_arity/1 +%% @see clause_vars/1 + +-spec c_clause([cerl()], cerl(), cerl()) -> c_clause(). + +c_clause(Patterns, Guard, Body) -> + #c_clause{pats = Patterns, guard = Guard, body = Body}. + + +%% @spec ann_c_clause(As::anns(), Patterns::[cerl()], +%% Body::cerl()) -> c_clause() +%% @equiv ann_c_clause(As, Patterns, c_atom(true), Body) +%% @see c_clause/3 + +-spec ann_c_clause(anns(), [cerl()], cerl()) -> c_clause(). + +ann_c_clause(As, Patterns, Body) -> + ann_c_clause(As, Patterns, c_atom(true), Body). + + +%% @spec ann_c_clause(As::anns(), Patterns::[cerl()], Guard::cerl(), +%% Body::cerl()) -> c_clause() +%% @see ann_c_clause/3 +%% @see c_clause/3 + +-spec ann_c_clause(anns(), [cerl()], cerl(), cerl()) -> c_clause(). + +ann_c_clause(As, Patterns, Guard, Body) -> + #c_clause{pats = Patterns, guard = Guard, body = Body, anno = As}. + + +%% @spec update_c_clause(Old::c_clause(), Patterns::[cerl()], +%% Guard::cerl(), Body::cerl()) -> c_clause() +%% @see c_clause/3 + +-spec update_c_clause(c_clause(), [cerl()], cerl(), cerl()) -> c_clause(). + +update_c_clause(Node, Patterns, Guard, Body) -> + #c_clause{pats = Patterns, guard = Guard, body = Body, + anno = get_ann(Node)}. + + +%% @spec is_c_clause(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% clause, otherwise <code>false</code>. +%% +%% @see c_clause/3 + +-spec is_c_clause(cerl()) -> boolean(). + +is_c_clause(#c_clause{}) -> + true; +is_c_clause(_) -> + false. + + +%% @spec clause_pats(c_clause()) -> [cerl()] +%% +%% @doc Returns the list of pattern subtrees of an abstract clause. +%% +%% @see c_clause/3 +%% @see clause_arity/1 + +-spec clause_pats(c_clause()) -> [cerl()]. + +clause_pats(Node) -> + Node#c_clause.pats. + + +%% @spec clause_guard(c_clause()) -> cerl() +%% +%% @doc Returns the guard subtree of an abstract clause. +%% +%% @see c_clause/3 + +-spec clause_guard(c_clause()) -> cerl(). + +clause_guard(Node) -> + Node#c_clause.guard. + + +%% @spec clause_body(c_clause()) -> cerl() +%% +%% @doc Returns the body subtree of an abstract clause. +%% +%% @see c_clause/3 + +-spec clause_body(c_clause()) -> cerl(). + +clause_body(Node) -> + Node#c_clause.body. + + +%% @spec clause_arity(Node::c_clause()) -> non_neg_integer() +%% +%% @doc Returns the number of pattern subtrees of an abstract clause. +%% +%% <p>Note: this is equivalent to +%% <code>length(clause_pats(Node))</code>, but potentially more +%% efficient.</p> +%% +%% @see c_clause/3 +%% @see clause_pats/1 + +-spec clause_arity(c_clause()) -> non_neg_integer(). + +clause_arity(Node) -> + length(clause_pats(Node)). + + +%% @spec clause_vars(c_clause()) -> [cerl()] +%% +%% @doc Returns the list of all abstract variables in the patterns of +%% an abstract clause. The order of listing is not defined. +%% +%% @see c_clause/3 +%% @see pat_list_vars/1 + +-spec clause_vars(c_clause()) -> [cerl()]. + +clause_vars(Clause) -> + pat_list_vars(clause_pats(Clause)). + + +%% @spec pat_vars(Pattern::cerl()) -> [cerl()] +%% +%% @doc Returns the list of all abstract variables in a pattern. An +%% exception is thrown if <code>Node</code> does not represent a +%% well-formed Core Erlang clause pattern. The order of listing is not +%% defined. +%% +%% @see pat_list_vars/1 +%% @see clause_vars/1 + +-spec pat_vars(cerl()) -> [cerl()]. + +pat_vars(Node) -> + pat_vars(Node, []). + +pat_vars(Node, Vs) -> + case type(Node) of + var -> + [Node | Vs]; + literal -> + Vs; + cons -> + pat_vars(cons_hd(Node), pat_vars(cons_tl(Node), Vs)); + tuple -> + pat_list_vars(tuple_es(Node), Vs); + map -> + pat_list_vars(map_es(Node), Vs); + map_pair -> + %% map_pair_key is not a pattern var, excluded + pat_list_vars([map_pair_op(Node),map_pair_val(Node)],Vs); + binary -> + pat_list_vars(binary_segments(Node), Vs); + bitstr -> + %% bitstr_size is not a pattern var, excluded + pat_vars(bitstr_val(Node), Vs); + alias -> + pat_vars(alias_pat(Node), [alias_var(Node) | Vs]) + end. + + +%% @spec pat_list_vars(Patterns::[cerl()]) -> [cerl()] +%% +%% @doc Returns the list of all abstract variables in the given +%% patterns. An exception is thrown if some element in +%% <code>Patterns</code> does not represent a well-formed Core Erlang +%% clause pattern. The order of listing is not defined. +%% +%% @see pat_vars/1 +%% @see clause_vars/1 + +-spec pat_list_vars([cerl()]) -> [cerl()]. + +pat_list_vars(Ps) -> + pat_list_vars(Ps, []). + +pat_list_vars([P | Ps], Vs) -> + pat_list_vars(Ps, pat_vars(P, Vs)); +pat_list_vars([], Vs) -> + Vs. + + +%% --------------------------------------------------------------------- + +%% @spec c_alias(Variable::c_var(), Pattern::cerl()) -> c_alias() +%% +%% @doc Creates an abstract pattern alias. The result represents +%% "<code><em>Variable</em> = <em>Pattern</em></code>". +%% +%% @see ann_c_alias/3 +%% @see update_c_alias/3 +%% @see is_c_alias/1 +%% @see alias_var/1 +%% @see alias_pat/1 +%% @see c_clause/3 + +-spec c_alias(c_var(), cerl()) -> c_alias(). + +c_alias(Var, Pattern) -> + #c_alias{var = Var, pat = Pattern}. + + +%% @spec ann_c_alias(As::anns(), Variable::c_var(), +%% Pattern::cerl()) -> c_alias() +%% @see c_alias/2 + +-spec ann_c_alias(anns(), c_var(), cerl()) -> c_alias(). + +ann_c_alias(As, Var, Pattern) -> + #c_alias{var = Var, pat = Pattern, anno = As}. + + +%% @spec update_c_alias(Old::cerl(), Variable::c_var(), +%% Pattern::cerl()) -> c_alias() +%% @see c_alias/2 + +-spec update_c_alias(c_alias(), c_var(), cerl()) -> c_alias(). + +update_c_alias(Node, Var, Pattern) -> + #c_alias{var = Var, pat = Pattern, anno = get_ann(Node)}. + + +%% @spec is_c_alias(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% pattern alias, otherwise <code>false</code>. +%% +%% @see c_alias/2 + +-spec is_c_alias(cerl()) -> boolean(). + +is_c_alias(#c_alias{}) -> + true; +is_c_alias(_) -> + false. + + +%% @spec alias_var(c_alias()) -> c_var() +%% +%% @doc Returns the variable subtree of an abstract pattern alias. +%% +%% @see c_alias/2 + +-spec alias_var(c_alias()) -> c_var(). + +alias_var(Node) -> + Node#c_alias.var. + + +%% @spec alias_pat(c_alias()) -> cerl() +%% +%% @doc Returns the pattern subtree of an abstract pattern alias. +%% +%% @see c_alias/2 + +-spec alias_pat(c_alias()) -> cerl(). + +alias_pat(Node) -> + Node#c_alias.pat. + + +%% --------------------------------------------------------------------- + +%% @spec c_receive(Clauses::[cerl()]) -> c_receive() +%% @equiv c_receive(Clauses, c_atom(infinity), c_atom(true)) +%% @see c_atom/1 + +-spec c_receive([cerl()]) -> c_receive(). + +c_receive(Clauses) -> + c_receive(Clauses, c_atom(infinity), c_atom(true)). + + +%% @spec c_receive(Clauses::[cerl()], Timeout::cerl(), +%% Action::cerl()) -> c_receive() +%% +%% @doc Creates an abstract receive-expression. If +%% <code>Clauses</code> is <code>[C1, ..., Cn]</code>, the result +%% represents "<code>receive <em>C1</em> ... <em>Cn</em> after +%% <em>Timeout</em> -> <em>Action</em> end</code>". +%% +%% @see c_receive/1 +%% @see ann_c_receive/4 +%% @see update_c_receive/4 +%% @see is_c_receive/1 +%% @see receive_clauses/1 +%% @see receive_timeout/1 +%% @see receive_action/1 + +-spec c_receive([cerl()], cerl(), cerl()) -> c_receive(). + +c_receive(Clauses, Timeout, Action) -> + #c_receive{clauses = Clauses, timeout = Timeout, action = Action}. + + +%% @spec ann_c_receive(As::anns(), Clauses::[cerl()]) -> c_receive() +%% @equiv ann_c_receive(As, Clauses, c_atom(infinity), c_atom(true)) +%% @see c_receive/3 +%% @see c_atom/1 + +-spec ann_c_receive(anns(), [cerl()]) -> c_receive(). + +ann_c_receive(As, Clauses) -> + ann_c_receive(As, Clauses, c_atom(infinity), c_atom(true)). + + +%% @spec ann_c_receive(As::anns(), Clauses::[cerl()], +%% Timeout::cerl(), Action::cerl()) -> c_receive() +%% @see ann_c_receive/2 +%% @see c_receive/3 + +-spec ann_c_receive(anns(), [cerl()], cerl(), cerl()) -> c_receive(). + +ann_c_receive(As, Clauses, Timeout, Action) -> + #c_receive{clauses = Clauses, timeout = Timeout, action = Action, + anno = As}. + + +%% @spec update_c_receive(Old::cerl(), Clauses::[cerl()], +%% Timeout::cerl(), Action::cerl()) -> c_receive() +%% @see c_receive/3 + +-spec update_c_receive(c_receive(), [cerl()], cerl(), cerl()) -> c_receive(). + +update_c_receive(Node, Clauses, Timeout, Action) -> + #c_receive{clauses = Clauses, timeout = Timeout, action = Action, + anno = get_ann(Node)}. + + +%% @spec is_c_receive(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% receive-expression, otherwise <code>false</code>. +%% +%% @see c_receive/3 + +-spec is_c_receive(cerl()) -> boolean(). + +is_c_receive(#c_receive{}) -> + true; +is_c_receive(_) -> + false. + + +%% @spec receive_clauses(c_receive()) -> [cerl()] +%% +%% @doc Returns the list of clause subtrees of an abstract +%% receive-expression. +%% +%% @see c_receive/3 + +-spec receive_clauses(c_receive()) -> [cerl()]. + +receive_clauses(Node) -> + Node#c_receive.clauses. + + +%% @spec receive_timeout(c_receive()) -> cerl() +%% +%% @doc Returns the timeout subtree of an abstract receive-expression. +%% +%% @see c_receive/3 + +-spec receive_timeout(c_receive()) -> cerl(). + +receive_timeout(Node) -> + Node#c_receive.timeout. + + +%% @spec receive_action(c_receive()) -> cerl() +%% +%% @doc Returns the action subtree of an abstract receive-expression. +%% +%% @see c_receive/3 + +-spec receive_action(c_receive()) -> cerl(). + +receive_action(Node) -> + Node#c_receive.action. + + +%% --------------------------------------------------------------------- + +%% @spec c_apply(Operator::c_var(), Arguments::[cerl()]) -> c_apply() +%% +%% @doc Creates an abstract function application. If +%% <code>Arguments</code> is <code>[A1, ..., An]</code>, the result +%% represents "<code>apply <em>Operator</em>(<em>A1</em>, ..., +%% <em>An</em>)</code>". +%% +%% @see ann_c_apply/3 +%% @see update_c_apply/3 +%% @see is_c_apply/1 +%% @see apply_op/1 +%% @see apply_args/1 +%% @see apply_arity/1 +%% @see c_call/3 +%% @see c_primop/2 + +-spec c_apply(c_var(), [cerl()]) -> c_apply(). + +c_apply(Operator, Arguments) -> + #c_apply{op = Operator, args = Arguments}. + + +%% @spec ann_c_apply(As::anns(), Operator::c_var(), +%% Arguments::[cerl()]) -> c_apply() +%% @see c_apply/2 + +-spec ann_c_apply(anns(), c_var(), [cerl()]) -> c_apply(). + +ann_c_apply(As, Operator, Arguments) -> + #c_apply{op = Operator, args = Arguments, anno = As}. + + +%% @spec update_c_apply(Old::c_apply(), Operator::cerl(), +%% Arguments::[cerl()]) -> c_apply() +%% @see c_apply/2 + +-spec update_c_apply(c_apply(), c_var(), [cerl()]) -> c_apply(). + +update_c_apply(Node, Operator, Arguments) -> + #c_apply{op = Operator, args = Arguments, anno = get_ann(Node)}. + + +%% @spec is_c_apply(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% function application, otherwise <code>false</code>. +%% +%% @see c_apply/2 + +-spec is_c_apply(cerl()) -> boolean(). + +is_c_apply(#c_apply{}) -> + true; +is_c_apply(_) -> + false. + + +%% @spec apply_op(c_apply()) -> c_var() +%% +%% @doc Returns the operator subtree of an abstract function +%% application. +%% +%% @see c_apply/2 + +-spec apply_op(c_apply()) -> c_var(). + +apply_op(Node) -> + Node#c_apply.op. + + +%% @spec apply_args(c_apply()) -> [cerl()] +%% +%% @doc Returns the list of argument subtrees of an abstract function +%% application. +%% +%% @see c_apply/2 +%% @see apply_arity/1 + +-spec apply_args(c_apply()) -> [cerl()]. + +apply_args(Node) -> + Node#c_apply.args. + + +%% @spec apply_arity(Node::c_apply()) -> arity() +%% +%% @doc Returns the number of argument subtrees of an abstract +%% function application. +%% +%% <p>Note: this is equivalent to +%% <code>length(apply_args(Node))</code>, but potentially more +%% efficient.</p> +%% +%% @see c_apply/2 +%% @see apply_args/1 + +-spec apply_arity(c_apply()) -> arity(). + +apply_arity(Node) -> + length(apply_args(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_call(Module::cerl(), Name::cerl(), Arguments::[cerl()]) -> +%% c_call() +%% +%% @doc Creates an abstract inter-module call. If +%% <code>Arguments</code> is <code>[A1, ..., An]</code>, the result +%% represents "<code>call <em>Module</em>:<em>Name</em>(<em>A1</em>, +%% ..., <em>An</em>)</code>". +%% +%% @see ann_c_call/4 +%% @see update_c_call/4 +%% @see is_c_call/1 +%% @see call_module/1 +%% @see call_name/1 +%% @see call_args/1 +%% @see call_arity/1 +%% @see c_apply/2 +%% @see c_primop/2 + +-spec c_call(cerl(), cerl(), [cerl()]) -> c_call(). + +c_call(Module, Name, Arguments) -> + #c_call{module = Module, name = Name, args = Arguments}. + + +%% @spec ann_c_call(As::anns(), Module::cerl(), Name::cerl(), +%% Arguments::[cerl()]) -> c_call() +%% @see c_call/3 + +-spec ann_c_call(anns(), cerl(), cerl(), [cerl()]) -> c_call(). + +ann_c_call(As, Module, Name, Arguments) -> + #c_call{module = Module, name = Name, args = Arguments, anno = As}. + + +%% @spec update_c_call(Old::cerl(), Module::cerl(), Name::cerl(), +%% Arguments::[cerl()]) -> c_call() +%% @see c_call/3 + +-spec update_c_call(cerl(), cerl(), cerl(), [cerl()]) -> c_call(). + +update_c_call(Node, Module, Name, Arguments) -> + #c_call{module = Module, name = Name, args = Arguments, + anno = get_ann(Node)}. + + +%% @spec is_c_call(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% inter-module call expression; otherwise <code>false</code>. +%% +%% @see c_call/3 + +-spec is_c_call(cerl()) -> boolean(). + +is_c_call(#c_call{}) -> + true; +is_c_call(_) -> + false. + + +%% @spec call_module(c_call()) -> cerl() +%% +%% @doc Returns the module subtree of an abstract inter-module call. +%% +%% @see c_call/3 + +-spec call_module(c_call()) -> cerl(). + +call_module(Node) -> + Node#c_call.module. + + +%% @spec call_name(c_call()) -> cerl() +%% +%% @doc Returns the name subtree of an abstract inter-module call. +%% +%% @see c_call/3 + +-spec call_name(c_call()) -> cerl(). + +call_name(Node) -> + Node#c_call.name. + + +%% @spec call_args(c_call()) -> [cerl()] +%% +%% @doc Returns the list of argument subtrees of an abstract +%% inter-module call. +%% +%% @see c_call/3 +%% @see call_arity/1 + +-spec call_args(c_call()) -> [cerl()]. + +call_args(Node) -> + Node#c_call.args. + + +%% @spec call_arity(Node::c_call()) -> arity() +%% +%% @doc Returns the number of argument subtrees of an abstract +%% inter-module call. +%% +%% <p>Note: this is equivalent to +%% <code>length(call_args(Node))</code>, but potentially more +%% efficient.</p> +%% +%% @see c_call/3 +%% @see call_args/1 + +-spec call_arity(c_call()) -> arity(). + +call_arity(Node) -> + length(call_args(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_primop(Name::c_literal(), Arguments::[cerl()]) -> c_primop() +%% +%% @doc Creates an abstract primitive operation call. If +%% <code>Arguments</code> is <code>[A1, ..., An]</code>, the result +%% represents "<code>primop <em>Name</em>(<em>A1</em>, ..., +%% <em>An</em>)</code>". <code>Name</code> must be an atom literal. +%% +%% @see ann_c_primop/3 +%% @see update_c_primop/3 +%% @see is_c_primop/1 +%% @see primop_name/1 +%% @see primop_args/1 +%% @see primop_arity/1 +%% @see c_apply/2 +%% @see c_call/3 + +-spec c_primop(c_literal(), [cerl()]) -> c_primop(). + +c_primop(Name, Arguments) -> + #c_primop{name = Name, args = Arguments}. + + +%% @spec ann_c_primop(As::anns(), Name::c_literal(), +%% Arguments::[cerl()]) -> c_primop() +%% @see c_primop/2 + +-spec ann_c_primop(anns(), c_literal(), [cerl()]) -> c_primop(). + +ann_c_primop(As, Name, Arguments) -> + #c_primop{name = Name, args = Arguments, anno = As}. + + +%% @spec update_c_primop(Old::cerl(), Name::c_literal(), +%% Arguments::[cerl()]) -> c_primop() +%% @see c_primop/2 + +-spec update_c_primop(cerl(), c_literal(), [cerl()]) -> c_primop(). + +update_c_primop(Node, Name, Arguments) -> + #c_primop{name = Name, args = Arguments, anno = get_ann(Node)}. + + +%% @spec is_c_primop(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% primitive operation call, otherwise <code>false</code>. +%% +%% @see c_primop/2 + +-spec is_c_primop(cerl()) -> boolean(). + +is_c_primop(#c_primop{}) -> + true; +is_c_primop(_) -> + false. + + +%% @spec primop_name(c_primop()) -> c_literal() +%% +%% @doc Returns the name subtree of an abstract primitive operation +%% call. +%% +%% @see c_primop/2 + +-spec primop_name(c_primop()) -> c_literal(). + +primop_name(Node) -> + Node#c_primop.name. + + +%% @spec primop_args(c_primop()) -> [cerl()] +%% +%% @doc Returns the list of argument subtrees of an abstract primitive +%% operation call. +%% +%% @see c_primop/2 +%% @see primop_arity/1 + +-spec primop_args(c_primop()) -> [cerl()]. + +primop_args(Node) -> + Node#c_primop.args. + + +%% @spec primop_arity(Node::c_primop()) -> arity() +%% +%% @doc Returns the number of argument subtrees of an abstract +%% primitive operation call. +%% +%% <p>Note: this is equivalent to +%% <code>length(primop_args(Node))</code>, but potentially more +%% efficient.</p> +%% +%% @see c_primop/2 +%% @see primop_args/1 + +-spec primop_arity(c_primop()) -> arity(). + +primop_arity(Node) -> + length(primop_args(Node)). + + +%% --------------------------------------------------------------------- + +%% @spec c_try(Argument::cerl(), Variables::[c_var()], Body::cerl(), +%% ExceptionVars::[c_var()], Handler::cerl()) -> c_try() +%% +%% @doc Creates an abstract try-expression. If <code>Variables</code> is +%% <code>[V1, ..., Vn]</code> and <code>ExceptionVars</code> is +%% <code>[X1, ..., Xm]</code>, the result represents "<code>try +%% <em>Argument</em> of <<em>V1</em>, ..., <em>Vn</em>> -> +%% <em>Body</em> catch <<em>X1</em>, ..., <em>Xm</em>> -> +%% <em>Handler</em></code>". All the <code>Vi</code> and <code>Xi</code> +%% must have type <code>var</code>. +%% +%% @see ann_c_try/6 +%% @see update_c_try/6 +%% @see is_c_try/1 +%% @see try_arg/1 +%% @see try_vars/1 +%% @see try_body/1 +%% @see c_catch/1 + +-spec c_try(cerl(), [c_var()], cerl(), [c_var()], cerl()) -> c_try(). + +c_try(Expr, Vs, Body, Evs, Handler) -> + #c_try{arg = Expr, vars = Vs, body = Body, + evars = Evs, handler = Handler}. + + +%% @spec ann_c_try(As::[term()], Expression::cerl(), +%% Variables::[c_var()], Body::cerl(), +%% EVars::[c_var()], Handler::cerl()) -> c_try() +%% @see c_try/5 + +-spec ann_c_try(anns(), cerl(), [c_var()], cerl(), [c_var()], cerl()) -> + c_try(). + +ann_c_try(As, Expr, Vs, Body, Evs, Handler) -> + #c_try{arg = Expr, vars = Vs, body = Body, + evars = Evs, handler = Handler, anno = As}. + + +%% @spec update_c_try(Old::c_try(), Expression::cerl(), +%% Variables::[c_var()], Body::cerl(), +%% EVars::[c_var()], Handler::cerl()) -> cerl() +%% @see c_try/5 + +-spec update_c_try(c_try(), cerl(), [c_var()], cerl(), [c_var()], cerl()) -> + c_try(). + +update_c_try(Node, Expr, Vs, Body, Evs, Handler) -> + #c_try{arg = Expr, vars = Vs, body = Body, + evars = Evs, handler = Handler, anno = get_ann(Node)}. + + +%% @spec is_c_try(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% try-expression, otherwise <code>false</code>. +%% +%% @see c_try/5 + +-spec is_c_try(cerl()) -> boolean(). + +is_c_try(#c_try{}) -> + true; +is_c_try(_) -> + false. + + +%% @spec try_arg(c_try()) -> cerl() +%% +%% @doc Returns the expression subtree of an abstract try-expression. +%% +%% @see c_try/5 + +-spec try_arg(c_try()) -> cerl(). + +try_arg(Node) -> + Node#c_try.arg. + + +%% @spec try_vars(c_try()) -> [c_var()] +%% +%% @doc Returns the list of success variable subtrees of an abstract +%% try-expression. +%% +%% @see c_try/5 + +-spec try_vars(c_try()) -> [c_var()]. + +try_vars(Node) -> + Node#c_try.vars. + + +%% @spec try_body(c_try()) -> cerl() +%% +%% @doc Returns the success body subtree of an abstract try-expression. +%% +%% @see c_try/5 + +-spec try_body(c_try()) -> cerl(). + +try_body(Node) -> + Node#c_try.body. + + +%% @spec try_evars(c_try()) -> [c_var()] +%% +%% @doc Returns the list of exception variable subtrees of an abstract +%% try-expression. +%% +%% @see c_try/5 + +-spec try_evars(c_try()) -> [c_var()]. + +try_evars(Node) -> + Node#c_try.evars. + + +%% @spec try_handler(c_try()) -> cerl() +%% +%% @doc Returns the exception body subtree of an abstract +%% try-expression. +%% +%% @see c_try/5 + +-spec try_handler(c_try()) -> cerl(). + +try_handler(Node) -> + Node#c_try.handler. + + +%% --------------------------------------------------------------------- + +%% @spec c_catch(Body::cerl()) -> c_catch() +%% +%% @doc Creates an abstract catch-expression. The result represents +%% "<code>catch <em>Body</em></code>". +%% +%% <p>Note: catch-expressions can be rewritten as try-expressions, and +%% will eventually be removed from Core Erlang.</p> +%% +%% @see ann_c_catch/2 +%% @see update_c_catch/2 +%% @see is_c_catch/1 +%% @see catch_body/1 +%% @see c_try/5 + +-spec c_catch(cerl()) -> c_catch(). + +c_catch(Body) -> + #c_catch{body = Body}. + + +%% @spec ann_c_catch(As::anns(), Body::cerl()) -> c_catch() +%% @see c_catch/1 + +-spec ann_c_catch(anns(), cerl()) -> c_catch(). + +ann_c_catch(As, Body) -> + #c_catch{body = Body, anno = As}. + + +%% @spec update_c_catch(Old::c_catch(), Body::cerl()) -> c_catch() +%% @see c_catch/1 + +-spec update_c_catch(c_catch(), cerl()) -> c_catch(). + +update_c_catch(Node, Body) -> + #c_catch{body = Body, anno = get_ann(Node)}. + + +%% @spec is_c_catch(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> is an abstract +%% catch-expression, otherwise <code>false</code>. +%% +%% @see c_catch/1 + +-spec is_c_catch(cerl()) -> boolean(). + +is_c_catch(#c_catch{}) -> + true; +is_c_catch(_) -> + false. + + +%% @spec catch_body(Node::c_catch()) -> cerl() +%% +%% @doc Returns the body subtree of an abstract catch-expression. +%% +%% @see c_catch/1 + +-spec catch_body(c_catch()) -> cerl(). + +catch_body(Node) -> + Node#c_catch.body. + + +%% --------------------------------------------------------------------- + +%% @spec to_records(Tree::cerl()) -> record(record_types()) +%% +%% @doc Translates an abstract syntax tree to a corresponding explicit +%% record representation. The records are defined in the file +%% "<code>cerl.hrl</code>". +%% +%% @see type/1 +%% @see from_records/1 + +-spec to_records(cerl()) -> cerl(). + +to_records(Node) -> + Node. + +%% @spec from_records(Tree::record(record_types())) -> cerl() +%% +%% record_types() = c_alias | c_apply | c_binary | c_bitstr | c_call | +%% c_case | c_catch | c_clause | c_cons | c_fun | +%% c_let | c_letrec | c_literal | c_map | c_map_pair | +%% c_module | c_primop | c_receive | c_seq | +%% c_try | c_tuple | c_values | c_var +%% +%% @doc Translates an explicit record representation to a +%% corresponding abstract syntax tree. The records are defined in the +%% file "<code>core_parse.hrl</code>". +%% +%% @see type/1 +%% @see to_records/1 + +-spec from_records(cerl()) -> cerl(). + +from_records(Node) -> + Node. + + +%% --------------------------------------------------------------------- + +%% @spec is_data(Node::cerl()) -> boolean() +%% +%% @doc Returns <code>true</code> if <code>Node</code> represents a +%% data constructor, otherwise <code>false</code>. Data constructors +%% are cons cells, tuples, and atomic literals. +%% +%% @see data_type/1 +%% @see data_es/1 +%% @see data_arity/1 + +-spec is_data(cerl()) -> boolean(). + +is_data(#c_literal{}) -> + true; +is_data(#c_cons{}) -> + true; +is_data(#c_tuple{}) -> + true; +is_data(_) -> + false. + + +%% @spec data_type(Node::cerl()) -> dtype() +%% +%% dtype() = cons | tuple | {atomic, Value} +%% Value = integer() | float() | atom() | [] +%% +%% @doc Returns a type descriptor for a data constructor +%% node. (Cf. <code>is_data/1</code>.) This is mainly useful for +%% comparing types and for constructing new nodes of the same type +%% (cf. <code>make_data/2</code>). If <code>Node</code> represents an +%% integer, floating-point number, atom or empty list, the result is +%% <code>{atomic, Value}</code>, where <code>Value</code> is the value +%% of <code>concrete(Node)</code>, otherwise the result is either +%% <code>cons</code> or <code>tuple</code>. +%% +%% <p>Type descriptors can be compared for equality or order (in the +%% Erlang term order), but remember that floating-point values should +%% in general never be tested for equality.</p> +%% +%% @see is_data/1 +%% @see make_data/2 +%% @see type/1 +%% @see concrete/1 + +-type value() :: integer() | float() | atom() | []. +-type dtype() :: 'cons' | 'tuple' | {'atomic', value()}. +-type c_lct() :: c_literal() | c_cons() | c_tuple(). + +-spec data_type(c_lct()) -> dtype(). + +data_type(#c_literal{val = V}) -> + case V of + [_ | _] -> + cons; + _ when is_tuple(V) -> + tuple; + _ -> + {atomic, V} + end; +data_type(#c_cons{}) -> + cons; +data_type(#c_tuple{}) -> + tuple. + +%% @spec data_es(Node::cerl()) -> [cerl()] +%% +%% @doc Returns the list of subtrees of a data constructor node. If +%% the arity of the constructor is zero, the result is the empty list. +%% +%% <p>Note: if <code>data_type(Node)</code> is <code>cons</code>, the +%% number of subtrees is exactly two. If <code>data_type(Node)</code> +%% is <code>{atomic, Value}</code>, the number of subtrees is +%% zero.</p> +%% +%% @see is_data/1 +%% @see data_type/1 +%% @see data_arity/1 +%% @see make_data/2 + +-spec data_es(c_lct()) -> [cerl()]. + +data_es(#c_literal{val = V}) -> + case V of + [Head | Tail] -> + [#c_literal{val = Head}, #c_literal{val = Tail}]; + _ when is_tuple(V) -> + make_lit_list(tuple_to_list(V)); + _ -> + [] + end; +data_es(#c_cons{hd = H, tl = T}) -> + [H, T]; +data_es(#c_tuple{es = Es}) -> + Es. + +%% @spec data_arity(Node::cerl()) -> non_neg_integer() +%% +%% @doc Returns the number of subtrees of a data constructor +%% node. This is equivalent to <code>length(data_es(Node))</code>, but +%% potentially more efficient. +%% +%% @see is_data/1 +%% @see data_es/1 + +-spec data_arity(c_lct()) -> non_neg_integer(). + +data_arity(#c_literal{val = V}) -> + case V of + [_ | _] -> + 2; + _ when is_tuple(V) -> + tuple_size(V); + _ -> + 0 + end; +data_arity(#c_cons{}) -> + 2; +data_arity(#c_tuple{es = Es}) -> + length(Es). + + +%% @spec make_data(Type::dtype(), Elements::[cerl()]) -> cerl() +%% +%% @doc Creates a data constructor node with the specified type and +%% subtrees. (Cf. <code>data_type/1</code>.) An exception is thrown +%% if the length of <code>Elements</code> is invalid for the given +%% <code>Type</code>; see <code>data_es/1</code> for arity constraints +%% on constructor types. +%% +%% @see data_type/1 +%% @see data_es/1 +%% @see ann_make_data/3 +%% @see update_data/3 +%% @see make_data_skel/2 + +-spec make_data(dtype(), [cerl()]) -> c_lct(). + +make_data(CType, Es) -> + ann_make_data([], CType, Es). + + +%% @spec ann_make_data(As::anns(), Type::dtype(), +%% Elements::[cerl()]) -> cerl() +%% @see make_data/2 + +-spec ann_make_data(anns(), dtype(), [cerl()]) -> c_lct(). + +ann_make_data(As, {atomic, V}, []) -> #c_literal{val = V, anno = As}; +ann_make_data(As, cons, [H, T]) -> ann_c_cons(As, H, T); +ann_make_data(As, tuple, Es) -> ann_c_tuple(As, Es). + +%% @spec update_data(Old::cerl(), Type::dtype(), +%% Elements::[cerl()]) -> cerl() +%% @see make_data/2 + +-spec update_data(cerl(), dtype(), [cerl()]) -> c_lct(). + +update_data(Node, CType, Es) -> + ann_make_data(get_ann(Node), CType, Es). + + +%% @spec make_data_skel(Type::dtype(), Elements::[cerl()]) -> cerl() +%% +%% @doc Like <code>make_data/2</code>, but analogous to +%% <code>c_tuple_skel/1</code> and <code>c_cons_skel/2</code>. +%% +%% @see ann_make_data_skel/3 +%% @see update_data_skel/3 +%% @see make_data/2 +%% @see c_tuple_skel/1 +%% @see c_cons_skel/2 + +-spec make_data_skel(dtype(), [cerl()]) -> c_lct(). + +make_data_skel(CType, Es) -> + ann_make_data_skel([], CType, Es). + + +%% @spec ann_make_data_skel(As::anns(), Type::dtype(), +%% Elements::[cerl()]) -> cerl() +%% @see make_data_skel/2 + +-spec ann_make_data_skel(anns(), dtype(), [cerl()]) -> c_lct(). + +ann_make_data_skel(As, {atomic, V}, []) -> #c_literal{val = V, anno = As}; +ann_make_data_skel(As, cons, [H, T]) -> ann_c_cons_skel(As, H, T); +ann_make_data_skel(As, tuple, Es) -> ann_c_tuple_skel(As, Es). + + +%% @spec update_data_skel(Old::cerl(), Type::dtype(), +%% Elements::[cerl()]) -> cerl() +%% @see make_data_skel/2 + +-spec update_data_skel(cerl(), dtype(), [cerl()]) -> c_lct(). + +update_data_skel(Node, CType, Es) -> + ann_make_data_skel(get_ann(Node), CType, Es). + + +%% --------------------------------------------------------------------- + +%% @spec subtrees(Node::cerl()) -> [[cerl()]] +%% +%% @doc Returns the grouped list of all subtrees of a node. If +%% <code>Node</code> is a leaf node (cf. <code>is_leaf/1</code>), this +%% is the empty list, otherwise the result is always a nonempty list, +%% containing the lists of subtrees of <code>Node</code>, in +%% left-to-right order as they occur in the printed program text, and +%% grouped by category. Often, each group contains only a single +%% subtree. +%% +%% <p>Depending on the type of <code>Node</code>, the size of some +%% groups may be variable (e.g., the group consisting of all the +%% elements of a tuple), while others always contain the same number +%% of elements - usually exactly one (e.g., the group containing the +%% argument expression of a case-expression). Note, however, that the +%% exact structure of the returned list (for a given node type) should +%% in general not be depended upon, since it might be subject to +%% change without notice.</p> +%% +%% <p>The function <code>subtrees/1</code> and the constructor functions +%% <code>make_tree/2</code> and <code>update_tree/2</code> can be a +%% great help if one wants to traverse a syntax tree, visiting all its +%% subtrees, but treat nodes of the tree in a uniform way in most or all +%% cases. Using these functions makes this simple, and also assures that +%% your code is not overly sensitive to extensions of the syntax tree +%% data type, because any node types not explicitly handled by your code +%% can be left to a default case.</p> +%% +%% <p>For example: +%% <pre> +%% postorder(F, Tree) -> +%% F(case subtrees(Tree) of +%% [] -> Tree; +%% List -> update_tree(Tree, +%% [[postorder(F, Subtree) +%% || Subtree <- Group] +%% || Group <- List]) +%% end). +%% </pre> +%% maps the function <code>F</code> on <code>Tree</code> and all its +%% subtrees, doing a post-order traversal of the syntax tree. (Note +%% the use of <code>update_tree/2</code> to preserve annotations.) For +%% a simple function like: +%% <pre> +%% f(Node) -> +%% case type(Node) of +%% atom -> atom("a_" ++ atom_name(Node)); +%% _ -> Node +%% end. +%% </pre> +%% the call <code>postorder(fun f/1, Tree)</code> will yield a new +%% representation of <code>Tree</code> in which all atom names have +%% been extended with the prefix "a_", but nothing else (including +%% annotations) has been changed.</p> +%% +%% @see is_leaf/1 +%% @see make_tree/2 +%% @see update_tree/2 + +-spec subtrees(cerl()) -> [[cerl()]]. + +subtrees(T) -> + case is_leaf(T) of + true -> + []; + false -> + case type(T) of + values -> + [values_es(T)]; + binary -> + [binary_segments(T)]; + bitstr -> + [[bitstr_val(T)], [bitstr_size(T)], + [bitstr_unit(T)], [bitstr_type(T)], + [bitstr_flags(T)]]; + cons -> + [[cons_hd(T)], [cons_tl(T)]]; + tuple -> + [tuple_es(T)]; + map -> + [map_es(T)]; + map_pair -> + [[map_pair_op(T)],[map_pair_key(T)],[map_pair_val(T)]]; + 'let' -> + [let_vars(T), [let_arg(T)], [let_body(T)]]; + seq -> + [[seq_arg(T)], [seq_body(T)]]; + apply -> + [[apply_op(T)], apply_args(T)]; + call -> + [[call_module(T)], [call_name(T)], + call_args(T)]; + primop -> + [[primop_name(T)], primop_args(T)]; + 'case' -> + [[case_arg(T)], case_clauses(T)]; + clause -> + [clause_pats(T), [clause_guard(T)], + [clause_body(T)]]; + alias -> + [[alias_var(T)], [alias_pat(T)]]; + 'fun' -> + [fun_vars(T), [fun_body(T)]]; + 'receive' -> + [receive_clauses(T), [receive_timeout(T)], + [receive_action(T)]]; + 'try' -> + [[try_arg(T)], try_vars(T), [try_body(T)], + try_evars(T), [try_handler(T)]]; + 'catch' -> + [[catch_body(T)]]; + letrec -> + Es = unfold_tuples(letrec_defs(T)), + [Es, [letrec_body(T)]]; + module -> + As = unfold_tuples(module_attrs(T)), + Es = unfold_tuples(module_defs(T)), + [[module_name(T)], module_exports(T), As, Es] + end + end. + + +%% @spec update_tree(Old::cerl(), Groups::[[cerl()]]) -> cerl() +%% +%% @doc Creates a syntax tree with the given subtrees, and the same +%% type and annotations as the <code>Old</code> node. This is +%% equivalent to <code>ann_make_tree(get_ann(Node), type(Node), +%% Groups)</code>, but potentially more efficient. +%% +%% @see update_tree/3 +%% @see ann_make_tree/3 +%% @see get_ann/1 +%% @see type/1 + +-spec update_tree(cerl(), [[cerl()],...]) -> cerl(). + +update_tree(Node, Gs) -> + ann_make_tree(get_ann(Node), type(Node), Gs). + + +%% @spec update_tree(Old::cerl(), Type::ctype(), Groups::[[cerl()]]) -> +%% cerl() +%% +%% @doc Creates a syntax tree with the given type and subtrees, and +%% the same annotations as the <code>Old</code> node. This is +%% equivalent to <code>ann_make_tree(get_ann(Node), Type, +%% Groups)</code>, but potentially more efficient. +%% +%% @see update_tree/2 +%% @see ann_make_tree/3 +%% @see get_ann/1 + +-spec update_tree(cerl(), ctype(), [[cerl()],...]) -> cerl(). + +update_tree(Node, Type, Gs) -> + ann_make_tree(get_ann(Node), Type, Gs). + + +%% @spec make_tree(Type::ctype(), Groups::[[cerl()]]) -> cerl() +%% +%% @doc Creates a syntax tree with the given type and subtrees. +%% <code>Type</code> must be a node type name +%% (cf. <code>type/1</code>) that does not denote a leaf node type +%% (cf. <code>is_leaf/1</code>). <code>Groups</code> must be a +%% <em>nonempty</em> list of groups of syntax trees, representing the +%% subtrees of a node of the given type, in left-to-right order as +%% they would occur in the printed program text, grouped by category +%% as done by <code>subtrees/1</code>. +%% +%% <p>The result of <code>ann_make_tree(get_ann(Node), type(Node), +%% subtrees(Node))</code> (cf. <code>update_tree/2</code>) represents +%% the same source code text as the original <code>Node</code>, +%% assuming that <code>subtrees(Node)</code> yields a nonempty +%% list. However, it does not necessarily have the exact same data +%% representation as <code>Node</code>.</p> +%% +%% @see ann_make_tree/3 +%% @see type/1 +%% @see is_leaf/1 +%% @see subtrees/1 +%% @see update_tree/2 + +-spec make_tree(ctype(), [[cerl()],...]) -> cerl(). + +make_tree(Type, Gs) -> + ann_make_tree([], Type, Gs). + + +%% @spec ann_make_tree(As::anns(), Type::ctype(), +%% Groups::[[cerl()]]) -> cerl() +%% +%% @doc Creates a syntax tree with the given annotations, type and +%% subtrees. See <code>make_tree/2</code> for details. +%% +%% @see make_tree/2 + +-spec ann_make_tree(anns(), ctype(), [[cerl()],...]) -> cerl(). + +ann_make_tree(As, values, [Es]) -> ann_c_values(As, Es); +ann_make_tree(As, binary, [Ss]) -> ann_c_binary(As, Ss); +ann_make_tree(As, bitstr, [[V],[S],[U],[T],[Fs]]) -> + ann_c_bitstr(As, V, S, U, T, Fs); +ann_make_tree(As, cons, [[H], [T]]) -> ann_c_cons(As, H, T); +ann_make_tree(As, tuple, [Es]) -> ann_c_tuple(As, Es); +ann_make_tree(As, map, [Es]) -> ann_c_map(As, Es); +ann_make_tree(As, map, [[A], Es]) -> ann_c_map(As, A, Es); +ann_make_tree(As, map_pair, [[Op], [K], [V]]) -> ann_c_map_pair(As, Op, K, V); +ann_make_tree(As, 'let', [Vs, [A], [B]]) -> ann_c_let(As, Vs, A, B); +ann_make_tree(As, seq, [[A], [B]]) -> ann_c_seq(As, A, B); +ann_make_tree(As, apply, [[Op], Es]) -> ann_c_apply(As, Op, Es); +ann_make_tree(As, call, [[M], [N], Es]) -> ann_c_call(As, M, N, Es); +ann_make_tree(As, primop, [[N], Es]) -> ann_c_primop(As, N, Es); +ann_make_tree(As, 'case', [[A], Cs]) -> ann_c_case(As, A, Cs); +ann_make_tree(As, clause, [Ps, [G], [B]]) -> ann_c_clause(As, Ps, G, B); +ann_make_tree(As, alias, [[V], [P]]) -> ann_c_alias(As, V, P); +ann_make_tree(As, 'fun', [Vs, [B]]) -> ann_c_fun(As, Vs, B); +ann_make_tree(As, 'receive', [Cs, [T], [A]]) -> + ann_c_receive(As, Cs, T, A); +ann_make_tree(As, 'try', [[E], Vs, [B], Evs, [H]]) -> + ann_c_try(As, E, Vs, B, Evs, H); +ann_make_tree(As, 'catch', [[B]]) -> ann_c_catch(As, B); +ann_make_tree(As, letrec, [Es, [B]]) -> + ann_c_letrec(As, fold_tuples(Es), B); +ann_make_tree(As, module, [[N], Xs, Es, Ds]) -> + ann_c_module(As, N, Xs, fold_tuples(Es), fold_tuples(Ds)). + + +%% --------------------------------------------------------------------- + +%% @spec meta(Tree::cerl()) -> cerl() +%% +%% @doc Creates a meta-representation of a syntax tree. The result +%% represents an Erlang expression "<code><em>MetaTree</em></code>" +%% which, if evaluated, will yield a new syntax tree representing the +%% same source code text as <code>Tree</code> (although the actual +%% data representation may be different). The expression represented +%% by <code>MetaTree</code> is <em>implementation independent</em> +%% with regard to the data structures used by the abstract syntax tree +%% implementation. +%% +%% <p>Any node in <code>Tree</code> whose node type is +%% <code>var</code> (cf. <code>type/1</code>), and whose list of +%% annotations (cf. <code>get_ann/1</code>) contains the atom +%% <code>meta_var</code>, will remain unchanged in the resulting tree, +%% except that exactly one occurrence of <code>meta_var</code> is +%% removed from its annotation list.</p> +%% +%% <p>The main use of the function <code>meta/1</code> is to transform +%% a data structure <code>Tree</code>, which represents a piece of +%% program code, into a form that is <em>representation independent +%% when printed</em>. E.g., suppose <code>Tree</code> represents a +%% variable named "V". Then (assuming a function <code>print/1</code> +%% for printing syntax trees), evaluating +%% <code>print(abstract(Tree))</code> - simply using +%% <code>abstract/1</code> to map the actual data structure onto a +%% syntax tree representation - would output a string that might look +%% something like "<code>{var, ..., 'V'}</code>", which is obviously +%% dependent on the implementation of the abstract syntax trees. This +%% could e.g. be useful for caching a syntax tree in a file. However, +%% in some situations like in a program generator generator (with two +%% "generator"), it may be unacceptable. Using +%% <code>print(meta(Tree))</code> instead would output a +%% <em>representation independent</em> syntax tree generating +%% expression; in the above case, something like +%% "<code>cerl:c_var('V')</code>".</p> +%% +%% <p>The implementation tries to generate compact code with respect +%% to literals and lists.</p> +%% +%% @see abstract/1 +%% @see type/1 +%% @see get_ann/1 + +-spec meta(cerl()) -> cerl(). + +meta(Node) -> + %% First of all we check for metavariables: + case type(Node) of + var -> + case lists:member(meta_var, get_ann(Node)) of + false -> + meta_0(var, Node); + true -> + %% A meta-variable: remove the first found + %% 'meta_var' annotation, but otherwise leave + %% the node unchanged. + set_ann(Node, lists:delete(meta_var, get_ann(Node))) + end; + Type -> + meta_0(Type, Node) + end. + +meta_0(Type, Node) -> + case get_ann(Node) of + [] -> + meta_1(Type, Node); + As -> + meta_call(set_ann, [meta_1(Type, Node), abstract(As)]) + end. + +meta_1(literal, Node) -> + %% We handle atomic literals separately, to get a bit + %% more compact code. For the rest, we use 'abstract'. + case concrete(Node) of + V when is_atom(V) -> + meta_call(c_atom, [Node]); + V when is_integer(V) -> + meta_call(c_int, [Node]); + V when is_float(V) -> + meta_call(c_float, [Node]); + [] -> + meta_call(c_nil, []); + _ -> + meta_call(abstract, [Node]) + end; +meta_1(var, Node) -> + %% A normal variable or function name. + meta_call(c_var, [abstract(var_name(Node))]); +meta_1(values, Node) -> + meta_call(c_values, + [make_list(meta_list(values_es(Node)))]); +meta_1(binary, Node) -> + meta_call(c_binary, + [make_list(meta_list(binary_segments(Node)))]); +meta_1(bitstr, Node) -> + meta_call(c_bitstr, + [meta(bitstr_val(Node)), + meta(bitstr_size(Node)), + meta(bitstr_unit(Node)), + meta(bitstr_type(Node)), + meta(bitstr_flags(Node))]); +meta_1(cons, Node) -> + %% The list is split up if some sublist has annotatations. If + %% we get exactly one element, we generate a 'c_cons' call + %% instead of 'make_list' to reconstruct the node. + case split_list(Node) of + {[H], Node1} -> + meta_call(c_cons, [meta(H), meta(Node1)]); + {L, Node1} -> + meta_call(make_list, + [make_list(meta_list(L)), meta(Node1)]) + end; +meta_1(tuple, Node) -> + meta_call(c_tuple, + [make_list(meta_list(tuple_es(Node)))]); +meta_1('let', Node) -> + meta_call(c_let, + [make_list(meta_list(let_vars(Node))), + meta(let_arg(Node)), meta(let_body(Node))]); +meta_1(seq, Node) -> + meta_call(c_seq, + [meta(seq_arg(Node)), meta(seq_body(Node))]); +meta_1(apply, Node) -> + meta_call(c_apply, + [meta(apply_op(Node)), + make_list(meta_list(apply_args(Node)))]); +meta_1(call, Node) -> + meta_call(c_call, + [meta(call_module(Node)), meta(call_name(Node)), + make_list(meta_list(call_args(Node)))]); +meta_1(primop, Node) -> + meta_call(c_primop, + [meta(primop_name(Node)), + make_list(meta_list(primop_args(Node)))]); +meta_1('case', Node) -> + meta_call(c_case, + [meta(case_arg(Node)), + make_list(meta_list(case_clauses(Node)))]); +meta_1(clause, Node) -> + meta_call(c_clause, + [make_list(meta_list(clause_pats(Node))), + meta(clause_guard(Node)), + meta(clause_body(Node))]); +meta_1(alias, Node) -> + meta_call(c_alias, + [meta(alias_var(Node)), meta(alias_pat(Node))]); +meta_1('fun', Node) -> + meta_call(c_fun, + [make_list(meta_list(fun_vars(Node))), + meta(fun_body(Node))]); +meta_1('receive', Node) -> + meta_call(c_receive, + [make_list(meta_list(receive_clauses(Node))), + meta(receive_timeout(Node)), + meta(receive_action(Node))]); +meta_1('try', Node) -> + meta_call(c_try, + [meta(try_arg(Node)), + make_list(meta_list(try_vars(Node))), + meta(try_body(Node)), + make_list(meta_list(try_evars(Node))), + meta(try_handler(Node))]); +meta_1('catch', Node) -> + meta_call(c_catch, [meta(catch_body(Node))]); +meta_1(letrec, Node) -> + meta_call(c_letrec, + [make_list([c_tuple([meta(N), meta(F)]) + || {N, F} <- letrec_defs(Node)]), + meta(letrec_body(Node))]); +meta_1(module, Node) -> + meta_call(c_module, + [meta(module_name(Node)), + make_list(meta_list(module_exports(Node))), + make_list([c_tuple([meta(A), meta(V)]) + || {A, V} <- module_attrs(Node)]), + make_list([c_tuple([meta(N), meta(F)]) + || {N, F} <- module_defs(Node)])]). + +meta_call(F, As) -> + c_call(c_atom(?MODULE), c_atom(F), As). + +meta_list([T | Ts]) -> + [meta(T) | meta_list(Ts)]; +meta_list([]) -> + []. + +split_list(Node) -> + split_list(set_ann(Node, []), []). + +split_list(Node, L) -> + A = get_ann(Node), + case type(Node) of + cons when A =:= [] -> + split_list(cons_tl(Node), [cons_hd(Node) | L]); + _ -> + {lists:reverse(L), Node} + end. + + +%% --------------------------------------------------------------------- + +%% General utilities + +is_lit_list([#c_literal{} | Es]) -> + is_lit_list(Es); +is_lit_list([_ | _]) -> + false; +is_lit_list([]) -> + true. + +lit_list_vals([#c_literal{val = V} | Es]) -> + [V | lit_list_vals(Es)]; +lit_list_vals([]) -> + []. + +-spec make_lit_list([litval()]) -> [c_literal()]. + +make_lit_list([V | Vs]) -> + [#c_literal{val = V} | make_lit_list(Vs)]; +make_lit_list([]) -> + []. + +%% The following tests are the same as done by 'io_lib:char_list' and +%% 'io_lib:printable_list', respectively, but for a single character. + +is_char_value(V) when V >= $\000, V =< $\377 -> true; +is_char_value(_) -> false. + +is_print_char_value(V) when V >= $\040, V =< $\176 -> true; +is_print_char_value(V) when V >= $\240, V =< $\377 -> true; +is_print_char_value(V) when V =:= $\b -> true; +is_print_char_value(V) when V =:= $\d -> true; +is_print_char_value(V) when V =:= $\e -> true; +is_print_char_value(V) when V =:= $\f -> true; +is_print_char_value(V) when V =:= $\n -> true; +is_print_char_value(V) when V =:= $\r -> true; +is_print_char_value(V) when V =:= $\s -> true; +is_print_char_value(V) when V =:= $\t -> true; +is_print_char_value(V) when V =:= $\v -> true; +is_print_char_value(V) when V =:= $\" -> true; +is_print_char_value(V) when V =:= $\' -> true; %' stupid Emacs. +is_print_char_value(V) when V =:= $\\ -> true; +is_print_char_value(_) -> false. + +is_char_list([V | Vs]) when is_integer(V) -> + is_char_value(V) andalso is_char_list(Vs); +is_char_list([]) -> + true; +is_char_list(_) -> + false. + +is_print_char_list([V | Vs]) when is_integer(V) -> + is_print_char_value(V) andalso is_print_char_list(Vs); +is_print_char_list([]) -> + true; +is_print_char_list(_) -> + false. + +unfold_tuples([{X, Y} | Ps]) -> + [X, Y | unfold_tuples(Ps)]; +unfold_tuples([]) -> + []. + +fold_tuples([X, Y | Es]) -> + [{X, Y} | fold_tuples(Es)]; +fold_tuples([]) -> + []. diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/recrec/core_parse.hrl b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/core_parse.hrl new file mode 100644 index 0000000000..5823622f05 --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/core_parse.hrl @@ -0,0 +1,122 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% Purpose : Core Erlang syntax trees as records. + +%% It would be nice to incorporate some generic functions as well but +%% this could make including this file difficult. + +%% Note: the annotation list is *always* the first record field. +%% Thus it is possible to define the macros: +%% -define(get_ann(X), element(2, X)). +%% -define(set_ann(X, Y), setelement(2, X, Y)). + +%% The record definitions appear alphabetically + +-record(c_alias, {anno=[] :: cerl:anns(), + var :: cerl:c_var(), + pat :: cerl:cerl()}). + +-record(c_apply, {anno=[] :: cerl:anns(), + op :: cerl:c_var(), + args :: [cerl:cerl()]}). + +-record(c_binary, {anno=[] :: cerl:anns(), + segments :: [cerl:c_bitstr()]}). + +-record(c_bitstr, {anno=[], val, % val :: Tree, + size, % size :: Tree, + unit, % unit :: Tree, + type, % type :: Tree, + flags}). % flags :: Tree + +-record(c_call, {anno=[], module, % module :: cerl:cerl(), + name, % name :: cerl:cerl(), + args}). % args :: [cerl:cerl()] + +-record(c_case, {anno=[] :: cerl:anns(), + arg :: cerl:cerl(), + clauses :: [cerl:cerl()]}). + +-record(c_catch, {anno=[] :: cerl:anns(), body :: cerl:cerl()}). + +-record(c_clause, {anno=[] :: cerl:anns(), + pats, % :: [cerl:cerl()], % pats :: [Tree], + guard, % :: cerl:cerl(), % guard :: Tree, + body}). % :: cerl:cerl()}). % body :: Tree + +-record(c_cons, {anno=[] :: cerl:anns(), + hd :: cerl:cerl(), + tl :: cerl:cerl()}). + +-record(c_fun, {anno=[] :: cerl:anns(), + vars :: [cerl:c_var()], + body :: cerl:cerl()}). + +-record(c_let, {anno=[] :: cerl:anns(), + vars :: [cerl:c_var()], + arg :: cerl:cerl(), + body :: cerl:cerl()}). + +-record(c_letrec, {anno=[] :: cerl:anns(), + defs :: cerl:defs(), + body :: cerl:cerl()}). + +-record(c_literal, {anno=[] :: cerl:anns(), val :: cerl:litval()}). + +-record(c_map, {anno=[] :: cerl:anns(), + arg=#c_literal{val=#{}} :: cerl:c_var() | cerl:c_literal(), + es :: [cerl:c_map_pair()], + is_pat=false :: boolean()}). + +-record(c_map_pair, {anno=[] :: cerl:anns(), + op, %:: #c_literal{val::'assoc'} | #c_literal{val::'exact'}, + key, + val}). + +-record(c_module, {anno=[] :: cerl:anns(), + name :: cerl:c_literal(), + exports :: [cerl:c_var()], + attrs :: cerl:attrs(), + defs :: cerl:defs()}). + +-record(c_primop, {anno=[] :: cerl:anns(), + name :: cerl:c_literal(), + args :: [cerl:cerl()]}). + +-record(c_receive, {anno=[]:: cerl:anns(), + clauses, % clauses :: [Tree], + timeout, % timeout :: Tree, + action}). % action :: Tree + +-record(c_seq, {anno=[] :: cerl:anns(), + arg, % arg :: cerl:cerl(), + body}). % body :: cerl:cerl() + +-record(c_try, {anno=[], arg, % arg :: cerl:cerl(), + vars, % vars :: [cerl:c_var()], + body, % body :: cerl:cerl(), + evars, % evars :: [cerl:c_var()], + handler}). % handler :: cerl:cerl() + +-record(c_tuple, {anno=[] :: cerl:anns(), es :: [cerl:cerl()]}). + +-record(c_values, {anno=[] :: cerl:anns(), es :: [cerl:cerl()]}). + +-record(c_var, {anno=[] :: cerl:anns(), name :: cerl:var_name()}). diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/recrec/dialyzer.hrl b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/dialyzer.hrl new file mode 100644 index 0000000000..ea6a71217c --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/dialyzer.hrl @@ -0,0 +1,180 @@ +%%% This is an -*- Erlang -*- file. +%%% +%%% %CopyrightBegin% +%%% +%%% Copyright Ericsson AB 2006-2015. All Rights Reserved. +%%% +%%% Licensed under the Apache License, Version 2.0 (the "License"); +%%% you may not use this file except in compliance with the License. +%%% You may obtain a copy of the License at +%%% +%%% http://www.apache.org/licenses/LICENSE-2.0 +%%% +%%% Unless required by applicable law or agreed to in writing, software +%%% distributed under the License is distributed on an "AS IS" BASIS, +%%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%%% See the License for the specific language governing permissions and +%%% limitations under the License. +%%% +%%% %CopyrightEnd% +%%% +%%%------------------------------------------------------------------- +%%% File : dialyzer.hrl +%%% Author : Tobias Lindahl <[email protected]> +%%% Kostis Sagonas <[email protected]> +%%% Description : Header file for Dialyzer. +%%% +%%% Created : 1 Oct 2004 by Kostis Sagonas <[email protected]> +%%%------------------------------------------------------------------- + +-define(RET_NOTHING_SUSPICIOUS, 0). +-define(RET_INTERNAL_ERROR, 1). +-define(RET_DISCREPANCIES, 2). + +-type dial_ret() :: ?RET_NOTHING_SUSPICIOUS + | ?RET_INTERNAL_ERROR + | ?RET_DISCREPANCIES. + +%%-------------------------------------------------------------------- +%% Warning classification +%%-------------------------------------------------------------------- + +-define(WARN_RETURN_NO_RETURN, warn_return_no_exit). +-define(WARN_RETURN_ONLY_EXIT, warn_return_only_exit). +-define(WARN_NOT_CALLED, warn_not_called). +-define(WARN_NON_PROPER_LIST, warn_non_proper_list). +-define(WARN_FUN_APP, warn_fun_app). +-define(WARN_MATCHING, warn_matching). +-define(WARN_OPAQUE, warn_opaque). +-define(WARN_FAILING_CALL, warn_failing_call). +-define(WARN_BIN_CONSTRUCTION, warn_bin_construction). +-define(WARN_CONTRACT_TYPES, warn_contract_types). +-define(WARN_CONTRACT_SYNTAX, warn_contract_syntax). +-define(WARN_CONTRACT_NOT_EQUAL, warn_contract_not_equal). +-define(WARN_CONTRACT_SUBTYPE, warn_contract_subtype). +-define(WARN_CONTRACT_SUPERTYPE, warn_contract_supertype). +-define(WARN_CONTRACT_RANGE, warn_contract_range). +-define(WARN_CALLGRAPH, warn_callgraph). +-define(WARN_UNMATCHED_RETURN, warn_umatched_return). +-define(WARN_RACE_CONDITION, warn_race_condition). +-define(WARN_BEHAVIOUR, warn_behaviour). +-define(WARN_UNDEFINED_CALLBACK, warn_undefined_callbacks). +-define(WARN_UNKNOWN, warn_unknown). +-define(WARN_MAP_CONSTRUCTION, warn_map_construction). + +%% +%% The following type has double role: +%% 1. It is the set of warnings that will be collected. +%% 2. It is also the set of tags for warnings that will be returned. +%% +-type dial_warn_tag() :: ?WARN_RETURN_NO_RETURN | ?WARN_RETURN_ONLY_EXIT + | ?WARN_NOT_CALLED | ?WARN_NON_PROPER_LIST + | ?WARN_MATCHING | ?WARN_OPAQUE | ?WARN_FUN_APP + | ?WARN_FAILING_CALL | ?WARN_BIN_CONSTRUCTION + | ?WARN_CONTRACT_TYPES | ?WARN_CONTRACT_SYNTAX + | ?WARN_CONTRACT_NOT_EQUAL | ?WARN_CONTRACT_SUBTYPE + | ?WARN_CONTRACT_SUPERTYPE | ?WARN_CALLGRAPH + | ?WARN_UNMATCHED_RETURN | ?WARN_RACE_CONDITION + | ?WARN_BEHAVIOUR | ?WARN_CONTRACT_RANGE + | ?WARN_UNDEFINED_CALLBACK | ?WARN_UNKNOWN + | ?WARN_MAP_CONSTRUCTION. + +%% +%% This is the representation of each warning as they will be returned +%% to dialyzer's callers +%% +-type file_line() :: {file:filename(), non_neg_integer()}. +-type dial_warning() :: {dial_warn_tag(), file_line(), {atom(), [term()]}}. + +%% +%% This is the representation of each warning before suppressions have +%% been applied +%% +-type m_or_mfa() :: module() % warnings not associated with any function + | mfa(). +-type warning_info() :: {file:filename(), non_neg_integer(), m_or_mfa()}. +-type raw_warning() :: {dial_warn_tag(), warning_info(), {atom(), [term()]}}. + +%% +%% This is the representation of dialyzer's internal errors +%% +-type dial_error() :: any(). %% XXX: underspecified + +%%-------------------------------------------------------------------- +%% Basic types used either in the record definitions below or in other +%% parts of the application +%%-------------------------------------------------------------------- + +-type anal_type() :: 'succ_typings' | 'plt_build'. +-type anal_type1() :: anal_type() | 'plt_add' | 'plt_check' | 'plt_remove'. +-type contr_constr() :: {'subtype', erl_types:erl_type(), erl_types:erl_type()}. +-type contract_pair() :: {erl_types:erl_type(), [contr_constr()]}. +-type dial_define() :: {atom(), term()}. +-type dial_option() :: {atom(), term()}. +-type dial_options() :: [dial_option()]. +-type fopt() :: 'basename' | 'fullpath'. +-type format() :: 'formatted' | 'raw'. +-type label() :: non_neg_integer(). +-type dial_warn_tags():: ordsets:ordset(dial_warn_tag()). +-type rep_mode() :: 'quiet' | 'normal' | 'verbose'. +-type start_from() :: 'byte_code' | 'src_code'. +-type mfa_or_funlbl() :: label() | mfa(). +-type solver() :: 'v1' | 'v2'. + +%%-------------------------------------------------------------------- +%% Record declarations used by various files +%%-------------------------------------------------------------------- + +-type doc_plt() :: 'undefined' | dialyzer_plt:plt(). + +-record(analysis, {analysis_pid :: pid() | 'undefined', + type = succ_typings :: anal_type(), + defines = [] :: [dial_define()], + doc_plt :: doc_plt(), + files = [] :: [file:filename()], + include_dirs = [] :: [file:filename()], + start_from = byte_code :: start_from(), + plt :: dialyzer_plt:plt(), + use_contracts = true :: boolean(), + race_detection = false :: boolean(), + behaviours_chk = false :: boolean(), + timing = false :: boolean() | 'debug', + timing_server = none :: dialyzer_timing:timing_server(), + callgraph_file = "" :: file:filename(), + solvers :: [solver()]}). + +-record(options, {files = [] :: [file:filename()], + files_rec = [] :: [file:filename()], + analysis_type = succ_typings :: anal_type1(), + timing = false :: boolean() | 'debug', + defines = [] :: [dial_define()], + from = byte_code :: start_from(), + get_warnings = maybe :: boolean() | 'maybe', + init_plts = [] :: [file:filename()], + include_dirs = [] :: [file:filename()], + output_plt = none :: 'none' | file:filename(), + legal_warnings = ordsets:new() :: dial_warn_tags(), + report_mode = normal :: rep_mode(), + erlang_mode = false :: boolean(), + use_contracts = true :: boolean(), + output_file = none :: 'none' | file:filename(), + output_format = formatted :: format(), + filename_opt = basename :: fopt(), + callgraph_file = "" :: file:filename(), + check_plt = true :: boolean(), + solvers = [] :: [solver()]}). + +-record(contract, {contracts = [] :: [contract_pair()], + args = [] :: [erl_types:erl_type()], + forms = [] :: [{_, _}]}). + +%%-------------------------------------------------------------------- + +-define(timing(Server, Msg, Var, Expr), + begin + dialyzer_timing:start_stamp(Server, Msg), + Var = Expr, + dialyzer_timing:end_stamp(Server), + Var + end). +-define(timing(Server, Msg, Expr), ?timing(Server, Msg, _T, Expr)). diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/recrec/dialyzer_dataflow.erl b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/dialyzer_dataflow.erl new file mode 100644 index 0000000000..9399789464 --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/dialyzer_dataflow.erl @@ -0,0 +1,3802 @@ +%% -*- erlang-indent-level: 2 -*- +%%-------------------------------------------------------------------- +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File : dialyzer_dataflow.erl +%%% Author : Tobias Lindahl <[email protected]> +%%% Description : +%%% +%%% Created : 19 Apr 2005 by Tobias Lindahl <[email protected]> +%%%------------------------------------------------------------------- + +-module(dialyzer_dataflow). + +-export([get_fun_types/5, get_warnings/5, format_args/3]). + +%% Data structure interfaces. +-export([state__add_warning/2, state__cleanup/1, + state__duplicate/1, dispose_state/1, + state__get_callgraph/1, state__get_races/1, + state__get_records/1, state__put_callgraph/2, + state__put_races/2, state__records_only/1, + state__find_function/2]). + +-export_type([state/0]). + +-include("dialyzer.hrl"). + +-import(erl_types, + [t_inf/2, t_inf/3, t_inf_lists/2, t_inf_lists/3, + t_inf_lists/3, t_is_equal/2, t_is_subtype/2, t_subtract/2, + t_sup/1, t_sup/2]). + +-import(erl_types, + [any_none/1, t_any/0, t_atom/0, t_atom/1, t_atom_vals/1, t_atom_vals/2, + t_binary/0, t_boolean/0, + t_bitstr/0, t_bitstr/2, t_bitstr_concat/1, t_bitstr_match/2, + t_cons/0, t_cons/2, t_cons_hd/2, t_cons_tl/2, + t_contains_opaque/2, + t_find_opaque_mismatch/3, t_float/0, t_from_range/2, t_from_term/1, + t_fun/0, t_fun/2, t_fun_args/1, t_fun_args/2, t_fun_range/1, + t_fun_range/2, t_integer/0, t_integers/1, + t_is_any/1, t_is_atom/1, t_is_atom/2, t_is_any_atom/3, + t_is_boolean/2, + t_is_integer/2, t_is_list/1, + t_is_nil/2, t_is_none/1, t_is_none_or_unit/1, + t_is_number/2, t_is_reference/2, t_is_pid/2, t_is_port/2, + t_is_unit/1, + t_limit/2, t_list/0, t_list_elements/2, + t_maybe_improper_list/0, t_module/0, + t_none/0, t_non_neg_integer/0, t_number/0, t_number_vals/2, + t_pid/0, t_port/0, t_product/1, t_reference/0, + t_to_string/2, t_to_tlist/1, + t_tuple/0, t_tuple/1, t_tuple_args/1, t_tuple_args/2, + t_tuple_subtypes/2, + t_unit/0, t_unopaque/2, + t_map/0, t_map/1, t_is_singleton/2 + ]). + +%%-define(DEBUG, true). +%%-define(DEBUG_PP, true). +%%-define(DEBUG_TIME, true). + +-ifdef(DEBUG). +-import(erl_types, [t_to_string/1]). +-define(debug(S_, L_), io:format(S_, L_)). +-else. +-define(debug(S_, L_), ok). +-endif. + +%%-------------------------------------------------------------------- + +-type type() :: erl_types:erl_type(). +-type types() :: erl_types:type_table(). + +-type curr_fun() :: 'undefined' | 'top' | mfa_or_funlbl(). + +-define(no_arg, no_arg). + +-define(TYPE_LIMIT, 3). + +-define(BITS, 128). + +%% Types with comment 'race' are due to dialyzer_races.erl. +-record(state, {callgraph :: dialyzer_callgraph:callgraph() + | 'undefined', % race + codeserver :: dialyzer_codeserver:codeserver() + | 'undefined', % race + envs :: env_tab() + | 'undefined', % race + fun_tab :: fun_tab() + | 'undefined', % race + fun_homes :: dict:dict(label(), mfa()) + | 'undefined', % race + plt :: dialyzer_plt:plt() + | 'undefined', % race + opaques :: [type()] + | 'undefined', % race + races = dialyzer_races:new() :: dialyzer_races:races(), + records = dict:new() :: types(), + tree_map :: dict:dict(label(), cerl:cerl()) + | 'undefined', % race + warning_mode = false :: boolean(), + warnings = [] :: [raw_warning()], + work :: {[_], [_], sets:set()} + | 'undefined', % race + module :: module(), + curr_fun :: curr_fun() + }). + +-record(map, {map = maps:new() :: type_tab(), + subst = maps:new() :: subst_tab(), + modified = [] :: [Key :: term()], + modified_stack = [] :: [{[Key :: term()],reference()}], + ref = undefined :: reference() | undefined}). + +-type env_tab() :: dict:dict(label(), #map{}). +-type fun_entry() :: {Args :: [type()], RetType :: type()}. +-type fun_tab() :: dict:dict('top' | label(), + {'not_handled', fun_entry()} | fun_entry()). +-type key() :: label() | cerl:cerl(). +-type type_tab() :: #{key() => type()}. +-type subst_tab() :: #{key() => cerl:cerl()}. + +%% Exported Types + +-opaque state() :: #state{}. + +%%-------------------------------------------------------------------- + +-type fun_types() :: dict:dict(label(), type()). + +-spec get_warnings(cerl:c_module(), dialyzer_plt:plt(), + dialyzer_callgraph:callgraph(), + dialyzer_codeserver:codeserver(), + types()) -> + {[raw_warning()], fun_types()}. + +get_warnings(Tree, Plt, Callgraph, Codeserver, Records) -> + State1 = analyze_module(Tree, Plt, Callgraph, Codeserver, Records, true), + State2 = state__renew_warnings(state__get_warnings(State1), State1), + State3 = state__get_race_warnings(State2), + {State3#state.warnings, state__all_fun_types(State3)}. + +-spec get_fun_types(cerl:c_module(), dialyzer_plt:plt(), + dialyzer_callgraph:callgraph(), + dialyzer_codeserver:codeserver(), + types()) -> fun_types(). + +get_fun_types(Tree, Plt, Callgraph, Codeserver, Records) -> + State = analyze_module(Tree, Plt, Callgraph, Codeserver, Records, false), + state__all_fun_types(State). + +%%% =========================================================================== +%%% +%%% The analysis. +%%% +%%% =========================================================================== + +analyze_module(Tree, Plt, Callgraph, Codeserver, Records, GetWarnings) -> + debug_pp(Tree, false), + Module = cerl:atom_val(cerl:module_name(Tree)), + TopFun = cerl:ann_c_fun([{label, top}], [], Tree), + State = state__new(Callgraph, Codeserver, TopFun, Plt, Module, Records), + State1 = state__race_analysis(not GetWarnings, State), + State2 = analyze_loop(State1), + case GetWarnings of + true -> + State3 = state__set_warning_mode(State2), + State4 = analyze_loop(State3), + dialyzer_races:race(State4); + false -> + State2 + end. + +analyze_loop(State) -> + case state__get_work(State) of + none -> state__set_curr_fun(undefined, State); + {Fun, NewState0} -> + NewState1 = state__set_curr_fun(get_label(Fun), NewState0), + {ArgTypes, IsCalled} = state__get_args_and_status(Fun, NewState1), + case not IsCalled of + true -> + ?debug("Not handling (not called) ~w: ~s\n", + [NewState1#state.curr_fun, + t_to_string(t_product(ArgTypes))]), + analyze_loop(NewState1); + false -> + case state__fun_env(Fun, NewState1) of + none -> + ?debug("Not handling (no env) ~w: ~s\n", + [NewState1#state.curr_fun, + t_to_string(t_product(ArgTypes))]), + analyze_loop(NewState1); + Map -> + ?debug("Handling fun ~p: ~s\n", + [NewState1#state.curr_fun, + t_to_string(state__fun_type(Fun, NewState1))]), + Vars = cerl:fun_vars(Fun), + Map1 = enter_type_lists(Vars, ArgTypes, Map), + Body = cerl:fun_body(Fun), + FunLabel = get_label(Fun), + IsRaceAnalysisEnabled = is_race_analysis_enabled(State), + NewState3 = + case IsRaceAnalysisEnabled of + true -> + NewState2 = state__renew_curr_fun( + state__lookup_name(FunLabel, NewState1), FunLabel, + NewState1), + state__renew_race_list([], 0, NewState2); + false -> NewState1 + end, + {NewState4, _Map2, BodyType} = + traverse(Body, Map1, NewState3), + ?debug("Done analyzing: ~w:~s\n", + [NewState1#state.curr_fun, + t_to_string(t_fun(ArgTypes, BodyType))]), + NewState5 = + case IsRaceAnalysisEnabled of + true -> renew_race_code(NewState4); + false -> NewState4 + end, + NewState6 = + state__update_fun_entry(Fun, ArgTypes, BodyType, NewState5), + ?debug("done adding stuff for ~w\n", + [state__lookup_name(get_label(Fun), State)]), + analyze_loop(NewState6) + end + end + end. + +traverse(Tree, Map, State) -> + ?debug("Handling ~p\n", [cerl:type(Tree)]), + %% debug_pp_map(Map), + case cerl:type(Tree) of + alias -> + %% This only happens when checking for illegal record patterns + %% so the handling is a bit rudimentary. + traverse(cerl:alias_pat(Tree), Map, State); + apply -> + handle_apply(Tree, Map, State); + binary -> + Segs = cerl:binary_segments(Tree), + {State1, Map1, SegTypes} = traverse_list(Segs, Map, State), + {State1, Map1, t_bitstr_concat(SegTypes)}; + bitstr -> + handle_bitstr(Tree, Map, State); + call -> + handle_call(Tree, Map, State); + 'case' -> + handle_case(Tree, Map, State); + 'catch' -> + {State1, _Map1, _} = traverse(cerl:catch_body(Tree), Map, State), + {State1, Map, t_any()}; + cons -> + handle_cons(Tree, Map, State); + 'fun' -> + Type = state__fun_type(Tree, State), + case state__warning_mode(State) of + true -> {State, Map, Type}; + false -> + State2 = state__add_work(get_label(Tree), State), + State3 = state__update_fun_env(Tree, Map, State2), + {State3, Map, Type} + end; + 'let' -> + handle_let(Tree, Map, State); + letrec -> + Defs = cerl:letrec_defs(Tree), + Body = cerl:letrec_body(Tree), + %% By not including the variables in scope we can assure that we + %% will get the current function type when using the variables. + FoldFun = fun({Var, Fun}, {AccState, AccMap}) -> + {NewAccState, NewAccMap0, FunType} = + traverse(Fun, AccMap, AccState), + NewAccMap = enter_type(Var, FunType, NewAccMap0), + {NewAccState, NewAccMap} + end, + {State1, Map1} = lists:foldl(FoldFun, {State, Map}, Defs), + traverse(Body, Map1, State1); + literal -> + Type = literal_type(Tree), + {State, Map, Type}; + module -> + handle_module(Tree, Map, State); + primop -> + Type = + case cerl:atom_val(cerl:primop_name(Tree)) of + match_fail -> t_none(); + raise -> t_none(); + bs_init_writable -> t_from_term(<<>>); + Other -> erlang:error({'Unsupported primop', Other}) + end, + {State, Map, Type}; + 'receive' -> + handle_receive(Tree, Map, State); + seq -> + Arg = cerl:seq_arg(Tree), + Body = cerl:seq_body(Tree), + {State1, Map1, ArgType} = SMA = traverse(Arg, Map, State), + case t_is_none_or_unit(ArgType) of + true -> + SMA; + false -> + State2 = + case + t_is_any(ArgType) + orelse t_is_simple(ArgType, State) + orelse is_call_to_send(Arg) + orelse is_lc_simple_list(Arg, ArgType, State) + of + true -> % do not warn in these cases + State1; + false -> + state__add_warning(State1, ?WARN_UNMATCHED_RETURN, Arg, + {unmatched_return, + [format_type(ArgType, State1)]}) + end, + traverse(Body, Map1, State2) + end; + 'try' -> + handle_try(Tree, Map, State); + tuple -> + handle_tuple(Tree, Map, State); + map -> + handle_map(Tree, Map, State); + values -> + Elements = cerl:values_es(Tree), + {State1, Map1, EsType} = traverse_list(Elements, Map, State), + Type = t_product(EsType), + {State1, Map1, Type}; + var -> + ?debug("Looking up unknown variable: ~p\n", [Tree]), + case state__lookup_type_for_letrec(Tree, State) of + error -> + LType = lookup_type(Tree, Map), + {State, Map, LType}; + {ok, Type} -> {State, Map, Type} + end; + Other -> + erlang:error({'Unsupported type', Other}) + end. + +traverse_list(Trees, Map, State) -> + traverse_list(Trees, Map, State, []). + +traverse_list([Tree|Tail], Map, State, Acc) -> + {State1, Map1, Type} = traverse(Tree, Map, State), + traverse_list(Tail, Map1, State1, [Type|Acc]); +traverse_list([], Map, State, Acc) -> + {State, Map, lists:reverse(Acc)}. + +%%________________________________________ +%% +%% Special instructions +%% + +handle_apply(Tree, Map, State) -> + Args = cerl:apply_args(Tree), + Op = cerl:apply_op(Tree), + {State0, Map1, ArgTypes} = traverse_list(Args, Map, State), + {State1, Map2, OpType} = traverse(Op, Map1, State0), + case any_none(ArgTypes) of + true -> + {State1, Map2, t_none()}; + false -> + FunList = + case state__lookup_call_site(Tree, State) of + error -> [external]; %% so that we go directly in the fallback + {ok, List} -> List + end, + FunInfoList = [{local, state__fun_info(Fun, State)} || Fun <- FunList], + case + handle_apply_or_call(FunInfoList, Args, ArgTypes, Map2, Tree, State1) + of + {had_external, State2} -> + %% Fallback: use whatever info we collected from traversing the op + %% instead of the result that has been generalized to t_any(). + Arity = length(Args), + OpType1 = t_inf(OpType, t_fun(Arity, t_any())), + case t_is_none(OpType1) of + true -> + Msg = {fun_app_no_fun, + [format_cerl(Op), format_type(OpType, State2), Arity]}, + State3 = state__add_warning(State2, ?WARN_FAILING_CALL, + Tree, Msg), + {State3, Map2, t_none()}; + false -> + NewArgs = t_inf_lists(ArgTypes, + t_fun_args(OpType1, 'universe')), + case any_none(NewArgs) of + true -> + Msg = {fun_app_args, + [format_args(Args, ArgTypes, State), + format_type(OpType, State)]}, + State3 = state__add_warning(State2, ?WARN_FAILING_CALL, + Tree, Msg), + {State3, enter_type(Op, OpType1, Map2), t_none()}; + false -> + Map3 = enter_type_lists(Args, NewArgs, Map2), + Range0 = t_fun_range(OpType1, 'universe'), + Range = + case t_is_unit(Range0) of + true -> t_none(); + false -> Range0 + end, + {State2, enter_type(Op, OpType1, Map3), Range} + end + end; + Normal -> Normal + end + end. + +handle_apply_or_call(FunInfoList, Args, ArgTypes, Map, Tree, State) -> + None = t_none(), + %% Call-site analysis may be inaccurate and consider more funs than those that + %% are actually possible. If all of them are incorrect, then warnings can be + %% emitted. If at least one fun is ok, however, then no warning is emitted, + %% just in case the bad ones are not really possible. The last argument is + %% used for this, with the following encoding: + %% Initial value: {none, []} + %% First fun checked: {one, <List of warns>} + %% More funs checked: {many, <List of warns>} + %% A '{one, []}' can only become '{many, []}'. + %% If at any point an fun does not add warnings, then the list is also + %% replaced with an empty list. + handle_apply_or_call(FunInfoList, Args, ArgTypes, Map, Tree, State, + [None || _ <- ArgTypes], None, false, {none, []}). + +handle_apply_or_call([{local, external}|Left], Args, ArgTypes, Map, Tree, State, + _AccArgTypes, _AccRet, _HadExternal, Warns) -> + {HowMany, _} = Warns, + NewHowMany = + case HowMany of + none -> one; + _ -> many + end, + NewWarns = {NewHowMany, []}, + handle_apply_or_call(Left, Args, ArgTypes, Map, Tree, State, + ArgTypes, t_any(), true, NewWarns); +handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left], + Args, ArgTypes, Map, Tree, + #state{opaques = Opaques} = State, + AccArgTypes, AccRet, HadExternal, Warns) -> + Any = t_any(), + AnyArgs = [Any || _ <- Args], + GenSig = {AnyArgs, fun(_) -> t_any() end}, + {CArgs, CRange} = + case Contr of + {value, #contract{args = As} = C} -> + {As, fun(FunArgs) -> + dialyzer_contracts:get_contract_return(C, FunArgs) + end}; + none -> GenSig + end, + {BifArgs, BifRange} = + case TypeOfApply of + remote -> + {M, F, A} = Fun, + case erl_bif_types:is_known(M, F, A) of + true -> + BArgs = erl_bif_types:arg_types(M, F, A), + BRange = + fun(FunArgs) -> + erl_bif_types:type(M, F, A, FunArgs, Opaques) + end, + {BArgs, BRange}; + false -> + GenSig + end; + local -> GenSig + end, + {SigArgs, SigRange} = + case Sig of + {value, {SR, SA}} -> {SA, SR}; + none -> {AnyArgs, t_any()} + end, + + ?debug("--------------------------------------------------------\n", []), + ?debug("Fun: ~p\n", [state__lookup_name(Fun, State)]), + ?debug("Module ~p\n", [State#state.module]), + ?debug("CArgs ~s\n", [erl_types:t_to_string(t_product(CArgs))]), + ?debug("ArgTypes ~s\n", [erl_types:t_to_string(t_product(ArgTypes))]), + ?debug("BifArgs ~p\n", [erl_types:t_to_string(t_product(BifArgs))]), + + NewArgsSig = t_inf_lists(SigArgs, ArgTypes, Opaques), + ?debug("SigArgs ~s\n", [erl_types:t_to_string(t_product(SigArgs))]), + ?debug("NewArgsSig: ~s\n", [erl_types:t_to_string(t_product(NewArgsSig))]), + NewArgsContract = t_inf_lists(CArgs, ArgTypes, Opaques), + ?debug("NewArgsContract: ~s\n", + [erl_types:t_to_string(t_product(NewArgsContract))]), + NewArgsBif = t_inf_lists(BifArgs, ArgTypes, Opaques), + ?debug("NewArgsBif: ~s\n", [erl_types:t_to_string(t_product(NewArgsBif))]), + NewArgTypes0 = t_inf_lists(NewArgsSig, NewArgsContract), + NewArgTypes = t_inf_lists(NewArgTypes0, NewArgsBif, Opaques), + ?debug("NewArgTypes ~s\n", [erl_types:t_to_string(t_product(NewArgTypes))]), + ?debug("\n", []), + + BifRet = BifRange(NewArgTypes), + ContrRet = CRange(NewArgTypes), + RetWithoutContr = t_inf(SigRange, BifRet), + RetWithoutLocal = t_inf(ContrRet, RetWithoutContr), + + ?debug("RetWithoutContr: ~s\n",[erl_types:t_to_string(RetWithoutContr)]), + ?debug("RetWithoutLocal: ~s\n", [erl_types:t_to_string(RetWithoutLocal)]), + ?debug("BifRet: ~s\n", [erl_types:t_to_string(BifRange(NewArgTypes))]), + ?debug("SigRange: ~s\n", [erl_types:t_to_string(SigRange)]), + ?debug("ContrRet: ~s\n", [erl_types:t_to_string(ContrRet)]), + ?debug("LocalRet: ~s\n", [erl_types:t_to_string(LocalRet)]), + + State1 = + case is_race_analysis_enabled(State) of + true -> + Ann = cerl:get_ann(Tree), + File = get_file(Ann), + Line = abs(get_line(Ann)), + dialyzer_races:store_race_call(Fun, ArgTypes, Args, + {File, Line}, State); + false -> State + end, + FailedConj = any_none([RetWithoutLocal|NewArgTypes]), + IsFailBif = t_is_none(BifRange(BifArgs)), + IsFailSig = t_is_none(SigRange), + ?debug("FailedConj: ~p~n", [FailedConj]), + ?debug("IsFailBif: ~p~n", [IsFailBif]), + ?debug("IsFailSig: ~p~n", [IsFailSig]), + State2 = + case FailedConj andalso not (IsFailBif orelse IsFailSig) of + true -> + case t_is_none(RetWithoutLocal) andalso + not t_is_none(RetWithoutContr) andalso + not any_none(NewArgTypes) of + true -> + {value, C1} = Contr, + Contract = dialyzer_contracts:contract_to_string(C1), + {M1, F1, A1} = state__lookup_name(Fun, State), + ArgStrings = format_args(Args, ArgTypes, State), + CRet = erl_types:t_to_string(RetWithoutContr), + %% This Msg will be post_processed by dialyzer_succ_typings + Msg = + {contract_range, [Contract, M1, F1, A1, ArgStrings, CRet]}, + state__add_warning(State1, ?WARN_CONTRACT_RANGE, Tree, Msg); + false -> + FailedSig = any_none(NewArgsSig), + FailedContract = + any_none([CRange(NewArgsContract)|NewArgsContract]), + FailedBif = any_none([BifRange(NewArgsBif)|NewArgsBif]), + InfSig = t_inf(t_fun(SigArgs, SigRange), + t_fun(BifArgs, BifRange(BifArgs))), + FailReason = + apply_fail_reason(FailedSig, FailedBif, FailedContract), + Msg = get_apply_fail_msg(Fun, Args, ArgTypes, NewArgTypes, InfSig, + Contr, CArgs, State1, FailReason, Opaques), + WarnType = case Msg of + {call, _} -> ?WARN_FAILING_CALL; + {apply, _} -> ?WARN_FAILING_CALL; + {call_with_opaque, _} -> ?WARN_OPAQUE; + {call_without_opaque, _} -> ?WARN_OPAQUE; + {opaque_type_test, _} -> ?WARN_OPAQUE + end, + Frc = {erlang, is_record, 3} =:= state__lookup_name(Fun, State), + state__add_warning(State1, WarnType, Tree, Msg, Frc) + end; + false -> State1 + end, + State3 = + case TypeOfApply of + local -> + case state__is_escaping(Fun, State2) of + true -> State2; + false -> + ForwardArgs = [t_limit(X, ?TYPE_LIMIT) || X <- ArgTypes], + forward_args(Fun, ForwardArgs, State2) + end; + remote -> + add_bif_warnings(Fun, NewArgTypes, Tree, State2) + end, + NewAccArgTypes = + case FailedConj of + true -> AccArgTypes; + false -> [t_sup(X, Y) || {X, Y} <- lists:zip(NewArgTypes, AccArgTypes)] + end, + TotalRet = + case t_is_none(LocalRet) andalso t_is_unit(RetWithoutLocal) of + true -> RetWithoutLocal; + false -> t_inf(RetWithoutLocal, LocalRet) + end, + NewAccRet = t_sup(AccRet, TotalRet), + ?debug("NewAccRet: ~s\n", [t_to_string(NewAccRet)]), + {NewWarnings, State4} = state__remove_added_warnings(State, State3), + {HowMany, OldWarnings} = Warns, + NewWarns = + case HowMany of + none -> {one, NewWarnings}; + _ -> + case OldWarnings =:= [] of + true -> {many, []}; + false -> + case NewWarnings =:= [] of + true -> {many, []}; + false -> {many, NewWarnings ++ OldWarnings} + end + end + end, + handle_apply_or_call(Left, Args, ArgTypes, Map, Tree, + State4, NewAccArgTypes, NewAccRet, HadExternal, NewWarns); +handle_apply_or_call([], Args, _ArgTypes, Map, _Tree, State, + AccArgTypes, AccRet, HadExternal, {_, Warnings}) -> + State1 = state__add_warnings(Warnings, State), + case HadExternal of + false -> + NewMap = enter_type_lists(Args, AccArgTypes, Map), + {State1, NewMap, AccRet}; + true -> + {had_external, State1} + end. + +apply_fail_reason(FailedSig, FailedBif, FailedContract) -> + if + (FailedSig orelse FailedBif) andalso (not FailedContract) -> only_sig; + FailedContract andalso (not (FailedSig orelse FailedBif)) -> only_contract; + true -> both + end. + +get_apply_fail_msg(Fun, Args, ArgTypes, NewArgTypes, + Sig, Contract, ContrArgs, State, FailReason, Opaques) -> + ArgStrings = format_args(Args, ArgTypes, State), + ContractInfo = + case Contract of + {value, #contract{} = C} -> + {dialyzer_contracts:is_overloaded(C), + dialyzer_contracts:contract_to_string(C)}; + none -> {false, none} + end, + EnumArgTypes = lists:zip(lists:seq(1, length(NewArgTypes)), NewArgTypes), + ArgNs = [Arg || {Arg, Type} <- EnumArgTypes, t_is_none(Type)], + case state__lookup_name(Fun, State) of + {M, F, A} -> + case is_opaque_type_test_problem(Fun, Args, NewArgTypes, State) of + {yes, Arg, ArgType} -> + {opaque_type_test, [atom_to_list(F), ArgStrings, + format_arg(Arg), format_type(ArgType, State)]}; + no -> + SigArgs = t_fun_args(Sig), + BadOpaque = + opaque_problems([SigArgs, ContrArgs], ArgTypes, Opaques, ArgNs), + %% In fact *both* 'call_with_opaque' and + %% 'call_without_opaque' are possible. + case lists:keyfind(decl, 1, BadOpaque) of + {decl, BadArgs} -> + %% a structured term is used where an opaque is expected + ExpectedTriples = + case FailReason of + only_sig -> expected_arg_triples(BadArgs, SigArgs, State); + _ -> expected_arg_triples(BadArgs, ContrArgs, State) + end, + {call_without_opaque, [M, F, ArgStrings, ExpectedTriples]}; + false -> + case lists:keyfind(use, 1, BadOpaque) of + {use, BadArgs} -> + %% an opaque term is used where a structured term is expected + ExpectedArgs = + case FailReason of + only_sig -> SigArgs; + _ -> ContrArgs + end, + {call_with_opaque, [M, F, ArgStrings, BadArgs, ExpectedArgs]}; + false -> + case + erl_bif_types:opaque_args(M, F, A, ArgTypes, Opaques) + of + [] -> %% there is a structured term clash in some argument + {call, [M, F, ArgStrings, + ArgNs, FailReason, + format_sig_args(Sig, State), + format_type(t_fun_range(Sig), State), + ContractInfo]}; + Ns -> + {call_with_opaque, [M, F, ArgStrings, Ns, ContrArgs]} + end + end + end + end; + Label when is_integer(Label) -> + {apply, [ArgStrings, + ArgNs, FailReason, + format_sig_args(Sig, State), + format_type(t_fun_range(Sig), State), + ContractInfo]} + end. + +%% -> [{ElementI, [ArgN]}] where [ArgN] is a non-empty list of +%% arguments containing unknown opaque types and Element is 1 or 2. +opaque_problems(ContractOrSigList, ArgTypes, Opaques, ArgNs) -> + ArgElementList = find_unknown(ContractOrSigList, ArgTypes, Opaques, ArgNs), + F = fun(1) -> decl; (2) -> use end, + [{F(ElementI), lists:usort([ArgN || {ArgN, EI} <- ArgElementList, + EI =:= ElementI])} || + ElementI <- lists:usort([EI || {_, EI} <- ArgElementList])]. + +%% -> [{ArgN, ElementI}] where ElementI = 1 means there is an unknown +%% opaque type in argument ArgN of the the contract/signature, +%% and ElementI = 2 means that there is an unknown opaque type in +%% argument ArgN of the the (current) argument types. +find_unknown(ContractOrSigList, ArgTypes, Opaques, NoneArgNs) -> + ArgNs = lists:seq(1, length(ArgTypes)), + [{ArgN, ElementI} || + ContractOrSig <- ContractOrSigList, + {E1, E2, ArgN} <- lists:zip3(ContractOrSig, ArgTypes, ArgNs), + lists:member(ArgN, NoneArgNs), + ElementI <- erl_types:t_find_unknown_opaque(E1, E2, Opaques)]. + +is_opaque_type_test_problem(Fun, Args, ArgTypes, State) -> + case Fun of + {erlang, FN, 1} when FN =:= is_atom; FN =:= is_boolean; + FN =:= is_binary; FN =:= is_bitstring; + FN =:= is_float; FN =:= is_function; + FN =:= is_integer; FN =:= is_list; + FN =:= is_number; FN =:= is_pid; FN =:= is_port; + FN =:= is_reference; FN =:= is_tuple; + FN =:= is_map -> + type_test_opaque_arg(Args, ArgTypes, State#state.opaques); + {erlang, FN, 2} when FN =:= is_function -> + type_test_opaque_arg(Args, ArgTypes, State#state.opaques); + _ -> no + end. + +type_test_opaque_arg([], [], _Opaques) -> + no; +type_test_opaque_arg([Arg|Args], [ArgType|ArgTypes], Opaques) -> + case erl_types:t_has_opaque_subtype(ArgType, Opaques) of + true -> {yes, Arg, ArgType}; + false -> type_test_opaque_arg(Args, ArgTypes, Opaques) + end. + +expected_arg_triples(ArgNs, ArgTypes, State) -> + [begin + Arg = lists:nth(N, ArgTypes), + {N, Arg, format_type(Arg, State)} + end || N <- ArgNs]. + +add_bif_warnings({erlang, Op, 2}, [T1, T2] = Ts, Tree, State) + when Op =:= '=:='; Op =:= '==' -> + Opaques = State#state.opaques, + Inf = t_inf(T1, T2, Opaques), + case + t_is_none(Inf) andalso (not any_none(Ts)) + andalso (not is_int_float_eq_comp(T1, Op, T2, Opaques)) + of + true -> + %% Give priority to opaque warning (as usual). + case erl_types:t_find_unknown_opaque(T1, T2, Opaques) of + [] -> + Args = comp_format_args([], T1, Op, T2, State), + state__add_warning(State, ?WARN_MATCHING, Tree, {exact_eq, Args}); + Ns -> + Args = comp_format_args(Ns, T1, Op, T2, State), + state__add_warning(State, ?WARN_OPAQUE, Tree, {opaque_eq, Args}) + end; + false -> + State + end; +add_bif_warnings({erlang, Op, 2}, [T1, T2] = Ts, Tree, State) + when Op =:= '=/='; Op =:= '/=' -> + Opaques = State#state.opaques, + case + (not any_none(Ts)) + andalso (not is_int_float_eq_comp(T1, Op, T2, Opaques)) + of + true -> + case erl_types:t_find_unknown_opaque(T1, T2, Opaques) of + [] -> State; + Ns -> + Args = comp_format_args(Ns, T1, Op, T2, State), + state__add_warning(State, ?WARN_OPAQUE, Tree, {opaque_neq, Args}) + end; + false -> + State + end; +add_bif_warnings(_, _, _, State) -> + State. + +is_int_float_eq_comp(T1, Op, T2, Opaques) -> + (Op =:= '==' orelse Op =:= '/=') andalso + ((erl_types:t_is_float(T1, Opaques) + andalso t_is_integer(T2, Opaques)) orelse + (t_is_integer(T1, Opaques) + andalso erl_types:t_is_float(T2, Opaques))). + +comp_format_args([1|_], T1, Op, T2, State) -> + [format_type(T2, State), Op, format_type(T1, State)]; +comp_format_args(_, T1, Op, T2, State) -> + [format_type(T1, State), Op, format_type(T2, State)]. + +%%---------------------------------------- + +handle_bitstr(Tree, Map, State) -> + %% Construction of binaries. + Size = cerl:bitstr_size(Tree), + Val = cerl:bitstr_val(Tree), + BitstrType = cerl:concrete(cerl:bitstr_type(Tree)), + {State1, Map1, SizeType0} = traverse(Size, Map, State), + {State2, Map2, ValType0} = traverse(Val, Map1, State1), + case cerl:bitstr_bitsize(Tree) of + BitSz when BitSz =:= all orelse BitSz =:= utf -> + ValType = + case BitSz of + all -> + true = (BitstrType =:= binary), + t_inf(ValType0, t_bitstr()); + utf -> + true = lists:member(BitstrType, [utf8, utf16, utf32]), + t_inf(ValType0, t_integer()) + end, + Map3 = enter_type(Val, ValType, Map2), + case t_is_none(ValType) of + true -> + Msg = {bin_construction, ["value", + format_cerl(Val), format_cerl(Tree), + format_type(ValType0, State2)]}, + State3 = state__add_warning(State2, ?WARN_BIN_CONSTRUCTION, Val, Msg), + {State3, Map3, t_none()}; + false -> + {State2, Map3, t_bitstr()} + end; + BitSz when is_integer(BitSz) orelse BitSz =:= any -> + SizeType = t_inf(SizeType0, t_non_neg_integer()), + ValType = + case BitstrType of + binary -> t_inf(ValType0, t_bitstr()); + float -> t_inf(ValType0, t_number()); + integer -> t_inf(ValType0, t_integer()) + end, + case any_none([SizeType, ValType]) of + true -> + {Msg, Offending} = + case t_is_none(SizeType) of + true -> + {{bin_construction, + ["size", format_cerl(Size), format_cerl(Tree), + format_type(SizeType0, State2)]}, + Size}; + false -> + {{bin_construction, + ["value", format_cerl(Val), format_cerl(Tree), + format_type(ValType0, State2)]}, + Val} + end, + State3 = state__add_warning(State2, ?WARN_BIN_CONSTRUCTION, + Offending, Msg), + {State3, Map2, t_none()}; + false -> + UnitVal = cerl:concrete(cerl:bitstr_unit(Tree)), + Opaques = State2#state.opaques, + NumberVals = t_number_vals(SizeType, Opaques), + {State3, Type} = + case t_contains_opaque(SizeType, Opaques) of + true -> + Msg = {opaque_size, [format_type(SizeType, State2), + format_cerl(Size)]}, + {state__add_warning(State2, ?WARN_OPAQUE, Size, Msg), + t_none()}; + false -> + case NumberVals of + [OneSize] -> {State2, t_bitstr(0, OneSize * UnitVal)}; + unknown -> {State2, t_bitstr()}; + _ -> + MinSize = erl_types:number_min(SizeType, Opaques), + {State2, t_bitstr(UnitVal, UnitVal * MinSize)} + end + end, + Map3 = enter_type_lists([Val, Size, Tree], + [ValType, SizeType, Type], Map2), + {State3, Map3, Type} + end + end. + +%%---------------------------------------- + +handle_call(Tree, Map, State) -> + M = cerl:call_module(Tree), + F = cerl:call_name(Tree), + Args = cerl:call_args(Tree), + MFAList = [M, F|Args], + {State1, Map1, [MType0, FType0|As]} = traverse_list(MFAList, Map, State), + Opaques = State#state.opaques, + MType = t_inf(t_module(), MType0, Opaques), + FType = t_inf(t_atom(), FType0, Opaques), + Map2 = enter_type_lists([M, F], [MType, FType], Map1), + MOpaque = t_is_none(MType) andalso (not t_is_none(MType0)), + FOpaque = t_is_none(FType) andalso (not t_is_none(FType0)), + case any_none([MType, FType|As]) of + true -> + State2 = + if + MOpaque -> % This is a problem we just detected; not a known one + MS = format_cerl(M), + case t_is_none(t_inf(t_module(), MType0)) of + true -> + Msg = {app_call, [MS, format_cerl(F), + format_args(Args, As, State1), + MS, format_type(t_module(), State1), + format_type(MType0, State1)]}, + state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg); + false -> + Msg = {opaque_call, [MS, format_cerl(F), + format_args(Args, As, State1), + MS, format_type(MType0, State1)]}, + state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg) + end; + FOpaque -> + FS = format_cerl(F), + case t_is_none(t_inf(t_atom(), FType0)) of + true -> + Msg = {app_call, [format_cerl(M), FS, + format_args(Args, As, State1), + FS, format_type(t_atom(), State1), + format_type(FType0, State1)]}, + state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg); + false -> + Msg = {opaque_call, [format_cerl(M), FS, + format_args(Args, As, State1), + FS, format_type(FType0, State1)]}, + state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg) + end; + true -> State1 + end, + {State2, Map2, t_none()}; + false -> + case t_is_atom(MType) of + true -> + %% XXX: Consider doing this for all combinations of MF + case {t_atom_vals(MType), t_atom_vals(FType)} of + {[MAtom], [FAtom]} -> + FunInfo = [{remote, state__fun_info({MAtom, FAtom, length(Args)}, + State1)}], + handle_apply_or_call(FunInfo, Args, As, Map2, Tree, State1); + {_MAtoms, _FAtoms} -> + {State1, Map2, t_any()} + end; + false -> + {State1, Map2, t_any()} + end + end. + +%%---------------------------------------- + +handle_case(Tree, Map, State) -> + Arg = cerl:case_arg(Tree), + Clauses = filter_match_fail(cerl:case_clauses(Tree)), + {State1, Map1, ArgType} = SMA = traverse(Arg, Map, State), + case t_is_none_or_unit(ArgType) of + true -> SMA; + false -> + State2 = + case is_race_analysis_enabled(State) of + true -> + {RaceList, RaceListSize} = get_race_list_and_size(State1), + state__renew_race_list([beg_case|RaceList], + RaceListSize + 1, State1); + false -> State1 + end, + Map2 = join_maps_begin(Map1), + {MapList, State3, Type} = + handle_clauses(Clauses, Arg, ArgType, ArgType, State2, + [], Map2, [], []), + Map3 = join_maps_end(MapList, Map2), + debug_pp_map(Map3), + {State3, Map3, Type} + end. + +%%---------------------------------------- + +handle_cons(Tree, Map, State) -> + Hd = cerl:cons_hd(Tree), + Tl = cerl:cons_tl(Tree), + {State1, Map1, HdType} = traverse(Hd, Map, State), + {State2, Map2, TlType} = traverse(Tl, Map1, State1), + State3 = + case t_is_none(t_inf(TlType, t_list(), State2#state.opaques)) of + true -> + Msg = {improper_list_constr, [format_type(TlType, State2)]}, + state__add_warning(State2, ?WARN_NON_PROPER_LIST, Tree, Msg); + false -> + State2 + end, + Type = t_cons(HdType, TlType), + {State3, Map2, Type}. + +%%---------------------------------------- + +handle_let(Tree, Map, State) -> + IsRaceAnalysisEnabled = is_race_analysis_enabled(State), + Arg = cerl:let_arg(Tree), + Vars = cerl:let_vars(Tree), + {Map0, State0} = + case cerl:is_c_var(Arg) of + true -> + [Var] = Vars, + {enter_subst(Var, Arg, Map), + case IsRaceAnalysisEnabled of + true -> + {RaceList, RaceListSize} = get_race_list_and_size(State), + state__renew_race_list( + [dialyzer_races:let_tag_new(Var, Arg)|RaceList], + RaceListSize + 1, State); + false -> State + end}; + false -> {Map, State} + end, + Body = cerl:let_body(Tree), + {State1, Map1, ArgTypes} = SMA = traverse(Arg, Map0, State0), + State2 = + case IsRaceAnalysisEnabled andalso cerl:is_c_call(Arg) of + true -> + Mod = cerl:call_module(Arg), + Name = cerl:call_name(Arg), + case cerl:is_literal(Mod) andalso + cerl:concrete(Mod) =:= ets andalso + cerl:is_literal(Name) andalso + cerl:concrete(Name) =:= new of + true -> renew_race_public_tables(Vars, State1); + false -> State1 + end; + false -> State1 + end, + case t_is_none_or_unit(ArgTypes) of + true -> SMA; + false -> + Map2 = enter_type_lists(Vars, t_to_tlist(ArgTypes), Map1), + traverse(Body, Map2, State2) + end. + +%%---------------------------------------- + +handle_module(Tree, Map, State) -> + %% By not including the variables in scope we can assure that we + %% will get the current function type when using the variables. + Defs = cerl:module_defs(Tree), + PartFun = fun({_Var, Fun}) -> + state__is_escaping(get_label(Fun), State) + end, + {Defs1, Defs2} = lists:partition(PartFun, Defs), + Letrec = cerl:c_letrec(Defs1, cerl:c_int(42)), + {State1, Map1, _FunTypes} = traverse(Letrec, Map, State), + %% Also add environments for the other top-level functions. + VarTypes = [{Var, state__fun_type(Fun, State1)} || {Var, Fun} <- Defs], + EnvMap = enter_type_list(VarTypes, Map), + FoldFun = fun({_Var, Fun}, AccState) -> + state__update_fun_env(Fun, EnvMap, AccState) + end, + State2 = lists:foldl(FoldFun, State1, Defs2), + {State2, Map1, t_any()}. + +%%---------------------------------------- + +handle_receive(Tree, Map, State) -> + Clauses = filter_match_fail(cerl:receive_clauses(Tree)), + Timeout = cerl:receive_timeout(Tree), + State1 = + case is_race_analysis_enabled(State) of + true -> + {RaceList, RaceListSize} = get_race_list_and_size(State), + state__renew_race_list([beg_case|RaceList], + RaceListSize + 1, State); + false -> State + end, + {MapList, State2, ReceiveType} = + handle_clauses(Clauses, ?no_arg, t_any(), t_any(), State1, [], Map, + [], []), + Map1 = join_maps(MapList, Map), + {State3, Map2, TimeoutType} = traverse(Timeout, Map1, State2), + Opaques = State3#state.opaques, + case (t_is_atom(TimeoutType, Opaques) andalso + (t_atom_vals(TimeoutType, Opaques) =:= ['infinity'])) of + true -> + {State3, Map2, ReceiveType}; + false -> + Action = cerl:receive_action(Tree), + {State4, Map3, ActionType} = traverse(Action, Map, State3), + Map4 = join_maps([Map3, Map1], Map), + Type = t_sup(ReceiveType, ActionType), + {State4, Map4, Type} + end. + +%%---------------------------------------- + +handle_try(Tree, Map, State) -> + Arg = cerl:try_arg(Tree), + EVars = cerl:try_evars(Tree), + Vars = cerl:try_vars(Tree), + Body = cerl:try_body(Tree), + Handler = cerl:try_handler(Tree), + {State1, Map1, ArgType} = traverse(Arg, Map, State), + Map2 = mark_as_fresh(Vars, Map1), + {SuccState, SuccMap, SuccType} = + case bind_pat_vars(Vars, t_to_tlist(ArgType), [], Map2, State1) of + {error, _, _, _, _} -> + {State1, map__new(), t_none()}; + {SuccMap1, VarTypes} -> + %% Try to bind the argument. Will only succeed if + %% it is a simple structured term. + SuccMap2 = + case bind_pat_vars_reverse([Arg], [t_product(VarTypes)], [], + SuccMap1, State1) of + {error, _, _, _, _} -> SuccMap1; + {SM, _} -> SM + end, + traverse(Body, SuccMap2, State1) + end, + ExcMap1 = mark_as_fresh(EVars, Map), + {State2, ExcMap2, HandlerType} = traverse(Handler, ExcMap1, SuccState), + TryType = t_sup(SuccType, HandlerType), + {State2, join_maps([ExcMap2, SuccMap], Map1), TryType}. + +%%---------------------------------------- + +handle_map(Tree,Map,State) -> + Pairs = cerl:map_es(Tree), + Arg = cerl:map_arg(Tree), + {State1, Map1, ArgType} = traverse(Arg, Map, State), + ArgType1 = t_inf(t_map(), ArgType), + case t_is_none_or_unit(ArgType1) of + true -> + {State1, Map1, ArgType1}; + false -> + {State2, Map2, TypePairs, ExactKeys} = + traverse_map_pairs(Pairs, Map1, State1, t_none(), [], []), + InsertPair = fun({KV,assoc,_},Acc) -> erl_types:t_map_put(KV,Acc); + ({KV,exact,KVTree},Acc) -> + case t_is_none(T=erl_types:t_map_update(KV,Acc)) of + true -> throw({none, Acc, KV, KVTree}); + false -> T + end + end, + try lists:foldl(InsertPair, ArgType1, TypePairs) + of ResT -> + BindT = t_map([{K, t_any()} || K <- ExactKeys]), + case bind_pat_vars_reverse([Arg], [BindT], [], Map2, State2) of + {error, _, _, _, _} -> {State2, Map2, ResT}; + {Map3, _} -> {State2, Map3, ResT} + end + catch {none, MapType, {K,_}, KVTree} -> + Msg2 = {map_update, [format_type(MapType, State2), + format_type(K, State2)]}, + {state__add_warning(State2, ?WARN_MAP_CONSTRUCTION, KVTree, Msg2), + Map2, t_none()} + end + end. + +traverse_map_pairs([], Map, State, _ShadowKeys, PairAcc, KeyAcc) -> + {State, Map, lists:reverse(PairAcc), KeyAcc}; +traverse_map_pairs([Pair|Pairs], Map, State, ShadowKeys, PairAcc, KeyAcc) -> + Key = cerl:map_pair_key(Pair), + Val = cerl:map_pair_val(Pair), + Op = cerl:map_pair_op(Pair), + {State1, Map1, [K,V]} = traverse_list([Key,Val],Map,State), + KeyAcc1 = + case cerl:is_literal(Op) andalso cerl:concrete(Op) =:= exact andalso + t_is_singleton(K, State#state.opaques) andalso + t_is_none(t_inf(ShadowKeys, K)) of + true -> [K|KeyAcc]; + false -> KeyAcc + end, + traverse_map_pairs(Pairs, Map1, State1, t_sup(K, ShadowKeys), + [{{K,V},cerl:concrete(Op),Pair}|PairAcc], KeyAcc1). + +%%---------------------------------------- + +handle_tuple(Tree, Map, State) -> + Elements = cerl:tuple_es(Tree), + {State1, Map1, EsType} = traverse_list(Elements, Map, State), + TupleType = t_tuple(EsType), + case t_is_none(TupleType) of + true -> + {State1, Map1, t_none()}; + false -> + %% Let's find out if this is a record + case Elements of + [Tag|Left] -> + case cerl:is_c_atom(Tag) andalso is_literal_record(Tree) of + true -> + TagVal = cerl:atom_val(Tag), + case state__lookup_record(TagVal, length(Left), State1) of + error -> {State1, Map1, TupleType}; + {ok, RecType} -> + InfTupleType = t_inf(RecType, TupleType), + case t_is_none(InfTupleType) of + true -> + RecC = format_type(TupleType, State1), + FieldDiffs = format_field_diffs(TupleType, State1), + Msg = {record_constr, [RecC, FieldDiffs]}, + State2 = state__add_warning(State1, ?WARN_MATCHING, + Tree, Msg), + {State2, Map1, t_none()}; + false -> + case bind_pat_vars(Elements, t_tuple_args(RecType), + [], Map1, State1) of + {error, bind, ErrorPat, ErrorType, _} -> + Msg = {record_constr, + [TagVal, format_patterns(ErrorPat), + format_type(ErrorType, State1)]}, + State2 = state__add_warning(State1, ?WARN_MATCHING, + Tree, Msg), + {State2, Map1, t_none()}; + {error, opaque, ErrorPat, ErrorType, OpaqueType} -> + Msg = {opaque_match, + [format_patterns(ErrorPat), + format_type(ErrorType, State1), + format_type(OpaqueType, State1)]}, + State2 = state__add_warning(State1, ?WARN_OPAQUE, + Tree, Msg), + {State2, Map1, t_none()}; + {Map2, ETypes} -> + {State1, Map2, t_tuple(ETypes)} + end + end + end; + false -> + {State1, Map1, t_tuple(EsType)} + end; + [] -> + {State1, Map1, t_tuple([])} + end + end. + +%%---------------------------------------- +%% Clauses +%% +handle_clauses([C|Left], Arg, ArgType, OrigArgType, State, CaseTypes, MapIn, + Acc, ClauseAcc) -> + IsRaceAnalysisEnabled = is_race_analysis_enabled(State), + State1 = + case IsRaceAnalysisEnabled of + true -> + {RaceList, RaceListSize} = get_race_list_and_size(State), + state__renew_race_list( + [dialyzer_races:beg_clause_new(Arg, cerl:clause_pats(C), + cerl:clause_guard(C))| + RaceList], RaceListSize + 1, + State); + false -> State + end, + {State2, ClauseMap, BodyType, NewArgType} = + do_clause(C, Arg, ArgType, OrigArgType, MapIn, State1), + {NewClauseAcc, State3} = + case IsRaceAnalysisEnabled of + true -> + {RaceList1, RaceListSize1} = get_race_list_and_size(State2), + EndClause = dialyzer_races:end_clause_new(Arg, cerl:clause_pats(C), + cerl:clause_guard(C)), + {[EndClause|ClauseAcc], + state__renew_race_list([EndClause|RaceList1], + RaceListSize1 + 1, State2)}; + false -> {ClauseAcc, State2} + end, + {NewCaseTypes, NewAcc} = + case t_is_none(BodyType) of + true -> {CaseTypes, Acc}; + false -> {[BodyType|CaseTypes], [ClauseMap|Acc]} + end, + handle_clauses(Left, Arg, NewArgType, OrigArgType, State3, + NewCaseTypes, MapIn, NewAcc, NewClauseAcc); +handle_clauses([], _Arg, _ArgType, _OrigArgType, State, CaseTypes, _MapIn, Acc, + ClauseAcc) -> + State1 = + case is_race_analysis_enabled(State) of + true -> + {RaceList, RaceListSize} = get_race_list_and_size(State), + state__renew_race_list( + [dialyzer_races:end_case_new(ClauseAcc)|RaceList], + RaceListSize + 1, State); + false -> State + end, + {lists:reverse(Acc), State1, t_sup(CaseTypes)}. + +do_clause(C, Arg, ArgType0, OrigArgType, Map, State) -> + Pats = cerl:clause_pats(C), + Guard = cerl:clause_guard(C), + Body = cerl:clause_body(C), + State1 = + case is_race_analysis_enabled(State) of + true -> + state__renew_fun_args(Pats, State); + false -> State + end, + Map0 = mark_as_fresh(Pats, Map), + Map1 = if Arg =:= ?no_arg -> Map0; + true -> bind_subst(Arg, Pats, Map0) + end, + BindRes = + case t_is_none(ArgType0) of + true -> + {error, bind, Pats, ArgType0, ArgType0}; + false -> + ArgTypes = + case t_is_any(ArgType0) of + true -> [ArgType0 || _ <- Pats]; + false -> t_to_tlist(ArgType0) + end, + bind_pat_vars(Pats, ArgTypes, [], Map1, State1) + end, + case BindRes of + {error, ErrorType, NewPats, Type, OpaqueTerm} -> + ?debug("Failed binding pattern: ~s\nto ~s\n", + [cerl_prettypr:format(C), format_type(ArgType0, State1)]), + case state__warning_mode(State1) of + false -> + {State1, Map, t_none(), ArgType0}; + true -> + {Msg, Force} = + case t_is_none(ArgType0) of + true -> + PatString = format_patterns(Pats), + PatTypes = [PatString, format_type(OrigArgType, State1)], + %% See if this is covered by an earlier clause or if it + %% simply cannot match + OrigArgTypes = + case t_is_any(OrigArgType) of + true -> Any = t_any(), [Any || _ <- Pats]; + false -> t_to_tlist(OrigArgType) + end, + Tag = + case bind_pat_vars(Pats, OrigArgTypes, [], Map1, State1) of + {error, bind, _, _, _} -> pattern_match; + {error, record, _, _, _} -> record_match; + {error, opaque, _, _, _} -> opaque_match; + {_, _} -> pattern_match_cov + end, + {{Tag, PatTypes}, false}; + false -> + %% Try to find out if this is a default clause in a list + %% comprehension and supress this. A real Hack(tm) + Force0 = + case is_compiler_generated(cerl:get_ann(C)) of + true -> + case Pats of + [Pat] -> + case cerl:is_c_cons(Pat) of + true -> + not (cerl:is_c_var(cerl:cons_hd(Pat)) andalso + cerl:is_c_var(cerl:cons_tl(Pat)) andalso + cerl:is_literal(Guard) andalso + (cerl:concrete(Guard) =:= true)); + false -> + true + end; + [Pat0, Pat1] -> % binary comprehension + case cerl:is_c_cons(Pat0) of + true -> + not (cerl:is_c_var(cerl:cons_hd(Pat0)) andalso + cerl:is_c_var(cerl:cons_tl(Pat0)) andalso + cerl:is_c_var(Pat1) andalso + cerl:is_literal(Guard) andalso + (cerl:concrete(Guard) =:= true)); + false -> + true + end; + _ -> true + end; + false -> + true + end, + PatString = + case ErrorType of + bind -> format_patterns(Pats); + record -> format_patterns(NewPats); + opaque -> format_patterns(NewPats) + end, + PatTypes = case ErrorType of + bind -> [PatString, format_type(ArgType0, State1)]; + record -> [PatString, format_type(Type, State1)]; + opaque -> [PatString, format_type(Type, State1), + format_type(OpaqueTerm, State1)] + end, + FailedTag = case ErrorType of + bind -> pattern_match; + record -> record_match; + opaque -> opaque_match + end, + {{FailedTag, PatTypes}, Force0} + end, + WarnType = case Msg of + {opaque_match, _} -> ?WARN_OPAQUE; + {pattern_match, _} -> ?WARN_MATCHING; + {record_match, _} -> ?WARN_MATCHING; + {pattern_match_cov, _} -> ?WARN_MATCHING + end, + {state__add_warning(State1, WarnType, C, Msg, Force), + Map, t_none(), ArgType0} + end; + {Map2, PatTypes} -> + Map3 = + case Arg =:= ?no_arg of + true -> Map2; + false -> + %% Try to bind the argument. Will only succeed if + %% it is a simple structured term. + case bind_pat_vars_reverse([Arg], [t_product(PatTypes)], + [], Map2, State1) of + {error, _, _, _, _} -> Map2; + {NewMap, _} -> NewMap + end + end, + NewArgType = + case Arg =:= ?no_arg of + true -> ArgType0; + false -> + GenType = dialyzer_typesig:get_safe_underapprox(Pats, Guard), + t_subtract(t_product(t_to_tlist(ArgType0)), GenType) + end, + case bind_guard(Guard, Map3, State1) of + {error, Reason} -> + ?debug("Failed guard: ~s\n", + [cerl_prettypr:format(C, [{hook, cerl_typean:pp_hook()}])]), + PatString = format_patterns(Pats), + DefaultMsg = + case Pats =:= [] of + true -> {guard_fail, []}; + false -> + {guard_fail_pat, [PatString, format_type(ArgType0, State1)]} + end, + State2 = + case Reason of + none -> state__add_warning(State1, ?WARN_MATCHING, C, DefaultMsg); + {FailGuard, Msg} -> + case is_compiler_generated(cerl:get_ann(FailGuard)) of + false -> + WarnType = case Msg of + {guard_fail, _} -> ?WARN_MATCHING; + {neg_guard_fail, _} -> ?WARN_MATCHING; + {opaque_guard, _} -> ?WARN_OPAQUE + end, + state__add_warning(State1, WarnType, FailGuard, Msg); + true -> + state__add_warning(State1, ?WARN_MATCHING, C, Msg) + end + end, + {State2, Map, t_none(), NewArgType}; + Map4 -> + {RetState, RetMap, BodyType} = traverse(Body, Map4, State1), + {RetState, RetMap, BodyType, NewArgType} + end + end. + +bind_subst(Arg, Pats, Map) -> + case cerl:type(Arg) of + values -> + bind_subst_list(cerl:values_es(Arg), Pats, Map); + var -> + [Pat] = Pats, + enter_subst(Arg, Pat, Map); + _ -> + Map + end. + +bind_subst_list([Arg|ArgLeft], [Pat|PatLeft], Map) -> + NewMap = + case {cerl:type(Arg), cerl:type(Pat)} of + {var, var} -> enter_subst(Arg, Pat, Map); + {var, alias} -> enter_subst(Arg, cerl:alias_pat(Pat), Map); + {literal, literal} -> Map; + {T, T} -> bind_subst_list(lists:flatten(cerl:subtrees(Arg)), + lists:flatten(cerl:subtrees(Pat)), + Map); + _ -> Map + end, + bind_subst_list(ArgLeft, PatLeft, NewMap); +bind_subst_list([], [], Map) -> + Map. + +%%---------------------------------------- +%% Patterns +%% + +bind_pat_vars(Pats, Types, Acc, Map, State) -> + try + bind_pat_vars(Pats, Types, Acc, Map, State, false) + catch + throw:Error -> + %% Error = {error, bind | opaque | record, ErrorPats, ErrorType} + Error + end. + +bind_pat_vars_reverse(Pats, Types, Acc, Map, State) -> + try + bind_pat_vars(Pats, Types, Acc, Map, State, true) + catch + throw:Error -> + %% Error = {error, bind | opaque | record, ErrorPats, ErrorType} + Error + end. + +bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) -> + ?debug("Binding pat: ~w to ~s\n", [cerl:type(Pat), format_type(Type, State)] +), + Opaques = State#state.opaques, + {NewMap, TypeOut} = + case cerl:type(Pat) of + alias -> + %% Map patterns are more allowing than the type of their literal. We + %% must unfold AliasPat if it is a literal. + AliasPat = dialyzer_utils:refold_pattern(cerl:alias_pat(Pat)), + Var = cerl:alias_var(Pat), + Map1 = enter_subst(Var, AliasPat, Map), + {Map2, [PatType]} = bind_pat_vars([AliasPat], [Type], [], + Map1, State, Rev), + {enter_type(Var, PatType, Map2), PatType}; + binary -> + %% Cannot bind the binary if we are in reverse match since + %% binary patterns and binary construction are not symmetric. + case Rev of + true -> {Map, t_bitstr()}; + false -> + BinType = t_inf(t_bitstr(), Type, Opaques), + case t_is_none(BinType) of + true -> + case t_find_opaque_mismatch(t_bitstr(), Type, Opaques) of + {ok, T1, T2} -> + bind_error([Pat], T1, T2, opaque); + error -> + bind_error([Pat], Type, t_none(), bind) + end; + false -> + Segs = cerl:binary_segments(Pat), + {Map1, SegTypes} = bind_bin_segs(Segs, BinType, Map, State), + {Map1, t_bitstr_concat(SegTypes)} + end + end; + cons -> + Cons = t_inf(Type, t_cons(), Opaques), + case t_is_none(Cons) of + true -> + bind_opaque_pats(t_cons(), Type, Pat, State); + false -> + {Map1, [HdType, TlType]} = + bind_pat_vars([cerl:cons_hd(Pat), cerl:cons_tl(Pat)], + [t_cons_hd(Cons, Opaques), + t_cons_tl(Cons, Opaques)], + [], Map, State, Rev), + {Map1, t_cons(HdType, TlType)} + end; + literal -> + Pat0 = dialyzer_utils:refold_pattern(Pat), + case cerl:is_literal(Pat0) of + true -> + Literal = literal_type(Pat), + case t_is_none(t_inf(Literal, Type, Opaques)) of + true -> + bind_opaque_pats(Literal, Type, Pat, State); + false -> {Map, Literal} + end; + false -> + %% Retry with the unfolded pattern + {Map1, [PatType]} + = bind_pat_vars([Pat0], [Type], [], Map, State, Rev), + {Map1, PatType} + end; + map -> + MapT = t_inf(Type, t_map(), Opaques), + case t_is_none(MapT) of + true -> + bind_opaque_pats(t_map(), Type, Pat, State); + false -> + case Rev of + %% TODO: Reverse matching (propagating a matched subset back to a value) + true -> {Map, MapT}; + false -> + FoldFun = + fun(Pair, {MapAcc, ListAcc}) -> + %% Only exact (:=) can appear in patterns + exact = cerl:concrete(cerl:map_pair_op(Pair)), + Key = cerl:map_pair_key(Pair), + KeyType = + case cerl:type(Key) of + var -> + case state__lookup_type_for_letrec(Key, State) of + error -> lookup_type(Key, MapAcc); + {ok, RecType} -> RecType + end; + literal -> + literal_type(Key) + end, + Bind = erl_types:t_map_get(KeyType, MapT), + {MapAcc1, [ValType]} = + bind_pat_vars([cerl:map_pair_val(Pair)], + [Bind], [], MapAcc, State, Rev), + case t_is_singleton(KeyType, Opaques) of + true -> {MapAcc1, [{KeyType, ValType}|ListAcc]}; + false -> {MapAcc1, ListAcc} + end + end, + {Map1, Pairs} = lists:foldl(FoldFun, {Map, []}, cerl:map_es(Pat)), + {Map1, t_inf(MapT, t_map(Pairs))} + end + end; + tuple -> + Es = cerl:tuple_es(Pat), + {TypedRecord, Prototype} = + case Es of + [] -> {false, t_tuple([])}; + [Tag|Left] -> + case cerl:is_c_atom(Tag) andalso is_literal_record(Pat) of + true -> + TagAtom = cerl:atom_val(Tag), + case state__lookup_record(TagAtom, length(Left), State) of + error -> {false, t_tuple(length(Es))}; + {ok, Record} -> + [_Head|AnyTail] = [t_any() || _ <- Es], + UntypedRecord = t_tuple([t_atom(TagAtom)|AnyTail]), + {not t_is_equal(Record, UntypedRecord), Record} + end; + false -> {false, t_tuple(length(Es))} + end + end, + Tuple = t_inf(Prototype, Type, Opaques), + case t_is_none(Tuple) of + true -> + bind_opaque_pats(Prototype, Type, Pat, State); + false -> + SubTuples = t_tuple_subtypes(Tuple, Opaques), + %% Need to call the top function to get the try-catch wrapper + MapJ = join_maps_begin(Map), + Results = + case Rev of + true -> + [bind_pat_vars_reverse(Es, t_tuple_args(SubTuple, Opaques), + [], MapJ, State) + || SubTuple <- SubTuples]; + false -> + [bind_pat_vars(Es, t_tuple_args(SubTuple, Opaques), [], + MapJ, State) + || SubTuple <- SubTuples] + end, + case lists:keyfind(opaque, 2, Results) of + {error, opaque, _PatList, _Type, Opaque} -> + bind_error([Pat], Tuple, Opaque, opaque); + false -> + case [M || {M, _} <- Results, M =/= error] of + [] -> + case TypedRecord of + true -> bind_error([Pat], Tuple, Prototype, record); + false -> bind_error([Pat], Tuple, t_none(), bind) + end; + Maps -> + Map1 = join_maps_end(Maps, MapJ), + TupleType = t_sup([t_tuple(EsTypes) + || {M, EsTypes} <- Results, M =/= error]), + {Map1, TupleType} + end + end + end; + values -> + Es = cerl:values_es(Pat), + {Map1, EsTypes} = + bind_pat_vars(Es, t_to_tlist(Type), [], Map, State, Rev), + {Map1, t_product(EsTypes)}; + var -> + VarType1 = + case state__lookup_type_for_letrec(Pat, State) of + error -> lookup_type(Pat, Map); + {ok, RecType} -> RecType + end, + %% Must do inf when binding args to pats. Vars in pats are fresh. + VarType2 = t_inf(VarType1, Type, Opaques), + case t_is_none(VarType2) of + true -> + case t_find_opaque_mismatch(VarType1, Type, Opaques) of + {ok, T1, T2} -> + bind_error([Pat], T1, T2, opaque); + error -> + bind_error([Pat], Type, t_none(), bind) + end; + false -> + Map1 = enter_type(Pat, VarType2, Map), + {Map1, VarType2} + end; + _Other -> + %% Catch all is needed when binding args to pats + ?debug("Failed match for ~p\n", [_Other]), + bind_error([Pat], Type, t_none(), bind) + end, + bind_pat_vars(PatLeft, TypeLeft, [TypeOut|Acc], NewMap, State, Rev); +bind_pat_vars([], [], Acc, Map, _State, _Rev) -> + {Map, lists:reverse(Acc)}. + +bind_bin_segs(BinSegs, BinType, Map, State) -> + bind_bin_segs(BinSegs, BinType, [], Map, State). + +bind_bin_segs([Seg|Segs], BinType, Acc, Map, State) -> + Val = cerl:bitstr_val(Seg), + SegType = cerl:concrete(cerl:bitstr_type(Seg)), + UnitVal = cerl:concrete(cerl:bitstr_unit(Seg)), + case cerl:bitstr_bitsize(Seg) of + all -> + binary = SegType, [] = Segs, %% just an assert + T = t_inf(t_bitstr(UnitVal, 0), BinType), + {Map1, [Type]} = bind_pat_vars([Val], [T], [], Map, State, false), + Type1 = remove_local_opaque_types(Type, State#state.opaques), + bind_bin_segs(Segs, t_bitstr(0, 0), [Type1|Acc], Map1, State); + utf -> % XXX: possibly can be strengthened + true = lists:member(SegType, [utf8, utf16, utf32]), + {Map1, [_]} = bind_pat_vars([Val], [t_integer()], [], Map, State, false), + Type = t_binary(), + bind_bin_segs(Segs, BinType, [Type|Acc], Map1, State); + BitSz when is_integer(BitSz) orelse BitSz =:= any -> + Size = cerl:bitstr_size(Seg), + {Map1, [SizeType]} = + bind_pat_vars([Size], [t_non_neg_integer()], [], Map, State, false), + Opaques = State#state.opaques, + NumberVals = t_number_vals(SizeType, Opaques), + case t_contains_opaque(SizeType, Opaques) of + true -> bind_error([Seg], SizeType, t_none(), opaque); + false -> ok + end, + Type = + case NumberVals of + [OneSize] -> t_bitstr(0, UnitVal * OneSize); + _ -> % 'unknown' too + MinSize = erl_types:number_min(SizeType, Opaques), + t_bitstr(UnitVal, UnitVal * MinSize) + end, + ValConstr = + case SegType of + binary -> Type; %% The same constraints as for the whole bitstr + float -> t_float(); + integer -> + case NumberVals of + unknown -> t_integer(); + List -> + SizeVal = lists:max(List), + Flags = cerl:concrete(cerl:bitstr_flags(Seg)), + N = SizeVal * UnitVal, + case N >= ?BITS of + true -> + case lists:member(signed, Flags) of + true -> t_from_range(neg_inf, pos_inf); + false -> t_from_range(0, pos_inf) + end; + false -> + case lists:member(signed, Flags) of + true -> t_from_range(-(1 bsl (N - 1)), 1 bsl (N - 1) - 1); + false -> t_from_range(0, 1 bsl N - 1) + end + end + end + end, + {Map2, [_]} = bind_pat_vars([Val], [ValConstr], [], Map1, State, false), + NewBinType = t_bitstr_match(Type, BinType), + case t_is_none(NewBinType) of + true -> bind_error([Seg], BinType, t_none(), bind); + false -> bind_bin_segs(Segs, NewBinType, [Type|Acc], Map2, State) + end + end; +bind_bin_segs([], _BinType, Acc, Map, _State) -> + {Map, lists:reverse(Acc)}. + +bind_error(Pats, Type, OpaqueType, Error0) -> + Error = case {Error0, Pats} of + {bind, [Pat]} -> + case is_literal_record(Pat) of + true -> record; + false -> Error0 + end; + _ -> Error0 + end, + throw({error, Error, Pats, Type, OpaqueType}). + +-spec bind_opaque_pats(type(), type(), cerl:c_literal(), state()) -> + no_return(). + +bind_opaque_pats(GenType, Type, Pat, State) -> + case t_find_opaque_mismatch(GenType, Type, State#state.opaques) of + {ok, T1, T2} -> + bind_error([Pat], T1, T2, opaque); + error -> + bind_error([Pat], Type, t_none(), bind) + end. + +%%---------------------------------------- +%% Guards +%% + +bind_guard(Guard, Map, State) -> + try bind_guard(Guard, Map, maps:new(), pos, State) of + {Map1, _Type} -> Map1 + catch + throw:{fail, Warning} -> {error, Warning}; + throw:{fatal_fail, Warning} -> {error, Warning} + end. + +bind_guard(Guard, Map, Env, Eval, State) -> + ?debug("Handling ~w guard: ~s\n", + [Eval, cerl_prettypr:format(Guard, [{noann, true}])]), + case cerl:type(Guard) of + binary -> + {Map, t_binary()}; + 'case' -> + Arg = cerl:case_arg(Guard), + Clauses = cerl:case_clauses(Guard), + bind_guard_case_clauses(Arg, Clauses, Map, Env, Eval, State); + cons -> + Hd = cerl:cons_hd(Guard), + Tl = cerl:cons_tl(Guard), + {Map1, HdType} = bind_guard(Hd, Map, Env, dont_know, State), + {Map2, TlType} = bind_guard(Tl, Map1, Env, dont_know, State), + {Map2, t_cons(HdType, TlType)}; + literal -> + {Map, literal_type(Guard)}; + 'try' -> + Arg = cerl:try_arg(Guard), + [Var] = cerl:try_vars(Guard), + EVars = cerl:try_evars(Guard), + %%?debug("Storing: ~w\n", [Var]), + Map1 = join_maps_begin(Map), + Map2 = mark_as_fresh(EVars, Map1), + %% Visit handler first so we know if it should be ignored + {{HandlerMap, HandlerType}, HandlerE} = + try {bind_guard(cerl:try_handler(Guard), Map2, Env, Eval, State), none} + catch throw:HE -> + {{Map2, t_none()}, HE} + end, + BodyEnv = maps:put(get_label(Var), Arg, Env), + Wanted = case Eval of pos -> t_atom(true); neg -> t_atom(false); + dont_know -> t_any() end, + case t_is_none(t_inf(HandlerType, Wanted)) of + %% Handler won't save us; pretend it does not exist + true -> bind_guard(cerl:try_body(Guard), Map, BodyEnv, Eval, State); + false -> + {{BodyMap, BodyType}, BodyE} = + try {bind_guard(cerl:try_body(Guard), Map1, BodyEnv, + Eval, State), none} + catch throw:BE -> + {{Map1, t_none()}, BE} + end, + Map3 = join_maps_end([BodyMap, HandlerMap], Map1), + case t_is_none(Sup = t_sup(BodyType, HandlerType)) of + true -> + %% Pick a reason. N.B. We assume that the handler is always + %% compiler-generated if the body is; that way, we won't need to + %% check. + Fatality = case {BodyE, HandlerE} of + {{fatal_fail, _}, _} -> fatal_fail; + {_, {fatal_fail, _}} -> fatal_fail; + _ -> fail + end, + throw({Fatality, + case {BodyE, HandlerE} of + {{_, Rsn}, _} when Rsn =/= none -> Rsn; + {_, {_,Rsn}} -> Rsn; + _ -> none + end}); + false -> {Map3, Sup} + end + end; + tuple -> + Es0 = cerl:tuple_es(Guard), + {Map1, Es} = bind_guard_list(Es0, Map, Env, dont_know, State), + {Map1, t_tuple(Es)}; + map -> + case Eval of + dont_know -> handle_guard_map(Guard, Map, Env, State); + _PosOrNeg -> {Map, t_none()} %% Map exprs do not produce bools + end; + 'let' -> + Arg = cerl:let_arg(Guard), + [Var] = cerl:let_vars(Guard), + %%?debug("Storing: ~w\n", [Var]), + NewEnv = maps:put(get_label(Var), Arg, Env), + bind_guard(cerl:let_body(Guard), Map, NewEnv, Eval, State); + values -> + Es = cerl:values_es(Guard), + List = [bind_guard(V, Map, Env, dont_know, State) || V <- Es], + Type = t_product([T || {_, T} <- List]), + {Map, Type}; + var -> + ?debug("Looking for var(~w)...", [cerl_trees:get_label(Guard)]), + case maps:find(get_label(Guard), Env) of + error -> + ?debug("Did not find it\n", []), + Type = lookup_type(Guard, Map), + Constr = + case Eval of + pos -> t_atom(true); + neg -> t_atom(false); + dont_know -> Type + end, + Inf = t_inf(Constr, Type), + {enter_type(Guard, Inf, Map), Inf}; + {ok, Tree} -> + ?debug("Found it\n", []), + {Map1, Type} = bind_guard(Tree, Map, Env, Eval, State), + {enter_type(Guard, Type, Map1), Type} + end; + call -> + handle_guard_call(Guard, Map, Env, Eval, State) + end. + +handle_guard_call(Guard, Map, Env, Eval, State) -> + MFA = {cerl:atom_val(cerl:call_module(Guard)), + cerl:atom_val(cerl:call_name(Guard)), + cerl:call_arity(Guard)}, + case MFA of + {erlang, F, 1} when F =:= is_atom; F =:= is_boolean; + F =:= is_binary; F =:= is_bitstring; + F =:= is_float; F =:= is_function; + F =:= is_integer; F =:= is_list; F =:= is_map; + F =:= is_number; F =:= is_pid; F =:= is_port; + F =:= is_reference; F =:= is_tuple -> + handle_guard_type_test(Guard, F, Map, Env, Eval, State); + {erlang, is_function, 2} -> + handle_guard_is_function(Guard, Map, Env, Eval, State); + MFA when (MFA =:= {erlang, internal_is_record, 3}) or + (MFA =:= {erlang, is_record, 3}) -> + handle_guard_is_record(Guard, Map, Env, Eval, State); + {erlang, '=:=', 2} -> + handle_guard_eqeq(Guard, Map, Env, Eval, State); + {erlang, '==', 2} -> + handle_guard_eq(Guard, Map, Env, Eval, State); + {erlang, 'and', 2} -> + handle_guard_and(Guard, Map, Env, Eval, State); + {erlang, 'or', 2} -> + handle_guard_or(Guard, Map, Env, Eval, State); + {erlang, 'not', 1} -> + handle_guard_not(Guard, Map, Env, Eval, State); + {erlang, Comp, 2} when Comp =:= '<'; Comp =:= '=<'; + Comp =:= '>'; Comp =:= '>=' -> + handle_guard_comp(Guard, Comp, Map, Env, Eval, State); + _ -> + handle_guard_gen_fun(MFA, Guard, Map, Env, Eval, State) + end. + +handle_guard_gen_fun({M, F, A}, Guard, Map, Env, Eval, State) -> + Args = cerl:call_args(Guard), + {Map1, As} = bind_guard_list(Args, Map, Env, dont_know, State), + Opaques = State#state.opaques, + BifRet = erl_bif_types:type(M, F, A, As, Opaques), + case t_is_none(BifRet) of + true -> + %% Is this an error-bif? + case t_is_none(erl_bif_types:type(M, F, A)) of + true -> signal_guard_fail(Eval, Guard, As, State); + false -> signal_guard_fatal_fail(Eval, Guard, As, State) + end; + false -> + BifArgs = bif_args(M, F, A), + Map2 = enter_type_lists(Args, t_inf_lists(BifArgs, As, Opaques), Map1), + Ret = + case Eval of + pos -> t_inf(t_atom(true), BifRet); + neg -> t_inf(t_atom(false), BifRet); + dont_know -> BifRet + end, + case t_is_none(Ret) of + true -> + case Eval =:= pos of + true -> signal_guard_fail(Eval, Guard, As, State); + false -> throw({fail, none}) + end; + false -> {Map2, Ret} + end + end. + +handle_guard_type_test(Guard, F, Map, Env, Eval, State) -> + [Arg] = cerl:call_args(Guard), + {Map1, ArgType} = bind_guard(Arg, Map, Env, dont_know, State), + case bind_type_test(Eval, F, ArgType, State) of + error -> + ?debug("Type test: ~w failed\n", [F]), + signal_guard_fail(Eval, Guard, [ArgType], State); + {ok, NewArgType, Ret} -> + ?debug("Type test: ~w succeeded, NewType: ~s, Ret: ~s\n", + [F, t_to_string(NewArgType), t_to_string(Ret)]), + {enter_type(Arg, NewArgType, Map1), Ret} + end. + +bind_type_test(Eval, TypeTest, ArgType, State) -> + Type = case TypeTest of + is_atom -> t_atom(); + is_boolean -> t_boolean(); + is_binary -> t_binary(); + is_bitstring -> t_bitstr(); + is_float -> t_float(); + is_function -> t_fun(); + is_integer -> t_integer(); + is_list -> t_maybe_improper_list(); + is_map -> t_map(); + is_number -> t_number(); + is_pid -> t_pid(); + is_port -> t_port(); + is_reference -> t_reference(); + is_tuple -> t_tuple() + end, + case Eval of + pos -> + Inf = t_inf(Type, ArgType, State#state.opaques), + case t_is_none(Inf) of + true -> error; + false -> {ok, Inf, t_atom(true)} + end; + neg -> + Sub = t_subtract(ArgType, Type), + case t_is_none(Sub) of + true -> error; + false -> {ok, Sub, t_atom(false)} + end; + dont_know -> + {ok, ArgType, t_boolean()} + end. + +handle_guard_comp(Guard, Comp, Map, Env, Eval, State) -> + Args = cerl:call_args(Guard), + [Arg1, Arg2] = Args, + {Map1, ArgTypes} = bind_guard_list(Args, Map, Env, dont_know, State), + Opaques = State#state.opaques, + [Type1, Type2] = ArgTypes, + IsInt1 = t_is_integer(Type1, Opaques), + IsInt2 = t_is_integer(Type2, Opaques), + case {type(Arg1), type(Arg2)} of + {{literal, Lit1}, {literal, Lit2}} -> + case erlang:Comp(cerl:concrete(Lit1), cerl:concrete(Lit2)) of + true when Eval =:= pos -> {Map, t_atom(true)}; + true when Eval =:= dont_know -> {Map, t_atom(true)}; + true when Eval =:= neg -> {Map, t_atom(true)}; + false when Eval =:= pos -> + signal_guard_fail(Eval, Guard, ArgTypes, State); + false when Eval =:= dont_know -> {Map, t_atom(false)}; + false when Eval =:= neg -> {Map, t_atom(false)} + end; + {{literal, Lit1}, var} when IsInt1 andalso IsInt2 andalso (Eval =:= pos) -> + case bind_comp_literal_var(Lit1, Arg2, Type2, Comp, Map1, Opaques) of + error -> signal_guard_fail(Eval, Guard, ArgTypes, State); + {ok, NewMap} -> {NewMap, t_atom(true)} + end; + {var, {literal, Lit2}} when IsInt1 andalso IsInt2 andalso (Eval =:= pos) -> + case bind_comp_literal_var(Lit2, Arg1, Type1, invert_comp(Comp), + Map1, Opaques) of + error -> signal_guard_fail(Eval, Guard, ArgTypes, State); + {ok, NewMap} -> {NewMap, t_atom(true)} + end; + {_, _} -> + handle_guard_gen_fun({erlang, Comp, 2}, Guard, Map, Env, Eval, State) + end. + +invert_comp('=<') -> '>='; +invert_comp('<') -> '>'; +invert_comp('>=') -> '=<'; +invert_comp('>') -> '<'. + +bind_comp_literal_var(Lit, Var, VarType, CompOp, Map, Opaques) -> + LitVal = cerl:concrete(Lit), + NewVarType = + case t_number_vals(VarType, Opaques) of + unknown -> + Range = + case CompOp of + '=<' -> t_from_range(LitVal, pos_inf); + '<' -> t_from_range(LitVal + 1, pos_inf); + '>=' -> t_from_range(neg_inf, LitVal); + '>' -> t_from_range(neg_inf, LitVal - 1) + end, + t_inf(Range, VarType, Opaques); + NumberVals -> + NewNumberVals = [X || X <- NumberVals, erlang:CompOp(LitVal, X)], + t_integers(NewNumberVals) + end, + case t_is_none(NewVarType) of + true -> error; + false -> {ok, enter_type(Var, NewVarType, Map)} + end. + +handle_guard_is_function(Guard, Map, Env, Eval, State) -> + Args = cerl:call_args(Guard), + {Map1, ArgTypes0} = bind_guard_list(Args, Map, Env, dont_know, State), + [FunType0, ArityType0] = ArgTypes0, + Opaques = State#state.opaques, + ArityType = t_inf(ArityType0, t_integer(), Opaques), + case t_is_none(ArityType) of + true -> signal_guard_fail(Eval, Guard, ArgTypes0, State); + false -> + FunTypeConstr = + case t_number_vals(ArityType, State#state.opaques) of + unknown -> t_fun(); + Vals -> + t_sup([t_fun(lists:duplicate(X, t_any()), t_any()) || X <- Vals]) + end, + FunType = t_inf(FunType0, FunTypeConstr, Opaques), + case t_is_none(FunType) of + true -> + case Eval of + pos -> signal_guard_fail(Eval, Guard, ArgTypes0, State); + neg -> {Map1, t_atom(false)}; + dont_know -> {Map1, t_atom(false)} + end; + false -> + case Eval of + pos -> {enter_type_lists(Args, [FunType, ArityType], Map1), + t_atom(true)}; + neg -> {Map1, t_atom(false)}; + dont_know -> {Map1, t_boolean()} + end + end + end. + +handle_guard_is_record(Guard, Map, Env, Eval, State) -> + Args = cerl:call_args(Guard), + [Rec, Tag0, Arity0] = Args, + Tag = cerl:atom_val(Tag0), + Arity = cerl:int_val(Arity0), + {Map1, RecType} = bind_guard(Rec, Map, Env, dont_know, State), + ArityMin1 = Arity - 1, + Opaques = State#state.opaques, + Tuple = t_tuple([t_atom(Tag)|lists:duplicate(ArityMin1, t_any())]), + case t_is_none(t_inf(Tuple, RecType, Opaques)) of + true -> + case erl_types:t_has_opaque_subtype(RecType, Opaques) of + true -> + signal_guard_fail(Eval, Guard, + [RecType, t_from_term(Tag), + t_from_term(Arity)], + State); + false -> + case Eval of + pos -> signal_guard_fail(Eval, Guard, + [RecType, t_from_term(Tag), + t_from_term(Arity)], + State); + neg -> {Map1, t_atom(false)}; + dont_know -> {Map1, t_atom(false)} + end + end; + false -> + TupleType = + case state__lookup_record(Tag, ArityMin1, State) of + error -> Tuple; + {ok, Prototype} -> Prototype + end, + Type = t_inf(TupleType, RecType, State#state.opaques), + case t_is_none(Type) of + true -> + %% No special handling of opaque errors. + FArgs = "record " ++ format_type(RecType, State), + Msg = {record_matching, [FArgs, Tag]}, + throw({fail, {Guard, Msg}}); + false -> + case Eval of + pos -> {enter_type(Rec, Type, Map1), t_atom(true)}; + neg -> {Map1, t_atom(false)}; + dont_know -> {Map1, t_boolean()} + end + end + end. + +handle_guard_eq(Guard, Map, Env, Eval, State) -> + [Arg1, Arg2] = cerl:call_args(Guard), + case {type(Arg1), type(Arg2)} of + {{literal, Lit1}, {literal, Lit2}} -> + case cerl:concrete(Lit1) =:= cerl:concrete(Lit2) of + true -> + if + Eval =:= pos -> {Map, t_atom(true)}; + Eval =:= neg -> + ArgTypes = [t_from_term(cerl:concrete(Lit1)), + t_from_term(cerl:concrete(Lit2))], + signal_guard_fail(Eval, Guard, ArgTypes, State); + Eval =:= dont_know -> {Map, t_atom(true)} + end; + false -> + if + Eval =:= neg -> {Map, t_atom(false)}; + Eval =:= dont_know -> {Map, t_atom(false)}; + Eval =:= pos -> + ArgTypes = [t_from_term(cerl:concrete(Lit1)), + t_from_term(cerl:concrete(Lit2))], + signal_guard_fail(Eval, Guard, ArgTypes, State) + end + end; + {{literal, Lit1}, _} when Eval =:= pos -> + case cerl:concrete(Lit1) of + Atom when is_atom(Atom) -> + bind_eqeq_guard_lit_other(Guard, Lit1, Arg2, Map, Env, State); + [] -> + bind_eqeq_guard_lit_other(Guard, Lit1, Arg2, Map, Env, State); + _ -> + bind_eq_guard(Guard, Lit1, Arg2, Map, Env, Eval, State) + end; + {_, {literal, Lit2}} when Eval =:= pos -> + case cerl:concrete(Lit2) of + Atom when is_atom(Atom) -> + bind_eqeq_guard_lit_other(Guard, Lit2, Arg1, Map, Env, State); + [] -> + bind_eqeq_guard_lit_other(Guard, Lit2, Arg1, Map, Env, State); + _ -> + bind_eq_guard(Guard, Arg1, Lit2, Map, Env, Eval, State) + end; + {_, _} -> + bind_eq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State) + end. + +bind_eq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State) -> + {Map1, Type1} = bind_guard(Arg1, Map, Env, dont_know, State), + {Map2, Type2} = bind_guard(Arg2, Map1, Env, dont_know, State), + Opaques = State#state.opaques, + case + t_is_nil(Type1, Opaques) orelse t_is_nil(Type2, Opaques) + orelse t_is_atom(Type1, Opaques) orelse t_is_atom(Type2, Opaques) + of + true -> bind_eqeq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State); + false -> + %% XXX. Is this test OK? + OpArgs = erl_types:t_find_unknown_opaque(Type1, Type2, Opaques), + case OpArgs =:= [] of + true -> + case Eval of + pos -> {Map2, t_atom(true)}; + neg -> {Map2, t_atom(false)}; + dont_know -> {Map2, t_boolean()} + end; + false -> + signal_guard_fail(Eval, Guard, [Type1, Type2], State) + end + end. + +handle_guard_eqeq(Guard, Map, Env, Eval, State) -> + [Arg1, Arg2] = cerl:call_args(Guard), + case {type(Arg1), type(Arg2)} of + {{literal, Lit1}, {literal, Lit2}} -> + + case cerl:concrete(Lit1) =:= cerl:concrete(Lit2) of + true -> + if Eval =:= neg -> + ArgTypes = [t_from_term(cerl:concrete(Lit1)), + t_from_term(cerl:concrete(Lit2))], + signal_guard_fail(Eval, Guard, ArgTypes, State); + Eval =:= pos -> {Map, t_atom(true)}; + Eval =:= dont_know -> {Map, t_atom(true)} + end; + false -> + if Eval =:= neg -> {Map, t_atom(false)}; + Eval =:= dont_know -> {Map, t_atom(false)}; + Eval =:= pos -> + ArgTypes = [t_from_term(cerl:concrete(Lit1)), + t_from_term(cerl:concrete(Lit2))], + signal_guard_fail(Eval, Guard, ArgTypes, State) + end + end; + {{literal, Lit1}, _} when Eval =:= pos -> + bind_eqeq_guard_lit_other(Guard, Lit1, Arg2, Map, Env, State); + {_, {literal, Lit2}} when Eval =:= pos -> + bind_eqeq_guard_lit_other(Guard, Lit2, Arg1, Map, Env, State); + {_, _} -> + bind_eqeq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State) + end. + +bind_eqeq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State) -> + {Map1, Type1} = bind_guard(Arg1, Map, Env, dont_know, State), + {Map2, Type2} = bind_guard(Arg2, Map1, Env, dont_know, State), + ?debug("Types are:~s =:= ~s\n", [t_to_string(Type1), + t_to_string(Type2)]), + Opaques = State#state.opaques, + Inf = t_inf(Type1, Type2, Opaques), + case t_is_none(Inf) of + true -> + OpArgs = erl_types:t_find_unknown_opaque(Type1, Type2, Opaques), + case OpArgs =:= [] of + true -> + case Eval of + neg -> {Map2, t_atom(false)}; + dont_know -> {Map2, t_atom(false)}; + pos -> signal_guard_fail(Eval, Guard, [Type1, Type2], State) + end; + false -> + signal_guard_fail(Eval, Guard, [Type1, Type2], State) + end; + false -> + case Eval of + pos -> + case {cerl:type(Arg1), cerl:type(Arg2)} of + {var, var} -> + Map3 = enter_subst(Arg1, Arg2, Map2), + Map4 = enter_type(Arg2, Inf, Map3), + {Map4, t_atom(true)}; + {var, _} -> + Map3 = enter_type(Arg1, Inf, Map2), + {Map3, t_atom(true)}; + {_, var} -> + Map3 = enter_type(Arg2, Inf, Map2), + {Map3, t_atom(true)}; + {_, _} -> + {Map2, t_atom(true)} + end; + neg -> + {Map2, t_atom(false)}; + dont_know -> + {Map2, t_boolean()} + end + end. + +bind_eqeq_guard_lit_other(Guard, Arg1, Arg2, Map, Env, State) -> + Eval = dont_know, + Opaques = State#state.opaques, + case cerl:concrete(Arg1) of + true -> + {_, Type} = MT = bind_guard(Arg2, Map, Env, pos, State), + case t_is_any_atom(true, Type, Opaques) of + true -> MT; + false -> + {_, Type0} = bind_guard(Arg2, Map, Env, Eval, State), + signal_guard_fail(Eval, Guard, [Type0, t_atom(true)], State) + end; + false -> + {Map1, Type} = bind_guard(Arg2, Map, Env, neg, State), + case t_is_any_atom(false, Type, Opaques) of + true -> {Map1, t_atom(true)}; + false -> + {_, Type0} = bind_guard(Arg2, Map, Env, Eval, State), + signal_guard_fail(Eval, Guard, [Type0, t_atom(false)], State) + end; + Term -> + LitType = t_from_term(Term), + {Map1, Type} = bind_guard(Arg2, Map, Env, Eval, State), + case t_is_subtype(LitType, Type) of + false -> signal_guard_fail(Eval, Guard, [Type, LitType], State); + true -> + case cerl:is_c_var(Arg2) of + true -> {enter_type(Arg2, LitType, Map1), t_atom(true)}; + false -> {Map1, t_atom(true)} + end + end + end. + +handle_guard_and(Guard, Map, Env, Eval, State) -> + [Arg1, Arg2] = cerl:call_args(Guard), + Opaques = State#state.opaques, + case Eval of + pos -> + {Map1, Type1} = bind_guard(Arg1, Map, Env, Eval, State), + case t_is_any_atom(true, Type1, Opaques) of + false -> signal_guard_fail(Eval, Guard, [Type1, t_any()], State); + true -> + {Map2, Type2} = bind_guard(Arg2, Map1, Env, Eval, State), + case t_is_any_atom(true, Type2, Opaques) of + false -> signal_guard_fail(Eval, Guard, [Type1, Type2], State); + true -> {Map2, t_atom(true)} + end + end; + neg -> + MapJ = join_maps_begin(Map), + {Map1, Type1} = + try bind_guard(Arg1, MapJ, Env, neg, State) + catch throw:{fail, _} -> bind_guard(Arg2, MapJ, Env, pos, State) + end, + {Map2, Type2} = + try bind_guard(Arg2, MapJ, Env, neg, State) + catch throw:{fail, _} -> bind_guard(Arg1, MapJ, Env, pos, State) + end, + case + t_is_any_atom(false, Type1, Opaques) + orelse t_is_any_atom(false, Type2, Opaques) + of + true -> {join_maps_end([Map1, Map2], MapJ), t_atom(false)}; + false -> signal_guard_fail(Eval, Guard, [Type1, Type2], State) + end; + dont_know -> + MapJ = join_maps_begin(Map), + {Map1, Type1} = bind_guard(Arg1, MapJ, Env, dont_know, State), + {Map2, Type2} = bind_guard(Arg2, MapJ, Env, dont_know, State), + Bool1 = t_inf(Type1, t_boolean()), + Bool2 = t_inf(Type2, t_boolean()), + case t_is_none(Bool1) orelse t_is_none(Bool2) of + true -> throw({fatal_fail, none}); + false -> + NewMap = join_maps_end([Map1, Map2], MapJ), + NewType = + case {t_atom_vals(Bool1, Opaques), t_atom_vals(Bool2, Opaques)} of + {['true'] , ['true'] } -> t_atom(true); + {['false'], _ } -> t_atom(false); + {_ , ['false']} -> t_atom(false); + {unknown , _ } -> + signal_guard_fail(Eval, Guard, [Type1, Type2], State); + {_ , unknown } -> + signal_guard_fail(Eval, Guard, [Type1, Type2], State); + {_ , _ } -> t_boolean() + + end, + {NewMap, NewType} + end + end. + +handle_guard_or(Guard, Map, Env, Eval, State) -> + [Arg1, Arg2] = cerl:call_args(Guard), + Opaques = State#state.opaques, + case Eval of + pos -> + MapJ = join_maps_begin(Map), + {Map1, Bool1} = + try bind_guard(Arg1, MapJ, Env, pos, State) + catch + throw:{fail,_} -> bind_guard(Arg1, MapJ, Env, dont_know, State) + end, + {Map2, Bool2} = + try bind_guard(Arg2, MapJ, Env, pos, State) + catch + throw:{fail,_} -> bind_guard(Arg2, MapJ, Env, dont_know, State) + end, + case + ((t_is_any_atom(true, Bool1, Opaques) + andalso t_is_boolean(Bool2, Opaques)) + orelse + (t_is_any_atom(true, Bool2, Opaques) + andalso t_is_boolean(Bool1, Opaques))) + of + true -> {join_maps_end([Map1, Map2], MapJ), t_atom(true)}; + false -> signal_guard_fail(Eval, Guard, [Bool1, Bool2], State) + end; + neg -> + {Map1, Type1} = bind_guard(Arg1, Map, Env, neg, State), + case t_is_any_atom(false, Type1, Opaques) of + false -> signal_guard_fail(Eval, Guard, [Type1, t_any()], State); + true -> + {Map2, Type2} = bind_guard(Arg2, Map1, Env, neg, State), + case t_is_any_atom(false, Type2, Opaques) of + false -> signal_guard_fail(Eval, Guard, [Type1, Type2], State); + true -> {Map2, t_atom(false)} + end + end; + dont_know -> + MapJ = join_maps_begin(Map), + {Map1, Type1} = bind_guard(Arg1, MapJ, Env, dont_know, State), + {Map2, Type2} = bind_guard(Arg2, MapJ, Env, dont_know, State), + Bool1 = t_inf(Type1, t_boolean()), + Bool2 = t_inf(Type2, t_boolean()), + case t_is_none(Bool1) orelse t_is_none(Bool2) of + true -> throw({fatal_fail, none}); + false -> + NewMap = join_maps_end([Map1, Map2], MapJ), + NewType = + case {t_atom_vals(Bool1, Opaques), t_atom_vals(Bool2, Opaques)} of + {['false'], ['false']} -> t_atom(false); + {['true'] , _ } -> t_atom(true); + {_ , ['true'] } -> t_atom(true); + {unknown , _ } -> + signal_guard_fail(Eval, Guard, [Type1, Type2], State); + {_ , unknown } -> + signal_guard_fail(Eval, Guard, [Type1, Type2], State); + {_ , _ } -> t_boolean() + end, + {NewMap, NewType} + end + end. + +handle_guard_not(Guard, Map, Env, Eval, State) -> + [Arg] = cerl:call_args(Guard), + Opaques = State#state.opaques, + case Eval of + neg -> + {Map1, Type} = bind_guard(Arg, Map, Env, pos, State), + case t_is_any_atom(true, Type, Opaques) of + true -> {Map1, t_atom(false)}; + false -> + {_, Type0} = bind_guard(Arg, Map, Env, Eval, State), + signal_guard_fail(Eval, Guard, [Type0], State) + end; + pos -> + {Map1, Type} = bind_guard(Arg, Map, Env, neg, State), + case t_is_any_atom(false, Type, Opaques) of + true -> {Map1, t_atom(true)}; + false -> + {_, Type0} = bind_guard(Arg, Map, Env, Eval, State), + signal_guard_fail(Eval, Guard, [Type0], State) + end; + dont_know -> + {Map1, Type} = bind_guard(Arg, Map, Env, dont_know, State), + Bool = t_inf(Type, t_boolean()), + case t_is_none(Bool) of + true -> throw({fatal_fail, none}); + false -> + case t_atom_vals(Bool, Opaques) of + ['true'] -> {Map1, t_atom(false)}; + ['false'] -> {Map1, t_atom(true)}; + [_, _] -> {Map1, Bool}; + unknown -> signal_guard_fail(Eval, Guard, [Type], State) + end + end + end. + +bind_guard_list(Guards, Map, Env, Eval, State) -> + bind_guard_list(Guards, Map, Env, Eval, State, []). + +bind_guard_list([G|Gs], Map, Env, Eval, State, Acc) -> + {Map1, T} = bind_guard(G, Map, Env, Eval, State), + bind_guard_list(Gs, Map1, Env, Eval, State, [T|Acc]); +bind_guard_list([], Map, _Env, _Eval, _State, Acc) -> + {Map, lists:reverse(Acc)}. + +handle_guard_map(Guard, Map, Env, State) -> + Pairs = cerl:map_es(Guard), + Arg = cerl:map_arg(Guard), + {Map1, ArgType0} = bind_guard(Arg, Map, Env, dont_know, State), + ArgType1 = t_inf(t_map(), ArgType0), + case t_is_none_or_unit(ArgType1) of + true -> {Map1, t_none()}; + false -> + {Map2, TypePairs} = bind_guard_map_pairs(Pairs, Map1, Env, State, []), + {Map2, lists:foldl(fun({KV,assoc},Acc) -> erl_types:t_map_put(KV,Acc); + ({KV,exact},Acc) -> erl_types:t_map_update(KV,Acc) + end, ArgType1, TypePairs)} + end. + +bind_guard_map_pairs([], Map, _Env, _State, PairAcc) -> + {Map, lists:reverse(PairAcc)}; +bind_guard_map_pairs([Pair|Pairs], Map, Env, State, PairAcc) -> + Key = cerl:map_pair_key(Pair), + Val = cerl:map_pair_val(Pair), + Op = cerl:map_pair_op(Pair), + {Map1, [K,V]} = bind_guard_list([Key,Val],Map,Env,dont_know,State), + bind_guard_map_pairs(Pairs, Map1, Env, State, + [{{K,V},cerl:concrete(Op)}|PairAcc]). + +-type eval() :: 'pos' | 'neg' | 'dont_know'. + +-spec signal_guard_fail(eval(), cerl:c_call(), [type()], + state()) -> no_return(). + +signal_guard_fail(Eval, Guard, ArgTypes, State) -> + signal_guard_failure(Eval, Guard, ArgTypes, fail, State). + +-spec signal_guard_fatal_fail(eval(), cerl:c_call(), [erl_types:erl_type()], + state()) -> no_return(). + +signal_guard_fatal_fail(Eval, Guard, ArgTypes, State) -> + signal_guard_failure(Eval, Guard, ArgTypes, fatal_fail, State). + +signal_guard_failure(Eval, Guard, ArgTypes, Tag, State) -> + Args = cerl:call_args(Guard), + F = cerl:atom_val(cerl:call_name(Guard)), + {M, F, A} = MFA = {cerl:atom_val(cerl:call_module(Guard)), F, length(Args)}, + Opaques = State#state.opaques, + {Kind, XInfo} = + case erl_bif_types:opaque_args(M, F, A, ArgTypes, Opaques) of + [] -> + {case Eval of + neg -> neg_guard_fail; + pos -> guard_fail; + dont_know -> guard_fail + end, + []}; + Ns -> {opaque_guard, [Ns]} + end, + FArgs = + case is_infix_op(MFA) of + true -> + [ArgType1, ArgType2] = ArgTypes, + [Arg1, Arg2] = Args, + [format_args_1([Arg1], [ArgType1], State), + atom_to_list(F), + format_args_1([Arg2], [ArgType2], State)] ++ XInfo; + false -> + [F, format_args(Args, ArgTypes, State)] + end, + Msg = {Kind, FArgs}, + throw({Tag, {Guard, Msg}}). + +is_infix_op({erlang, '=:=', 2}) -> true; +is_infix_op({erlang, '==', 2}) -> true; +is_infix_op({erlang, '=/=', 2}) -> true; +is_infix_op({erlang, '=/', 2}) -> true; +is_infix_op({erlang, '<', 2}) -> true; +is_infix_op({erlang, '=<', 2}) -> true; +is_infix_op({erlang, '>', 2}) -> true; +is_infix_op({erlang, '>=', 2}) -> true; +is_infix_op({M, F, A}) when is_atom(M), is_atom(F), + is_integer(A), 0 =< A, A =< 255 -> false. + +bif_args(M, F, A) -> + case erl_bif_types:arg_types(M, F, A) of + unknown -> lists:duplicate(A, t_any()); + List -> List + end. + +bind_guard_case_clauses(Arg, Clauses, Map0, Env, Eval, State) -> + Clauses1 = filter_fail_clauses(Clauses), + Map = join_maps_begin(Map0), + {GenMap, GenArgType} = bind_guard(Arg, Map, Env, dont_know, State), + bind_guard_case_clauses(GenArgType, GenMap, Arg, Clauses1, Map, Env, Eval, + t_none(), [], State). + +filter_fail_clauses([Clause|Left]) -> + case (cerl:clause_pats(Clause) =:= []) of + true -> + Body = cerl:clause_body(Clause), + case cerl:is_literal(Body) andalso (cerl:concrete(Body) =:= fail) orelse + cerl:is_c_primop(Body) andalso + (cerl:atom_val(cerl:primop_name(Body)) =:= match_fail) of + true -> filter_fail_clauses(Left); + false -> [Clause|filter_fail_clauses(Left)] + end; + false -> + [Clause|filter_fail_clauses(Left)] + end; +filter_fail_clauses([]) -> + []. + +bind_guard_case_clauses(GenArgType, GenMap, ArgExpr, [Clause|Left], + Map, Env, Eval, AccType, AccMaps, State) -> + Pats = cerl:clause_pats(Clause), + {NewMap0, ArgType} = + case Pats of + [Pat] -> + case cerl:is_literal(Pat) of + true -> + try + case cerl:concrete(Pat) of + true -> bind_guard(ArgExpr, Map, Env, pos, State); + false -> bind_guard(ArgExpr, Map, Env, neg, State); + _ -> {GenMap, GenArgType} + end + catch + throw:{fail, _} -> {none, GenArgType} + end; + false -> + {GenMap, GenArgType} + end; + _ -> {GenMap, GenArgType} + end, + NewMap1 = + case Pats =:= [] of + true -> NewMap0; + false -> + case t_is_none(ArgType) of + true -> none; + false -> + ArgTypes = case t_is_any(ArgType) of + true -> Any = t_any(), [Any || _ <- Pats]; + false -> t_to_tlist(ArgType) + end, + case bind_pat_vars(Pats, ArgTypes, [], NewMap0, State) of + {error, _, _, _, _} -> none; + {PatMap, _PatTypes} -> PatMap + end + end + end, + Guard = cerl:clause_guard(Clause), + GenPatType = dialyzer_typesig:get_safe_underapprox(Pats, Guard), + NewGenArgType = t_subtract(GenArgType, GenPatType), + case (NewMap1 =:= none) orelse t_is_none(GenArgType) of + true -> + bind_guard_case_clauses(NewGenArgType, GenMap, ArgExpr, Left, Map, Env, + Eval, AccType, AccMaps, State); + false -> + {NewAccType, NewAccMaps} = + try + {NewMap2, GuardType} = bind_guard(Guard, NewMap1, Env, pos, State), + case t_is_none(t_inf(t_atom(true), GuardType)) of + true -> throw({fail, none}); + false -> ok + end, + {NewMap3, CType} = bind_guard(cerl:clause_body(Clause), NewMap2, + Env, Eval, State), + Opaques = State#state.opaques, + case Eval of + pos -> + case t_is_any_atom(true, CType, Opaques) of + true -> ok; + false -> throw({fail, none}) + end; + neg -> + case t_is_any_atom(false, CType, Opaques) of + true -> ok; + false -> throw({fail, none}) + end; + dont_know -> + ok + end, + {t_sup(AccType, CType), [NewMap3|AccMaps]} + catch + throw:{fail, _What} -> {AccType, AccMaps} + end, + bind_guard_case_clauses(NewGenArgType, GenMap, ArgExpr, Left, Map, Env, + Eval, NewAccType, NewAccMaps, State) + end; +bind_guard_case_clauses(_GenArgType, _GenMap, _ArgExpr, [], Map, _Env, _Eval, + AccType, AccMaps, _State) -> + case t_is_none(AccType) of + true -> throw({fail, none}); + false -> {join_maps_end(AccMaps, Map), AccType} + end. + +%%% =========================================================================== +%%% +%%% Maps and types. +%%% +%%% =========================================================================== + +map__new() -> + #map{}. + +%% join_maps_begin pushes 'modified' to the stack; join_maps pops +%% 'modified' from the stack. + +join_maps_begin(#map{modified = M, modified_stack = S, ref = Ref} = Map) -> + Map#map{ref = make_ref(), modified = [], modified_stack = [{M,Ref} | S]}. + +join_maps_end(Maps, MapOut) -> + #map{ref = Ref, modified_stack = [{M1,R1} | S]} = MapOut, + true = lists:all(fun(M) -> M#map.ref =:= Ref end, Maps), % sanity + Keys0 = lists:usort(lists:append([M#map.modified || M <- Maps])), + #map{map = Map, subst = Subst} = MapOut, + Keys = [Key || + Key <- Keys0, + maps:is_key(Key, Map) orelse maps:is_key(Key, Subst)], + Out = case Maps of + [] -> join_maps(Maps, MapOut); + _ -> join_maps(Keys, Maps, MapOut) + end, + debug_join_check(Maps, MapOut, Out), + Out#map{ref = R1, + modified = Out#map.modified ++ M1, % duplicates possible + modified_stack = S}. + +join_maps(Maps, MapOut) -> + #map{map = Map, subst = Subst} = MapOut, + Keys = ordsets:from_list(maps:keys(Map) ++ maps:keys(Subst)), + join_maps(Keys, Maps, MapOut). + +join_maps(Keys, Maps, MapOut) -> + KTs = join_maps_collect(Keys, Maps, MapOut), + lists:foldl(fun({K, T}, M) -> enter_type(K, T, M) end, MapOut, KTs). + +join_maps_collect([Key|Left], Maps, MapOut) -> + Type = join_maps_one_key(Maps, Key, t_none()), + case t_is_equal(lookup_type(Key, MapOut), Type) of + true -> join_maps_collect(Left, Maps, MapOut); + false -> [{Key, Type} | join_maps_collect(Left, Maps, MapOut)] + end; +join_maps_collect([], _Maps, _MapOut) -> + []. + +join_maps_one_key([Map|Left], Key, AccType) -> + case t_is_any(AccType) of + true -> + %% We can stop here + AccType; + false -> + join_maps_one_key(Left, Key, t_sup(lookup_type(Key, Map), AccType)) + end; +join_maps_one_key([], _Key, AccType) -> + AccType. + +-ifdef(DEBUG). +debug_join_check(Maps, MapOut, Out) -> + #map{map = Map, subst = Subst} = Out, + #map{map = Map2, subst = Subst2} = join_maps(Maps, MapOut), + F = fun(D) -> lists:keysort(1, maps:to_list(D)) end, + [throw({bug, join_maps}) || + F(Map) =/= F(Map2) orelse F(Subst) =/= F(Subst2)]. +-else. +debug_join_check(_Maps, _MapOut, _Out) -> ok. +-endif. + +enter_type_lists([Key|KeyTail], [Val|ValTail], Map) -> + Map1 = enter_type(Key, Val, Map), + enter_type_lists(KeyTail, ValTail, Map1); +enter_type_lists([], [], Map) -> + Map. + +enter_type_list([{Key, Val}|Left], Map) -> + Map1 = enter_type(Key, Val, Map), + enter_type_list(Left, Map1); +enter_type_list([], Map) -> + Map. + +enter_type(Key, Val, MS) -> + case cerl:is_literal(Key) of + true -> MS; + false -> + case cerl:is_c_values(Key) of + true -> + Keys = cerl:values_es(Key), + case t_is_any(Val) orelse t_is_none(Val) of + true -> + enter_type_lists(Keys, [Val || _ <- Keys], MS); + false -> + enter_type_lists(Keys, t_to_tlist(Val), MS) + end; + false -> + #map{map = Map, subst = Subst} = MS, + KeyLabel = get_label(Key), + case maps:find(KeyLabel, Subst) of + {ok, NewKey} -> + ?debug("Binding ~p to ~p\n", [KeyLabel, NewKey]), + enter_type(NewKey, Val, MS); + error -> + ?debug("Entering ~p :: ~s\n", [KeyLabel, t_to_string(Val)]), + case maps:find(KeyLabel, Map) of + {ok, Value} -> + case erl_types:t_is_equal(Val, Value) of + true -> MS; + false -> store_map(KeyLabel, Val, MS) + end; + error -> store_map(KeyLabel, Val, MS) + end + end + end + end. + +store_map(Key, Val, #map{map = Map, ref = undefined} = MapRec) -> + MapRec#map{map = maps:put(Key, Val, Map)}; +store_map(Key, Val, #map{map = Map, modified = Mod} = MapRec) -> + MapRec#map{map = maps:put(Key, Val, Map), modified = [Key | Mod]}. + +enter_subst(Key, Val0, #map{subst = Subst} = MS) -> + KeyLabel = get_label(Key), + Val = dialyzer_utils:refold_pattern(Val0), + case cerl:is_literal(Val) of + true -> + store_map(KeyLabel, literal_type(Val), MS); + false -> + case cerl:is_c_var(Val) of + false -> MS; + true -> + ValLabel = get_label(Val), + case maps:find(ValLabel, Subst) of + {ok, NewVal} -> + enter_subst(Key, NewVal, MS); + error -> + if KeyLabel =:= ValLabel -> MS; + true -> + ?debug("Subst: storing ~p = ~p\n", [KeyLabel, ValLabel]), + store_subst(KeyLabel, ValLabel, MS) + end + end + end + end. + +store_subst(Key, Val, #map{subst = S, ref = undefined} = Map) -> + Map#map{subst = maps:put(Key, Val, S)}; +store_subst(Key, Val, #map{subst = S, modified = Mod} = Map) -> + Map#map{subst = maps:put(Key, Val, S), modified = [Key | Mod]}. + +lookup_type(Key, #map{map = Map, subst = Subst}) -> + lookup(Key, Map, Subst, t_none()). + +lookup(Key, Map, Subst, AnyNone) -> + case cerl:is_literal(Key) of + true -> literal_type(Key); + false -> + Label = get_label(Key), + case maps:find(Label, Subst) of + {ok, NewKey} -> lookup(NewKey, Map, Subst, AnyNone); + error -> + case maps:find(Label, Map) of + {ok, Val} -> Val; + error -> AnyNone + end + end + end. + +lookup_fun_sig(Fun, Callgraph, Plt) -> + MFAorLabel = + case dialyzer_callgraph:lookup_name(Fun, Callgraph) of + error -> Fun; + {ok, MFA} -> MFA + end, + dialyzer_plt:lookup(Plt, MFAorLabel). + +literal_type(Lit) -> + t_from_term(cerl:concrete(Lit)). + +mark_as_fresh([Tree|Left], Map) -> + SubTrees1 = lists:append(cerl:subtrees(Tree)), + {SubTrees2, Map1} = + case cerl:type(Tree) of + bitstr -> + %% The Size field is not fresh. + {SubTrees1 -- [cerl:bitstr_size(Tree)], Map}; + map_pair -> + %% The keys are not fresh + {SubTrees1 -- [cerl:map_pair_key(Tree)], Map}; + var -> + {SubTrees1, enter_type(Tree, t_any(), Map)}; + _ -> + {SubTrees1, Map} + end, + mark_as_fresh(SubTrees2 ++ Left, Map1); +mark_as_fresh([], Map) -> + Map. + +-ifdef(DEBUG). +debug_pp_map(#map{map = Map}=MapRec) -> + Keys = maps:keys(Map), + io:format("Map:\n", []), + lists:foreach(fun (Key) -> + io:format("\t~w :: ~s\n", + [Key, t_to_string(lookup_type(Key, MapRec))]) + end, Keys), + ok. +-else. +debug_pp_map(_Map) -> ok. +-endif. + +%%% =========================================================================== +%%% +%%% Utilities +%%% +%%% =========================================================================== + +get_label(L) when is_integer(L) -> + L; +get_label(T) -> + cerl_trees:get_label(T). + +t_is_simple(ArgType, State) -> + Opaques = State#state.opaques, + t_is_atom(ArgType, Opaques) orelse t_is_number(ArgType, Opaques) + orelse t_is_port(ArgType, Opaques) + orelse t_is_pid(ArgType, Opaques) orelse t_is_reference(ArgType, Opaques) + orelse t_is_nil(ArgType, Opaques). + +remove_local_opaque_types(Type, Opaques) -> + t_unopaque(Type, Opaques). + +%% t_is_structured(ArgType) -> +%% case t_is_nil(ArgType) of +%% true -> false; +%% false -> +%% SType = t_inf(t_sup([t_list(), t_tuple(), t_binary()]), ArgType), +%% t_is_equal(ArgType, SType) +%% end. + +is_call_to_send(Tree) -> + case cerl:is_c_call(Tree) of + false -> false; + true -> + Mod = cerl:call_module(Tree), + Name = cerl:call_name(Tree), + Arity = cerl:call_arity(Tree), + cerl:is_c_atom(Mod) + andalso cerl:is_c_atom(Name) + andalso is_send(cerl:atom_val(Name)) + andalso (cerl:atom_val(Mod) =:= erlang) + andalso (Arity =:= 2) + end. + +is_send('!') -> true; +is_send(send) -> true; +is_send(_) -> false. + +is_lc_simple_list(Tree, TreeType, State) -> + Opaques = State#state.opaques, + Ann = cerl:get_ann(Tree), + lists:member(list_comprehension, Ann) + andalso t_is_list(TreeType) + andalso t_is_simple(t_list_elements(TreeType, Opaques), State). + +filter_match_fail([Clause] = Cls) -> + Body = cerl:clause_body(Clause), + case cerl:type(Body) of + primop -> + case cerl:atom_val(cerl:primop_name(Body)) of + match_fail -> []; + raise -> []; + _ -> Cls + end; + _ -> Cls + end; +filter_match_fail([H|T]) -> + [H|filter_match_fail(T)]; +filter_match_fail([]) -> + %% This can actually happen, for example in + %% receive after 1 -> ok end + []. + +%%% =========================================================================== +%%% +%%% The State. +%%% +%%% =========================================================================== + +state__new(Callgraph, Codeserver, Tree, Plt, Module, Records) -> + Opaques = erl_types:t_opaque_from_records(Records), + {TreeMap, FunHomes} = build_tree_map(Tree, Callgraph), + Funs = dict:fetch_keys(TreeMap), + FunTab = init_fun_tab(Funs, dict:new(), TreeMap, Callgraph, Plt), + ExportedFuns = + [Fun || Fun <- Funs--[top], dialyzer_callgraph:is_escaping(Fun, Callgraph)], + Work = init_work(ExportedFuns), + Env = lists:foldl(fun(Fun, Env) -> dict:store(Fun, map__new(), Env) end, + dict:new(), Funs), + #state{callgraph = Callgraph, codeserver = Codeserver, + envs = Env, fun_tab = FunTab, fun_homes = FunHomes, opaques = Opaques, + plt = Plt, races = dialyzer_races:new(), records = Records, + warning_mode = false, warnings = [], work = Work, tree_map = TreeMap, + module = Module}. + +state__warning_mode(#state{warning_mode = WM}) -> + WM. + +state__set_warning_mode(#state{tree_map = TreeMap, fun_tab = FunTab, + races = Races} = State) -> + ?debug("==========\nStarting warning pass\n==========\n", []), + Funs = dict:fetch_keys(TreeMap), + State#state{work = init_work([top|Funs--[top]]), + fun_tab = FunTab, warning_mode = true, + races = dialyzer_races:put_race_analysis(true, Races)}. + +state__race_analysis(Analysis, #state{races = Races} = State) -> + State#state{races = dialyzer_races:put_race_analysis(Analysis, Races)}. + +state__renew_curr_fun(CurrFun, CurrFunLabel, + #state{races = Races} = State) -> + State#state{races = dialyzer_races:put_curr_fun(CurrFun, CurrFunLabel, + Races)}. + +state__renew_fun_args(Args, #state{races = Races} = State) -> + case state__warning_mode(State) of + true -> State; + false -> + State#state{races = dialyzer_races:put_fun_args(Args, Races)} + end. + +state__renew_race_list(RaceList, RaceListSize, + #state{races = Races} = State) -> + State#state{races = dialyzer_races:put_race_list(RaceList, RaceListSize, + Races)}. + +state__renew_warnings(Warnings, State) -> + State#state{warnings = Warnings}. + +-spec state__add_warning(raw_warning(), state()) -> state(). + +state__add_warning(Warn, #state{warnings = Warnings} = State) -> + State#state{warnings = [Warn|Warnings]}. + +state__add_warning(State, Tag, Tree, Msg) -> + state__add_warning(State, Tag, Tree, Msg, false). + +state__add_warning(#state{warning_mode = false} = State, _, _, _, _) -> + State; +state__add_warning(#state{warnings = Warnings, warning_mode = true} = State, + Tag, Tree, Msg, Force) -> + Ann = cerl:get_ann(Tree), + case Force of + true -> + WarningInfo = {get_file(Ann), + abs(get_line(Ann)), + State#state.curr_fun}, + Warn = {Tag, WarningInfo, Msg}, + ?debug("MSG ~s\n", [dialyzer:format_warning(Warn)]), + State#state{warnings = [Warn|Warnings]}; + false -> + case is_compiler_generated(Ann) of + true -> State; + false -> + WarningInfo = {get_file(Ann), get_line(Ann), State#state.curr_fun}, + Warn = {Tag, WarningInfo, Msg}, + case Tag of + ?WARN_CONTRACT_RANGE -> ok; + _ -> ?debug("MSG ~s\n", [dialyzer:format_warning(Warn)]) + end, + State#state{warnings = [Warn|Warnings]} + end + end. + +state__remove_added_warnings(OldState, NewState) -> + #state{warnings = OldWarnings} = OldState, + #state{warnings = NewWarnings} = NewState, + {NewWarnings -- OldWarnings, NewState#state{warnings = OldWarnings}}. + +state__add_warnings(Warns, #state{warnings = Warnings} = State) -> + State#state{warnings = Warns ++ Warnings}. + +-spec state__set_curr_fun(curr_fun(), state()) -> state(). + +state__set_curr_fun(undefined, State) -> + State#state{curr_fun = undefined}; +state__set_curr_fun(FunLbl, State) -> + State#state{curr_fun = find_function(FunLbl, State)}. + +-spec state__find_function(mfa_or_funlbl(), state()) -> mfa_or_funlbl(). + +state__find_function(FunLbl, State) -> + find_function(FunLbl, State). + +state__get_race_warnings(#state{races = Races} = State) -> + {Races1, State1} = dialyzer_races:get_race_warnings(Races, State), + State1#state{races = Races1}. + +state__get_warnings(#state{tree_map = TreeMap, fun_tab = FunTab, + callgraph = Callgraph, plt = Plt} = State) -> + FoldFun = + fun({top, _}, AccState) -> AccState; + ({FunLbl, Fun}, AccState) -> + AccState1 = state__set_curr_fun(FunLbl, AccState), + {NotCalled, Ret} = + case dict:fetch(get_label(Fun), FunTab) of + {not_handled, {_Args0, Ret0}} -> {true, Ret0}; + {_Args0, Ret0} -> {false, Ret0} + end, + case NotCalled of + true -> + case dialyzer_callgraph:lookup_name(FunLbl, Callgraph) of + error -> AccState1; + {ok, {_M, F, A}} -> + Msg = {unused_fun, [F, A]}, + state__add_warning(AccState1, ?WARN_NOT_CALLED, Fun, Msg) + end; + false -> + {Name, Contract} = + case dialyzer_callgraph:lookup_name(FunLbl, Callgraph) of + error -> {[], none}; + {ok, {_M, F, A} = MFA} -> + {[F, A], dialyzer_plt:lookup_contract(Plt, MFA)} + end, + case t_is_none(Ret) of + true -> + %% Check if the function has a contract that allows this. + Warn = + case Contract of + none -> not parent_allows_this(FunLbl, AccState1); + {value, C} -> + GenRet = dialyzer_contracts:get_contract_return(C), + not t_is_unit(GenRet) + end, + case Warn of + true -> + case classify_returns(Fun) of + no_match -> + Msg = {no_return, [no_match|Name]}, + state__add_warning(AccState1, ?WARN_RETURN_NO_RETURN, + Fun, Msg); + only_explicit -> + Msg = {no_return, [only_explicit|Name]}, + state__add_warning(AccState1, ?WARN_RETURN_ONLY_EXIT, + Fun, Msg); + only_normal -> + Msg = {no_return, [only_normal|Name]}, + state__add_warning(AccState1, ?WARN_RETURN_NO_RETURN, + Fun, Msg); + both -> + Msg = {no_return, [both|Name]}, + state__add_warning(AccState1, ?WARN_RETURN_NO_RETURN, + Fun, Msg) + end; + false -> + AccState + end; + false -> + AccState + end + end + end, + #state{warnings = Warn} = lists:foldl(FoldFun, State, dict:to_list(TreeMap)), + Warn. + +state__is_escaping(Fun, #state{callgraph = Callgraph}) -> + dialyzer_callgraph:is_escaping(Fun, Callgraph). + +state__lookup_type_for_letrec(Var, #state{callgraph = Callgraph} = State) -> + Label = get_label(Var), + case dialyzer_callgraph:lookup_letrec(Label, Callgraph) of + error -> error; + {ok, FunLabel} -> + {ok, state__fun_type(FunLabel, State)} + end. + +state__lookup_name({_, _, _} = MFA, #state{}) -> + MFA; +state__lookup_name(top, #state{}) -> + top; +state__lookup_name(Fun, #state{callgraph = Callgraph}) -> + case dialyzer_callgraph:lookup_name(Fun, Callgraph) of + {ok, MFA} -> MFA; + error -> Fun + end. + +state__lookup_record(Tag, Arity, #state{records = Records}) -> + case erl_types:lookup_record(Tag, Arity, Records) of + {ok, Fields} -> + RecType = + t_tuple([t_atom(Tag)| + [FieldType || {_FieldName, _Abstr, FieldType} <- Fields]]), + {ok, RecType}; + error -> + error + end. + +state__get_args_and_status(Tree, #state{fun_tab = FunTab}) -> + Fun = get_label(Tree), + case dict:find(Fun, FunTab) of + {ok, {not_handled, {ArgTypes, _}}} -> {ArgTypes, false}; + {ok, {ArgTypes, _}} -> {ArgTypes, true} + end. + +build_tree_map(Tree, Callgraph) -> + Fun = + fun(T, {Dict, Homes, FunLbls} = Acc) -> + case cerl:is_c_fun(T) of + true -> + FunLbl = get_label(T), + Dict1 = dict:store(FunLbl, T, Dict), + case catch dialyzer_callgraph:lookup_name(FunLbl, Callgraph) of + {ok, MFA} -> + F2 = + fun(Lbl, Dict0) -> + dict:store(Lbl, MFA, Dict0) + end, + Homes1 = lists:foldl(F2, Homes, [FunLbl|FunLbls]), + {Dict1, Homes1, []}; + _ -> + {Dict1, Homes, [FunLbl|FunLbls]} + end; + false -> + Acc + end + end, + Dict0 = dict:new(), + {Dict, Homes, _} = cerl_trees:fold(Fun, {Dict0, Dict0, []}, Tree), + {Dict, Homes}. + +init_fun_tab([top|Left], Dict, TreeMap, Callgraph, Plt) -> + NewDict = dict:store(top, {[], t_none()}, Dict), + init_fun_tab(Left, NewDict, TreeMap, Callgraph, Plt); +init_fun_tab([Fun|Left], Dict, TreeMap, Callgraph, Plt) -> + Arity = cerl:fun_arity(dict:fetch(Fun, TreeMap)), + FunEntry = + case dialyzer_callgraph:is_escaping(Fun, Callgraph) of + true -> + Args = lists:duplicate(Arity, t_any()), + case lookup_fun_sig(Fun, Callgraph, Plt) of + none -> {Args, t_unit()}; + {value, {RetType, _}} -> + case t_is_none(RetType) of + true -> {Args, t_none()}; + false -> {Args, t_unit()} + end + end; + false -> {not_handled, {lists:duplicate(Arity, t_none()), t_unit()}} + end, + NewDict = dict:store(Fun, FunEntry, Dict), + init_fun_tab(Left, NewDict, TreeMap, Callgraph, Plt); +init_fun_tab([], Dict, _TreeMap, _Callgraph, _Plt) -> + ?debug("DICT:~p\n",[dict:to_list(Dict)]), + Dict. + +state__update_fun_env(Tree, Map, #state{envs = Envs} = State) -> + NewEnvs = dict:store(get_label(Tree), Map, Envs), + State#state{envs = NewEnvs}. + +state__fun_env(Tree, #state{envs = Envs}) -> + Fun = get_label(Tree), + case dict:find(Fun, Envs) of + error -> none; + {ok, Map} -> Map + end. + +state__clean_not_called(#state{fun_tab = FunTab} = State) -> + NewFunTab = + dict:map(fun(top, Entry) -> Entry; + (_Fun, {not_handled, {Args, _}}) -> {Args, t_none()}; + (_Fun, Entry) -> Entry + end, FunTab), + State#state{fun_tab = NewFunTab}. + +state__all_fun_types(State) -> + #state{fun_tab = FunTab} = state__clean_not_called(State), + Tab1 = dict:erase(top, FunTab), + dict:map(fun(_Fun, {Args, Ret}) -> t_fun(Args, Ret)end, Tab1). + +state__fun_type(Fun, #state{fun_tab = FunTab}) -> + Label = + if is_integer(Fun) -> Fun; + true -> get_label(Fun) + end, + Entry = dict:find(Label, FunTab), + ?debug("FunType ~p:~p\n",[Label, Entry]), + case Entry of + {ok, {not_handled, {A, R}}} -> + t_fun(A, R); + {ok, {A, R}} -> + t_fun(A, R) + end. + +state__update_fun_entry(Tree, ArgTypes, Out0, + #state{fun_tab=FunTab, callgraph=CG, plt=Plt} = State)-> + Fun = get_label(Tree), + Out1 = + if Fun =:= top -> Out0; + true -> + case lookup_fun_sig(Fun, CG, Plt) of + {value, {SigRet, _}} -> t_inf(SigRet, Out0); + none -> Out0 + end + end, + Out = t_limit(Out1, ?TYPE_LIMIT), + {ok, {OldArgTypes, OldOut}} = dict:find(Fun, FunTab), + SameArgs = lists:all(fun({A, B}) -> erl_types:t_is_equal(A, B) + end, lists:zip(OldArgTypes, ArgTypes)), + SameOut = t_is_equal(OldOut, Out), + if + SameArgs, SameOut -> + ?debug("Fixpoint for ~w: ~s\n", + [state__lookup_name(Fun, State), + t_to_string(t_fun(ArgTypes, Out))]), + State; + true -> + %% Can only happen in self-recursive functions. + NewEntry = {OldArgTypes, Out}, + ?debug("New Entry for ~w: ~s\n", + [state__lookup_name(Fun, State), + t_to_string(t_fun(OldArgTypes, Out))]), + NewFunTab = dict:store(Fun, NewEntry, FunTab), + State1 = State#state{fun_tab = NewFunTab}, + state__add_work_from_fun(Tree, State1) + end. + +state__add_work_from_fun(_Tree, #state{warning_mode = true} = State) -> + State; +state__add_work_from_fun(Tree, #state{callgraph = Callgraph, + tree_map = TreeMap} = State) -> + case get_label(Tree) of + top -> State; + Label when is_integer(Label) -> + case dialyzer_callgraph:in_neighbours(Label, Callgraph) of + none -> State; + MFAList -> + LabelList = [dialyzer_callgraph:lookup_label(MFA, Callgraph) + || MFA <- MFAList], + %% Must filter the result for results in this module. + FilteredList = [L || {ok, L} <- LabelList, dict:is_key(L, TreeMap)], + ?debug("~w: Will try to add:~w\n", + [state__lookup_name(Label, State), MFAList]), + lists:foldl(fun(L, AccState) -> + state__add_work(L, AccState) + end, State, FilteredList) + end + end. + +state__add_work(external, State) -> + State; +state__add_work(top, State) -> + State; +state__add_work(Fun, #state{work = Work} = State) -> + NewWork = add_work(Fun, Work), + State#state{work = NewWork}. + +state__get_work(#state{work = Work, tree_map = TreeMap} = State) -> + case get_work(Work) of + none -> none; + {Fun, NewWork} -> + {dict:fetch(Fun, TreeMap), State#state{work = NewWork}} + end. + +state__lookup_call_site(Tree, #state{callgraph = Callgraph}) -> + Label = get_label(Tree), + dialyzer_callgraph:lookup_call_site(Label, Callgraph). + +state__fun_info(external, #state{}) -> + external; +state__fun_info({_, _, _} = MFA, #state{plt = PLT}) -> + {MFA, + dialyzer_plt:lookup(PLT, MFA), + dialyzer_plt:lookup_contract(PLT, MFA), + t_any()}; +state__fun_info(Fun, #state{callgraph = CG, fun_tab = FunTab, plt = PLT}) -> + {Sig, Contract} = + case dialyzer_callgraph:lookup_name(Fun, CG) of + error -> + {dialyzer_plt:lookup(PLT, Fun), none}; + {ok, MFA} -> + {dialyzer_plt:lookup(PLT, MFA), dialyzer_plt:lookup_contract(PLT, MFA)} + end, + LocalRet = + case dict:fetch(Fun, FunTab) of + {not_handled, {_Args, Ret}} -> Ret; + {_Args, Ret} -> Ret + end, + ?debug("LocalRet: ~s\n", [t_to_string(LocalRet)]), + {Fun, Sig, Contract, LocalRet}. + +forward_args(Fun, ArgTypes, #state{work = Work, fun_tab = FunTab} = State) -> + {OldArgTypes, OldOut, Fixpoint} = + case dict:find(Fun, FunTab) of + {ok, {not_handled, {OldArgTypes0, OldOut0}}} -> + {OldArgTypes0, OldOut0, false}; + {ok, {OldArgTypes0, OldOut0}} -> + {OldArgTypes0, OldOut0, + t_is_subtype(t_product(ArgTypes), t_product(OldArgTypes0))} + end, + case Fixpoint of + true -> State; + false -> + NewArgTypes = [t_sup(X, Y) || + {X, Y} <- lists:zip(ArgTypes, OldArgTypes)], + NewWork = add_work(Fun, Work), + ?debug("~w: forwarding args ~s\n", + [state__lookup_name(Fun, State), + t_to_string(t_product(NewArgTypes))]), + NewFunTab = dict:store(Fun, {NewArgTypes, OldOut}, FunTab), + State#state{work = NewWork, fun_tab = NewFunTab} + end. + +-spec state__cleanup(state()) -> state(). + +state__cleanup(#state{callgraph = Callgraph, + races = Races, + records = Records}) -> + #state{callgraph = dialyzer_callgraph:cleanup(Callgraph), + races = dialyzer_races:cleanup(Races), + records = Records}. + +-spec state__duplicate(state()) -> state(). + +state__duplicate(#state{callgraph = Callgraph} = State) -> + State#state{callgraph = dialyzer_callgraph:duplicate(Callgraph)}. + +-spec dispose_state(state()) -> ok. + +dispose_state(#state{callgraph = Callgraph}) -> + dialyzer_callgraph:dispose_race_server(Callgraph). + +-spec state__get_callgraph(state()) -> dialyzer_callgraph:callgraph(). + +state__get_callgraph(#state{callgraph = Callgraph}) -> + Callgraph. + +-spec state__get_races(state()) -> dialyzer_races:races(). + +state__get_races(#state{races = Races}) -> + Races. + +-spec state__get_records(state()) -> types(). + +state__get_records(#state{records = Records}) -> + Records. + +-spec state__put_callgraph(dialyzer_callgraph:callgraph(), state()) -> + state(). + +state__put_callgraph(Callgraph, State) -> + State#state{callgraph = Callgraph}. + +-spec state__put_races(dialyzer_races:races(), state()) -> state(). + +state__put_races(Races, State) -> + State#state{races = Races}. + +-spec state__records_only(state()) -> state(). + +state__records_only(#state{records = Records}) -> + #state{records = Records}. + +%%% =========================================================================== +%%% +%%% Races +%%% +%%% =========================================================================== + +is_race_analysis_enabled(#state{races = Races, callgraph = Callgraph}) -> + RaceDetection = dialyzer_callgraph:get_race_detection(Callgraph), + RaceAnalysis = dialyzer_races:get_race_analysis(Races), + RaceDetection andalso RaceAnalysis. + +get_race_list_and_size(#state{races = Races}) -> + dialyzer_races:get_race_list_and_size(Races). + +renew_race_code(#state{races = Races, callgraph = Callgraph, + warning_mode = WarningMode} = State) -> + case WarningMode of + true -> State; + false -> + NewCallgraph = dialyzer_callgraph:renew_race_code(Races, Callgraph), + State#state{callgraph = NewCallgraph} + end. + +renew_race_public_tables([Var], #state{races = Races, callgraph = Callgraph, + warning_mode = WarningMode} = State) -> + case WarningMode of + true -> State; + false -> + Table = dialyzer_races:get_new_table(Races), + case Table of + no_t -> State; + _Other -> + VarLabel = get_label(Var), + NewCallgraph = + dialyzer_callgraph:renew_race_public_tables(VarLabel, Callgraph), + State#state{callgraph = NewCallgraph} + end + end. + +%%% =========================================================================== +%%% +%%% Worklist +%%% +%%% =========================================================================== + +init_work(List) -> + {List, [], sets:from_list(List)}. + +get_work({[], [], _Set}) -> + none; +get_work({[H|T], Rev, Set}) -> + {H, {T, Rev, sets:del_element(H, Set)}}; +get_work({[], Rev, Set}) -> + get_work({lists:reverse(Rev), [], Set}). + +add_work(New, {List, Rev, Set} = Work) -> + case sets:is_element(New, Set) of + true -> Work; + false -> {List, [New|Rev], sets:add_element(New, Set)} + end. + +%%% =========================================================================== +%%% +%%% Utilities. +%%% +%%% =========================================================================== + +get_line([Line|_]) when is_integer(Line) -> Line; +get_line([_|Tail]) -> get_line(Tail); +get_line([]) -> -1. + +get_file([]) -> []; +get_file([{file, File}|_]) -> File; +get_file([_|Tail]) -> get_file(Tail). + +is_compiler_generated(Ann) -> + lists:member(compiler_generated, Ann) orelse (get_line(Ann) < 1). + +is_literal_record(Tree) -> + Ann = cerl:get_ann(Tree), + lists:member(record, Ann). + +-spec format_args([cerl:cerl()], [type()], state()) -> + nonempty_string(). + +format_args([], [], _State) -> + "()"; +format_args(ArgList0, TypeList, State) -> + ArgList = fold_literals(ArgList0), + "(" ++ format_args_1(ArgList, TypeList, State) ++ ")". + +format_args_1([Arg], [Type], State) -> + format_arg(Arg) ++ format_type(Type, State); +format_args_1([Arg|Args], [Type|Types], State) -> + String = + case cerl:is_literal(Arg) of + true -> format_cerl(Arg); + false -> format_arg(Arg) ++ format_type(Type, State) + end, + String ++ "," ++ format_args_1(Args, Types, State). + +format_arg(Arg) -> + Default = "", + case cerl:is_c_var(Arg) of + true -> + case cerl:var_name(Arg) of + Atom when is_atom(Atom) -> + case atom_to_list(Atom) of + "cor"++_ -> Default; + "rec"++_ -> Default; + Name -> Name ++ "::" + end; + _What -> Default + end; + false -> + Default + end. + +-spec format_type(type(), state()) -> string(). + +format_type(Type, #state{records = R}) -> + t_to_string(Type, R). + +-spec format_field_diffs(type(), state()) -> string(). + +format_field_diffs(RecConstruction, #state{records = R}) -> + erl_types:record_field_diffs_to_string(RecConstruction, R). + +-spec format_sig_args(type(), state()) -> string(). + +format_sig_args(Type, #state{opaques = Opaques} = State) -> + SigArgs = t_fun_args(Type, Opaques), + case SigArgs of + [] -> "()"; + [SArg|SArgs] -> + lists:flatten("(" ++ format_type(SArg, State) + ++ ["," ++ format_type(T, State) || T <- SArgs] ++ ")") + end. + +format_cerl(Tree) -> + cerl_prettypr:format(cerl:set_ann(Tree, []), + [{hook, dialyzer_utils:pp_hook()}, + {noann, true}, + {paper, 100000}, %% These guys strip + {ribbon, 100000} %% newlines. + ]). + +format_patterns(Pats0) -> + Pats = fold_literals(Pats0), + NewPats = map_pats(cerl:c_values(Pats)), + String = format_cerl(NewPats), + case Pats of + [PosVar] -> + case cerl:is_c_var(PosVar) andalso (cerl:var_name(PosVar) =/= '') of + true -> "variable "++String; + false -> "pattern "++String + end; + _ -> + "pattern "++String + end. + +map_pats(Pats) -> + Fun = fun(Tree) -> + case cerl:is_c_var(Tree) of + true -> + case cerl:var_name(Tree) of + Atom when is_atom(Atom) -> + case atom_to_list(Atom) of + "cor"++_ -> cerl:c_var(''); + "rec"++_ -> cerl:c_var(''); + _ -> cerl:set_ann(Tree, []) + end; + _What -> cerl:c_var('') + end; + false -> + cerl:set_ann(Tree, []) + end + end, + cerl_trees:map(Fun, Pats). + +fold_literals(TreeList) -> + [cerl:fold_literal(Tree) || Tree <- TreeList]. + +type(Tree) -> + Folded = cerl:fold_literal(Tree), + case cerl:type(Folded) of + literal -> {literal, Folded}; + Type -> Type + end. + +is_literal(Tree) -> + Folded = cerl:fold_literal(Tree), + case cerl:is_literal(Folded) of + true -> {yes, Folded}; + false -> no + end. + +parent_allows_this(FunLbl, #state{callgraph = Callgraph, plt = Plt} =State) -> + case state__is_escaping(FunLbl, State) of + false -> false; % if it isn't escaping it can't be a return value + true -> + case state__lookup_name(FunLbl, State) of + {_M, _F, _A} -> false; % if it has a name it is not a fun + _ -> + case dialyzer_callgraph:in_neighbours(FunLbl, Callgraph) of + [Parent] -> + case state__lookup_name(Parent, State) of + {_M, _F, _A} = PMFA -> + case dialyzer_plt:lookup_contract(Plt, PMFA) of + none -> false; + {value, C} -> + GenRet = dialyzer_contracts:get_contract_return(C), + case erl_types:t_is_fun(GenRet) of + false -> false; % element of structure? far-fetched... + true -> t_is_unit(t_fun_range(GenRet)) + end + end; + _ -> false % parent should have a name to have a contract + end; + _ -> false % called in other funs? far-fetched... + end + end + end. + +find_function({_, _, _} = MFA, _State) -> + MFA; +find_function(top, _State) -> + top; +find_function(FunLbl, #state{fun_homes = Homes}) -> + dict:fetch(FunLbl, Homes). + +classify_returns(Tree) -> + case find_terminals(cerl:fun_body(Tree)) of + {false, false} -> no_match; + {true, false} -> only_explicit; + {false, true} -> only_normal; + {true, true} -> both + end. + +find_terminals(Tree) -> + case cerl:type(Tree) of + apply -> {false, true}; + binary -> {false, true}; + bitstr -> {false, true}; + call -> + M0 = cerl:call_module(Tree), + F0 = cerl:call_name(Tree), + A = length(cerl:call_args(Tree)), + case {is_literal(M0), is_literal(F0)} of + {{yes, LitM}, {yes, LitF}} -> + M = cerl:concrete(LitM), + F = cerl:concrete(LitF), + case (erl_bif_types:is_known(M, F, A) + andalso t_is_none(erl_bif_types:type(M, F, A))) of + true -> {true, false}; + false -> {false, true} + end; + _ -> + %% We cannot make assumptions. Say that both are true. + {true, true} + end; + 'case' -> find_terminals_list(cerl:case_clauses(Tree)); + 'catch' -> find_terminals(cerl:catch_body(Tree)); + clause -> find_terminals(cerl:clause_body(Tree)); + cons -> {false, true}; + 'fun' -> {false, true}; + 'let' -> find_terminals(cerl:let_body(Tree)); + letrec -> find_terminals(cerl:letrec_body(Tree)); + literal -> {false, true}; + map -> {false, true}; + primop -> {false, false}; %% match_fail, etc. are not explicit exits. + 'receive' -> + Timeout = cerl:receive_timeout(Tree), + Clauses = cerl:receive_clauses(Tree), + case (cerl:is_literal(Timeout) andalso + (cerl:concrete(Timeout) =:= infinity)) of + true -> + if Clauses =:= [] -> {false, true}; %% A never ending receive. + true -> find_terminals_list(Clauses) + end; + false -> find_terminals_list([cerl:receive_action(Tree)|Clauses]) + end; + seq -> find_terminals(cerl:seq_body(Tree)); + 'try' -> + find_terminals_list([cerl:try_handler(Tree), cerl:try_body(Tree)]); + tuple -> {false, true}; + values -> {false, true}; + var -> {false, true} + end. + +find_terminals_list(List) -> + find_terminals_list(List, false, false). + +find_terminals_list([Tree|Left], Explicit1, Normal1) -> + {Explicit2, Normal2} = find_terminals(Tree), + case {Explicit1 or Explicit2, Normal1 or Normal2} of + {true, true} = Ans -> Ans; + {NewExplicit, NewNormal} -> + find_terminals_list(Left, NewExplicit, NewNormal) + end; +find_terminals_list([], Explicit, Normal) -> + {Explicit, Normal}. + +%%---------------------------------------------------------------------------- + +-ifdef(DEBUG_PP). +debug_pp(Tree, true) -> + io:put_chars(cerl_prettypr:format(Tree, [{hook, cerl_typean:pp_hook()}])), + io:nl(), + ok; +debug_pp(Tree, false) -> + io:put_chars(cerl_prettypr:format(strip_annotations(Tree))), + io:nl(), + ok. + +strip_annotations(Tree) -> + Fun = fun(T) -> + case cerl:type(T) of + var -> + cerl:set_ann(T, [{label, cerl_trees:get_label(T)}]); + 'fun' -> + cerl:set_ann(T, [{label, cerl_trees:get_label(T)}]); + _ -> + cerl:set_ann(T, []) + end + end, + cerl_trees:map(Fun, Tree). + +-else. + +debug_pp(_Tree, _UseHook) -> + ok. +-endif. diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/recrec/dialyzer_races.erl b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/dialyzer_races.erl new file mode 100644 index 0000000000..bb43d1dcb8 --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/dialyzer_races.erl @@ -0,0 +1,2494 @@ +%% -*- erlang-indent-level: 2 -*- +%%----------------------------------------------------------------------- +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2015. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +%%%---------------------------------------------------------------------- +%%% File : dialyzer_races.erl +%%% Author : Maria Christakis <[email protected]> +%%% Description : Utility functions for race condition detection +%%% +%%% Created : 21 Nov 2008 by Maria Christakis <[email protected]> +%%%---------------------------------------------------------------------- +-module(dialyzer_races). + +%% Race Analysis + +-export([store_race_call/5, race/1, get_race_warnings/2, format_args/4]). + +%% Record Interfaces + +-export([beg_clause_new/3, cleanup/1, end_case_new/1, end_clause_new/3, + get_curr_fun/1, get_curr_fun_args/1, get_new_table/1, + get_race_analysis/1, get_race_list/1, get_race_list_size/1, + get_race_list_and_size/1, + let_tag_new/2, new/0, put_curr_fun/3, put_fun_args/2, + put_race_analysis/2, put_race_list/3]). + +-export_type([races/0, core_vars/0]). + +-include("dialyzer.hrl"). + +%%% =========================================================================== +%%% +%%% Definitions +%%% +%%% =========================================================================== + +-define(local, 5). +-define(no_arg, no_arg). +-define(no_label, no_label). +-define(bypassed, bypassed). + +-define(WARN_WHEREIS_REGISTER, warn_whereis_register). +-define(WARN_WHEREIS_UNREGISTER, warn_whereis_unregister). +-define(WARN_ETS_LOOKUP_INSERT, warn_ets_lookup_insert). +-define(WARN_MNESIA_DIRTY_READ_WRITE, warn_mnesia_dirty_read_write). +-define(WARN_NO_WARN, warn_no_warn). + +%%% =========================================================================== +%%% +%%% Local Types +%%% +%%% =========================================================================== + +-type label_type() :: label() | [label()] | {label()} | ?no_label. +-type args() :: [label_type() | [string()]]. +-type core_vars() :: cerl:cerl() | ?no_arg | ?bypassed. +-type var_to_map1() :: core_vars() | [cerl:cerl()]. +-type var_to_map2() :: cerl:cerl() | [cerl:cerl()] | ?bypassed. +-type core_args() :: [core_vars()] | 'empty'. +-type op() :: 'bind' | 'unbind'. + +-type dep_calls() :: 'whereis' | 'ets_lookup' | 'mnesia_dirty_read'. +-type warn_calls() :: 'register' | 'unregister' | 'ets_insert' + | 'mnesia_dirty_write'. +-type call() :: 'whereis' | 'register' | 'unregister' | 'ets_new' + | 'ets_lookup' | 'ets_insert' | 'mnesia_dirty_read1' + | 'mnesia_dirty_read2' | 'mnesia_dirty_write1' + | 'mnesia_dirty_write2' | 'function_call'. +-type race_tag() :: 'whereis_register' | 'whereis_unregister' + | 'ets_lookup_insert' | 'mnesia_dirty_read_write'. + +%% The following type is similar to the raw_warning() type but has a +%% tag which is local to this module and is not propagated to outside +-type dial_race_warning() :: {race_warn_tag(), warning_info(), {atom(), [term()]}}. +-type race_warn_tag() :: ?WARN_WHEREIS_REGISTER | ?WARN_WHEREIS_UNREGISTER + | ?WARN_ETS_LOOKUP_INSERT | ?WARN_MNESIA_DIRTY_READ_WRITE. + +-record(beg_clause, {arg :: var_to_map1() | 'undefined', + pats :: var_to_map1() | 'undefined', + guard :: cerl:cerl() | 'undefined'}). +-record(end_clause, {arg :: var_to_map1() | 'undefined', + pats :: var_to_map1() | 'undefined', + guard :: cerl:cerl() | 'undefined'}). +-record(end_case, {clauses :: [#end_clause{}]}). +-record(curr_fun, {status :: 'in' | 'out' | 'undefined', + mfa :: dialyzer_callgraph:mfa_or_funlbl() + | 'undefined', + label :: label() | 'undefined', + def_vars :: [core_vars()] | 'undefined', + arg_types :: [erl_types:erl_type()] | 'undefined', + call_vars :: [core_vars()] | 'undefined', + var_map :: dict:dict() | 'undefined'}). +-record(dep_call, {call_name :: dep_calls(), + args :: args() | 'undefined', + arg_types :: [erl_types:erl_type()], + vars :: [core_vars()], + state :: dialyzer_dataflow:state(), + file_line :: file_line(), + var_map :: dict:dict() | 'undefined'}). +-record(fun_call, {caller :: dialyzer_callgraph:mfa_or_funlbl(), + callee :: dialyzer_callgraph:mfa_or_funlbl(), + arg_types :: [erl_types:erl_type()], + vars :: [core_vars()]}). +-record(let_tag, {var :: var_to_map1(), + arg :: var_to_map1()}). +-record(warn_call, {call_name :: warn_calls(), + args :: args(), + var_map :: dict:dict() | 'undefined'}). + +-type case_tags() :: 'beg_case' | #beg_clause{} | #end_clause{} | #end_case{}. +-type code() :: [#dep_call{} | #fun_call{} | #warn_call{} | + #curr_fun{} | #let_tag{} | case_tags() | race_tag()]. + +-type table_var() :: label() | ?no_label. +-type table() :: {'named', table_var(), [string()]} | 'other' | 'no_t'. + +-record(race_fun, {mfa :: mfa(), + args :: args(), + arg_types :: [erl_types:erl_type()], + vars :: [core_vars()], + file_line :: file_line(), + index :: non_neg_integer(), + fun_mfa :: dialyzer_callgraph:mfa_or_funlbl(), + fun_label :: label()}). + +-record(races, {curr_fun :: dialyzer_callgraph:mfa_or_funlbl() + | 'undefined', + curr_fun_label :: label() | 'undefined', + curr_fun_args = 'empty' :: core_args(), + new_table = 'no_t' :: table(), + race_list = [] :: code(), + race_list_size = 0 :: non_neg_integer(), + race_tags = [] :: [#race_fun{}], + %% true for fun types and warning mode + race_analysis = false :: boolean(), + race_warnings = [] :: [dial_race_warning()]}). + +%%% =========================================================================== +%%% +%%% Exported Types +%%% +%%% =========================================================================== + +-opaque races() :: #races{}. + +%%% =========================================================================== +%%% +%%% Race Analysis +%%% +%%% =========================================================================== + +-spec store_race_call(dialyzer_callgraph:mfa_or_funlbl(), + [erl_types:erl_type()], [core_vars()], + file_line(), dialyzer_dataflow:state()) -> + dialyzer_dataflow:state(). + +store_race_call(Fun, ArgTypes, Args, FileLine, State) -> + Races = dialyzer_dataflow:state__get_races(State), + CurrFun = Races#races.curr_fun, + CurrFunLabel = Races#races.curr_fun_label, + RaceTags = Races#races.race_tags, + CleanState = dialyzer_dataflow:state__records_only(State), + {NewRaceList, NewRaceListSize, NewRaceTags, NewTable} = + case CurrFun of + {_Module, module_info, A} when A =:= 0 orelse A =:= 1 -> + {[], 0, RaceTags, no_t}; + _Thing -> + RaceList = Races#races.race_list, + RaceListSize = Races#races.race_list_size, + case Fun of + {erlang, get_module_info, A} when A =:= 1 orelse A =:= 2 -> + {[], 0, RaceTags, no_t}; + {erlang, register, 2} -> + VarArgs = format_args(Args, ArgTypes, CleanState, register), + RaceFun = #race_fun{mfa = Fun, args = VarArgs, + arg_types = ArgTypes, vars = Args, + file_line = FileLine, index = RaceListSize, + fun_mfa = CurrFun, fun_label = CurrFunLabel}, + {[#warn_call{call_name = register, args = VarArgs}| + RaceList], RaceListSize + 1, [RaceFun|RaceTags], no_t}; + {erlang, unregister, 1} -> + VarArgs = format_args(Args, ArgTypes, CleanState, unregister), + RaceFun = #race_fun{mfa = Fun, args = VarArgs, + arg_types = ArgTypes, vars = Args, + file_line = FileLine, index = RaceListSize, + fun_mfa = CurrFun, fun_label = CurrFunLabel}, + {[#warn_call{call_name = unregister, args = VarArgs}| + RaceList], RaceListSize + 1, [RaceFun|RaceTags], no_t}; + {erlang, whereis, 1} -> + VarArgs = format_args(Args, ArgTypes, CleanState, whereis), + {[#dep_call{call_name = whereis, args = VarArgs, + arg_types = ArgTypes, vars = Args, + state = CleanState, file_line = FileLine}| + RaceList], RaceListSize + 1, RaceTags, no_t}; + {ets, insert, 2} -> + VarArgs = format_args(Args, ArgTypes, CleanState, ets_insert), + RaceFun = #race_fun{mfa = Fun, args = VarArgs, + arg_types = ArgTypes, vars = Args, + file_line = FileLine, index = RaceListSize, + fun_mfa = CurrFun, fun_label = CurrFunLabel}, + {[#warn_call{call_name = ets_insert, args = VarArgs}| + RaceList], RaceListSize + 1, [RaceFun|RaceTags], no_t}; + {ets, lookup, 2} -> + VarArgs = format_args(Args, ArgTypes, CleanState, ets_lookup), + {[#dep_call{call_name = ets_lookup, args = VarArgs, + arg_types = ArgTypes, vars = Args, + state = CleanState, file_line = FileLine}| + RaceList], RaceListSize + 1, RaceTags, no_t}; + {ets, new, 2} -> + VarArgs = format_args(Args, ArgTypes, CleanState, ets_new), + [VarArgs1, VarArgs2, _, Options] = VarArgs, + NewTable1 = + case lists:member("'public'", Options) of + true -> + case lists:member("'named_table'", Options) of + true -> + {named, VarArgs1, VarArgs2}; + false -> other + end; + false -> no_t + end, + {RaceList, RaceListSize, RaceTags, NewTable1}; + {mnesia, dirty_read, A} when A =:= 1 orelse A =:= 2 -> + VarArgs = + case A of + 1 -> + format_args(Args, ArgTypes, CleanState, mnesia_dirty_read1); + 2 -> + format_args(Args, ArgTypes, CleanState, mnesia_dirty_read2) + end, + {[#dep_call{call_name = mnesia_dirty_read, args = VarArgs, + arg_types = ArgTypes, vars = Args, + state = CleanState, file_line = FileLine}|RaceList], + RaceListSize + 1, RaceTags, no_t}; + {mnesia, dirty_write, A} when A =:= 1 orelse A =:= 2 -> + VarArgs = + case A of + 1 -> + format_args(Args, ArgTypes, CleanState, mnesia_dirty_write1); + 2 -> + format_args(Args, ArgTypes, CleanState, mnesia_dirty_write2) + end, + RaceFun = #race_fun{mfa = Fun, args = VarArgs, + arg_types = ArgTypes, vars = Args, + file_line = FileLine, index = RaceListSize, + fun_mfa = CurrFun, fun_label = CurrFunLabel}, + {[#warn_call{call_name = mnesia_dirty_write, + args = VarArgs}|RaceList], + RaceListSize + 1, [RaceFun|RaceTags], no_t}; + Int when is_integer(Int) -> + {[#fun_call{caller = CurrFun, callee = Int, arg_types = ArgTypes, + vars = Args}|RaceList], + RaceListSize + 1, RaceTags, no_t}; + _Other -> + Callgraph = dialyzer_dataflow:state__get_callgraph(State), + case digraph:vertex(dialyzer_callgraph:get_digraph(Callgraph), + Fun) of + {Fun, confirmed} -> + {[#fun_call{caller = CurrFun, callee = Fun, + arg_types = ArgTypes, vars = Args}|RaceList], + RaceListSize + 1, RaceTags, no_t}; + false -> + {RaceList, RaceListSize, RaceTags, no_t} + end + end + end, + state__renew_info(NewRaceList, NewRaceListSize, NewRaceTags, NewTable, State). + +-spec race(dialyzer_dataflow:state()) -> dialyzer_dataflow:state(). + +race(State) -> + Races = dialyzer_dataflow:state__get_races(State), + RaceTags = Races#races.race_tags, + RetState = + case RaceTags of + [] -> State; + [#race_fun{mfa = Fun, + args = VarArgs, arg_types = ArgTypes, + vars = Args, file_line = FileLine, + index = Index, fun_mfa = CurrFun, + fun_label = CurrFunLabel}|T] -> + Callgraph = dialyzer_dataflow:state__get_callgraph(State), + {ok, [_Args, Code]} = + dict:find(CurrFun, dialyzer_callgraph:get_race_code(Callgraph)), + RaceList = lists:reverse(Code), + RaceWarnTag = + case Fun of + {erlang, register, 2} -> ?WARN_WHEREIS_REGISTER; + {erlang, unregister, 1} -> ?WARN_WHEREIS_UNREGISTER; + {ets, insert, 2} -> ?WARN_ETS_LOOKUP_INSERT; + {mnesia, dirty_write, _A} -> ?WARN_MNESIA_DIRTY_READ_WRITE + end, + State1 = + state__renew_curr_fun(CurrFun, + state__renew_curr_fun_label(CurrFunLabel, + state__renew_race_list(lists:nthtail(length(RaceList) - Index, + RaceList), State))), + DepList = fixup_race_list(RaceWarnTag, VarArgs, State1), + {State2, RaceWarn} = + get_race_warn(Fun, Args, ArgTypes, DepList, State), + {File, Line} = FileLine, + CurrMFA = dialyzer_dataflow:state__find_function(CurrFun, State), + WarningInfo = {File, Line, CurrMFA}, + race( + state__add_race_warning( + state__renew_race_tags(T, State2), RaceWarn, RaceWarnTag, + WarningInfo)) + end, + state__renew_race_tags([], RetState). + +fixup_race_list(RaceWarnTag, WarnVarArgs, State) -> + Races = dialyzer_dataflow:state__get_races(State), + CurrFun = Races#races.curr_fun, + CurrFunLabel = Races#races.curr_fun_label, + RaceList = Races#races.race_list, + Callgraph = dialyzer_dataflow:state__get_callgraph(State), + Digraph = dialyzer_callgraph:get_digraph(Callgraph), + Calls = digraph:edges(Digraph), + RaceTag = + case RaceWarnTag of + ?WARN_WHEREIS_REGISTER -> whereis_register; + ?WARN_WHEREIS_UNREGISTER -> whereis_unregister; + ?WARN_ETS_LOOKUP_INSERT -> ets_lookup_insert; + ?WARN_MNESIA_DIRTY_READ_WRITE -> mnesia_dirty_read_write + end, + NewRaceList = [RaceTag|RaceList], + CleanState = dialyzer_dataflow:state__cleanup(State), + NewState = state__renew_race_list(NewRaceList, CleanState), + DepList1 = + fixup_race_forward_pullout(CurrFun, CurrFunLabel, Calls, + lists:reverse(NewRaceList), [], CurrFun, + WarnVarArgs, RaceWarnTag, dict:new(), + [], [], [], 2 * ?local, NewState), + Parents = fixup_race_backward(CurrFun, Calls, Calls, [], ?local), + UParents = lists:usort(Parents), + Filtered = filter_parents(UParents, UParents, Digraph), + NewParents = + case lists:member(CurrFun, Filtered) of + true -> Filtered; + false -> [CurrFun|Filtered] + end, + DepList2 = + fixup_race_list_helper(NewParents, Calls, CurrFun, WarnVarArgs, + RaceWarnTag, NewState), + dialyzer_dataflow:dispose_state(CleanState), + lists:usort(cleanup_dep_calls(DepList1 ++ DepList2)). + +fixup_race_list_helper(Parents, Calls, CurrFun, WarnVarArgs, RaceWarnTag, + State) -> + case Parents of + [] -> []; + [Head|Tail] -> + Callgraph = dialyzer_dataflow:state__get_callgraph(State), + Code = + case dict:find(Head, dialyzer_callgraph:get_race_code(Callgraph)) of + error -> []; + {ok, [_A, C]} -> C + end, + {ok, FunLabel} = dialyzer_callgraph:lookup_label(Head, Callgraph), + DepList1 = + fixup_race_forward_pullout(Head, FunLabel, Calls, Code, [], CurrFun, + WarnVarArgs, RaceWarnTag, dict:new(), + [], [], [], 2 * ?local, State), + DepList2 = + fixup_race_list_helper(Tail, Calls, CurrFun, WarnVarArgs, + RaceWarnTag, State), + DepList1 ++ DepList2 + end. + +%%% =========================================================================== +%%% +%%% Forward Analysis +%%% +%%% =========================================================================== + +fixup_race_forward_pullout(CurrFun, CurrFunLabel, Calls, Code, RaceList, + InitFun, WarnVarArgs, RaceWarnTag, RaceVarMap, + FunDefVars, FunCallVars, FunArgTypes, NestingLevel, + State) -> + TState = dialyzer_dataflow:state__duplicate(State), + {DepList, NewCurrFun, NewCurrFunLabel, NewCalls, + NewCode, NewRaceList, NewRaceVarMap, NewFunDefVars, + NewFunCallVars, NewFunArgTypes, NewNestingLevel} = + fixup_race_forward(CurrFun, CurrFunLabel, Calls, Code, RaceList, + InitFun, WarnVarArgs, RaceWarnTag, RaceVarMap, + FunDefVars, FunCallVars, FunArgTypes, NestingLevel, + cleanup_race_code(TState)), + dialyzer_dataflow:dispose_state(TState), + case NewCode of + [] -> DepList; + [#fun_call{caller = NewCurrFun, callee = Call, arg_types = FunTypes, + vars = FunArgs}|Tail] -> + Callgraph = dialyzer_dataflow:state__get_callgraph(State), + OkCall = {ok, Call}, + {Name, Label} = + case is_integer(Call) of + true -> + case dialyzer_callgraph:lookup_name(Call, Callgraph) of + error -> {OkCall, OkCall}; + N -> {N, OkCall} + end; + false -> + {OkCall, dialyzer_callgraph:lookup_label(Call, Callgraph)} + end, + {NewCurrFun1, NewCurrFunLabel1, NewCalls1, NewCode1, NewRaceList1, + NewRaceVarMap1, NewFunDefVars1, NewFunCallVars1, NewFunArgTypes1, + NewNestingLevel1} = + case Label =:= error of + true -> + {NewCurrFun, NewCurrFunLabel, NewCalls, Tail, NewRaceList, + NewRaceVarMap, NewFunDefVars, NewFunCallVars, NewFunArgTypes, + NewNestingLevel}; + false -> + {ok, Fun} = Name, + {ok, Int} = Label, + case dict:find(Fun, dialyzer_callgraph:get_race_code(Callgraph)) of + error -> + {NewCurrFun, NewCurrFunLabel, NewCalls, Tail, NewRaceList, + NewRaceVarMap, NewFunDefVars, NewFunCallVars, NewFunArgTypes, + NewNestingLevel}; + {ok, [Args, CodeB]} -> + Races = dialyzer_dataflow:state__get_races(State), + {RetCurrFun, RetCurrFunLabel, RetCalls, RetCode, + RetRaceList, RetRaceVarMap, RetFunDefVars, RetFunCallVars, + RetFunArgTypes, RetNestingLevel} = + fixup_race_forward_helper(NewCurrFun, + NewCurrFunLabel, Fun, Int, NewCalls, NewCalls, + [#curr_fun{status = out, mfa = NewCurrFun, + label = NewCurrFunLabel, + var_map = NewRaceVarMap, + def_vars = NewFunDefVars, + call_vars = NewFunCallVars, + arg_types = NewFunArgTypes}| + Tail], + NewRaceList, InitFun, FunArgs, FunTypes, RaceWarnTag, + NewRaceVarMap, NewFunDefVars, NewFunCallVars, + NewFunArgTypes, NewNestingLevel, Args, CodeB, + Races#races.race_list), + case RetCode of + [#curr_fun{}|_CodeTail] -> + {NewCurrFun, NewCurrFunLabel, RetCalls, RetCode, + RetRaceList, NewRaceVarMap, NewFunDefVars, + NewFunCallVars, NewFunArgTypes, RetNestingLevel}; + _Else -> + {RetCurrFun, RetCurrFunLabel, RetCalls, RetCode, + RetRaceList, RetRaceVarMap, RetFunDefVars, + RetFunCallVars, RetFunArgTypes, RetNestingLevel} + end + end + end, + DepList ++ + fixup_race_forward_pullout(NewCurrFun1, NewCurrFunLabel1, NewCalls1, + NewCode1, NewRaceList1, InitFun, WarnVarArgs, + RaceWarnTag, NewRaceVarMap1, NewFunDefVars1, + NewFunCallVars1, NewFunArgTypes1, + NewNestingLevel1, State) + end. + +fixup_race_forward(CurrFun, CurrFunLabel, Calls, Code, RaceList, + InitFun, WarnVarArgs, RaceWarnTag, RaceVarMap, + FunDefVars, FunCallVars, FunArgTypes, NestingLevel, + State) -> + case Code of + [] -> + {[], CurrFun, CurrFunLabel, Calls, Code, RaceList, RaceVarMap, + FunDefVars, FunCallVars, FunArgTypes, NestingLevel}; + [Head|Tail] -> + Callgraph = dialyzer_dataflow:state__get_callgraph(State), + {NewRL, DepList, NewNL, Return} = + case Head of + #dep_call{call_name = whereis} -> + case RaceWarnTag of + WarnWhereis when WarnWhereis =:= ?WARN_WHEREIS_REGISTER orelse + WarnWhereis =:= ?WARN_WHEREIS_UNREGISTER -> + {[Head#dep_call{var_map = RaceVarMap}|RaceList], + [], NestingLevel, false}; + _Other -> + {RaceList, [], NestingLevel, false} + end; + #dep_call{call_name = ets_lookup} -> + case RaceWarnTag of + ?WARN_ETS_LOOKUP_INSERT -> + {[Head#dep_call{var_map = RaceVarMap}|RaceList], + [], NestingLevel, false}; + _Other -> + {RaceList, [], NestingLevel, false} + end; + #dep_call{call_name = mnesia_dirty_read} -> + case RaceWarnTag of + ?WARN_MNESIA_DIRTY_READ_WRITE -> + {[Head#dep_call{var_map = RaceVarMap}|RaceList], + [], NestingLevel, false}; + _Other -> + {RaceList, [], NestingLevel, false} + end; + #warn_call{call_name = RegCall} when RegCall =:= register orelse + RegCall =:= unregister -> + case RaceWarnTag of + WarnWhereis when WarnWhereis =:= ?WARN_WHEREIS_REGISTER orelse + WarnWhereis =:= ?WARN_WHEREIS_UNREGISTER -> + {[Head#warn_call{var_map = RaceVarMap}|RaceList], + [], NestingLevel, false}; + _Other -> + {RaceList, [], NestingLevel, false} + end; + #warn_call{call_name = ets_insert} -> + case RaceWarnTag of + ?WARN_ETS_LOOKUP_INSERT -> + {[Head#warn_call{var_map = RaceVarMap}|RaceList], + [], NestingLevel, false}; + _Other -> + {RaceList, [], NestingLevel, false} + end; + #warn_call{call_name = mnesia_dirty_write} -> + case RaceWarnTag of + ?WARN_MNESIA_DIRTY_READ_WRITE -> + {[Head#warn_call{var_map = RaceVarMap}|RaceList], + [], NestingLevel, false}; + _Other -> + {RaceList, [], NestingLevel, false} + end; + #fun_call{caller = CurrFun, callee = InitFun} -> + {RaceList, [], NestingLevel, false}; + #fun_call{caller = CurrFun} -> + {RaceList, [], NestingLevel - 1, false}; + beg_case -> + {[Head|RaceList], [], NestingLevel, false}; + #beg_clause{} -> + {[#beg_clause{}|RaceList], [], NestingLevel, false}; + #end_clause{} -> + {[#end_clause{}|RaceList], [], NestingLevel, false}; + #end_case{} -> + {[Head|RaceList], [], NestingLevel, false}; + #let_tag{} -> + {RaceList, [], NestingLevel, false}; + #curr_fun{status = in, mfa = InitFun, + label = _InitFunLabel, var_map = _NewRVM, + def_vars = NewFDV, call_vars = NewFCV, + arg_types = _NewFAT} -> + {[#curr_fun{status = out, var_map = RaceVarMap, + def_vars = NewFDV, call_vars = NewFCV}| + RaceList], [], NestingLevel - 1, false}; + #curr_fun{status = in, def_vars = NewFDV, + call_vars = NewFCV} -> + {[#curr_fun{status = out, var_map = RaceVarMap, + def_vars = NewFDV, call_vars = NewFCV}| + RaceList], + [], NestingLevel - 1, false}; + #curr_fun{status = out} -> + {[#curr_fun{status = in, var_map = RaceVarMap}|RaceList], [], + NestingLevel + 1, false}; + RaceTag -> + PublicTables = dialyzer_callgraph:get_public_tables(Callgraph), + NamedTables = dialyzer_callgraph:get_named_tables(Callgraph), + WarnVarArgs1 = + var_type_analysis(FunDefVars, FunArgTypes, WarnVarArgs, + RaceWarnTag, RaceVarMap, + dialyzer_dataflow:state__records_only(State)), + {NewDepList, IsPublic, _Return} = + get_deplist_paths(RaceList, WarnVarArgs1, RaceWarnTag, + RaceVarMap, 0, PublicTables, NamedTables), + {NewHead, NewDepList1} = + case RaceTag of + whereis_register -> + {[#warn_call{call_name = register, args = WarnVarArgs, + var_map = RaceVarMap}], + NewDepList}; + whereis_unregister -> + {[#warn_call{call_name = unregister, args = WarnVarArgs, + var_map = RaceVarMap}], + NewDepList}; + ets_lookup_insert -> + NewWarnCall = + [#warn_call{call_name = ets_insert, args = WarnVarArgs, + var_map = RaceVarMap}], + [Tab, Names, _, _] = WarnVarArgs, + case IsPublic orelse + compare_var_list(Tab, PublicTables, RaceVarMap) + orelse + length(Names -- NamedTables) < length(Names) of + true -> + {NewWarnCall, NewDepList}; + false -> {NewWarnCall, []} + end; + mnesia_dirty_read_write -> + {[#warn_call{call_name = mnesia_dirty_write, + args = WarnVarArgs, var_map = RaceVarMap}], + NewDepList} + end, + {NewHead ++ RaceList, NewDepList1, NestingLevel, + is_last_race(RaceTag, InitFun, Tail, Callgraph)} + end, + {NewCurrFun, NewCurrFunLabel, NewCode, NewRaceList, NewRaceVarMap, + NewFunDefVars, NewFunCallVars, NewFunArgTypes, NewNestingLevel, + PullOut} = + case Head of + #fun_call{caller = CurrFun} -> + case NewNL =:= 0 of + true -> + {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap, + FunDefVars, FunCallVars, FunArgTypes, NewNL, false}; + false -> + {CurrFun, CurrFunLabel, Code, NewRL, RaceVarMap, + FunDefVars, FunCallVars, FunArgTypes, NewNL, true} + end; + #beg_clause{arg = Arg, pats = Pats, guard = Guard} -> + {RaceVarMap1, RemoveClause} = + race_var_map_guard(Arg, Pats, Guard, RaceVarMap, bind), + case RemoveClause of + true -> + {RaceList2, + #curr_fun{mfa = CurrFun2, label = CurrFunLabel2, + var_map = RaceVarMap2, def_vars = FunDefVars2, + call_vars = FunCallVars2, arg_types = FunArgTypes2}, + Code2, NestingLevel2} = + remove_clause(NewRL, + #curr_fun{mfa = CurrFun, label = CurrFunLabel, + var_map = RaceVarMap1, + def_vars = FunDefVars, + call_vars = FunCallVars, + arg_types = FunArgTypes}, + Tail, NewNL), + {CurrFun2, CurrFunLabel2, Code2, RaceList2, + RaceVarMap2, FunDefVars2, FunCallVars2, FunArgTypes2, + NestingLevel2, false}; + false -> + {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap1, + FunDefVars, FunCallVars, FunArgTypes, NewNL, false} + end; + #end_clause{arg = Arg, pats = Pats, guard = Guard} -> + {RaceVarMap1, _RemoveClause} = + race_var_map_guard(Arg, Pats, Guard, RaceVarMap, unbind), + {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap1, + FunDefVars, FunCallVars, FunArgTypes, NewNL, + false}; + #end_case{clauses = Clauses} -> + RaceVarMap1 = + race_var_map_clauses(Clauses, RaceVarMap), + {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap1, + FunDefVars, FunCallVars, FunArgTypes, NewNL, + false}; + #let_tag{var = Var, arg = Arg} -> + {CurrFun, CurrFunLabel, Tail, NewRL, + race_var_map(Var, Arg, RaceVarMap, bind), FunDefVars, + FunCallVars, FunArgTypes, NewNL, false}; + #curr_fun{mfa = CurrFun1, label = CurrFunLabel1, + var_map = RaceVarMap1, def_vars = FunDefVars1, + call_vars = FunCallVars1, arg_types = FunArgTypes1} -> + case NewNL =:= 0 of + true -> + {CurrFun, CurrFunLabel, + remove_nonlocal_functions(Tail, 1), NewRL, RaceVarMap, + FunDefVars, FunCallVars, FunArgTypes, NewNL, false}; + false -> + {CurrFun1, CurrFunLabel1, Tail, NewRL, RaceVarMap1, + FunDefVars1, FunCallVars1, FunArgTypes1, NewNL, false} + end; + _Thing -> + {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap, + FunDefVars, FunCallVars, FunArgTypes, NewNL, false} + end, + case Return of + true -> + {DepList, NewCurrFun, NewCurrFunLabel, Calls, + [], NewRaceList, NewRaceVarMap, NewFunDefVars, + NewFunCallVars, NewFunArgTypes, NewNestingLevel}; + false -> + NewNestingLevel1 = + case NewNestingLevel =:= 0 of + true -> NewNestingLevel + 1; + false -> NewNestingLevel + end, + case PullOut of + true -> + {DepList, NewCurrFun, NewCurrFunLabel, Calls, + NewCode, NewRaceList, NewRaceVarMap, NewFunDefVars, + NewFunCallVars, NewFunArgTypes, NewNestingLevel1}; + false -> + {RetDepList, NewCurrFun1, NewCurrFunLabel1, NewCalls1, + NewCode1, NewRaceList1, NewRaceVarMap1, NewFunDefVars1, + NewFunCallVars1, NewFunArgTypes1, NewNestingLevel2} = + fixup_race_forward(NewCurrFun, NewCurrFunLabel, Calls, + NewCode, NewRaceList, InitFun, WarnVarArgs, + RaceWarnTag, NewRaceVarMap, NewFunDefVars, + NewFunCallVars, NewFunArgTypes, + NewNestingLevel1, State), + {DepList ++ RetDepList, NewCurrFun1, NewCurrFunLabel1, + NewCalls1, NewCode1, NewRaceList1, NewRaceVarMap1, + NewFunDefVars1, NewFunCallVars1, NewFunArgTypes1, + NewNestingLevel2} + end + end + end. + +get_deplist_paths(RaceList, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel, + PublicTables, NamedTables) -> + case RaceList of + [] -> {[], false, true}; + [Head|Tail] -> + case Head of + #end_case{} -> + {RaceList1, DepList1, IsPublic1, Continue1} = + handle_case(Tail, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel, + PublicTables, NamedTables), + case Continue1 of + true -> + {DepList2, IsPublic2, Continue2} = + get_deplist_paths(RaceList1, WarnVarArgs, RaceWarnTag, + RaceVarMap, CurrLevel, PublicTables, + NamedTables), + {DepList1 ++ DepList2, IsPublic1 orelse IsPublic2, Continue2}; + false -> {DepList1, IsPublic1, false} + end; + #beg_clause{} -> + get_deplist_paths(fixup_before_case_path(Tail), WarnVarArgs, + RaceWarnTag, RaceVarMap, CurrLevel, PublicTables, + NamedTables); + #curr_fun{status = in, var_map = RaceVarMap1} -> + {DepList, IsPublic, Continue} = + get_deplist_paths(Tail, WarnVarArgs, RaceWarnTag, RaceVarMap, + CurrLevel + 1, PublicTables, NamedTables), + IsPublic1 = + case RaceWarnTag of + ?WARN_ETS_LOOKUP_INSERT -> + [Tabs, Names, _, _] = WarnVarArgs, + IsPublic orelse + lists:any( + fun (T) -> + compare_var_list(T, PublicTables, RaceVarMap1) + end, Tabs) + orelse + length(Names -- NamedTables) < length(Names); + _ -> true + end, + {DepList, IsPublic1, Continue}; + #curr_fun{status = out, var_map = RaceVarMap1, def_vars = FunDefVars, + call_vars = FunCallVars} -> + WarnVarArgs1 = + var_analysis([format_arg(DefVar) || DefVar <- FunDefVars], + [format_arg(CallVar) || CallVar <- FunCallVars], + WarnVarArgs, RaceWarnTag), + {WarnVarArgs2, Stop} = + case RaceWarnTag of + ?WARN_WHEREIS_REGISTER -> + [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs1, + Vars = + lists:flatten( + [find_all_bound_vars(V, RaceVarMap1) || V <- WVA1]), + case {Vars, CurrLevel} of + {[], 0} -> + {WarnVarArgs, true}; + {[], _} -> + {WarnVarArgs, false}; + _ -> + {[Vars, WVA2, WVA3, WVA4], false} + end; + ?WARN_WHEREIS_UNREGISTER -> + [WVA1, WVA2] = WarnVarArgs1, + Vars = + lists:flatten( + [find_all_bound_vars(V, RaceVarMap1) || V <- WVA1]), + case {Vars, CurrLevel} of + {[], 0} -> + {WarnVarArgs, true}; + {[], _} -> + {WarnVarArgs, false}; + _ -> + {[Vars, WVA2], false} + end; + ?WARN_ETS_LOOKUP_INSERT -> + [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs1, + Vars1 = + lists:flatten( + [find_all_bound_vars(V1, RaceVarMap1) || V1 <- WVA1]), + Vars2 = + lists:flatten( + [find_all_bound_vars(V2, RaceVarMap1) || V2 <- WVA3]), + case {Vars1, Vars2, CurrLevel} of + {[], _, 0} -> + {WarnVarArgs, true}; + {[], _, _} -> + {WarnVarArgs, false}; + {_, [], 0} -> + {WarnVarArgs, true}; + {_, [], _} -> + {WarnVarArgs, false}; + _ -> + {[Vars1, WVA2, Vars2, WVA4], false} + end; + ?WARN_MNESIA_DIRTY_READ_WRITE -> + [WVA1, WVA2|T] = WarnVarArgs1, + Vars = + lists:flatten( + [find_all_bound_vars(V, RaceVarMap1) || V <- WVA1]), + case {Vars, CurrLevel} of + {[], 0} -> + {WarnVarArgs, true}; + {[], _} -> + {WarnVarArgs, false}; + _ -> + {[Vars, WVA2|T], false} + end + end, + case Stop of + true -> {[], false, false}; + false -> + CurrLevel1 = + case CurrLevel of + 0 -> CurrLevel; + _ -> CurrLevel - 1 + end, + get_deplist_paths(Tail, WarnVarArgs2, RaceWarnTag, RaceVarMap1, + CurrLevel1, PublicTables, NamedTables) + end; + #warn_call{call_name = RegCall, args = WarnVarArgs1, + var_map = RaceVarMap1} when RegCall =:= register orelse + RegCall =:= unregister -> + case compare_first_arg(WarnVarArgs, WarnVarArgs1, RaceVarMap1) of + true -> {[], false, false}; + NewWarnVarArgs -> + get_deplist_paths(Tail, NewWarnVarArgs, RaceWarnTag, RaceVarMap, + CurrLevel, PublicTables, NamedTables) + end; + #warn_call{call_name = ets_insert, args = WarnVarArgs1, + var_map = RaceVarMap1} -> + case compare_ets_insert(WarnVarArgs, WarnVarArgs1, RaceVarMap1) of + true -> {[], false, false}; + NewWarnVarArgs -> + get_deplist_paths(Tail, NewWarnVarArgs, RaceWarnTag, RaceVarMap, + CurrLevel, PublicTables, NamedTables) + end; + #warn_call{call_name = mnesia_dirty_write, args = WarnVarArgs1, + var_map = RaceVarMap1} -> + case compare_first_arg(WarnVarArgs, WarnVarArgs1, RaceVarMap1) of + true -> {[], false, false}; + NewWarnVarArgs -> + get_deplist_paths(Tail, NewWarnVarArgs, RaceWarnTag, RaceVarMap, + CurrLevel, PublicTables, NamedTables) + end; + #dep_call{var_map = RaceVarMap1} -> + {DepList, IsPublic, Continue} = + get_deplist_paths(Tail, WarnVarArgs, RaceWarnTag, RaceVarMap, + CurrLevel, PublicTables, NamedTables), + {refine_race(Head, WarnVarArgs, RaceWarnTag, DepList, RaceVarMap1), + IsPublic, Continue} + end + end. + +handle_case(RaceList, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel, + PublicTables, NamedTables) -> + case RaceList of + [] -> {[], [], false, true}; + [Head|Tail] -> + case Head of + #end_clause{} -> + {RestRaceList, DepList1, IsPublic1, Continue1} = + do_clause(Tail, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel, + PublicTables, NamedTables), + {RetRaceList, DepList2, IsPublic2, Continue2} = + handle_case(RestRaceList, WarnVarArgs, RaceWarnTag, RaceVarMap, + CurrLevel, PublicTables, NamedTables), + {RetRaceList, DepList1 ++ DepList2, IsPublic1 orelse IsPublic2, + Continue1 orelse Continue2}; + beg_case -> {Tail, [], false, false} + end + end. + +do_clause(RaceList, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel, + PublicTables, NamedTables) -> + {DepList, IsPublic, Continue} = + get_deplist_paths(fixup_case_path(RaceList, 0), WarnVarArgs, + RaceWarnTag, RaceVarMap, CurrLevel, + PublicTables, NamedTables), + {fixup_case_rest_paths(RaceList, 0), DepList, IsPublic, Continue}. + +fixup_case_path(RaceList, NestingLevel) -> + case RaceList of + [] -> []; + [Head|Tail] -> + {NewNestingLevel, Return} = + case Head of + beg_case -> {NestingLevel - 1, false}; + #end_case{} -> {NestingLevel + 1, false}; + #beg_clause{} -> + case NestingLevel =:= 0 of + true -> {NestingLevel, true}; + false -> {NestingLevel, false} + end; + _Other -> {NestingLevel, false} + end, + case Return of + true -> []; + false -> [Head|fixup_case_path(Tail, NewNestingLevel)] + end + end. + +%% Gets the race list before a case clause. +fixup_before_case_path(RaceList) -> + case RaceList of + [] -> []; + [Head|Tail] -> + case Head of + #end_clause{} -> + fixup_before_case_path(fixup_case_rest_paths(Tail, 0)); + beg_case -> Tail + end + end. + +fixup_case_rest_paths(RaceList, NestingLevel) -> + case RaceList of + [] -> []; + [Head|Tail] -> + {NewNestingLevel, Return} = + case Head of + beg_case -> {NestingLevel - 1, false}; + #end_case{} -> {NestingLevel + 1, false}; + #beg_clause{} -> + case NestingLevel =:= 0 of + true -> {NestingLevel, true}; + false -> {NestingLevel, false} + end; + _Other -> {NestingLevel, false} + end, + case Return of + true -> Tail; + false -> fixup_case_rest_paths(Tail, NewNestingLevel) + end + end. + +fixup_race_forward_helper(CurrFun, CurrFunLabel, Fun, FunLabel, + Calls, CallsToAnalyze, Code, RaceList, + InitFun, NewFunArgs, NewFunTypes, + RaceWarnTag, RaceVarMap, FunDefVars, + FunCallVars, FunArgTypes, NestingLevel, + Args, CodeB, StateRaceList) -> + case Calls of + [] -> + {NewRaceList, + #curr_fun{mfa = NewCurrFun, label = NewCurrFunLabel, + var_map = NewRaceVarMap, def_vars = NewFunDefVars, + call_vars = NewFunCallVars, arg_types = NewFunArgTypes}, + NewCode, NewNestingLevel} = + remove_clause(RaceList, + #curr_fun{mfa = CurrFun, label = CurrFunLabel, var_map = RaceVarMap, + def_vars = FunDefVars, call_vars = FunCallVars, + arg_types = FunArgTypes}, + Code, NestingLevel), + {NewCurrFun, NewCurrFunLabel, CallsToAnalyze, NewCode, NewRaceList, + NewRaceVarMap, NewFunDefVars, NewFunCallVars, NewFunArgTypes, + NewNestingLevel}; + [Head|Tail] -> + case Head of + {InitFun, InitFun} when CurrFun =:= InitFun, Fun =:= InitFun -> + NewCallsToAnalyze = lists:delete(Head, CallsToAnalyze), + NewRaceVarMap = + race_var_map(Args, NewFunArgs, RaceVarMap, bind), + RetC = + fixup_all_calls(InitFun, InitFun, FunLabel, Args, + CodeB ++ + [#curr_fun{status = out, mfa = InitFun, + label = CurrFunLabel, var_map = RaceVarMap, + def_vars = FunDefVars, call_vars = FunCallVars, + arg_types = FunArgTypes}], + Code, RaceVarMap), + NewCode = + fixup_all_calls(InitFun, InitFun, FunLabel, Args, + CodeB ++ + [#curr_fun{status = out, mfa = InitFun, + label = CurrFunLabel, var_map = NewRaceVarMap, + def_vars = Args, call_vars = NewFunArgs, + arg_types = NewFunTypes}], + [#curr_fun{status = in, mfa = Fun, + label = FunLabel, var_map = NewRaceVarMap, + def_vars = Args, call_vars = NewFunArgs, + arg_types = NewFunTypes}| + lists:reverse(StateRaceList)] ++ + RetC, NewRaceVarMap), + {InitFun, FunLabel, NewCallsToAnalyze, NewCode, RaceList, + NewRaceVarMap, Args, NewFunArgs, NewFunTypes, NestingLevel}; + {CurrFun, Fun} -> + NewCallsToAnalyze = lists:delete(Head, CallsToAnalyze), + NewRaceVarMap = race_var_map(Args, NewFunArgs, RaceVarMap, bind), + RetC = + case Fun of + InitFun -> + fixup_all_calls(CurrFun, Fun, FunLabel, Args, + lists:reverse(StateRaceList) ++ + [#curr_fun{status = out, mfa = CurrFun, + label = CurrFunLabel, var_map = RaceVarMap, + def_vars = FunDefVars, call_vars = FunCallVars, + arg_types = FunArgTypes}], + Code, RaceVarMap); + _Other1 -> + fixup_all_calls(CurrFun, Fun, FunLabel, Args, + CodeB ++ + [#curr_fun{status = out, mfa = CurrFun, + label = CurrFunLabel, var_map = RaceVarMap, + def_vars = FunDefVars, call_vars = FunCallVars, + arg_types = FunArgTypes}], + Code, RaceVarMap) + end, + NewCode = + case Fun of + InitFun -> + [#curr_fun{status = in, mfa = Fun, + label = FunLabel, var_map = NewRaceVarMap, + def_vars = Args, call_vars = NewFunArgs, + arg_types = NewFunTypes}| + lists:reverse(StateRaceList)] ++ RetC; + _ -> + [#curr_fun{status = in, mfa = Fun, + label = FunLabel, var_map = NewRaceVarMap, + def_vars = Args, call_vars = NewFunArgs, + arg_types = NewFunTypes}|CodeB] ++ + RetC + end, + {Fun, FunLabel, NewCallsToAnalyze, NewCode, RaceList, NewRaceVarMap, + Args, NewFunArgs, NewFunTypes, NestingLevel}; + {_TupleA, _TupleB} -> + fixup_race_forward_helper(CurrFun, CurrFunLabel, Fun, FunLabel, + Tail, CallsToAnalyze, Code, RaceList, InitFun, NewFunArgs, + NewFunTypes, RaceWarnTag, RaceVarMap, FunDefVars, FunCallVars, + FunArgTypes, NestingLevel, Args, CodeB, StateRaceList) + end + end. + +%%% =========================================================================== +%%% +%%% Backward Analysis +%%% +%%% =========================================================================== + +fixup_race_backward(CurrFun, Calls, CallsToAnalyze, Parents, Height) -> + case Height =:= 0 of + true -> Parents; + false -> + case Calls of + [] -> + case is_integer(CurrFun) orelse lists:member(CurrFun, Parents) of + true -> Parents; + false -> [CurrFun|Parents] + end; + [Head|Tail] -> + {Parent, TupleB} = Head, + case TupleB =:= CurrFun of + true -> % more paths are needed + NewCallsToAnalyze = lists:delete(Head, CallsToAnalyze), + NewParents = + fixup_race_backward(Parent, NewCallsToAnalyze, + NewCallsToAnalyze, Parents, Height - 1), + fixup_race_backward(CurrFun, Tail, NewCallsToAnalyze, NewParents, + Height); + false -> + fixup_race_backward(CurrFun, Tail, CallsToAnalyze, Parents, + Height) + end + end + end. + +%%% =========================================================================== +%%% +%%% Utilities +%%% +%%% =========================================================================== + +are_bound_labels(Label1, Label2, RaceVarMap) -> + case dict:find(Label1, RaceVarMap) of + error -> false; + {ok, Labels} -> + lists:member(Label2, Labels) orelse + are_bound_labels_helper(Labels, Label1, Label2, RaceVarMap) + end. + +are_bound_labels_helper(Labels, OldLabel, CompLabel, RaceVarMap) -> + case dict:size(RaceVarMap) of + 0 -> false; + _ -> + case Labels of + [] -> false; + [Head|Tail] -> + NewRaceVarMap = dict:erase(OldLabel, RaceVarMap), + are_bound_labels(Head, CompLabel, NewRaceVarMap) orelse + are_bound_labels_helper(Tail, Head, CompLabel, NewRaceVarMap) + end + end. + +are_bound_vars(Vars1, Vars2, RaceVarMap) -> + case is_list(Vars1) andalso is_list(Vars2) of + true -> + case Vars1 of + [] -> false; + [AHead|ATail] -> + case Vars2 of + [] -> false; + [PHead|PTail] -> + are_bound_vars(AHead, PHead, RaceVarMap) andalso + are_bound_vars(ATail, PTail, RaceVarMap) + end + end; + false -> + {NewVars1, NewVars2, IsList} = + case is_list(Vars1) of + true -> + case Vars1 of + [Var1] -> {Var1, Vars2, true}; + _Thing -> {Vars1, Vars2, false} + end; + false -> + case is_list(Vars2) of + true -> + case Vars2 of + [Var2] -> {Vars1, Var2, true}; + _Thing -> {Vars1, Vars2, false} + end; + false -> {Vars1, Vars2, true} + end + end, + case IsList of + true -> + case cerl:type(NewVars1) of + var -> + case cerl:type(NewVars2) of + var -> + ALabel = cerl_trees:get_label(NewVars1), + PLabel = cerl_trees:get_label(NewVars2), + are_bound_labels(ALabel, PLabel, RaceVarMap) orelse + are_bound_labels(PLabel, ALabel, RaceVarMap); + alias -> + are_bound_vars(NewVars1, cerl:alias_var(NewVars2), + RaceVarMap); + values -> + are_bound_vars(NewVars1, cerl:values_es(NewVars2), + RaceVarMap); + _Other -> false + end; + tuple -> + case cerl:type(NewVars2) of + tuple -> + are_bound_vars(cerl:tuple_es(NewVars1), + cerl:tuple_es(NewVars2), RaceVarMap); + alias -> + are_bound_vars(NewVars1, cerl:alias_var(NewVars2), + RaceVarMap); + values -> + are_bound_vars(NewVars1, cerl:values_es(NewVars2), + RaceVarMap); + _Other -> false + end; + cons -> + case cerl:type(NewVars2) of + cons -> + are_bound_vars(cerl:cons_hd(NewVars1), + cerl:cons_hd(NewVars2), RaceVarMap) + andalso + are_bound_vars(cerl:cons_tl(NewVars1), + cerl:cons_tl(NewVars2), RaceVarMap); + alias -> + are_bound_vars(NewVars1, cerl:alias_var(NewVars2), + RaceVarMap); + values -> + are_bound_vars(NewVars1, cerl:values_es(NewVars2), + RaceVarMap); + _Other -> false + end; + alias -> + case cerl:type(NewVars2) of + alias -> + are_bound_vars(cerl:alias_var(NewVars1), + cerl:alias_var(NewVars2), RaceVarMap); + _Other -> + are_bound_vars(cerl:alias_var(NewVars1), + NewVars2, RaceVarMap) + end; + values -> + case cerl:type(NewVars2) of + values -> + are_bound_vars(cerl:values_es(NewVars1), + cerl:values_es(NewVars2), RaceVarMap); + _Other -> + are_bound_vars(cerl:values_es(NewVars1), + NewVars2, RaceVarMap) + end; + _Other -> false + end; + false -> false + end + end. + +callgraph__renew_tables(Table, Callgraph) -> + case Table of + {named, NameLabel, Names} -> + PTablesToAdd = + case NameLabel of + ?no_label -> []; + _Other -> [NameLabel] + end, + NamesToAdd = filter_named_tables(Names), + PTables = dialyzer_callgraph:get_public_tables(Callgraph), + NTables = dialyzer_callgraph:get_named_tables(Callgraph), + dialyzer_callgraph:put_public_tables( + lists:usort(PTablesToAdd ++ PTables), + dialyzer_callgraph:put_named_tables( + NamesToAdd ++ NTables, Callgraph)); + _Other -> + Callgraph + end. + +cleanup_clause_code(#curr_fun{mfa = CurrFun} = CurrTuple, Code, + NestingLevel, LocalNestingLevel) -> + case Code of + [] -> {CurrTuple, []}; + [Head|Tail] -> + {NewLocalNestingLevel, NewNestingLevel, NewCurrTuple, Return} = + case Head of + beg_case -> + {LocalNestingLevel, NestingLevel + 1, CurrTuple, false}; + #end_case{} -> + {LocalNestingLevel, NestingLevel - 1, CurrTuple, false}; + #end_clause{} -> + case NestingLevel =:= 0 of + true -> + {LocalNestingLevel, NestingLevel, CurrTuple, true}; + false -> + {LocalNestingLevel, NestingLevel, CurrTuple, false} + end; + #fun_call{caller = CurrFun} -> + {LocalNestingLevel - 1, NestingLevel, CurrTuple, false}; + #curr_fun{status = in} -> + {LocalNestingLevel - 1, NestingLevel, Head, false}; + #curr_fun{status = out} -> + {LocalNestingLevel + 1, NestingLevel, Head, false}; + Other when Other =/= #fun_call{} -> + {LocalNestingLevel, NestingLevel, CurrTuple, false} + end, + case Return of + true -> {NewCurrTuple, Tail}; + false -> + cleanup_clause_code(NewCurrTuple, Tail, NewNestingLevel, + NewLocalNestingLevel) + end + end. + +cleanup_dep_calls(DepList) -> + case DepList of + [] -> []; + [#dep_call{call_name = CallName, arg_types = ArgTypes, + vars = Vars, state = State, file_line = FileLine}|T] -> + [#dep_call{call_name = CallName, arg_types = ArgTypes, + vars = Vars, state = State, file_line = FileLine}| + cleanup_dep_calls(T)] + end. + +cleanup_race_code(State) -> + Callgraph = dialyzer_dataflow:state__get_callgraph(State), + dialyzer_dataflow:state__put_callgraph( + dialyzer_callgraph:race_code_new(Callgraph), State). + +filter_named_tables(NamesList) -> + case NamesList of + [] -> []; + [Head|Tail] -> + NewHead = + case string:rstr(Head, "()") of + 0 -> [Head]; + _Other -> [] + end, + NewHead ++ filter_named_tables(Tail) + end. + +filter_parents(Parents, NewParents, Digraph) -> + case Parents of + [] -> NewParents; + [Head|Tail] -> + NewParents1 = filter_parents_helper1(Head, Tail, NewParents, Digraph), + filter_parents(Tail, NewParents1, Digraph) + end. + +filter_parents_helper1(First, Rest, NewParents, Digraph) -> + case Rest of + [] -> NewParents; + [Head|Tail] -> + NewParents1 = filter_parents_helper2(First, Head, NewParents, Digraph), + filter_parents_helper1(First, Tail, NewParents1, Digraph) + end. + +filter_parents_helper2(Parent1, Parent2, NewParents, Digraph) -> + case digraph:get_path(Digraph, Parent1, Parent2) of + false -> + case digraph:get_path(Digraph, Parent2, Parent1) of + false -> NewParents; + _Vertices -> NewParents -- [Parent1] + end; + _Vertices -> NewParents -- [Parent2] + end. + +find_all_bound_vars(Label, RaceVarMap) -> + case dict:find(Label, RaceVarMap) of + error -> [Label]; + {ok, Labels} -> + lists:usort(Labels ++ + find_all_bound_vars_helper(Labels, Label, RaceVarMap)) + end. + +find_all_bound_vars_helper(Labels, Label, RaceVarMap) -> + case dict:size(RaceVarMap) of + 0 -> []; + _ -> + case Labels of + [] -> []; + [Head|Tail] -> + NewRaceVarMap = dict:erase(Label, RaceVarMap), + find_all_bound_vars(Head, NewRaceVarMap) ++ + find_all_bound_vars_helper(Tail, Head, NewRaceVarMap) + end + end. + +fixup_all_calls(CurrFun, NextFun, NextFunLabel, Args, CodeToReplace, + Code, RaceVarMap) -> + case Code of + [] -> []; + [Head|Tail] -> + NewCode = + case Head of + #fun_call{caller = CurrFun, callee = Callee, + arg_types = FunArgTypes, vars = FunArgs} + when Callee =:= NextFun orelse Callee =:= NextFunLabel -> + RaceVarMap1 = race_var_map(Args, FunArgs, RaceVarMap, bind), + [#curr_fun{status = in, mfa = NextFun, label = NextFunLabel, + var_map = RaceVarMap1, def_vars = Args, + call_vars = FunArgs, arg_types = FunArgTypes}| + CodeToReplace]; + _Other -> [Head] + end, + RetCode = + fixup_all_calls(CurrFun, NextFun, NextFunLabel, Args, CodeToReplace, + Tail, RaceVarMap), + NewCode ++ RetCode + end. + +is_last_race(RaceTag, InitFun, Code, Callgraph) -> + case Code of + [] -> true; + [Head|Tail] -> + case Head of + RaceTag -> false; + #fun_call{callee = Fun} -> + FunName = + case is_integer(Fun) of + true -> + case dialyzer_callgraph:lookup_name(Fun, Callgraph) of + error -> Fun; + {ok, Name} -> Name + end; + false -> Fun + end, + Digraph = dialyzer_callgraph:get_digraph(Callgraph), + case FunName =:= InitFun orelse + digraph:get_path(Digraph, FunName, InitFun) of + false -> is_last_race(RaceTag, InitFun, Tail, Callgraph); + _Vertices -> false + end; + _Other -> is_last_race(RaceTag, InitFun, Tail, Callgraph) + end + end. + +lists_key_member(Member, List, N) when is_integer(Member) -> + case List of + [] -> 0; + [Head|Tail] -> + NewN = N + 1, + case Head of + Member -> NewN; + _Other -> lists_key_member(Member, Tail, NewN) + end + end; +lists_key_member(_M, _L, _N) -> + 0. + +lists_key_member_lists(MemberList, List) -> + case MemberList of + [] -> 0; + [Head|Tail] -> + case lists_key_member(Head, List, 0) of + 0 -> lists_key_member_lists(Tail, List); + Other -> Other + end + end. + +lists_key_members_lists(MemberList, List) -> + case MemberList of + [] -> []; + [Head|Tail] -> + lists:usort( + lists_key_members_lists_helper(Head, List, 1) ++ + lists_key_members_lists(Tail, List)) + end. + +lists_key_members_lists_helper(Elem, List, N) when is_integer(Elem) -> + case List of + [] -> []; + [Head|Tail] -> + NewHead = + case Head =:= Elem of + true -> [N]; + false -> [] + end, + NewHead ++ lists_key_members_lists_helper(Elem, Tail, N + 1) + end; +lists_key_members_lists_helper(_Elem, _List, _N) -> + [0]. + +lists_key_replace(N, List, NewMember) -> + {Before, [_|After]} = lists:split(N - 1, List), + Before ++ [NewMember|After]. + +lists_get(0, _List) -> ?no_label; +lists_get(N, List) -> lists:nth(N, List). + +refine_race(RaceCall, WarnVarArgs, RaceWarnTag, DependencyList, RaceVarMap) -> + case RaceWarnTag of + WarnWhereis when WarnWhereis =:= ?WARN_WHEREIS_REGISTER orelse + WarnWhereis =:= ?WARN_WHEREIS_UNREGISTER -> + case RaceCall of + #dep_call{call_name = ets_lookup} -> + DependencyList; + #dep_call{call_name = mnesia_dirty_read} -> + DependencyList; + #dep_call{call_name = whereis, args = VarArgs} -> + refine_race_helper(RaceCall, VarArgs, WarnVarArgs, RaceWarnTag, + DependencyList, RaceVarMap) + end; + ?WARN_ETS_LOOKUP_INSERT -> + case RaceCall of + #dep_call{call_name = whereis} -> + DependencyList; + #dep_call{call_name = mnesia_dirty_read} -> + DependencyList; + #dep_call{call_name = ets_lookup, args = VarArgs} -> + refine_race_helper(RaceCall, VarArgs, WarnVarArgs, RaceWarnTag, + DependencyList, RaceVarMap) + end; + ?WARN_MNESIA_DIRTY_READ_WRITE -> + case RaceCall of + #dep_call{call_name = whereis} -> + DependencyList; + #dep_call{call_name = ets_lookup} -> + DependencyList; + #dep_call{call_name = mnesia_dirty_read, args = VarArgs} -> + refine_race_helper(RaceCall, VarArgs, WarnVarArgs, RaceWarnTag, + DependencyList, RaceVarMap) + end + end. + +refine_race_helper(RaceCall, VarArgs, WarnVarArgs, RaceWarnTag, DependencyList, + RaceVarMap) -> + case compare_types(VarArgs, WarnVarArgs, RaceWarnTag, RaceVarMap) of + true -> [RaceCall|DependencyList]; + false -> DependencyList + end. + +remove_clause(RaceList, CurrTuple, Code, NestingLevel) -> + NewRaceList = fixup_case_rest_paths(RaceList, 0), + {NewCurrTuple, NewCode} = + cleanup_clause_code(CurrTuple, Code, 0, NestingLevel), + ReturnTuple = {NewRaceList, NewCurrTuple, NewCode, NestingLevel}, + case NewRaceList of + [beg_case|RTail] -> + case NewCode of + [#end_case{}|CTail] -> + remove_clause(RTail, NewCurrTuple, CTail, NestingLevel); + _Other -> ReturnTuple + end; + _Else -> ReturnTuple + end. + +remove_nonlocal_functions(Code, NestingLevel) -> + case Code of + [] -> []; + [H|T] -> + NewNL = + case H of + #curr_fun{status = in} -> + NestingLevel + 1; + #curr_fun{status = out} -> + NestingLevel - 1; + _Other -> + NestingLevel + end, + case NewNL =:= 0 of + true -> T; + false -> remove_nonlocal_functions(T, NewNL) + end + end. + +renew_curr_fun(CurrFun, Races) -> + Races#races{curr_fun = CurrFun}. + +renew_curr_fun_label(CurrFunLabel, Races) -> + Races#races{curr_fun_label = CurrFunLabel}. + +renew_race_list(RaceList, Races) -> + Races#races{race_list = RaceList}. + +renew_race_list_size(RaceListSize, Races) -> + Races#races{race_list_size = RaceListSize}. + +renew_race_tags(RaceTags, Races) -> + Races#races{race_tags = RaceTags}. + +renew_table(Table, Races) -> + Races#races{new_table = Table}. + +state__renew_curr_fun(CurrFun, State) -> + Races = dialyzer_dataflow:state__get_races(State), + dialyzer_dataflow:state__put_races(renew_curr_fun(CurrFun, Races), State). + +state__renew_curr_fun_label(CurrFunLabel, State) -> + Races = dialyzer_dataflow:state__get_races(State), + dialyzer_dataflow:state__put_races( + renew_curr_fun_label(CurrFunLabel, Races), State). + +state__renew_race_list(RaceList, State) -> + Races = dialyzer_dataflow:state__get_races(State), + dialyzer_dataflow:state__put_races(renew_race_list(RaceList, Races), State). + +state__renew_race_tags(RaceTags, State) -> + Races = dialyzer_dataflow:state__get_races(State), + dialyzer_dataflow:state__put_races(renew_race_tags(RaceTags, Races), State). + +state__renew_info(RaceList, RaceListSize, RaceTags, Table, State) -> + Callgraph = dialyzer_dataflow:state__get_callgraph(State), + Races = dialyzer_dataflow:state__get_races(State), + dialyzer_dataflow:state__put_callgraph( + callgraph__renew_tables(Table, Callgraph), + dialyzer_dataflow:state__put_races( + renew_table(Table, + renew_race_list(RaceList, + renew_race_list_size(RaceListSize, + renew_race_tags(RaceTags, Races)))), State)). + +%%% =========================================================================== +%%% +%%% Variable and Type Utilities +%%% +%%% =========================================================================== + +any_args(StrList) -> + case StrList of + [] -> false; + [Head|Tail] -> + case string:rstr(Head, "()") of + 0 -> any_args(Tail); + _Other -> true + end + end. + +-spec bind_dict_vars(label(), label(), dict:dict()) -> dict:dict(). + +bind_dict_vars(Key, Label, RaceVarMap) -> + case Key =:= Label of + true -> RaceVarMap; + false -> + case dict:find(Key, RaceVarMap) of + error -> dict:store(Key, [Label], RaceVarMap); + {ok, Labels} -> + case lists:member(Label, Labels) of + true -> RaceVarMap; + false -> dict:store(Key, [Label|Labels], RaceVarMap) + end + end + end. + +bind_dict_vars_list(Key, Labels, RaceVarMap) -> + case Labels of + [] -> RaceVarMap; + [Head|Tail] -> + bind_dict_vars_list(Key, Tail, bind_dict_vars(Key, Head, RaceVarMap)) + end. + +compare_ets_insert(OldWarnVarArgs, NewWarnVarArgs, RaceVarMap) -> + [Old1, Old2, Old3, Old4] = OldWarnVarArgs, + [New1, New2, New3, New4] = NewWarnVarArgs, + Bool = + case any_args(Old2) of + true -> compare_var_list(New1, Old1, RaceVarMap); + false -> + case any_args(New2) of + true -> compare_var_list(New1, Old1, RaceVarMap); + false -> compare_var_list(New1, Old1, RaceVarMap) + orelse (Old2 =:= New2) + end + end, + case Bool of + true -> + case any_args(Old4) of + true -> + case compare_list_vars(Old3, ets_list_args(New3), [], RaceVarMap) of + true -> true; + Args3 -> lists_key_replace(3, OldWarnVarArgs, Args3) + end; + false -> + case any_args(New4) of + true -> + case compare_list_vars(Old3, ets_list_args(New3), [], + RaceVarMap) of + true -> true; + Args3 -> lists_key_replace(3, OldWarnVarArgs, Args3) + end; + false -> + case compare_list_vars(Old3, ets_list_args(New3), [], + RaceVarMap) of + true -> true; + Args3 -> + lists_key_replace(4, + lists_key_replace(3, OldWarnVarArgs, Args3), Old4 -- New4) + end + end + end; + false -> OldWarnVarArgs + end. + +compare_first_arg(OldWarnVarArgs, NewWarnVarArgs, RaceVarMap) -> + [Old1, Old2|_OldT] = OldWarnVarArgs, + [New1, New2|_NewT] = NewWarnVarArgs, + case any_args(Old2) of + true -> + case compare_var_list(New1, Old1, RaceVarMap) of + true -> true; + false -> OldWarnVarArgs + end; + false -> + case any_args(New2) of + true -> + case compare_var_list(New1, Old1, RaceVarMap) of + true -> true; + false -> OldWarnVarArgs + end; + false -> + case compare_var_list(New1, Old1, RaceVarMap) of + true -> true; + false -> lists_key_replace(2, OldWarnVarArgs, Old2 -- New2) + end + end + end. + +compare_argtypes(ArgTypes, WarnArgTypes) -> + lists:any(fun (X) -> lists:member(X, WarnArgTypes) end, ArgTypes). + +%% Compares the argument types of the two suspicious calls. +compare_types(VarArgs, WarnVarArgs, RaceWarnTag, RaceVarMap) -> + case RaceWarnTag of + ?WARN_WHEREIS_REGISTER -> + [VA1, VA2] = VarArgs, + [WVA1, WVA2, _, _] = WarnVarArgs, + case any_args(VA2) of + true -> compare_var_list(VA1, WVA1, RaceVarMap); + false -> + case any_args(WVA2) of + true -> compare_var_list(VA1, WVA1, RaceVarMap); + false -> + compare_var_list(VA1, WVA1, RaceVarMap) orelse + compare_argtypes(VA2, WVA2) + end + end; + ?WARN_WHEREIS_UNREGISTER -> + [VA1, VA2] = VarArgs, + [WVA1, WVA2] = WarnVarArgs, + case any_args(VA2) of + true -> compare_var_list(VA1, WVA1, RaceVarMap); + false -> + case any_args(WVA2) of + true -> compare_var_list(VA1, WVA1, RaceVarMap); + false -> + compare_var_list(VA1, WVA1, RaceVarMap) orelse + compare_argtypes(VA2, WVA2) + end + end; + ?WARN_ETS_LOOKUP_INSERT -> + [VA1, VA2, VA3, VA4] = VarArgs, + [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs, + Bool = + case any_args(VA2) of + true -> compare_var_list(VA1, WVA1, RaceVarMap); + false -> + case any_args(WVA2) of + true -> compare_var_list(VA1, WVA1, RaceVarMap); + false -> + compare_var_list(VA1, WVA1, RaceVarMap) orelse + compare_argtypes(VA2, WVA2) + end + end, + Bool andalso + (case any_args(VA4) of + true -> + compare_var_list(VA3, WVA3, RaceVarMap); + false -> + case any_args(WVA4) of + true -> + compare_var_list(VA3, WVA3, RaceVarMap); + false -> + compare_var_list(VA3, WVA3, RaceVarMap) orelse + compare_argtypes(VA4, WVA4) + end + end); + ?WARN_MNESIA_DIRTY_READ_WRITE -> + [VA1, VA2|_] = VarArgs, %% Two or four elements + [WVA1, WVA2|_] = WarnVarArgs, + case any_args(VA2) of + true -> compare_var_list(VA1, WVA1, RaceVarMap); + false -> + case any_args(WVA2) of + true -> compare_var_list(VA1, WVA1, RaceVarMap); + false -> + compare_var_list(VA1, WVA1, RaceVarMap) orelse + compare_argtypes(VA2, WVA2) + end + end + end. + +compare_list_vars(VarList1, VarList2, NewVarList1, RaceVarMap) -> + case VarList1 of + [] -> + case NewVarList1 of + [] -> true; + _Other -> NewVarList1 + end; + [Head|Tail] -> + NewHead = + case compare_var_list(Head, VarList2, RaceVarMap) of + true -> []; + false -> [Head] + end, + compare_list_vars(Tail, VarList2, NewHead ++ NewVarList1, RaceVarMap) + end. + +compare_vars(Var1, Var2, RaceVarMap) when is_integer(Var1), is_integer(Var2) -> + Var1 =:= Var2 orelse + are_bound_labels(Var1, Var2, RaceVarMap) orelse + are_bound_labels(Var2, Var1, RaceVarMap); +compare_vars(_Var1, _Var2, _RaceVarMap) -> + false. + +-spec compare_var_list(label_type(), [label_type()], dict:dict()) -> boolean(). + +compare_var_list(Var, VarList, RaceVarMap) -> + lists:any(fun (V) -> compare_vars(Var, V, RaceVarMap) end, VarList). + +ets_list_args(MaybeList) -> + case is_list(MaybeList) of + true -> + try [ets_tuple_args(T) || T <- MaybeList] + catch _:_ -> [?no_label] + end; + false -> [ets_tuple_args(MaybeList)] + end. + +ets_list_argtypes(ListStr) -> + ListStr1 = string:strip(ListStr, left, $[), + ListStr2 = string:strip(ListStr1, right, $]), + ListStr3 = string:strip(ListStr2, right, $.), + string:strip(ListStr3, right, $,). + +ets_tuple_args(MaybeTuple) -> + case is_tuple(MaybeTuple) of + true -> element(1, MaybeTuple); + false -> ?no_label + end. + +ets_tuple_argtypes2(TupleList, ElemList) -> + case TupleList of + [] -> ElemList; + [H|T] -> + ets_tuple_argtypes2(T, + ets_tuple_argtypes2_helper(H, [], 0) ++ ElemList) + end. + +ets_tuple_argtypes2_helper(TupleStr, ElemStr, NestingLevel) -> + case TupleStr of + [] -> []; + [H|T] -> + {NewElemStr, NewNestingLevel, Return} = + case H of + ${ when NestingLevel =:= 0 -> + {ElemStr, NestingLevel + 1, false}; + ${ -> + {[H|ElemStr], NestingLevel + 1, false}; + $[ -> + {[H|ElemStr], NestingLevel + 1, false}; + $( -> + {[H|ElemStr], NestingLevel + 1, false}; + $} -> + {[H|ElemStr], NestingLevel - 1, false}; + $] -> + {[H|ElemStr], NestingLevel - 1, false}; + $) -> + {[H|ElemStr], NestingLevel - 1, false}; + $, when NestingLevel =:= 1 -> + {lists:reverse(ElemStr), NestingLevel, true}; + _Other -> + {[H|ElemStr], NestingLevel, false} + end, + case Return of + true -> string:tokens(NewElemStr, " |"); + false -> + ets_tuple_argtypes2_helper(T, NewElemStr, NewNestingLevel) + end + end. + +ets_tuple_argtypes1(Str, Tuple, TupleList, NestingLevel) -> + case Str of + [] -> TupleList; + [H|T] -> + {NewTuple, NewNestingLevel, Add} = + case H of + ${ -> + {[H|Tuple], NestingLevel + 1, false}; + $} -> + case NestingLevel of + 1 -> + {[H|Tuple], NestingLevel - 1, true}; + _Else -> + {[H|Tuple], NestingLevel - 1, false} + end; + _Other1 when NestingLevel =:= 0 -> + {Tuple, NestingLevel, false}; + _Other2 -> + {[H|Tuple], NestingLevel, false} + end, + case Add of + true -> + ets_tuple_argtypes1(T, [], + [lists:reverse(NewTuple)|TupleList], + NewNestingLevel); + false -> + ets_tuple_argtypes1(T, NewTuple, TupleList, NewNestingLevel) + end + end. + +format_arg(?bypassed) -> ?no_label; +format_arg(Arg0) -> + Arg = cerl:fold_literal(Arg0), + case cerl:type(Arg) of + var -> cerl_trees:get_label(Arg); + tuple -> list_to_tuple([format_arg(A) || A <- cerl:tuple_es(Arg)]); + cons -> [format_arg(cerl:cons_hd(Arg))|format_arg(cerl:cons_tl(Arg))]; + alias -> format_arg(cerl:alias_var(Arg)); + literal -> + case cerl:is_c_nil(Arg) of + true -> []; + false -> ?no_label + end; + _Other -> ?no_label + end. + +-spec format_args([core_vars()], [erl_types:erl_type()], + dialyzer_dataflow:state(), call()) -> + args(). + +format_args([], [], _State, _Call) -> + []; +format_args(ArgList, TypeList, CleanState, Call) -> + format_args_2(format_args_1(ArgList, TypeList, CleanState), Call). + +format_args_1([Arg], [Type], CleanState) -> + [format_arg(Arg), format_type(Type, CleanState)]; +format_args_1([Arg|Args], [Type|Types], CleanState) -> + List = + case Arg =:= ?bypassed of + true -> [?no_label, format_type(Type, CleanState)]; + false -> + case cerl:is_literal(cerl:fold_literal(Arg)) of + true -> [?no_label, format_cerl(Arg)]; + false -> [format_arg(Arg), format_type(Type, CleanState)] + end + end, + List ++ format_args_1(Args, Types, CleanState). + +format_args_2(StrArgList, Call) -> + case Call of + whereis -> + lists_key_replace(2, StrArgList, + string:tokens(lists:nth(2, StrArgList), " |")); + register -> + lists_key_replace(2, StrArgList, + string:tokens(lists:nth(2, StrArgList), " |")); + unregister -> + lists_key_replace(2, StrArgList, + string:tokens(lists:nth(2, StrArgList), " |")); + ets_new -> + StrArgList1 = lists_key_replace(2, StrArgList, + string:tokens(lists:nth(2, StrArgList), " |")), + lists_key_replace(4, StrArgList1, + string:tokens(ets_list_argtypes(lists:nth(4, StrArgList1)), " |")); + ets_lookup -> + StrArgList1 = lists_key_replace(2, StrArgList, + string:tokens(lists:nth(2, StrArgList), " |")), + lists_key_replace(4, StrArgList1, + string:tokens(lists:nth(4, StrArgList1), " |")); + ets_insert -> + StrArgList1 = lists_key_replace(2, StrArgList, + string:tokens(lists:nth(2, StrArgList), " |")), + lists_key_replace(4, StrArgList1, + ets_tuple_argtypes2( + ets_tuple_argtypes1(lists:nth(4, StrArgList1), [], [], 0), + [])); + mnesia_dirty_read1 -> + lists_key_replace(2, StrArgList, + [mnesia_tuple_argtypes(T) || T <- string:tokens( + lists:nth(2, StrArgList), " |")]); + mnesia_dirty_read2 -> + lists_key_replace(2, StrArgList, + string:tokens(lists:nth(2, StrArgList), " |")); + mnesia_dirty_write1 -> + lists_key_replace(2, StrArgList, + [mnesia_record_tab(R) || R <- string:tokens( + lists:nth(2, StrArgList), " |")]); + mnesia_dirty_write2 -> + lists_key_replace(2, StrArgList, + string:tokens(lists:nth(2, StrArgList), " |")); + function_call -> StrArgList + end. + +format_cerl(Tree) -> + cerl_prettypr:format(cerl:set_ann(Tree, []), + [{hook, dialyzer_utils:pp_hook()}, + {noann, true}, + {paper, 100000}, + {ribbon, 100000} + ]). + +format_type(Type, State) -> + R = dialyzer_dataflow:state__get_records(State), + erl_types:t_to_string(Type, R). + +mnesia_record_tab(RecordStr) -> + case string:str(RecordStr, "#") =:= 1 of + true -> + "'" ++ + string:sub_string(RecordStr, 2, string:str(RecordStr, "{") - 1) ++ + "'"; + false -> RecordStr + end. + +mnesia_tuple_argtypes(TupleStr) -> + TupleStr1 = string:strip(TupleStr, left, ${), + [TupleStr2|_T] = string:tokens(TupleStr1, " ,"), + lists:flatten(string:tokens(TupleStr2, " |")). + +-spec race_var_map(var_to_map1(), var_to_map2(), dict:dict(), op()) -> + dict:dict(). + +race_var_map(Vars1, Vars2, RaceVarMap, Op) -> + case Vars1 =:= ?no_arg orelse Vars1 =:= ?bypassed + orelse Vars2 =:= ?bypassed of + true -> RaceVarMap; + false -> + case is_list(Vars1) andalso is_list(Vars2) of + true -> + case Vars1 of + [] -> RaceVarMap; + [AHead|ATail] -> + case Vars2 of + [] -> RaceVarMap; + [PHead|PTail] -> + NewRaceVarMap = race_var_map(AHead, PHead, RaceVarMap, Op), + race_var_map(ATail, PTail, NewRaceVarMap, Op) + end + end; + false -> + {NewVars1, NewVars2, Bool} = + case is_list(Vars1) of + true -> + case Vars1 of + [Var1] -> {Var1, Vars2, true}; + _Thing -> {Vars1, Vars2, false} + end; + false -> + case is_list(Vars2) of + true -> + case Vars2 of + [Var2] -> {Vars1, Var2, true}; + _Thing -> {Vars1, Vars2, false} + end; + false -> {Vars1, Vars2, true} + end + end, + case Bool of + true -> + case cerl:type(NewVars1) of + var -> + case cerl:type(NewVars2) of + var -> + ALabel = cerl_trees:get_label(NewVars1), + PLabel = cerl_trees:get_label(NewVars2), + case Op of + bind -> + TempRaceVarMap = + bind_dict_vars(ALabel, PLabel, RaceVarMap), + bind_dict_vars(PLabel, ALabel, TempRaceVarMap); + unbind -> + TempRaceVarMap = + unbind_dict_vars(ALabel, PLabel, RaceVarMap), + unbind_dict_vars(PLabel, ALabel, TempRaceVarMap) + end; + alias -> + race_var_map(NewVars1, cerl:alias_var(NewVars2), + RaceVarMap, Op); + values -> + race_var_map(NewVars1, cerl:values_es(NewVars2), + RaceVarMap, Op); + _Other -> RaceVarMap + end; + tuple -> + case cerl:type(NewVars2) of + tuple -> + race_var_map(cerl:tuple_es(NewVars1), + cerl:tuple_es(NewVars2), RaceVarMap, Op); + alias -> + race_var_map(NewVars1, cerl:alias_var(NewVars2), + RaceVarMap, Op); + values -> + race_var_map(NewVars1, cerl:values_es(NewVars2), + RaceVarMap, Op); + _Other -> RaceVarMap + end; + cons -> + case cerl:type(NewVars2) of + cons -> + NewRaceVarMap = race_var_map(cerl:cons_hd(NewVars1), + cerl:cons_hd(NewVars2), RaceVarMap, Op), + race_var_map(cerl:cons_tl(NewVars1), + cerl:cons_tl(NewVars2), NewRaceVarMap, Op); + alias -> + race_var_map(NewVars1, cerl:alias_var(NewVars2), + RaceVarMap, Op); + values -> + race_var_map(NewVars1, cerl:values_es(NewVars2), + RaceVarMap, Op); + _Other -> RaceVarMap + end; + alias -> + case cerl:type(NewVars2) of + alias -> + race_var_map(cerl:alias_var(NewVars1), + cerl:alias_var(NewVars2), RaceVarMap, Op); + _Other -> + race_var_map(cerl:alias_var(NewVars1), + NewVars2, RaceVarMap, Op) + end; + values -> + case cerl:type(NewVars2) of + values -> + race_var_map(cerl:values_es(NewVars1), + cerl:values_es(NewVars2), RaceVarMap, Op); + _Other -> + race_var_map(cerl:values_es(NewVars1), + NewVars2, RaceVarMap, Op) + end; + _Other -> RaceVarMap + end; + false -> RaceVarMap + end + end + end. + +race_var_map_clauses(Clauses, RaceVarMap) -> + case Clauses of + [] -> RaceVarMap; + [#end_clause{arg = Arg, pats = Pats, guard = Guard}|T] -> + {RaceVarMap1, _RemoveClause} = + race_var_map_guard(Arg, Pats, Guard, RaceVarMap, bind), + race_var_map_clauses(T, RaceVarMap1) + end. + +race_var_map_guard(Arg, Pats, Guard, RaceVarMap, Op) -> + {NewRaceVarMap, RemoveClause} = + case cerl:type(Guard) of + call -> + CallName = cerl:call_name(Guard), + case cerl:is_literal(CallName) of + true -> + case cerl:concrete(CallName) of + '=:=' -> + [Arg1, Arg2] = cerl:call_args(Guard), + {race_var_map(Arg1, Arg2, RaceVarMap, Op), false}; + '==' -> + [Arg1, Arg2] = cerl:call_args(Guard), + {race_var_map(Arg1, Arg2, RaceVarMap, Op), false}; + '=/=' -> + case Op of + bind -> + [Arg1, Arg2] = cerl:call_args(Guard), + {RaceVarMap, are_bound_vars(Arg1, Arg2, RaceVarMap)}; + unbind -> {RaceVarMap, false} + end; + _Other -> {RaceVarMap, false} + end; + false -> {RaceVarMap, false} + end; + _Other -> {RaceVarMap, false} + end, + {RaceVarMap1, RemoveClause1} = + race_var_map_guard_helper1(Arg, Pats, + race_var_map(Arg, Pats, NewRaceVarMap, Op), Op), + {RaceVarMap1, RemoveClause orelse RemoveClause1}. + +race_var_map_guard_helper1(Arg, Pats, RaceVarMap, Op) -> + case Arg =:= ?no_arg orelse Arg =:= ?bypassed of + true -> {RaceVarMap, false}; + false -> + case cerl:type(Arg) of + call -> + case Pats of + [NewPat] -> + ModName = cerl:call_module(Arg), + CallName = cerl:call_name(Arg), + case cerl:is_literal(ModName) andalso + cerl:is_literal(CallName) of + true -> + case {cerl:concrete(ModName), + cerl:concrete(CallName)} of + {erlang, '=:='} -> + race_var_map_guard_helper2(Arg, NewPat, true, + RaceVarMap, Op); + {erlang, '=='} -> + race_var_map_guard_helper2(Arg, NewPat, true, + RaceVarMap, Op); + {erlang, '=/='} -> + race_var_map_guard_helper2(Arg, NewPat, false, + RaceVarMap, Op); + _Else -> {RaceVarMap, false} + end; + false -> {RaceVarMap, false} + end; + _Other -> {RaceVarMap, false} + end; + _Other -> {RaceVarMap, false} + end + end. + +race_var_map_guard_helper2(Arg, Pat0, Bool, RaceVarMap, Op) -> + Pat = cerl:fold_literal(Pat0), + case cerl:type(Pat) of + literal -> + [Arg1, Arg2] = cerl:call_args(Arg), + case cerl:concrete(Pat) of + Bool -> + {race_var_map(Arg1, Arg2, RaceVarMap, Op), false}; + _Else -> + case Op of + bind -> + {RaceVarMap, are_bound_vars(Arg1, Arg2, RaceVarMap)}; + unbind -> {RaceVarMap, false} + end + end; + _Else -> {RaceVarMap, false} + end. + +unbind_dict_vars(Var, Var, RaceVarMap) -> + RaceVarMap; +unbind_dict_vars(Var1, Var2, RaceVarMap) -> + case dict:find(Var1, RaceVarMap) of + error -> RaceVarMap; + {ok, Labels} -> + case Labels of + [] -> dict:erase(Var1, RaceVarMap); + _Else -> + case lists:member(Var2, Labels) of + true -> + unbind_dict_vars(Var1, Var2, + bind_dict_vars_list(Var1, Labels -- [Var2], + dict:erase(Var1, RaceVarMap))); + false -> + unbind_dict_vars_helper(Labels, Var1, Var2, RaceVarMap) + end + end + end. + +unbind_dict_vars_helper(Labels, Key, CompLabel, RaceVarMap) -> + case dict:size(RaceVarMap) of + 0 -> RaceVarMap; + _ -> + case Labels of + [] -> RaceVarMap; + [Head|Tail] -> + NewRaceVarMap = + case are_bound_labels(Head, CompLabel, RaceVarMap) orelse + are_bound_labels(CompLabel, Head, RaceVarMap) of + true -> + bind_dict_vars_list(Key, Labels -- [Head], + dict:erase(Key, RaceVarMap)); + false -> RaceVarMap + end, + unbind_dict_vars_helper(Tail, Key, CompLabel, NewRaceVarMap) + end + end. + +var_analysis(FunDefArgs, FunCallArgs, WarnVarArgs, RaceWarnTag) -> + case RaceWarnTag of + ?WARN_WHEREIS_REGISTER -> + [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs, + ArgNos = lists_key_members_lists(WVA1, FunDefArgs), + [[lists_get(N, FunCallArgs) || N <- ArgNos], WVA2, WVA3, WVA4]; + ?WARN_WHEREIS_UNREGISTER -> + [WVA1, WVA2] = WarnVarArgs, + ArgNos = lists_key_members_lists(WVA1, FunDefArgs), + [[lists_get(N, FunCallArgs) || N <- ArgNos], WVA2]; + ?WARN_ETS_LOOKUP_INSERT -> + [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs, + ArgNos1 = lists_key_members_lists(WVA1, FunDefArgs), + ArgNos2 = lists_key_members_lists(WVA3, FunDefArgs), + [[lists_get(N1, FunCallArgs) || N1 <- ArgNos1], WVA2, + [lists_get(N2, FunCallArgs) || N2 <- ArgNos2], WVA4]; + ?WARN_MNESIA_DIRTY_READ_WRITE -> + [WVA1, WVA2|T] = WarnVarArgs, + ArgNos = lists_key_members_lists(WVA1, FunDefArgs), + [[lists_get(N, FunCallArgs) || N <- ArgNos], WVA2|T] + end. + +var_type_analysis(FunDefArgs, FunCallTypes, WarnVarArgs, RaceWarnTag, + RaceVarMap, CleanState) -> + FunVarArgs = format_args(FunDefArgs, FunCallTypes, CleanState, function_call), + case RaceWarnTag of + ?WARN_WHEREIS_REGISTER -> + [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs, + Vars = find_all_bound_vars(WVA1, RaceVarMap), + case lists_key_member_lists(Vars, FunVarArgs) of + 0 -> [Vars, WVA2, WVA3, WVA4]; + N when is_integer(N) -> + NewWVA2 = string:tokens(lists:nth(N + 1, FunVarArgs), " |"), + [Vars, NewWVA2, WVA3, WVA4] + end; + ?WARN_WHEREIS_UNREGISTER -> + [WVA1, WVA2] = WarnVarArgs, + Vars = find_all_bound_vars(WVA1, RaceVarMap), + case lists_key_member_lists(Vars, FunVarArgs) of + 0 -> [Vars, WVA2]; + N when is_integer(N) -> + NewWVA2 = string:tokens(lists:nth(N + 1, FunVarArgs), " |"), + [Vars, NewWVA2] + end; + ?WARN_ETS_LOOKUP_INSERT -> + [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs, + Vars1 = find_all_bound_vars(WVA1, RaceVarMap), + FirstVarArg = + case lists_key_member_lists(Vars1, FunVarArgs) of + 0 -> [Vars1, WVA2]; + N1 when is_integer(N1) -> + NewWVA2 = string:tokens(lists:nth(N1 + 1, FunVarArgs), " |"), + [Vars1, NewWVA2] + end, + Vars2 = + lists:flatten( + [find_all_bound_vars(A, RaceVarMap) || A <- ets_list_args(WVA3)]), + case lists_key_member_lists(Vars2, FunVarArgs) of + 0 -> FirstVarArg ++ [Vars2, WVA4]; + N2 when is_integer(N2) -> + NewWVA4 = + ets_tuple_argtypes2( + ets_tuple_argtypes1(lists:nth(N2 + 1, FunVarArgs), [], [], 0), + []), + FirstVarArg ++ [Vars2, NewWVA4] + + end; + ?WARN_MNESIA_DIRTY_READ_WRITE -> + [WVA1, WVA2|T] = WarnVarArgs, + Arity = + case T of + [] -> 1; + _Else -> 2 + end, + Vars = find_all_bound_vars(WVA1, RaceVarMap), + case lists_key_member_lists(Vars, FunVarArgs) of + 0 -> [Vars, WVA2|T]; + N when is_integer(N) -> + NewWVA2 = + case Arity of + 1 -> + [mnesia_record_tab(R) || R <- string:tokens( + lists:nth(2, FunVarArgs), " |")]; + 2 -> + string:tokens(lists:nth(N + 1, FunVarArgs), " |") + end, + [Vars, NewWVA2|T] + end + end. + +%%% =========================================================================== +%%% +%%% Warning Format Utilities +%%% +%%% =========================================================================== + +add_race_warning(Warn, #races{race_warnings = Warns} = Races) -> + Races#races{race_warnings = [Warn|Warns]}. + +get_race_warn(Fun, Args, ArgTypes, DepList, State) -> + {M, F, _A} = Fun, + case DepList of + [] -> {State, no_race}; + _Other -> + {State, {race_condition, [M, F, Args, ArgTypes, State, DepList]}} + end. + +-spec get_race_warnings(races(), dialyzer_dataflow:state()) -> + {races(), dialyzer_dataflow:state()}. + +get_race_warnings(#races{race_warnings = RaceWarnings}, State) -> + get_race_warnings_helper(RaceWarnings, State). + +get_race_warnings_helper(Warnings, State) -> + case Warnings of + [] -> + {dialyzer_dataflow:state__get_races(State), State}; + [H|T] -> + {RaceWarnTag, WarningInfo, {race_condition, [M, F, A, AT, S, DepList]}} = H, + Reason = + case RaceWarnTag of + ?WARN_WHEREIS_REGISTER -> + get_reason(lists:keysort(7, DepList), + "might fail due to a possible race condition " + "caused by its combination with "); + ?WARN_WHEREIS_UNREGISTER -> + get_reason(lists:keysort(7, DepList), + "might fail due to a possible race condition " + "caused by its combination with "); + ?WARN_ETS_LOOKUP_INSERT -> + get_reason(lists:keysort(7, DepList), + "might have an unintended effect due to " ++ + "a possible race condition " ++ + "caused by its combination with "); + ?WARN_MNESIA_DIRTY_READ_WRITE -> + get_reason(lists:keysort(7, DepList), + "might have an unintended effect due to " ++ + "a possible race condition " ++ + "caused by its combination with ") + end, + W = + {?WARN_RACE_CONDITION, WarningInfo, + {race_condition, + [M, F, dialyzer_dataflow:format_args(A, AT, S), Reason]}}, + get_race_warnings_helper(T, + dialyzer_dataflow:state__add_warning(W, State)) + end. + +get_reason(DependencyList, Reason) -> + case DependencyList of + [] -> ""; + [#dep_call{call_name = Call, arg_types = ArgTypes, vars = Args, + state = State, file_line = {File, Line}}|T] -> + R = + Reason ++ + case Call of + whereis -> "the erlang:whereis"; + ets_lookup -> "the ets:lookup"; + mnesia_dirty_read -> "the mnesia:dirty_read" + end ++ + dialyzer_dataflow:format_args(Args, ArgTypes, State) ++ + " call in " ++ + filename:basename(File) ++ + " on line " ++ + lists:flatten(io_lib:write(Line)), + case T of + [] -> R; + _ -> get_reason(T, R ++ ", ") + end + end. + +state__add_race_warning(State, RaceWarn, RaceWarnTag, WarningInfo) -> + case RaceWarn of + no_race -> State; + _Else -> + Races = dialyzer_dataflow:state__get_races(State), + Warn = {RaceWarnTag, WarningInfo, RaceWarn}, + dialyzer_dataflow:state__put_races(add_race_warning(Warn, Races), State) + end. + +%%% =========================================================================== +%%% +%%% Record Interfaces +%%% +%%% =========================================================================== + +-spec beg_clause_new(var_to_map1(), var_to_map1(), cerl:cerl()) -> + #beg_clause{}. + +beg_clause_new(Arg, Pats, Guard) -> + #beg_clause{arg = Arg, pats = Pats, guard = Guard}. + +-spec cleanup(races()) -> races(). + +cleanup(#races{race_list = RaceList}) -> + #races{race_list = RaceList}. + +-spec end_case_new([#end_clause{}]) -> #end_case{}. + +end_case_new(Clauses) -> + #end_case{clauses = Clauses}. + +-spec end_clause_new(var_to_map1(), var_to_map1(), cerl:cerl()) -> + #end_clause{}. + +end_clause_new(Arg, Pats, Guard) -> + #end_clause{arg = Arg, pats = Pats, guard = Guard}. + +-spec get_curr_fun(races()) -> dialyzer_callgraph:mfa_or_funlbl(). + +get_curr_fun(#races{curr_fun = CurrFun}) -> + CurrFun. + +-spec get_curr_fun_args(races()) -> core_args(). + +get_curr_fun_args(#races{curr_fun_args = CurrFunArgs}) -> + CurrFunArgs. + +-spec get_new_table(races()) -> table(). + +get_new_table(#races{new_table = Table}) -> + Table. + +-spec get_race_analysis(races()) -> boolean(). + +get_race_analysis(#races{race_analysis = RaceAnalysis}) -> + RaceAnalysis. + +-spec get_race_list(races()) -> code(). + +get_race_list(#races{race_list = RaceList}) -> + RaceList. + +-spec get_race_list_size(races()) -> non_neg_integer(). + +get_race_list_size(#races{race_list_size = RaceListSize}) -> + RaceListSize. + +-spec get_race_list_and_size(races()) -> {code(), non_neg_integer()}. + +get_race_list_and_size(#races{race_list = RaceList, + race_list_size = RaceListSize}) -> + {RaceList, RaceListSize}. + +-spec let_tag_new(var_to_map1(), var_to_map1()) -> #let_tag{}. + +let_tag_new(Var, Arg) -> + #let_tag{var = Var, arg = Arg}. + +-spec new() -> races(). + +new() -> #races{}. + +-spec put_curr_fun(dialyzer_callgraph:mfa_or_funlbl(), label(), races()) -> + races(). + +put_curr_fun(CurrFun, CurrFunLabel, Races) -> + Races#races{curr_fun = CurrFun, + curr_fun_label = CurrFunLabel, + curr_fun_args = empty}. + +-spec put_fun_args(core_args(), races()) -> races(). + +put_fun_args(Args, #races{curr_fun_args = CurrFunArgs} = Races) -> + case CurrFunArgs of + empty -> Races#races{curr_fun_args = Args}; + _Other -> Races + end. + +-spec put_race_analysis(boolean(), races()) -> + races(). + +put_race_analysis(Analysis, Races) -> + Races#races{race_analysis = Analysis}. + +-spec put_race_list(code(), non_neg_integer(), races()) -> + races(). + +put_race_list(RaceList, RaceListSize, Races) -> + Races#races{race_list = RaceList, race_list_size = RaceListSize}. diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/recrec/erl_types.erl b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/erl_types.erl new file mode 100644 index 0000000000..449bf4cbb6 --- /dev/null +++ b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/erl_types.erl @@ -0,0 +1,5741 @@ +%% -*- erlang-indent-level: 2 -*- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% ====================================================================== +%% Copyright (C) 2000-2003 Richard Carlsson +%% +%% ====================================================================== +%% Provides a representation of Erlang types. +%% +%% The initial author of this file is Richard Carlsson (2000-2004). +%% In July 2006, the type representation was totally re-designed by +%% Tobias Lindahl. This is the representation which is used currently. +%% In late 2008, Manouk Manoukian and Kostis Sagonas added support for +%% opaque types to the structure-based representation of types. +%% During February and March 2009, Kostis Sagonas significantly +%% cleaned up the type representation and added spec declarations. +%% +%% ====================================================================== + +-module(erl_types). + +-export([any_none/1, + any_none_or_unit/1, + lookup_record/3, + max/2, + min/2, + number_max/1, number_max/2, + number_min/1, number_min/2, + t_abstract_records/2, + t_any/0, + t_arity/0, + t_atom/0, + t_atom/1, + t_atoms/1, + t_atom_vals/1, t_atom_vals/2, + t_binary/0, + t_bitstr/0, + t_bitstr/2, + t_bitstr_base/1, + t_bitstr_concat/1, + t_bitstr_concat/2, + t_bitstr_match/2, + t_bitstr_unit/1, + t_bitstrlist/0, + t_boolean/0, + t_byte/0, + t_char/0, + t_collect_vars/1, + t_cons/0, + t_cons/2, + t_cons_hd/1, t_cons_hd/2, + t_cons_tl/1, t_cons_tl/2, + t_contains_opaque/1, t_contains_opaque/2, + t_decorate_with_opaque/3, + t_elements/1, + t_find_opaque_mismatch/3, + t_find_unknown_opaque/3, + t_fixnum/0, + t_map/2, + t_non_neg_fixnum/0, + t_pos_fixnum/0, + t_float/0, + t_var_names/1, + t_form_to_string/1, + t_from_form/6, + t_from_form_without_remote/3, + t_check_record_fields/6, + t_from_range/2, + t_from_range_unsafe/2, + t_from_term/1, + t_fun/0, + t_fun/1, + t_fun/2, + t_fun_args/1, t_fun_args/2, + t_fun_arity/1, t_fun_arity/2, + t_fun_range/1, t_fun_range/2, + t_has_opaque_subtype/2, + t_has_var/1, + t_identifier/0, + %% t_improper_list/2, + t_inf/1, + t_inf/2, + t_inf/3, + t_inf_lists/2, + t_inf_lists/3, + t_integer/0, + t_integer/1, + t_non_neg_integer/0, + t_pos_integer/0, + t_integers/1, + t_iodata/0, + t_iolist/0, + t_is_any/1, + t_is_atom/1, t_is_atom/2, + t_is_any_atom/2, t_is_any_atom/3, + t_is_binary/1, t_is_binary/2, + t_is_bitstr/1, t_is_bitstr/2, + t_is_bitwidth/1, + t_is_boolean/1, t_is_boolean/2, + %% t_is_byte/1, + %% t_is_char/1, + t_is_cons/1, t_is_cons/2, + t_is_equal/2, + t_is_fixnum/1, + t_is_float/1, t_is_float/2, + t_is_fun/1, t_is_fun/2, + t_is_instance/2, + t_is_integer/1, t_is_integer/2, + t_is_list/1, + t_is_map/1, + t_is_map/2, + t_is_matchstate/1, + t_is_nil/1, t_is_nil/2, + t_is_non_neg_integer/1, + t_is_none/1, + t_is_none_or_unit/1, + t_is_number/1, t_is_number/2, + t_is_opaque/1, t_is_opaque/2, + t_is_pid/1, t_is_pid/2, + t_is_port/1, t_is_port/2, + t_is_maybe_improper_list/1, t_is_maybe_improper_list/2, + t_is_reference/1, t_is_reference/2, + t_is_singleton/1, + t_is_singleton/2, + t_is_string/1, + t_is_subtype/2, + t_is_tuple/1, t_is_tuple/2, + t_is_unit/1, + t_is_var/1, + t_limit/2, + t_list/0, + t_list/1, + t_list_elements/1, t_list_elements/2, + t_list_termination/1, t_list_termination/2, + t_map/0, + t_map/1, + t_map/3, + t_map_entries/2, t_map_entries/1, + t_map_def_key/2, t_map_def_key/1, + t_map_def_val/2, t_map_def_val/1, + t_map_get/2, t_map_get/3, + t_map_is_key/2, t_map_is_key/3, + t_map_update/2, t_map_update/3, + t_map_put/2, t_map_put/3, + t_matchstate/0, + t_matchstate/2, + t_matchstate_present/1, + t_matchstate_slot/2, + t_matchstate_slots/1, + t_matchstate_update_present/2, + t_matchstate_update_slot/3, + t_mfa/0, + t_module/0, + t_nil/0, + t_node/0, + t_none/0, + t_nonempty_list/0, + t_nonempty_list/1, + t_nonempty_string/0, + t_number/0, + t_number/1, + t_number_vals/1, t_number_vals/2, + t_opaque_from_records/1, + t_opaque_structure/1, + t_pid/0, + t_port/0, + t_maybe_improper_list/0, + %% t_maybe_improper_list/2, + t_product/1, + t_reference/0, + t_singleton_to_term/2, + t_string/0, + t_struct_from_opaque/2, + t_subst/2, + t_subtract/2, + t_subtract_list/2, + t_sup/1, + t_sup/2, + t_timeout/0, + t_to_string/1, + t_to_string/2, + t_to_tlist/1, + t_tuple/0, + t_tuple/1, + t_tuple_args/1, t_tuple_args/2, + t_tuple_size/1, t_tuple_size/2, + t_tuple_sizes/1, + t_tuple_subtypes/1, + t_tuple_subtypes/2, + t_unify/2, + t_unit/0, + t_unopaque/1, t_unopaque/2, + t_var/1, + t_var_name/1, + %% t_assign_variables_to_subtype/2, + type_is_defined/4, + record_field_diffs_to_string/2, + subst_all_vars_to_any/1, + lift_list_to_pos_empty/1, lift_list_to_pos_empty/2, + is_opaque_type/2, + is_erl_type/1, + atom_to_string/1, + var_table__new/0, + cache__new/0, + map_pairwise_merge/3 + ]). + +%%-define(DO_ERL_TYPES_TEST, true). +-compile({no_auto_import,[min/2,max/2]}). + +-ifdef(DO_ERL_TYPES_TEST). +-export([test/0]). +-else. +-define(NO_UNUSED, true). +-endif. + +-ifndef(NO_UNUSED). +-export([t_is_identifier/1]). +-endif. + +-export_type([erl_type/0, opaques/0, type_table/0, var_table/0, cache/0]). + +%%-define(DEBUG, true). + +-ifdef(DEBUG). +-define(debug(__A), __A). +-else. +-define(debug(__A), ok). +-endif. + +%%============================================================================= +%% +%% Definition of the type structure +%% +%%============================================================================= + +%%----------------------------------------------------------------------------- +%% Limits +%% + +-define(REC_TYPE_LIMIT, 2). +-define(EXPAND_DEPTH, 16). +-define(EXPAND_LIMIT, 10000). + +-define(TUPLE_TAG_LIMIT, 5). +-define(TUPLE_ARITY_LIMIT, 8). +-define(SET_LIMIT, 13). +-define(MAX_BYTE, 255). +-define(MAX_CHAR, 16#10ffff). + +-define(UNIT_MULTIPLIER, 8). + +-define(TAG_IMMED1_SIZE, 4). +-define(BITS, (erlang:system_info(wordsize) * 8) - ?TAG_IMMED1_SIZE). + +-define(MAX_TUPLE_SIZE, (1 bsl 10)). + +%%----------------------------------------------------------------------------- +%% Type tags and qualifiers +%% + +-define(atom_tag, atom). +-define(binary_tag, binary). +-define(function_tag, function). +-define(identifier_tag, identifier). +-define(list_tag, list). +-define(map_tag, map). +-define(matchstate_tag, matchstate). +-define(nil_tag, nil). +-define(number_tag, number). +-define(opaque_tag, opaque). +-define(product_tag, product). +-define(tuple_set_tag, tuple_set). +-define(tuple_tag, tuple). +-define(union_tag, union). +-define(var_tag, var). + +-type tag() :: ?atom_tag | ?binary_tag | ?function_tag | ?identifier_tag + | ?list_tag | ?map_tag | ?matchstate_tag | ?nil_tag | ?number_tag + | ?opaque_tag | ?product_tag + | ?tuple_tag | ?tuple_set_tag | ?union_tag | ?var_tag. + +-define(float_qual, float). +-define(integer_qual, integer). +-define(nonempty_qual, nonempty). +-define(pid_qual, pid). +-define(port_qual, port). +-define(reference_qual, reference). +-define(unknown_qual, unknown). + +-type qual() :: ?float_qual | ?integer_qual | ?nonempty_qual | ?pid_qual + | ?port_qual | ?reference_qual | ?unknown_qual | {_, _}. + +%%----------------------------------------------------------------------------- +%% The type representation +%% + +-define(any, any). +-define(none, none). +-define(unit, unit). +%% Generic constructor - elements can be many things depending on the tag. +-record(c, {tag :: tag(), + elements = [] :: term(), + qualifier = ?unknown_qual :: qual()}). + +-opaque erl_type() :: ?any | ?none | ?unit | #c{}. + +%%----------------------------------------------------------------------------- +%% Auxiliary types and convenient macros +%% + +-type parse_form() :: erl_parse:abstract_type(). +-type rng_elem() :: 'pos_inf' | 'neg_inf' | integer(). + +-record(int_set, {set :: [integer()]}). +-record(int_rng, {from :: rng_elem(), to :: rng_elem()}). +%% Note: the definition of #opaque{} was changed to 'mod' and 'name'; +%% it used to be an ordsets of {Mod, Name} pairs. The Dialyzer version +%% was updated to 2.7 due to this change. +-record(opaque, {mod :: module(), name :: atom(), + args = [] :: [erl_type()], struct :: erl_type()}). + +-define(atom(Set), #c{tag=?atom_tag, elements=Set}). +-define(bitstr(Unit, Base), #c{tag=?binary_tag, elements=[Unit,Base]}). +-define(float, ?number(?any, ?float_qual)). +-define(function(Domain, Range), #c{tag=?function_tag, + elements=[Domain, Range]}). +-define(identifier(Types), #c{tag=?identifier_tag, elements=Types}). +-define(integer(Types), ?number(Types, ?integer_qual)). +-define(int_range(From, To), ?integer(#int_rng{from=From, to=To})). +-define(int_set(Set), ?integer(#int_set{set=Set})). +-define(list(Types, Term, Size), #c{tag=?list_tag, elements=[Types,Term], + qualifier=Size}). +-define(nil, #c{tag=?nil_tag}). +-define(nonempty_list(Types, Term),?list(Types, Term, ?nonempty_qual)). +-define(number(Set, Qualifier), #c{tag=?number_tag, elements=Set, + qualifier=Qualifier}). +-define(map(Pairs,DefKey,DefVal), + #c{tag=?map_tag, elements={Pairs,DefKey,DefVal}}). +-define(opaque(Optypes), #c{tag=?opaque_tag, elements=Optypes}). +-define(product(Types), #c{tag=?product_tag, elements=Types}). +-define(tuple(Types, Arity, Qual), #c{tag=?tuple_tag, elements=Types, + qualifier={Arity, Qual}}). +-define(tuple_set(Tuples), #c{tag=?tuple_set_tag, elements=Tuples}). +-define(var(Id), #c{tag=?var_tag, elements=Id}). + +-define(matchstate(P, Slots), #c{tag=?matchstate_tag, elements=[P,Slots]}). +-define(any_matchstate, ?matchstate(t_bitstr(), ?any)). + +-define(byte, ?int_range(0, ?MAX_BYTE)). +-define(char, ?int_range(0, ?MAX_CHAR)). +-define(integer_pos, ?int_range(1, pos_inf)). +-define(integer_non_neg, ?int_range(0, pos_inf)). +-define(integer_neg, ?int_range(neg_inf, -1)). + +-type opaques() :: [erl_type()] | 'universe'. + +-type record_key() :: {'record', atom()}. +-type type_key() :: {'type' | 'opaque', mfa()}. +-type record_value() :: [{atom(), erl_parse:abstract_expr(), erl_type()}]. +-type type_value() :: {{module(), {file:name(), erl_anno:line()}, + erl_parse:abstract_type(), ArgNames :: [atom()]}, + erl_type()}. +-type type_table() :: dict:dict(record_key() | type_key(), + record_value() | type_value()). + +-opaque var_table() :: #{atom() => erl_type()}. + +%%----------------------------------------------------------------------------- +%% Unions +%% + +-define(union(List), #c{tag=?union_tag, elements=[_,_,_,_,_,_,_,_,_,_]=List}). + +-define(atom_union(T), ?union([T,?none,?none,?none,?none,?none,?none,?none,?none,?none])). +-define(bitstr_union(T), ?union([?none,T,?none,?none,?none,?none,?none,?none,?none,?none])). +-define(function_union(T), ?union([?none,?none,T,?none,?none,?none,?none,?none,?none,?none])). +-define(identifier_union(T), ?union([?none,?none,?none,T,?none,?none,?none,?none,?none,?none])). +-define(list_union(T), ?union([?none,?none,?none,?none,T,?none,?none,?none,?none,?none])). +-define(number_union(T), ?union([?none,?none,?none,?none,?none,T,?none,?none,?none,?none])). +-define(tuple_union(T), ?union([?none,?none,?none,?none,?none,?none,T,?none,?none,?none])). +-define(matchstate_union(T), ?union([?none,?none,?none,?none,?none,?none,?none,T,?none,?none])). +-define(opaque_union(T), ?union([?none,?none,?none,?none,?none,?none,?none,?none,T,?none])). +-define(map_union(T), ?union([?none,?none,?none,?none,?none,?none,?none,?none,?none,T])). +-define(integer_union(T), ?number_union(T)). +-define(float_union(T), ?number_union(T)). +-define(nil_union(T), ?list_union(T)). + + +%%============================================================================= +%% +%% Primitive operations such as type construction and type tests +%% +%%============================================================================= + +%%----------------------------------------------------------------------------- +%% Top and bottom +%% + +-spec t_any() -> erl_type(). + +t_any() -> + ?any. + +-spec t_is_any(erl_type()) -> boolean(). + +t_is_any(Type) -> + do_opaque(Type, 'universe', fun is_any/1). + +is_any(?any) -> true; +is_any(_) -> false. + +-spec t_none() -> erl_type(). + +t_none() -> + ?none. + +-spec t_is_none(erl_type()) -> boolean(). + +t_is_none(?none) -> true; +t_is_none(_) -> false. + +%%----------------------------------------------------------------------------- +%% Opaque types +%% + +-spec t_opaque(module(), atom(), [_], erl_type()) -> erl_type(). + +t_opaque(Mod, Name, Args, Struct) -> + O = #opaque{mod = Mod, name = Name, args = Args, struct = Struct}, + ?opaque(set_singleton(O)). + +-spec t_is_opaque(erl_type(), [erl_type()]) -> boolean(). + +t_is_opaque(?opaque(_) = Type, Opaques) -> + not is_opaque_type(Type, Opaques); +t_is_opaque(_Type, _Opaques) -> false. + +-spec t_is_opaque(erl_type()) -> boolean(). + +t_is_opaque(?opaque(_)) -> true; +t_is_opaque(_) -> false. + +-spec t_has_opaque_subtype(erl_type(), opaques()) -> boolean(). + +t_has_opaque_subtype(Type, Opaques) -> + do_opaque(Type, Opaques, fun has_opaque_subtype/1). + +has_opaque_subtype(?union(Ts)) -> + lists:any(fun t_is_opaque/1, Ts); +has_opaque_subtype(T) -> + t_is_opaque(T). + +-spec t_opaque_structure(erl_type()) -> erl_type(). + +t_opaque_structure(?opaque(Elements)) -> + t_sup([Struct || #opaque{struct = Struct} <- ordsets:to_list(Elements)]). + +-spec t_contains_opaque(erl_type()) -> boolean(). + +t_contains_opaque(Type) -> + t_contains_opaque(Type, []). + +%% Returns 'true' iff there is an opaque type that is *not* one of +%% the types of the second argument. + +-spec t_contains_opaque(erl_type(), [erl_type()]) -> boolean(). + +t_contains_opaque(?any, _Opaques) -> false; +t_contains_opaque(?none, _Opaques) -> false; +t_contains_opaque(?unit, _Opaques) -> false; +t_contains_opaque(?atom(_Set), _Opaques) -> false; +t_contains_opaque(?bitstr(_Unit, _Base), _Opaques) -> false; +t_contains_opaque(?float, _Opaques) -> false; +t_contains_opaque(?function(Domain, Range), Opaques) -> + t_contains_opaque(Domain, Opaques) + orelse t_contains_opaque(Range, Opaques); +t_contains_opaque(?identifier(_Types), _Opaques) -> false; +t_contains_opaque(?integer(_Types), _Opaques) -> false; +t_contains_opaque(?int_range(_From, _To), _Opaques) -> false; +t_contains_opaque(?int_set(_Set), _Opaques) -> false; +t_contains_opaque(?list(Type, Tail, _), Opaques) -> + t_contains_opaque(Type, Opaques) orelse t_contains_opaque(Tail, Opaques); +t_contains_opaque(?map(_, _, _) = Map, Opaques) -> + list_contains_opaque(map_all_types(Map), Opaques); +t_contains_opaque(?matchstate(_P, _Slots), _Opaques) -> false; +t_contains_opaque(?nil, _Opaques) -> false; +t_contains_opaque(?number(_Set, _Tag), _Opaques) -> false; +t_contains_opaque(?opaque(_)=T, Opaques) -> + not is_opaque_type(T, Opaques) + orelse t_contains_opaque(t_opaque_structure(T)); +t_contains_opaque(?product(Types), Opaques) -> + list_contains_opaque(Types, Opaques); +t_contains_opaque(?tuple(?any, _, _), _Opaques) -> false; +t_contains_opaque(?tuple(Types, _, _), Opaques) -> + list_contains_opaque(Types, Opaques); +t_contains_opaque(?tuple_set(_Set) = T, Opaques) -> + list_contains_opaque(t_tuple_subtypes(T), Opaques); +t_contains_opaque(?union(List), Opaques) -> + list_contains_opaque(List, Opaques); +t_contains_opaque(?var(_Id), _Opaques) -> false. + +-spec list_contains_opaque([erl_type()], [erl_type()]) -> boolean(). + +list_contains_opaque(List, Opaques) -> + lists:any(fun(E) -> t_contains_opaque(E, Opaques) end, List). + +%% t_find_opaque_mismatch/2 of two types should only be used if their +%% t_inf is t_none() due to some opaque type violation. +%% +%% The first argument of the function is the pattern and its second +%% argument the type we are matching against the pattern. + +-spec t_find_opaque_mismatch(erl_type(), erl_type(), [erl_type()]) -> + 'error' | {'ok', erl_type(), erl_type()}. + +t_find_opaque_mismatch(T1, T2, Opaques) -> + t_find_opaque_mismatch(T1, T2, T2, Opaques). + +t_find_opaque_mismatch(?any, _Type, _TopType, _Opaques) -> error; +t_find_opaque_mismatch(?none, _Type, _TopType, _Opaques) -> error; +t_find_opaque_mismatch(?list(T1, Tl1, _), ?list(T2, Tl2, _), TopType, Opaques) -> + t_find_opaque_mismatch_ordlists([T1, Tl1], [T2, Tl2], TopType, Opaques); +t_find_opaque_mismatch(T1, ?opaque(_) = T2, TopType, Opaques) -> + case is_opaque_type(T2, Opaques) of + false -> {ok, TopType, T2}; + true -> + t_find_opaque_mismatch(T1, t_opaque_structure(T2), TopType, Opaques) + end; +t_find_opaque_mismatch(?opaque(_) = T1, T2, TopType, Opaques) -> + %% The generated message is somewhat misleading: + case is_opaque_type(T1, Opaques) of + false -> {ok, TopType, T1}; + true -> + t_find_opaque_mismatch(t_opaque_structure(T1), T2, TopType, Opaques) + end; +t_find_opaque_mismatch(?product(T1), ?product(T2), TopType, Opaques) -> + t_find_opaque_mismatch_ordlists(T1, T2, TopType, Opaques); +t_find_opaque_mismatch(?tuple(T1, Arity, _), ?tuple(T2, Arity, _), + TopType, Opaques) -> + t_find_opaque_mismatch_ordlists(T1, T2, TopType, Opaques); +t_find_opaque_mismatch(?tuple(_, _, _) = T1, ?tuple_set(_) = T2, + TopType, Opaques) -> + Tuples1 = t_tuple_subtypes(T1), + Tuples2 = t_tuple_subtypes(T2), + t_find_opaque_mismatch_lists(Tuples1, Tuples2, TopType, Opaques); +t_find_opaque_mismatch(T1, ?union(U2), TopType, Opaques) -> + t_find_opaque_mismatch_lists([T1], U2, TopType, Opaques); +t_find_opaque_mismatch(_T1, _T2, _TopType, _Opaques) -> error. + +t_find_opaque_mismatch_ordlists(L1, L2, TopType, Opaques) -> + List = lists:zipwith(fun(T1, T2) -> + t_find_opaque_mismatch(T1, T2, TopType, Opaques) + end, L1, L2), + t_find_opaque_mismatch_list(List). + +t_find_opaque_mismatch_lists(L1, L2, _TopType, Opaques) -> + List = [t_find_opaque_mismatch(T1, T2, T2, Opaques) || T1 <- L1, T2 <- L2], + t_find_opaque_mismatch_list(List). + +t_find_opaque_mismatch_list([]) -> error; +t_find_opaque_mismatch_list([H|T]) -> + case H of + {ok, _T1, _T2} -> H; + error -> t_find_opaque_mismatch_list(T) + end. + +-spec t_find_unknown_opaque(erl_type(), erl_type(), opaques()) -> + [pos_integer()]. + +%% The nice thing about using two types and t_inf() as compared to +%% calling t_contains_opaque/2 is that the traversal stops when +%% there is a mismatch which means that unknown opaque types "below" +%% the mismatch are not found. +t_find_unknown_opaque(_T1, _T2, 'universe') -> []; +t_find_unknown_opaque(T1, T2, Opaques) -> + try t_inf(T1, T2, {match, Opaques}) of + _ -> [] + catch throw:{pos, Ns} -> Ns + end. + +-spec t_decorate_with_opaque(erl_type(), erl_type(), [erl_type()]) -> erl_type(). + +%% The first argument can contain opaque types. The second argument +%% is assumed to be taken from the contract. + +t_decorate_with_opaque(T1, T2, Opaques) -> + case t_is_equal(T1, T2) orelse not t_contains_opaque(T2) of + true -> T1; + false -> + T = t_inf(T1, T2), + case t_contains_opaque(T) of + false -> T1; + true -> + R = decorate(T1, T, Opaques), + ?debug(case catch t_is_equal(t_unopaque(R), t_unopaque(T1)) of + true -> ok; + false -> + io:format("T1 = ~p,\n", [T1]), + io:format("T2 = ~p,\n", [T2]), + io:format("O = ~p,\n", [Opaques]), + io:format("erl_types:t_decorate_with_opaque(T1,T2,O).\n"), + throw({error, "Failed to handle opaque types"}) + end), + R + end + end. + +decorate(Type, ?none, _Opaques) -> Type; +decorate(?function(Domain, Range), ?function(D, R), Opaques) -> + ?function(decorate(Domain, D, Opaques), decorate(Range, R, Opaques)); +decorate(?list(Types, Tail, Size), ?list(Ts, Tl, _Sz), Opaques) -> + ?list(decorate(Types, Ts, Opaques), decorate(Tail, Tl, Opaques), Size); +decorate(?product(Types), ?product(Ts), Opaques) -> + ?product(list_decorate(Types, Ts, Opaques)); +decorate(?tuple(_, _, _)=T, ?tuple(?any, _, _), _Opaques) -> T; +decorate(?tuple(?any, _, _)=T, ?tuple(_, _, _), _Opaques) -> T; +decorate(?tuple(Types, Arity, Tag), ?tuple(Ts, Arity, _), Opaques) -> + ?tuple(list_decorate(Types, Ts, Opaques), Arity, Tag); +decorate(?tuple_set(List), ?tuple(_, Arity, _) = T, Opaques) -> + decorate_tuple_sets(List, [{Arity, [T]}], Opaques); +decorate(?tuple_set(List), ?tuple_set(L), Opaques) -> + decorate_tuple_sets(List, L, Opaques); +decorate(?union(List), T, Opaques) when T =/= ?any -> + ?union(L) = force_union(T), + union_decorate(List, L, Opaques); +decorate(?opaque(_)=T, _, _Opaques) -> T; +decorate(T, ?union(L), Opaques) when T =/= ?any -> + ?union(List) = force_union(T), + union_decorate(List, L, Opaques); +decorate(Type, ?opaque(_)=T, Opaques) -> + decorate_with_opaque(Type, T, Opaques); +decorate(Type, _T, _Opaques) -> Type. + +%% Note: it is important that #opaque.struct is a subtype of the +%% opaque type. +decorate_with_opaque(Type, ?opaque(Set2), Opaques) -> + case decoration(set_to_list(Set2), Type, Opaques, [], false) of + {[], false} -> Type; + {List, All} when List =/= [] -> + NewType = ?opaque(ordsets:from_list(List)), + case All of + true -> NewType; + false -> t_sup(NewType, Type) + end + end. + +decoration([#opaque{struct = S} = Opaque|OpaqueTypes], Type, Opaques, + NewOpaqueTypes0, All) -> + IsOpaque = is_opaque_type2(Opaque, Opaques), + I = t_inf(Type, S), + case not IsOpaque orelse t_is_none(I) of + true -> decoration(OpaqueTypes, Type, Opaques, NewOpaqueTypes0, All); + false -> + NewOpaque = Opaque#opaque{struct = decorate(I, S, Opaques)}, + NewAll = All orelse t_is_equal(I, Type), + NewOpaqueTypes = [NewOpaque|NewOpaqueTypes0], + decoration(OpaqueTypes, Type, Opaques, NewOpaqueTypes, NewAll) + end; +decoration([], _Type, _Opaques, NewOpaqueTypes, All) -> + {NewOpaqueTypes, All}. + +-spec list_decorate([erl_type()], [erl_type()], opaques()) -> [erl_type()]. + +list_decorate(List, L, Opaques) -> + [decorate(Elem, E, Opaques) || {Elem, E} <- lists:zip(List, L)]. + +union_decorate(U1, U2, Opaques) -> + Union = union_decorate(U1, U2, Opaques, 0, []), + [A,B,F,I,L,N,T,M,_,Map] = U1, + [_,_,_,_,_,_,_,_,Opaque,_] = U2, + List = [A,B,F,I,L,N,T,M,Map], + DecList = [Dec || + E <- List, + not t_is_none(E), + not t_is_none(Dec = decorate(E, Opaque, Opaques))], + t_sup([Union|DecList]). + +union_decorate([?none|Left1], [_|Left2], Opaques, N, Acc) -> + union_decorate(Left1, Left2, Opaques, N, [?none|Acc]); +union_decorate([T1|Left1], [?none|Left2], Opaques, N, Acc) -> + union_decorate(Left1, Left2, Opaques, N+1, [T1|Acc]); +union_decorate([T1|Left1], [T2|Left2], Opaques, N, Acc) -> + union_decorate(Left1, Left2, Opaques, N+1, [decorate(T1, T2, Opaques)|Acc]); +union_decorate([], [], _Opaques, N, Acc) -> + if N =:= 0 -> ?none; + N =:= 1 -> + [Type] = [T || T <- Acc, T =/= ?none], + Type; + N >= 2 -> ?union(lists:reverse(Acc)) + end. + +decorate_tuple_sets(List, L, Opaques) -> + decorate_tuple_sets(List, L, Opaques, []). + +decorate_tuple_sets([{Arity, Tuples}|List], [{Arity, Ts}|L], Opaques, Acc) -> + DecTs = decorate_tuples_in_sets(Tuples, Ts, Opaques), + decorate_tuple_sets(List, L, Opaques, [{Arity, DecTs}|Acc]); +decorate_tuple_sets([ArTup|List], L, Opaques, Acc) -> + decorate_tuple_sets(List, L, Opaques, [ArTup|Acc]); +decorate_tuple_sets([], _L, _Opaques, Acc) -> + ?tuple_set(lists:reverse(Acc)). + +decorate_tuples_in_sets([?tuple(Elements, _, ?any)], Ts, Opaques) -> + NewList = [list_decorate(Elements, Es, Opaques) || ?tuple(Es, _, _) <- Ts], + case t_sup([t_tuple(Es) || Es <- NewList]) of + ?tuple_set([{_Arity, Tuples}]) -> Tuples; + ?tuple(_, _, _)=Tuple -> [Tuple] + end; +decorate_tuples_in_sets(Tuples, Ts, Opaques) -> + decorate_tuples_in_sets(Tuples, Ts, Opaques, []). + +decorate_tuples_in_sets([?tuple(Elements, Arity, Tag1) = T1|Tuples] = L1, + [?tuple(Es, Arity, Tag2)|Ts] = L2, Opaques, Acc) -> + if + Tag1 < Tag2 -> decorate_tuples_in_sets(Tuples, L2, Opaques, [T1|Acc]); + Tag1 > Tag2 -> decorate_tuples_in_sets(L1, Ts, Opaques, Acc); + Tag1 =:= Tag2 -> + NewElements = list_decorate(Elements, Es, Opaques), + NewAcc = [?tuple(NewElements, Arity, Tag1)|Acc], + decorate_tuples_in_sets(Tuples, Ts, Opaques, NewAcc) + end; +decorate_tuples_in_sets([T1|Tuples], L2, Opaques, Acc) -> + decorate_tuples_in_sets(Tuples, L2, Opaques, [T1|Acc]); +decorate_tuples_in_sets([], _L, _Opaques, Acc) -> + lists:reverse(Acc). + +-spec t_opaque_from_records(type_table()) -> [erl_type()]. + +t_opaque_from_records(RecDict) -> + OpaqueRecDict = + dict:filter(fun(Key, _Value) -> + case Key of + {opaque, _Name, _Arity} -> true; + _ -> false + end + end, RecDict), + OpaqueTypeDict = + dict:map(fun({opaque, Name, _Arity}, + {{Module, _FileLine, _Form, ArgNames}, _Type}) -> + %% Args = args_to_types(ArgNames), + %% List = lists:zip(ArgNames, Args), + %% TmpVarTab = maps:to_list(List), + %% Rep = t_from_form(Type, RecDict, TmpVarTab), + Rep = t_any(), % not used for anything right now + Args = [t_any() || _ <- ArgNames], + t_opaque(Module, Name, Args, Rep) + end, OpaqueRecDict), + [OpaqueType || {_Key, OpaqueType} <- dict:to_list(OpaqueTypeDict)]. + +%% Decompose opaque instances of type arg2 to structured types, in arg1 +%% XXX: Same as t_unopaque +-spec t_struct_from_opaque(erl_type(), [erl_type()]) -> erl_type(). + +t_struct_from_opaque(?function(Domain, Range), Opaques) -> + ?function(t_struct_from_opaque(Domain, Opaques), + t_struct_from_opaque(Range, Opaques)); +t_struct_from_opaque(?list(Types, Term, Size), Opaques) -> + ?list(t_struct_from_opaque(Types, Opaques), + t_struct_from_opaque(Term, Opaques), Size); +t_struct_from_opaque(?opaque(_) = T, Opaques) -> + case is_opaque_type(T, Opaques) of + true -> t_opaque_structure(T); + false -> T + end; +t_struct_from_opaque(?product(Types), Opaques) -> + ?product(list_struct_from_opaque(Types, Opaques)); +t_struct_from_opaque(?tuple(?any, _, _) = T, _Opaques) -> T; +t_struct_from_opaque(?tuple(Types, Arity, Tag), Opaques) -> + ?tuple(list_struct_from_opaque(Types, Opaques), Arity, Tag); +t_struct_from_opaque(?tuple_set(Set), Opaques) -> + NewSet = [{Sz, [t_struct_from_opaque(T, Opaques) || T <- Tuples]} + || {Sz, Tuples} <- Set], + ?tuple_set(NewSet); +t_struct_from_opaque(?union(List), Opaques) -> + t_sup(list_struct_from_opaque(List, Opaques)); +t_struct_from_opaque(Type, _Opaques) -> Type. + +list_struct_from_opaque(Types, Opaques) -> + [t_struct_from_opaque(Type, Opaques) || Type <- Types]. + +%%----------------------------------------------------------------------------- + +-type mod_records() :: dict:dict(module(), type_table()). + +%%----------------------------------------------------------------------------- +%% Unit type. Signals non termination. +%% + +-spec t_unit() -> erl_type(). + +t_unit() -> + ?unit. + +-spec t_is_unit(erl_type()) -> boolean(). + +t_is_unit(?unit) -> true; +t_is_unit(_) -> false. + +-spec t_is_none_or_unit(erl_type()) -> boolean(). + +t_is_none_or_unit(?none) -> true; +t_is_none_or_unit(?unit) -> true; +t_is_none_or_unit(_) -> false. + +%%----------------------------------------------------------------------------- +%% Atoms and the derived type boolean +%% + +-spec t_atom() -> erl_type(). + +t_atom() -> + ?atom(?any). + +-spec t_atom(atom()) -> erl_type(). + +t_atom(A) when is_atom(A) -> + ?atom(set_singleton(A)). + +-spec t_atoms([atom()]) -> erl_type(). + +t_atoms(List) when is_list(List) -> + t_sup([t_atom(A) || A <- List]). + +-spec t_atom_vals(erl_type()) -> 'unknown' | [atom(),...]. + +t_atom_vals(Type) -> + t_atom_vals(Type, 'universe'). + +-spec t_atom_vals(erl_type(), opaques()) -> 'unknown' | [atom(),...]. + +t_atom_vals(Type, Opaques) -> + do_opaque(Type, Opaques, fun atom_vals/1). + +atom_vals(?atom(?any)) -> unknown; +atom_vals(?atom(Set)) -> set_to_list(Set); +atom_vals(?opaque(_)) -> unknown; +atom_vals(Other) -> + ?atom(_) = Atm = t_inf(t_atom(), Other), + atom_vals(Atm). + +-spec t_is_atom(erl_type()) -> boolean(). + +t_is_atom(Type) -> + t_is_atom(Type, 'universe'). + +-spec t_is_atom(erl_type(), opaques()) -> boolean(). + +t_is_atom(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_atom1/1). + +is_atom1(?atom(_)) -> true; +is_atom1(_) -> false. + +-spec t_is_any_atom(atom(), erl_type()) -> boolean(). + +t_is_any_atom(Atom, SomeAtomsType) -> + t_is_any_atom(Atom, SomeAtomsType, 'universe'). + +-spec t_is_any_atom(atom(), erl_type(), opaques()) -> boolean(). + +t_is_any_atom(Atom, SomeAtomsType, Opaques) -> + do_opaque(SomeAtomsType, Opaques, + fun(AtomsType) -> is_any_atom(Atom, AtomsType) end). + +is_any_atom(Atom, ?atom(?any)) when is_atom(Atom) -> false; +is_any_atom(Atom, ?atom(Set)) when is_atom(Atom) -> + set_is_singleton(Atom, Set); +is_any_atom(Atom, _) when is_atom(Atom) -> false. + +%%------------------------------------ + +-spec t_is_boolean(erl_type()) -> boolean(). + +t_is_boolean(Type) -> + t_is_boolean(Type, 'universe'). + +-spec t_is_boolean(erl_type(), opaques()) -> boolean(). + +t_is_boolean(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_boolean/1). + +-spec t_boolean() -> erl_type(). + +t_boolean() -> + ?atom(set_from_list([false, true])). + +is_boolean(?atom(?any)) -> false; +is_boolean(?atom(Set)) -> + case set_size(Set) of + 1 -> set_is_element(true, Set) orelse set_is_element(false, Set); + 2 -> set_is_element(true, Set) andalso set_is_element(false, Set); + N when is_integer(N), N > 2 -> false + end; +is_boolean(_) -> false. + +%%----------------------------------------------------------------------------- +%% Binaries +%% + +-spec t_binary() -> erl_type(). + +t_binary() -> + ?bitstr(8, 0). + +-spec t_is_binary(erl_type()) -> boolean(). + +t_is_binary(Type) -> + t_is_binary(Type, 'universe'). + +-spec t_is_binary(erl_type(), opaques()) -> boolean(). + +t_is_binary(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_binary/1). + +is_binary(?bitstr(U, B)) -> + ((U rem 8) =:= 0) andalso ((B rem 8) =:= 0); +is_binary(_) -> false. + +%%----------------------------------------------------------------------------- +%% Bitstrings +%% + +-spec t_bitstr() -> erl_type(). + +t_bitstr() -> + ?bitstr(1, 0). + +-spec t_bitstr(non_neg_integer(), non_neg_integer()) -> erl_type(). + +t_bitstr(U, B) -> + NewB = + if + U =:= 0 -> B; + B >= (U * (?UNIT_MULTIPLIER + 1)) -> + (B rem U) + U * ?UNIT_MULTIPLIER; + true -> + B + end, + ?bitstr(U, NewB). + +-spec t_bitstr_unit(erl_type()) -> non_neg_integer(). + +t_bitstr_unit(?bitstr(U, _)) -> U. + +-spec t_bitstr_base(erl_type()) -> non_neg_integer(). + +t_bitstr_base(?bitstr(_, B)) -> B. + +-spec t_bitstr_concat([erl_type()]) -> erl_type(). + +t_bitstr_concat(List) -> + t_bitstr_concat_1(List, t_bitstr(0, 0)). + +t_bitstr_concat_1([T|Left], Acc) -> + t_bitstr_concat_1(Left, t_bitstr_concat(Acc, T)); +t_bitstr_concat_1([], Acc) -> + Acc. + +-spec t_bitstr_concat(erl_type(), erl_type()) -> erl_type(). + +t_bitstr_concat(T1, T2) -> + T1p = t_inf(t_bitstr(), T1), + T2p = t_inf(t_bitstr(), T2), + bitstr_concat(t_unopaque(T1p), t_unopaque(T2p)). + +-spec t_bitstr_match(erl_type(), erl_type()) -> erl_type(). + +t_bitstr_match(T1, T2) -> + T1p = t_inf(t_bitstr(), T1), + T2p = t_inf(t_bitstr(), T2), + bitstr_match(t_unopaque(T1p), t_unopaque(T2p)). + +-spec t_is_bitstr(erl_type()) -> boolean(). + +t_is_bitstr(Type) -> + t_is_bitstr(Type, 'universe'). + +-spec t_is_bitstr(erl_type(), opaques()) -> boolean(). + +t_is_bitstr(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_bitstr/1). + +is_bitstr(?bitstr(_, _)) -> true; +is_bitstr(_) -> false. + +%%----------------------------------------------------------------------------- +%% Matchstates +%% + +-spec t_matchstate() -> erl_type(). + +t_matchstate() -> + ?any_matchstate. + +-spec t_matchstate(erl_type(), non_neg_integer()) -> erl_type(). + +t_matchstate(Init, 0) -> + ?matchstate(Init, Init); +t_matchstate(Init, Max) when is_integer(Max) -> + Slots = [Init|[?none || _ <- lists:seq(1, Max)]], + ?matchstate(Init, t_product(Slots)). + +-spec t_is_matchstate(erl_type()) -> boolean(). + +t_is_matchstate(?matchstate(_, _)) -> true; +t_is_matchstate(_) -> false. + +-spec t_matchstate_present(erl_type()) -> erl_type(). + +t_matchstate_present(Type) -> + case t_inf(t_matchstate(), Type) of + ?matchstate(P, _) -> P; + _ -> ?none + end. + +-spec t_matchstate_slot(erl_type(), non_neg_integer()) -> erl_type(). + +t_matchstate_slot(Type, Slot) -> + RealSlot = Slot + 1, + case t_inf(t_matchstate(), Type) of + ?matchstate(_, ?any) -> ?any; + ?matchstate(_, ?product(Vals)) when length(Vals) >= RealSlot -> + lists:nth(RealSlot, Vals); + ?matchstate(_, ?product(_)) -> + ?none; + ?matchstate(_, SlotType) when RealSlot =:= 1 -> + SlotType; + _ -> + ?none + end. + +-spec t_matchstate_slots(erl_type()) -> erl_type(). + +t_matchstate_slots(?matchstate(_, Slots)) -> + Slots. + +-spec t_matchstate_update_present(erl_type(), erl_type()) -> erl_type(). + +t_matchstate_update_present(New, Type) -> + case t_inf(t_matchstate(), Type) of + ?matchstate(_, Slots) -> + ?matchstate(New, Slots); + _ -> ?none + end. + +-spec t_matchstate_update_slot(erl_type(), erl_type(), non_neg_integer()) -> erl_type(). + +t_matchstate_update_slot(New, Type, Slot) -> + RealSlot = Slot + 1, + case t_inf(t_matchstate(), Type) of + ?matchstate(Pres, Slots) -> + NewSlots = + case Slots of + ?any -> + ?any; + ?product(Vals) when length(Vals) >= RealSlot -> + NewTuple = setelement(RealSlot, list_to_tuple(Vals), New), + NewVals = tuple_to_list(NewTuple), + ?product(NewVals); + ?product(_) -> + ?none; + _ when RealSlot =:= 1 -> + New; + _ -> + ?none + end, + ?matchstate(Pres, NewSlots); + _ -> + ?none + end. + +%%----------------------------------------------------------------------------- +%% Functions +%% + +-spec t_fun() -> erl_type(). + +t_fun() -> + ?function(?any, ?any). + +-spec t_fun(erl_type()) -> erl_type(). + +t_fun(Range) -> + ?function(?any, Range). + +-spec t_fun([erl_type()] | arity(), erl_type()) -> erl_type(). + +t_fun(Domain, Range) when is_list(Domain) -> + ?function(?product(Domain), Range); +t_fun(Arity, Range) when is_integer(Arity), 0 =< Arity, Arity =< 255 -> + ?function(?product(lists:duplicate(Arity, ?any)), Range). + +-spec t_fun_args(erl_type()) -> 'unknown' | [erl_type()]. + +t_fun_args(Type) -> + t_fun_args(Type, 'universe'). + +-spec t_fun_args(erl_type(), opaques()) -> 'unknown' | [erl_type()]. + +t_fun_args(Type, Opaques) -> + do_opaque(Type, Opaques, fun fun_args/1). + +fun_args(?function(?any, _)) -> + unknown; +fun_args(?function(?product(Domain), _)) when is_list(Domain) -> + Domain. + +-spec t_fun_arity(erl_type()) -> 'unknown' | non_neg_integer(). + +t_fun_arity(Type) -> + t_fun_arity(Type, 'universe'). + +-spec t_fun_arity(erl_type(), opaques()) -> 'unknown' | non_neg_integer(). + +t_fun_arity(Type, Opaques) -> + do_opaque(Type, Opaques, fun fun_arity/1). + +fun_arity(?function(?any, _)) -> + unknown; +fun_arity(?function(?product(Domain), _)) -> + length(Domain). + +-spec t_fun_range(erl_type()) -> erl_type(). + +t_fun_range(Type) -> + t_fun_range(Type, 'universe'). + +-spec t_fun_range(erl_type(), opaques()) -> erl_type(). + +t_fun_range(Type, Opaques) -> + do_opaque(Type, Opaques, fun fun_range/1). + +fun_range(?function(_, Range)) -> + Range. + +-spec t_is_fun(erl_type()) -> boolean(). + +t_is_fun(Type) -> + t_is_fun(Type, 'universe'). + +-spec t_is_fun(erl_type(), opaques()) -> boolean(). + +t_is_fun(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_fun/1). + +is_fun(?function(_, _)) -> true; +is_fun(_) -> false. + +%%----------------------------------------------------------------------------- +%% Identifiers. Includes ports, pids and refs. +%% + +-spec t_identifier() -> erl_type(). + +t_identifier() -> + ?identifier(?any). + +-ifdef(DO_ERL_TYPES_TEST). +-spec t_is_identifier(erl_type()) -> erl_type(). + +t_is_identifier(?identifier(_)) -> true; +t_is_identifier(_) -> false. +-endif. + +%%------------------------------------ + +-spec t_port() -> erl_type(). + +t_port() -> + ?identifier(set_singleton(?port_qual)). + +-spec t_is_port(erl_type()) -> boolean(). + +t_is_port(Type) -> + t_is_port(Type, 'universe'). + +-spec t_is_port(erl_type(), opaques()) -> boolean(). + +t_is_port(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_port1/1). + +is_port1(?identifier(?any)) -> false; +is_port1(?identifier(Set)) -> set_is_singleton(?port_qual, Set); +is_port1(_) -> false. + +%%------------------------------------ + +-spec t_pid() -> erl_type(). + +t_pid() -> + ?identifier(set_singleton(?pid_qual)). + +-spec t_is_pid(erl_type()) -> boolean(). + +t_is_pid(Type) -> + t_is_pid(Type, 'universe'). + +-spec t_is_pid(erl_type(), opaques()) -> boolean(). + +t_is_pid(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_pid1/1). + +is_pid1(?identifier(?any)) -> false; +is_pid1(?identifier(Set)) -> set_is_singleton(?pid_qual, Set); +is_pid1(_) -> false. + +%%------------------------------------ + +-spec t_reference() -> erl_type(). + +t_reference() -> + ?identifier(set_singleton(?reference_qual)). + +-spec t_is_reference(erl_type()) -> boolean(). + +t_is_reference(Type) -> + t_is_reference(Type, 'universe'). + +-spec t_is_reference(erl_type(), opaques()) -> boolean(). + +t_is_reference(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_reference1/1). + +is_reference1(?identifier(?any)) -> false; +is_reference1(?identifier(Set)) -> set_is_singleton(?reference_qual, Set); +is_reference1(_) -> false. + +%%----------------------------------------------------------------------------- +%% Numbers are divided into floats, integers, chars and bytes. +%% + +-spec t_number() -> erl_type(). + +t_number() -> + ?number(?any, ?unknown_qual). + +-spec t_number(integer()) -> erl_type(). + +t_number(X) when is_integer(X) -> + t_integer(X). + +-spec t_is_number(erl_type()) -> boolean(). + +t_is_number(Type) -> + t_is_number(Type, 'universe'). + +-spec t_is_number(erl_type(), opaques()) -> boolean(). + +t_is_number(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_number/1). + +is_number(?number(_, _)) -> true; +is_number(_) -> false. + +%% Currently, the type system collapses all floats to ?float and does +%% not keep any information about their values. As a result, the list +%% that this function returns contains only integers. + +-spec t_number_vals(erl_type()) -> 'unknown' | [integer(),...]. + +t_number_vals(Type) -> + t_number_vals(Type, 'universe'). + +-spec t_number_vals(erl_type(), opaques()) -> 'unknown' | [integer(),...]. + +t_number_vals(Type, Opaques) -> + do_opaque(Type, Opaques, fun number_vals/1). + +number_vals(?int_set(Set)) -> set_to_list(Set); +number_vals(?number(_, _)) -> unknown; +number_vals(?opaque(_)) -> unknown; +number_vals(Other) -> + Inf = t_inf(Other, t_number()), + false = t_is_none(Inf), % sanity check + number_vals(Inf). + +%%------------------------------------ + +-spec t_float() -> erl_type(). + +t_float() -> + ?float. + +-spec t_is_float(erl_type()) -> boolean(). + +t_is_float(Type) -> + t_is_float(Type, 'universe'). + +-spec t_is_float(erl_type(), opaques()) -> boolean(). + +t_is_float(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_float1/1). + +is_float1(?float) -> true; +is_float1(_) -> false. + +%%------------------------------------ + +-spec t_integer() -> erl_type(). + +t_integer() -> + ?integer(?any). + +-spec t_integer(integer()) -> erl_type(). + +t_integer(I) when is_integer(I) -> + ?int_set(set_singleton(I)). + +-spec t_integers([integer()]) -> erl_type(). + +t_integers(List) when is_list(List) -> + t_sup([t_integer(I) || I <- List]). + +-spec t_is_integer(erl_type()) -> boolean(). + +t_is_integer(Type) -> + t_is_integer(Type, 'universe'). + +-spec t_is_integer(erl_type(), opaques()) -> boolean(). + +t_is_integer(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_integer1/1). + +is_integer1(?integer(_)) -> true; +is_integer1(_) -> false. + +%%------------------------------------ + +-spec t_byte() -> erl_type(). + +t_byte() -> + ?byte. + +-ifdef(DO_ERL_TYPES_TEST). +-spec t_is_byte(erl_type()) -> boolean(). + +t_is_byte(?int_range(neg_inf, _)) -> false; +t_is_byte(?int_range(_, pos_inf)) -> false; +t_is_byte(?int_range(From, To)) + when is_integer(From), From >= 0, is_integer(To), To =< ?MAX_BYTE -> true; +t_is_byte(?int_set(Set)) -> + (set_min(Set) >= 0) andalso (set_max(Set) =< ?MAX_BYTE); +t_is_byte(_) -> false. +-endif. + +%%------------------------------------ + +-spec t_char() -> erl_type(). + +t_char() -> + ?char. + +-spec t_is_char(erl_type()) -> boolean(). + +t_is_char(?int_range(neg_inf, _)) -> false; +t_is_char(?int_range(_, pos_inf)) -> false; +t_is_char(?int_range(From, To)) + when is_integer(From), From >= 0, is_integer(To), To =< ?MAX_CHAR -> true; +t_is_char(?int_set(Set)) -> + (set_min(Set) >= 0) andalso (set_max(Set) =< ?MAX_CHAR); +t_is_char(_) -> false. + +%%----------------------------------------------------------------------------- +%% Lists +%% + +-spec t_cons() -> erl_type(). + +t_cons() -> + ?nonempty_list(?any, ?any). + +%% Note that if the tail argument can be a list, we must collapse the +%% content of the list to include both the content of the tail list +%% and the head of the cons. If for example the tail argument is any() +%% then there can be any list in the tail and the content of the +%% returned list must be any(). + +-spec t_cons(erl_type(), erl_type()) -> erl_type(). + +t_cons(?none, _) -> ?none; +t_cons(_, ?none) -> ?none; +t_cons(?unit, _) -> ?none; +t_cons(_, ?unit) -> ?none; +t_cons(Hd, ?nil) -> + ?nonempty_list(Hd, ?nil); +t_cons(Hd, ?list(Contents, Termination, _)) -> + ?nonempty_list(t_sup(Contents, Hd), Termination); +t_cons(Hd, Tail) -> + case cons_tail(t_inf(Tail, t_maybe_improper_list())) of + ?list(Contents, Termination, _Size) -> + %% Collapse the list part of the termination but keep the + %% non-list part intact. + NewTermination = t_sup(t_subtract(Tail, t_maybe_improper_list()), + Termination), + ?nonempty_list(t_sup(Hd, Contents), NewTermination); + ?nil -> ?nonempty_list(Hd, Tail); + ?none -> ?nonempty_list(Hd, Tail); + ?unit -> ?none + end. + +cons_tail(Type) -> + do_opaque(Type, 'universe', fun(T) -> T end). + +-spec t_is_cons(erl_type()) -> boolean(). + +t_is_cons(Type) -> + t_is_cons(Type, 'universe'). + +-spec t_is_cons(erl_type(), opaques()) -> boolean(). + +t_is_cons(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_cons/1). + +is_cons(?nonempty_list(_, _)) -> true; +is_cons(_) -> false. + +-spec t_cons_hd(erl_type()) -> erl_type(). + +t_cons_hd(Type) -> + t_cons_hd(Type, 'universe'). + +-spec t_cons_hd(erl_type(), opaques()) -> erl_type(). + +t_cons_hd(Type, Opaques) -> + do_opaque(Type, Opaques, fun cons_hd/1). + +cons_hd(?nonempty_list(Contents, _Termination)) -> Contents. + +-spec t_cons_tl(erl_type()) -> erl_type(). + +t_cons_tl(Type) -> + t_cons_tl(Type, 'universe'). + +-spec t_cons_tl(erl_type(), opaques()) -> erl_type(). + +t_cons_tl(Type, Opaques) -> + do_opaque(Type, Opaques, fun cons_tl/1). + +cons_tl(?nonempty_list(_Contents, Termination) = T) -> + t_sup(Termination, T). + +-spec t_nil() -> erl_type(). + +t_nil() -> + ?nil. + +-spec t_is_nil(erl_type()) -> boolean(). + +t_is_nil(Type) -> + t_is_nil(Type, 'universe'). + +-spec t_is_nil(erl_type(), opaques()) -> boolean(). + +t_is_nil(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_nil/1). + +is_nil(?nil) -> true; +is_nil(_) -> false. + +-spec t_list() -> erl_type(). + +t_list() -> + ?list(?any, ?nil, ?unknown_qual). + +-spec t_list(erl_type()) -> erl_type(). + +t_list(?none) -> ?none; +t_list(?unit) -> ?none; +t_list(Contents) -> + ?list(Contents, ?nil, ?unknown_qual). + +-spec t_list_elements(erl_type()) -> erl_type(). + +t_list_elements(Type) -> + t_list_elements(Type, 'universe'). + +-spec t_list_elements(erl_type(), opaques()) -> erl_type(). + +t_list_elements(Type, Opaques) -> + do_opaque(Type, Opaques, fun list_elements/1). + +list_elements(?list(Contents, _, _)) -> Contents; +list_elements(?nil) -> ?none. + +-spec t_list_termination(erl_type(), opaques()) -> erl_type(). + +t_list_termination(Type, Opaques) -> + do_opaque(Type, Opaques, fun t_list_termination/1). + +-spec t_list_termination(erl_type()) -> erl_type(). + +t_list_termination(?nil) -> ?nil; +t_list_termination(?list(_, Term, _)) -> Term. + +-spec t_is_list(erl_type()) -> boolean(). + +t_is_list(?list(_Contents, ?nil, _)) -> true; +t_is_list(?nil) -> true; +t_is_list(_) -> false. + +-spec t_nonempty_list() -> erl_type(). + +t_nonempty_list() -> + t_cons(?any, ?nil). + +-spec t_nonempty_list(erl_type()) -> erl_type(). + +t_nonempty_list(Type) -> + t_cons(Type, ?nil). + +-spec t_nonempty_string() -> erl_type(). + +t_nonempty_string() -> + t_nonempty_list(t_char()). + +-spec t_string() -> erl_type(). + +t_string() -> + t_list(t_char()). + +-spec t_is_string(erl_type()) -> boolean(). + +t_is_string(X) -> + t_is_list(X) andalso t_is_char(t_list_elements(X)). + +-spec t_maybe_improper_list() -> erl_type(). + +t_maybe_improper_list() -> + ?list(?any, ?any, ?unknown_qual). + +%% Should only be used if you know what you are doing. See t_cons/2 +-spec t_maybe_improper_list(erl_type(), erl_type()) -> erl_type(). + +t_maybe_improper_list(_Content, ?unit) -> ?none; +t_maybe_improper_list(?unit, _Termination) -> ?none; +t_maybe_improper_list(Content, Termination) -> + %% Safety check: would be nice to have but does not work with remote types + %% true = t_is_subtype(t_nil(), Termination), + ?list(Content, Termination, ?unknown_qual). + +-spec t_is_maybe_improper_list(erl_type()) -> boolean(). + +t_is_maybe_improper_list(Type) -> + t_is_maybe_improper_list(Type, 'universe'). + +-spec t_is_maybe_improper_list(erl_type(), opaques()) -> boolean(). + +t_is_maybe_improper_list(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_maybe_improper_list/1). + +is_maybe_improper_list(?list(_, _, _)) -> true; +is_maybe_improper_list(?nil) -> true; +is_maybe_improper_list(_) -> false. + +%% %% Should only be used if you know what you are doing. See t_cons/2 +%% -spec t_improper_list(erl_type(), erl_type()) -> erl_type(). +%% +%% t_improper_list(?unit, _Termination) -> ?none; +%% t_improper_list(_Content, ?unit) -> ?none; +%% t_improper_list(Content, Termination) -> +%% %% Safety check: would be nice to have but does not work with remote types +%% %% false = t_is_subtype(t_nil(), Termination), +%% ?list(Content, Termination, ?any). + +-spec lift_list_to_pos_empty(erl_type(), opaques()) -> erl_type(). + +lift_list_to_pos_empty(Type, Opaques) -> + do_opaque(Type, Opaques, fun lift_list_to_pos_empty/1). + +-spec lift_list_to_pos_empty(erl_type()) -> erl_type(). + +lift_list_to_pos_empty(?nil) -> ?nil; +lift_list_to_pos_empty(?list(Content, Termination, _)) -> + ?list(Content, Termination, ?unknown_qual). + +%%----------------------------------------------------------------------------- +%% Maps +%% +%% Representation: +%% ?map(Pairs, DefaultKey, DefaultValue) +%% +%% Pairs is a sorted dictionary of types with a mandatoriness tag on each pair +%% (t_map_dict()). DefaultKey and DefaultValue are plain types. +%% +%% A map M belongs to this type iff +%% For each pair {KT, mandatory, VT} in Pairs, there exists a pair {K, V} in M +%% such that K \in KT and V \in VT. +%% For each pair {KT, optional, VT} in Pairs, either there exists no key K in +%% M s.t. K in KT, or there exists a pair {K, V} in M such that K \in KT and +%% V \in VT. +%% For each remaining pair {K, V} in M (where remaining means that there is no +%% key KT in Pairs s.t. K \in KT), K \in DefaultKey and V \in DefaultValue. +%% +%% Invariants: +%% * The keys in Pairs are singleton types. +%% * The values of Pairs must not be unit, and may only be none if the +%% mandatoriness tag is 'optional'. +%% * Optional must contain no pair {K,V} s.t. K is a subtype of DefaultKey and +%% V is equal to DefaultKey. +%% * DefaultKey must be the empty type iff DefaultValue is the empty type. +%% * DefaultKey must not be a singleton type. +%% * For every key K in Pairs, DefaultKey - K must not be representable; i.e. +%% t_subtract(DefaultKey, K) must return DefaultKey. +%% * For every pair {K, 'optional', ?none} in Pairs, K must be a subtype of +%% DefaultKey. +%% * Pairs must be sorted and not contain any duplicate keys. +%% +%% These invariants ensure that equal map types are represented by equal terms. + +-define(mand, mandatory). +-define(opt, optional). + +-type t_map_mandatoriness() :: ?mand | ?opt. +-type t_map_pair() :: {erl_type(), t_map_mandatoriness(), erl_type()}. +-type t_map_dict() :: [t_map_pair()]. + +-spec t_map() -> erl_type(). + +t_map() -> + t_map([], t_any(), t_any()). + +-spec t_map([{erl_type(), erl_type()}]) -> erl_type(). + +t_map(L) -> + lists:foldl(fun t_map_put/2, t_map(), L). + +-spec t_map(t_map_dict(), erl_type(), erl_type()) -> erl_type(). + +t_map(Pairs0, DefK0, DefV0) -> + DefK1 = lists:foldl(fun({K,_,_},Acc)->t_subtract(Acc,K)end, DefK0, Pairs0), + {DefK2, DefV1} = + case t_is_none_or_unit(DefK1) orelse t_is_none_or_unit(DefV0) of + true -> {?none, ?none}; + false -> {DefK1, DefV0} + end, + {Pairs1, DefK, DefV} + = case is_singleton_type(DefK2) of + true -> {mapdict_insert({DefK2, ?opt, DefV1}, Pairs0), ?none, ?none}; + false -> {Pairs0, DefK2, DefV1} + end, + Pairs = normalise_map_optionals(Pairs1, DefK, DefV), + %% Validate invariants of the map representation. + %% Since we needed to iterate over the arguments in order to normalise anyway, + %% we might as well save us some future pain and do this even without + %% define(DEBUG, true). + try + validate_map_elements(Pairs) + catch error:badarg -> error(badarg, [Pairs0,DefK0,DefV0]); + error:{badarg, E} -> error({badarg, E}, [Pairs0,DefK0,DefV0]) + end, + ?map(Pairs, DefK, DefV). + +normalise_map_optionals([], _, _) -> []; +normalise_map_optionals([E={K,?opt,?none}|T], DefK, DefV) -> + Diff = t_subtract(DefK, K), + case t_is_subtype(K, DefK) andalso DefK =:= Diff of + true -> [E|normalise_map_optionals(T, DefK, DefV)]; + false -> normalise_map_optionals(T, Diff, DefV) + end; +normalise_map_optionals([E={K,?opt,V}|T], DefK, DefV) -> + case t_is_equal(V, DefV) andalso t_is_subtype(K, DefK) of + true -> normalise_map_optionals(T, DefK, DefV); + false -> [E|normalise_map_optionals(T, DefK, DefV)] + end; +normalise_map_optionals([E|T], DefK, DefV) -> + [E|normalise_map_optionals(T, DefK, DefV)]. + +validate_map_elements([{_,?mand,?none}|_]) -> error({badarg, none_in_mand}); +validate_map_elements([{K1,_,_}|Rest=[{K2,_,_}|_]]) -> + case is_singleton_type(K1) andalso K1 < K2 of + false -> error(badarg); + true -> validate_map_elements(Rest) + end; +validate_map_elements([{K,_,_}]) -> + case is_singleton_type(K) of + false -> error(badarg); + true -> true + end; +validate_map_elements([]) -> true. + +-spec t_is_map(erl_type()) -> boolean(). + +t_is_map(Type) -> + t_is_map(Type, 'universe'). + +-spec t_is_map(erl_type(), opaques()) -> boolean(). + +t_is_map(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_map1/1). + +is_map1(?map(_, _, _)) -> true; +is_map1(_) -> false. + +-spec t_map_entries(erl_type()) -> t_map_dict(). + +t_map_entries(M) -> + t_map_entries(M, 'universe'). + +-spec t_map_entries(erl_type(), opaques()) -> t_map_dict(). + +t_map_entries(M, Opaques) -> + do_opaque(M, Opaques, fun map_entries/1). + +map_entries(?map(Pairs,_,_)) -> + Pairs. + +-spec t_map_def_key(erl_type()) -> erl_type(). + +t_map_def_key(M) -> + t_map_def_key(M, 'universe'). + +-spec t_map_def_key(erl_type(), opaques()) -> erl_type(). + +t_map_def_key(M, Opaques) -> + do_opaque(M, Opaques, fun map_def_key/1). + +map_def_key(?map(_,DefK,_)) -> + DefK. + +-spec t_map_def_val(erl_type()) -> erl_type(). + +t_map_def_val(M) -> + t_map_def_val(M, 'universe'). + +-spec t_map_def_val(erl_type(), opaques()) -> erl_type(). + +t_map_def_val(M, Opaques) -> + do_opaque(M, Opaques, fun map_def_val/1). + +map_def_val(?map(_,_,DefV)) -> + DefV. + +-spec mapdict_store(t_map_pair(), t_map_dict()) -> t_map_dict(). + +mapdict_store(E={K,_,_}, [{K,_,_}|T]) -> [E|T]; +mapdict_store(E1={K1,_,_}, [E2={K2,_,_}|T]) when K1 > K2 -> + [E2|mapdict_store(E1, T)]; +mapdict_store(E={_,_,_}, T) -> [E|T]. + +-spec mapdict_insert(t_map_pair(), t_map_dict()) -> t_map_dict(). + +mapdict_insert(E={K,_,_}, D=[{K,_,_}|_]) -> error(badarg, [E, D]); +mapdict_insert(E1={K1,_,_}, [E2={K2,_,_}|T]) when K1 > K2 -> + [E2|mapdict_insert(E1, T)]; +mapdict_insert(E={_,_,_}, T) -> [E|T]. + +%% Merges the pairs of two maps together. Missing pairs become (?opt, DefV) or +%% (?opt, ?none), depending on whether K \in DefK. +-spec map_pairwise_merge(fun((erl_type(), + t_map_mandatoriness(), erl_type(), + t_map_mandatoriness(), erl_type()) + -> t_map_pair() | false), + erl_type(), erl_type()) -> t_map_dict(). +map_pairwise_merge(F, ?map(APairs, ADefK, ADefV), + ?map(BPairs, BDefK, BDefV)) -> + map_pairwise_merge(F, APairs, ADefK, ADefV, BPairs, BDefK, BDefV). + +map_pairwise_merge(_, [], _, _, [], _, _) -> []; +map_pairwise_merge(F, As0, ADefK, ADefV, Bs0, BDefK, BDefV) -> + {K1, AMNess1, AV1, As1, BMNess1, BV1, Bs1} = + case {As0, Bs0} of + {[{K,AMNess,AV}|As], [{K, BMNess,BV}|Bs]} -> + {K, AMNess, AV, As, BMNess, BV, Bs}; + {[{K,AMNess,AV}|As], [{BK,_, _ }|_]=Bs} when K < BK -> + {K, AMNess, AV, As, ?opt, mapmerge_otherv(K, BDefK, BDefV), Bs}; + {As, [{K, BMNess,BV}|Bs]} -> + {K, ?opt, mapmerge_otherv(K, ADefK, ADefV), As, BMNess, BV, Bs}; + {[{K,AMNess,AV}|As], []=Bs} -> + {K, AMNess, AV, As, ?opt, mapmerge_otherv(K, BDefK, BDefV), Bs} + end, + MK = K1, %% Rename to make clear that we are matching below + case F(K1, AMNess1, AV1, BMNess1, BV1) of + false -> map_pairwise_merge(F,As1,ADefK,ADefV,Bs1,BDefK,BDefV); + {MK,_,_}=M -> [M|map_pairwise_merge(F,As1,ADefK,ADefV,Bs1,BDefK,BDefV)] + end. + +%% Folds over the pairs in two maps simultaneously in reverse key order. Missing +%% pairs become (?opt, DefV) or (?opt, ?none), depending on whether K \in DefK. +-spec map_pairwise_merge_foldr(fun((erl_type(), + t_map_mandatoriness(), erl_type(), + t_map_mandatoriness(), erl_type(), + Acc) -> Acc), + Acc, erl_type(), erl_type()) -> Acc. + +map_pairwise_merge_foldr(F, AccIn, ?map(APairs, ADefK, ADefV), + ?map(BPairs, BDefK, BDefV)) -> + map_pairwise_merge_foldr(F, AccIn, APairs, ADefK, ADefV, BPairs, BDefK, BDefV). + +map_pairwise_merge_foldr(_, Acc, [], _, _, [], _, _) -> Acc; +map_pairwise_merge_foldr(F, AccIn, As0, ADefK, ADefV, Bs0, BDefK, BDefV) -> + {K1, AMNess1, AV1, As1, BMNess1, BV1, Bs1} = + case {As0, Bs0} of + {[{K,AMNess,AV}|As], [{K,BMNess,BV}|Bs]} -> + {K, AMNess, AV, As, BMNess, BV, Bs}; + {[{K,AMNess,AV}|As], [{BK,_, _ }|_]=Bs} when K < BK -> + {K, AMNess, AV, As, ?opt, mapmerge_otherv(K, BDefK, BDefV), Bs}; + {As, [{K,BMNess,BV}|Bs]} -> + {K, ?opt, mapmerge_otherv(K, ADefK, ADefV), As, BMNess, BV, Bs}; + {[{K,AMNess,AV}|As], []=Bs} -> + {K, AMNess, AV, As, ?opt, mapmerge_otherv(K, BDefK, BDefV), Bs} + end, + F(K1, AMNess1, AV1, BMNess1, BV1, + map_pairwise_merge_foldr(F,AccIn,As1,ADefK,ADefV,Bs1,BDefK,BDefV)). + +%% By observing that a missing pair in a map is equivalent to an optional pair, +%% with ?none or DefV value, depending on whether K \in DefK, we can simplify +%% merging by denormalising the map pairs temporarily, removing all 'false' +%% cases, at the cost of the creation of more tuples: +mapmerge_otherv(K, ODefK, ODefV) -> + case t_inf(K, ODefK) of + ?none -> ?none; + _KOrOpaque -> ODefV + end. + +-spec t_map_put({erl_type(), erl_type()}, erl_type()) -> erl_type(). + +t_map_put(KV, Map) -> + t_map_put(KV, Map, 'universe'). + +-spec t_map_put({erl_type(), erl_type()}, erl_type(), opaques()) -> erl_type(). + +t_map_put(KV, Map, Opaques) -> + do_opaque(Map, Opaques, fun(UM) -> map_put(KV, UM, Opaques) end). + +%% Key and Value are *not* unopaqued, but the map is +map_put(_, ?none, _) -> ?none; +map_put({Key, Value}, ?map(Pairs,DefK,DefV), Opaques) -> + case t_is_none_or_unit(Key) orelse t_is_none_or_unit(Value) of + true -> ?none; + false -> + case is_singleton_type(Key) of + true -> + t_map(mapdict_store({Key, ?mand, Value}, Pairs), DefK, DefV); + false -> + t_map([{K, MNess, case t_is_none(t_inf(K, Key, Opaques)) of + true -> V; + false -> t_sup(V, Value) + end} || {K, MNess, V} <- Pairs], + t_sup(DefK, Key), + t_sup(DefV, Value)) + end + end. + +-spec t_map_update({erl_type(), erl_type()}, erl_type()) -> erl_type(). + +t_map_update(KV, Map) -> + t_map_update(KV, Map, 'universe'). + +-spec t_map_update({erl_type(), erl_type()}, erl_type(), opaques()) -> erl_type(). + +t_map_update(_, ?none, _) -> ?none; +t_map_update(KV={Key, _}, M, Opaques) -> + case t_is_subtype(t_atom('true'), t_map_is_key(Key, M, Opaques)) of + false -> ?none; + true -> t_map_put(KV, M, Opaques) + end. + +-spec t_map_get(erl_type(), erl_type()) -> erl_type(). + +t_map_get(Key, Map) -> + t_map_get(Key, Map, 'universe'). + +-spec t_map_get(erl_type(), erl_type(), opaques()) -> erl_type(). + +t_map_get(Key, Map, Opaques) -> + do_opaque(Map, Opaques, + fun(UM) -> + do_opaque(Key, Opaques, fun(UK) -> map_get(UK, UM) end) + end). + +map_get(_, ?none) -> ?none; +map_get(Key, ?map(Pairs, DefK, DefV)) -> + DefRes = + case t_do_overlap(DefK, Key) of + false -> t_none(); + true -> DefV + end, + case is_singleton_type(Key) of + false -> + lists:foldl(fun({K, _, V}, Res) -> + case t_do_overlap(K, Key) of + false -> Res; + true -> t_sup(Res, V) + end + end, DefRes, Pairs); + true -> + case lists:keyfind(Key, 1, Pairs) of + false -> DefRes; + {_, _, ValType} -> ValType + end + end. + +-spec t_map_is_key(erl_type(), erl_type()) -> erl_type(). + +t_map_is_key(Key, Map) -> + t_map_is_key(Key, Map, 'universe'). + +-spec t_map_is_key(erl_type(), erl_type(), opaques()) -> erl_type(). + +t_map_is_key(Key, Map, Opaques) -> + do_opaque(Map, Opaques, + fun(UM) -> + do_opaque(Key, Opaques, fun(UK) -> map_is_key(UK, UM) end) + end). + +map_is_key(_, ?none) -> ?none; +map_is_key(Key, ?map(Pairs, DefK, _DefV)) -> + case is_singleton_type(Key) of + true -> + case lists:keyfind(Key, 1, Pairs) of + {Key, ?mand, _} -> t_atom(true); + {Key, ?opt, ?none} -> t_atom(false); + {Key, ?opt, _} -> t_boolean(); + false -> + case t_do_overlap(DefK, Key) of + false -> t_atom(false); + true -> t_boolean() + end + end; + false -> + case t_do_overlap(DefK, Key) + orelse lists:any(fun({_,_,?none}) -> false; + ({K,_,_}) -> t_do_overlap(K, Key) + end, Pairs) + of + true -> t_boolean(); + false -> t_atom(false) + end + end. + +%%----------------------------------------------------------------------------- +%% Tuples +%% + +-spec t_tuple() -> erl_type(). + +t_tuple() -> + ?tuple(?any, ?any, ?any). + +-spec t_tuple(non_neg_integer() | [erl_type()]) -> erl_type(). + +t_tuple(N) when is_integer(N), N > ?MAX_TUPLE_SIZE -> + t_tuple(); +t_tuple(N) when is_integer(N) -> + ?tuple(lists:duplicate(N, ?any), N, ?any); +t_tuple(List) -> + case any_none_or_unit(List) of + true -> t_none(); + false -> + Arity = length(List), + case get_tuple_tags(List) of + [Tag] -> ?tuple(List, Arity, Tag); %% Tag can also be ?any here + TagList -> + SortedTagList = lists:sort(TagList), + Tuples = [?tuple([T|tl(List)], Arity, T) || T <- SortedTagList], + ?tuple_set([{Arity, Tuples}]) + end + end. + +-spec get_tuple_tags([erl_type()]) -> [erl_type(),...]. + +get_tuple_tags([Tag|_]) -> + do_opaque(Tag, 'universe', fun tuple_tags/1); +get_tuple_tags(_) -> [?any]. + +tuple_tags(?atom(?any)) -> [?any]; +tuple_tags(?atom(Set)) -> + case set_size(Set) > ?TUPLE_TAG_LIMIT of + true -> [?any]; + false -> [t_atom(A) || A <- set_to_list(Set)] + end; +tuple_tags(_) -> [?any]. + +%% to be used for a tuple with known types for its arguments (not ?any) +-spec t_tuple_args(erl_type()) -> [erl_type()]. + +t_tuple_args(Type) -> + t_tuple_args(Type, 'universe'). + +%% to be used for a tuple with known types for its arguments (not ?any) +-spec t_tuple_args(erl_type(), opaques()) -> [erl_type()]. + +t_tuple_args(Type, Opaques) -> + do_opaque(Type, Opaques, fun tuple_args/1). + +tuple_args(?tuple(Args, _, _)) when is_list(Args) -> Args. + +%% to be used for a tuple with a known size (not ?any) +-spec t_tuple_size(erl_type()) -> non_neg_integer(). + +t_tuple_size(Type) -> + t_tuple_size(Type, 'universe'). + +%% to be used for a tuple with a known size (not ?any) +-spec t_tuple_size(erl_type(), opaques()) -> non_neg_integer(). + +t_tuple_size(Type, Opaques) -> + do_opaque(Type, Opaques, fun tuple_size1/1). + +tuple_size1(?tuple(_, Size, _)) when is_integer(Size) -> Size. + +-spec t_tuple_sizes(erl_type()) -> 'unknown' | [non_neg_integer(),...]. + +t_tuple_sizes(Type) -> + do_opaque(Type, 'universe', fun tuple_sizes/1). + +tuple_sizes(?tuple(?any, ?any, ?any)) -> unknown; +tuple_sizes(?tuple(_, Size, _)) when is_integer(Size) -> [Size]; +tuple_sizes(?tuple_set(List)) -> [Size || {Size, _} <- List]. + +-spec t_tuple_subtypes(erl_type(), opaques()) -> + 'unknown' | [erl_type(),...]. + +t_tuple_subtypes(Type, Opaques) -> + Fun = fun(?tuple_set(List)) -> + t_tuple_subtypes_tuple_list(List, Opaques); + (?opaque(_)) -> unknown; + (T) -> t_tuple_subtypes(T) + end, + do_opaque(Type, Opaques, Fun). + +t_tuple_subtypes_tuple_list(List, Opaques) -> + lists:append([t_tuple_subtypes_list(Tuples, Opaques) || + {_Size, Tuples} <- List]). + +t_tuple_subtypes_list(List, Opaques) -> + ListOfLists = [t_tuple_subtypes(E, Opaques) || E <- List, E =/= ?none], + lists:append([L || L <- ListOfLists, L =/= 'unknown']). + +-spec t_tuple_subtypes(erl_type()) -> 'unknown' | [erl_type(),...]. + +%% XXX. Not the same as t_tuple_subtypes(T, 'universe')... +t_tuple_subtypes(?tuple(?any, ?any, ?any)) -> unknown; +t_tuple_subtypes(?tuple(_, _, _) = T) -> [T]; +t_tuple_subtypes(?tuple_set(List)) -> + lists:append([Tuples || {_Size, Tuples} <- List]). + +-spec t_is_tuple(erl_type()) -> boolean(). + +t_is_tuple(Type) -> + t_is_tuple(Type, 'universe'). + +-spec t_is_tuple(erl_type(), opaques()) -> boolean(). + +t_is_tuple(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_tuple1/1). + +is_tuple1(?tuple(_, _, _)) -> true; +is_tuple1(?tuple_set(_)) -> true; +is_tuple1(_) -> false. + +%%----------------------------------------------------------------------------- +%% Non-primitive types, including some handy syntactic sugar types +%% + +-spec t_bitstrlist() -> erl_type(). + +t_bitstrlist() -> + t_iolist(1, t_bitstr()). + +-spec t_arity() -> erl_type(). + +t_arity() -> + t_from_range(0, 255). % was t_byte(). + +-spec t_pos_integer() -> erl_type(). + +t_pos_integer() -> + t_from_range(1, pos_inf). + +-spec t_non_neg_integer() -> erl_type(). + +t_non_neg_integer() -> + t_from_range(0, pos_inf). + +-spec t_is_non_neg_integer(erl_type()) -> boolean(). + +t_is_non_neg_integer(?integer(_) = T) -> + t_is_subtype(T, t_non_neg_integer()); +t_is_non_neg_integer(_) -> false. + +-spec t_neg_integer() -> erl_type(). + +t_neg_integer() -> + t_from_range(neg_inf, -1). + +-spec t_fixnum() -> erl_type(). + +t_fixnum() -> + t_integer(). % Gross over-approximation + +-spec t_pos_fixnum() -> erl_type(). + +t_pos_fixnum() -> + t_pos_integer(). % Gross over-approximation + +-spec t_non_neg_fixnum() -> erl_type(). + +t_non_neg_fixnum() -> + t_non_neg_integer(). % Gross over-approximation + +-spec t_mfa() -> erl_type(). + +t_mfa() -> + t_tuple([t_atom(), t_atom(), t_arity()]). + +-spec t_module() -> erl_type(). + +t_module() -> + t_atom(). + +-spec t_node() -> erl_type(). + +t_node() -> + t_atom(). + +-spec t_iodata() -> erl_type(). + +t_iodata() -> + t_sup(t_iolist(), t_binary()). + +-spec t_iolist() -> erl_type(). + +t_iolist() -> + t_iolist(1, t_binary()). + +%% Added a second argument which currently is t_binary() | t_bitstr() +-spec t_iolist(non_neg_integer(), erl_type()) -> erl_type(). + +t_iolist(N, T) when N > 0 -> + t_maybe_improper_list(t_sup([t_iolist(N-1, T), T, t_byte()]), + t_sup(T, t_nil())); +t_iolist(0, T) -> + t_maybe_improper_list(t_any(), t_sup(T, t_nil())). + +-spec t_timeout() -> erl_type(). + +t_timeout() -> + t_sup(t_non_neg_integer(), t_atom('infinity')). + +%%------------------------------------ + +%% ?none is allowed in products. A product of size 1 is not a product. + +-spec t_product([erl_type()]) -> erl_type(). + +t_product([T]) -> T; +t_product(Types) when is_list(Types) -> + ?product(Types). + +%% This function is intended to be the inverse of the one above. +%% It should NOT be used with ?any, ?none or ?unit as input argument. + +-spec t_to_tlist(erl_type()) -> [erl_type()]. + +t_to_tlist(?product(Types)) -> Types; +t_to_tlist(T) when T =/= ?any orelse T =/= ?none orelse T =/= ?unit -> [T]. + +%%------------------------------------ + +-spec t_var(atom() | integer()) -> erl_type(). + +t_var(Atom) when is_atom(Atom) -> ?var(Atom); +t_var(Int) when is_integer(Int) -> ?var(Int). + +-spec t_is_var(erl_type()) -> boolean(). + +t_is_var(?var(_)) -> true; +t_is_var(_) -> false. + +-spec t_var_name(erl_type()) -> atom() | integer(). + +t_var_name(?var(Id)) -> Id. + +-spec t_has_var(erl_type()) -> boolean(). + +t_has_var(?var(_)) -> true; +t_has_var(?function(Domain, Range)) -> + t_has_var(Domain) orelse t_has_var(Range); +t_has_var(?list(Contents, Termination, _)) -> + t_has_var(Contents) orelse t_has_var(Termination); +t_has_var(?product(Types)) -> t_has_var_list(Types); +t_has_var(?tuple(?any, ?any, ?any)) -> false; +t_has_var(?tuple(Elements, _, _)) -> + t_has_var_list(Elements); +t_has_var(?tuple_set(_) = T) -> + t_has_var_list(t_tuple_subtypes(T)); +t_has_var(?map(_, DefK, _)= Map) -> + t_has_var_list(map_all_values(Map)) orelse + t_has_var(DefK); +t_has_var(?opaque(Set)) -> + %% Assume variables in 'args' are also present i 'struct' + t_has_var_list([O#opaque.struct || O <- set_to_list(Set)]); +t_has_var(?union(List)) -> + t_has_var_list(List); +t_has_var(_) -> false. + +-spec t_has_var_list([erl_type()]) -> boolean(). + +t_has_var_list([T|Ts]) -> + t_has_var(T) orelse t_has_var_list(Ts); +t_has_var_list([]) -> false. + +-spec t_collect_vars(erl_type()) -> [erl_type()]. + +t_collect_vars(T) -> + t_collect_vars(T, []). + +-spec t_collect_vars(erl_type(), [erl_type()]) -> [erl_type()]. + +t_collect_vars(?var(_) = Var, Acc) -> + ordsets:add_element(Var, Acc); +t_collect_vars(?function(Domain, Range), Acc) -> + ordsets:union(t_collect_vars(Domain, Acc), t_collect_vars(Range, [])); +t_collect_vars(?list(Contents, Termination, _), Acc) -> + ordsets:union(t_collect_vars(Contents, Acc), t_collect_vars(Termination, [])); +t_collect_vars(?product(Types), Acc) -> + t_collect_vars_list(Types, Acc); +t_collect_vars(?tuple(?any, ?any, ?any), Acc) -> + Acc; +t_collect_vars(?tuple(Types, _, _), Acc) -> + t_collect_vars_list(Types, Acc); +t_collect_vars(?tuple_set(_) = TS, Acc) -> + t_collect_vars_list(t_tuple_subtypes(TS), Acc); +t_collect_vars(?map(_, DefK, _) = Map, Acc0) -> + Acc = t_collect_vars_list(map_all_values(Map), Acc0), + t_collect_vars(DefK, Acc); +t_collect_vars(?opaque(Set), Acc) -> + %% Assume variables in 'args' are also present i 'struct' + t_collect_vars_list([O#opaque.struct || O <- set_to_list(Set)], Acc); +t_collect_vars(?union(List), Acc) -> + t_collect_vars_list(List, Acc); +t_collect_vars(_, Acc) -> + Acc. + +t_collect_vars_list([T|Ts], Acc0) -> + Acc = t_collect_vars(T, Acc0), + t_collect_vars_list(Ts, Acc); +t_collect_vars_list([], Acc) -> Acc. + +%%============================================================================= +%% +%% Type construction from Erlang terms. +%% +%%============================================================================= + +%%----------------------------------------------------------------------------- +%% Make a type from a term. No type depth is enforced. +%% + +-spec t_from_term(term()) -> erl_type(). + +t_from_term([H|T]) -> t_cons(t_from_term(H), t_from_term(T)); +t_from_term([]) -> t_nil(); +t_from_term(T) when is_atom(T) -> t_atom(T); +t_from_term(T) when is_bitstring(T) -> t_bitstr(0, erlang:bit_size(T)); +t_from_term(T) when is_float(T) -> t_float(); +t_from_term(T) when is_function(T) -> + {arity, Arity} = erlang:fun_info(T, arity), + t_fun(Arity, t_any()); +t_from_term(T) when is_integer(T) -> t_integer(T); +t_from_term(T) when is_map(T) -> + Pairs = [{t_from_term(K), ?mand, t_from_term(V)} + || {K, V} <- maps:to_list(T)], + {Stons, Rest} = lists:partition(fun({K,_,_}) -> is_singleton_type(K) end, + Pairs), + {DefK, DefV} + = lists:foldl(fun({K,_,V},{AK,AV}) -> {t_sup(K,AK), t_sup(V,AV)} end, + {t_none(), t_none()}, Rest), + t_map(lists:keysort(1, Stons), DefK, DefV); +t_from_term(T) when is_pid(T) -> t_pid(); +t_from_term(T) when is_port(T) -> t_port(); +t_from_term(T) when is_reference(T) -> t_reference(); +t_from_term(T) when is_tuple(T) -> + t_tuple([t_from_term(E) || E <- tuple_to_list(T)]). + +%%----------------------------------------------------------------------------- +%% Integer types from a range. +%%----------------------------------------------------------------------------- + +%%-define(USE_UNSAFE_RANGES, true). + +-spec t_from_range(rng_elem(), rng_elem()) -> erl_type(). + +-ifdef(USE_UNSAFE_RANGES). + +t_from_range(X, Y) -> + t_from_range_unsafe(X, Y). + +-else. + +t_from_range(neg_inf, pos_inf) -> t_integer(); +t_from_range(neg_inf, Y) when is_integer(Y), Y < 0 -> ?integer_neg; +t_from_range(neg_inf, Y) when is_integer(Y), Y >= 0 -> t_integer(); +t_from_range(X, pos_inf) when is_integer(X), X >= 1 -> ?integer_pos; +t_from_range(X, pos_inf) when is_integer(X), X >= 0 -> ?integer_non_neg; +t_from_range(X, pos_inf) when is_integer(X), X < 0 -> t_integer(); +t_from_range(X, Y) when is_integer(X), is_integer(Y), X > Y -> t_none(); +t_from_range(X, Y) when is_integer(X), is_integer(Y) -> + case ((Y - X) < ?SET_LIMIT) of + true -> t_integers(lists:seq(X, Y)); + false -> + case X >= 0 of + false -> + if Y < 0 -> ?integer_neg; + true -> t_integer() + end; + true -> + if Y =< ?MAX_BYTE, X >= 1 -> ?int_range(1, ?MAX_BYTE); + Y =< ?MAX_BYTE -> t_byte(); + Y =< ?MAX_CHAR, X >= 1 -> ?int_range(1, ?MAX_CHAR); + Y =< ?MAX_CHAR -> t_char(); + X >= 1 -> ?integer_pos; + X >= 0 -> ?integer_non_neg + end + end + end; +t_from_range(pos_inf, neg_inf) -> t_none(). + +-endif. + +-spec t_from_range_unsafe(rng_elem(), rng_elem()) -> erl_type(). + +t_from_range_unsafe(neg_inf, pos_inf) -> t_integer(); +t_from_range_unsafe(neg_inf, Y) -> ?int_range(neg_inf, Y); +t_from_range_unsafe(X, pos_inf) -> ?int_range(X, pos_inf); +t_from_range_unsafe(X, Y) when is_integer(X), is_integer(Y), X =< Y -> + if (Y - X) < ?SET_LIMIT -> t_integers(lists:seq(X, Y)); + true -> ?int_range(X, Y) + end; +t_from_range_unsafe(X, Y) when is_integer(X), is_integer(Y) -> t_none(); +t_from_range_unsafe(pos_inf, neg_inf) -> t_none(). + +-spec t_is_fixnum(erl_type()) -> boolean(). + +t_is_fixnum(?int_range(neg_inf, _)) -> false; +t_is_fixnum(?int_range(_, pos_inf)) -> false; +t_is_fixnum(?int_range(From, To)) -> + is_fixnum(From) andalso is_fixnum(To); +t_is_fixnum(?int_set(Set)) -> + is_fixnum(set_min(Set)) andalso is_fixnum(set_max(Set)); +t_is_fixnum(_) -> false. + +-spec is_fixnum(integer()) -> boolean(). + +is_fixnum(N) when is_integer(N) -> + Bits = ?BITS, + (N =< ((1 bsl (Bits - 1)) - 1)) andalso (N >= -(1 bsl (Bits - 1))). + +infinity_geq(pos_inf, _) -> true; +infinity_geq(_, pos_inf) -> false; +infinity_geq(_, neg_inf) -> true; +infinity_geq(neg_inf, _) -> false; +infinity_geq(A, B) -> A >= B. + +-spec t_is_bitwidth(erl_type()) -> boolean(). + +t_is_bitwidth(?int_range(neg_inf, _)) -> false; +t_is_bitwidth(?int_range(_, pos_inf)) -> false; +t_is_bitwidth(?int_range(From, To)) -> + infinity_geq(From, 0) andalso infinity_geq(?BITS, To); +t_is_bitwidth(?int_set(Set)) -> + infinity_geq(set_min(Set), 0) andalso infinity_geq(?BITS, set_max(Set)); +t_is_bitwidth(_) -> false. + +-spec number_min(erl_type()) -> rng_elem(). + +number_min(Type) -> + number_min(Type, 'universe'). + +-spec number_min(erl_type(), opaques()) -> rng_elem(). + +number_min(Type, Opaques) -> + do_opaque(Type, Opaques, fun number_min2/1). + +number_min2(?int_range(From, _)) -> From; +number_min2(?int_set(Set)) -> set_min(Set); +number_min2(?number(?any, _Tag)) -> neg_inf. + +-spec number_max(erl_type()) -> rng_elem(). + +number_max(Type) -> + number_max(Type, 'universe'). + +-spec number_max(erl_type(), opaques()) -> rng_elem(). + +number_max(Type, Opaques) -> + do_opaque(Type, Opaques, fun number_max2/1). + +number_max2(?int_range(_, To)) -> To; +number_max2(?int_set(Set)) -> set_max(Set); +number_max2(?number(?any, _Tag)) -> pos_inf. + +%% -spec int_range(rgn_elem(), rng_elem()) -> erl_type(). +%% +%% int_range(neg_inf, pos_inf) -> t_integer(); +%% int_range(neg_inf, To) -> ?int_range(neg_inf, To); +%% int_range(From, pos_inf) -> ?int_range(From, pos_inf); +%% int_range(From, To) when From =< To -> t_from_range(From, To); +%% int_range(From, To) when To < From -> ?none. + +in_range(_, ?int_range(neg_inf, pos_inf)) -> true; +in_range(X, ?int_range(From, pos_inf)) -> X >= From; +in_range(X, ?int_range(neg_inf, To)) -> X =< To; +in_range(X, ?int_range(From, To)) -> (X >= From) andalso (X =< To). + +-spec min(rng_elem(), rng_elem()) -> rng_elem(). + +min(neg_inf, _) -> neg_inf; +min(_, neg_inf) -> neg_inf; +min(pos_inf, Y) -> Y; +min(X, pos_inf) -> X; +min(X, Y) when X =< Y -> X; +min(_, Y) -> Y. + +-spec max(rng_elem(), rng_elem()) -> rng_elem(). + +max(neg_inf, Y) -> Y; +max(X, neg_inf) -> X; +max(pos_inf, _) -> pos_inf; +max(_, pos_inf) -> pos_inf; +max(X, Y) when X =< Y -> Y; +max(X, _) -> X. + +expand_range_from_set(Range = ?int_range(From, To), Set) -> + Min = min(set_min(Set), From), + Max = max(set_max(Set), To), + if From =:= Min, To =:= Max -> Range; + true -> t_from_range(Min, Max) + end. + +%%============================================================================= +%% +%% Lattice operations +%% +%%============================================================================= + +%%----------------------------------------------------------------------------- +%% Supremum +%% + +-spec t_sup([erl_type()]) -> erl_type(). + +t_sup([]) -> ?none; +t_sup(Ts) -> + case lists:any(fun is_any/1, Ts) of + true -> ?any; + false -> + t_sup1(Ts, []) + end. + +t_sup1([H1, H2|T], L) -> + t_sup1(T, [t_sup(H1, H2)|L]); +t_sup1([T], []) -> subst_all_vars_to_any(T); +t_sup1(Ts, L) -> + t_sup1(Ts++L, []). + +-spec t_sup(erl_type(), erl_type()) -> erl_type(). + +t_sup(?any, _) -> ?any; +t_sup(_, ?any) -> ?any; +t_sup(?none, T) -> T; +t_sup(T, ?none) -> T; +t_sup(?unit, T) -> T; +t_sup(T, ?unit) -> T; +t_sup(T, T) -> subst_all_vars_to_any(T); +t_sup(?var(_), _) -> ?any; +t_sup(_, ?var(_)) -> ?any; +t_sup(?atom(Set1), ?atom(Set2)) -> + ?atom(set_union(Set1, Set2)); +t_sup(?bitstr(U1, B1), ?bitstr(U2, B2)) -> + t_bitstr(gcd(gcd(U1, U2), abs(B1-B2)), lists:min([B1, B2])); +t_sup(?function(Domain1, Range1), ?function(Domain2, Range2)) -> + %% The domain is either a product or any. + ?function(t_sup(Domain1, Domain2), t_sup(Range1, Range2)); +t_sup(?identifier(Set1), ?identifier(Set2)) -> + ?identifier(set_union(Set1, Set2)); +t_sup(?opaque(Set1), ?opaque(Set2)) -> + sup_opaque(set_to_list(ordsets:union(Set1, Set2))); +%%Disallow unions with opaque types +%%t_sup(T1=?opaque(_,_,_), T2) -> +%% io:format("Debug: t_sup executed with args ~w and ~w~n",[T1, T2]), ?none; +%%t_sup(T1, T2=?opaque(_,_,_)) -> +%% io:format("Debug: t_sup executed with args ~w and ~w~n",[T1, T2]), ?none; +t_sup(?matchstate(Pres1, Slots1), ?matchstate(Pres2, Slots2)) -> + ?matchstate(t_sup(Pres1, Pres2), t_sup(Slots1, Slots2)); +t_sup(?nil, ?nil) -> ?nil; +t_sup(?nil, ?list(Contents, Termination, _)) -> + ?list(Contents, t_sup(?nil, Termination), ?unknown_qual); +t_sup(?list(Contents, Termination, _), ?nil) -> + ?list(Contents, t_sup(?nil, Termination), ?unknown_qual); +t_sup(?list(Contents1, Termination1, Size1), + ?list(Contents2, Termination2, Size2)) -> + NewSize = + case {Size1, Size2} of + {?unknown_qual, ?unknown_qual} -> ?unknown_qual; + {?unknown_qual, ?nonempty_qual} -> ?unknown_qual; + {?nonempty_qual, ?unknown_qual} -> ?unknown_qual; + {?nonempty_qual, ?nonempty_qual} -> ?nonempty_qual + end, + NewContents = t_sup(Contents1, Contents2), + NewTermination = t_sup(Termination1, Termination2), + TmpList = t_cons(NewContents, NewTermination), + case NewSize of + ?nonempty_qual -> TmpList; + ?unknown_qual -> + ?list(FinalContents, FinalTermination, _) = TmpList, + ?list(FinalContents, FinalTermination, ?unknown_qual) + end; +t_sup(?number(_, _), ?number(?any, ?unknown_qual) = T) -> T; +t_sup(?number(?any, ?unknown_qual) = T, ?number(_, _)) -> T; +t_sup(?float, ?float) -> ?float; +t_sup(?float, ?integer(_)) -> t_number(); +t_sup(?integer(_), ?float) -> t_number(); +t_sup(?integer(?any) = T, ?integer(_)) -> T; +t_sup(?integer(_), ?integer(?any) = T) -> T; +t_sup(?int_set(Set1), ?int_set(Set2)) -> + case set_union(Set1, Set2) of + ?any -> + t_from_range(min(set_min(Set1), set_min(Set2)), + max(set_max(Set1), set_max(Set2))); + Set -> ?int_set(Set) + end; +t_sup(?int_range(From1, To1), ?int_range(From2, To2)) -> + t_from_range(min(From1, From2), max(To1, To2)); +t_sup(Range = ?int_range(_, _), ?int_set(Set)) -> + expand_range_from_set(Range, Set); +t_sup(?int_set(Set), Range = ?int_range(_, _)) -> + expand_range_from_set(Range, Set); +t_sup(?product(Types1), ?product(Types2)) -> + L1 = length(Types1), + L2 = length(Types2), + if L1 =:= L2 -> ?product(t_sup_lists(Types1, Types2)); + true -> ?any + end; +t_sup(?product(_), _) -> + ?any; +t_sup(_, ?product(_)) -> + ?any; +t_sup(?tuple(?any, ?any, ?any) = T, ?tuple(_, _, _)) -> T; +t_sup(?tuple(_, _, _), ?tuple(?any, ?any, ?any) = T) -> T; +t_sup(?tuple(?any, ?any, ?any) = T, ?tuple_set(_)) -> T; +t_sup(?tuple_set(_), ?tuple(?any, ?any, ?any) = T) -> T; +t_sup(?tuple(Elements1, Arity, Tag1) = T1, + ?tuple(Elements2, Arity, Tag2) = T2) -> + if Tag1 =:= Tag2 -> t_tuple(t_sup_lists(Elements1, Elements2)); + Tag1 =:= ?any -> t_tuple(t_sup_lists(Elements1, Elements2)); + Tag2 =:= ?any -> t_tuple(t_sup_lists(Elements1, Elements2)); + Tag1 < Tag2 -> ?tuple_set([{Arity, [T1, T2]}]); + Tag1 > Tag2 -> ?tuple_set([{Arity, [T2, T1]}]) + end; +t_sup(?tuple(_, Arity1, _) = T1, ?tuple(_, Arity2, _) = T2) -> + sup_tuple_sets([{Arity1, [T1]}], [{Arity2, [T2]}]); +t_sup(?tuple_set(List1), ?tuple_set(List2)) -> + sup_tuple_sets(List1, List2); +t_sup(?tuple_set(List1), T2 = ?tuple(_, Arity, _)) -> + sup_tuple_sets(List1, [{Arity, [T2]}]); +t_sup(?tuple(_, Arity, _) = T1, ?tuple_set(List2)) -> + sup_tuple_sets([{Arity, [T1]}], List2); +t_sup(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B) -> + Pairs = + map_pairwise_merge( + fun(K, MNess, V1, MNess, V2) -> {K, MNess, t_sup(V1, V2)}; + (K, _, V1, _, V2) -> {K, ?opt, t_sup(V1, V2)} + end, A, B), + t_map(Pairs, t_sup(ADefK, BDefK), t_sup(ADefV, BDefV)); +t_sup(T1, T2) -> + ?union(U1) = force_union(T1), + ?union(U2) = force_union(T2), + sup_union(U1, U2). + +sup_opaque([]) -> ?none; +sup_opaque(List) -> + L = sup_opaq(List), + ?opaque(ordsets:from_list(L)). + +sup_opaq(L0) -> + L1 = [{{Mod,Name,Args}, T} || + #opaque{mod = Mod, name = Name, args = Args}=T <- L0], + F = family(L1), + [supl(Ts) || {_, Ts} <- F]. + +supl([O]) -> O; +supl(Ts) -> supl(Ts, t_none()). + +supl([#opaque{struct = S}=O|L], S0) -> + S1 = t_sup(S, S0), + case L =:= [] of + true -> O#opaque{struct = S1}; + false -> supl(L, S1) + end. + +-spec t_sup_lists([erl_type()], [erl_type()]) -> [erl_type()]. + +t_sup_lists([T1|Left1], [T2|Left2]) -> + [t_sup(T1, T2)|t_sup_lists(Left1, Left2)]; +t_sup_lists([], []) -> + []. + +sup_tuple_sets(L1, L2) -> + TotalArities = ordsets:union([Arity || {Arity, _} <- L1], + [Arity || {Arity, _} <- L2]), + if length(TotalArities) > ?TUPLE_ARITY_LIMIT -> t_tuple(); + true -> + case sup_tuple_sets(L1, L2, []) of + [{_Arity, [OneTuple = ?tuple(_, _, _)]}] -> OneTuple; + List -> ?tuple_set(List) + end + end. + +sup_tuple_sets([{Arity, Tuples1}|Left1], [{Arity, Tuples2}|Left2], Acc) -> + NewAcc = [{Arity, sup_tuples_in_set(Tuples1, Tuples2)}|Acc], + sup_tuple_sets(Left1, Left2, NewAcc); +sup_tuple_sets([{Arity1, _} = T1|Left1] = L1, + [{Arity2, _} = T2|Left2] = L2, Acc) -> + if Arity1 < Arity2 -> sup_tuple_sets(Left1, L2, [T1|Acc]); + Arity1 > Arity2 -> sup_tuple_sets(L1, Left2, [T2|Acc]) + end; +sup_tuple_sets([], L2, Acc) -> lists:reverse(Acc, L2); +sup_tuple_sets(L1, [], Acc) -> lists:reverse(Acc, L1). + +sup_tuples_in_set([?tuple(_, _, ?any) = T], L) -> + [t_tuple(sup_tuple_elements([T|L]))]; +sup_tuples_in_set(L, [?tuple(_, _, ?any) = T]) -> + [t_tuple(sup_tuple_elements([T|L]))]; +sup_tuples_in_set(L1, L2) -> + FoldFun = fun(?tuple(_, _, Tag), AccTag) -> t_sup(Tag, AccTag) end, + TotalTag0 = lists:foldl(FoldFun, ?none, L1), + TotalTag = lists:foldl(FoldFun, TotalTag0, L2), + case TotalTag of + ?atom(?any) -> + %% We will reach the set limit. Widen now. + [t_tuple(sup_tuple_elements(L1 ++ L2))]; + ?atom(Set) -> + case set_size(Set) > ?TUPLE_TAG_LIMIT of + true -> + %% We will reach the set limit. Widen now. + [t_tuple(sup_tuple_elements(L1 ++ L2))]; + false -> + %% We can go on and build the tuple set. + sup_tuples_in_set(L1, L2, []) + end + end. + +sup_tuple_elements([?tuple(Elements, _, _)|L]) -> + lists:foldl(fun (?tuple(Es, _, _), Acc) -> t_sup_lists(Es, Acc) end, + Elements, L). + +sup_tuples_in_set([?tuple(Elements1, Arity, Tag1) = T1|Left1] = L1, + [?tuple(Elements2, Arity, Tag2) = T2|Left2] = L2, Acc) -> + if + Tag1 < Tag2 -> sup_tuples_in_set(Left1, L2, [T1|Acc]); + Tag1 > Tag2 -> sup_tuples_in_set(L1, Left2, [T2|Acc]); + Tag2 =:= Tag2 -> NewElements = t_sup_lists(Elements1, Elements2), + NewAcc = [?tuple(NewElements, Arity, Tag1)|Acc], + sup_tuples_in_set(Left1, Left2, NewAcc) + end; +sup_tuples_in_set([], L2, Acc) -> lists:reverse(Acc, L2); +sup_tuples_in_set(L1, [], Acc) -> lists:reverse(Acc, L1). + +sup_union(U1, U2) -> + sup_union(U1, U2, 0, []). + +sup_union([?none|Left1], [?none|Left2], N, Acc) -> + sup_union(Left1, Left2, N, [?none|Acc]); +sup_union([T1|Left1], [T2|Left2], N, Acc) -> + sup_union(Left1, Left2, N+1, [t_sup(T1, T2)|Acc]); +sup_union([], [], N, Acc) -> + if N =:= 0 -> ?none; + N =:= 1 -> + [Type] = [T || T <- Acc, T =/= ?none], + Type; + N =:= length(Acc) -> ?any; + true -> ?union(lists:reverse(Acc)) + end. + +force_union(T = ?atom(_)) -> ?atom_union(T); +force_union(T = ?bitstr(_, _)) -> ?bitstr_union(T); +force_union(T = ?function(_, _)) -> ?function_union(T); +force_union(T = ?identifier(_)) -> ?identifier_union(T); +force_union(T = ?list(_, _, _)) -> ?list_union(T); +force_union(T = ?nil) -> ?list_union(T); +force_union(T = ?number(_, _)) -> ?number_union(T); +force_union(T = ?opaque(_)) -> ?opaque_union(T); +force_union(T = ?map(_,_,_)) -> ?map_union(T); +force_union(T = ?tuple(_, _, _)) -> ?tuple_union(T); +force_union(T = ?tuple_set(_)) -> ?tuple_union(T); +force_union(T = ?matchstate(_, _)) -> ?matchstate_union(T); +force_union(T = ?union(_)) -> T. + +%%----------------------------------------------------------------------------- +%% An attempt to write the inverse operation of t_sup/1 -- XXX: INCOMPLETE !! +%% + +-spec t_elements(erl_type()) -> [erl_type()]. + +t_elements(?none) -> []; +t_elements(?unit) -> []; +t_elements(?any = T) -> [T]; +t_elements(?nil = T) -> [T]; +t_elements(?atom(?any) = T) -> [T]; +t_elements(?atom(Atoms)) -> + [t_atom(A) || A <- Atoms]; +t_elements(?bitstr(_, _) = T) -> [T]; +t_elements(?function(_, _) = T) -> [T]; +t_elements(?identifier(?any) = T) -> [T]; +t_elements(?identifier(IDs)) -> + [?identifier([T]) || T <- IDs]; +t_elements(?list(_, _, _) = T) -> [T]; +t_elements(?number(_, _) = T) -> + case T of + ?number(?any, ?unknown_qual) -> + [?float, ?integer(?any)]; + ?float -> [T]; + ?integer(?any) -> [T]; + ?int_range(_, _) -> [T]; + ?int_set(Set) -> + [t_integer(I) || I <- Set] + end; +t_elements(?opaque(_) = T) -> + do_elements(T); +t_elements(?map(_,_,_) = T) -> [T]; +t_elements(?tuple(_, _, _) = T) -> [T]; +t_elements(?tuple_set(_) = TS) -> + case t_tuple_subtypes(TS) of + unknown -> []; + Elems -> Elems + end; +t_elements(?union(_) = T) -> + do_elements(T); +t_elements(?var(_)) -> [?any]. %% yes, vars exist -- what else to do here? +%% t_elements(T) -> +%% io:format("T_ELEMENTS => ~p\n", [T]). + +do_elements(Type0) -> + case do_opaque(Type0, 'universe', fun(T) -> T end) of + ?union(List) -> lists:append([t_elements(T) || T <- List]); + Type -> t_elements(Type) + end. + +%%----------------------------------------------------------------------------- +%% Infimum +%% + +-spec t_inf([erl_type()]) -> erl_type(). + +t_inf([H1, H2|T]) -> + case t_inf(H1, H2) of + ?none -> ?none; + NewH -> t_inf([NewH|T]) + end; +t_inf([H]) -> H; +t_inf([]) -> ?none. + +-spec t_inf(erl_type(), erl_type()) -> erl_type(). + +t_inf(T1, T2) -> + t_inf(T1, T2, 'universe'). + +%% 'match' should be used from t_find_unknown_opaque() only +-type t_inf_opaques() :: opaques() | {'match', [erl_type() | 'universe']}. + +-spec t_inf(erl_type(), erl_type(), t_inf_opaques()) -> erl_type(). + +t_inf(?var(_), ?var(_), _Opaques) -> ?any; +t_inf(?var(_), T, _Opaques) -> subst_all_vars_to_any(T); +t_inf(T, ?var(_), _Opaques) -> subst_all_vars_to_any(T); +t_inf(?any, T, _Opaques) -> subst_all_vars_to_any(T); +t_inf(T, ?any, _Opaques) -> subst_all_vars_to_any(T); +t_inf(?none, _, _Opaques) -> ?none; +t_inf(_, ?none, _Opaques) -> ?none; +t_inf(?unit, _, _Opaques) -> ?unit; % ?unit cases should appear below ?none +t_inf(_, ?unit, _Opaques) -> ?unit; +t_inf(T, T, _Opaques) -> subst_all_vars_to_any(T); +t_inf(?atom(Set1), ?atom(Set2), _) -> + case set_intersection(Set1, Set2) of + ?none -> ?none; + NewSet -> ?atom(NewSet) + end; +t_inf(?bitstr(U1, B1), ?bitstr(0, B2), _Opaques) -> + if B2 >= B1 andalso (B2-B1) rem U1 =:= 0 -> t_bitstr(0, B2); + true -> ?none + end; +t_inf(?bitstr(0, B1), ?bitstr(U2, B2), _Opaques) -> + if B1 >= B2 andalso (B1-B2) rem U2 =:= 0 -> t_bitstr(0, B1); + true -> ?none + end; +t_inf(?bitstr(U1, B1), ?bitstr(U1, B1), _Opaques) -> + t_bitstr(U1, B1); +t_inf(?bitstr(U1, B1), ?bitstr(U2, B2), _Opaques) when U2 > U1 -> + inf_bitstr(U2, B2, U1, B1); +t_inf(?bitstr(U1, B1), ?bitstr(U2, B2), _Opaques) -> + inf_bitstr(U1, B1, U2, B2); +t_inf(?function(Domain1, Range1), ?function(Domain2, Range2), Opaques) -> + case t_inf(Domain1, Domain2, Opaques) of + ?none -> ?none; + Domain -> ?function(Domain, t_inf(Range1, Range2, Opaques)) + end; +t_inf(?identifier(Set1), ?identifier(Set2), _Opaques) -> + case set_intersection(Set1, Set2) of + ?none -> ?none; + Set -> ?identifier(Set) + end; +t_inf(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B, _Opaques) -> + %% Because it simplifies the anonymous function, we allow Pairs to temporarily + %% contain mandatory pairs with none values, since all such cases should + %% result in a none result. + Pairs = + map_pairwise_merge( + %% For optional keys in both maps, when the infinimum is none, we have + %% essentially concluded that K must not be a key in the map. + fun(K, ?opt, V1, ?opt, V2) -> {K, ?opt, t_inf(V1, V2)}; + %% When a key is optional in one map, but mandatory in another, it + %% becomes mandatory in the infinumum + (K, _, V1, _, V2) -> {K, ?mand, t_inf(V1, V2)} + end, A, B), + %% If the infinimum of any mandatory values is ?none, the entire map infinimum + %% is ?none. + case lists:any(fun({_,?mand,?none})->true; ({_,_,_}) -> false end, Pairs) of + true -> t_none(); + false -> t_map(Pairs, t_inf(ADefK, BDefK), t_inf(ADefV, BDefV)) + end; +t_inf(?matchstate(Pres1, Slots1), ?matchstate(Pres2, Slots2), _Opaques) -> + ?matchstate(t_inf(Pres1, Pres2), t_inf(Slots1, Slots2)); +t_inf(?nil, ?nil, _Opaques) -> ?nil; +t_inf(?nil, ?nonempty_list(_, _), _Opaques) -> + ?none; +t_inf(?nonempty_list(_, _), ?nil, _Opaques) -> + ?none; +t_inf(?nil, ?list(_Contents, Termination, _), Opaques) -> + t_inf(?nil, t_unopaque(Termination), Opaques); +t_inf(?list(_Contents, Termination, _), ?nil, Opaques) -> + t_inf(?nil, t_unopaque(Termination), Opaques); +t_inf(?list(Contents1, Termination1, Size1), + ?list(Contents2, Termination2, Size2), Opaques) -> + case t_inf(Termination1, Termination2, Opaques) of + ?none -> ?none; + Termination -> + case t_inf(Contents1, Contents2, Opaques) of + ?none -> + %% If none of the lists are nonempty, then the infimum is nil. + case (Size1 =:= ?unknown_qual) andalso (Size2 =:= ?unknown_qual) of + true -> t_nil(); + false -> ?none + end; + Contents -> + Size = + case {Size1, Size2} of + {?unknown_qual, ?unknown_qual} -> ?unknown_qual; + {?unknown_qual, ?nonempty_qual} -> ?nonempty_qual; + {?nonempty_qual, ?unknown_qual} -> ?nonempty_qual; + {?nonempty_qual, ?nonempty_qual} -> ?nonempty_qual + end, + ?list(Contents, Termination, Size) + end + end; +t_inf(?number(_, _) = T1, ?number(_, _) = T2, _Opaques) -> + case {T1, T2} of + {T, T} -> T; + {_, ?number(?any, ?unknown_qual)} -> T1; + {?number(?any, ?unknown_qual), _} -> T2; + {?float, ?integer(_)} -> ?none; + {?integer(_), ?float} -> ?none; + {?integer(?any), ?integer(_)} -> T2; + {?integer(_), ?integer(?any)} -> T1; + {?int_set(Set1), ?int_set(Set2)} -> + case set_intersection(Set1, Set2) of + ?none -> ?none; + Set -> ?int_set(Set) + end; + {?int_range(From1, To1), ?int_range(From2, To2)} -> + t_from_range(max(From1, From2), min(To1, To2)); + {Range = ?int_range(_, _), ?int_set(Set)} -> + %% io:format("t_inf range, set args ~p ~p ~n", [T1, T2]), + Ans2 = + case set_filter(fun(X) -> in_range(X, Range) end, Set) of + ?none -> ?none; + NewSet -> ?int_set(NewSet) + end, + %% io:format("Ans2 ~p ~n", [Ans2]), + Ans2; + {?int_set(Set), ?int_range(_, _) = Range} -> + case set_filter(fun(X) -> in_range(X, Range) end, Set) of + ?none -> ?none; + NewSet -> ?int_set(NewSet) + end + end; +t_inf(?product(Types1), ?product(Types2), Opaques) -> + L1 = length(Types1), + L2 = length(Types2), + if L1 =:= L2 -> ?product(t_inf_lists(Types1, Types2, Opaques)); + true -> ?none + end; +t_inf(?product(_), _, _Opaques) -> + ?none; +t_inf(_, ?product(_), _Opaques) -> + ?none; +t_inf(?tuple(?any, ?any, ?any), ?tuple(_, _, _) = T, _Opaques) -> + subst_all_vars_to_any(T); +t_inf(?tuple(_, _, _) = T, ?tuple(?any, ?any, ?any), _Opaques) -> + subst_all_vars_to_any(T); +t_inf(?tuple(?any, ?any, ?any), ?tuple_set(_) = T, _Opaques) -> + subst_all_vars_to_any(T); +t_inf(?tuple_set(_) = T, ?tuple(?any, ?any, ?any), _Opaques) -> + subst_all_vars_to_any(T); +t_inf(?tuple(Elements1, Arity, _Tag1), ?tuple(Elements2, Arity, _Tag2), Opaques) -> + case t_inf_lists_strict(Elements1, Elements2, Opaques) of + bottom -> ?none; + NewElements -> t_tuple(NewElements) + end; +t_inf(?tuple_set(List1), ?tuple_set(List2), Opaques) -> + inf_tuple_sets(List1, List2, Opaques); +t_inf(?tuple_set(List), ?tuple(_, Arity, _) = T, Opaques) -> + inf_tuple_sets(List, [{Arity, [T]}], Opaques); +t_inf(?tuple(_, Arity, _) = T, ?tuple_set(List), Opaques) -> + inf_tuple_sets(List, [{Arity, [T]}], Opaques); +%% be careful: here and in the next clause T can be ?opaque +t_inf(?union(U1), T, Opaques) -> + ?union(U2) = force_union(T), + inf_union(U1, U2, Opaques); +t_inf(T, ?union(U2), Opaques) -> + ?union(U1) = force_union(T), + inf_union(U1, U2, Opaques); +t_inf(?opaque(Set1), ?opaque(Set2), Opaques) -> + inf_opaque(Set1, Set2, Opaques); +t_inf(?opaque(_) = T1, T2, Opaques) -> + inf_opaque1(T2, T1, 1, Opaques); +t_inf(T1, ?opaque(_) = T2, Opaques) -> + inf_opaque1(T1, T2, 2, Opaques); +%% and as a result, the cases for ?opaque should appear *after* ?union +t_inf(#c{}, #c{}, _) -> + ?none. + +inf_opaque1(T1, ?opaque(Set2)=T2, Pos, Opaques) -> + case Opaques =:= 'universe' orelse inf_is_opaque_type(T2, Pos, Opaques) of + false -> ?none; + true -> + List2 = set_to_list(Set2), + case inf_collect(T1, List2, Opaques, []) of + [] -> ?none; + OpL -> ?opaque(ordsets:from_list(OpL)) + end + end. + +inf_is_opaque_type(T, Pos, {match, Opaques}) -> + is_opaque_type(T, Opaques) orelse throw({pos, [Pos]}); +inf_is_opaque_type(T, _Pos, Opaques) -> + is_opaque_type(T, Opaques). + +inf_collect(T1, [T2|List2], Opaques, OpL) -> + #opaque{struct = S2} = T2, + case t_inf(T1, S2, Opaques) of + ?none -> inf_collect(T1, List2, Opaques, OpL); + Inf -> + Op = T2#opaque{struct = Inf}, + inf_collect(T1, List2, Opaques, [Op|OpL]) + end; +inf_collect(_T1, [], _Opaques, OpL) -> + OpL. + +combine(S, T1, T2) -> + #opaque{mod = Mod1, name = Name1, args = Args1} = T1, + #opaque{mod = Mod2, name = Name2, args = Args2} = T2, + Comb1 = comb(Mod1, Name1, Args1, S, T1), + case is_compat_opaque_names({Mod1, Name1, Args1}, {Mod2, Name2, Args2}) of + true -> Comb1; + false -> Comb1 ++ comb(Mod2, Name2, Args2, S, T2) + end. + +comb(Mod, Name, Args, S, T) -> + case can_combine_opaque_names(Mod, Name, Args, S) of + true -> + ?opaque(Set) = S, + Set; + false -> + [T#opaque{struct = S}] + end. + +can_combine_opaque_names(Mod1, Name1, Args1, + ?opaque([#opaque{mod = Mod2, name = Name2, args = Args2}])) -> + is_compat_opaque_names({Mod1, Name1, Args1}, {Mod2, Name2, Args2}); +can_combine_opaque_names(_, _, _, _) -> false. + +%% Combining two lists this way can be very time consuming... +%% Note: two parameterized opaque types are not the same if their +%% actual parameters differ +inf_opaque(Set1, Set2, Opaques) -> + List1 = inf_look_up(Set1, Opaques), + List2 = inf_look_up(Set2, Opaques), + List0 = [combine(Inf, T1, T2) || + {Is1, ModNameArgs1, T1} <- List1, + {Is2, ModNameArgs2, T2} <- List2, + not t_is_none(Inf = inf_opaque_types(Is1, ModNameArgs1, T1, + Is2, ModNameArgs2, T2, + Opaques))], + List = lists:sort(lists:append(List0)), + sup_opaque(List). + +%% Optimization: do just one lookup. +inf_look_up(Set, Opaques) -> + [{Opaques =:= 'universe' orelse inf_is_opaque_type2(T, Opaques), + {M, N, Args}, T} || + #opaque{mod = M, name = N, args = Args} = T <- set_to_list(Set)]. + +inf_is_opaque_type2(T, {match, Opaques}) -> + is_opaque_type2(T, Opaques); +inf_is_opaque_type2(T, Opaques) -> + is_opaque_type2(T, Opaques). + +inf_opaque_types(IsOpaque1, ModNameArgs1, T1, + IsOpaque2, ModNameArgs2, T2, Opaques) -> + #opaque{struct = S1}=T1, + #opaque{struct = S2}=T2, + case + Opaques =:= 'universe' orelse + is_compat_opaque_names(ModNameArgs1, ModNameArgs2) + of + true -> t_inf(S1, S2, Opaques); + false -> + case {IsOpaque1, IsOpaque2} of + {true, true} -> t_inf(S1, S2, Opaques); + {true, false} -> t_inf(S1, ?opaque(set_singleton(T2)), Opaques); + {false, true} -> t_inf(?opaque(set_singleton(T1)), S2, Opaques); + {false, false} when element(1, Opaques) =:= match -> + throw({pos, [1, 2]}); + {false, false} -> t_none() + end + end. + +is_compat_opaque_names(ModNameArgs, ModNameArgs) -> true; +is_compat_opaque_names({Mod,Name,Args1}, {Mod,Name,Args2}) -> + is_compat_args(Args1, Args2); +is_compat_opaque_names(_, _) -> false. + +is_compat_args([A1|Args1], [A2|Args2]) -> + is_compat_arg(A1, A2) andalso is_compat_args(Args1, Args2); +is_compat_args([], []) -> true; +is_compat_args(_, _) -> false. + +is_compat_arg(A1, A2) -> + is_specialization(A1, A2) orelse is_specialization(A2, A1). + +-spec is_specialization(erl_type(), erl_type()) -> boolean(). + +%% Returns true if the first argument is a specialization of the +%% second argument in the sense that every type is a specialization of +%% any(). For example, {_,_} is a specialization of any(), but not of +%% tuple(). Does not handle variables, but any() and unions (sort of). + +is_specialization(T, T) -> true; +is_specialization(_, ?any) -> true; +is_specialization(?any, _) -> false; +is_specialization(?function(Domain1, Range1), ?function(Domain2, Range2)) -> + (is_specialization(Domain1, Domain2) andalso + is_specialization(Range1, Range2)); +is_specialization(?list(Contents1, Termination1, Size1), + ?list(Contents2, Termination2, Size2)) -> + (Size1 =:= Size2 andalso + is_specialization(Contents1, Contents2) andalso + is_specialization(Termination1, Termination2)); +is_specialization(?product(Types1), ?product(Types2)) -> + specialization_list(Types1, Types2); +is_specialization(?tuple(?any, ?any, ?any), ?tuple(_, _, _)) -> false; +is_specialization(?tuple(_, _, _), ?tuple(?any, ?any, ?any)) -> false; +is_specialization(?tuple(Elements1, Arity, _), + ?tuple(Elements2, Arity, _)) when Arity =/= ?any -> + specialization_list(Elements1, Elements2); +is_specialization(?tuple_set([{Arity, List}]), + ?tuple(Elements2, Arity, _)) when Arity =/= ?any -> + specialization_list(sup_tuple_elements(List), Elements2); +is_specialization(?tuple(Elements1, Arity, _), + ?tuple_set([{Arity, List}])) when Arity =/= ?any -> + specialization_list(Elements1, sup_tuple_elements(List)); +is_specialization(?tuple_set(List1), ?tuple_set(List2)) -> + try + specialization_list_list([sup_tuple_elements(T) || {_Arity, T} <- List1], + [sup_tuple_elements(T) || {_Arity, T} <- List2]) + catch _:_ -> false + end; +is_specialization(?union(List1)=T1, ?union(List2)=T2) -> + case specialization_union2(T1, T2) of + {yes, Type1, Type2} -> is_specialization(Type1, Type2); + no -> specialization_list(List1, List2) + end; +is_specialization(?union(List), T2) -> + case unify_union(List) of + {yes, Type} -> is_specialization(Type, T2); + no -> false + end; +is_specialization(T1, ?union(List)) -> + case unify_union(List) of + {yes, Type} -> is_specialization(T1, Type); + no -> false + end; +is_specialization(?opaque(_) = T1, T2) -> + is_specialization(t_opaque_structure(T1), T2); +is_specialization(T1, ?opaque(_) = T2) -> + is_specialization(T1, t_opaque_structure(T2)); +is_specialization(?var(_), _) -> exit(error); +is_specialization(_, ?var(_)) -> exit(error); +is_specialization(?none, _) -> false; +is_specialization(_, ?none) -> false; +is_specialization(?unit, _) -> false; +is_specialization(_, ?unit) -> false; +is_specialization(#c{}, #c{}) -> false. + +specialization_list_list(LL1, LL2) -> + length(LL1) =:= length(LL2) andalso specialization_list_list1(LL1, LL2). + +specialization_list_list1([], []) -> true; +specialization_list_list1([L1|LL1], [L2|LL2]) -> + specialization_list(L1, L2) andalso specialization_list_list1(LL1, LL2). + +specialization_list(L1, L2) -> + length(L1) =:= length(L2) andalso specialization_list1(L1, L2). + +specialization_list1([], []) -> true; +specialization_list1([T1|L1], [T2|L2]) -> + is_specialization(T1, T2) andalso specialization_list1(L1, L2). + +specialization_union2(?union(List1)=T1, ?union(List2)=T2) -> + case {unify_union(List1), unify_union(List2)} of + {{yes, Type1}, {yes, Type2}} -> {yes, Type1, Type2}; + {{yes, Type1}, no} -> {yes, Type1, T2}; + {no, {yes, Type2}} -> {yes, T1, Type2}; + {no, no} -> no + end. + +-spec t_inf_lists([erl_type()], [erl_type()]) -> [erl_type()]. + +t_inf_lists(L1, L2) -> + t_inf_lists(L1, L2, 'universe'). + +-spec t_inf_lists([erl_type()], [erl_type()], t_inf_opaques()) -> [erl_type()]. + +t_inf_lists(L1, L2, Opaques) -> + t_inf_lists(L1, L2, [], Opaques). + +-spec t_inf_lists([erl_type()], [erl_type()], [erl_type()], [erl_type()]) -> [erl_type()]. + +t_inf_lists([T1|Left1], [T2|Left2], Acc, Opaques) -> + t_inf_lists(Left1, Left2, [t_inf(T1, T2, Opaques)|Acc], Opaques); +t_inf_lists([], [], Acc, _Opaques) -> + lists:reverse(Acc). + +%% Infimum of lists with strictness. +%% If any element is the ?none type, the value 'bottom' is returned. + +-spec t_inf_lists_strict([erl_type()], [erl_type()], [erl_type()]) -> 'bottom' | [erl_type()]. + +t_inf_lists_strict(L1, L2, Opaques) -> + t_inf_lists_strict(L1, L2, [], Opaques). + +-spec t_inf_lists_strict([erl_type()], [erl_type()], [erl_type()], [erl_type()]) -> 'bottom' | [erl_type()]. + +t_inf_lists_strict([T1|Left1], [T2|Left2], Acc, Opaques) -> + case t_inf(T1, T2, Opaques) of + ?none -> bottom; + T -> t_inf_lists_strict(Left1, Left2, [T|Acc], Opaques) + end; +t_inf_lists_strict([], [], Acc, _Opaques) -> + lists:reverse(Acc). + +inf_tuple_sets(L1, L2, Opaques) -> + case inf_tuple_sets(L1, L2, [], Opaques) of + [] -> ?none; + [{_Arity, [?tuple(_, _, _) = OneTuple]}] -> OneTuple; + List -> ?tuple_set(List) + end. + +inf_tuple_sets([{Arity, Tuples1}|Ts1], [{Arity, Tuples2}|Ts2], Acc, Opaques) -> + case inf_tuples_in_sets(Tuples1, Tuples2, Opaques) of + [] -> inf_tuple_sets(Ts1, Ts2, Acc, Opaques); + [?tuple_set([{Arity, NewTuples}])] -> + inf_tuple_sets(Ts1, Ts2, [{Arity, NewTuples}|Acc], Opaques); + NewTuples -> inf_tuple_sets(Ts1, Ts2, [{Arity, NewTuples}|Acc], Opaques) + end; +inf_tuple_sets([{Arity1, _}|Ts1] = L1, [{Arity2, _}|Ts2] = L2, Acc, Opaques) -> + if Arity1 < Arity2 -> inf_tuple_sets(Ts1, L2, Acc, Opaques); + Arity1 > Arity2 -> inf_tuple_sets(L1, Ts2, Acc, Opaques) + end; +inf_tuple_sets([], _, Acc, _Opaques) -> lists:reverse(Acc); +inf_tuple_sets(_, [], Acc, _Opaques) -> lists:reverse(Acc). + +inf_tuples_in_sets([?tuple(Elements1, _, ?any)], L2, Opaques) -> + NewList = [t_inf_lists_strict(Elements1, Elements2, Opaques) + || ?tuple(Elements2, _, _) <- L2], + [t_tuple(Es) || Es <- NewList, Es =/= bottom]; +inf_tuples_in_sets(L1, [?tuple(Elements2, _, ?any)], Opaques) -> + NewList = [t_inf_lists_strict(Elements1, Elements2, Opaques) + || ?tuple(Elements1, _, _) <- L1], + [t_tuple(Es) || Es <- NewList, Es =/= bottom]; +inf_tuples_in_sets(L1, L2, Opaques) -> + inf_tuples_in_sets2(L1, L2, [], Opaques). + +inf_tuples_in_sets2([?tuple(Elements1, Arity, Tag)|Ts1], + [?tuple(Elements2, Arity, Tag)|Ts2], Acc, Opaques) -> + case t_inf_lists_strict(Elements1, Elements2, Opaques) of + bottom -> inf_tuples_in_sets2(Ts1, Ts2, Acc, Opaques); + NewElements -> + inf_tuples_in_sets2(Ts1, Ts2, [?tuple(NewElements, Arity, Tag)|Acc], + Opaques) + end; +inf_tuples_in_sets2([?tuple(_, _, Tag1)|Ts1] = L1, + [?tuple(_, _, Tag2)|Ts2] = L2, Acc, Opaques) -> + if Tag1 < Tag2 -> inf_tuples_in_sets2(Ts1, L2, Acc, Opaques); + Tag1 > Tag2 -> inf_tuples_in_sets2(L1, Ts2, Acc, Opaques) + end; +inf_tuples_in_sets2([], _, Acc, _Opaques) -> lists:reverse(Acc); +inf_tuples_in_sets2(_, [], Acc, _Opaques) -> lists:reverse(Acc). + +inf_union(U1, U2, Opaques) -> + OpaqueFun = + fun(Union1, Union2, InfFun) -> + [_,_,_,_,_,_,_,_,Opaque,_] = Union1, + [A,B,F,I,L,N,T,M,_,Map] = Union2, + List = [A,B,F,I,L,N,T,M,Map], + inf_union_collect(List, Opaque, InfFun, [], []) + end, + {O1, ThrowList1} = + OpaqueFun(U1, U2, fun(E, Opaque) -> t_inf(Opaque, E, Opaques) end), + {O2, ThrowList2} + = OpaqueFun(U2, U1, fun(E, Opaque) -> t_inf(E, Opaque, Opaques) end), + {Union, ThrowList3} = inf_union(U1, U2, 0, [], [], Opaques), + ThrowList = lists:merge3(ThrowList1, ThrowList2, ThrowList3), + case t_sup([O1, O2, Union]) of + ?none when ThrowList =/= [] -> throw({pos, lists:usort(ThrowList)}); + Sup -> Sup + end. + +inf_union_collect([], _Opaque, _InfFun, InfList, ThrowList) -> + {t_sup(InfList), lists:usort(ThrowList)}; +inf_union_collect([?none|L], Opaque, InfFun, InfList, ThrowList) -> + inf_union_collect(L, Opaque, InfFun, [?none|InfList], ThrowList); +inf_union_collect([E|L], Opaque, InfFun, InfList, ThrowList) -> + try InfFun(E, Opaque)of + Inf -> + inf_union_collect(L, Opaque, InfFun, [Inf|InfList], ThrowList) + catch throw:{pos, Ns} -> + inf_union_collect(L, Opaque, InfFun, InfList, Ns ++ ThrowList) + end. + +inf_union([?none|Left1], [?none|Left2], N, Acc, ThrowList, Opaques) -> + inf_union(Left1, Left2, N, [?none|Acc], ThrowList, Opaques); +inf_union([T1|Left1], [T2|Left2], N, Acc, ThrowList, Opaques) -> + try t_inf(T1, T2, Opaques) of + ?none -> inf_union(Left1, Left2, N, [?none|Acc], ThrowList, Opaques); + T -> inf_union(Left1, Left2, N+1, [T|Acc], ThrowList, Opaques) + catch throw:{pos, Ns} -> + inf_union(Left1, Left2, N, [?none|Acc], Ns ++ ThrowList, Opaques) + end; +inf_union([], [], N, Acc, ThrowList, _Opaques) -> + if N =:= 0 -> {?none, ThrowList}; + N =:= 1 -> + [Type] = [T || T <- Acc, T =/= ?none], + {Type, ThrowList}; + N >= 2 -> {?union(lists:reverse(Acc)), ThrowList} + end. + +inf_bitstr(U1, B1, U2, B2) -> + GCD = gcd(U1, U2), + case (B2-B1) rem GCD of + 0 -> + U = (U1*U2) div GCD, + B = findfirst(0, 0, U1, B1, U2, B2), + t_bitstr(U, B); + _ -> + ?none + end. + +findfirst(N1, N2, U1, B1, U2, B2) -> + Val1 = U1*N1+B1, + Val2 = U2*N2+B2, + if Val1 =:= Val2 -> + Val1; + Val1 > Val2 -> + findfirst(N1, N2+1, U1, B1, U2, B2); + Val1 < Val2 -> + findfirst(N1+1, N2, U1, B1, U2, B2) + end. + +%%----------------------------------------------------------------------------- +%% Substitution of variables +%% + +-type subst_table() :: #{any() => erl_type()}. + +-spec t_subst(erl_type(), subst_table()) -> erl_type(). + +t_subst(T, Map) -> + case t_has_var(T) of + true -> t_subst_aux(T, Map); + false -> T + end. + +-spec subst_all_vars_to_any(erl_type()) -> erl_type(). + +subst_all_vars_to_any(T) -> + t_subst(T, #{}). + +t_subst_aux(?var(Id), Map) -> + case maps:find(Id, Map) of + error -> ?any; + {ok, Type} -> Type + end; +t_subst_aux(?list(Contents, Termination, Size), Map) -> + case t_subst_aux(Contents, Map) of + ?none -> ?none; + NewContents -> + %% Be careful here to make the termination collapse if necessary. + case t_subst_aux(Termination, Map) of + ?nil -> ?list(NewContents, ?nil, Size); + ?any -> ?list(NewContents, ?any, Size); + Other -> + ?list(NewContents2, NewTermination, _) = t_cons(NewContents, Other), + ?list(NewContents2, NewTermination, Size) + end + end; +t_subst_aux(?function(Domain, Range), Map) -> + ?function(t_subst_aux(Domain, Map), t_subst_aux(Range, Map)); +t_subst_aux(?product(Types), Map) -> + ?product([t_subst_aux(T, Map) || T <- Types]); +t_subst_aux(?tuple(?any, ?any, ?any) = T, _Map) -> + T; +t_subst_aux(?tuple(Elements, _Arity, _Tag), Map) -> + t_tuple([t_subst_aux(E, Map) || E <- Elements]); +t_subst_aux(?tuple_set(_) = TS, Map) -> + t_sup([t_subst_aux(T, Map) || T <- t_tuple_subtypes(TS)]); +t_subst_aux(?map(Pairs, DefK, DefV), Map) -> + t_map([{K, MNess, t_subst_aux(V, Map)} || {K, MNess, V} <- Pairs], + t_subst_aux(DefK, Map), t_subst_aux(DefV, Map)); +t_subst_aux(?opaque(Es), Map) -> + List = [Opaque#opaque{args = [t_subst_aux(Arg, Map) || Arg <- Args], + struct = t_subst_aux(S, Map)} || + Opaque = #opaque{args = Args, struct = S} <- set_to_list(Es)], + ?opaque(ordsets:from_list(List)); +t_subst_aux(?union(List), Map) -> + ?union([t_subst_aux(E, Map) || E <- List]); +t_subst_aux(T, _Map) -> + T. + +%%----------------------------------------------------------------------------- +%% Unification +%% + +-type t_unify_ret() :: {erl_type(), [{_, erl_type()}]}. + +-spec t_unify(erl_type(), erl_type()) -> t_unify_ret(). + +t_unify(T1, T2) -> + {T, VarMap} = t_unify(T1, T2, #{}), + {t_subst(T, VarMap), lists:keysort(1, maps:to_list(VarMap))}. + +t_unify(?var(Id) = T, ?var(Id), VarMap) -> + {T, VarMap}; +t_unify(?var(Id1) = T, ?var(Id2), VarMap) -> + case maps:find(Id1, VarMap) of + error -> + case maps:find(Id2, VarMap) of + error -> {T, VarMap#{Id2 => T}}; + {ok, Type} -> t_unify(T, Type, VarMap) + end; + {ok, Type1} -> + case maps:find(Id2, VarMap) of + error -> {Type1, VarMap#{Id2 => T}}; + {ok, Type2} -> t_unify(Type1, Type2, VarMap) + end + end; +t_unify(?var(Id), Type, VarMap) -> + case maps:find(Id, VarMap) of + error -> {Type, VarMap#{Id => Type}}; + {ok, VarType} -> t_unify(VarType, Type, VarMap) + end; +t_unify(Type, ?var(Id), VarMap) -> + case maps:find(Id, VarMap) of + error -> {Type, VarMap#{Id => Type}}; + {ok, VarType} -> t_unify(VarType, Type, VarMap) + end; +t_unify(?function(Domain1, Range1), ?function(Domain2, Range2), VarMap) -> + {Domain, VarMap1} = t_unify(Domain1, Domain2, VarMap), + {Range, VarMap2} = t_unify(Range1, Range2, VarMap1), + {?function(Domain, Range), VarMap2}; +t_unify(?list(Contents1, Termination1, Size), + ?list(Contents2, Termination2, Size), VarMap) -> + {Contents, VarMap1} = t_unify(Contents1, Contents2, VarMap), + {Termination, VarMap2} = t_unify(Termination1, Termination2, VarMap1), + {?list(Contents, Termination, Size), VarMap2}; +t_unify(?product(Types1), ?product(Types2), VarMap) -> + {Types, VarMap1} = unify_lists(Types1, Types2, VarMap), + {?product(Types), VarMap1}; +t_unify(?tuple(?any, ?any, ?any) = T, ?tuple(?any, ?any, ?any), VarMap) -> + {T, VarMap}; +t_unify(?tuple(Elements1, Arity, _), + ?tuple(Elements2, Arity, _), VarMap) when Arity =/= ?any -> + {NewElements, VarMap1} = unify_lists(Elements1, Elements2, VarMap), + {t_tuple(NewElements), VarMap1}; +t_unify(?tuple_set([{Arity, _}]) = T1, + ?tuple(_, Arity, _) = T2, VarMap) when Arity =/= ?any -> + unify_tuple_set_and_tuple1(T1, T2, VarMap); +t_unify(?tuple(_, Arity, _) = T1, + ?tuple_set([{Arity, _}]) = T2, VarMap) when Arity =/= ?any -> + unify_tuple_set_and_tuple2(T1, T2, VarMap); +t_unify(?tuple_set(List1) = T1, ?tuple_set(List2) = T2, VarMap) -> + try + unify_lists(lists:append([T || {_Arity, T} <- List1]), + lists:append([T || {_Arity, T} <- List2]), VarMap) + of + {Tuples, NewVarMap} -> {t_sup(Tuples), NewVarMap} + catch _:_ -> throw({mismatch, T1, T2}) + end; +t_unify(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B, VarMap0) -> + {DefK, VarMap1} = t_unify(ADefK, BDefK, VarMap0), + {DefV, VarMap2} = t_unify(ADefV, BDefV, VarMap1), + {Pairs, VarMap} = + map_pairwise_merge_foldr( + fun(K, MNess, V1, MNess, V2, {Pairs0, VarMap3}) -> + %% We know that the keys unify and do not contain variables, or they + %% would not be singletons + %% TODO: Should V=?none (known missing keys) be handled special? + {V, VarMap4} = t_unify(V1, V2, VarMap3), + {[{K,MNess,V}|Pairs0], VarMap4}; + (K, _, V1, _, V2, {Pairs0, VarMap3}) -> + %% One mandatory and one optional; what should be done in this case? + {V, VarMap4} = t_unify(V1, V2, VarMap3), + {[{K,?mand,V}|Pairs0], VarMap4} + end, {[], VarMap2}, A, B), + {t_map(Pairs, DefK, DefV), VarMap}; +t_unify(?opaque(_) = T1, ?opaque(_) = T2, VarMap) -> + t_unify(t_opaque_structure(T1), t_opaque_structure(T2), VarMap); +t_unify(T1, ?opaque(_) = T2, VarMap) -> + t_unify(T1, t_opaque_structure(T2), VarMap); +t_unify(?opaque(_) = T1, T2, VarMap) -> + t_unify(t_opaque_structure(T1), T2, VarMap); +t_unify(T, T, VarMap) -> + {T, VarMap}; +t_unify(?union(_)=T1, ?union(_)=T2, VarMap) -> + {Type1, Type2} = unify_union2(T1, T2), + t_unify(Type1, Type2, VarMap); +t_unify(?union(_)=T1, T2, VarMap) -> + t_unify(unify_union1(T1, T1, T2), T2, VarMap); +t_unify(T1, ?union(_)=T2, VarMap) -> + t_unify(T1, unify_union1(T2, T1, T2), VarMap); +t_unify(T1, T2, _) -> + throw({mismatch, T1, T2}). + +unify_union2(?union(List1)=T1, ?union(List2)=T2) -> + case {unify_union(List1), unify_union(List2)} of + {{yes, Type1}, {yes, Type2}} -> {Type1, Type2}; + {{yes, Type1}, no} -> {Type1, T2}; + {no, {yes, Type2}} -> {T1, Type2}; + {no, no} -> throw({mismatch, T1, T2}) + end. + +unify_union1(?union(List), T1, T2) -> + case unify_union(List) of + {yes, Type} -> Type; + no -> throw({mismatch, T1, T2}) + end. + +unify_union(List) -> + [A,B,F,I,L,N,T,M,O,Map] = List, + if O =:= ?none -> no; + true -> + S = t_opaque_structure(O), + {yes, t_sup([A,B,F,I,L,N,T,M,S,Map])} + end. + +-spec is_opaque_type(erl_type(), [erl_type()]) -> boolean(). + +%% An opaque type is a union of types. Returns true iff any of the type +%% names (Module and Name) of the first argument (the opaque type to +%% check) occurs in any of the opaque types of the second argument. +is_opaque_type(?opaque(Elements), Opaques) -> + lists:any(fun(Opaque) -> is_opaque_type2(Opaque, Opaques) end, Elements). + +is_opaque_type2(#opaque{mod = Mod1, name = Name1, args = Args1}, Opaques) -> + F1 = fun(?opaque(Es)) -> + F2 = fun(#opaque{mod = Mod, name = Name, args = Args}) -> + is_type_name(Mod1, Name1, Args1, Mod, Name, Args) + end, + lists:any(F2, Es) + end, + lists:any(F1, Opaques). + +is_type_name(Mod, Name, Args1, Mod, Name, Args2) -> + length(Args1) =:= length(Args2); +is_type_name(_Mod1, _Name1, _Args1, _Mod2, _Name2, _Args2) -> + false. + +%% Two functions since t_unify is not symmetric. +unify_tuple_set_and_tuple1(?tuple_set([{Arity, List}]), + ?tuple(Elements2, Arity, _), VarMap) -> + %% Can only work if the single tuple has variables at correct places. + %% Collapse the tuple set. + {NewElements, VarMap1} = + unify_lists(sup_tuple_elements(List), Elements2, VarMap), + {t_tuple(NewElements), VarMap1}. + +unify_tuple_set_and_tuple2(?tuple(Elements2, Arity, _), + ?tuple_set([{Arity, List}]), VarMap) -> + %% Can only work if the single tuple has variables at correct places. + %% Collapse the tuple set. + {NewElements, VarMap1} = + unify_lists(Elements2, sup_tuple_elements(List), VarMap), + {t_tuple(NewElements), VarMap1}. + +unify_lists(L1, L2, VarMap) -> + unify_lists(L1, L2, VarMap, []). + +unify_lists([T1|Left1], [T2|Left2], VarMap, Acc) -> + {NewT, NewVarMap} = t_unify(T1, T2, VarMap), + unify_lists(Left1, Left2, NewVarMap, [NewT|Acc]); +unify_lists([], [], VarMap, Acc) -> + {lists:reverse(Acc), VarMap}. + +%%t_assign_variables_to_subtype(T1, T2) -> +%% try +%% Dict = assign_vars(T1, T2, dict:new()), +%% {ok, dict:map(fun(_Param, List) -> t_sup(List) end, Dict)} +%% catch +%% throw:error -> error +%% end. + +%%assign_vars(_, ?var(_), _Dict) -> +%% erlang:error("Variable in right hand side of assignment"); +%%assign_vars(?any, _, Dict) -> +%% Dict; +%%assign_vars(?var(_) = Var, Type, Dict) -> +%% store_var(Var, Type, Dict); +%%assign_vars(?function(Domain1, Range1), ?function(Domain2, Range2), Dict) -> +%% DomainList = +%% case Domain2 of +%% ?any -> []; +%% ?product(List) -> List +%% end, +%% case any_none([Range2|DomainList]) of +%% true -> throw(error); +%% false -> +%% Dict1 = assign_vars(Domain1, Domain2, Dict), +%% assign_vars(Range1, Range2, Dict1) +%% end; +%%assign_vars(?list(_Contents, _Termination, ?any), ?nil, Dict) -> +%% Dict; +%%assign_vars(?list(Contents1, Termination1, Size1), +%% ?list(Contents2, Termination2, Size2), Dict) -> +%% Dict1 = assign_vars(Contents1, Contents2, Dict), +%% Dict2 = assign_vars(Termination1, Termination2, Dict1), +%% case {Size1, Size2} of +%% {S, S} -> Dict2; +%% {?any, ?nonempty_qual} -> Dict2; +%% {_, _} -> throw(error) +%% end; +%%assign_vars(?product(Types1), ?product(Types2), Dict) -> +%% case length(Types1) =:= length(Types2) of +%% true -> assign_vars_lists(Types1, Types2, Dict); +%% false -> throw(error) +%% end; +%%assign_vars(?tuple(?any, ?any, ?any), ?tuple(?any, ?any, ?any), Dict) -> +%% Dict; +%%assign_vars(?tuple(?any, ?any, ?any), ?tuple(_, _, _), Dict) -> +%% Dict; +%%assign_vars(?tuple(Elements1, Arity, _), +%% ?tuple(Elements2, Arity, _), Dict) when Arity =/= ?any -> +%% assign_vars_lists(Elements1, Elements2, Dict); +%%assign_vars(?tuple_set(_) = T, ?tuple_set(List2), Dict) -> +%% %% All Rhs tuples must already be subtypes of Lhs, so we can take +%% %% each one separatly. +%% assign_vars_lists([T || _ <- List2], List2, Dict); +%%assign_vars(?tuple(?any, ?any, ?any), ?tuple_set(_), Dict) -> +%% Dict; +%%assign_vars(?tuple(_, Arity, _) = T1, ?tuple_set(List), Dict) -> +%% case reduce_tuple_tags(List) of +%% [Tuple = ?tuple(_, Arity, _)] -> assign_vars(T1, Tuple, Dict); +%% _ -> throw(error) +%% end; +%%assign_vars(?tuple_set(List), ?tuple(_, Arity, Tag) = T2, Dict) -> +%% case [T || ?tuple(_, Arity1, Tag1) = T <- List, +%% Arity1 =:= Arity, Tag1 =:= Tag] of +%% [] -> throw(error); +%% [T1] -> assign_vars(T1, T2, Dict) +%% end; +%%assign_vars(?union(U1), T2, Dict) -> +%% ?union(U2) = force_union(T2), +%% assign_vars_lists(U1, U2, Dict); +%%assign_vars(T, T, Dict) -> +%% Dict; +%%assign_vars(T1, T2, Dict) -> +%% case t_is_subtype(T2, T1) of +%% false -> throw(error); +%% true -> Dict +%% end. + +%%assign_vars_lists([T1|Left1], [T2|Left2], Dict) -> +%% assign_vars_lists(Left1, Left2, assign_vars(T1, T2, Dict)); +%%assign_vars_lists([], [], Dict) -> +%% Dict. + +%%store_var(?var(Id), Type, Dict) -> +%% case dict:find(Id, Dict) of +%% error -> dict:store(Id, [Type], Dict); +%% {ok, _VarType0} -> dict:update(Id, fun(X) -> [Type|X] end, Dict) +%% end. + +%%----------------------------------------------------------------------------- +%% Subtraction. +%% +%% Note that the subtraction is an approximation since we do not have +%% negative types. Also, tuples and products should be handled using +%% the cartesian product of the elements, but this is not feasible to +%% do. +%% +%% Example: {a|b,c|d}\{a,d} = {a,c}|{a,d}|{b,c}|{b,d} \ {a,d} = +%% = {a,c}|{b,c}|{b,d} = {a|b,c|d} +%% +%% Instead, we can subtract if all elements but one becomes none after +%% subtracting element-wise. +%% +%% Example: {a|b,c|d}\{a|b,d} = {a,c}|{a,d}|{b,c}|{b,d} \ {a,d}|{b,d} = +%% = {a,c}|{b,c} = {a|b,c} + +-spec t_subtract_list(erl_type(), [erl_type()]) -> erl_type(). + +t_subtract_list(T1, [T2|Left]) -> + t_subtract_list(t_subtract(T1, T2), Left); +t_subtract_list(T, []) -> + T. + +-spec t_subtract(erl_type(), erl_type()) -> erl_type(). + +t_subtract(_, ?any) -> ?none; +t_subtract(T, ?var(_)) -> T; +t_subtract(?any, _) -> ?any; +t_subtract(?var(_) = T, _) -> T; +t_subtract(T, ?unit) -> T; +t_subtract(?unit, _) -> ?unit; +t_subtract(?none, _) -> ?none; +t_subtract(T, ?none) -> T; +t_subtract(?atom(Set1), ?atom(Set2)) -> + case set_subtract(Set1, Set2) of + ?none -> ?none; + Set -> ?atom(Set) + end; +t_subtract(?bitstr(U1, B1), ?bitstr(U2, B2)) -> + subtract_bin(t_bitstr(U1, B1), t_inf(t_bitstr(U1, B1), t_bitstr(U2, B2))); +t_subtract(?function(_, _) = T1, ?function(_, _) = T2) -> + case t_is_subtype(T1, T2) of + true -> ?none; + false -> T1 + end; +t_subtract(?identifier(Set1), ?identifier(Set2)) -> + case set_subtract(Set1, Set2) of + ?none -> ?none; + Set -> ?identifier(Set) + end; +t_subtract(?opaque(_)=T1, ?opaque(_)=T2) -> + opaque_subtract(T1, t_opaque_structure(T2)); +t_subtract(?opaque(_)=T1, T2) -> + opaque_subtract(T1, T2); +t_subtract(T1, ?opaque(_)=T2) -> + t_subtract(T1, t_opaque_structure(T2)); +t_subtract(?matchstate(Pres1, Slots1), ?matchstate(Pres2, _Slots2)) -> + Pres = t_subtract(Pres1, Pres2), + case t_is_none(Pres) of + true -> ?none; + false -> ?matchstate(Pres, Slots1) + end; +t_subtract(?matchstate(Present, Slots), _) -> + ?matchstate(Present, Slots); +t_subtract(?nil, ?nil) -> + ?none; +t_subtract(?nil, ?nonempty_list(_, _)) -> + ?nil; +t_subtract(?nil, ?list(_, _, _)) -> + ?none; +t_subtract(?list(Contents, Termination, _Size) = T, ?nil) -> + case Termination =:= ?nil of + true -> ?nonempty_list(Contents, Termination); + false -> T + end; +t_subtract(?list(Contents1, Termination1, Size1) = T, + ?list(Contents2, Termination2, Size2)) -> + case t_is_subtype(Contents1, Contents2) of + true -> + case t_is_subtype(Termination1, Termination2) of + true -> + case {Size1, Size2} of + {?nonempty_qual, ?unknown_qual} -> ?none; + {?unknown_qual, ?nonempty_qual} -> ?nil; + {S, S} -> ?none + end; + false -> + %% If the termination is not covered by the subtracted type + %% we cannot really say anything about the result. + T + end; + false -> + %% All contents must be covered if there is going to be any + %% change to the list. + T + end; +t_subtract(?float, ?float) -> ?none; +t_subtract(?number(_, _) = T1, ?float) -> t_inf(T1, t_integer()); +t_subtract(?float, ?number(_Set, Tag)) -> + case Tag of + ?unknown_qual -> ?none; + _ -> ?float + end; +t_subtract(?number(_, _), ?number(?any, ?unknown_qual)) -> ?none; +t_subtract(?number(_, _) = T1, ?integer(?any)) -> t_inf(?float, T1); +t_subtract(?int_set(Set1), ?int_set(Set2)) -> + case set_subtract(Set1, Set2) of + ?none -> ?none; + Set -> ?int_set(Set) + end; +t_subtract(?int_range(From1, To1) = T1, ?int_range(_, _) = T2) -> + case t_inf(T1, T2) of + ?none -> T1; + ?int_range(From1, To1) -> ?none; + ?int_range(neg_inf, To) -> t_from_range(To + 1, To1); + ?int_range(From, pos_inf) -> t_from_range(From1, From - 1); + ?int_range(From, To) -> t_sup(t_from_range(From1, From - 1), + t_from_range(To + 1, To)) + end; +t_subtract(?int_range(From, To) = T1, ?int_set(Set)) -> + NewFrom = case set_is_element(From, Set) of + true -> From + 1; + false -> From + end, + NewTo = case set_is_element(To, Set) of + true -> To - 1; + false -> To + end, + if (NewFrom =:= From) and (NewTo =:= To) -> T1; + true -> t_from_range(NewFrom, NewTo) + end; +t_subtract(?int_set(Set), ?int_range(From, To)) -> + case set_filter(fun(X) -> not ((X =< From) orelse (X >= To)) end, Set) of + ?none -> ?none; + NewSet -> ?int_set(NewSet) + end; +t_subtract(?integer(?any) = T1, ?integer(_)) -> T1; +t_subtract(?number(_, _) = T1, ?number(_, _)) -> T1; +t_subtract(?tuple(_, _, _), ?tuple(?any, ?any, ?any)) -> ?none; +t_subtract(?tuple_set(_), ?tuple(?any, ?any, ?any)) -> ?none; +t_subtract(?tuple(?any, ?any, ?any) = T1, ?tuple_set(_)) -> T1; +t_subtract(?tuple(Elements1, Arity1, _Tag1) = T1, + ?tuple(Elements2, Arity2, _Tag2)) -> + if Arity1 =/= Arity2 -> T1; + Arity1 =:= Arity2 -> + NewElements = t_subtract_lists(Elements1, Elements2), + case [E || E <- NewElements, E =/= ?none] of + [] -> ?none; + [_] -> t_tuple(replace_nontrivial_element(Elements1, NewElements)); + _ -> T1 + end + end; +t_subtract(?tuple_set(List1) = T1, ?tuple(_, Arity, _) = T2) -> + case orddict:find(Arity, List1) of + error -> T1; + {ok, List2} -> + TuplesLeft0 = [Tuple || {_Arity, Tuple} <- orddict:erase(Arity, List1)], + TuplesLeft1 = lists:append(TuplesLeft0), + t_sup([t_subtract(L, T2) || L <- List2] ++ TuplesLeft1) + end; +t_subtract(?tuple(_, Arity, _) = T1, ?tuple_set(List1)) -> + case orddict:find(Arity, List1) of + error -> T1; + {ok, List2} -> t_inf([t_subtract(T1, L) || L <- List2]) + end; +t_subtract(?tuple_set(_) = T1, ?tuple_set(_) = T2) -> + t_sup([t_subtract(T, T2) || T <- t_tuple_subtypes(T1)]); +t_subtract(?product(Elements1) = T1, ?product(Elements2)) -> + Arity1 = length(Elements1), + Arity2 = length(Elements2), + if Arity1 =/= Arity2 -> T1; + Arity1 =:= Arity2 -> + NewElements = t_subtract_lists(Elements1, Elements2), + case [E || E <- NewElements, E =/= ?none] of + [] -> ?none; + [_] -> t_product(replace_nontrivial_element(Elements1, NewElements)); + _ -> T1 + end + end; +t_subtract(?map(APairs, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B) -> + case t_is_subtype(ADefK, BDefK) andalso t_is_subtype(ADefV, BDefV) of + false -> A; + true -> + %% We fold over the maps to produce a list of constraints, where + %% constraints are additional key-value pairs to put in Pairs. Only one + %% constraint need to be applied to produce a type that excludes the + %% right-hand-side type, so if more than one constraint is produced, we + %% just return the left-hand-side argument. + %% + %% Each case of the fold may either conclude that + %% * The arguments constrain A at least as much as B, i.e. that A so far + %% is a subtype of B. In that case they return false + %% * That for the particular arguments, A being a subtype of B does not + %% hold, but the infinimum of A and B is nonempty, and by narrowing a + %% pair in A, we can create a type that excludes some elements in the + %% infinumum. In that case, they will return that pair. + %% * That for the particular arguments, A being a subtype of B does not + %% hold, and either the infinumum of A and B is empty, or it is not + %% possible with the current representation to create a type that + %% excludes elements from B without also excluding elements that are + %% only in A. In that case, it will return the pair from A unchanged. + case + map_pairwise_merge( + %% If V1 is a subtype of V2, the case that K does not exist in A + %% remain. + fun(K, ?opt, V1, ?mand, V2) -> {K, ?opt, t_subtract(V1, V2)}; + (K, _, V1, _, V2) -> + %% If we subtract an optional key, that leaves a mandatory key + case t_subtract(V1, V2) of + ?none -> false; + Partial -> {K, ?mand, Partial} + end + end, A, B) + of + %% We produce a list of keys that are constrained. As only one of + %% these should apply at a time, we can't represent the difference if + %% more than one constraint is produced. If we applied all of them, + %% that would make an underapproximation, which we must not do. + [] -> ?none; %% A is a subtype of B + [E] -> t_map(mapdict_store(E, APairs), ADefK, ADefV); + _ -> A + end + end; +t_subtract(?product(P1), _) -> + ?product(P1); +t_subtract(T, ?product(_)) -> + T; +t_subtract(?union(U1), ?union(U2)) -> + subtract_union(U1, U2); +t_subtract(T1, T2) -> + ?union(U1) = force_union(T1), + ?union(U2) = force_union(T2), + subtract_union(U1, U2). + +-spec opaque_subtract(erl_type(), erl_type()) -> erl_type(). + +opaque_subtract(?opaque(Set1), T2) -> + List = [T1#opaque{struct = Sub} || + #opaque{struct = S1}=T1 <- set_to_list(Set1), + not t_is_none(Sub = t_subtract(S1, T2))], + case List of + [] -> ?none; + _ -> ?opaque(ordsets:from_list(List)) + end. + +-spec t_subtract_lists([erl_type()], [erl_type()]) -> [erl_type()]. + +t_subtract_lists(L1, L2) -> + t_subtract_lists(L1, L2, []). + +-spec t_subtract_lists([erl_type()], [erl_type()], [erl_type()]) -> [erl_type()]. + +t_subtract_lists([T1|Left1], [T2|Left2], Acc) -> + t_subtract_lists(Left1, Left2, [t_subtract(T1, T2)|Acc]); +t_subtract_lists([], [], Acc) -> + lists:reverse(Acc). + +-spec subtract_union([erl_type(),...], [erl_type(),...]) -> erl_type(). + +subtract_union(U1, U2) -> + [A1,B1,F1,I1,L1,N1,T1,M1,O1,Map1] = U1, + [A2,B2,F2,I2,L2,N2,T2,M2,O2,Map2] = U2, + List1 = [A1,B1,F1,I1,L1,N1,T1,M1,?none,Map1], + List2 = [A2,B2,F2,I2,L2,N2,T2,M2,?none,Map2], + Sub1 = subtract_union(List1, List2, 0, []), + O = if O1 =:= ?none -> O1; + true -> t_subtract(O1, ?union(U2)) + end, + Sub2 = if O2 =:= ?none -> Sub1; + true -> t_subtract(Sub1, t_opaque_structure(O2)) + end, + t_sup(O, Sub2). + +-spec subtract_union([erl_type()], [erl_type()], non_neg_integer(), [erl_type()]) -> erl_type(). + +subtract_union([T1|Left1], [T2|Left2], N, Acc) -> + case t_subtract(T1, T2) of + ?none -> subtract_union(Left1, Left2, N, [?none|Acc]); + T -> subtract_union(Left1, Left2, N+1, [T|Acc]) + end; +subtract_union([], [], 0, _Acc) -> + ?none; +subtract_union([], [], 1, Acc) -> + [T] = [X || X <- Acc, X =/= ?none], + T; +subtract_union([], [], N, Acc) when is_integer(N), N > 1 -> + ?union(lists:reverse(Acc)). + +replace_nontrivial_element(El1, El2) -> + replace_nontrivial_element(El1, El2, []). + +replace_nontrivial_element([T1|Left1], [?none|Left2], Acc) -> + replace_nontrivial_element(Left1, Left2, [T1|Acc]); +replace_nontrivial_element([_|Left1], [T2|_], Acc) -> + lists:reverse(Acc) ++ [T2|Left1]. + +subtract_bin(?bitstr(U1, B1), ?bitstr(U1, B1)) -> + ?none; +subtract_bin(?bitstr(U1, B1), ?none) -> + t_bitstr(U1, B1); +subtract_bin(?bitstr(U1, B1), ?bitstr(0, B1)) -> + t_bitstr(U1, B1+U1); +subtract_bin(?bitstr(U1, B1), ?bitstr(U1, B2)) -> + if (B1+U1) =/= B2 -> t_bitstr(0, B1); + true -> t_bitstr(U1, B1) + end; +subtract_bin(?bitstr(U1, B1), ?bitstr(U2, B2)) -> + if (2 * U1) =:= U2 -> + if B1 =:= B2 -> + t_bitstr(U2, B1+U1); + (B1 + U1) =:= B2 -> + t_bitstr(U2, B1); + true -> + t_bitstr(U1, B1) + end; + true -> + t_bitstr(U1, B1) + end. + +%%----------------------------------------------------------------------------- +%% Relations +%% + +-spec t_is_equal(erl_type(), erl_type()) -> boolean(). + +t_is_equal(T, T) -> true; +t_is_equal(_, _) -> false. + +-spec t_is_subtype(erl_type(), erl_type()) -> boolean(). + +t_is_subtype(T1, T2) -> + Inf = t_inf(T1, T2), + subtype_is_equal(T1, Inf). + +%% The subtype relation has to behave correctly irrespective of opaque +%% types. +subtype_is_equal(T, T) -> true; +subtype_is_equal(T1, T2) -> + t_is_equal(case t_contains_opaque(T1) of + true -> t_unopaque(T1); + false -> T1 + end, + case t_contains_opaque(T2) of + true -> t_unopaque(T2); + false -> T2 + end). + +-spec t_is_instance(erl_type(), erl_type()) -> boolean(). + +%% XXX. To be removed. +t_is_instance(ConcreteType, Type) -> + t_is_subtype(ConcreteType, t_unopaque(Type)). + +-spec t_do_overlap(erl_type(), erl_type()) -> boolean(). + +t_do_overlap(TypeA, TypeB) -> + not (t_is_none_or_unit(t_inf(TypeA, TypeB))). + +-spec t_unopaque(erl_type()) -> erl_type(). + +t_unopaque(T) -> + t_unopaque(T, 'universe'). + +-spec t_unopaque(erl_type(), opaques()) -> erl_type(). + +t_unopaque(?opaque(_) = T, Opaques) -> + case Opaques =:= 'universe' orelse is_opaque_type(T, Opaques) of + true -> t_unopaque(t_opaque_structure(T), Opaques); + false -> T + end; +t_unopaque(?list(ElemT, Termination, Sz), Opaques) -> + ?list(t_unopaque(ElemT, Opaques), t_unopaque(Termination, Opaques), Sz); +t_unopaque(?tuple(?any, _, _) = T, _) -> T; +t_unopaque(?tuple(ArgTs, Sz, Tag), Opaques) when is_list(ArgTs) -> + NewArgTs = [t_unopaque(A, Opaques) || A <- ArgTs], + ?tuple(NewArgTs, Sz, Tag); +t_unopaque(?tuple_set(Set), Opaques) -> + NewSet = [{Sz, [t_unopaque(T, Opaques) || T <- Tuples]} + || {Sz, Tuples} <- Set], + ?tuple_set(NewSet); +t_unopaque(?product(Types), Opaques) -> + ?product([t_unopaque(T, Opaques) || T <- Types]); +t_unopaque(?function(Domain, Range), Opaques) -> + ?function(t_unopaque(Domain, Opaques), t_unopaque(Range, Opaques)); +t_unopaque(?union([A,B,F,I,L,N,T,M,O,Map]), Opaques) -> + UL = t_unopaque(L, Opaques), + UT = t_unopaque(T, Opaques), + UF = t_unopaque(F, Opaques), + UM = t_unopaque(M, Opaques), + UMap = t_unopaque(Map, Opaques), + {OF,UO} = case t_unopaque(O, Opaques) of + ?opaque(_) = O1 -> {O1, []}; + Type -> {?none, [Type]} + end, + t_sup([?union([A,B,UF,I,UL,N,UT,UM,OF,UMap])|UO]); +t_unopaque(?map(Pairs,DefK,DefV), Opaques) -> + t_map([{K, MNess, t_unopaque(V, Opaques)} || {K, MNess, V} <- Pairs], + t_unopaque(DefK, Opaques), + t_unopaque(DefV, Opaques)); +t_unopaque(T, _) -> + T. + +%%----------------------------------------------------------------------------- +%% K-depth abstraction. +%% +%% t_limit/2 is the exported function, which checks the type of the +%% second argument and calls the module local t_limit_k/2 function. +%% + +-spec t_limit(erl_type(), integer()) -> erl_type(). + +t_limit(Term, K) when is_integer(K) -> + t_limit_k(Term, K). + +t_limit_k(_, K) when K =< 0 -> ?any; +t_limit_k(?tuple(?any, ?any, ?any) = T, _K) -> T; +t_limit_k(?tuple(Elements, Arity, _), K) -> + if K =:= 1 -> t_tuple(Arity); + true -> t_tuple([t_limit_k(E, K-1) || E <- Elements]) + end; +t_limit_k(?tuple_set(_) = T, K) -> + t_sup([t_limit_k(Tuple, K) || Tuple <- t_tuple_subtypes(T)]); +t_limit_k(?list(Elements, Termination, Size), K) -> + NewTermination = + if K =:= 1 -> + %% We do not want to lose the termination information. + t_limit_k(Termination, K); + true -> t_limit_k(Termination, K - 1) + end, + NewElements = t_limit_k(Elements, K - 1), + TmpList = t_cons(NewElements, NewTermination), + case Size of + ?nonempty_qual -> TmpList; + ?unknown_qual -> + ?list(NewElements1, NewTermination1, _) = TmpList, + ?list(NewElements1, NewTermination1, ?unknown_qual) + end; +t_limit_k(?function(Domain, Range), K) -> + %% The domain is either a product or any() so we do not decrease the K. + ?function(t_limit_k(Domain, K), t_limit_k(Range, K-1)); +t_limit_k(?product(Elements), K) -> + ?product([t_limit_k(X, K - 1) || X <- Elements]); +t_limit_k(?union(Elements), K) -> + ?union([t_limit_k(X, K) || X <- Elements]); +t_limit_k(?opaque(Es), K) -> + List = [begin + NewS = t_limit_k(S, K), + Opaque#opaque{struct = NewS} + end || #opaque{struct = S} = Opaque <- set_to_list(Es)], + ?opaque(ordsets:from_list(List)); +t_limit_k(?map(Pairs0, DefK0, DefV0), K) -> + Fun = fun({EK, MNess, EV}, {Exact, DefK1, DefV1}) -> + LV = t_limit_k(EV, K - 1), + case t_limit_k(EK, K - 1) of + EK -> {[{EK,MNess,LV}|Exact], DefK1, DefV1}; + LK -> {Exact, t_sup(LK, DefK1), t_sup(LV, DefV1)} + end + end, + {Pairs, DefK2, DefV2} = lists:foldr(Fun, {[], DefK0, DefV0}, Pairs0), + t_map(Pairs, t_limit_k(DefK2, K - 1), t_limit_k(DefV2, K - 1)); +t_limit_k(T, _K) -> T. + +%%============================================================================ +%% +%% Abstract records. Used for comparing contracts. +%% +%%============================================================================ + +-spec t_abstract_records(erl_type(), type_table()) -> erl_type(). + +t_abstract_records(?list(Contents, Termination, Size), RecDict) -> + case t_abstract_records(Contents, RecDict) of + ?none -> ?none; + NewContents -> + %% Be careful here to make the termination collapse if necessary. + case t_abstract_records(Termination, RecDict) of + ?nil -> ?list(NewContents, ?nil, Size); + ?any -> ?list(NewContents, ?any, Size); + Other -> + ?list(NewContents2, NewTermination, _) = t_cons(NewContents, Other), + ?list(NewContents2, NewTermination, Size) + end + end; +t_abstract_records(?function(Domain, Range), RecDict) -> + ?function(t_abstract_records(Domain, RecDict), + t_abstract_records(Range, RecDict)); +t_abstract_records(?product(Types), RecDict) -> + ?product([t_abstract_records(T, RecDict) || T <- Types]); +t_abstract_records(?union(Types), RecDict) -> + t_sup([t_abstract_records(T, RecDict) || T <- Types]); +t_abstract_records(?tuple(?any, ?any, ?any) = T, _RecDict) -> + T; +t_abstract_records(?tuple(Elements, Arity, ?atom(_) = Tag), RecDict) -> + [TagAtom] = atom_vals(Tag), + case lookup_record(TagAtom, Arity - 1, RecDict) of + error -> t_tuple([t_abstract_records(E, RecDict) || E <- Elements]); + {ok, Fields} -> t_tuple([Tag|[T || {_Name, _Abstr, T} <- Fields]]) + end; +t_abstract_records(?tuple(Elements, _Arity, _Tag), RecDict) -> + t_tuple([t_abstract_records(E, RecDict) || E <- Elements]); +t_abstract_records(?tuple_set(_) = Tuples, RecDict) -> + t_sup([t_abstract_records(T, RecDict) || T <- t_tuple_subtypes(Tuples)]); +t_abstract_records(?opaque(_)=Type, RecDict) -> + t_abstract_records(t_opaque_structure(Type), RecDict); +t_abstract_records(T, _RecDict) -> + T. + +%% Map over types. Depth first. Used by the contract checker. ?list is +%% not fully implemented so take care when changing the type in Termination. + +-spec t_map(fun((erl_type()) -> erl_type()), erl_type()) -> erl_type(). + +t_map(Fun, ?list(Contents, Termination, Size)) -> + Fun(?list(t_map(Fun, Contents), t_map(Fun, Termination), Size)); +t_map(Fun, ?function(Domain, Range)) -> + Fun(?function(t_map(Fun, Domain), t_map(Fun, Range))); +t_map(Fun, ?product(Types)) -> + Fun(?product([t_map(Fun, T) || T <- Types])); +t_map(Fun, ?union(Types)) -> + Fun(t_sup([t_map(Fun, T) || T <- Types])); +t_map(Fun, ?tuple(?any, ?any, ?any) = T) -> + Fun(T); +t_map(Fun, ?tuple(Elements, _Arity, _Tag)) -> + Fun(t_tuple([t_map(Fun, E) || E <- Elements])); +t_map(Fun, ?tuple_set(_) = Tuples) -> + Fun(t_sup([t_map(Fun, T) || T <- t_tuple_subtypes(Tuples)])); +t_map(Fun, ?opaque(Set)) -> + L = [Opaque#opaque{struct = NewS} || + #opaque{struct = S} = Opaque <- set_to_list(Set), + not t_is_none(NewS = t_map(Fun, S))], + Fun(case L of + [] -> ?none; + _ -> ?opaque(ordsets:from_list(L)) + end); +t_map(Fun, ?map(Pairs,DefK,DefV)) -> + %% TODO: + Fun(t_map(Pairs, Fun(DefK), Fun(DefV))); +t_map(Fun, T) -> + Fun(T). + +%%============================================================================= +%% +%% Prettyprinter +%% +%%============================================================================= + +-spec t_to_string(erl_type()) -> string(). + +t_to_string(T) -> + t_to_string(T, dict:new()). + +-spec t_to_string(erl_type(), type_table()) -> string(). + +t_to_string(?any, _RecDict) -> + "any()"; +t_to_string(?none, _RecDict) -> + "none()"; +t_to_string(?unit, _RecDict) -> + "no_return()"; +t_to_string(?atom(?any), _RecDict) -> + "atom()"; +t_to_string(?atom(Set), _RecDict) -> + case set_size(Set) of + 2 -> + case set_is_element(true, Set) andalso set_is_element(false, Set) of + true -> "boolean()"; + false -> set_to_string(Set) + end; + _ -> + set_to_string(Set) + end; +t_to_string(?bitstr(0, 0), _RecDict) -> + "<<>>"; +t_to_string(?bitstr(8, 0), _RecDict) -> + "binary()"; +t_to_string(?bitstr(1, 0), _RecDict) -> + "bitstring()"; +t_to_string(?bitstr(0, B), _RecDict) -> + flat_format("<<_:~w>>", [B]); +t_to_string(?bitstr(U, 0), _RecDict) -> + flat_format("<<_:_*~w>>", [U]); +t_to_string(?bitstr(U, B), _RecDict) -> + flat_format("<<_:~w,_:_*~w>>", [B, U]); +t_to_string(?function(?any, ?any), _RecDict) -> + "fun()"; +t_to_string(?function(?any, Range), RecDict) -> + "fun((...) -> " ++ t_to_string(Range, RecDict) ++ ")"; +t_to_string(?function(?product(ArgList), Range), RecDict) -> + "fun((" ++ comma_sequence(ArgList, RecDict) ++ ") -> " + ++ t_to_string(Range, RecDict) ++ ")"; +t_to_string(?identifier(Set), _RecDict) -> + case Set of + ?any -> "identifier()"; + _ -> + string:join([flat_format("~w()", [T]) || T <- set_to_list(Set)], " | ") + end; +t_to_string(?opaque(Set), RecDict) -> + string:join([opaque_type(Mod, Name, Args, S, RecDict) || + #opaque{mod = Mod, name = Name, struct = S, args = Args} + <- set_to_list(Set)], + " | "); +t_to_string(?matchstate(Pres, Slots), RecDict) -> + flat_format("ms(~s,~s)", [t_to_string(Pres, RecDict), + t_to_string(Slots,RecDict)]); +t_to_string(?nil, _RecDict) -> + "[]"; +t_to_string(?nonempty_list(Contents, Termination), RecDict) -> + ContentString = t_to_string(Contents, RecDict), + case Termination of + ?nil -> + case Contents of + ?char -> "nonempty_string()"; + _ -> "["++ContentString++",...]" + end; + ?any -> + %% Just a safety check. + case Contents =:= ?any of + true -> ok; + false -> + %% XXX. See comment below. + %% erlang:error({illegal_list, ?nonempty_list(Contents, Termination)}) + ok + end, + "nonempty_maybe_improper_list()"; + _ -> + case t_is_subtype(t_nil(), Termination) of + true -> + "nonempty_maybe_improper_list("++ContentString++"," + ++t_to_string(Termination, RecDict)++")"; + false -> + "nonempty_improper_list("++ContentString++"," + ++t_to_string(Termination, RecDict)++")" + end + end; +t_to_string(?list(Contents, Termination, ?unknown_qual), RecDict) -> + ContentString = t_to_string(Contents, RecDict), + case Termination of + ?nil -> + case Contents of + ?char -> "string()"; + _ -> "["++ContentString++"]" + end; + ?any -> + %% Just a safety check. + %% XXX. Types such as "maybe_improper_list(integer(), any())" + %% are OK, but cannot be printed!? + case Contents =:= ?any of + true -> ok; + false -> + ok + %% L = ?list(Contents, Termination, ?unknown_qual), + %% erlang:error({illegal_list, L}) + end, + "maybe_improper_list()"; + _ -> + case t_is_subtype(t_nil(), Termination) of + true -> + "maybe_improper_list("++ContentString++"," + ++t_to_string(Termination, RecDict)++")"; + false -> + "improper_list("++ContentString++"," + ++t_to_string(Termination, RecDict)++")" + end + end; +t_to_string(?int_set(Set), _RecDict) -> + set_to_string(Set); +t_to_string(?byte, _RecDict) -> "byte()"; +t_to_string(?char, _RecDict) -> "char()"; +t_to_string(?integer_pos, _RecDict) -> "pos_integer()"; +t_to_string(?integer_non_neg, _RecDict) -> "non_neg_integer()"; +t_to_string(?integer_neg, _RecDict) -> "neg_integer()"; +t_to_string(?int_range(From, To), _RecDict) -> + flat_format("~w..~w", [From, To]); +t_to_string(?integer(?any), _RecDict) -> "integer()"; +t_to_string(?float, _RecDict) -> "float()"; +t_to_string(?number(?any, ?unknown_qual), _RecDict) -> "number()"; +t_to_string(?product(List), RecDict) -> + "<" ++ comma_sequence(List, RecDict) ++ ">"; +t_to_string(?map([],?any,?any), _RecDict) -> "map()"; +t_to_string(?map(Pairs0,DefK,DefV), RecDict) -> + {Pairs, ExtraEl} = + case {DefK, DefV} of + {?none, ?none} -> {Pairs0, []}; + _ -> {Pairs0 ++ [{DefK,?opt,DefV}], []} + end, + Tos = fun(T) -> case T of + ?any -> "_"; + _ -> t_to_string(T, RecDict) + end end, + StrMand = [{Tos(K),Tos(V)}||{K,?mand,V}<-Pairs], + StrOpt = [{Tos(K),Tos(V)}||{K,?opt,V}<-Pairs], + "#{" ++ string:join([K ++ ":=" ++ V||{K,V}<-StrMand] + ++ [K ++ "=>" ++ V||{K,V}<-StrOpt] + ++ ExtraEl, ", ") ++ "}"; +t_to_string(?tuple(?any, ?any, ?any), _RecDict) -> "tuple()"; +t_to_string(?tuple(Elements, _Arity, ?any), RecDict) -> + "{" ++ comma_sequence(Elements, RecDict) ++ "}"; +t_to_string(?tuple(Elements, Arity, Tag), RecDict) -> + [TagAtom] = atom_vals(Tag), + case lookup_record(TagAtom, Arity-1, RecDict) of + error -> "{" ++ comma_sequence(Elements, RecDict) ++ "}"; + {ok, FieldNames} -> + record_to_string(TagAtom, Elements, FieldNames, RecDict) + end; +t_to_string(?tuple_set(_) = T, RecDict) -> + union_sequence(t_tuple_subtypes(T), RecDict); +t_to_string(?union(Types), RecDict) -> + union_sequence([T || T <- Types, T =/= ?none], RecDict); +t_to_string(?var(Id), _RecDict) when is_atom(Id) -> + flat_format("~s", [atom_to_list(Id)]); +t_to_string(?var(Id), _RecDict) when is_integer(Id) -> + flat_format("var(~w)", [Id]). + + +record_to_string(Tag, [_|Fields], FieldNames, RecDict) -> + FieldStrings = record_fields_to_string(Fields, FieldNames, RecDict, []), + "#" ++ atom_to_string(Tag) ++ "{" ++ string:join(FieldStrings, ",") ++ "}". + +record_fields_to_string([F|Fs], [{FName, _Abstr, DefType}|FDefs], + RecDict, Acc) -> + NewAcc = + case + t_is_equal(F, t_any()) orelse + (t_is_any_atom('undefined', F) andalso + not t_is_none(t_inf(F, DefType))) + of + true -> Acc; + false -> + StrFV = atom_to_string(FName) ++ "::" ++ t_to_string(F, RecDict), + [StrFV|Acc] + end, + record_fields_to_string(Fs, FDefs, RecDict, NewAcc); +record_fields_to_string([], [], _RecDict, Acc) -> + lists:reverse(Acc). + +-spec record_field_diffs_to_string(erl_type(), type_table()) -> string(). + +record_field_diffs_to_string(?tuple([_|Fs], Arity, Tag), RecDict) -> + [TagAtom] = atom_vals(Tag), + {ok, FieldNames} = lookup_record(TagAtom, Arity-1, RecDict), + %% io:format("RecCElems = ~p\nRecTypes = ~p\n", [Fs, FieldNames]), + FieldDiffs = field_diffs(Fs, FieldNames, RecDict, []), + string:join(FieldDiffs, " and "). + +field_diffs([F|Fs], [{FName, _Abstr, DefType}|FDefs], RecDict, Acc) -> + %% Don't care about opacity for now. + NewAcc = + case not t_is_none(t_inf(F, DefType)) of + true -> Acc; + false -> + Str = atom_to_string(FName) ++ "::" ++ t_to_string(DefType, RecDict), + [Str|Acc] + end, + field_diffs(Fs, FDefs, RecDict, NewAcc); +field_diffs([], [], _, Acc) -> + lists:reverse(Acc). + +comma_sequence(Types, RecDict) -> + List = [case T =:= ?any of + true -> "_"; + false -> t_to_string(T, RecDict) + end || T <- Types], + string:join(List, ","). + +union_sequence(Types, RecDict) -> + List = [t_to_string(T, RecDict) || T <- Types], + string:join(List, " | "). + +-ifdef(DEBUG). +opaque_type(Mod, Name, _Args, S, RecDict) -> + ArgsString = comma_sequence(_Args, RecDict), + String = t_to_string(S, RecDict), + opaque_name(Mod, Name, ArgsString) ++ "[" ++ String ++ "]". +-else. +opaque_type(Mod, Name, Args, _S, RecDict) -> + ArgsString = comma_sequence(Args, RecDict), + opaque_name(Mod, Name, ArgsString). +-endif. + +opaque_name(Mod, Name, Extra) -> + S = mod_name(Mod, Name), + flat_format("~s(~s)", [S, Extra]). + +mod_name(Mod, Name) -> + flat_format("~w:~w", [Mod, Name]). + +%%============================================================================= +%% +%% Build a type from parse forms. +%% +%%============================================================================= + +-type type_names() :: [type_key() | record_key()]. + +-type mta() :: {module(), atom(), arity()}. +-type mra() :: {module(), atom(), arity()}. +-type site() :: {'type', mta()} | {'spec', mfa()} | {'record', mra()}. +-type cache_key() :: {module(), atom(), expand_depth(), + [erl_type()], type_names()}. +-opaque cache() :: #{cache_key() => {erl_type(), expand_limit()}}. + +-spec t_from_form(parse_form(), sets:set(mfa()), site(), mod_records(), + var_table(), cache()) -> {erl_type(), cache()}. + +t_from_form(Form, ExpTypes, Site, RecDict, VarTab, Cache) -> + t_from_form1(Form, ExpTypes, Site, RecDict, VarTab, Cache). + +%% Replace external types with with none(). +-spec t_from_form_without_remote(parse_form(), site(), type_table()) -> + {erl_type(), cache()}. + +t_from_form_without_remote(Form, Site, TypeTable) -> + Module = site_module(Site), + RecDict = dict:from_list([{Module, TypeTable}]), + ExpTypes = replace_by_none, + VarTab = var_table__new(), + Cache = cache__new(), + t_from_form1(Form, ExpTypes, Site, RecDict, VarTab, Cache). + +%% REC_TYPE_LIMIT is used for limiting the depth of recursive types. +%% EXPAND_LIMIT is used for limiting the size of types by +%% limiting the number of elements of lists within one type form. +%% EXPAND_DEPTH is used in conjunction with EXPAND_LIMIT to make the +%% types balanced (unions will otherwise collapse to any()) by limiting +%% the depth the same way as t_limit/2 does. + +-type expand_limit() :: integer(). + +-type expand_depth() :: integer(). + +-record(from_form, {site :: site(), + xtypes :: sets:set(mfa()) | 'replace_by_none', + mrecs :: mod_records(), + vtab :: var_table(), + tnames :: type_names()}). + +-spec t_from_form1(parse_form(), sets:set(mfa()) | 'replace_by_none', + site(), mod_records(), var_table(), cache()) -> + {erl_type(), cache()}. + +t_from_form1(Form, ET, Site, MR, V, C) -> + TypeNames = initial_typenames(Site), + State = #from_form{site = Site, + xtypes = ET, + mrecs = MR, + vtab = V, + tnames = TypeNames}, + L = ?EXPAND_LIMIT, + {T1, L1, C1} = from_form(Form, State, ?EXPAND_DEPTH, L, C), + if + L1 =< 0 -> + from_form_loop(Form, State, 1, L, C1); + true -> + {T1, C1} + end. + +initial_typenames({type, _MTA}=Site) -> [Site]; +initial_typenames({spec, _MFA}) -> []; +initial_typenames({record, _MRA}) -> []. + +from_form_loop(Form, State, D, Limit, C) -> + {T1, L1, C1} = from_form(Form, State, D, Limit, C), + Delta = Limit - L1, + if + %% Save some time by assuming next depth will exceed the limit. + Delta * 8 > Limit -> + {T1, C1}; + true -> + D1 = D + 1, + from_form_loop(Form, State, D1, Limit, C1) + end. + +-spec from_form(parse_form(), + #from_form{}, + expand_depth(), + expand_limit(), + cache()) -> {erl_type(), expand_limit(), cache()}. + +%% If there is something wrong with parse_form() +%% throw({error, io_lib:chars()} is called; +%% for unknown remote types +%% self() ! {self(), ext_types, {RemMod, Name, ArgsLen}} +%% is called, unless 'replace_by_none' is given. +%% +%% It is assumed that site_module(S) can be found in MR. + +from_form(_, _S, D, L, C) when D =< 0 ; L =< 0 -> + {t_any(), L, C}; +from_form({var, _L, '_'}, _S, _D, L, C) -> + {t_any(), L, C}; +from_form({var, _L, Name}, S, _D, L, C) -> + V = S#from_form.vtab, + case maps:find(Name, V) of + error -> {t_var(Name), L, C}; + {ok, Val} -> {Val, L, C} + end; +from_form({ann_type, _L, [_Var, Type]}, S, D, L, C) -> + from_form(Type, S, D, L, C); +from_form({paren_type, _L, [Type]}, S, D, L, C) -> + from_form(Type, S, D, L, C); +from_form({remote_type, _L, [{atom, _, Module}, {atom, _, Type}, Args]}, + S, D, L, C) -> + remote_from_form(Module, Type, Args, S, D, L, C); +from_form({atom, _L, Atom}, _S, _D, L, C) -> + {t_atom(Atom), L, C}; +from_form({integer, _L, Int}, _S, _D, L, C) -> + {t_integer(Int), L, C}; +from_form({op, _L, _Op, _Arg} = Op, _S, _D, L, C) -> + case erl_eval:partial_eval(Op) of + {integer, _, Val} -> + {t_integer(Val), L, C}; + _ -> throw({error, io_lib:format("Unable to evaluate type ~w\n", [Op])}) + end; +from_form({op, _L, _Op, _Arg1, _Arg2} = Op, _S, _D, L, C) -> + case erl_eval:partial_eval(Op) of + {integer, _, Val} -> + {t_integer(Val), L, C}; + _ -> throw({error, io_lib:format("Unable to evaluate type ~w\n", [Op])}) + end; +from_form({type, _L, any, []}, _S, _D, L, C) -> + {t_any(), L, C}; +from_form({type, _L, arity, []}, _S, _D, L, C) -> + {t_arity(), L, C}; +from_form({type, _L, atom, []}, _S, _D, L, C) -> + {t_atom(), L, C}; +from_form({type, _L, binary, []}, _S, _D, L, C) -> + {t_binary(), L, C}; +from_form({type, _L, binary, [Base, Unit]} = Type, _S, _D, L, C) -> + case {erl_eval:partial_eval(Base), erl_eval:partial_eval(Unit)} of + {{integer, _, B}, {integer, _, U}} when B >= 0, U >= 0 -> + {t_bitstr(U, B), L, C}; + _ -> throw({error, io_lib:format("Unable to evaluate type ~w\n", [Type])}) + end; +from_form({type, _L, bitstring, []}, _S, _D, L, C) -> + {t_bitstr(), L, C}; +from_form({type, _L, bool, []}, _S, _D, L, C) -> + {t_boolean(), L, C}; % XXX: Temporarily +from_form({type, _L, boolean, []}, _S, _D, L, C) -> + {t_boolean(), L, C}; +from_form({type, _L, byte, []}, _S, _D, L, C) -> + {t_byte(), L, C}; +from_form({type, _L, char, []}, _S, _D, L, C) -> + {t_char(), L, C}; +from_form({type, _L, float, []}, _S, _D, L, C) -> + {t_float(), L, C}; +from_form({type, _L, function, []}, _S, _D, L, C) -> + {t_fun(), L, C}; +from_form({type, _L, 'fun', []}, _S, _D, L, C) -> + {t_fun(), L, C}; +from_form({type, _L, 'fun', [{type, _, any}, Range]}, S, D, L, C) -> + {T, L1, C1} = from_form(Range, S, D - 1, L - 1, C), + {t_fun(T), L1, C1}; +from_form({type, _L, 'fun', [{type, _, product, Domain}, Range]}, + S, D, L, C) -> + {Dom1, L1, C1} = list_from_form(Domain, S, D, L, C), + {Ran1, L2, C2} = from_form(Range, S, D, L1, C1), + {t_fun(Dom1, Ran1), L2, C2}; +from_form({type, _L, identifier, []}, _S, _D, L, C) -> + {t_identifier(), L, C}; +from_form({type, _L, integer, []}, _S, _D, L, C) -> + {t_integer(), L, C}; +from_form({type, _L, iodata, []}, _S, _D, L, C) -> + {t_iodata(), L, C}; +from_form({type, _L, iolist, []}, _S, _D, L, C) -> + {t_iolist(), L, C}; +from_form({type, _L, list, []}, _S, _D, L, C) -> + {t_list(), L, C}; +from_form({type, _L, list, [Type]}, S, D, L, C) -> + {T, L1, C1} = from_form(Type, S, D - 1, L - 1, C), + {t_list(T), L1, C1}; +from_form({type, _L, map, any}, S, D, L, C) -> + builtin_type(map, t_map(), S, D, L, C); +from_form({type, _L, map, List}, S, D0, L, C) -> + {Pairs1, L5, C5} = + fun PairsFromForm(_, L1, C1) when L1 =< 0 -> {[{?any,?opt,?any}], L1, C1}; + PairsFromForm([], L1, C1) -> {[], L1, C1}; + PairsFromForm([{type, _, Oper, [KF, VF]}|T], L1, C1) -> + D = D0 - 1, + {Key, L2, C2} = from_form(KF, S, D, L1, C1), + {Val, L3, C3} = from_form(VF, S, D, L2, C2), + {Pairs0, L4, C4} = PairsFromForm(T, L3 - 1, C3), + case Oper of + map_field_assoc -> {[{Key,?opt, Val}|Pairs0], L4, C4}; + map_field_exact -> {[{Key,?mand,Val}|Pairs0], L4, C4} + end + end(List, L, C), + try + {Pairs, DefK, DefV} = map_from_form(Pairs1, [], [], [], ?none, ?none), + {t_map(Pairs, DefK, DefV), L5, C5} + catch none -> {t_none(), L5, C5} + end; +from_form({type, _L, mfa, []}, _S, _D, L, C) -> + {t_mfa(), L, C}; +from_form({type, _L, module, []}, _S, _D, L, C) -> + {t_module(), L, C}; +from_form({type, _L, nil, []}, _S, _D, L, C) -> + {t_nil(), L, C}; +from_form({type, _L, neg_integer, []}, _S, _D, L, C) -> + {t_neg_integer(), L, C}; +from_form({type, _L, non_neg_integer, []}, _S, _D, L, C) -> + {t_non_neg_integer(), L, C}; +from_form({type, _L, no_return, []}, _S, _D, L, C) -> + {t_unit(), L, C}; +from_form({type, _L, node, []}, _S, _D, L, C) -> + {t_node(), L, C}; +from_form({type, _L, none, []}, _S, _D, L, C) -> + {t_none(), L, C}; +from_form({type, _L, nonempty_list, []}, _S, _D, L, C) -> + {t_nonempty_list(), L, C}; +from_form({type, _L, nonempty_list, [Type]}, S, D, L, C) -> + {T, L1, C1} = from_form(Type, S, D, L - 1, C), + {t_nonempty_list(T), L1, C1}; +from_form({type, _L, nonempty_improper_list, [Cont, Term]}, S, D, L, C) -> + {T1, L1, C1} = from_form(Cont, S, D, L - 1, C), + {T2, L2, C2} = from_form(Term, S, D, L1, C1), + {t_cons(T1, T2), L2, C2}; +from_form({type, _L, nonempty_maybe_improper_list, []}, _S, _D, L, C) -> + {t_cons(?any, ?any), L, C}; +from_form({type, _L, nonempty_maybe_improper_list, [Cont, Term]}, + S, D, L, C) -> + {T1, L1, C1} = from_form(Cont, S, D, L - 1, C), + {T2, L2, C2} = from_form(Term, S, D, L1, C1), + {t_cons(T1, T2), L2, C2}; +from_form({type, _L, nonempty_string, []}, _S, _D, L, C) -> + {t_nonempty_string(), L, C}; +from_form({type, _L, number, []}, _S, _D, L, C) -> + {t_number(), L, C}; +from_form({type, _L, pid, []}, _S, _D, L, C) -> + {t_pid(), L, C}; +from_form({type, _L, port, []}, _S, _D, L, C) -> + {t_port(), L, C}; +from_form({type, _L, pos_integer, []}, _S, _D, L, C) -> + {t_pos_integer(), L, C}; +from_form({type, _L, maybe_improper_list, []}, _S, _D, L, C) -> + {t_maybe_improper_list(), L, C}; +from_form({type, _L, maybe_improper_list, [Content, Termination]}, + S, D, L, C) -> + {T1, L1, C1} = from_form(Content, S, D, L - 1, C), + {T2, L2, C2} = from_form(Termination, S, D, L1, C1), + {t_maybe_improper_list(T1, T2), L2, C2}; +from_form({type, _L, product, Elements}, S, D, L, C) -> + {Lst, L1, C1} = list_from_form(Elements, S, D - 1, L, C), + {t_product(Lst), L1, C1}; +from_form({type, _L, range, [From, To]} = Type, _S, _D, L, C) -> + case {erl_eval:partial_eval(From), erl_eval:partial_eval(To)} of + {{integer, _, FromVal}, {integer, _, ToVal}} -> + {t_from_range(FromVal, ToVal), L, C}; + _ -> throw({error, io_lib:format("Unable to evaluate type ~w\n", [Type])}) + end; +from_form({type, _L, record, [Name|Fields]}, S, D, L, C) -> + record_from_form(Name, Fields, S, D, L, C); +from_form({type, _L, reference, []}, _S, _D, L, C) -> + {t_reference(), L, C}; +from_form({type, _L, string, []}, _S, _D, L, C) -> + {t_string(), L, C}; +from_form({type, _L, term, []}, _S, _D, L, C) -> + {t_any(), L, C}; +from_form({type, _L, timeout, []}, _S, _D, L, C) -> + {t_timeout(), L, C}; +from_form({type, _L, tuple, any}, _S, _D, L, C) -> + {t_tuple(), L, C}; +from_form({type, _L, tuple, Args}, S, D, L, C) -> + {Lst, L1, C1} = list_from_form(Args, S, D - 1, L, C), + {t_tuple(Lst), L1, C1}; +from_form({type, _L, union, Args}, S, D, L, C) -> + {Lst, L1, C1} = list_from_form(Args, S, D, L, C), + {t_sup(Lst), L1, C1}; +from_form({user_type, _L, Name, Args}, S, D, L, C) -> + type_from_form(Name, Args, S, D, L, C); +from_form({type, _L, Name, Args}, S, D, L, C) -> + %% Compatibility: modules compiled before Erlang/OTP 18.0. + type_from_form(Name, Args, S, D, L, C); +from_form({opaque, _L, Name, {Mod, Args, Rep}}, _S, _D, L, C) -> + %% XXX. To be removed. + {t_opaque(Mod, Name, Args, Rep), L, C}. + +builtin_type(Name, Type, S, D, L, C) -> + #from_form{site = Site, mrecs = MR} = S, + M = site_module(Site), + case dict:find(M, MR) of + {ok, R} -> + case lookup_type(Name, 0, R) of + {_, {{_M, _FL, _F, _A}, _T}} -> + type_from_form(Name, [], S, D, L, C); + error -> + {Type, L, C} + end; + error -> + {Type, L, C} + end. + +type_from_form(Name, Args, S, D, L, C) -> + #from_form{site = Site, mrecs = MR, tnames = TypeNames} = S, + ArgsLen = length(Args), + Module = site_module(Site), + TypeName = {type, {Module, Name, ArgsLen}}, + case can_unfold_more(TypeName, TypeNames) of + true -> + {ok, R} = dict:find(Module, MR), + type_from_form1(Name, Args, ArgsLen, R, TypeName, TypeNames, + S, D, L, C); + false -> + {t_any(), L, C} + end. + +type_from_form1(Name, Args, ArgsLen, R, TypeName, TypeNames, S, D, L, C) -> + case lookup_type(Name, ArgsLen, R) of + {Tag, {{Module, _FileName, Form, ArgNames}, Type}} -> + NewTypeNames = [TypeName|TypeNames], + S1 = S#from_form{tnames = NewTypeNames}, + {ArgTypes, L1, C1} = list_from_form(Args, S1, D, L, C), + CKey = cache_key(Module, Name, ArgTypes, TypeNames, D), + case cache_find(CKey, C) of + {CachedType, DeltaL} -> + {CachedType, L1 - DeltaL, C}; + error -> + List = lists:zip(ArgNames, ArgTypes), + TmpV = maps:from_list(List), + S2 = S1#from_form{site = TypeName, vtab = TmpV}, + Fun = fun(DD, LL) -> from_form(Form, S2, DD, LL, C1) end, + {NewType, L3, C3} = + case Tag of + type -> + recur_limit(Fun, D, L1, TypeName, TypeNames); + opaque -> + {Rep, L2, C2} = recur_limit(Fun, D, L1, TypeName, TypeNames), + Rep1 = choose_opaque_type(Rep, Type), + Rep2 = case cannot_have_opaque(Rep1, TypeName, TypeNames) of + true -> Rep1; + false -> + ArgTypes2 = subst_all_vars_to_any_list(ArgTypes), + t_opaque(Module, Name, ArgTypes2, Rep1) + end, + {Rep2, L2, C2} + end, + C4 = cache_put(CKey, NewType, L1 - L3, C3), + {NewType, L3, C4} + end; + error -> + Msg = io_lib:format("Unable to find type ~w/~w\n", + [Name, ArgsLen]), + throw({error, Msg}) + end. + +remote_from_form(RemMod, Name, Args, S, D, L, C) -> + #from_form{xtypes = ET, mrecs = MR, tnames = TypeNames} = S, + if + ET =:= replace_by_none -> + {t_none(), L, C}; + true -> + ArgsLen = length(Args), + MFA = {RemMod, Name, ArgsLen}, + case dict:find(RemMod, MR) of + error -> + self() ! {self(), ext_types, MFA}, + {t_any(), L, C}; + {ok, RemDict} -> + case sets:is_element(MFA, ET) of + true -> + RemType = {type, MFA}, + case can_unfold_more(RemType, TypeNames) of + true -> + remote_from_form1(RemMod, Name, Args, ArgsLen, RemDict, + RemType, TypeNames, S, D, L, C); + false -> + {t_any(), L, C} + end; + false -> + self() ! {self(), ext_types, {RemMod, Name, ArgsLen}}, + {t_any(), L, C} + end + end + end. + +remote_from_form1(RemMod, Name, Args, ArgsLen, RemDict, RemType, TypeNames, + S, D, L, C) -> + case lookup_type(Name, ArgsLen, RemDict) of + {Tag, {{Mod, _FileLine, Form, ArgNames}, Type}} -> + NewTypeNames = [RemType|TypeNames], + S1 = S#from_form{tnames = NewTypeNames}, + {ArgTypes, L1, C1} = list_from_form(Args, S1, D, L, C), + CKey = cache_key(RemMod, Name, ArgTypes, TypeNames, D), + %% case error of + case cache_find(CKey, C) of + {CachedType, DeltaL} -> + {CachedType, L - DeltaL, C}; + error -> + List = lists:zip(ArgNames, ArgTypes), + TmpVarTab = maps:from_list(List), + S2 = S1#from_form{site = RemType, vtab = TmpVarTab}, + Fun = fun(DD, LL) -> from_form(Form, S2, DD, LL, C1) end, + {NewType, L3, C3} = + case Tag of + type -> + recur_limit(Fun, D, L1, RemType, TypeNames); + opaque -> + {NewRep, L2, C2} = recur_limit(Fun, D, L1, RemType, TypeNames), + NewRep1 = choose_opaque_type(NewRep, Type), + NewRep2 = + case cannot_have_opaque(NewRep1, RemType, TypeNames) of + true -> NewRep1; + false -> + ArgTypes2 = subst_all_vars_to_any_list(ArgTypes), + t_opaque(Mod, Name, ArgTypes2, NewRep1) + end, + {NewRep2, L2, C2} + end, + C4 = cache_put(CKey, NewType, L1 - L3, C3), + {NewType, L3, C4} + end; + error -> + Msg = io_lib:format("Unable to find remote type ~w:~w()\n", + [RemMod, Name]), + throw({error, Msg}) + end. + +subst_all_vars_to_any_list(Types) -> + [subst_all_vars_to_any(Type) || Type <- Types]. + +%% Opaque types (both local and remote) are problematic when it comes +%% to the limits (TypeNames, D, and L). The reason is that if any() is +%% substituted for a more specialized subtype of an opaque type, the +%% property stated along with decorate_with_opaque() (the type has to +%% be a subtype of the declared type) no longer holds. +%% +%% The less than perfect remedy: if the opaque type created from a +%% form is not a subset of the declared type, the declared type is +%% used instead, effectively bypassing the limits, and potentially +%% resulting in huge types. +choose_opaque_type(Type, DeclType) -> + case + t_is_subtype(subst_all_vars_to_any(Type), + subst_all_vars_to_any(DeclType)) + of + true -> Type; + false -> DeclType + end. + +record_from_form({atom, _, Name}, ModFields, S, D0, L0, C) -> + #from_form{site = Site, mrecs = MR, tnames = TypeNames} = S, + RecordType = {record, Name}, + case can_unfold_more(RecordType, TypeNames) of + true -> + M = site_module(Site), + {ok, R} = dict:find(M, MR), + case lookup_record(Name, R) of + {ok, DeclFields} -> + NewTypeNames = [RecordType|TypeNames], + Site1 = {record, {M, Name, length(DeclFields)}}, + S1 = S#from_form{site = Site1, tnames = NewTypeNames}, + Fun = fun(D, L) -> + {GetModRec, L1, C1} = + get_mod_record(ModFields, DeclFields, S1, D, L, C), + case GetModRec of + {error, FieldName} -> + throw({error, + io_lib:format("Illegal declaration of #~w{~w}\n", + [Name, FieldName])}); + {ok, NewFields} -> + S2 = S1#from_form{vtab = var_table__new()}, + {NewFields1, L2, C2} = + fields_from_form(NewFields, S2, D, L1, C1), + Rec = t_tuple( + [t_atom(Name)|[Type + || {_FieldName, Type} <- NewFields1]]), + {Rec, L2, C2} + end + end, + recur_limit(Fun, D0, L0, RecordType, TypeNames); + error -> + throw({error, io_lib:format("Unknown record #~w{}\n", [Name])}) + end; + false -> + {t_any(), L0, C} + end. + +get_mod_record([], DeclFields, _S, _D, L, C) -> + {{ok, DeclFields}, L, C}; +get_mod_record(ModFields, DeclFields, S, D, L, C) -> + DeclFieldsDict = lists:keysort(1, DeclFields), + {ModFieldsDict, L1, C1} = build_field_dict(ModFields, S, D, L, C), + case get_mod_record_types(DeclFieldsDict, ModFieldsDict, []) of + {error, _FieldName} = Error -> {Error, L1, C1}; + {ok, FinalKeyDict} -> + Fields = [lists:keyfind(FieldName, 1, FinalKeyDict) + || {FieldName, _, _} <- DeclFields], + {{ok, Fields}, L1, C1} + end. + +build_field_dict(FieldTypes, S, D, L, C) -> + build_field_dict(FieldTypes, S, D, L, C, []). + +build_field_dict([{type, _, field_type, [{atom, _, Name}, Type]}|Left], + S, D, L, C, Acc) -> + {T, L1, C1} = from_form(Type, S, D, L - 1, C), + NewAcc = [{Name, Type, T}|Acc], + build_field_dict(Left, S, D, L1, C1, NewAcc); +build_field_dict([], _S, _D, L, C, Acc) -> + {lists:keysort(1, Acc), L, C}. + +get_mod_record_types([{FieldName, _Abstr, _DeclType}|Left1], + [{FieldName, TypeForm, ModType}|Left2], + Acc) -> + get_mod_record_types(Left1, Left2, [{FieldName, TypeForm, ModType}|Acc]); +get_mod_record_types([{FieldName1, _Abstr, _DeclType} = DT|Left1], + [{FieldName2, _FormType, _ModType}|_] = List2, + Acc) when FieldName1 < FieldName2 -> + get_mod_record_types(Left1, List2, [DT|Acc]); +get_mod_record_types(Left1, [], Acc) -> + {ok, lists:keysort(1, Left1++Acc)}; +get_mod_record_types(_, [{FieldName2, _FormType, _ModType}|_], _Acc) -> + {error, FieldName2}. + +%% It is important to create a limited version of the record type +%% since nested record types can otherwise easily result in huge +%% terms. +fields_from_form([], _S, _D, L, C) -> + {[], L, C}; +fields_from_form([{Name, Abstr, _Type}|Tail], S, D, L, C) -> + {T, L1, C1} = from_form(Abstr, S, D, L, C), + {F, L2, C2} = fields_from_form(Tail, S, D, L1, C1), + {[{Name, T}|F], L2, C2}. + +list_from_form([], _S, _D, L, C) -> + {[], L, C}; +list_from_form([H|Tail], S, D, L, C) -> + {H1, L1, C1} = from_form(H, S, D, L - 1, C), + {T1, L2, C2} = list_from_form(Tail, S, D, L1, C1), + {[H1|T1], L2, C2}. + +%% Sorts, combines non-singleton pairs, and applies precendence and +%% mandatoriness rules. +map_from_form([], ShdwPs, MKs, Pairs, DefK, DefV) -> + verify_possible(MKs, ShdwPs), + {promote_to_mand(MKs, Pairs), DefK, DefV}; +map_from_form([{SKey,MNess,Val}|SPairs], ShdwPs0, MKs0, Pairs0, DefK0, DefV0) -> + Key = lists:foldl(fun({K,_},S)->t_subtract(S,K)end, SKey, ShdwPs0), + ShdwPs = case Key of ?none -> ShdwPs0; _ -> [{Key,Val}|ShdwPs0] end, + MKs = case MNess of ?mand -> [SKey|MKs0]; ?opt -> MKs0 end, + if MNess =:= ?mand, SKey =:= ?none -> throw(none); + true -> ok + end, + {Pairs, DefK, DefV} = + case is_singleton_type(Key) of + true -> + MNess1 = case Val =:= ?none of true -> ?opt; false -> MNess end, + {mapdict_insert({Key,MNess1,Val}, Pairs0), DefK0, DefV0}; + false -> + case Key =:= ?none orelse Val =:= ?none of + true -> {Pairs0, DefK0, DefV0}; + false -> {Pairs0, t_sup(DefK0, Key), t_sup(DefV0, Val)} + end + end, + map_from_form(SPairs, ShdwPs, MKs, Pairs, DefK, DefV). + +%% Verifies that all mandatory keys are possible, throws 'none' otherwise +verify_possible(MKs, ShdwPs) -> + lists:foreach(fun(M) -> verify_possible_1(M, ShdwPs) end, MKs). + +verify_possible_1(M, ShdwPs) -> + case lists:any(fun({K,_}) -> t_inf(M, K) =/= ?none end, ShdwPs) of + true -> ok; + false -> throw(none) + end. + +-spec promote_to_mand([erl_type()], t_map_dict()) -> t_map_dict(). + +promote_to_mand(_, []) -> []; +promote_to_mand(MKs, [E={K,_,V}|T]) -> + [case lists:any(fun(M) -> t_is_equal(K,M) end, MKs) of + true -> {K, ?mand, V}; + false -> E + end|promote_to_mand(MKs, T)]. + +-define(RECUR_EXPAND_LIMIT, 10). +-define(RECUR_EXPAND_DEPTH, 2). + +%% If more of the limited resources is spent on the non-recursive +%% forms, more warnings are found. And the analysis is also a bit +%% faster. +%% +%% Setting REC_TYPE_LIMIT to 1 would work also work well. + +recur_limit(Fun, D, L, _, _) when L =< ?RECUR_EXPAND_DEPTH, + D =< ?RECUR_EXPAND_LIMIT -> + Fun(D, L); +recur_limit(Fun, D, L, TypeName, TypeNames) -> + case is_recursive(TypeName, TypeNames) of + true -> + {T, L1, C1} = Fun(?RECUR_EXPAND_DEPTH, ?RECUR_EXPAND_LIMIT), + {T, L - L1, C1}; + false -> + Fun(D, L) + end. + +-spec t_check_record_fields(parse_form(), sets:set(mfa()), site(), + mod_records(), var_table(), cache()) -> cache(). + +t_check_record_fields(Form, ExpTypes, Site, RecDict, VarTable, Cache) -> + State = #from_form{site = Site, + xtypes = ExpTypes, + mrecs = RecDict, + vtab = VarTable, + tnames = []}, + check_record_fields(Form, State, Cache). + +-spec check_record_fields(parse_form(), #from_form{}, cache()) -> cache(). + +%% If there is something wrong with parse_form() +%% throw({error, io_lib:chars()} is called. + +check_record_fields({var, _L, _}, _S, C) -> C; +check_record_fields({ann_type, _L, [_Var, Type]}, S, C) -> + check_record_fields(Type, S, C); +check_record_fields({paren_type, _L, [Type]}, S, C) -> + check_record_fields(Type, S, C); +check_record_fields({remote_type, _L, [{atom, _, _}, {atom, _, _}, Args]}, + S, C) -> + list_check_record_fields(Args, S, C); +check_record_fields({atom, _L, _}, _S, C) -> C; +check_record_fields({integer, _L, _}, _S, C) -> C; +check_record_fields({op, _L, _Op, _Arg}, _S, C) -> C; +check_record_fields({op, _L, _Op, _Arg1, _Arg2}, _S, C) -> C; +check_record_fields({type, _L, tuple, any}, _S, C) -> C; +check_record_fields({type, _L, map, any}, _S, C) -> C; +check_record_fields({type, _L, binary, [_Base, _Unit]}, _S, C) -> C; +check_record_fields({type, _L, 'fun', [{type, _, any}, Range]}, S, C) -> + check_record_fields(Range, S, C); +check_record_fields({type, _L, range, [_From, _To]}, _S, C) -> C; +check_record_fields({type, _L, record, [Name|Fields]}, S, C) -> + check_record(Name, Fields, S, C); +check_record_fields({type, _L, _, Args}, S, C) -> + list_check_record_fields(Args, S, C); +check_record_fields({user_type, _L, _Name, Args}, S, C) -> + list_check_record_fields(Args, S, C). + +check_record({atom, _, Name}, ModFields, S, C) -> + #from_form{site = Site, mrecs = MR} = S, + M = site_module(Site), + {ok, R} = dict:find(M, MR), + {ok, DeclFields} = lookup_record(Name, R), + case check_fields(Name, ModFields, DeclFields, S, C) of + {error, FieldName} -> + throw({error, io_lib:format("Illegal declaration of #~w{~w}\n", + [Name, FieldName])}); + C1 -> C1 + end. + +check_fields(RecName, [{type, _, field_type, [{atom, _, Name}, Abstr]}|Left], + DeclFields, S, C) -> + #from_form{site = Site0, xtypes = ET, mrecs = MR, vtab = V} = S, + M = site_module(Site0), + Site = {record, {M, RecName, length(DeclFields)}}, + {Type, C1} = t_from_form(Abstr, ET, Site, MR, V, C), + {Name, _, DeclType} = lists:keyfind(Name, 1, DeclFields), + TypeNoVars = subst_all_vars_to_any(Type), + case t_is_subtype(TypeNoVars, DeclType) of + false -> {error, Name}; + true -> check_fields(RecName, Left, DeclFields, S, C1) + end; +check_fields(_RecName, [], _Decl, _S, C) -> + C. + +list_check_record_fields([], _S, C) -> + C; +list_check_record_fields([H|Tail], S, C) -> + C1 = check_record_fields(H, S, C), + list_check_record_fields(Tail, S, C1). + +site_module({_, {Module, _, _}}) -> + Module. + +-spec cache__new() -> cache(). + +cache__new() -> + maps:new(). + +-spec cache_key(module(), atom(), [erl_type()], + type_names(), expand_depth()) -> cache_key(). + +%% If TypeNames is left out from the key, the cache is smaller, and +%% the form-to-type translation is faster. But it would be a shame if, +%% for example, any() is used, where a more complex type should be +%% used. There is also a slight risk of creating unnecessarily big +%% types. + +cache_key(Module, Name, ArgTypes, TypeNames, D) -> + {Module, Name, D, ArgTypes, TypeNames}. + +-spec cache_find(cache_key(), cache()) -> + {erl_type(), expand_limit()} | 'error'. + +cache_find(Key, Cache) -> + case maps:find(Key, Cache) of + {ok, Value} -> + Value; + error -> + error + end. + +-spec cache_put(cache_key(), erl_type(), expand_limit(), cache()) -> cache(). + +cache_put(_Key, _Type, DeltaL, Cache) when DeltaL < 0 -> + %% The type is truncated; do not reuse it. + Cache; +cache_put(Key, Type, DeltaL, Cache) -> + maps:put(Key, {Type, DeltaL}, Cache). + +-spec t_var_names([erl_type()]) -> [atom()]. + +t_var_names([{var, _, Name}|L]) when L =/= '_' -> + [Name|t_var_names(L)]; +t_var_names([]) -> + []. + +-spec t_form_to_string(parse_form()) -> string(). + +t_form_to_string({var, _L, '_'}) -> "_"; +t_form_to_string({var, _L, Name}) -> atom_to_list(Name); +t_form_to_string({atom, _L, Atom}) -> + io_lib:write_string(atom_to_list(Atom), $'); % To quote or not to quote... ' +t_form_to_string({integer, _L, Int}) -> integer_to_list(Int); +t_form_to_string({op, _L, _Op, _Arg} = Op) -> + case erl_eval:partial_eval(Op) of + {integer, _, _} = Int -> t_form_to_string(Int); + _ -> io_lib:format("Badly formed type ~w", [Op]) + end; +t_form_to_string({op, _L, _Op, _Arg1, _Arg2} = Op) -> + case erl_eval:partial_eval(Op) of + {integer, _, _} = Int -> t_form_to_string(Int); + _ -> io_lib:format("Badly formed type ~w", [Op]) + end; +t_form_to_string({ann_type, _L, [Var, Type]}) -> + t_form_to_string(Var) ++ "::" ++ t_form_to_string(Type); +t_form_to_string({paren_type, _L, [Type]}) -> + flat_format("(~s)", [t_form_to_string(Type)]); +t_form_to_string({remote_type, _L, [{atom, _, Mod}, {atom, _, Name}, Args]}) -> + ArgString = "(" ++ string:join(t_form_to_string_list(Args), ",") ++ ")", + flat_format("~w:~w", [Mod, Name]) ++ ArgString; +t_form_to_string({type, _L, arity, []}) -> "arity()"; +t_form_to_string({type, _L, binary, []}) -> "binary()"; +t_form_to_string({type, _L, binary, [Base, Unit]} = Type) -> + case {erl_eval:partial_eval(Base), erl_eval:partial_eval(Unit)} of + {{integer, _, B}, {integer, _, U}} -> + %% the following mirrors the clauses of t_to_string/2 + case {U, B} of + {0, 0} -> "<<>>"; + {8, 0} -> "binary()"; + {1, 0} -> "bitstring()"; + {0, B} -> flat_format("<<_:~w>>", [B]); + {U, 0} -> flat_format("<<_:_*~w>>", [U]); + {U, B} -> flat_format("<<_:~w,_:_*~w>>", [B, U]) + end; + _ -> io_lib:format("Badly formed bitstr type ~w", [Type]) + end; +t_form_to_string({type, _L, bitstring, []}) -> "bitstring()"; +t_form_to_string({type, _L, 'fun', []}) -> "fun()"; +t_form_to_string({type, _L, 'fun', [{type, _, any}, Range]}) -> + "fun(...) -> " ++ t_form_to_string(Range); +t_form_to_string({type, _L, 'fun', [{type, _, product, Domain}, Range]}) -> + "fun((" ++ string:join(t_form_to_string_list(Domain), ",") ++ ") -> " + ++ t_form_to_string(Range) ++ ")"; +t_form_to_string({type, _L, iodata, []}) -> "iodata()"; +t_form_to_string({type, _L, iolist, []}) -> "iolist()"; +t_form_to_string({type, _L, list, [Type]}) -> + "[" ++ t_form_to_string(Type) ++ "]"; +t_form_to_string({type, _L, map, any}) -> "map()"; +t_form_to_string({type, _L, map, Args}) -> + "#{" ++ string:join(t_form_to_string_list(Args), ",") ++ "}"; +t_form_to_string({type, _L, map_field_assoc, [Key, Val]}) -> + t_form_to_string(Key) ++ "=>" ++ t_form_to_string(Val); +t_form_to_string({type, _L, map_field_exact, [Key, Val]}) -> + t_form_to_string(Key) ++ ":=" ++ t_form_to_string(Val); +t_form_to_string({type, _L, mfa, []}) -> "mfa()"; +t_form_to_string({type, _L, module, []}) -> "module()"; +t_form_to_string({type, _L, node, []}) -> "node()"; +t_form_to_string({type, _L, nonempty_list, [Type]}) -> + "[" ++ t_form_to_string(Type) ++ ",...]"; +t_form_to_string({type, _L, nonempty_string, []}) -> "nonempty_string()"; +t_form_to_string({type, _L, product, Elements}) -> + "<" ++ string:join(t_form_to_string_list(Elements), ",") ++ ">"; +t_form_to_string({type, _L, range, [From, To]} = Type) -> + case {erl_eval:partial_eval(From), erl_eval:partial_eval(To)} of + {{integer, _, FromVal}, {integer, _, ToVal}} -> + flat_format("~w..~w", [FromVal, ToVal]); + _ -> flat_format("Badly formed type ~w",[Type]) + end; +t_form_to_string({type, _L, record, [{atom, _, Name}]}) -> + flat_format("#~w{}", [Name]); +t_form_to_string({type, _L, record, [{atom, _, Name}|Fields]}) -> + FieldString = string:join(t_form_to_string_list(Fields), ","), + flat_format("#~w{~s}", [Name, FieldString]); +t_form_to_string({type, _L, field_type, [{atom, _, Name}, Type]}) -> + flat_format("~w::~s", [Name, t_form_to_string(Type)]); +t_form_to_string({type, _L, term, []}) -> "term()"; +t_form_to_string({type, _L, timeout, []}) -> "timeout()"; +t_form_to_string({type, _L, tuple, any}) -> "tuple()"; +t_form_to_string({type, _L, tuple, Args}) -> + "{" ++ string:join(t_form_to_string_list(Args), ",") ++ "}"; +t_form_to_string({type, _L, union, Args}) -> + string:join(t_form_to_string_list(Args), " | "); +t_form_to_string({type, _L, Name, []} = T) -> + try + M = mod, + D0 = dict:new(), + MR = dict:from_list([{M, D0}]), + Site = {type, {M,Name,0}}, + V = var_table__new(), + C = cache__new(), + State = #from_form{site = Site, + xtypes = sets:new(), + mrecs = MR, + vtab = V, + tnames = []}, + {T1, _, _} = from_form(T, State, _Deep=1000, _ALot=1000000, C), + t_to_string(T1) + catch throw:{error, _} -> atom_to_string(Name) ++ "()" + end; +t_form_to_string({user_type, _L, Name, List}) -> + flat_format("~w(~s)", + [Name, string:join(t_form_to_string_list(List), ",")]); +t_form_to_string({type, L, Name, List}) -> + %% Compatibility: modules compiled before Erlang/OTP 18.0. + t_form_to_string({user_type, L, Name, List}). + +t_form_to_string_list(List) -> + t_form_to_string_list(List, []). + +t_form_to_string_list([H|T], Acc) -> + t_form_to_string_list(T, [t_form_to_string(H)|Acc]); +t_form_to_string_list([], Acc) -> + lists:reverse(Acc). + +-spec atom_to_string(atom()) -> string(). + +atom_to_string(Atom) -> + flat_format("~w", [Atom]). + +%%============================================================================= +%% +%% Utilities +%% +%%============================================================================= + +-spec any_none([erl_type()]) -> boolean(). + +any_none([?none|_Left]) -> true; +any_none([_|Left]) -> any_none(Left); +any_none([]) -> false. + +-spec any_none_or_unit([erl_type()]) -> boolean(). + +any_none_or_unit([?none|_]) -> true; +any_none_or_unit([?unit|_]) -> true; +any_none_or_unit([_|Left]) -> any_none_or_unit(Left); +any_none_or_unit([]) -> false. + +-spec is_erl_type(any()) -> boolean(). + +is_erl_type(?any) -> true; +is_erl_type(?none) -> true; +is_erl_type(?unit) -> true; +is_erl_type(#c{}) -> true; +is_erl_type(_) -> false. + +-spec lookup_record(atom(), type_table()) -> + 'error' | {'ok', [{atom(), parse_form(), erl_type()}]}. + +lookup_record(Tag, RecDict) when is_atom(Tag) -> + case dict:find({record, Tag}, RecDict) of + {ok, {_FileLine, [{_Arity, Fields}]}} -> + {ok, Fields}; + {ok, {_FileLine, List}} when is_list(List) -> + %% This will have to do, since we do not know which record we + %% are looking for. + error; + error -> + error + end. + +-spec lookup_record(atom(), arity(), type_table()) -> + 'error' | {'ok', [{atom(), parse_form(), erl_type()}]}. + +lookup_record(Tag, Arity, RecDict) when is_atom(Tag) -> + case dict:find({record, Tag}, RecDict) of + {ok, {_FileLine, [{Arity, Fields}]}} -> {ok, Fields}; + {ok, {_FileLine, OrdDict}} -> orddict:find(Arity, OrdDict); + error -> error + end. + +-spec lookup_type(_, _, _) -> {'type' | 'opaque', type_value()} | 'error'. +lookup_type(Name, Arity, RecDict) -> + case dict:find({type, Name, Arity}, RecDict) of + error -> + case dict:find({opaque, Name, Arity}, RecDict) of + error -> error; + {ok, Found} -> {opaque, Found} + end; + {ok, Found} -> {type, Found} + end. + +-spec type_is_defined('type' | 'opaque', atom(), arity(), type_table()) -> + boolean(). + +type_is_defined(TypeOrOpaque, Name, Arity, RecDict) -> + dict:is_key({TypeOrOpaque, Name, Arity}, RecDict). + +cannot_have_opaque(Type, TypeName, TypeNames) -> + t_is_none(Type) orelse is_recursive(TypeName, TypeNames). + +is_recursive(TypeName, TypeNames) -> + lists:member(TypeName, TypeNames). + +can_unfold_more(TypeName, TypeNames) -> + Fun = fun(E, Acc) -> case E of TypeName -> Acc + 1; _ -> Acc end end, + lists:foldl(Fun, 0, TypeNames) < ?REC_TYPE_LIMIT. + +-spec do_opaque(erl_type(), opaques(), fun((_) -> T)) -> T. + +%% Probably a little faster than calling t_unopaque/2. +%% Unions that are due to opaque types are unopaqued. +do_opaque(?opaque(_) = Type, Opaques, Pred) -> + case Opaques =:= 'universe' orelse is_opaque_type(Type, Opaques) of + true -> do_opaque(t_opaque_structure(Type), Opaques, Pred); + false -> Pred(Type) + end; +do_opaque(?union(List) = Type, Opaques, Pred) -> + [A,B,F,I,L,N,T,M,O,Map] = List, + if O =:= ?none -> Pred(Type); + true -> + case Opaques =:= 'universe' orelse is_opaque_type(O, Opaques) of + true -> + S = t_opaque_structure(O), + do_opaque(t_sup([A,B,F,I,L,N,T,M,S,Map]), Opaques, Pred); + false -> Pred(Type) + end + end; +do_opaque(Type, _Opaques, Pred) -> + Pred(Type). + +map_all_values(?map(Pairs,_,DefV)) -> + [DefV|[V || {V, _, _} <- Pairs]]. + +map_all_keys(?map(Pairs,DefK,_)) -> + [DefK|[K || {_, _, K} <- Pairs]]. + +map_all_types(M) -> + map_all_keys(M) ++ map_all_values(M). + +%% Tests if a type has exactly one possible value. +-spec t_is_singleton(erl_type()) -> boolean(). + +t_is_singleton(Type) -> + t_is_singleton(Type, 'universe'). + +-spec t_is_singleton(erl_type(), opaques()) -> boolean(). + +t_is_singleton(Type, Opaques) -> + do_opaque(Type, Opaques, fun is_singleton_type/1). + +%% Incomplete; not all representable singleton types are included. +is_singleton_type(?nil) -> true; +is_singleton_type(?atom(?any)) -> false; +is_singleton_type(?atom(Set)) -> + ordsets:size(Set) =:= 1; +is_singleton_type(?int_range(V, V)) -> true; +is_singleton_type(?int_set(Set)) -> + ordsets:size(Set) =:= 1; +is_singleton_type(?tuple(Types, Arity, _)) when is_integer(Arity) -> + lists:all(fun is_singleton_type/1, Types); +is_singleton_type(?tuple_set([{Arity, [OnlyTuple]}])) when is_integer(Arity) -> + is_singleton_type(OnlyTuple); +is_singleton_type(?map(Pairs, ?none, ?none)) -> + lists:all(fun({_,MNess,V}) -> MNess =:= ?mand andalso is_singleton_type(V) + end, Pairs); +is_singleton_type(_) -> + false. + +%% Returns the only possible value of a singleton type. +-spec t_singleton_to_term(erl_type(), opaques()) -> term(). + +t_singleton_to_term(Type, Opaques) -> + do_opaque(Type, Opaques, fun singleton_type_to_term/1). + +singleton_type_to_term(?nil) -> []; +singleton_type_to_term(?atom(Set)) when Set =/= ?any -> + case ordsets:size(Set) of + 1 -> hd(ordsets:to_list(Set)); + _ -> error(badarg) + end; +singleton_type_to_term(?int_range(V, V)) -> V; +singleton_type_to_term(?int_set(Set)) -> + case ordsets:size(Set) of + 1 -> hd(ordsets:to_list(Set)); + _ -> error(badarg) + end; +singleton_type_to_term(?tuple(Types, Arity, _)) when is_integer(Arity) -> + lists:map(fun singleton_type_to_term/1, Types); +singleton_type_to_term(?tuple_set([{Arity, [OnlyTuple]}])) + when is_integer(Arity) -> + singleton_type_to_term(OnlyTuple); +singleton_type_to_term(?map(Pairs, ?none, ?none)) -> + maps:from_list([{singleton_type_to_term(K), singleton_type_to_term(V)} + || {K,?mand,V} <- Pairs]). + +%% ----------------------------------- +%% Set +%% + +set_singleton(Element) -> + ordsets:from_list([Element]). + +set_is_singleton(Element, Set) -> + set_singleton(Element) =:= Set. + +set_is_element(Element, Set) -> + ordsets:is_element(Element, Set). + +set_union(?any, _) -> ?any; +set_union(_, ?any) -> ?any; +set_union(S1, S2) -> + case ordsets:union(S1, S2) of + S when length(S) =< ?SET_LIMIT -> S; + _ -> ?any + end. + +%% The intersection and subtraction can return ?none. +%% This should always be handled right away since ?none is not a valid set. +%% However, ?any is considered a valid set. + +set_intersection(?any, S) -> S; +set_intersection(S, ?any) -> S; +set_intersection(S1, S2) -> + case ordsets:intersection(S1, S2) of + [] -> ?none; + S -> S + end. + +set_subtract(_, ?any) -> ?none; +set_subtract(?any, _) -> ?any; +set_subtract(S1, S2) -> + case ordsets:subtract(S1, S2) of + [] -> ?none; + S -> S + end. + +set_from_list(List) -> + case length(List) of + L when L =< ?SET_LIMIT -> ordsets:from_list(List); + L when L > ?SET_LIMIT -> ?any + end. + +set_to_list(Set) -> + ordsets:to_list(Set). + +set_filter(Fun, Set) -> + case ordsets:filter(Fun, Set) of + [] -> ?none; + NewSet -> NewSet + end. + +set_size(Set) -> + ordsets:size(Set). + +set_to_string(Set) -> + L = [case is_atom(X) of + true -> io_lib:write_string(atom_to_list(X), $'); % stupid emacs ' + false -> flat_format("~w", [X]) + end || X <- set_to_list(Set)], + string:join(L, " | "). + +set_min([H|_]) -> H. + +set_max(Set) -> + hd(lists:reverse(Set)). + +flat_format(F, S) -> + lists:flatten(io_lib:format(F, S)). + +%%============================================================================= +%% +%% Utilities for the binary type +%% +%%============================================================================= + +-spec gcd(integer(), integer()) -> integer(). + +gcd(A, B) when B > A -> + gcd1(B, A); +gcd(A, B) -> + gcd1(A, B). + +-spec gcd1(integer(), integer()) -> integer(). + +gcd1(A, 0) -> A; +gcd1(A, B) -> + case A rem B of + 0 -> B; + X -> gcd1(B, X) + end. + +-spec bitstr_concat(erl_type(), erl_type()) -> erl_type(). + +bitstr_concat(?none, _) -> ?none; +bitstr_concat(_, ?none) -> ?none; +bitstr_concat(?bitstr(U1, B1), ?bitstr(U2, B2)) -> + t_bitstr(gcd(U1, U2), B1+B2). + +-spec bitstr_match(erl_type(), erl_type()) -> erl_type(). + +bitstr_match(?none, _) -> ?none; +bitstr_match(_, ?none) -> ?none; +bitstr_match(?bitstr(0, B1), ?bitstr(0, B2)) when B1 =< B2 -> + t_bitstr(0, B2-B1); +bitstr_match(?bitstr(0, _B1), ?bitstr(0, _B2)) -> + ?none; +bitstr_match(?bitstr(0, B1), ?bitstr(U2, B2)) when B1 =< B2 -> + t_bitstr(U2, B2-B1); +bitstr_match(?bitstr(0, B1), ?bitstr(U2, B2)) -> + t_bitstr(U2, handle_base(U2, B2-B1)); +bitstr_match(?bitstr(_, B1), ?bitstr(0, B2)) when B1 > B2 -> + ?none; +bitstr_match(?bitstr(U1, B1), ?bitstr(U2, B2)) -> + GCD = gcd(U1, U2), + t_bitstr(GCD, handle_base(GCD, B2-B1)). + +-spec handle_base(integer(), integer()) -> integer(). + +handle_base(Unit, Pos) when Pos >= 0 -> + Pos rem Unit; +handle_base(Unit, Neg) -> + (Unit+(Neg rem Unit)) rem Unit. + +family(L) -> + R = sofs:relation(L), + F = sofs:relation_to_family(R), + sofs:to_external(F). + +%%============================================================================= +%% +%% Interface functions for abstract data types defined in this module +%% +%%============================================================================= + +-spec var_table__new() -> var_table(). + +var_table__new() -> + maps:new(). + +%%============================================================================= +%% Consistency-testing function(s) below +%%============================================================================= + +-ifdef(DO_ERL_TYPES_TEST). + +test() -> + Atom1 = t_atom(), + Atom2 = t_atom(foo), + Atom3 = t_atom(bar), + true = t_is_atom(Atom2), + + True = t_atom(true), + False = t_atom(false), + Bool = t_boolean(), + true = t_is_boolean(True), + true = t_is_boolean(Bool), + false = t_is_boolean(Atom1), + + Binary = t_binary(), + true = t_is_binary(Binary), + + Bitstr = t_bitstr(), + true = t_is_bitstr(Bitstr), + + Bitstr1 = t_bitstr(7, 3), + true = t_is_bitstr(Bitstr1), + false = t_is_binary(Bitstr1), + + Bitstr2 = t_bitstr(16, 8), + true = t_is_bitstr(Bitstr2), + true = t_is_binary(Bitstr2), + + ?bitstr(8, 16) = t_subtract(t_bitstr(4, 12), t_bitstr(8, 12)), + ?bitstr(8, 16) = t_subtract(t_bitstr(4, 12), t_bitstr(8, 12)), + + Int1 = t_integer(), + Int2 = t_integer(1), + Int3 = t_integer(16#ffffffff), + true = t_is_integer(Int2), + true = t_is_byte(Int2), + false = t_is_byte(Int3), + false = t_is_byte(t_from_range(-1, 1)), + true = t_is_byte(t_from_range(1, ?MAX_BYTE)), + + Tuple1 = t_tuple(), + Tuple2 = t_tuple(3), + Tuple3 = t_tuple([Atom1, Int1]), + Tuple4 = t_tuple([Tuple1, Tuple2]), + Tuple5 = t_tuple([Tuple3, Tuple4]), + Tuple6 = t_limit(Tuple5, 2), + Tuple7 = t_limit(Tuple5, 3), + true = t_is_tuple(Tuple1), + + Port = t_port(), + Pid = t_pid(), + Ref = t_reference(), + Identifier = t_identifier(), + false = t_is_reference(Port), + true = t_is_identifier(Port), + + Function1 = t_fun(), + Function2 = t_fun(Pid), + Function3 = t_fun([], Pid), + Function4 = t_fun([Port, Pid], Pid), + Function5 = t_fun([Pid, Atom1], Int2), + true = t_is_fun(Function3), + + List1 = t_list(), + List2 = t_list(t_boolean()), + List3 = t_cons(t_boolean(), List2), + List4 = t_cons(t_boolean(), t_atom()), + List5 = t_cons(t_boolean(), t_nil()), + List6 = t_cons_tl(List5), + List7 = t_sup(List4, List5), + List8 = t_inf(List7, t_list()), + List9 = t_cons(), + List10 = t_cons_tl(List9), + true = t_is_boolean(t_cons_hd(List5)), + true = t_is_list(List5), + false = t_is_list(List4), + + Product1 = t_product([Atom1, Atom2]), + Product2 = t_product([Atom3, Atom1]), + Product3 = t_product([Atom3, Atom2]), + + Union1 = t_sup(Atom2, Atom3), + Union2 = t_sup(Tuple2, Tuple3), + Union3 = t_sup(Int2, Atom3), + Union4 = t_sup(Port, Pid), + Union5 = t_sup(Union4, Int1), + Union6 = t_sup(Function1, Function2), + Union7 = t_sup(Function4, Function5), + Union8 = t_sup(True, False), + true = t_is_boolean(Union8), + Union9 = t_sup(Int2, t_integer(2)), + true = t_is_byte(Union9), + Union10 = t_sup(t_tuple([t_atom(true), ?any]), + t_tuple([t_atom(false), ?any])), + + ?any = t_sup(Product3, Function5), + + Atom3 = t_inf(Union3, Atom1), + Union2 = t_inf(Union2, Tuple1), + Int2 = t_inf(Int1, Union3), + Union4 = t_inf(Union4, Identifier), + Port = t_inf(Union5, Port), + Function4 = t_inf(Union7, Function4), + ?none = t_inf(Product2, Atom1), + Product3 = t_inf(Product1, Product2), + Function5 = t_inf(Union7, Function5), + true = t_is_byte(t_inf(Union9, t_number())), + true = t_is_char(t_inf(Union9, t_number())), + + io:format("3? ~p ~n", [?int_set([3])]), + + RecDict = dict:store({foo, 2}, [bar, baz], dict:new()), + Record1 = t_from_term({foo, [1,2], {1,2,3}}), + + Types = [ + Atom1, + Atom2, + Atom3, + Binary, + Int1, + Int2, + Tuple1, + Tuple2, + Tuple3, + Tuple4, + Tuple5, + Tuple6, + Tuple7, + Ref, + Port, + Pid, + Identifier, + List1, + List2, + List3, + List4, + List5, + List6, + List7, + List8, + List9, + List10, + Function1, + Function2, + Function3, + Function4, + Function5, + Product1, + Product2, + Record1, + Union1, + Union2, + Union3, + Union4, + Union5, + Union6, + Union7, + Union8, + Union10, + t_inf(Union10, t_tuple([t_atom(true), t_integer()])) + ], + io:format("~p\n", [[t_to_string(X, RecDict) || X <- Types]]). + +-endif. diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_api.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_api.erl index c19330eb30..597460ce77 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_api.erl +++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_api.erl @@ -52,7 +52,7 @@ exact_api_set_type(#exact_api{}=E) -> E. -record(exact_adt, {}). exact_adt_test(X) -> - #exact_adt{} = exact_adt:exact_adt_set_type(X). % breaks the opaqueness + #exact_adt{} = exact_adt:exact_adt_set_type(X). % breaks the opacity exact_adt_new(A) -> A = #exact_adt{}, diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/is_rec.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/is_rec.erl index 2b157483bc..b906431b44 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/src/simple/is_rec.erl +++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/is_rec.erl @@ -16,11 +16,11 @@ ri11() -> ri13() -> A = simple1_adt:d1(), - if is_record(A, r) -> true end. % breaks the opaqueness + if is_record(A, r) -> true end. % breaks the opacity ri14() -> A = simple1_adt:d1(), - if is_record({A, 1}, r) -> true end. % breaks the opaqueness + if is_record({A, 1}, r) -> true end. % breaks the opacity -type '1-3-t'() :: 1..3. @@ -54,7 +54,7 @@ ri5() -> ri6() -> A = simple1_adt:d1(), - if is_record(A, r) -> true end. % breaks opaqueness + if is_record(A, r) -> true end. % breaks opacity ri7() -> A = simple1_adt:d1(), diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_api.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_api.erl index fb6d59d263..59b9e0fec4 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_api.erl +++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_api.erl @@ -30,7 +30,7 @@ t3() -> adt_t1() -> R = rec_adt:r1(), - {r1, a} = R. % breaks the opaqueness + {r1, a} = R. % breaks the opacity -spec adt_t1(rec_adt:r1()) -> rec_adt:r1(). % invalid type spec @@ -82,7 +82,7 @@ f() -> r_adt() -> {{r, rec_adt:f(), 2}, - #r{f = rec_adt:f(), o = 2}}. % breaks the opaqueness + #r{f = rec_adt:f(), o = 2}}. % breaks the opacity -record(r2, % like #r1{}, but with initial value {f1 = a :: a()}). @@ -110,7 +110,7 @@ u3() -> v1() -> A = #r3{f1 = queue:new()}, - {r3, a} = A. % breaks the opaqueness + {r3, a} = A. % breaks the opacity v2() -> A = {r3, 10}, @@ -120,4 +120,4 @@ v2() -> v3() -> A = {r3, 10}, - #r3{f1 = 10} = A. % breaks the opaqueness + #r3{f1 = 10} = A. % breaks the opacity diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_api.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_api.erl index 7db1100597..d67aa913d8 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_api.erl +++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_api.erl @@ -194,7 +194,7 @@ tt1() -> tt2() -> A = simple1_adt:d1(), - is_integer(A). % breaks the opaqueness + is_integer(A). % breaks the opacity %% Comparison with integers @@ -262,11 +262,11 @@ f2() -> adt_f1() -> T = simple1_adt:n1(), - if is_function(T) -> ok end. % breaks the opaqueness + if is_function(T) -> ok end. % breaks the opacity adt_f2() -> T = simple1_adt:n1(), - is_function(T). % breaks the opaqueness + is_function(T). % breaks the opacity f3() -> A = i1(), @@ -281,12 +281,12 @@ f4() -> adt_f3() -> A = simple1_adt:i1(), T = simple1_adt:n1(), - if is_function(T, A) -> ok end. % breaks the opaqueness + if is_function(T, A) -> ok end. % breaks the opacity adt_f4() -> A = simple1_adt:i1(), T = simple1_adt:n1(), - is_function(T, A). % breaks the opaqueness + is_function(T, A). % breaks the opacity adt_f4_a() -> A = simple1_adt:i1(), @@ -297,7 +297,7 @@ adt_f4_a() -> adt_f4_b() -> A = i1(), T = simple1_adt:n1(), - is_function(T, A). % breaks the opaqueness + is_function(T, A). % breaks the opacity %% A few Boolean examples @@ -404,7 +404,7 @@ bit_t1() -> bit_adt_t1() -> A = simple1_adt:i1(), - <<100:(A)>>. % breaks the opaqueness + <<100:(A)>>. % breaks the opacity bit_t3(A) -> B = i1(), @@ -415,14 +415,14 @@ bit_t3(A) -> bit_adt_t2() -> A = simple1_adt:i1(), case <<"hej">> of - <<_:A>> -> ok % breaks the opaqueness (but the message is strange) + <<_:A>> -> ok % breaks the opacity (but the message is strange) end. bit_adt_t3(A) -> B = simple1_adt:i1(), case none:none() of - <<A: % breaks the opaqueness (the message is less than perfect) + <<A: % breaks the opacity (the message is less than perfect) B>> -> 1 end. @@ -445,7 +445,7 @@ bit_t4(A) -> bit_adt_t4(A) -> Sz = simple1_adt:i1(), case A of - <<_:Sz>> -> 1 % breaks the opaqueness + <<_:Sz>> -> 1 % breaks the opacity end. bit_t5() -> @@ -457,7 +457,7 @@ bit_t5() -> bit_adt_t5() -> A = simple1_adt:bit1(), case A of - <<_/binary>> -> 1 % breaks the opaqueness + <<_/binary>> -> 1 % breaks the opacity end. -opaque bit1() :: binary(). @@ -475,7 +475,7 @@ call_f(A) -> call_f_adt(A) -> A = simple1_adt:a(), - foo:A(A). % breaks the opaqueness + foo:A(A). % breaks the opacity call_m(A) -> A = a(), @@ -483,7 +483,7 @@ call_m(A) -> call_m_adt(A) -> A = simple1_adt:a(), - A:foo(A). % breaks the opaqueness + A:foo(A). % breaks the opacity -opaque a() :: atom(). diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/timer/timer_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/timer/timer_use.erl index 9c8ea0af1c..ed6810634f 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/src/timer/timer_use.erl +++ b/lib/dialyzer/test/opaque_SUITE_data/src/timer/timer_use.erl @@ -1,8 +1,8 @@ %%--------------------------------------------------------------------------- %% A test case with: %% - a genuine matching error -- 1st branch -%% - a violation of the opaqueness of timer:tref() -- 2nd branch -%% - a subtle violation of the opaqueness of timer:tref() -- 3rd branch +%% - a violation of the opacity of timer:tref() -- 2nd branch +%% - a subtle violation of the opacity of timer:tref() -- 3rd branch %% The test is supposed to check that these cases are treated properly. %%--------------------------------------------------------------------------- diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_util.erl b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_util.erl index ca6bc0ab4a..6b825d85fe 100644 --- a/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_util.erl +++ b/lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_util.erl @@ -14,12 +14,12 @@ rel2fam(Rel) -> sofs:to_external(sofs:relation_to_family(sofs:relation(Rel))). -%% a definition that does not violate the opaqueness of gb_trees:tree() +%% a definition that does not violate the opacity of gb_trees:tree() gb_trees_smallest_key(Tree) -> {Key, _V} = gb_trees:smallest(Tree), Key. -%% a definition that violates the opaqueness of gb_trees:tree() +%% a definition that violates the opacity of gb_trees:tree() gb_trees_largest_key({_, Tree}) -> largest_key1(Tree). diff --git a/lib/dialyzer/test/plt_SUITE.erl b/lib/dialyzer/test/plt_SUITE.erl index 6ebe23b54b..460d4e2240 100644 --- a/lib/dialyzer/test/plt_SUITE.erl +++ b/lib/dialyzer/test/plt_SUITE.erl @@ -8,13 +8,15 @@ -export([suite/0, all/0, build_plt/1, beam_tests/1, update_plt/1, local_fun_same_as_callback/1, - remove_plt/1, run_plt_check/1, run_succ_typings/1]). + remove_plt/1, run_plt_check/1, run_succ_typings/1, + bad_dialyzer_attr/1]). suite() -> [{timetrap, ?plt_timeout}]. all() -> [build_plt, beam_tests, update_plt, run_plt_check, - remove_plt, run_succ_typings, local_fun_same_as_callback]. + remove_plt, run_succ_typings, local_fun_same_as_callback, + bad_dialyzer_attr]. build_plt(Config) -> OutDir = ?config(priv_dir, Config), @@ -249,6 +251,30 @@ remove_plt(Config) -> {init_plt, Plt}] ++ Opts), ok. +bad_dialyzer_attr(Config) -> + PrivDir = ?config(priv_dir, Config), + + Prog1 = <<"-module(dial). + -dialyzer({no_return, [undef/0]}).">>, + {ok, Beam1} = compile(Config, Prog1, dial, []), + Plt = filename:join(PrivDir, "bad_attr.plt"), + {dialyzer_error, + "Analysis failed with error:\n" + "Could not scan the following file(s):\n" + " Unknown function undef/0 in line " ++ _} = + (catch run_dialyzer(plt_build, [Beam1], [])), + + Prog2 = <<"-module(dial). + -dialyzer({no_return, [{undef,1,2}]}).">>, + {ok, Beam2} = compile(Config, Prog2, dial, []), + {dialyzer_error, + "Analysis failed with error:\n" + "Could not scan the following file(s):\n" + " Bad function {undef,1,2} in line " ++ _} = + (catch run_dialyzer(plt_build, [Beam2], [])), + + ok. + compile(Config, Prog, Module, CompileOpts) -> Source = lists:concat([Module, ".erl"]), PrivDir = ?config(priv_dir,Config), diff --git a/lib/dialyzer/test/small_SUITE_data/results/guards b/lib/dialyzer/test/small_SUITE_data/results/guards index 824a7cfa24..cd0d3cace0 100644 --- a/lib/dialyzer/test/small_SUITE_data/results/guards +++ b/lib/dialyzer/test/small_SUITE_data/results/guards @@ -10,8 +10,8 @@ guards.erl:136: The call guards:t16('a') will never return since it differs in t guards.erl:136: The call guards:t16('c') will never return since it differs in the 1st argument from the success typing arguments: ('b') guards.erl:55: Function t5/1 has no local return guards.erl:55: Guard test is_integer(A::atom()) can never succeed -guards.erl:59: Clause guard cannot succeed. The variable A was matched against the type any() guards.erl:59: Function t6/1 has no local return +guards.erl:59: Guard test is_integer(A::atom()) can never succeed guards.erl:67: The call guards:t7({42}) will never return since it differs in the 1st argument from the success typing arguments: (atom() | integer()) guards.erl:75: The call guards:t8({42}) will never return since it differs in the 1st argument from the success typing arguments: (atom() | integer()) guards.erl:92: The variable _ can never match since previous clauses completely covered the type {'true','true'} diff --git a/lib/dialyzer/test/small_SUITE_data/src/ms.erl b/lib/dialyzer/test/small_SUITE_data/src/ms.erl new file mode 100644 index 0000000000..47a5e886cf --- /dev/null +++ b/lib/dialyzer/test/small_SUITE_data/src/ms.erl @@ -0,0 +1,8 @@ +-module(ms). +-export([t/0]). + +-include_lib("stdlib/include/ms_transform.hrl"). + +t() -> + MS = dbg:fun2ms(fun(All) -> message(All) end), + erlang:trace_pattern({m, f, '_'}, MS). diff --git a/lib/edoc/doc/overview.edoc b/lib/edoc/doc/overview.edoc index d2bba9d744..3a2118928a 100644 --- a/lib/edoc/doc/overview.edoc +++ b/lib/edoc/doc/overview.edoc @@ -377,6 +377,12 @@ The following tags can be used before a function definition: Useful for debug/test functions, etc. The content can be used as a comment; it is ignored by EDoc.</dd> + <dt><a name="ftag-param">`@param'</a></dt> + <dd>Provide more information on a single parameter of the + enclosing function. The content consists of a parameter name, + followed by one or more whitespace characters, and XHTML text. + </dd> + <dt><a name="ftag-private">`@private'</a></dt> <dd>Marks the function as private (i.e., not part of the public interface), so that it will not appear in the normal @@ -386,6 +392,10 @@ The following tags can be used before a function definition: always "private".) The content can be used as a comment; it is ignored by EDoc.</dd> + <dt><a name="ftag-returns">`@returns'</a></dt> + <dd>Specify additional information about the value returned by + the function. Content consists of XHTML text.</dd> + <dt><a name="ftag-see">`@see'</a></dt> <dd>Make a reference to a module, function, datatype, or application. (See {@section References}.) diff --git a/lib/eldap/doc/src/eldap.xml b/lib/eldap/doc/src/eldap.xml index 43873e44e2..f2c7889e58 100644 --- a/lib/eldap/doc/src/eldap.xml +++ b/lib/eldap/doc/src/eldap.xml @@ -197,7 +197,7 @@ </type> <desc> <p> Add an entry. The entry must not exist.</p> - <pre> + <code> add(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com", [{"objectclass", ["person"]}, @@ -205,7 +205,7 @@ {"sn", ["Valentine"]}, {"telephoneNumber", ["545 555 00"]}] ) - </pre> + </code> </desc> </func> <func> @@ -216,9 +216,9 @@ </type> <desc> <p> Delete an entry.</p> - <pre> + <code> delete(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com") - </pre> + </code> </desc> </func> @@ -259,11 +259,11 @@ </type> <desc> <p> Modify an entry.</p> - <pre> + <code> modify(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com", [eldap:mod_replace("telephoneNumber", ["555 555 00"]), eldap:mod_add("description", ["LDAP Hacker"]) ]) - </pre> + </code> </desc> </func> <func> @@ -320,10 +320,10 @@ whether the current RDN should be removed from the attribute list after the after operation. <c>NewSupDN</c> is the new parent that the RDN shall be moved to. If the old parent should remain as parent, <c>NewSupDN</c> shall be "".</p> - <pre> + <code> modify_dn(Handle, "cn=Bill Valentine, ou=people, o=Example Org, dc=example, dc=com ", "cn=Bill Jr Valentine", true, "") - </pre> + </code> </desc> </func> <func> @@ -342,10 +342,10 @@ Default values: scope is <c>wholeSubtree()</c>, deref is <c>derefAlways()</c>, types_only is <c>false</c> and timeout is <c>0</c> (meaning infinity). </p> - <pre> + <code> Filter = eldap:substrings("cn", [{any,"V"}]), search(Handle, [{base, "dc=example, dc=com"}, {filter, Filter}, {attributes, ["cn"]}]), - </pre> + </code> <p>The <c>timeout</c> option in the <c>SearchOptions</c> is for the ldap server, while the timeout in <seealso marker="#open/2">eldap:open/2</seealso> is used for each individual request in the search operation. @@ -454,7 +454,7 @@ </type> <desc> <p>Creates an extensible match filter. For example, </p> <code> - eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}])) + eldap:extensibleMatch("Bar", [{type,"sn"}, {matchingRule,"caseExactMatch"}])) </code> <p>creates a filter which performs a <c>caseExactMatch</c> on the attribute <c>sn</c> and matches with the value <c>"Bar"</c>. The default value of <c>dnAttributes</c> is <c>false</c>.</p> </desc> </func> diff --git a/lib/erl_docgen/src/docgen_edoc_xml_cb.erl b/lib/erl_docgen/src/docgen_edoc_xml_cb.erl index 4f3af1f767..13ff0a139d 100644 --- a/lib/erl_docgen/src/docgen_edoc_xml_cb.erl +++ b/lib/erl_docgen/src/docgen_edoc_xml_cb.erl @@ -111,7 +111,16 @@ root_attributes(Element, Opts) -> Enc -> Enc end, - [#xmlAttribute{name=encoding, value=Encoding}]. + [#xmlAttribute{name=encoding, value=reformat_encoding(Encoding)}]. + +%% epp:default_encoding/0 returns 'utf8' +reformat_encoding(utf8) -> "UTF-8"; +reformat_encoding(List) when is_list(List) -> + case string:to_lower(List) of + "utf8" -> "UTF-8"; + _ -> List + end; +reformat_encoding(Other) -> Other. layout_chapter(#xmlElement{name=overview, content=Es}) -> Title = get_text(title, Es), diff --git a/lib/erl_interface/doc/src/book.xml b/lib/erl_interface/doc/src/book.xml index c9194d96ff..94bfef7455 100644 --- a/lib/erl_interface/doc/src/book.xml +++ b/lib/erl_interface/doc/src/book.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,19 +19,19 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> - <title>Erlang Interface</title> + <title>Erl_Interface</title> <prepared>Gordon Beaton</prepared> <docno></docno> <date>1998-11-30</date> <rev>1.2</rev> - <file>book.sgml</file> + <file>book.xml</file> </header> <insidecover> </insidecover> - <pagetext>Erlang Interface</pagetext> + <pagetext>Erl_Interface</pagetext> <preamble> <contents level="2"></contents> </preamble> @@ -47,4 +47,3 @@ <listofterms></listofterms> <index></index> </book> - diff --git a/lib/erl_interface/doc/src/ei.xml b/lib/erl_interface/doc/src/ei.xml index 1177954eb9..ddfb4d88a8 100644 --- a/lib/erl_interface/doc/src/ei.xml +++ b/lib/erl_interface/doc/src/ei.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -30,361 +30,508 @@ <checked></checked> <date>2000-11-27</date> <rev>PA1</rev> - <file>ei.sgml</file> + <file>ei.xml</file> </header> <lib>ei</lib> - <libsummary>routines for handling the erlang binary term format</libsummary> + <libsummary>Routines for handling the Erlang binary term format.</libsummary> <description> - <p>The library <c><![CDATA[ei]]></c> contains macros and functions to encode - and decode the erlang binary term format.</p> - <p>With <c><![CDATA[ei]]></c>, you can convert atoms, lists, numbers and + <p>The library <c>ei</c> contains macros and functions to encode + and decode the Erlang binary term format.</p> + + <p><c>ei</c> allows you to convert atoms, lists, numbers, and binaries to and from the binary format. This is useful when - writing port programs and drivers. <c><![CDATA[ei]]></c> uses a given - buffer, and no dynamic memory (with the exception of - <c><![CDATA[ei_decode_fun()]]></c>), and is often quite fast.</p> - <p>It also handles C-nodes, C-programs that talks erlang - distribution with erlang nodes (or other C-nodes) using the - erlang distribution format. The difference between <c><![CDATA[ei]]></c> and - <c><![CDATA[erl_interface]]></c> is that <c><![CDATA[ei]]></c> uses the binary format - directly when sending and receiving terms. It is also thread - safe, and using threads, one process can handle multiple - C-nodes. The <c><![CDATA[erl_interface]]></c> library is built on top of - <c><![CDATA[ei]]></c>, but of legacy reasons, it doesn't allow for multiple - C-nodes. In general, <c><![CDATA[ei]]></c> is the preferred way of doing - C-nodes.</p> - <p>The decode and encode functions use a buffer an index into the + writing port programs and drivers. <c>ei</c> uses a given + buffer, no dynamic memory (except + <c>ei_decode_fun()</c>) and is often quite fast.</p> + + <p><c>ei</c> also handles C-nodes, C-programs that talks Erlang + distribution with Erlang nodes (or other C-nodes) using the + Erlang distribution format. The difference between <c>ei</c> + and <c>erl_interface</c> is that <c>ei</c> uses + the binary format directly when sending and receiving terms. It is also + thread safe, and using threads, one process can handle multiple + C-nodes. The <c>erl_interface</c> library is built on top of + <c>ei</c>, but of legacy reasons, it does not allow for + multiple C-nodes. In general, <c>ei</c> is the preferred way + of doing C-nodes.</p> + + <p>The decode and encode functions use a buffer and an index into the buffer, which points at the point where to encode and decode. The index is updated to point right after the term encoded/decoded. No checking is done whether the term fits in the buffer or not. If encoding goes outside the buffer, the - program may crash.</p> - <p>All functions takes two parameter, <c><![CDATA[buf]]></c> is a pointer to - the buffer where the binary data is / will be, <c><![CDATA[index]]></c> is a - pointer to an index into the buffer. This parameter will be - incremented with the size of the term decoded / encoded. The - data is thus at <c><![CDATA[buf[*index]]]></c> when an <c><![CDATA[ei]]></c> function is - called.</p> - <p>The encode functions all assumes that the <c><![CDATA[buf]]></c> and - <c><![CDATA[index]]></c> parameters points to a buffer big enough for the - data. To get the size of an encoded term, without encoding it, - pass <c><![CDATA[NULL]]></c> instead of a buffer pointer. The <c><![CDATA[index]]></c> - parameter will be incremented, but nothing will be encoded. This - is the way in <c><![CDATA[ei]]></c> to "preflight" term encoding.</p> - <p>There are also encode-functions that uses a dynamic buffer. It + program can crash.</p> + + <p>All functions take two parameters:</p> + + <list type="bulleted"> + <item><p><c>buf</c> is a pointer to + the buffer where the binary data is or will be.</p> + </item> + <item><p><c>index</c> is a pointer to an index into the + buffer. This parameter is incremented with the size of the term + decoded/encoded.</p> + </item> + </list> + + <p>The data is thus at <c>buf[*index]</c> when an + <c>ei</c> function is called.</p> + + <p>All encode functions assume that the <c>buf</c> and + <c>index</c> parameters point to a buffer large enough for + the data. To get the size of an encoded term, without encoding it, + pass <c>NULL</c> instead of a buffer pointer. Parameter + <c>index</c> is incremented, but nothing will be encoded. This + is the way in <c>ei</c> to "preflight" term encoding.</p> + + <p>There are also encode functions that use a dynamic buffer. It is often more convenient to use these to encode data. All encode - functions comes in two versions: those starting with <c><![CDATA[ei_x]]></c>, - uses a dynamic buffer.</p> - <p>All functions return <c><![CDATA[0]]></c> if successful, and <c><![CDATA[-1]]></c> if - not. (For instance, if a term is not of the expected type, or - the data to decode is not a valid erlang term.)</p> - <p>Some of the decode-functions needs a preallocated buffer. This - buffer must be allocated big enough, and for non compound types - the <c><![CDATA[ei_get_type()]]></c> - function returns the size required (note that for strings an - extra byte is needed for the 0 string terminator).</p> + functions comes in two versions; those starting with + <c>ei_x</c> use a dynamic buffer.</p> + + <p>All functions return <c>0</c> if successful, otherwise + <c>-1</c> (for example, if a term is not of the expected + type, or the data to decode is an invalid Erlang term).</p> + + <p>Some of the decode functions need a pre-allocated buffer. This + buffer must be allocated large enough, and for non-compound types + the <c>ei_get_type()</c> + function returns the size required (notice that for strings an + extra byte is needed for the <c>NULL</c>-terminator).</p> </description> - <section> - <title>DATA TYPES</title> + <section> + <title>Data Types</title> <taglist> <tag><marker id="erlang_char_encoding"/>erlang_char_encoding</tag> <item> - <p/> <code type="none"> typedef enum { ERLANG_ASCII = 1, ERLANG_LATIN1 = 2, ERLANG_UTF8 = 4 -}erlang_char_encoding; -</code> - <p>The character encodings used for atoms. <c>ERLANG_ASCII</c> represents 7-bit ASCII. - Latin1 and UTF8 are different extensions of 7-bit ASCII. All 7-bit ASCII characters - are valid Latin1 and UTF8 characters. ASCII and Latin1 both represent each character - by one byte. A UTF8 character can consist of one to four bytes. Note that these - constants are bit-flags and can be combined with bitwise-or.</p> +} erlang_char_encoding;</code> + <p>The character encodings used for atoms. <c>ERLANG_ASCII</c> + represents 7-bit ASCII. Latin-1 and UTF-8 are different extensions + of 7-bit ASCII. All 7-bit ASCII characters are valid Latin-1 and + UTF-8 characters. ASCII and Latin-1 both represent each character + by one byte. An UTF-8 character can consist of 1-4 bytes. + Notice that these constants are bit-flags and can be combined with + bitwise OR.</p> </item> </taglist> </section> + <funcs> + <func> + <name><ret>int</ret><nametext>ei_decode_atom(const char *buf, int *index, char *p)</nametext></name> + <fsummary>Decode an atom.</fsummary> + <desc> + <p>Decodes an atom from the binary format. The <c>NULL</c>-terminated + name of the atom is placed at <c>p</c>. At most + <c>MAXATOMLEN</c> bytes can be placed in the buffer.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_atom_as(const char *buf, int *index, char *p, int plen, erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result)</nametext></name> + <fsummary>Decode an atom.</fsummary> + <desc> + <p>Decodes an atom from the binary format. The <c>NULL</c>-terminated + name of the atom is placed in buffer at <c>p</c> of length <c>plen</c> + bytes.</p> + <p>The wanted string encoding is specified by + <seealso marker="#erlang_char_encoding"><c>want</c></seealso>. + The original encoding used in the binary format (Latin-1 or UTF-8) can + be obtained from <c>*was</c>. The encoding of the resulting string + (7-bit ASCII, Latin-1, or UTF-8) can be obtained from <c>*result</c>. + Both <c>was</c> and <c>result</c> can be <c>NULL</c>. <c>*result</c> + can differ from <c>want</c> if <c>want</c> is a bitwise OR'd + combination like <c>ERLANG_LATIN1|ERLANG_UTF8</c> or if + <c>*result</c> turns out to be pure 7-bit ASCII + (compatible with both Latin-1 and UTF-8).</p> + <p>This function fails if the atom is too long for the buffer + or if it cannot be represented with encoding <c>want</c>.</p> + <p>This function was introduced in Erlang/OTP R16 as part of a first + step to support UTF-8 atoms.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_bignum(const char *buf, int *index, mpz_t obj)</nametext></name> + <fsummary>Decode a GMP arbitrary precision integer.</fsummary> + <desc> + <p>Decodes an integer in the binary format to a GMP + <c>mpz_t</c> integer. To use this function, the <c>ei</c> + library must be configured and compiled to use the GMP library.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_binary(const char *buf, int *index, void *p, long *len)</nametext></name> + <fsummary>Decode a binary.</fsummary> + <desc> + <p>Decodes a binary from the binary format. Parameter + <c>len</c> is set to the actual size of the + binary. Notice that <c>ei_decode_binary()</c> assumes that + there is enough room for the binary. The size required can be + fetched by <c>ei_get_type()</c>.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_boolean(const char *buf, int *index, int *p)</nametext></name> + <fsummary>Decode a boolean.</fsummary> + <desc> + <p>Decodes a boolean value from the binary format. + A boolean is actually an atom, <c>true</c> decodes 1 + and <c>false</c> decodes 0.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_char(const char *buf, int *index, char *p)</nametext></name> + <fsummary>Decode an 8-bit integer between 0-255.</fsummary> + <desc> + <p>Decodes a char (8-bit) integer between 0-255 from the binary format. + For historical reasons the returned integer is of + type <c>char</c>. Your C code is to consider the + returned value to be of type <c>unsigned char</c> even if + the C compilers and system can define <c>char</c> to be + signed.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_double(const char *buf, int *index, double *p)</nametext></name> + <fsummary>Decode a double.</fsummary> + <desc> + <p>Decodes a double-precision (64-bit) floating + point number from the binary format.</p> + </desc> + </func> + <func> - <name><ret>void</ret><nametext>ei_set_compat_rel(release_number)</nametext></name> - <fsummary>Set the ei library in compatibility mode</fsummary> - <type> - <v>unsigned release_number;</v> - </type> + <name><ret>int</ret><nametext>ei_decode_ei_term(const char* buf, int* index, ei_term* term)</nametext></name> + <fsummary>Decode a term, without previous knowledge of type.</fsummary> + <desc> + <p>Decodes any term, or at least tries to. If the term + pointed at by <c>*index</c> in <c>buf</c> fits + in the <c>term</c> union, it is decoded, and the + appropriate field in <c>term->value</c> is set, and + <c>*index</c> is incremented by the term size.</p> + <p>The function returns <c>1</c> on successful decoding, <c>-1</c> on + error, and <c>0</c> if the term seems alright, but does not fit in the + <c>term</c> structure. If <c>1</c> is returned, the + <c>index</c> is incremented, and <c>term</c> + contains the decoded term.</p> + <p>The <c>term</c> structure contains the arity for a tuple + or list, size for a binary, string, or atom. It contains + a term if it is any of the following: integer, float, atom, + pid, port, or ref.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_fun(const char *buf, int *index, erlang_fun *p)</nametext></name> + <name><ret>void</ret><nametext>free_fun(erlang_fun* f)</nametext></name> + <fsummary>Decode a fun.</fsummary> <desc> - <marker id="ei_set_compat_rel"></marker> - <p>By default, the <c><![CDATA[ei]]></c> library is only guaranteed - to be compatible with other Erlang/OTP components from the same - release as the <c><![CDATA[ei]]></c> library itself. For example, <c><![CDATA[ei]]></c> from - the OTP R10 release is not compatible with an Erlang emulator - from the OTP R9 release by default.</p> - <p>A call to <c><![CDATA[ei_set_compat_rel(release_number)]]></c> sets the - <c><![CDATA[ei]]></c> library in compatibility mode of release - <c><![CDATA[release_number]]></c>. Valid range of <c><![CDATA[release_number]]></c> - is [7, current release]. This makes it possible to - communicate with Erlang/OTP components from earlier releases.</p> - <note> - <p>If this function is called, it may only be called once - and must be called before any other functions in the <c><![CDATA[ei]]></c> - library is called.</p> - </note> - <warning> - <p>You may run into trouble if this feature is used - carelessly. Always make sure that all communicating - components are either from the same Erlang/OTP release, or - from release X and release Y where all components - from release Y are in compatibility mode of release X.</p> - </warning> + <p>Decodes a fun from the binary format. Parameter + <c>p</c> is to be <c>NULL</c> or point to an + <c>erlang_fun</c> structure. This is the only decode + function that allocates memory. When the <c>erlang_fun</c> + is no longer needed, it is to be freed with + <c>free_fun</c>. (This has to do with the arbitrary size + of the environment for a fun.)</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_version(char *buf, int *index)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_version(ei_x_buff* x)</nametext></name> - <fsummary>Encode version</fsummary> + <name><ret>int</ret><nametext>ei_decode_list_header(const char *buf, int *index, int *arity)</nametext></name> + <fsummary>Decode a list.</fsummary> <desc> - <p>Encodes a version magic number for the binary format. Must - be the first token in a binary term.</p> + <p>Decodes a list header from the binary + format. The number of elements is returned in + <c>arity</c>. The <c>arity+1</c> elements + follow (the last one is the tail of the list, normally an empty list). + If <c>arity</c> is <c>0</c>, it is an empty + list.</p> + <p>Notice that lists are encoded as strings if they consist + entirely of integers in the range 0..255. This function do + not decode such strings, use <c>ei_decode_string()</c> + instead.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_long(char *buf, int *index, long p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_long(ei_x_buff* x, long p)</nametext></name> - <fsummary>Encode integer</fsummary> + <name><ret>int</ret><nametext>ei_decode_long(const char *buf, int *index, long *p)</nametext></name> + <fsummary>Decode integer.</fsummary> <desc> - <p>Encodes a long integer in the binary format. - Note that if the code is 64 bits the function ei_encode_long() is - exactly the same as ei_encode_longlong().</p> + <p>Decodes a long integer from the binary format. + If the code is 64 bits, the function <c>ei_decode_long()</c> is + the same as <c>ei_decode_longlong()</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_ulong(char *buf, int *index, unsigned long p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_ulong(ei_x_buff* x, unsigned long p)</nametext></name> - <fsummary>Encode unsigned integer</fsummary> + <name><ret>int</ret><nametext>ei_decode_longlong(const char *buf, int *index, long long *p)</nametext></name> + <fsummary>Decode integer.</fsummary> <desc> - <p>Encodes an unsigned long integer in the binary format. - Note that if the code is 64 bits the function ei_encode_ulong() is - exactly the same as ei_encode_ulonglong().</p> + <p>Decodes a GCC <c>long long</c> or Visual C++ + <c>__int64</c> + (64-bit) integer from the binary format. This + function is missing in the VxWorks port.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_longlong(char *buf, int *index, long long p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_longlong(ei_x_buff* x, long long p)</nametext></name> - <fsummary>Encode integer</fsummary> + <name><ret>int</ret><nametext>ei_decode_map_header(const char *buf, int *index, int *arity)</nametext></name> + <fsummary>Decode a map.</fsummary> <desc> - <p>Encodes a GCC <c><![CDATA[long long]]></c> or Visual C++ <c><![CDATA[__int64]]></c> (64 bit) - integer in the binary format. Note that this function is missing - in the VxWorks port.</p> + <p>Decodes a map header from the binary + format. The number of key-value pairs is returned in + <c>*arity</c>. Keys and values follow in this order: + <c>K1, V1, K2, V2, ..., Kn, Vn</c>. This makes a total of + <c>arity*2</c> terms. If <c>arity</c> is zero, it is an empty map. + A correctly encoded map does not have duplicate keys.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_ulonglong(char *buf, int *index, unsigned long long p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_ulonglong(ei_x_buff* x, unsigned long long p)</nametext></name> - <fsummary>Encode unsigned integer</fsummary> + <name><ret>int</ret><nametext>ei_decode_pid(const char *buf, int *index, erlang_pid *p)</nametext></name> + <fsummary>Decode a <c>pid</c>.</fsummary> <desc> - <p>Encodes a GCC <c><![CDATA[unsigned long long]]></c> or Visual C++ <c><![CDATA[unsigned __int64]]></c> (64 bit) integer in the binary format. Note that - this function is missing in the VxWorks port.</p> + <p>Decodes a process identifier (pid) from the binary format.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_bignum(char *buf, int *index, mpz_t obj)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_bignum(ei_x_buff *x, mpz_t obj)</nametext></name> - <fsummary>Encode an arbitrary precision integer</fsummary> + <name><ret>int</ret><nametext>ei_decode_port(const char *buf, int *index, erlang_port *p)</nametext></name> + <fsummary>Decode a port.</fsummary> <desc> - <p>Encodes a GMP <c><![CDATA[mpz_t]]></c> integer to binary format. - To use this function the ei library needs to be configured and compiled - to use the GMP library. </p> + <p>Decodes a port identifier from the binary format.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_double(char *buf, int *index, double p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_double(ei_x_buff* x, double p)</nametext></name> - <fsummary>Encode a double float</fsummary> + <name><ret>int</ret><nametext>ei_decode_ref(const char *buf, int *index, erlang_ref *p)</nametext></name> + <fsummary>Decode a reference.</fsummary> <desc> - <p>Encodes a double-precision (64 bit) floating point number in - the binary format.</p> - <p> - The function returns <c><![CDATA[-1]]></c> if the floating point number is not finite. - </p> + <p>Decodes a reference from the binary format.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_boolean(char *buf, int *index, int p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_boolean(ei_x_buff* x, int p)</nametext></name> - <fsummary>Encode a boolean</fsummary> + <name><ret>int</ret><nametext>ei_decode_string(const char *buf, int *index, char *p)</nametext></name> + <fsummary>Decode a string.</fsummary> <desc> - <p>Encodes a boolean value, as the atom <c><![CDATA[true]]></c> if p is not - zero or <c><![CDATA[false]]></c> if p is zero.</p> + <p>Decodes a string from the binary format. A + string in Erlang is a list of integers between 0 and + 255. Notice that as the string is just a list, sometimes + lists are encoded as strings by <c>term_to_binary/1</c>, + even if it was not intended.</p> + <p>The string is copied to <c>p</c>, and enough space must + be allocated. The returned string is <c>NULL</c>-terminated, so you + must add an extra byte to the memory requirement.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_char(char *buf, int *index, char p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_char(ei_x_buff* x, char p)</nametext></name> - <fsummary>Encode an 8-bit integer between 0-255</fsummary> + <name><ret>int</ret><nametext>ei_decode_term(const char *buf, int *index, void *t)</nametext></name> + <fsummary>Decode a <c>ETERM</c>.</fsummary> + <desc> + <p>Decodes a term from the binary format. The term + is return in <c>t</c> as a <c>ETERM*</c>, so + <c>t</c> is actually an <c>ETERM**</c> (see + <seealso marker="erl_eterm"><c>erl_eterm</c></seealso>). + The term is later to be deallocated.</p> + <p>Notice that this function is located in the <c>Erl_Interface</c> + library.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_trace(const char *buf, int *index, erlang_trace *p)</nametext></name> + <fsummary>Decode a trace token.</fsummary> <desc> - <p>Encodes a char (8-bit) as an integer between 0-255 in the binary format. - Note that for historical reasons the integer argument is of - type <c><![CDATA[char]]></c>. Your C code should consider the - given argument to be of type <c><![CDATA[unsigned char]]></c> even if - the C compilers and system may define <c><![CDATA[char]]></c> to be - signed.</p> + <p>Decodes an Erlang trace token from the binary format.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_string(char *buf, int *index, const char *p)</nametext></name> - <name><ret>int</ret><nametext>ei_encode_string_len(char *buf, int *index, const char *p, int len)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_string(ei_x_buff* x, const char *p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_string_len(ei_x_buff* x, const char* s, int len)</nametext></name> - <fsummary>Encode a string</fsummary> + <name><ret>int</ret><nametext>ei_decode_tuple_header(const char *buf, int *index, int *arity)</nametext></name> + <fsummary>Decode a tuple.</fsummary> <desc> - <p>Encodes a string in the binary format. (A string in erlang - is a list, but is encoded as a character array in the binary - format.) The string should be zero-terminated, except for - the <c><![CDATA[ei_x_encode_string_len()]]></c> function.</p> + <p>Decodes a tuple header, the number of elements + is returned in <c>arity</c>. The tuple elements follow + in order in the buffer.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_ulong(const char *buf, int *index, unsigned long *p)</nametext></name> + <fsummary>Decode unsigned integer.</fsummary> + <desc> + <p>Decodes an unsigned long integer from the binary format. + If the code is 64 bits, the function <c>ei_decode_ulong()</c> is + the same as <c>ei_decode_ulonglong()</c>.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p)</nametext></name> + <fsummary>Decode unsigned integer.</fsummary> + <desc> + <p>Decodes a GCC <c>unsigned long long</c> or Visual C++ + <c>unsigned __int64</c> (64-bit) integer from the binary + format. This function is missing in the VxWorks port.</p> </desc> </func> + + <func> + <name><ret>int</ret><nametext>ei_decode_version(const char *buf, int *index, int *version)</nametext></name> + <fsummary>Decode an empty list (<c>nil</c>).</fsummary> + <desc> + <p>Decodes the version magic number for the + Erlang binary term format. It must be the first token in a + binary term.</p> + </desc> + </func> + <func> <name><ret>int</ret><nametext>ei_encode_atom(char *buf, int *index, const char *p)</nametext></name> <name><ret>int</ret><nametext>ei_encode_atom_len(char *buf, int *index, const char *p, int len)</nametext></name> <name><ret>int</ret><nametext>ei_x_encode_atom(ei_x_buff* x, const char *p)</nametext></name> <name><ret>int</ret><nametext>ei_x_encode_atom_len(ei_x_buff* x, const char *p, int len)</nametext></name> - <fsummary>Encode an atom</fsummary> + <fsummary>Encode an atom.</fsummary> <desc> - <p>Encodes an atom in the binary format. The <c><![CDATA[p]]></c> parameter - is the name of the atom in latin1 encoding. Only upto <c>MAXATOMLEN-1</c> bytes - are encoded. The name should be zero-terminated, except for - the <c><![CDATA[ei_x_encode_atom_len()]]></c> function.</p> + <p>Encodes an atom in the binary format. Parameter <c>p</c> + is the name of the atom in Latin-1 encoding. Only up to + <c>MAXATOMLEN-1</c> bytes + are encoded. The name is to be <c>NULL</c>-terminated, except for + the <c>ei_x_encode_atom_len()</c> function.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_encode_atom_as(char *buf, int *index, const char *p, erlang_char_encoding from_enc, erlang_char_encoding to_enc)</nametext></name> <name><ret>int</ret><nametext>ei_encode_atom_len_as(char *buf, int *index, const char *p, int len, erlang_char_encoding from_enc, erlang_char_encoding to_enc)</nametext></name> <name><ret>int</ret><nametext>ei_x_encode_atom_as(ei_x_buff* x, const char *p, erlang_char_encoding from_enc, erlang_char_encoding to_enc)</nametext></name> <name><ret>int</ret><nametext>ei_x_encode_atom_len_as(ei_x_buff* x, const char *p, int len, erlang_char_encoding from_enc, erlang_char_encoding to_enc)</nametext></name> - <fsummary>Encode an atom</fsummary> + <fsummary>Encode an atom.</fsummary> <desc> <p>Encodes an atom in the binary format with character encoding - <seealso marker="#erlang_char_encoding"><c>to_enc</c></seealso> (latin1 or utf8). - The <c>p</c> parameter is the name of the atom with character encoding - <seealso marker="#erlang_char_encoding"><c>from_enc</c></seealso> (ascii, latin1 or utf8). - The name must either be zero-terminated or a function variant with a <c>len</c> - parameter must be used. If <c>to_enc</c> is set to the bitwise-or'd combination - <c>(ERLANG_LATIN1|ERLANG_UTF8)</c>, utf8 encoding is only used if the atom string - can not be represented in latin1 encoding.</p> - <p>The encoding will fail if <c>p</c> is not a valid string in encoding <c>from_enc</c>, - if the string is too long or if it can not be represented with character encoding <c>to_enc</c>.</p> - <p>These functions were introduced in R16 release of Erlang/OTP as part of a first step - to support UTF8 atoms. Atoms encoded with <c>ERLANG_UTF8</c> - can not be decoded by earlier releases than R16.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_encode_binary(char *buf, int *index, const void *p, long len)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_binary(ei_x_buff* x, const void *p, long len)</nametext></name> - <fsummary>Encode a binary</fsummary> - <desc> - <p>Encodes a binary in the binary format. The data is at - <c><![CDATA[p]]></c>, of <c><![CDATA[len]]></c> bytes length.</p> + <seealso marker="#erlang_char_encoding"><c>to_enc</c></seealso> + (Latin-1 or UTF-8). Parameter <c>p</c> is the name of the atom with + character encoding + <seealso marker="#erlang_char_encoding"><c>from_enc</c></seealso> + (ASCII, Latin-1, or UTF-8). The name must either be <c>NULL</c>-terminated or + a function variant with a <c>len</c> parameter must be used. + If <c>to_enc</c> is set to the bitwise OR'd combination + <c>(ERLANG_LATIN1|ERLANG_UTF8)</c>, UTF-8 encoding is only used if the + atom string cannot be represented in Latin-1 encoding.</p> + <p>The encoding fails if <c>p</c> is an invalid string in encoding + <c>from_enc</c>, if the string is too long, or if it cannot be + represented with character encoding <c>to_enc</c>.</p> + <p>These functions were introduced in Erlang/OTP R16 as part of a first + step to support UTF-8 atoms. Atoms encoded with <c>ERLANG_UTF8</c> + cannot be decoded by earlier releases than R16.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_pid(char *buf, int *index, const erlang_pid *p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_pid(ei_x_buff* x, const erlang_pid *p)</nametext></name> - <fsummary>Encode a pid</fsummary> + <name><ret>int</ret><nametext>ei_encode_bignum(char *buf, int *index, mpz_t obj)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_bignum(ei_x_buff *x, mpz_t obj)</nametext></name> + <fsummary>Encode an arbitrary precision integer.</fsummary> <desc> - <p>Encodes an erlang process identifier, pid, in the binary - format. The <c><![CDATA[p]]></c> parameter points to an - <c><![CDATA[erlang_pid]]></c> structure (which should have been obtained - earlier with <c><![CDATA[ei_decode_pid()]]></c>).</p> + <p>Encodes a GMP <c>mpz_t</c> integer to binary format. + To use this function, the <c>ei</c> library must be configured and + compiled to use the GMP library.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_fun(char *buf, int *index, const erlang_fun *p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun)</nametext></name> - <fsummary>Encode a fun</fsummary> + <name><ret>int</ret><nametext>ei_encode_binary(char *buf, int *index, const void *p, long len)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_binary(ei_x_buff* x, const void *p, long len)</nametext></name> + <fsummary>Encode a binary.</fsummary> <desc> - <p>Encodes a fun in the binary format. The <c><![CDATA[p]]></c> parameter - points to an <c><![CDATA[erlang_fun]]></c> structure. The - <c><![CDATA[erlang_fun]]></c> is not freed automatically, the - <c><![CDATA[free_fun]]></c> should be called if the fun is not needed - after encoding.</p> + <p>Encodes a binary in the binary format. The data is at + <c>p</c>, of <c>len</c> bytes length.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_port(char *buf, int *index, const erlang_port *p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_port(ei_x_buff* x, const erlang_port *p)</nametext></name> - <fsummary>Encodes a port</fsummary> + <name><ret>int</ret><nametext>ei_encode_boolean(char *buf, int *index, int p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_boolean(ei_x_buff* x, int p)</nametext></name> + <fsummary>Encode a boolean.</fsummary> <desc> - <p>Encodes an erlang port in the binary format. The <c><![CDATA[p]]></c> - parameter points to a <c><![CDATA[erlang_port]]></c> structure (which - should have been obtained earlier with - <c><![CDATA[ei_decode_port()]]></c>.</p> + <p>Encodes a boolean value as the atom <c>true</c> if + <c>p</c> is not zero, or <c>false</c> if <c>p</c> is + zero.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_ref(char *buf, int *index, const erlang_ref *p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_ref(ei_x_buff* x, const erlang_ref *p)</nametext></name> - <fsummary>Encodes a ref</fsummary> + <name><ret>int</ret><nametext>ei_encode_char(char *buf, int *index, char p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_char(ei_x_buff* x, char p)</nametext></name> + <fsummary>Encode an 8-bit integer between 0-255.</fsummary> <desc> - <p>Encodes an erlang reference in the binary format. The - <c><![CDATA[p]]></c> parameter points to a <c><![CDATA[erlang_ref]]></c> structure - (which should have been obtained earlier with - <c><![CDATA[ei_decode_ref()]]></c>.</p> + <p>Encodes a char (8-bit) as an integer between 0-255 in the binary + format. For historical reasons the integer argument is of + type <c>char</c>. Your C code is to consider the specified + argument to be of type <c>unsigned char</c> even if + the C compilers and system may define <c>char</c> to be + signed.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_term(char *buf, int *index, void *t)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_term(ei_x_buff* x, void *t)</nametext></name> - <fsummary>Encode an <c><![CDATA[erl_interface]]></c>term</fsummary> + <name><ret>int</ret><nametext>ei_encode_double(char *buf, int *index, double p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_double(ei_x_buff* x, double p)</nametext></name> + <fsummary>Encode a double float.</fsummary> <desc> - <p>This function encodes an <c><![CDATA[ETERM]]></c>, as obtained from - <c><![CDATA[erl_interface]]></c>. The <c><![CDATA[t]]></c> parameter is actually an - <c><![CDATA[ETERM]]></c> pointer. This function doesn't free the - <c><![CDATA[ETERM]]></c>.</p> + <p>Encodes a double-precision (64-bit) floating point number in + the binary format.</p> + <p>Returns <c>-1</c> if the floating point + number is not finite.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_trace(char *buf, int *index, const erlang_trace *p)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_trace(ei_x_buff* x, const erlang_trace *p)</nametext></name> - <fsummary>Encode a trace token</fsummary> + <name><ret>int</ret><nametext>ei_encode_empty_list(char* buf, int* index)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_empty_list(ei_x_buff* x)</nametext></name> + <fsummary>Encode an empty list (<c>nil</c>).</fsummary> <desc> - <p>This function encodes an erlang trace token in the binary - format. The <c><![CDATA[p]]></c> parameter points to a - <c><![CDATA[erlang_trace]]></c> structure (which should have been - obtained earlier with <c><![CDATA[ei_decode_trace()]]></c>.</p> + <p>Encodes an empty list. It is often used at the tail of a list.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_tuple_header(char *buf, int *index, int arity)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_tuple_header(ei_x_buff* x, int arity)</nametext></name> - <fsummary>Encode a tuple</fsummary> + <name><ret>int</ret><nametext>ei_encode_fun(char *buf, int *index, const erlang_fun *p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_fun(ei_x_buff* x, const erlang_fun* fun)</nametext></name> + <fsummary>Encode a fun.</fsummary> <desc> - <p>This function encodes a tuple header, with a specified - arity. The next <c><![CDATA[arity]]></c> terms encoded will be the - elements of the tuple. Tuples and lists are encoded - recursively, so that a tuple may contain another tuple or - list.</p> - <p>E.g. to encode the tuple <c><![CDATA[{a, {b, {}}}]]></c>:</p> - <pre> -ei_encode_tuple_header(buf, &i, 2); -ei_encode_atom(buf, &i, "a"); -ei_encode_tuple_header(buf, &i, 2); -ei_encode_atom(buf, &i, "b"); -ei_encode_tuple_header(buf, &i, 0); - </pre> + <p>Encodes a fun in the binary format. Parameter <c>p</c> + points to an <c>erlang_fun</c> structure. The + <c>erlang_fun</c> is not freed automatically, the + <c>free_fun</c> is to be called if the fun is not needed + after encoding.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_encode_list_header(char *buf, int *index, int arity)</nametext></name> <name><ret>int</ret><nametext>ei_x_encode_list_header(ei_x_buff* x, int arity)</nametext></name> - <fsummary>Encode a list</fsummary> + <fsummary>Encode a list.</fsummary> <desc> - <p>This function encodes a list header, with a specified - arity. The next <c><![CDATA[arity+1]]></c> terms are the elements - (actually its <c><![CDATA[arity]]></c> cons cells) and the tail of the + <p>Encodes a list header, with a specified + arity. The next <c>arity+1</c> terms are the elements + (actually its <c>arity</c> cons cells) and the tail of the list. Lists and tuples are encoded recursively, so that a - list may contain another list or tuple.</p> - <p>E.g. to encode the list <c><![CDATA[[c, d, [e | f]]]]></c>:</p> + list can contain another list or tuple.</p> + <p>For example, to encode the list + <c>[c, d, [e | f]]</c>:</p> <pre> ei_encode_list_header(buf, &i, 3); ei_encode_atom(buf, &i, "c"); @@ -392,14 +539,13 @@ ei_encode_atom(buf, &i, "d"); ei_encode_list_header(buf, &i, 1); ei_encode_atom(buf, &i, "e"); ei_encode_atom(buf, &i, "f"); -ei_encode_empty_list(buf, &i); - </pre> +ei_encode_empty_list(buf, &i);</pre> <note> <p>It may seem that there is no way to create a list without knowing the number of elements in advance. But indeed - there is a way. Note that the list <c><![CDATA[[a, b, c]]]></c> can be - written as <c><![CDATA[[a | [b | [c]]]]]></c>. Using this, a list can - be written as conses.</p> + there is a way. Notice that the list <c>[a, b, c]</c> + can be written as <c>[a | [b | [c]]]</c>. + Using this, a list can be written as conses.</p> </note> <p>To encode a list, without knowing the arity in advance:</p> <pre> @@ -407,425 +553,350 @@ while (something()) { ei_x_encode_list_header(&x, 1); ei_x_encode_ulong(&x, i); /* just an example */ } -ei_x_encode_empty_list(&x); - </pre> +ei_x_encode_empty_list(&x);</pre> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_encode_empty_list(char* buf, int* index)</nametext></name> - <name><ret>int</ret><nametext>ei_x_encode_empty_list(ei_x_buff* x)</nametext></name> - <fsummary>Encode an empty list (<c><![CDATA[nil]]></c>)</fsummary> + <name><ret>int</ret><nametext>ei_encode_long(char *buf, int *index, long p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_long(ei_x_buff* x, long p)</nametext></name> + <fsummary>Encode integer.</fsummary> <desc> - <p>This function encodes an empty list. It's often used at the - tail of a list.</p> + <p>Encodes a long integer in the binary format. + If the code is 64 bits, the function <c>ei_encode_long()</c> is + the same as <c>ei_encode_longlong()</c>.</p> </desc> </func> + + <func> + <name><ret>int</ret><nametext>ei_encode_longlong(char *buf, int *index, long long p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_longlong(ei_x_buff* x, long long p)</nametext></name> + <fsummary>Encode integer.</fsummary> + <desc> + <p>Encodes a GCC <c>long long</c> or Visual C++ + <c>__int64</c> (64-bit) integer in the binary format. + This function is missing in the VxWorks port.</p> + </desc> + </func> + <func> <name><ret>int</ret><nametext>ei_encode_map_header(char *buf, int *index, int arity)</nametext></name> <name><ret>int</ret><nametext>ei_x_encode_map_header(ei_x_buff* x, int arity)</nametext></name> - <fsummary>Encode a map</fsummary> + <fsummary>Encode a map.</fsummary> <desc> - <p>This function encodes a map header, with a specified arity. The next + <p>Encodes a map header, with a specified arity. The next <c>arity*2</c> terms encoded will be the keys and values of the map encoded in the following order: <c>K1, V1, K2, V2, ..., Kn, Vn</c>. </p> - <p>E.g. to encode the map <c>#{a => "Apple", b => "Banana"}</c>:</p> + <p>For example, to encode the map <c>#{a => "Apple", b => + "Banana"}</c>:</p> <pre> ei_x_encode_map_header(&x, 2); ei_x_encode_atom(&x, "a"); ei_x_encode_string(&x, "Apple"); ei_x_encode_atom(&x, "b"); -ei_x_encode_string(&x, "Banana"); - </pre> - <p>A correctly encoded map can not have duplicate keys.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_get_type(const char *buf, const int *index, int *type, int *size)</nametext></name> - <fsummary>Fetch the type and size of an encoded term</fsummary> - <desc> - <p>This function returns the type in <c><![CDATA[type]]></c> and size in - <c><![CDATA[size]]></c> of the encoded term. - For strings and atoms, size - is the number of characters <em>not</em> including the - terminating 0. For binaries, <c><![CDATA[size]]></c> is the number of - bytes. For lists and tuples, <c><![CDATA[size]]></c> is the arity of the - object. For other types, <c><![CDATA[size]]></c> is 0. In all cases, - <c><![CDATA[index]]></c> is left unchanged.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_decode_version(const char *buf, int *index, int *version)</nametext></name> - <fsummary>Encode an empty list (<c><![CDATA[nil]]></c>)</fsummary> - <desc> - <p>This function decodes the version magic number for the - erlang binary term format. It must be the first token in a - binary term.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_decode_long(const char *buf, int *index, long *p)</nametext></name> - <fsummary>Decode integer</fsummary> - <desc> - <p>This function decodes a long integer from the binary format. - Note that if the code is 64 bits the function ei_decode_long() is - exactly the same as ei_decode_longlong().</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_decode_ulong(const char *buf, int *index, unsigned long *p)</nametext></name> - <fsummary>Decode unsigned integer</fsummary> - <desc> - <p>This function decodes an unsigned long integer from - the binary format. - Note that if the code is 64 bits the function ei_decode_ulong() is - exactly the same as ei_decode_ulonglong().</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_decode_longlong(const char *buf, int *index, long long *p)</nametext></name> - <fsummary>Decode integer</fsummary> - <desc> - <p>This function decodes a GCC <c><![CDATA[long long]]></c> or Visual C++ <c><![CDATA[__int64]]></c> - (64 bit) integer from the binary format. Note that this - function is missing in the VxWorks port.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_decode_ulonglong(const char *buf, int *index, unsigned long long *p)</nametext></name> - <fsummary>Decode unsigned integer</fsummary> - <desc> - <p>This function decodes a GCC <c><![CDATA[unsigned long long]]></c> or Visual C++ - <c><![CDATA[unsigned __int64]]></c> (64 bit) integer from the binary format. - Note that this function is missing in the VxWorks port.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_decode_bignum(const char *buf, int *index, mpz_t obj)</nametext></name> - <fsummary>Decode a GMP arbitrary precision integer</fsummary> - <desc> - <p>This function decodes an integer in the binary format to a GMP <c><![CDATA[mpz_t]]></c> integer. - To use this function the ei library needs to be configured and compiled - to use the GMP library. </p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_decode_double(const char *buf, int *index, double *p)</nametext></name> - <fsummary>Decode a double</fsummary> - <desc> - <p>This function decodes an double-precision (64 bit) floating - point number from the binary format.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_decode_boolean(const char *buf, int *index, int *p)</nametext></name> - <fsummary>Decode a boolean</fsummary> - <desc> - <p>This function decodes a boolean value from the binary - format. A boolean is actually an atom, <c><![CDATA[true]]></c> decodes 1 - and <c><![CDATA[false]]></c> decodes 0.</p> +ei_x_encode_string(&x, "Banana");</pre> + <p>A correctly encoded map cannot have duplicate keys.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_char(const char *buf, int *index, char *p)</nametext></name> - <fsummary>Decode an 8-bit integer between 0-255</fsummary> + <name><ret>int</ret><nametext>ei_encode_pid(char *buf, int *index, const erlang_pid *p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_pid(ei_x_buff* x, const erlang_pid *p)</nametext></name> + <fsummary>Encode a pid.</fsummary> <desc> - <p>This function decodes a char (8-bit) integer between 0-255 - from the binary format. - Note that for historical reasons the returned integer is of - type <c><![CDATA[char]]></c>. Your C code should consider the - returned value to be of type <c><![CDATA[unsigned char]]></c> even if - the C compilers and system may define <c><![CDATA[char]]></c> to be - signed.</p> + <p>Encodes an Erlang process identifier (pid) in the binary + format. Parameter <c>p</c> points to an + <c>erlang_pid</c> structure (which should have been + obtained earlier with <c>ei_decode_pid()</c>).</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_string(const char *buf, int *index, char *p)</nametext></name> - <fsummary>Decode a string</fsummary> + <name><ret>int</ret><nametext>ei_encode_port(char *buf, int *index, const erlang_port *p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_port(ei_x_buff* x, const erlang_port *p)</nametext></name> + <fsummary>Encode a port.</fsummary> <desc> - <p>This function decodes a string from the binary format. A - string in erlang is a list of integers between 0 and - 255. Note that since the string is just a list, sometimes - lists are encoded as strings by <c><![CDATA[term_to_binary/1]]></c>, - even if it was not intended.</p> - <p>The string is copied to <c><![CDATA[p]]></c>, and enough space must be - allocated. The returned string is null terminated so you - need to add an extra byte to the memory requirement.</p> + <p>Encodes an Erlang port in the binary format. Parameter + <c>p</c> points to a <c>erlang_port</c> + structure (which should have been obtained earlier with + <c>ei_decode_port()</c>).</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_atom(const char *buf, int *index, char *p)</nametext></name> - <fsummary>Decode an atom</fsummary> + <name><ret>int</ret><nametext>ei_encode_ref(char *buf, int *index, const erlang_ref *p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_ref(ei_x_buff* x, const erlang_ref *p)</nametext></name> + <fsummary>Encode a ref.</fsummary> <desc> - <p>This function decodes an atom from the binary format. The - null terminated name of the atom is placed at <c><![CDATA[p]]></c>. There can be at most - <c><![CDATA[MAXATOMLEN]]></c> bytes placed in the buffer.</p> + <p>Encodes an Erlang reference in the binary format. Parameter + <c>p</c> points to a <c>erlang_ref</c> + structure (which should have been obtained earlier with + <c>ei_decode_ref()</c>).</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_atom_as(const char *buf, int *index, char *p, int plen, erlang_char_encoding want, erlang_char_encoding* was, erlang_char_encoding* result)</nametext></name> - <fsummary>Decode an atom</fsummary> + <name><ret>int</ret><nametext>ei_encode_string(char *buf, int *index, const char *p)</nametext></name> + <name><ret>int</ret><nametext>ei_encode_string_len(char *buf, int *index, const char *p, int len)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_string(ei_x_buff* x, const char *p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_string_len(ei_x_buff* x, const char* s, int len)</nametext></name> + <fsummary>Encode a string.</fsummary> <desc> - <p>This function decodes an atom from the binary format. The - null terminated name of the atom is placed in buffer at <c>p</c> of length - <c>plen</c> bytes.</p> - <p>The wanted string encoding is specified by <seealso marker="#erlang_char_encoding"> - <c>want</c></seealso>. The original encoding used in the - binary format (latin1 or utf8) can be obtained from <c>*was</c>. The actual encoding of the resulting string - (7-bit ascii, latin1 or utf8) can be obtained from <c>*result</c>. Both <c>was</c> and <c>result</c> can be <c>NULL</c>. - - <c>*result</c> may differ from <c>want</c> if <c>want</c> is a bitwise-or'd combination like - <c>ERLANG_LATIN1|ERLANG_UTF8</c> or if <c>*result</c> turn out to be pure 7-bit ascii - (compatible with both latin1 and utf8).</p> - <p>This function fails if the atom is too long for the buffer - or if it can not be represented with encoding <c>want</c>.</p> - <p>This function was introduced in R16 release of Erlang/OTP as part of a first step - to support UTF8 atoms.</p> + <p>Encodes a string in the binary format. (A string in Erlang + is a list, but is encoded as a character array in the binary + format.) The string is to be <c>NULL</c>-terminated, except for + the <c>ei_x_encode_string_len()</c> function.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_binary(const char *buf, int *index, void *p, long *len)</nametext></name> - <fsummary>Decode a binary</fsummary> + <name><ret>int</ret><nametext>ei_encode_term(char *buf, int *index, void *t)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_term(ei_x_buff* x, void *t)</nametext></name> + <fsummary>Encode an <c>erl_interface</c> term.</fsummary> <desc> - <p>This function decodes a binary from the binary format. The - <c><![CDATA[len]]></c> parameter is set to the actual size of the - binary. Note that <c><![CDATA[ei_decode_binary()]]></c> assumes that there - are enough room for the binary. The size required can be - fetched by <c><![CDATA[ei_get_type()]]></c>.</p> + <p>Encodes an <c>ETERM</c>, as obtained from + <c>erl_interface</c>. Parameter <c>t</c> is + actually an <c>ETERM</c> pointer. This function + does not free the <c>ETERM</c>.</p> </desc> </func> <func> - <name><ret>int</ret><nametext>ei_decode_fun(const char *buf, int *index, erlang_fun *p)</nametext></name> - <name><ret>void</ret><nametext>free_fun(erlang_fun* f)</nametext></name> - <fsummary>Decode a fun</fsummary> + <name><ret>int</ret><nametext>ei_encode_trace(char *buf, int *index, const erlang_trace *p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_trace(ei_x_buff* x, const erlang_trace *p)</nametext></name> + <fsummary>Encode a trace token.</fsummary> <desc> - <p>This function decodes a fun from the binary format. The - <c><![CDATA[p]]></c> parameter should be NULL or point to an - <c><![CDATA[erlang_fun]]></c> structure. This is the only decode - function that allocates memory; when the <c><![CDATA[erlang_fun]]></c> - is no longer needed, it should be freed with - <c><![CDATA[free_fun]]></c>. (This has to do with the arbitrary size of - the environment for a fun.)</p> + <p>Encodes an Erlang trace token in the binary format. + Parameter <c>p</c> points to a + <c>erlang_trace</c> structure (which should have been + obtained earlier with <c>ei_decode_trace()</c>).</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_pid(const char *buf, int *index, erlang_pid *p)</nametext></name> - <fsummary>Decode a <c><![CDATA[pid]]></c></fsummary> + <name><ret>int</ret><nametext>ei_encode_tuple_header(char *buf, int *index, int arity)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_tuple_header(ei_x_buff* x, int arity)</nametext></name> + <fsummary>Encode a tuple.</fsummary> <desc> - <p>Decodes a pid, process identifier, from the binary format.</p> + <p>Encodes a tuple header, with a specified + arity. The next <c>arity</c> terms encoded will be the + elements of the tuple. Tuples and lists are encoded + recursively, so that a tuple can contain another tuple or list.</p> + <p>For example, to encode the tuple <c>{a, {b, {}}}</c>:</p> + <pre> +ei_encode_tuple_header(buf, &i, 2); +ei_encode_atom(buf, &i, "a"); +ei_encode_tuple_header(buf, &i, 2); +ei_encode_atom(buf, &i, "b"); +ei_encode_tuple_header(buf, &i, 0);</pre> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_port(const char *buf, int *index, erlang_port *p)</nametext></name> - <fsummary>Decode a port</fsummary> + <name><ret>int</ret><nametext>ei_encode_ulong(char *buf, int *index, unsigned long p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_ulong(ei_x_buff* x, unsigned long p)</nametext></name> + <fsummary>Encode unsigned integer.</fsummary> <desc> - <p>This function decodes a port identifier from the binary - format.</p> + <p>Encodes an unsigned long integer in the binary format. + If the code is 64 bits, the function <c>ei_encode_ulong()</c> is + the same as <c>ei_encode_ulonglong()</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_ref(const char *buf, int *index, erlang_ref *p)</nametext></name> - <fsummary>Decode a reference</fsummary> + <name><ret>int</ret><nametext>ei_encode_ulonglong(char *buf, int *index, unsigned long long p)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_ulonglong(ei_x_buff* x, unsigned long long p)</nametext></name> + <fsummary>Encode unsigned integer.</fsummary> <desc> - <p>This function decodes a reference from the binary format.</p> + <p>Encodes a GCC <c>unsigned long long</c> or Visual C++ + <c>unsigned __int64</c> (64-bit) integer in the binary + format. This function is missing in the VxWorks port.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_trace(const char *buf, int *index, erlang_trace *p)</nametext></name> - <fsummary>Decode a trace token</fsummary> + <name><ret>int</ret><nametext>ei_encode_version(char *buf, int *index)</nametext></name> + <name><ret>int</ret><nametext>ei_x_encode_version(ei_x_buff* x)</nametext></name> + <fsummary>Encode version.</fsummary> <desc> - <p>Decodes an erlang trace token from the binary format.</p> + <p>Encodes a version magic number for the binary format. Must + be the first token in a binary term.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_tuple_header(const char *buf, int *index, int *arity)</nametext></name> - <fsummary>Decode a tuple</fsummary> + <name><ret>int</ret><nametext>ei_get_type(const char *buf, const int *index, int *type, int *size)</nametext></name> + <fsummary>Fetch the type and size of an encoded term.</fsummary> <desc> - <p>This function decodes a tuple header, the number of elements - is returned in <c><![CDATA[arity]]></c>. The tuple elements follows in order in - the buffer.</p> + <p>Returns the type in <c>type</c> and size in + <c>size</c> of the encoded term. For strings and atoms, + size is the number of characters <em>not</em> including the + terminating <c>NULL</c>. For binaries, <c>size</c> is the number of + bytes. For lists and tuples, <c>size</c> is the arity of + the object. For other types, <c>size</c> is 0. In all + cases, <c>index</c> is left unchanged.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_list_header(const char *buf, int *index, int *arity)</nametext></name> - <fsummary>Decode a list</fsummary> - <desc> - <p>This function decodes a list header from the binary - format. The number of elements is returned in - <c><![CDATA[arity]]></c>. The <c><![CDATA[arity+1]]></c> elements follows (the last - one is the tail of the list, normally an empty list.) If - <c><![CDATA[arity]]></c> is <c><![CDATA[0]]></c>, it's an empty list.</p> - <p>Note that lists are encoded as strings, if they consist - entirely of integers in the range 0..255. This function will - not decode such strings, use <c><![CDATA[ei_decode_string()]]></c> - instead.</p> + <name><ret>int</ret><nametext>ei_print_term(FILE* fp, const char* buf, int* index)</nametext></name> + <name><ret>int</ret><nametext>ei_s_print_term(char** s, const char* buf, int* index)</nametext></name> + <fsummary>Print a term in clear text.</fsummary> + <desc> + <p>Prints a term, in clear text, to the file + specified by <c>fp</c>, or the buffer pointed to by + <c>s</c>. It + tries to resemble the term printing in the Erlang shell.</p> + <p>In <c>ei_s_print_term()</c>, parameter + <c>s</c> is to + point to a dynamically (malloc) allocated string of + <c>BUFSIZ</c> bytes or a <c>NULL</c> pointer. The string + can be reallocated (and <c>*s</c> can be updated) by this + function if the result is more than <c>BUFSIZ</c> + characters. The string returned is <c>NULL</c>-terminated.</p> + <p>The return value is the number of characters written to the file + or string, or <c>-1</c> if <c>buf[index]</c> does not + contain a valid term. + Unfortunately, I/O errors on <c>fp</c> is not checked.</p> + <p>Argument <c>index</c> is updated, that is, this function + can be viewed as a decode function that decodes a term into a + human-readable format.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_map_header(const char *buf, int *index, int *arity)</nametext></name> - <fsummary>Decode a map</fsummary> + <name><ret>void</ret><nametext>ei_set_compat_rel(release_number)</nametext></name> + <fsummary>Set the ei library in compatibility mode.</fsummary> + <type> + <v>unsigned release_number;</v> + </type> <desc> - <p>This function decodes a map header from the binary - format. The number of key-value pairs is returned in - <c>*arity</c>. Keys and values follow in the following order: - <c>K1, V1, K2, V2, ..., Kn, Vn</c>. This makes a total of - <c>arity*2</c> terms. If <c>arity</c> is zero, it's an empty map. - A correctly encoded map does not have duplicate keys.</p> + <marker id="ei_set_compat_rel"></marker> + <p>By default, the <c>ei</c> library is only guaranteed + to be compatible with other Erlang/OTP components from the same + release as the <c>ei</c> library itself. For example, + <c>ei</c> from + Erlang/OTP R10 is not compatible with an Erlang emulator + from Erlang/OTP R9 by default.</p> + <p>A call to <c>ei_set_compat_rel(release_number)</c> sets + the <c>ei</c> library in compatibility mode of release + <c>release_number</c>. Valid range of + <c>release_number</c> + is <c>[7, current release]</c>. This makes it possible to + communicate with Erlang/OTP components from earlier releases.</p> + <note> + <p>If this function is called, it can only be called once + and must be called before any other functions in the + <c>ei</c> library are called.</p> + </note> + <warning> + <p>You can run into trouble if this feature is used + carelessly. Always ensure that all communicating + components are either from the same Erlang/OTP release, or + from release X and release Y where all components + from release Y are in compatibility mode of release X.</p> + </warning> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_decode_ei_term(const char* buf, int* index, ei_term* term)</nametext></name> - <fsummary>Decode a term, without prior knowledge of type</fsummary> + <name><ret>int</ret><nametext>ei_skip_term(const char* buf, int* index)</nametext></name> + <fsummary>Skip a term.</fsummary> <desc> - <p>This function decodes any term, or at least tries to. If the - term pointed at by <c><![CDATA[*index]]></c> in <c><![CDATA[buf]]></c> fits in the - <c><![CDATA[term]]></c> union, it is decoded, and the appropriate field - in <c><![CDATA[term->value]]></c> is set, and <c><![CDATA[*index]]></c> is - incremented by the term size.</p> - <p>The function returns 1 on successful decoding, -1 on error, - and 0 if the term seems alright, but does not fit in the - <c><![CDATA[term]]></c> structure. If it returns 1, the <c><![CDATA[index]]></c> - will be incremented, and the <c><![CDATA[term]]></c> contains the - decoded term.</p> - <p>The <c><![CDATA[term]]></c> structure will contain the arity for a tuple - or list, size for a binary, string or atom. It will contains - a term if it's any of the following: integer, float, atom, - pid, port or ref.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_decode_term(const char *buf, int *index, void *t)</nametext></name> - <fsummary>Decode a <c><![CDATA[ETERM]]></c></fsummary> - <desc> - <p>This function decodes a term from the binary format. The - term is return in <c><![CDATA[t]]></c> as a <c><![CDATA[ETERM*]]></c>, so <c><![CDATA[t]]></c> - is actually an <c><![CDATA[ETERM**]]></c> (see - <c><![CDATA[erl_interface(3)]]></c>. The term should later be - deallocated.</p> - <p>Note that this function is located in the erl_interface - library.</p> + <p>Skips a term in the specified buffer; + recursively skips elements of lists and tuples, so that a + full term is skipped. This is a way to get the size of an + Erlang term.</p> + <p><c>buf</c> is the buffer.</p> + <p><c>index</c> is updated to point right after the term + in the buffer.</p> + <note> + <p>This can be useful when you want to hold arbitrary + terms: skip them and copy the binary term data to some + buffer.</p> + </note> + <p>Returns <c>0</c> on success, otherwise + <c>-1</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_print_term(FILE* fp, const char* buf, int* index)</nametext></name> - <name><ret>int</ret><nametext>ei_s_print_term(char** s, const char* buf, int* index)</nametext></name> - <fsummary>Print a term in clear text</fsummary> + <name><ret>int</ret><nametext>ei_x_append(ei_x_buff* x, const ei_x_buff* x2)</nametext></name> + <name><ret>int</ret><nametext>ei_x_append_buf(ei_x_buff* x, const char* buf, int len)</nametext></name> + <fsummary>Append a buffer at the end.</fsummary> <desc> - <p>This function prints a term, in clear text, to the file - given by <c><![CDATA[fp]]></c>, or the buffer pointed to by <c><![CDATA[s]]></c>. It - tries to resemble the term printing in the erlang shell.</p> - <p>In <c><![CDATA[ei_s_print_term()]]></c>, the parameter <c><![CDATA[s]]></c> should - point to a dynamically (malloc) allocated string of - <c><![CDATA[BUFSIZ]]></c> bytes or a NULL pointer. The string may be - reallocated (and <c><![CDATA[*s]]></c> may be updated) by this function - if the result is more than <c><![CDATA[BUFSIZ]]></c> characters. The - string returned is zero-terminated.</p> - <p>The return value is the number of characters written to the - file or string, or -1 if <c><![CDATA[buf[index]]]></c> doesn't contain a - valid term. Unfortunately, I/O errors on <c><![CDATA[fp]]></c> is not - checked.</p> - <p>The argument <c><![CDATA[index]]></c> is updated, i.e. this function can - be viewed as en decode function that decodes a term into a - human readable format.</p> + <p>Appends data at the end of buffer <c>x</c>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_x_format(ei_x_buff* x, const char* fmt, ...)</nametext></name> <name><ret>int</ret><nametext>ei_x_format_wo_ver(ei_x_buff* x, const char *fmt, ... )</nametext></name> <fsummary>Format a term from a format string and parameters.</fsummary> <desc> - <p>Format a term, given as a string, to a buffer. This - functions works like a sprintf for erlang terms. The - <c><![CDATA[fmt]]></c> contains a format string, with arguments like - <c><![CDATA[~d]]></c>, to insert terms from variables. The following + <p>Formats a term, given as a string, to a buffer. + Works like a sprintf for Erlang terms. + <c>fmt</c> contains a format string, with arguments like + <c>~d</c>, to insert terms from variables. The following formats are supported (with the C types given):</p> - <p></p> <pre> -~a - an atom, char* -~c - a character, char -~s - a string, char* -~i - an integer, int -~l - a long integer, long int -~u - a unsigned long integer, unsigned long int -~f - a float, float -~d - a double float, double float -~p - an Erlang PID, erlang_pid* - </pre> - <p>For instance, to encode a tuple with some stuff:</p> +~a An atom, char* +~c A character, char +~s A string, char* +~i An integer, int +~l A long integer, long int +~u A unsigned long integer, unsigned long int +~f A float, float +~d A double float, double float +~p An Erlang pid, erlang_pid*</pre> + <p>For example, to encode a tuple with some stuff:</p> <pre> ei_x_format("{~a,~i,~d}", "numbers", 12, 3.14159) -encodes the tuple {numbers,12,3.14159} - </pre> - <p>The <c><![CDATA[ei_x_format_wo_ver()]]></c> formats into a buffer, without - the initial version byte.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_x_new(ei_x_buff* x)</nametext></name> - <name><ret>int</ret><nametext>ei_x_new_with_version(ei_x_buff* x)</nametext></name> - <fsummary>Allocate a new buffer</fsummary> - <desc> - <p>This function allocates a new <c><![CDATA[ei_x_buff]]></c> buffer. The - fields of the structure pointed to by <c><![CDATA[x]]></c> parameter is - filled in, and a default buffer is allocated. The - <c><![CDATA[ei_x_new_with_version()]]></c> also puts an initial version - byte, that is used in the binary format. (So that - <c><![CDATA[ei_x_encode_version()]]></c> won't be needed.)</p> +encodes the tuple {numbers,12,3.14159}</pre> + <p><c>ei_x_format_wo_ver()</c> formats into a buffer, + without the initial version byte.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_x_free(ei_x_buff* x)</nametext></name> - <fsummary>Frees a buffer</fsummary> - <desc> - <p>This function frees an <c><![CDATA[ei_x_buff]]></c> buffer. The memory - used by the buffer is returned to the OS.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_x_append(ei_x_buff* x, const ei_x_buff* x2)</nametext></name> - <name><ret>int</ret><nametext>ei_x_append_buf(ei_x_buff* x, const char* buf, int len)</nametext></name> - <fsummary>Appends a buffer at the end</fsummary> + <fsummary>Free a buffer.</fsummary> <desc> - <p>These functions appends data at the end of the buffer <c><![CDATA[x]]></c>.</p> + <p>Frees an <c>ei_x_buff</c> buffer. + The memory used by the buffer is returned to the OS.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_skip_term(const char* buf, int* index)</nametext></name> - <fsummary>skip a term</fsummary> + <name><ret>int</ret><nametext>ei_x_new(ei_x_buff* x)</nametext></name> + <name><ret>int</ret><nametext>ei_x_new_with_version(ei_x_buff* x)</nametext></name> + <fsummary>Allocate a new buffer.</fsummary> <desc> - <p>This function skips a term in the given buffer, it - recursively skips elements of lists and tuples, so that a - full term is skipped. This is a way to get the size of an - erlang term.</p> - <p><c><![CDATA[buf]]></c> is the buffer.</p> - <p><c><![CDATA[index]]></c> is updated to point right after the term in the - buffer.</p> - <note> - <p>This can be useful when you want to hold arbitrary - terms: just skip them and copy the binary term data to some - buffer.</p> - </note> - <p>The function returns <c><![CDATA[0]]></c> on success and <c><![CDATA[-1]]></c> on - failure.</p> + <p>Allocates a new <c>ei_x_buff</c> buffer. The + fields of the structure pointed to by parameter <c>x</c> + is filled in, and a default buffer is allocated. + <c>ei_x_new_with_version()</c> also puts an initial + version byte, which is used in the binary format (so that + <c>ei_x_encode_version()</c> will not be needed.)</p> </desc> </func> </funcs> <section> <title>Debug Information</title> - <p>Some tips on what to check when the emulator doesn't seem to - receive the terms that you send.</p> + <p>Some tips on what to check when the emulator does not seem to + receive the terms that you send:</p> + <list type="bulleted"> - <item>be careful with the version header, use - <c><![CDATA[ei_x_new_with_version()]]></c> when appropriate</item> - <item>turn on distribution tracing on the erlang node</item> - <item>check the result codes from ei_decode_-calls</item> + <item>Be careful with the version header, use + <c>ei_x_new_with_version()</c> when appropriate.</item> + <item>Turn on distribution tracing on the Erlang node.</item> + <item>Check the result codes from <c>ei_decode_-calls</c>.</item> </list> </section> <section> <title>See Also</title> - <p>erl_interface(3)</p> + <p><seealso marker="erl_eterm"><c>erl_eterm</c></seealso></p> </section> </cref> - diff --git a/lib/erl_interface/doc/src/ei_connect.xml b/lib/erl_interface/doc/src/ei_connect.xml index 516357b6a3..607a7cbff4 100644 --- a/lib/erl_interface/doc/src/ei_connect.xml +++ b/lib/erl_interface/doc/src/ei_connect.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,100 +19,233 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>ei_connect</title> <prepared>Jakob Cederlund</prepared> <docno></docno> - <approved>?</approved> - <checked>?</checked> + <approved></approved> + <checked></checked> <date>2001-09-01</date> <rev>A</rev> - <file>ei_connect.sgml</file> + <file>ei_connect.xml</file> </header> <lib>ei_connect</lib> - <libsummary>Communicate with distributed erlang</libsummary> + <libsummary>Communicate with distributed Erlang.</libsummary> <description> - <p>This module enables C programs to communicate with erlang nodes, - using the erlang distribution over TCP/IP.</p> - <p>A C node appears to Erlang as a - <em>hidden node</em>. + <p>This module enables C-programs to communicate with Erlang nodes, + using the Erlang distribution over TCP/IP.</p> + + <p>A C-node appears to Erlang as a <em>hidden node</em>. That is, Erlang processes that know the name of the - C node are able to communicate with it in a normal manner, but - the node name will not appear in the listing provided by the - Erlang function <c><![CDATA[nodes/0]]></c>.</p> - <p>The environment variable <c><![CDATA[ERL_EPMD_PORT]]></c> can be used - to indicate which logical cluster a C node belongs to.</p> + C-node can communicate with it in a normal manner, but + the node name is not shown in the listing provided by + <seealso marker="erts:erlang#nodes/0"><c>erlang:nodes/0</c></seealso> + in <c>ERTS</c>.</p> + + <p>The environment variable <c>ERL_EPMD_PORT</c> can be used + to indicate which logical cluster a C-node belongs to.</p> </description> <section> - <title>Timeout functions</title> + <title>Time-Out Functions</title> <p>Most functions appear in a version with the suffix - <c><![CDATA[_tmo]]></c> appended to the function name. Those function take - an additional argument, a timeout in <em>milliseconds</em>. The - semantics is this; for each communication primitive involved in + <c>_tmo</c> appended to the function name. Those functions + take an extra argument, a time-out in <em>milliseconds</em>. The + semantics is this: for each communication primitive involved in the operation, if the primitive does not complete within the time - specified, the function will return an error and - <c><![CDATA[erl_errno]]></c> will be set to <c><![CDATA[ETIMEDOUT]]></c>. With - communication primitive is meant an operation on the socket, like - <c><![CDATA[connect]]></c>, <c><![CDATA[accept]]></c>, <c><![CDATA[recv]]></c> or <c><![CDATA[send]]></c>.</p> - <p>Obviously the timeouts are for implementing fault tolerance, - not to keep hard realtime promises. The <c><![CDATA[_tmo]]></c> functions + specified, the function returns an error and + <c>erl_errno</c> is set to <c>ETIMEDOUT</c>. + With communication primitive is meant an operation on the socket, like + <c>connect</c>, <c>accept</c>, + <c>recv</c>, or <c>send</c>.</p> + + <p>Clearly the time-outs are for implementing fault tolerance, + not to keep hard real-time promises. The <c>_tmo</c> functions are for detecting non-responsive peers and to avoid blocking on - socket operations. </p> - <p>A timeout value of <c><![CDATA[0]]></c> (zero), means that timeouts are - disabled. Calling a <c><![CDATA[_tmo]]></c>-function with the last argument as - <c><![CDATA[0]]></c> is therefore exactly the same thing as calling the - function without the <c><![CDATA[_tmo]]></c> suffix.</p> - <p>As with all other ei functions, you are <em>not</em> expected - to put the socket in non blocking mode yourself in the program. Every - use of non blocking mode is embedded inside the timeout + socket operations.</p> + + <p>A time-out value of <c>0</c> (zero) means that time-outs are + disabled. Calling a <c>_tmo</c> function with the last + argument as <c>0</c> is therefore the same thing as calling + the function without the <c>_tmo</c> suffix.</p> + + <p>As with all other functions starting with <c>ei_</c>, + you are <em>not</em> expected + to put the socket in non-blocking mode yourself in the program. Every + use of non-blocking mode is embedded inside the time-out functions. The socket will always be back in blocking mode after the operations are completed (regardless of the result). To - avoid problems, leave the socket options alone. Ei will handle + avoid problems, leave the socket options alone. <c>ei</c> handles any socket options that need modification.</p> - <p>In all other senses, the <c><![CDATA[_tmo]]></c> functions inherit all - the return values and the semantics from the functions without - the <c><![CDATA[_tmo]]></c> suffix.</p> + + <p>In all other senses, the <c>_tmo</c> functions inherit all + the return values and the semantics from the functions without + the <c>_tmo</c> suffix.</p> </section> + <funcs> <func> + <name><ret>struct hostent</ret><nametext>*ei_gethostbyaddr(const char *addr, int len, int type)</nametext></name> + <name><ret>struct hostent</ret><nametext>*ei_gethostbyaddr_r(const char *addr, int length, int type, struct hostent *hostp, char *buffer, int buflen, int *h_errnop)</nametext></name> + <name><ret>struct hostent</ret><nametext>*ei_gethostbyname(const char *name)</nametext></name> + <name><ret>struct hostent</ret><nametext>*ei_gethostbyname_r(const char *name, struct hostent *hostp, char *buffer, int buflen, int *h_errnop)</nametext></name> + <fsummary>Name lookup functions.</fsummary> + <desc> + <p>Convenience functions for some common name lookup functions.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp)</nametext></name> + <fsummary>Accept a connection from another node.</fsummary> + <desc> + <p>Used by a server process to accept a + connection from a client process.</p> + <list type="bulleted"> + <item> + <p><c>ec</c> is the C-node structure.</p> + </item> + <item> + <p><c>listensock</c> is an open socket descriptor on + which <c>listen()</c> has previously been called.</p> + </item> + <item> + <p><c>conp</c> is a pointer to an + <c>ErlConnect</c> struct, described as follows:</p> + <code type="none"><![CDATA[ +typedef struct { + char ipadr[4]; + char nodename[MAXNODELEN]; +} ErlConnect; + ]]></code> + </item> + </list> + <p>On success, <c>conp</c> is filled in with the address and + node name of the connecting client and a file descriptor is + returned. On failure, <c>ERL_ERROR</c> is returned and + <c>erl_errno</c> is set to <c>EIO</c>.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_accept_tmo(ei_cnode *ec, int listensock, ErlConnect *conp, unsigned timeout_ms)</nametext></name> + <fsummary>Accept a connection from another node with optional + time-out.</fsummary> + <desc> + <p>Equivalent to + <c>ei_accept</c> with an optional time-out argument, + see the description at the beginning of this manual page.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_connect(ei_cnode* ec, char *nodename)</nametext></name> + <name><ret>int</ret><nametext>ei_xconnect(ei_cnode* ec, Erl_IpAddr adr, char *alivename)</nametext></name> + <fsummary>Establish a connection to an Erlang node.</fsummary> + <desc> + <p>Sets up a connection to an Erlang node.</p> + <p><c>ei_xconnect()</c> requires the IP address of the + remote host and the alive name of the remote node to be + specified. <c>ei_connect()</c> provides an alternative + interface and determines the information from the node name + provided.</p> + <list type="bulleted"> + <item><c>addr</c> is the 32-bit IP address of the remote + host.</item> + <item><c>alive</c> is the alivename of the remote node. + </item> + <item><c>node</c> is the name of the remote node.</item> + </list> + <p>These functions return an open file descriptor on success, or + a negative value indicating that an error occurred. In the latter + case they set <c>erl_errno</c> to one of the + following:</p> + <taglist> + <tag><c>EHOSTUNREACH</c></tag> + <item>The remote host <c>node</c> is unreachable.</item> + <tag><c>ENOMEM</c></tag> + <item>No more memory is available.</item> + <tag><c>EIO</c></tag> + <item>I/O error.</item> + </taglist> + <p>Also, <c>errno</c> values from + <c>socket</c><em>(2)</em> and + <c>connect</c><em>(2)</em> + system calls may be propagated into <c>erl_errno</c>.</p> + <p><em>Example:</em></p> + <code type="none"><![CDATA[ +#define NODE "[email protected]" +#define ALIVE "madonna" +#define IP_ADDR "150.236.14.75" + +/*** Variant 1 ***/ +int fd = ei_connect(&ec, NODE); + +/*** Variant 2 ***/ +struct in_addr addr; +addr.s_addr = inet_addr(IP_ADDR); +fd = ei_xconnect(&ec, &addr, ALIVE); + ]]></code> + </desc> + </func> + + <func> <name><ret>int</ret><nametext>ei_connect_init(ei_cnode* ec, const char* this_node_name, const char *cookie, short creation)</nametext></name> <name><ret>int</ret><nametext>ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char *thisalivename, const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, short creation)</nametext></name> <fsummary>Initialize for a connection.</fsummary> <desc> - <p>These function initializes the <c><![CDATA[ec]]></c> structure, to + <p>Initializes the <c>ec</c> structure, to identify the node name and cookie of the server. One of them - has to be called before other functions that works on the - type <c><![CDATA[ei_cnode]]></c> or a file descriptor associated with a - connection to another node are used.</p> - <p><c><![CDATA[ec]]></c> is a structure containing information about the - C-node. It is used in other <c><![CDATA[ei]]></c> functions for - connecting and receiving data.</p> - <p><c><![CDATA[this_node_name]]></c> is the registered name of the process - (the name before '@').</p> - <p><c><![CDATA[cookie]]></c> is the cookie for the node.</p> - <p><c><![CDATA[creation]]></c> identifies a specific instance of a C - node. It can help prevent the node from receiving messages - sent to an earlier process with the same registered name.</p> - <p><c><![CDATA[thishostname]]></c> is the name of the machine we're running - on. If long names are to be used, it should be fully - qualified (i.e. <c><![CDATA[durin.erix.ericsson.se]]></c> instead of - <c><![CDATA[durin]]></c>).</p> - <p><c><![CDATA[thisalivename]]></c> is the registered name of the process.</p> - <p><c><![CDATA[thisnodename]]></c> is the full name of the node, - i.e. <c><![CDATA[einode@durin]]></c>.</p> - <p><c><![CDATA[thispaddr]]></c> if the IP address of the host.</p> - <p>A C node acting as a server will be assigned a creation - number when it calls <c><![CDATA[ei_publish()]]></c>.</p> - <p>A connection is closed by simply closing the socket. Refer - to system documentation to close the socket gracefully (when - there are outgoing packets before close).</p> - <p>This function return a negative value indicating that an error + must be called before other functions that works on the + <c>ei_cnode</c> type or a file descriptor associated with + a connection to another node is used.</p> + <list type="bulleted"> + <item> + <p><c>ec</c> is a structure containing information about + the C-node. It is used in other <c>ei</c> functions + for connecting and receiving data.</p> + </item> + <item> + <p><c>this_node_name</c> is the registered name of the + process (the name before '@').</p> + </item> + <item> + <p><c>cookie</c> is the cookie for the node.</p> + </item> + <item> + <p><c>creation</c> identifies a specific instance of a + C-node. It can help prevent the node from receiving messages + sent to an earlier process with the same registered name.</p> + </item> + <item> + <p><c>thishostname</c> is the name of the machine we are + running on. If long names are to be used, they are to be fully + qualified (that is, <c>durin.erix.ericsson.se</c> + instead of <c>durin</c>).</p> + </item> + <item> + <p><c>thisalivename</c> is the registered name of the + process.</p> + </item> + <item> + <p><c>thisnodename</c> is the full name of the node, + that is, <c>einode@durin</c>.</p> + </item> + <item> + <p><c>thispaddr</c> if the IP address of the host.</p> + </item> + </list> + <p>A C-node acting as a server is assigned a creation + number when it calls <c>ei_publish()</c>.</p> + <p>A connection is closed by simply closing the socket. + For information about how to close the socket gracefully (when + there are outgoing packets before close), see the relevant system + documentation.</p> + <p>These functions return a negative value indicating that an error occurred.</p> - <p>Example 1: - </p> + <p><em>Example 1:</em></p> <code type="none"><![CDATA[ int n = 0; struct in_addr addr; @@ -129,8 +262,7 @@ if (ei_connect_xinit(&ec, exit(-1); } ]]></code> - <p>Example 2: - </p> + <p><em>Example 2:</em></p> <code type="none"><![CDATA[ if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) { fprintf(stderr,"ERROR when initializing: %d",erl_errno); @@ -139,114 +271,184 @@ if (ei_connect_init(&ec, "madonna", "cookie...", n++) < 0) { ]]></code> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_connect(ei_cnode* ec, char *nodename)</nametext></name> - <name><ret>int</ret><nametext>ei_xconnect(ei_cnode* ec, Erl_IpAddr adr, char *alivename)</nametext></name> - <fsummary>Establishe a connection to an Erlang node</fsummary> + <name><ret>int</ret><nametext>ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms)</nametext></name> + <name><ret>int</ret><nametext>ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms)</nametext></name> + <fsummary>Establish a connection to an Erlang node with optional + time-out.</fsummary> <desc> - <p>These functions set up a connection to an Erlang node.</p> - <p><c><![CDATA[ei_xconnect()]]></c> requires the IP address of the remote - host and the alive name of the remote node - to be specified. <c><![CDATA[ei_connect()]]></c> provides an alternative - interface, and determines the information from the node name - provided.</p> - <p><c><![CDATA[addr]]></c> is the 32-bit IP address of the remote host.</p> - <p><c><![CDATA[alive]]></c> is the alivename of the remote node.</p> - <p><c><![CDATA[node]]></c> is the name of the remote node.</p> - <p>These functions return an open file descriptor on success, or - a negative value indicating that an error occurred --- in - which case they will set <c><![CDATA[erl_errno]]></c> to one of:</p> - <taglist> - <tag><c><![CDATA[EHOSTUNREACH]]></c></tag> - <item>The remote host <c><![CDATA[node]]></c> is unreachable</item> - <tag><c><![CDATA[ENOMEM]]></c></tag> - <item>No more memory available.</item> - <tag><c><![CDATA[EIO]]></c></tag> - <item>I/O error.</item> - </taglist> - <p>Additionally, <c><![CDATA[errno]]></c> values from - <c><![CDATA[socket]]></c><em>(2)</em> and <c><![CDATA[connect]]></c><em>(2)</em> - system calls may be propagated into <c><![CDATA[erl_errno]]></c>.</p> - <p>Example:</p> - <code type="none"><![CDATA[ -#define NODE "[email protected]" -#define ALIVE "madonna" -#define IP_ADDR "150.236.14.75" + <p>Equivalent to + <c>ei_connect</c> and <c>ei_xconnect</c> with an optional time-out + argument, see the description at the beginning of this manual + page.</p> + </desc> + </func> -/*** Variant 1 ***/ -int fd = ei_connect(&ec, NODE); + <func> + <name><ret>int</ret><nametext>ei_get_tracelevel(void)</nametext></name> + <name><ret>void</ret><nametext>ei_set_tracelevel(int level)</nametext></name> + <fsummary>Get and set functions for tracing.</fsummary> + <desc> + <p>Used to set tracing on the distribution. The levels are different + verbosity levels. A higher level means more information. See also + section <seealso marker="#debug_information"> + Debug Information</seealso>.</p> + <p>These functions are not thread safe.</p> + </desc> + </func> -/*** Variant 2 ***/ -struct in_addr addr; -addr.s_addr = inet_addr(IP_ADDR); -fd = ei_xconnect(&ec, &addr, ALIVE); - ]]></code> + <func> + <name><ret>int</ret><nametext>ei_publish(ei_cnode *ec, int port)</nametext></name> + <fsummary>Publish a node name.</fsummary> + <desc> + <p>Used by a server process to register + with the local name server EPMD, thereby allowing + other processes to send messages by using the registered name. + Before calling either of these functions, the process should + have called <c>bind()</c> and <c>listen()</c> + on an open socket.</p> + <list type="bulleted"> + <item> + <p><c>ec</c> is the C-node structure.</p> + </item> + <item> + <p><c>port</c> is the local name to register, and is to + be the same as the port number that was previously bound to the + socket.</p> + </item> + <item> + <p><c>addr</c> is the 32-bit IP address of the local + host.</p> + </item> + </list> + <p>To unregister with EPMD, simply close the returned descriptor. Do + not use <c>ei_unpublish()</c>, which is deprecated + anyway.</p> + <p>On success, the function returns a descriptor connecting the + calling process to EPMD. On failure, <c>-1</c> is returned and + <c>erl_errno</c> is set to <c>EIO</c>.</p> + <p>Also, <c>errno</c> values from + <c>socket</c><em>(2)</em> and + <c>connect</c><em>(2)</em> system calls may be propagated + into <c>erl_errno</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_connect_tmo(ei_cnode* ec, char *nodename, unsigned timeout_ms)</nametext></name> - <name><ret>int</ret><nametext>ei_xconnect_tmo(ei_cnode* ec, Erl_IpAddr adr, char *alivename, unsigned timeout_ms)</nametext></name> - <fsummary>Establish a connection to an Erlang node with optional timeout</fsummary> + <name><ret>int</ret><nametext>ei_publish_tmo(ei_cnode *ec, int port, unsigned timeout_ms)</nametext></name> + <fsummary>Publish a node name with optional time-out.</fsummary> <desc> - <p>ei_connect and ei_xconnect with an optional timeout argument, - see the description at the beginning of this document.</p> + <p>Equivalent to + <c>ei_publish</c> with an optional time-out argument, + see the description at the beginning of this manual page.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_receive(int fd, unsigned char* bufp, int bufsize)</nametext></name> - <fsummary>Receive a message</fsummary> + <fsummary>Receive a message.</fsummary> <desc> - <p>This function receives a message consisting of a sequence + <p>Receives a message consisting of a sequence of bytes in the Erlang external format.</p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection. It - is obtained from a previous <c><![CDATA[ei_connect]]></c> or - <c><![CDATA[ei_accept]]></c>.</p> - <p><c><![CDATA[bufp]]></c> is a buffer large enough to hold the expected - message. </p> - <p><c><![CDATA[bufsize]]></c> indicates the size of <c><![CDATA[bufp]]></c>.</p> - <p>If a <em>tick</em> occurs, i.e., the Erlang node on the + <list type="bulleted"> + <item> + <p><c>fd</c> is an open descriptor to an Erlang + connection. It is obtained from a previous + <c>ei_connect</c> or <c>ei_accept</c>.</p> + </item> + <item> + <p><c>bufp</c> is a buffer large enough to hold the + expected message.</p> + </item> + <item> + <p><c>bufsize</c> indicates the size of + <c>bufp</c>.</p> + </item> + </list> + <p>If a <em>tick</em> occurs, that is, the Erlang node on the other end of the connection has polled this node to see if it - is still alive, the function will return <c><![CDATA[ERL_TICK]]></c> and - no message will be placed in the buffer. Also, - <c><![CDATA[erl_errno]]></c> will be set to <c><![CDATA[EAGAIN]]></c>.</p> + is still alive, the function returns <c>ERL_TICK</c> and + no message is placed in the buffer. Also, + <c>erl_errno</c> is set to <c>EAGAIN</c>.</p> <p>On success, the message is placed in the specified buffer and the function returns the number of bytes actually read. On - failure, the function returns <c><![CDATA[ERL_ERROR]]></c> and will set - <c><![CDATA[erl_errno]]></c> to one of:</p> + failure, the function returns <c>ERL_ERROR</c> and sets + <c>erl_errno</c> to one of the following:</p> <taglist> - <tag><c><![CDATA[EAGAIN]]></c></tag> + <tag><c>EAGAIN</c></tag> <item>Temporary error: Try again.</item> - <tag><c><![CDATA[EMSGSIZE]]></c></tag> - <item>Buffer too small.</item> - <tag><c><![CDATA[EIO]]></c></tag> + <tag><c>EMSGSIZE</c></tag> + <item>Buffer is too small.</item> + <tag><c>EIO</c></tag> <item>I/O error.</item> </taglist> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_receive_tmo(int fd, unsigned char* bufp, int bufsize, unsigned timeout_ms)</nametext></name> - <fsummary>Receive a message with optional timeout</fsummary> + <name><ret>int</ret><nametext>ei_receive_encoded(int fd, char **mbufp, int *bufsz, erlang_msg *msg, int *msglen)</nametext></name> + <fsummary>Obsolete function for receiving a message.</fsummary> <desc> - <p>ei_receive with an optional timeout argument, - see the description at the beginning of this document.</p> + <p>This function is retained for compatibility with code + generated by the interface compiler and with code following + examples in the same application.</p> + <p>In essence, the function performs the same operation as + <c>ei_xreceive_msg</c>, but instead of using an + <c>ei_x_buff</c>, the function expects a pointer to a character + pointer (<c>mbufp</c>), where the character pointer + is to point to a memory area allocated by <c>malloc</c>. + Argument <c>bufsz</c> is to be a pointer to an integer + containing the exact size (in bytes) of the memory area. The function + may reallocate the memory area and will in such cases put the new + size in <c>*bufsz</c> and update + <c>*mbufp</c>.</p> + <p>Returns either <c>ERL_TICK</c> or the + <c>msgtype</c> field of the + <c>erlang_msg *msg</c>. The length + of the message is put in <c>*msglen</c>. On error + a value <c>< 0</c> is returned.</p> + <p>It is recommended to use <c>ei_xreceive_msg</c> instead when + possible, for the sake of readability. However, the function will + be retained in the interface for compatibility and + will <em>not</em> be removed in future releases without prior + notice.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_receive_encoded_tmo(int fd, char **mbufp, int *bufsz, erlang_msg *msg, int *msglen, unsigned timeout_ms)</nametext></name> + <fsummary>Obsolete function for receiving a message with time-out. + </fsummary> + <desc> + <p>Equivalent to + <c>ei_receive_encoded</c> with an optional time-out argument, + see the description at the beginning of this manual page.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_receive_msg(int fd, erlang_msg* msg, ei_x_buff* x)</nametext></name> <name><ret>int</ret><nametext>ei_xreceive_msg(int fd, erlang_msg* msg, ei_x_buff* x)</nametext></name> - <fsummary>Receive a message</fsummary> + <fsummary>Receive a message.</fsummary> <desc> - <p>These functions receives a message to the buffer in - <c><![CDATA[x]]></c>. <c><![CDATA[ei_xreceive_msg]]></c> allows the buffer in - <c><![CDATA[x]]></c> to grow, but <c><![CDATA[ei_receive_msg]]></c> fails if the - message is bigger than the preallocated buffer in <c><![CDATA[x]]></c>.</p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection.</p> - <p><c><![CDATA[msg]]></c> is a pointer to an <c><![CDATA[erlang_msg]]></c> structure - and contains information on the message received.</p> - <p><c><![CDATA[x]]></c> is buffer obtained from <c><![CDATA[ei_x_new]]></c>.</p> - <p>On success, the function returns <c><![CDATA[ERL_MSG]]></c> and the - <c><![CDATA[msg]]></c> struct will be initialized. <c><![CDATA[erlang_msg]]></c> - is defined as follows:</p> + <p>Receives a message to the buffer in <c>x</c>. + <c>ei_xreceive_msg</c> allows the buffer in + <c>x</c> to grow, but <c>ei_receive_msg</c> + fails if the message is larger than the pre-allocated buffer in + <c>x</c>.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>msg</c> is a pointer to an + <c>erlang_msg</c> structure + and contains information on the message received.</item> + <item><c>x</c> is buffer obtained from + <c>ei_x_new</c>.</item> + </list> + <p>On success, the functions return <c>ERL_MSG</c> and the + <c>msg</c> struct is initialized. + <c>erlang_msg</c> is defined as follows:</p> <code type="none"><![CDATA[ typedef struct { long msgtype; @@ -257,125 +459,82 @@ typedef struct { erlang_trace token; } erlang_msg; ]]></code> - <p><c><![CDATA[msgtype]]></c> identifies the type of message, and is one of - <c><![CDATA[ERL_SEND]]></c>, <c><![CDATA[ERL_REG_SEND]]></c>, <c><![CDATA[ERL_LINK]]></c>, - <c><![CDATA[ERL_UNLINK]]></c> and <c><![CDATA[ERL_EXIT]]></c>.</p> - <p>If <c><![CDATA[msgtype]]></c> is <c><![CDATA[ERL_SEND]]></c> this indicates that an - ordinary send operation has taken place, and <c><![CDATA[msg->to]]></c> - contains the Pid of the recipient (the C-node). If - <c><![CDATA[type]]></c> is <c><![CDATA[ERL_REG_SEND]]></c> then a registered send - operation took place, and <c><![CDATA[msg->from]]></c> contains the Pid - of the sender.</p> - <p>If <c><![CDATA[msgtype]]></c> is <c><![CDATA[ERL_LINK]]></c> or <c><![CDATA[ERL_UNLINK]]></c>, then - <c><![CDATA[msg->to]]></c> and <c><![CDATA[msg->from]]></c> contain the pids of the - sender and recipient of the link or unlink.</p> - <p>If <c><![CDATA[msgtype]]></c> is <c><![CDATA[ERL_EXIT]]></c>, then this indicates that - a link has been broken. In this case, <c><![CDATA[msg->to]]></c> and - <c><![CDATA[msg->from]]></c> contain the pids of the linked processes.</p> - <p>The return value is the same as for <c><![CDATA[ei_receive]]></c>, see - above.</p> + <p><c>msgtype</c> identifies the type of message, and is + one of the following:</p> + <taglist> + <tag><c>ERL_SEND</c></tag> + <item> + <p>Indicates that an ordinary send operation has occurred. + <c>msg->to</c> contains the pid of the recipient (the + C-node).</p> + </item> + <tag><c>ERL_REG_SEND</c></tag> + <item> + <p>A registered send operation occurred. + <c>msg->from</c> contains the pid of the sender.</p> + </item> + <tag><c>ERL_LINK</c> or + <c>ERL_UNLINK</c></tag> + <item> + <p><c>msg->to</c> and + <c>msg->from</c> contain the pids of the + sender and recipient of the link or unlink.</p> + </item> + <tag><c>ERL_EXIT</c></tag> + <item> + <p>Indicates a broken link. <c>msg->to</c> and + <c>msg->from</c> contain the pids of the linked + processes.</p> + </item> + </taglist> + <p>The return value is the same as for + <seealso marker="#ei_receive"><c>ei_receive</c></seealso>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_receive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned imeout_ms)</nametext></name> <name><ret>int</ret><nametext>ei_xreceive_msg_tmo(int fd, erlang_msg* msg, ei_x_buff* x, unsigned timeout_ms)</nametext></name> - <fsummary>Receive a message with optional timeout</fsummary> - <desc> - <p>ei_receive_msg and ei_xreceive_msg with an optional timeout argument, - see the description at the beginning of this document.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_receive_encoded(int fd, char **mbufp, int *bufsz, erlang_msg *msg, int *msglen)</nametext></name> - <fsummary>Obsolete function for receiving a message</fsummary> - <desc> - <p>This function is retained for compatibility with code - generated by the interface compiler and with code following - examples in the same application.</p> - <p>In essence the function performs the same operation as - <c><![CDATA[ei_xreceive_msg]]></c>, but instead of using an ei_x_buff, the - function expects a pointer to a character pointer - (<c><![CDATA[mbufp]]></c>), where the character pointer should point to a - memory area allocated by <c><![CDATA[malloc]]></c>. The argument - <c><![CDATA[bufsz]]></c> should be a pointer to an integer containing the - exact size (in bytes) of the memory area. The function may - reallocate the memory area and will in such cases put the new - size in <c><![CDATA[*bufsz]]></c> and update <c><![CDATA[*mbufp]]></c>.</p> - <p>Furthermore the function returns either ERL_TICK or the - <c><![CDATA[msgtype]]></c> field of the <c><![CDATA[erlang_msg *msg]]></c>. The actual - length of the message is put in <c><![CDATA[*msglen]]></c>. On error it - will return a value <c><![CDATA[< 0]]></c>.</p> - <p>It is recommended to use ei_xreceive_msg instead when - possible, for the sake of readability. The function will - however be retained in the interface for compatibility and - will <em>not</em> be removed not be removed in future releases - without notice.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_receive_encoded_tmo(int fd, char **mbufp, int *bufsz, erlang_msg *msg, int *msglen, unsigned timeout_ms)</nametext></name> - <fsummary>Obsolete function for receiving a message with timeout</fsummary> - <desc> - <p>ei_receive_encoded with an optional timeout argument, - see the description at the beginning of this document.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_send(int fd, erlang_pid* to, char* buf, int len)</nametext></name> - <fsummary>Send a message</fsummary> - <desc> - <p>This function sends an Erlang term to a process.</p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection.</p> - <p><c><![CDATA[to]]></c> is the Pid of the intended recipient of the - message.</p> - <p><c><![CDATA[buf]]></c> is the buffer containing the term in binary - format.</p> - <p><c><![CDATA[len]]></c> is the length of the message in bytes.</p> - <p>The function returns 0 if successful, otherwise -1, in the - latter case it will set <c><![CDATA[erl_errno]]></c> to <c><![CDATA[EIO]]></c>.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_send_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms)</nametext></name> - <fsummary>Send a message with optional timeout</fsummary> + <fsummary>Receive a message with optional time-out.</fsummary> <desc> - <p>ei_send with an optional timeout argument, - see the description at the beginning of this document.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_send_encoded(int fd, erlang_pid* to, char* buf, int len)</nametext></name> - <fsummary>Obsolete function to send a message</fsummary> - <desc> - <p>Works exactly as ei_send, the alternative name retained for - backward compatibility. The function will <em>not</em> be - removed without notice.</p> + <p>Equivalent to <c>ei_receive_msg</c> and <c>ei_xreceive_msg</c> + with an optional time-out argument, + see the description at the beginning of this manual page.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_send_encoded_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms)</nametext></name> - <fsummary>Obsolete function to send a message with optional timeout</fsummary> + <name><ret>int</ret><nametext>ei_receive_tmo(int fd, unsigned char* bufp, int bufsize, unsigned timeout_ms)</nametext></name> + <fsummary>Receive a message with optional time-out.</fsummary> <desc> - <p>ei_send_encoded with an optional timeout argument, - see the description at the beginning of this document.</p> + <p>Equivalent to + <c>ei_receive</c> with an optional time-out argument, + see the description at the beginning of this manual page.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_reg_send(ei_cnode* ec, int fd, char* server_name, char* buf, int len)</nametext></name> - <fsummary>Send a message to a registered name</fsummary> + <fsummary>Send a message to a registered name.</fsummary> <desc> - <p>This function sends an Erlang term to a registered process. - </p> - <p>This function sends an Erlang term to a process.</p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection.</p> - <p><c><![CDATA[server_name]]></c> is the registered name of the intended - recipient.</p> - <p><c><![CDATA[buf]]></c> is the buffer containing the term in binary - format.</p> - <p><c><![CDATA[len]]></c> is the length of the message in bytes.</p> - <p>The function returns 0 if successful, otherwise -1, in the - latter case it will set <c><![CDATA[erl_errno]]></c> to <c><![CDATA[EIO]]></c>.</p> - <p>Example, send the atom "ok" to the process "worker":</p> + <p>Sends an Erlang term to a registered process.</p> + <list type="bulleted"> + <item> + <p><c>fd</c> is an open descriptor to an Erlang + connection.</p> + </item> + <item><c>server_name</c> is the registered name of the + intended recipient.</item> + <item><c>buf</c> is the buffer containing the term in + binary format.</item> + <item><c>len</c> is the length of the message in bytes. + </item> + </list> + <p>Returns <c>0</c> if successful, otherwise <c>-1</c>. In + the latter case it sets <c>erl_errno</c> to + <c>EIO</c>.</p> + <p><em>Example:</em></p> + <p>Send the atom "ok" to the process "worker":</p> <code type="none"><![CDATA[ ei_x_buff x; ei_x_new_with_version(&x); @@ -385,96 +544,98 @@ if (ei_reg_send(&ec, fd, x.buff, x.index) < 0) ]]></code> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_reg_send_tmo(ei_cnode* ec, int fd, char* server_name, char* buf, int len, unsigned timeout_ms)</nametext></name> - <fsummary>Send a message to a registered name with optional timeout</fsummary> - <desc> - <p>ei_reg_send with an optional timeout argument, - see the description at the beginning of this document.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_send_reg_encoded(int fd, const erlang_pid *from, const char *to, const char *buf, int len)</nametext></name> - <fsummary>Obsolete function to send a message to a registered name</fsummary> - <desc> - <p>This function is retained for compatibility with code - generated by the interface compiler and with code following - examples in the same application.</p> - <p>The function works as <c><![CDATA[ei_reg_send]]></c> with one - exception. Instead of taking the <c><![CDATA[ei_cnode]]></c> as a first - argument, it takes a second argument, an <c><![CDATA[erlang_pid]]></c> - which should be the process identifier of the sending process - (in the erlang distribution protocol). </p> - <p>A suitable <c><![CDATA[erlang_pid]]></c> can be constructed from the - <c><![CDATA[ei_cnode]]></c> structure by the following example code:</p> - <code type="none"><![CDATA[ - ei_cnode ec; - erlang_pid *self; - int fd; /* the connection fd */ - ... - self = ei_self(&ec); - self->num = fd; - ]]></code> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_send_reg_encoded_tmo(int fd, const erlang_pid *from, const char *to, const char *buf, int len)</nametext></name> - <fsummary>Obsolete function to send a message to a registered name with timeout</fsummary> + <fsummary>Send a message to a registered name with optional time-out + </fsummary> <desc> - <p>ei_send_reg_encoded with an optional timeout argument, - see the description at the beginning of this document.</p> + <p>Equivalent to + <c>ei_reg_send</c> with an optional time-out argument, + see the description at the beginning of this manual page.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_rpc(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf, int argbuflen, ei_x_buff *x)</nametext></name> <name><ret>int</ret><nametext>ei_rpc_to(ei_cnode *ec, int fd, char *mod, char *fun, const char *argbuf, int argbuflen)</nametext></name> <name><ret>int</ret><nametext>ei_rpc_from(ei_cnode *ec, int fd, int timeout, erlang_msg *msg, ei_x_buff *x)</nametext></name> - <fsummary>Remote Procedure Call from C to Erlang</fsummary> + <fsummary>Remote Procedure Call from C to Erlang.</fsummary> <desc> - <p>These functions support calling Erlang functions on remote nodes. - <c><![CDATA[ei_rpc_to()]]></c> sends an rpc request to a remote node and - <c><![CDATA[ei_rpc_from()]]></c> receives the results of such a call. - <c><![CDATA[ei_rpc()]]></c> combines the functionality of these two functions - by sending an rpc request and waiting for the results. See also - <c><![CDATA[rpc:call/4]]></c>. </p> - <p><c><![CDATA[ec]]></c> is the C-node structure previously initiated by a - call to <c><![CDATA[ei_connect_init()]]></c> or - <c><![CDATA[ei_connect_xinit()]]></c></p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection.</p> - <p><c><![CDATA[timeout]]></c> is the maximum time (in ms) to wait for - results. Specify <c><![CDATA[ERL_NO_TIMEOUT]]></c> to wait forever. - <c><![CDATA[ei_rpc()]]></c> will wait infinitely for the answer, - i.e. the call will never time out.</p> - <p><c><![CDATA[mod]]></c> is the name of the module containing the function - to be run on the remote node.</p> - <p><c><![CDATA[fun]]></c> is the name of the function to run.</p> - <p><c><![CDATA[argbuf]]></c> is a pointer to a buffer with an encoded - Erlang list, without a version magic number, containing the - arguments to be passed to the function.</p> - <p><c><![CDATA[argbuflen]]></c> is the length of the buffer containing the - encoded Erlang list.</p> - <p><c><![CDATA[msg]]></c> structure of type <c><![CDATA[erlang_msg]]></c> and contains - information on the message received. See <c><![CDATA[ei_receive_msg()]]></c> - for a description of the <c><![CDATA[erlang_msg]]></c> format.</p> - <p><c><![CDATA[x]]></c> points to the dynamic buffer that receives the - result. For for <c><![CDATA[ei_rpc()]]></c> this will be the result - without the version magic number. For <c><![CDATA[ei_rpc_from()]]></c> - the result will return a version magic number and a 2-tuple - <c><![CDATA[{rex,Reply}]]></c>.</p> - <p><c><![CDATA[ei_rpc()]]></c> returns the number of bytes in the result - on success and -1 on failure. <c><![CDATA[ei_rpc_from()]]></c> returns - number of bytes or one of <c><![CDATA[ERL_TICK]]></c>, <c><![CDATA[ERL_TIMEOUT]]></c> - and <c><![CDATA[ERL_ERROR]]></c> otherwise. When failing, - all three functions set <c><![CDATA[erl_errno]]></c> to one of:</p> + <p>Supports calling Erlang functions on remote nodes. + <c>ei_rpc_to()</c> sends an RPC request to a remote node + and <c>ei_rpc_from()</c> receives the results of such a + call. <c>ei_rpc()</c> combines the functionality of these + two functions by sending an RPC request and waiting for the results. + See also <seealso marker="kernel:rpc#call/4"> + <c>rpc:call/4</c></seealso> in Kernel.</p> + <list type="bulleted"> + <item> + <p><c>ec</c> is the C-node structure previously + initiated by a call to <c>ei_connect_init()</c> or + <c>ei_connect_xinit()</c>.</p> + </item> + <item> + <p><c>fd</c> is an open descriptor to an Erlang + connection.</p> + </item> + <item> + <p><c>timeout</c> is the maximum time (in milliseconds) + to wait for results. Specify <c>ERL_NO_TIMEOUT</c> to + wait forever. + <c>ei_rpc()</c> waits infinitely for the answer, + that is, the call will never time out.</p> + </item> + <item> + <p><c>mod</c> is the name of the module containing the + function to be run on the remote node.</p> + </item> + <item> + <p><c>fun</c> is the name of the function to run.</p> + </item> + <item> + <p><c>argbuf</c> is a pointer to a buffer with an + encoded Erlang list, without a version magic number, containing + the arguments to be passed to the function.</p> + </item> + <item> + <p><c>argbuflen</c> is the length of the buffer + containing the encoded Erlang list.</p> + </item> + <item> + <p><c>msg</c> is structure of type + <c>erlang_msg</c> and contains information on the + message + received. For a description of the <c>erlang_msg</c> + format, see <seealso marker="#ei_receive_msg"> + <c>ei_receive_msg</c></seealso>.</p> + </item> + <item> + <p><c>x</c> points to the dynamic buffer that receives + the result. For <c>ei_rpc()</c> this is the result + without the version magic number. For + <c>ei_rpc_from()</c> the result returns a version + magic number and a 2-tuple <c>{rex,Reply}</c>.</p> + </item> + </list> + <p><c>ei_rpc()</c> returns the number of bytes in the + result on success and <c>-1</c> on failure. + <c>ei_rpc_from()</c> returns the + number of bytes, otherwise one of <c>ERL_TICK</c>, + <c>ERL_TIMEOUT</c>, + and <c>ERL_ERROR</c>. When failing, all three + functions set <c>erl_errno</c> to one of the + following:</p> <taglist> - <tag><c><![CDATA[EIO]]></c></tag> + <tag><c>EIO</c></tag> <item>I/O error.</item> - <tag><c><![CDATA[ETIMEDOUT]]></c></tag> - <item>Timeout expired.</item> - <tag><c><![CDATA[EAGAIN]]></c></tag> + <tag><c>ETIMEDOUT</c></tag> + <item>Time-out expired.</item> + <tag><c>EAGAIN</c></tag> <item>Temporary error: Try again.</item> </taglist> - <p>Example, check to see if an erlang process is alive:</p> + <p><em>Example:</em></p> + <p>Check to see if an Erlang process is alive:</p> <code type="none"><![CDATA[ int index = 0, is_alive; ei_x_buff args, result; @@ -495,170 +656,190 @@ if (ei_decode_version(result.buff, &index) < 0 ]]></code> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_publish(ei_cnode *ec, int port)</nametext></name> - <fsummary>Publish a node name</fsummary> + <name><ret>erlang_pid *</ret><nametext>ei_self(ei_cnode *ec)</nametext></name> + <fsummary>Retrieve the pid of the C-node.</fsummary> <desc> - <p>These functions are used by a server process to register - with the local name server <em>epmd</em>, thereby allowing - other processes to send messages by using the registered name. - Before calling either of these functions, the process should - have called <c><![CDATA[bind()]]></c> and <c><![CDATA[listen()]]></c> on an open socket.</p> - <p><c><![CDATA[ec]]></c> is the C-node structure.</p> - <p><c><![CDATA[port]]></c> is the local name to register, and should be the - same as the port number that was previously bound to the socket.</p> - <p><c><![CDATA[addr]]></c> is the 32-bit IP address of the local host.</p> - <p>To unregister with epmd, simply close the returned - descriptor. Do not use <c><![CDATA[ei_unpublish()]]></c>, which is deprecated anyway.</p> - <p>On success, the functions return a descriptor connecting the - calling process to epmd. On failure, they return -1 and set - <c><![CDATA[erl_errno]]></c> to <c><![CDATA[EIO]]></c>.</p> - <p>Additionally, <c><![CDATA[errno]]></c> values from <c><![CDATA[socket]]></c><em>(2)</em> - and <c><![CDATA[connect]]></c><em>(2)</em> system calls may be propagated - into <c><![CDATA[erl_errno]]></c>.</p> + <p>Retrieves the pid of the C-node. Every C-node + has a (pseudo) pid used in <c>ei_send_reg</c>, + <c>ei_rpc</c>, + and others. This is contained in a field in the <c>ec</c> + structure. It will be safe for a long time to fetch this + field directly from the <c>ei_cnode</c> structure.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_publish_tmo(ei_cnode *ec, int port, unsigned timeout_ms)</nametext></name> - <fsummary>Publish a node name with optional timeout</fsummary> + <name><ret>int</ret><nametext>ei_send(int fd, erlang_pid* to, char* buf, int len)</nametext></name> + <fsummary>Send a message.</fsummary> <desc> - <p>ei_publish with an optional timeout argument, - see the description at the beginning of this document.</p> + <p>Sends an Erlang term to a process.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>to</c> is the pid of the intended recipient of + the message.</item> + <item><c>buf</c> is the buffer containing the term in + binary format.</item> + <item><c>len</c> is the length of the message in bytes. + </item> + </list> + <p>Returns <c>0</c> if successful, otherwise <c>-1</c>. In + the latter case it sets <c>erl_errno</c> to + <c>EIO</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_accept(ei_cnode *ec, int listensock, ErlConnect *conp)</nametext></name> - <fsummary>Accept a connection from another node</fsummary> + <name><ret>int</ret><nametext>ei_send_encoded(int fd, erlang_pid* to, char* buf, int len)</nametext></name> + <fsummary>Obsolete function to send a message.</fsummary> <desc> - <p>This function is used by a server process to accept a - connection from a client process.</p> - <p><c><![CDATA[ec]]></c> is the C-node structure.</p> - <p><c><![CDATA[listensock]]></c> is an open socket descriptor on which - <c><![CDATA[listen()]]></c> has previously been called.</p> - <p><c><![CDATA[conp]]></c> is a pointer to an <c><![CDATA[ErlConnect]]></c> struct, - described as follows:</p> - <code type="none"><![CDATA[ -typedef struct { - char ipadr[4]; - char nodename[MAXNODELEN]; -} ErlConnect; - ]]></code> - <p>On success, <c><![CDATA[conp]]></c> is filled in with the address and - node name of the connecting client and a file descriptor is - returned. On failure, <c><![CDATA[ERL_ERROR]]></c> is returned and - <c><![CDATA[erl_errno]]></c> is set to <c><![CDATA[EIO]]></c>.</p> + <p>Works exactly as <c>ei_send</c>, the alternative name is retained for + backward compatibility. The function will <em>not</em> be + removed without prior notice.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_accept_tmo(ei_cnode *ec, int listensock, ErlConnect *conp, unsigned timeout_ms)</nametext></name> - <fsummary>Accept a connection from another node with optional timeout</fsummary> + <name><ret>int</ret><nametext>ei_send_encoded_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms)</nametext></name> + <fsummary>Obsolete function to send a message with optional time-out. + </fsummary> <desc> - <p>ei_accept with an optional timeout argument, - see the description at the beginning of this document.</p> + <p>Equivalent to + <c>ei_send_encoded</c> with an optional time-out argument, + see the description at the beginning of this manual page.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_unpublish(ei_cnode *ec)</nametext></name> - <fsummary>Forcefully unpublish a node name</fsummary> + <name><ret>int</ret><nametext>ei_send_reg_encoded(int fd, const erlang_pid *from, const char *to, const char *buf, int len)</nametext></name> + <fsummary>Obsolete function to send a message to a registered name. + </fsummary> <desc> - <p>This function can be called by a process to unregister a - specified node from epmd on the localhost. This is however usually not - allowed, unless epmd was started with the -relaxed_command_check - flag, which it normally isn't.</p> - - <p>To unregister a node you have published, you should - close the descriptor that was returned by - <c><![CDATA[ei_publish()]]></c>.</p> + <p>This function is retained for compatibility with code + generated by the interface compiler and with code following + examples in the same application.</p> + <p>The function works as <c>ei_reg_send</c> with one + exception. Instead of taking <c>ei_cnode</c> as first + argument, it takes a second argument, an + <c>erlang_pid</c>, + which is to be the process identifier of the sending process + (in the Erlang distribution protocol).</p> + <p>A suitable <c>erlang_pid</c> can be constructed from the + <c>ei_cnode</c> structure by the following example + code:</p> + <code type="none"><![CDATA[ +ei_cnode ec; +erlang_pid *self; +int fd; /* the connection fd */ +... +self = ei_self(&ec); +self->num = fd; + ]]></code> + </desc> + </func> - <warning> - <p>This function is deprecated and will be removed in a future - release.</p> - </warning> - <p><c><![CDATA[ec]]></c> is the node structure of the node to unregister.</p> - <p>If the node was successfully unregistered from epmd, the - function returns 0. Otherwise, it returns -1 and sets - <c><![CDATA[erl_errno]]></c> is to <c><![CDATA[EIO]]></c>.</p> + <func> + <name><ret>int</ret><nametext>ei_send_reg_encoded_tmo(int fd, const erlang_pid *from, const char *to, const char *buf, int len)</nametext></name> + <fsummary>Obsolete function to send a message to a registered name with + time-out.</fsummary> + <desc> + <p>Equivalent to + <c>ei_send_reg_encoded</c> with an optional time-out argument, + see the description at the beginning of this manual page.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_unpublish_tmo(ei_cnode *ec, unsigned timeout_ms)</nametext></name> - <fsummary>Unpublish a node name with optional timeout</fsummary> + <name><ret>int</ret><nametext>ei_send_tmo(int fd, erlang_pid* to, char* buf, int len, unsigned timeout_ms)</nametext></name> + <fsummary>Send a message with optional time-out.</fsummary> <desc> - <p>ei_unpublish with an optional timeout argument, - see the description at the beginning of this document.</p> + <p>Equivalent to + <c>ei_send</c> with an optional time-out argument, + see the description at the beginning of this manual page.</p> </desc> </func> + <func> <name><ret>const char *</ret><nametext>ei_thisnodename(ei_cnode *ec)</nametext></name> <name><ret>const char *</ret><nametext>ei_thishostname(ei_cnode *ec)</nametext></name> <name><ret>const char *</ret><nametext>ei_thisalivename(ei_cnode *ec)</nametext></name> - <fsummary>Retrieve some values</fsummary> + <fsummary>Retrieve some values.</fsummary> <desc> - <p>These functions can be used to retrieve information about - the C Node. These values are initially set with - <c><![CDATA[ei_connect_init()]]></c> or <c><![CDATA[ei_connect_xinit()]]></c>.</p> - <p>They simply fetches the appropriate field from the <c><![CDATA[ec]]></c> + <p>Can be used to retrieve information about + the C-node. These values are initially set with + <c>ei_connect_init()</c> or + <c>ei_connect_xinit()</c>.</p> + <p>These function simply fetch the appropriate field from the + <c>ec</c> structure. Read the field directly will probably be safe for a long time, so these functions are not really needed.</p> </desc> </func> + <func> - <name><ret>erlang_pid *</ret><nametext>ei_self(ei_cnode *ec)</nametext></name> - <fsummary>Retrieve the Pid of the C-node</fsummary> - <desc> - <p>This function retrieves the Pid of the C-node. Every C-node - has a (pseudo) pid used in <c><![CDATA[ei_send_reg]]></c>, <c><![CDATA[ei_rpc]]></c> - and others. This is contained in a field in the <c><![CDATA[ec]]></c> - structure. It will be safe for a long time to fetch this - field directly from the <c><![CDATA[ei_cnode]]></c> structure.</p> - </desc> - </func> - <func> - <name><ret>struct hostent</ret><nametext>*ei_gethostbyname(const char *name)</nametext></name> - <name><ret>struct hostent</ret><nametext>*ei_gethostbyaddr(const char *addr, int len, int type)</nametext></name> - <name><ret>struct hostent</ret><nametext>*ei_gethostbyname_r(const char *name, struct hostent *hostp, char *buffer, int buflen, int *h_errnop)</nametext></name> - <name><ret>struct hostent</ret><nametext>*ei_gethostbyaddr_r(const char *addr, int length, int type, struct hostent *hostp, char *buffer, int buflen, int *h_errnop)</nametext></name> - <fsummary>Name lookup functions</fsummary> + <name><ret>int</ret><nametext>ei_unpublish(ei_cnode *ec)</nametext></name> + <fsummary>Forcefully unpublish a node name.</fsummary> <desc> - <p>These are convenience functions for some common name lookup functions.</p> + <p>Can be called by a process to unregister a + specified node from EPMD on the local host. This is, however, usually + not allowed, unless EPMD was started with flag + <c>-relaxed_command_check</c>, which it normally is not.</p> + <p>To unregister a node you have published, you should + close the descriptor that was returned by + <c>ei_publish()</c>.</p> + <warning> + <p>This function is deprecated and will be removed in a future + release.</p> + </warning> + <p><c>ec</c> is the node structure of the node to + unregister.</p> + <p>If the node was successfully unregistered from EPMD, the + function returns <c>0</c>. Otherwise, <c>-1</c> is returned and + <c>erl_errno</c> is set to <c>EIO</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_get_tracelevel(void)</nametext></name> - <name><ret>void</ret><nametext>ei_set_tracelevel(int level)</nametext></name> - <fsummary>Get and set functions for tracing.</fsummary> + <name><ret>int</ret><nametext>ei_unpublish_tmo(ei_cnode *ec, unsigned timeout_ms)</nametext></name> + <fsummary>Unpublish a node name with optional time-out.</fsummary> <desc> - <p>These functions are used to set tracing on the distribution. The levels are different verbosity levels. A higher level means more information. - See also Debug Information and <c><![CDATA[EI_TRACELEVEL]]></c> below. </p> - <p> <c><![CDATA[ei_set_tracelevel]]></c> and <c><![CDATA[ei_get_tracelevel]]></c> are not thread safe. </p> + <p>Equivalent to + <c>ei_unpublish</c> with an optional time-out argument, + see the description at the beginning of this manual page.</p> </desc> </func> </funcs> <section> + <marker id="debug_information"></marker> <title>Debug Information</title> <p>If a connection attempt fails, the following can be checked:</p> + <list type="bulleted"> - <item><c><![CDATA[erl_errno]]></c></item> - <item>that the right cookie was used</item> - <item>that <em>epmd</em> is running</item> - <item>the remote Erlang node on the other side is running the - same version of Erlang as the <c><![CDATA[ei]]></c> - library.</item> - <item>the environment variable <c><![CDATA[ERL_EPMD_PORT]]></c> - is set correctly.</item> + <item><c>erl_errno</c>.</item> + <item>That the correct cookie was used</item> + <item>That EPMD is running</item> + <item>That the remote Erlang node on the other side is running the + same version of Erlang as the <c>ei</c> library</item> + <item>That environment variable <c>ERL_EPMD_PORT</c> + is set correctly</item> </list> - <p>The connection attempt can be traced by setting a tracelevel by either using - <c><![CDATA[ei_set_tracelevel]]></c> or by setting the environment variable <c><![CDATA[EI_TRACELEVEL]]></c>. - The different tracelevels has the following messages:</p> + + <p>The connection attempt can be traced by setting a trace level by either + using <c>ei_set_tracelevel</c> or by setting environment + variable <c>EI_TRACELEVEL</c>. + The trace levels have the following messages:</p> + <list> - <item>1: Verbose error messages</item> - <item>2: Above messages and verbose warning messages </item> - <item>3: Above messages and progress reports for connection handling</item> - <item>4: Above messages and progress reports for communication</item> - <item>5: Above messages and progress reports for data conversion</item> + <item>1: Verbose error messages</item> + <item>2: Above messages and verbose warning messages</item> + <item>3: Above messages and progress reports for connection handling + </item> + <item>4: Above messages and progress reports for communication</item> + <item>5: Above messages and progress reports for data conversion</item> </list> </section> </cref> - diff --git a/lib/erl_interface/doc/src/ei_users_guide.xml b/lib/erl_interface/doc/src/ei_users_guide.xml index 4b9809aee4..0eed50b50b 100644 --- a/lib/erl_interface/doc/src/ei_users_guide.xml +++ b/lib/erl_interface/doc/src/ei_users_guide.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,10 +19,10 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> - <title>The El Library User's Guide</title> + <title>Erl_Interface User's Guide</title> <prepared>Kent Boortz</prepared> <responsible>Kent Boortz</responsible> <docno></docno> @@ -32,100 +32,158 @@ <rev></rev> <file>ei_users_guide.xml</file> </header> - <p>The Erl_Interface library contains functions. which help you - integrate programs written in C and Erlang. The functions in - Erl_Interface support the following:</p> - <list type="bulleted"> - <item>manipulation of data represented as Erlang data types</item> - <item>conversion of data between C and Erlang formats</item> - <item>encoding and decoding of Erlang data types for transmission or storage</item> - <item>communication between C nodes and Erlang processes</item> - <item>backup and restore of C node state to and from Mnesia</item> - </list> - <p>In the following sections, these topics are described:</p> - <list type="bulleted"> - <item>compiling your code for use with Erl_Interface</item> - <item>initializing Erl_Interface</item> - <item>encoding, decoding, and sending Erlang terms</item> - <item>building terms and patterns</item> - <item>pattern matching</item> - <item>connecting to a distributed Erlang node</item> - <item>using EPMD</item> - <item>sending and receiving Erlang messages</item> - <item>remote procedure calls</item> - <item>global names</item> - <item>the registry</item> - </list> + + <section> + <title>Introduction</title> + <p>The <c>Erl_Interface</c> library contains functions that help you + integrate programs written in C and Erlang. The functions in + <c>Erl_Interface</c> support the following:</p> + <list type="bulleted"> + <item>Manipulation of data represented as Erlang data types</item> + <item>Conversion of data between C and Erlang formats</item> + <item>Encoding and decoding of Erlang data types for transmission or + storage</item> + <item>Communication between C nodes and Erlang processes</item> + <item>Backup and restore of C node state to and from + <seealso marker="mnesia:mnesia">Mnesia</seealso></item> + </list> + <note> + <p>By default, the <c>Erl_Interface</c> libraries are only guaranteed + to be compatible with other Erlang/OTP components from the same + release as the libraries themselves. For information about how to + communicate with Erlang/OTP components from earlier releases, see + function <seealso marker="ei#ei_set_compat_rel"> + <c>ei:ei_set_compat_rel</c></seealso> and + <seealso marker="erl_eterm#erl_set_compat_rel"> + <c>erl_eterm:erl_set_compat_rel</c></seealso>.</p> + </note> + + <section> + <title>Scope</title> + <p>In the following sections, these topics are described:</p> + <list type="bulleted"> + <item>Compiling your code for use with <c>Erl_Interface</c></item> + <item>Initializing <c>Erl_Interface</c></item> + <item>Encoding, decoding, and sending Erlang terms</item> + <item>Building terms and patterns</item> + <item>Pattern matching</item> + <item>Connecting to a distributed Erlang node</item> + <item>Using the Erlang Port Mapper Daemon (EPMD)</item> + <item>Sending and receiving Erlang messages</item> + <item>Remote procedure calls</item> + <item>Using global names</item> + <item>Using the registry</item> + </list> + </section> + + <section> + <title>Prerequisites</title> + <p>It is assumed that the reader is familiar with the Erlang programming + language.</p> + </section> + </section> <section> <title>Compiling and Linking Your Code</title> - <p>In order to use any of the Erl_Interface functions, include the + <p>To use any of the <c>Erl_Interface</c> functions, include the following lines in your code:</p> + <code type="none"><![CDATA[ #include "erl_interface.h" #include "ei.h" ]]></code> - <p>Determine where the top directory of your OTP installation is. You - can find this out by starting Erlang and entering the following + + <p>Determine where the top directory of your OTP installation is. + To find this, start Erlang and enter the following command at the Eshell prompt:</p> + <code type="none"><![CDATA[ Eshell V4.7.4 (abort with ^G) 1> code:root_dir(). /usr/local/otp ]]></code> - <p>To compile your code, make sure that your C compiler knows where - to find <c><![CDATA[erl_interface.h]]></c> by specifying an appropriate <c><![CDATA[-I]]></c> - argument on the command line, or by adding it to the <c><![CDATA[CFLAGS]]></c> - definition in your <c><![CDATA[Makefile]]></c>. The correct value for this path is - <c><![CDATA[$OTPROOT/lib/erl_interface]]></c><em>Vsn</em><c><![CDATA[/include]]></c>, where <c><![CDATA[$OTPROOT]]></c> is the path - reported by <c><![CDATA[code:root_dir/0]]></c> in the above example, and <em>Vsn</em> is - the version of the Erl_interface application, for example - <c><![CDATA[erl_interface-3.2.3]]></c></p> + + <p>To compile your code, ensure that your C compiler knows where + to find <c>erl_interface.h</c> by specifying an appropriate + <c>-I</c> argument on the command line, or add it to + the <c>CFLAGS</c> definition in your + <c>Makefile</c>. The correct value for this path is + <c>$OTPROOT/lib/erl_interface-$EIVSN/include</c>, + where:</p> + + <list type="bulleted"> + <item> + <p><c>$OTPROOT</c> is the path reported by + <c>code:root_dir/0</c> in the example above.</p> + </item> + <item> + <p><c>$EIVSN</c> is the version of the <c>Erl_Interface</c> application, + for example, <c>erl_interface-3.2.3</c>.</p> + </item> + </list> + + <p>Compiling the code:</p> + <code type="none"><![CDATA[ $ cc -c -I/usr/local/otp/lib/erl_interface-3.2.3/include myprog.c ]]></code> - <p>When linking, you will need to specify the path to - <c><![CDATA[liberl_interface.a]]></c> and <c><![CDATA[libei.a]]></c> with - <c><![CDATA[-L$OTPROOT/lib/erl_interface-3.2.3/lib]]></c>, and you will need to specify the - name of the libraries with <c><![CDATA[-lerl_interface -lei]]></c>. You can do - this on the command line or by adding the flags to the <c><![CDATA[LDFLAGS]]></c> - definition in your <c><![CDATA[Makefile]]></c>.</p> + + <p>When linking:</p> + + <list type="bulleted"> + <item>Specify the path to <c>liberl_interface.a</c> and + <c>libei.a</c> with + <c>-L$OTPROOT/lib/erl_interface-3.2.3/lib</c>.</item> + <item>Specify the name of the libraries with + <c>-lerl_interface -lei</c>.</item> + </list> + + <p>Do this on the command line or add the flags to the + <c>LDFLAGS</c> definition in your + <c>Makefile</c>.</p> + + <p>Linking the code:</p> + <code type="none"><![CDATA[ $ ld -L/usr/local/otp/lib/erl_interface-3.2.3/ lib myprog.o -lerl_interface -lei -o myprog ]]></code> - <p>Also, on some systems it may be necessary to link with some - additional libraries (e.g. <c><![CDATA[libnsl.a]]></c> and <c><![CDATA[libsocket.a]]></c> on - Solaris, or <c><![CDATA[wsock32.lib]]></c> on Windows) in order to use the - communication facilities of Erl_Interface.</p> - <p>If you are using Erl_Interface functions in a threaded + + <p>On some systems it can be necessary to link with some more + libraries (for example, <c>libnsl.a</c> and + <c>libsocket.a</c> on Solaris, or + <c>wsock32.lib</c> on Windows) to use the + communication facilities of <c>Erl_Interface</c>.</p> + + <p>If you use the <c>Erl_Interface</c> functions in a threaded application based on POSIX threads or Solaris threads, then - Erl_Interface needs access to some of the synchronization - facilities in your threads package, and you will need to specify - additional compiler flags in order to indicate which of the packages - you are using. Define <c><![CDATA[_REENTRANT]]></c> and either <c><![CDATA[STHREADS]]></c> or - <c><![CDATA[PTHREADS]]></c>. The default is to use POSIX threads if - <c><![CDATA[_REENTRANT]]></c> is specified.</p> + <c>Erl_Interface</c> needs access to some of the synchronization + facilities in your threads package. You must specify extra + compiler flags to indicate which of the packages you use. Define + <c>_REENTRANT</c> and either <c>STHREADS</c> or + <c>PTHREADS</c>. The default is to use POSIX threads if + <c>_REENTRANT</c> is specified.</p> </section> <section> - <title>Initializing the erl_interface Library</title> - <p>Before calling any of the other Erl_Interface functions, you - must call <c><![CDATA[erl_init()]]></c> exactly once to initialize the library. - <c><![CDATA[erl_init()]]></c> takes two arguments, however the arguments are no - longer used by Erl_Interface, and should therefore be specified - as <c><![CDATA[erl_init(NULL,0)]]></c>.</p> + <title>Initializing the Erl_Interface Library</title> + <p>Before calling any of the other <c>Erl_Interface</c> functions, call + <c>erl_init()</c> exactly once to initialize the library. + <c>erl_init()</c> takes two arguments. However, the arguments + are no longer used by <c>Erl_Interface</c> and are therefore to be + specified as <c>erl_init(NULL,0)</c>.</p> </section> <section> - <title>Encoding, Decoding and Sending Erlang Terms</title> + <title>Encoding, Decoding, and Sending Erlang Terms</title> <p>Data sent between distributed Erlang nodes is encoded in the - Erlang external format. Consequently, you have to encode and decode + Erlang external format. You must therefore encode and decode Erlang terms into byte streams if you want to use the distribution - protocol to communicate between a C program and Erlang. </p> - <p>The Erl_Interface library supports this activity. It has a - number of C functions which create and manipulate Erlang data + protocol to communicate between a C program and Erlang.</p> + + <p>The <c>Erl_Interface</c> library supports this activity. It has + several C functions that create and manipulate Erlang data structures. The library also contains an encode and a decode function. - The example below shows how to create and encode an Erlang tuple - <c><![CDATA[{tobbe,3928}]]></c>:</p> - <code type="none"><![CDATA[ + The following example shows how to create and encode an Erlang tuple + <c>{tobbe,3928}</c>:</p> + <code type="none"><![CDATA[ ETERM *arr[2], *tuple; char buf[BUFSIZ]; int i; @@ -134,58 +192,70 @@ arr[0] = erl_mk_atom("tobbe"); arr[1] = erl_mk_integer(3928); tuple = erl_mk_tuple(arr, 2); i = erl_encode(tuple, buf); ]]></code> - <p>Alternatively, you can use <c><![CDATA[erl_send()]]></c> and - <c><![CDATA[erl_receive_msg]]></c>, which handle the encoding and decoding of - messages transparently.</p> - <p>Refer to the Reference Manual for a complete description of the - following modules:</p> + + <p>Alternatively, you can use <c>erl_send()</c> and + <c>erl_receive_msg</c>, which handle the encoding and + decoding of messages transparently.</p> + + <p>For a complete description, see the following modules:</p> <list type="bulleted"> - <item>the <c><![CDATA[erl_eterm]]></c> module for creating Erlang terms</item> - <item>the <c><![CDATA[erl_marshal]]></c> module for encoding and decoding routines.</item> + <item><seealso marker="erl_eterm"><c>erl_eterm</c></seealso> + for creating Erlang terms</item> + <item><seealso marker="erl_marshal"><c>erl_marshal</c></seealso> + for encoding and decoding routines</item> </list> </section> <section> + <marker id="building_terms_and_patterns"/> <title>Building Terms and Patterns</title> - <p>The previous example can be simplified by using - <c><![CDATA[erl_format()]]></c> to create an Erlang term.</p> - <code type="none"><![CDATA[ + <p>The previous example can be simplified by using the + <seealso marker="erl_format"><c>erl_format</c></seealso> module + to create an Erlang term:</p> + <code type="none"><![CDATA[ ETERM *ep; ep = erl_format("{~a,~i}", "tobbe", 3928); ]]></code> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_format]]></c> module, for a - full description of the different format directives. The following - example is more complex:</p> - <code type="none"><![CDATA[ + <p>For a complete description of the different format directives, see + the <seealso marker="erl_format"><c>erl_format</c></seealso> module.</p> + + <p>The following example is more complex:</p> + + <code type="none"><![CDATA[ ETERM *ep; ep = erl_format("[{name,~a},{age,~i},{data,~w}]", "madonna", 21, erl_format("[{adr,~s,~i}]", "E-street", 42)); erl_free_compound(ep); ]]></code> - <p>As in previous examples, it is your responsibility to free the - memory allocated for Erlang terms. In this example, - <c><![CDATA[erl_free_compound()]]></c> ensures that the complete term pointed to - by <c><![CDATA[ep]]></c> is released. This is necessary, because the pointer from - the second call to <c><![CDATA[erl_format()]]></c> is lost. </p> - <p>The following - example shows a slightly different solution:</p> - <code type="none"><![CDATA[ + <p>As in the previous examples, it is your responsibility to free the + memory allocated for Erlang terms. In this example, + <c>erl_free_compound()</c> ensures that the complete term + pointed to by <c>ep</c> is released. This is necessary + because the pointer from the second call to <c>erl_format</c> is lost.</p> + + <p>The following example shows a slightly different solution:</p> + + <code type="none"><![CDATA[ ETERM *ep,*ep2; ep2 = erl_format("[{adr,~s,~i}]","E-street",42); ep = erl_format("[{name,~a},{age,~i},{data,~w}]", "madonna", 21, ep2); erl_free_term(ep); erl_free_term(ep2); ]]></code> + <p>In this case, you free the two terms independently. The order in - which you free the terms <c><![CDATA[ep]]></c> and <c><![CDATA[ep2]]></c> is not important, - because the Erl_Interface library uses reference counting to - determine when it is safe to actually remove objects. </p> - <p>If you are not sure whether you have freed the terms properly, you + which you free the terms <c>ep</c> and <c>ep2</c> + is not important, + because the <c>Erl_Interface</c> library uses reference counting to + determine when it is safe to remove objects.</p> + + <p>If you are unsure whether you have freed the terms properly, you can use the following function to see the status of the fixed term allocator:</p> + <code type="none"><![CDATA[ long allocated, freed; @@ -196,36 +266,49 @@ printf("length of freelist: %ld\n",freed); /* really free the freelist */ erl_eterm_release(); ]]></code> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_malloc]]></c> module for more - information.</p> + + <p>For more information, see the + <seealso marker="erl_malloc"><c>erl_malloc</c></seealso> module.</p> </section> <section> <title>Pattern Matching</title> - <p>An Erlang pattern is a term that may contain unbound variables or - <c><![CDATA["do not care"]]></c> symbols. Such a pattern can be matched against a + <p>An Erlang pattern is a term that can contain unbound variables or + <c>"do not care"</c> symbols. Such a pattern can be matched + against a term and, if the match is successful, any unbound variables in the pattern will be bound as a side effect. The content of a bound - variable can then be retrieved.</p> - <code type="none"><![CDATA[ + variable can then be retrieved:</p> + <code type="none"><![CDATA[ ETERM *pattern; pattern = erl_format("{madonna,Age,_}"); ]]></code> - <p><c><![CDATA[erl_match()]]></c> is used to perform pattern matching. It takes a + + <p>The <seealso marker="erl_format#erl_match"> + <c>erl_format:erl_match</c></seealso> function + performs pattern matching. It takes a pattern and a term and tries to match them. As a side effect any unbound - variables in the pattern will be bound. In the following example, we - create a pattern with a variable <em>Age</em> which appears at two + variables in the pattern will be bound. In the following example, a + pattern is created with a variable <c>Age</c>, which is included at two positions in the tuple. The pattern match is performed as follows:</p> - <list type="ordered"> - <item><c><![CDATA[erl_match()]]></c> will bind the contents of - <em>Age</em> to <em>21</em> the first time it reaches the variable</item> - <item>the second occurrence of <em>Age</em> will cause a test for - equality between the terms since <em>Age</em> is already bound to - <em>21</em>. Since <em>Age</em> is bound to 21, the equality test will - succeed and the match continues until the end of the pattern.</item> - <item>if the end of the pattern is reached, the match succeeds and you - can retrieve the contents of the variable</item> + + <list type="bulleted"> + <item> + <p><c>erl_match</c> binds the contents of <c>Age</c> to <c>21</c> + the first time it reaches the variable.</p> + </item> + <item> + <p>The second occurrence of <c>Age</c> causes a test for + equality between the terms, as <c>Age</c> is already bound to + <c>21</c>. As <c>Age</c> is bound to <c>21</c>, the equality test + succeeds and the match continues until the end of the pattern.</p> + </item> + <item> + <p>If the end of the pattern is reached, the match succeeds and you + can retrieve the contents of the variable.</p> + </item> </list> + <code type="none"><![CDATA[ ETERM *pattern,*term; pattern = erl_format("{madonna,Age,Age}"); @@ -239,99 +322,136 @@ if (erl_match(pattern, term)) { } erl_free_term(pattern); erl_free_term(term); ]]></code> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_match()]]></c> function for - more information.</p> + + <p>For more information, see the + <seealso marker="erl_format#erl_match"> + <c>erl_format:erl_match</c></seealso> function.</p> </section> <section> <title>Connecting to a Distributed Erlang Node</title> - <p>In order to connect to a distributed Erlang node you need to first - initialize the connection routine with <c><![CDATA[erl_connect_init()]]></c>, - which stores information such as the host name, node name, and IP + <p>To connect to a distributed Erlang node, you must first + initialize the connection routine with + <seealso marker="erl_connect#erl_connect_init"> + <c>erl_connect:erl_connect_init</c></seealso>, + which stores information, such as the hostname, node name, and IP address for later use:</p> + <code type="none"><![CDATA[ int identification_number = 99; int creation=1; char *cookie="a secret cookie string"; /* An example */ erl_connect_init(identification_number, cookie, creation); ]]></code> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_connect]]></c> module for more information.</p> + + <p>For more information, see the + <seealso marker="erl_connect"><c>erl_connect</c></seealso> module.</p> + <p>After initialization, you set up the connection to the Erlang node. - Use <c><![CDATA[erl_connect()]]></c> to specify the Erlang node you want to - connect to. The following example sets up the connection and should - result in a valid socket file descriptor:</p> + To specify the Erlang node you want to connect to, use + <c>erl_connect()</c>. The following example sets up the + connection and is to result in a valid socket file descriptor:</p> + <code type="none"><![CDATA[ int sockfd; char *nodename="[email protected]"; /* An example */ if ((sockfd = erl_connect(nodename)) < 0) erl_err_quit("ERROR: erl_connect failed"); ]]></code> - <p><c><![CDATA[erl_err_quit()]]></c> prints the specified string and terminates - the program. Refer to the Reference Manual, the <c><![CDATA[erl_error()]]></c> - function for more information.</p> + + <p><c>erl_err_quit()</c> prints the specified string and + terminates the program. For more information, see the + <seealso marker="erl_error"><c>erl_error</c></seealso> module.</p> </section> <section> <title>Using EPMD</title> - <p><c><![CDATA[Epmd]]></c> is the Erlang Port Mapper Daemon. Distributed Erlang nodes - register with <c><![CDATA[epmd]]></c> on the localhost to indicate to other nodes that - they exist and can accept connections. <c><![CDATA[Epmd]]></c> maintains a register of + <p><seealso marker="erts:epmd"><c>erts:epmd</c></seealso> + is the Erlang Port Mapper Daemon. Distributed + Erlang nodes register with <c>epmd</c> on the local host to + indicate to other nodes that they exist and can accept connections. + <c>epmd</c> maintains a register of node and port number information, and when a node wishes to connect to - another node, it first contacts <c><![CDATA[epmd]]></c> in order to find out the correct - port number to connect to.</p> - <p>When you use <c><![CDATA[erl_connect()]]></c> to connect to an Erlang node, a - connection is first made to <c><![CDATA[epmd]]></c> and, if the node is known, a + another node, it first contacts <c>epmd</c> to find the + correct port number to connect to.</p> + + <p>When you use + <seealso marker="erl_connect"><c>erl_connect</c></seealso> + to connect to an Erlang node, a connection is first made to + <c>epmd</c> and, if the node is known, a connection is then made to the Erlang node.</p> - <p>C nodes can also register themselves with <c><![CDATA[epmd]]></c> if they want other + + <p>C nodes can also register themselves with <c>epmd</c> + if they want other nodes in the system to be able to find and connect to them.</p> - <p>Before registering with <c><![CDATA[epmd]]></c>, you need to first create a listen socket - and bind it to a port. Then:</p> + + <p>Before registering with <c>epmd</c>, you must first + create a listen socket and bind it to a port. Then:</p> + <code type="none"><![CDATA[ int pub; pub = erl_publish(port); ]]></code> - <p><c><![CDATA[pub]]></c> is a file descriptor now connected to <c><![CDATA[epmd]]></c>. <c><![CDATA[Epmd]]></c> - monitors the other end of the connection, and if it detects that the - connection has been closed, the node will be unregistered. So, if you - explicitly close the descriptor or if your node fails, it will be - unregistered from <c><![CDATA[epmd]]></c>.</p> - <p>Be aware that on some systems (such as VxWorks), a failed node will - not be detected by this mechanism since the operating system does not + + <p><c>pub</c> is a file descriptor now connected to + <c>epmd</c>. <c>epmd</c> + monitors the other end of the connection. If it detects that the + connection has been closed, the node becomes unregistered. So, if you + explicitly close the descriptor or if your node fails, it becomes + unregistered from <c>epmd</c>.</p> + + <p>Notice that on some systems (such as VxWorks), a failed node is + not detected by this mechanism, as the operating system does not automatically close descriptors that were left open when the node - failed. If a node has failed in this way, <c><![CDATA[epmd]]></c> will prevent you from - registering a new node with the old name, since it thinks that the old + failed. If a node has failed in this way, <c>epmd</c> + prevents you from + registering a new node with the old name, as it thinks that the old name is still in use. In this case, you must unregister the name explicitly:</p> + <code type="none"><![CDATA[ erl_unpublish(node); ]]></code> - <p>This will cause <c><![CDATA[epmd]]></c> to close the connection from the far end. Note + + <p>This causes <c>epmd</c> to close the connection from the + far end. Notice that if the name was in fact still in use by a node, the results of this operation are unpredictable. Also, doing this does not cause the - local end of the connection to close, so resources may be consumed.</p> + local end of the connection to close, so resources can be consumed.</p> </section> <section> <title>Sending and Receiving Erlang Messages</title> <p>Use one of the following two functions to send messages:</p> + <list type="bulleted"> - <item><c><![CDATA[erl_send()]]></c></item> - <item><c><![CDATA[erl_reg_send()]]></c></item> + <item><seealso marker="erl_connect#erl_send"> + <c>erl_connect:erl_send</c></seealso></item> + <item><seealso marker="erl_connect#erl_reg_send"> + <c>erl_connect:erl_reg_send</c></seealso></item> </list> - <p>As in Erlang, it is possible to send messages to a - <em>Pid</em> or to a registered name. It is easier to send a - message to a registered name because it avoids the problem of finding - a suitable <em>Pid</em>.</p> + + <p>As in Erlang, messages can be sent to a + pid or to a registered name. It is easier to send a + message to a registered name, as it avoids the problem of finding + a suitable pid.</p> + <p>Use one of the following two functions to receive messages:</p> + <list type="bulleted"> - <item><c><![CDATA[erl_receive()]]></c></item> - <item><c><![CDATA[erl_receive_msg()]]></c></item> + <item><seealso marker="erl_connect#erl_receive"> + <c>erl_connect:erl_receive</c></seealso></item> + <item><seealso marker="erl_connect#erl_receive_msg"> + <c>erl_connect:erl_receive_msg</c></seealso></item> </list> - <p><c><![CDATA[erl_receive()]]></c> receives the message into a buffer, while - <c><![CDATA[erl_receive_msg()]]></c> decodes the message into an Erlang term. </p> + + <p><c>erl_receive()</c> receives the message into a buffer, + while <c>erl_receive_msg()</c> decodes the message into an + Erlang term.</p> <section> <title>Example of Sending Messages</title> - <p>In the following example, <c><![CDATA[{Pid, hello_world}]]></c> is - sent to a registered process <c><![CDATA[my_server]]></c>. The message is encoded - by <c><![CDATA[erl_send()]]></c>:</p> + <p>In the following example, <c>{Pid, hello_world}</c> is + sent to a registered process <c>my_server</c>. The message + is encoded by <c>erl_send()</c>:</p> + <code type="none"><![CDATA[ extern const char *erl_thisnodename(void); extern short erl_thiscreation(void); @@ -345,16 +465,19 @@ emsg = erl_mk_tuple(arr, 2); erl_reg_send(sockfd, "my_server", emsg); erl_free_term(emsg); ]]></code> + <p>The first element of the tuple that is sent is your own - <em>Pid</em>. This enables <c><![CDATA[my_server]]></c> to reply. Refer to the - Reference Manual, the <c><![CDATA[erl_connect]]></c> module for more information - about send primitives.</p> + pid. This enables <c>my_server</c> to reply. + For more information about the primitives, see the + <seealso marker="erl_connect"><c>erl_connect</c></seealso> module.</p> </section> <section> <title>Example of Receiving Messages</title> - <p>In this example <c><![CDATA[{Pid, Something}]]></c> is received. The - received Pid is then used to return <c><![CDATA[{goodbye,Pid}]]></c></p> + <p>In this example, <c>{Pid, Something}</c> is received. The + received pid is then used to return + <c>{goodbye,Pid}</c>.</p> + <code type="none"><![CDATA[ ETERM *arr[2], *answer; int sockfd,rc; @@ -370,22 +493,25 @@ if ((rc = erl_receive_msg(sockfd , buf, BUFSIZE, &emsg)) == ERL_MSG) { erl_free_term(emsg.msg); erl_free_term(emsg.to); } ]]></code> - <p>In order to provide robustness, a distributed Erlang node - occasionally polls all its connected neighbours in an attempt to - detect failed nodes or communication links. A node which receives such - a message is expected to respond immediately with an <c><![CDATA[ERL_TICK]]></c> message. - This is done automatically by <c><![CDATA[erl_receive()]]></c>, however when this - has occurred <c><![CDATA[erl_receive]]></c> returns <c><![CDATA[ERL_TICK]]></c> to the caller - without storing a message into the <c><![CDATA[ErlMessage]]></c> structure.</p> + + <p>To provide robustness, a distributed Erlang node + occasionally polls all its connected neighbors in an attempt to + detect failed nodes or communication links. A node that receives such + a message is expected to respond immediately with an + <c>ERL_TICK</c> message. This is done automatically by + <c>erl_receive()</c>. However, when this has occurred, + <c>erl_receive</c> returns <c>ERL_TICK</c> to + the caller without storing a message into the + <c>ErlMessage</c> structure.</p> + <p>When a message has been received, it is the caller's responsibility - to free the received message <c><![CDATA[emsg.msg]]></c> as well as <c><![CDATA[emsg.to]]></c> - or <c><![CDATA[emsg.from]]></c>, depending on the type of message received.</p> - <p>Refer to the Reference Manual for additional information about the - following modules:</p> - <list type="bulleted"> - <item><c><![CDATA[erl_connect]]></c></item> - <item><c><![CDATA[erl_eterm]]></c>.</item> - </list> + to free the received message <c>emsg.msg</c> and + <c>emsg.to</c> or <c>emsg.from</c>, + depending on the type of message received.</p> + + <p>For more information, see the + <seealso marker="erl_connect"><c>erl_connect</c></seealso> and + <seealso marker="erl_eterm"><c>erl_eterm</c></seealso> modules.</p> </section> </section> @@ -394,10 +520,12 @@ if ((rc = erl_receive_msg(sockfd , buf, BUFSIZE, &emsg)) == ERL_MSG) { <p>An Erlang node acting as a client to another Erlang node typically sends a request and waits for a reply. Such a request is included in a function call at a remote node and is called a remote - procedure call. The following example shows how the - Erl_Interface library supports remote procedure calls:</p> - <code type="none"><![CDATA[ + procedure call.</p> + <p>The following example shows how the + <c>Erl_Interface</c> library supports remote procedure calls:</p> + + <code type="none"><![CDATA[ char modname[]=THE_MODNAME; ETERM *reply,*ep; ep = erl_format("[~a,[]]", modname); @@ -409,26 +537,34 @@ if (!erl_match(ep, reply)) erl_err_msg("<ERROR> compiler errors !\n"); erl_free_term(ep); erl_free_term(reply); ]]></code> - <p><c><![CDATA[c:c/1]]></c> is called to compile the specified module on the - remote node. <c><![CDATA[erl_match()]]></c> checks that the compilation was - successful by testing for the expected <c><![CDATA[ok]]></c>.</p> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_connect]]></c> module for - more information about <c><![CDATA[erl_rpc()]]></c>, and its companions - <c><![CDATA[erl_rpc_to()]]></c> and <c><![CDATA[erl_rpc_from()]]></c>.</p> + + <p><c>c:c/1</c> is called to compile the specified module on + the remote node. <c>erl_match()</c> checks that the + compilation was + successful by testing for the expected <c>ok</c>.</p> + + <p>For more information about <c>erl_rpc()</c> and its + companions <c>erl_rpc_to()</c> and + <c>erl_rpc_from()</c>, see the + <seealso marker="erl_connect"><c>erl_connect</c></seealso> module.</p> </section> <section> <title>Using Global Names</title> - <p>A C node has access to names registered through the Erlang Global - module. Names can be looked up, allowing the C node to send messages + <p>A C node has access to names registered through the + <seealso marker="kernel:global"><c>global</c></seealso> + module in Kernel. Names can be looked up, allowing the C node to send messages to named Erlang services. C nodes can also register global names, allowing them to provide named services to Erlang processes or other C - nodes. </p> - <p>Erl_Interface does not provide a native implementation of the global - service. Instead it uses the global services provided by a "nearby" - Erlang node. In order to use the services described in this section, + nodes.</p> + + <p><c>Erl_Interface</c> does not provide a native implementation of the + global service. Instead it uses the global services provided by a "nearby" + Erlang node. To use the services described in this section, it is necessary to first open a connection to an Erlang node.</p> + <p>To see what names there are:</p> + <code type="none"><![CDATA[ char **names; int count; @@ -441,71 +577,102 @@ if (names) printf("%s\n",names[i]); free(names); ]]></code> - <p><c><![CDATA[erl_global_names()]]></c> allocates and returns a buffer containing - all the names known to global. <c><![CDATA[count]]></c> will be initialized to - indicate how many names are in the array. The array of strings in - names is terminated by a NULL pointer, so it is not necessary to use - <c><![CDATA[count]]></c> to determine when the last name is reached.</p> + + <p><seealso marker="erl_global#erl_global_names"> + <c>erl_global:erl_global_names</c></seealso> + allocates and returns a buffer containing + all the names known to the <c>global</c> module in <c>Kernel</c>. + <c>count</c> is initialized to + indicate the number of names in the array. The array of strings in names + is terminated by a <c>NULL</c> pointer, so it is not necessary to use + <c>count</c> to determine when the last name is reached.</p> + <p>It is the caller's responsibility to free the array. - <c><![CDATA[erl_global_names()]]></c> allocates the array and all of the strings - using a single call to <c><![CDATA[malloc()]]></c>, so <c><![CDATA[free(names)]]></c> is all - that is necessary.</p> + <c>erl_global_names</c> allocates the array and all the strings + using a single call to <c>malloc()</c>, so + <c>free(names)</c> is all that is necessary.</p> + <p>To look up one of the names:</p> + <code type="none"><![CDATA[ ETERM *pid; char node[256]; pid = erl_global_whereis(fd,"schedule",node); ]]></code> - <p>If <c><![CDATA["schedule"]]></c> is known to global, an Erlang pid is returned - that can be used to send messages to the schedule service. - Additionally, <c><![CDATA[node]]></c> will be initialized to contain the name of + + <p>If <c>"schedule"</c> is known to the + <c>global</c> module in <c>Kernel</c>, an Erlang pid is + returned that can be used to send messages to the schedule service. + Also, <c>node</c> is initialized to contain the name of the node where the service is registered, so that you can make a - connection to it by simply passing the variable to <c><![CDATA[erl_connect()]]></c>.</p> + connection to it by simply passing the variable to + <seealso marker="erl_connect"><c>erl_connect</c></seealso>.</p> + <p>Before registering a name, you should already have registered your - port number with <c><![CDATA[epmd]]></c>. This is not strictly necessary, but if you + port number with <c>epmd</c>. This is not strictly necessary, + but if you neglect to do so, then other nodes wishing to communicate with your - service will be unable to find or connect to your process.</p> + service cannot find or connect to your process.</p> + <p>Create a pid that Erlang processes can use to communicate with your service:</p> + <code type="none"><![CDATA[ ETERM *pid; pid = erl_mk_pid(thisnode,14,0,0); erl_global_register(fd,servicename,pid); ]]></code> - <p>After registering the name, you should use <c><![CDATA[erl_accept()]]></c> to wait for - incoming connections.</p> - <p>Do not forget to free <c><![CDATA[pid]]></c> later with <c><![CDATA[erl_free_term()]]></c>!</p> + + <p>After registering the name, use + <seealso marker="erl_connect#erl_accept"> + <c>erl_connect:erl_accept</c></seealso> + to wait for incoming connections.</p> + + <note> + <p>Remember to free <c>pid</c> later with + <seealso marker="erl_malloc#erl_free_term"> + <c>erl_malloc:erl_free_term</c></seealso>.</p> + </note> + <p>To unregister a name:</p> + <code type="none"><![CDATA[ erl_global_unregister(fd,servicename); ]]></code> </section> <section> - <title>The Registry</title> + <title>Using the Registry</title> <p>This section describes the use of the registry, a simple mechanism for storing key-value pairs in a C-node, as well as backing them up or - restoring them from a Mnesia table on an Erlang node. More detailed - information about the individual API functions can be found in the - Reference Manual.</p> - <p>Keys are strings, i.e. 0-terminated arrays of characters, and values - are arbitrary objects. Although integers and floating point numbers + restoring them from an <c>Mnesia</c> table on an Erlang node. For more + detailed information about the individual API functions, see the + <seealso marker="registry"><c>registry</c></seealso> module.</p> + + <p>Keys are strings, that is, <c>NULL</c>-terminated arrays of characters, and + values are arbitrary objects. Although integers and floating point numbers are treated specially by the registry, you can store strings or binary objects of any type as pointers.</p> - <p>To start, you need to open a registry:</p> + + <p>To start, open a registry:</p> + <code type="none"><![CDATA[ ei_reg *reg; reg = ei_reg_open(45); ]]></code> - <p>The number 45 in the example indicates the approximate number of + + <p>The number <c>45</c> in the example indicates the approximate number of objects that you expect to store in the registry. Internally the registry uses hash tables with collision chaining, so there is no absolute upper limit on the number of objects that the registry can - contain, but if performance or memory usage are important, then you - should choose a number accordingly. The registry can be resized later.</p> + contain, but if performance or memory usage is important, then you + are to choose a number accordingly. The registry can be resized later.</p> + <p>You can open as many registries as you like (if memory permits).</p> - <p>Objects are stored and retrieved through set and get functions. In - the following examples you see how to store integers, floats, strings + + <p>Objects are stored and retrieved through set and get functions. + The following example shows how to store integers, floats, strings, and arbitrary binary objects:</p> + <code type="none"><![CDATA[ struct bonk *b = malloc(sizeof(*b)); char *name = malloc(7); @@ -519,13 +686,16 @@ ei_reg_setsval(reg,"name",name); b->l = 42; b->m = 12; ei_reg_setpval(reg,"jox",b,sizeof(*b)); ]]></code> - <p>If you attempt to store an object in the registry and there is an - existing object with the same key, the new value will replace the old + + <p>If you try to store an object in the registry and there is an + existing object with the same key, the new value replaces the old one. This is done regardless of whether the new object and the old one have the same type, so you can, for example, replace a string with an - integer. If the existing value is a string or binary, it will be freed + integer. If the existing value is a string or binary, it is freed before the new value is assigned.</p> + <p>Stored values are retrieved from the registry as follows:</p> + <code type="none"><![CDATA[ long i; double f; @@ -537,77 +707,100 @@ i = ei_reg_getival(reg,"age"); f = ei_reg_getfval(reg,"height"); s = ei_reg_getsval(reg,"name"); b = ei_reg_getpval(reg,"jox",&size); ]]></code> - <p>In all of the above examples, the object must exist and it must be of + + <p>In all the above examples, the object must exist and it must be of the right type for the specified operation. If you do not know the - type of a given object, you can ask:</p> + type of an object, you can ask:</p> + <code type="none"><![CDATA[ struct ei_reg_stat buf; ei_reg_stat(reg,"name",&buf); ]]></code> - <p>Buf will be initialized to contain object attributes.</p> + + <p>Buf is initialized to contain object attributes.</p> + <p>Objects can be removed from the registry:</p> + <code type="none"><![CDATA[ ei_reg_delete(reg,"name"); ]]></code> + <p>When you are finished with a registry, close it to remove all the objects and free the memory back to the system:</p> + <code type="none"><![CDATA[ ei_reg_close(reg); ]]></code> <section> <title>Backing Up the Registry to Mnesia</title> - <p>The contents of a registry can be backed up to Mnesia on a "nearby" - Erlang node. You need to provide an open connection to the Erlang node - (see <c><![CDATA[erl_connect()]]></c>). Also, Mnesia 3.0 or later must be running + <p>The contents of a registry can be backed up to + <seealso marker="mnesia:mnesia"><c>Mnesia</c></seealso> on a "nearby" Erlang + node. You must provide an open connection to the Erlang node + (see <seealso marker="erl_connect"><c>erl_connect</c></seealso>). + Also, <c>Mnesia</c> 3.0 or later must be running on the Erlang node before the backup is initiated:</p> + <code type="none"><![CDATA[ ei_reg_dump(fd, reg, "mtab", dumpflags); ]]></code> - <p>The example above will backup the contents of the registry to the - specified Mnesia table <c><![CDATA["mtab"]]></c>. Once a registry has been backed - up to Mnesia in this manner, additional backups will only affect - objects that have been modified since the most recent backup, i.e. - objects that have been created, changed or deleted. The backup - operation is done as a single atomic transaction, so that the entire - backup will be performed or none of it will.</p> - <p>In the same manner, a registry can be restored from a Mnesia table:</p> + + <p>This example back up the contents of the registry to the + specified <c>Mnesia</c> table <c>"mtab"</c>. + Once a registry has been backed + up to <c>Mnesia</c> like this, more backups only affect + objects that have been modified since the most recent backup, that is, + objects that have been created, changed, or deleted. The backup + operation is done as a single atomic transaction, so that either the + entire backup is performed or none of it.</p> + + <p>Likewise, a registry can be restored from a <c>Mnesia</c> table:</p> + <code type="none"><![CDATA[ ei_reg_restore(fd, reg, "mtab"); ]]></code> - <p>This will read the entire contents of <c><![CDATA["mtab"]]></c> into the specified - registry. After the restore, all of the objects in the registry will - be marked as unmodified, so a subsequent backup will only affect + + <p>This reads the entire contents of <c>"mtab"</c> into the + specified registry. After the restore, all the objects in the registry + are marked as unmodified, so a later backup only affects objects that you have modified since the restore.</p> - <p>Note that if you restore to a non-empty registry, objects in the - table will overwrite objects in the registry with the same keys. Also, + + <p>Notice that if you restore to a non-empty registry, objects in the + table overwrite objects in the registry with the same keys. Also, the <em>entire</em> contents of the registry is marked as unmodified after the restore, including any modified objects that were not - overwritten by the restore operation. This may not be your intention.</p> + overwritten by the restore operation. This may not be your + intention.</p> </section> <section> <title>Storing Strings and Binaries</title> <p>When string or binary objects are stored in the registry it is - important that a number of simple guidelines are followed. </p> + important that some simple guidelines are followed.</p> + <p>Most importantly, the object must have been created with a single call - to <c><![CDATA[malloc()]]></c> (or similar), so that it can later be removed by a - single call to <c><![CDATA[free()]]></c>. Objects will be freed by the registry + to <c>malloc()</c> (or similar), so that it can later be + removed by a single call to <c>free()</c>. + Objects are freed by the registry when it is closed, or when you assign a new value to an object that previously contained a string or binary.</p> - <p>You should also be aware that if you store binary objects that are - context-dependent (e.g. containing pointers or open file descriptors), - they will lose their meaning if they are backed up to a Mnesia table - and subsequently restored in a different context.</p> + + <p>Notice that if you store binary objects that are context-dependent + (for example, containing pointers or open file descriptors), + they lose their meaning if they are backed up to a <c>Mnesia</c> table + and later restored in a different context.</p> + <p>When you retrieve a stored string or binary value from the registry, the registry maintains a pointer to the object and you are passed a copy of that pointer. You should never free an object retrieved in this manner because when the registry later attempts to free it, a - runtime error will occur that will likely cause the C-node to crash.</p> + runtime error occurs that likely causes the C-node to crash.</p> + <p>You are free to modify the contents of an object retrieved this way. - However when you do so, the registry will not be aware of the changes - you make, possibly causing it to be missed the next time you make a - Mnesia backup of the registry contents. This can be avoided if you - mark the object as dirty after any such changes with - <c><![CDATA[ei_reg_markdirty()]]></c>, or pass appropriate flags to - <c><![CDATA[ei_reg_dump()]]></c>.</p> + However, when you do so, the registry is not aware of your changes, + possibly causing it to be missed the next time you make an + <c>Mnesia</c> backup of the registry contents. This can be avoided if + you mark the object as dirty after any such changes with + <seealso marker="registry#ei_reg_markdirty"> + <c>registry:ei_reg_markdirty</c></seealso>, or pass appropriate flags to + <seealso marker="registry#ei_reg_dump"> + <c>registry:ei_reg_dump</c></seealso>.</p> </section> </section> </chapter> - diff --git a/lib/erl_interface/doc/src/erl_call.xml b/lib/erl_interface/doc/src/erl_call.xml index 46015621ac..f1e52b1889 100644 --- a/lib/erl_interface/doc/src/erl_call.xml +++ b/lib/erl_interface/doc/src/erl_call.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -28,135 +28,146 @@ <docno></docno> <approved>Bjarne Däcker</approved> <checked>Torbjörn Törnkvist</checked> - <date>97-05-16</date> + <date>1997-05-16</date> <rev>B</rev> - <file>erl_call.sgml</file> + <file>erl_call.xml</file> </header> <com>erl_call</com> - <comsummary>Call/Start a Distributed Erlang Node</comsummary> + <comsummary>Call/start a distributed Erlang node.</comsummary> <description> - <p><c><![CDATA[erl_call]]></c> makes it possible to start and/or communicate with - a distributed Erlang node. It is built upon the <c><![CDATA[erl_interface]]></c> - library as an example application. Its purpose is to use an Unix shell script to interact with a distributed Erlang node. It performs all - communication with the Erlang <em>rex server</em>, using the standard Erlang RPC facility. It does not require any special - software to be run at the Erlang target node.</p> + <p><c>erl_call</c> makes it possible to start and/or + communicate with a distributed Erlang node. It is built upon the + <c>Erl_Interface</c> library as an example application. + Its purpose is to use a Unix shell script to interact with a distributed + Erlang node. It performs all communication with the Erlang + <em>rex server</em>, using the standard Erlang RPC facility. It does not + require any special software to be run at the Erlang target node.</p> + <p>The main use is to either start a distributed Erlang node or to make an ordinary function call. However, it is also - possible to pipe an Erlang module to <c><![CDATA[erl_call]]></c> and have it - compiled, or to pipe a sequence of Erlang expressions to be evaluated + possible to pipe an Erlang module to <c>erl_call</c> and have + it compiled, or to pipe a sequence of Erlang expressions to be evaluated (similar to the Erlang shell).</p> - <p>Options, which cause <c><![CDATA[stdin]]></c> to be read, can be used with - advantage - as scripts from within (Unix) shell scripts. Another - nice use of <c><![CDATA[erl_call]]></c> could be from (http) CGI-bin scripts.</p> + + <p>Options, which cause <c>stdin</c> to be read, can be used + with advantage, + as scripts from within (Unix) shell scripts. Another nice use + of <c>erl_call</c> could be from (HTTP) CGI-bin scripts.</p> </description> + <funcs> <func> <name>erl_call <options></name> - <fsummary>Start/Call Erlang</fsummary> + <fsummary>Start/call Erlang.</fsummary> <desc> - <p>Each option flag is described below with its name, type and - meaning. </p> + <p>Starts/calls Erlang.</p> + <p>Each option flag is described below with its name, type, and + meaning.</p> <taglist> - <tag>-a [Mod [Fun [Args]]]]</tag> + <tag><c>-a [Mod [Fun [Args]]]]</c></tag> <item> - <p>(<em>optional</em>): Applies the specified function - and returns the result. <c><![CDATA[Mod]]></c> must be specified, however - <c>start</c> and <c>[]</c> are assumed for unspecified <c><![CDATA[Fun]]></c> and <c><![CDATA[Args]]></c>, respectively. <c><![CDATA[Args]]></c> should - be in the same format as for <c><![CDATA[erlang:apply/3]]></c>. Note - that this flag takes exactly one argument, so quoting - may be necessary in order to group <c><![CDATA[Mod]]></c>, <c><![CDATA[Fun]]></c> - and <c><![CDATA[Args]]></c>, in a manner dependent on the behavior - of your command shell.</p> - <p></p> + <p>(<em>Optional.</em>) Applies the specified function + and returns the result. <c>Mod</c> must be specified. + However, <c>start</c> and <c>[]</c> are assumed for unspecified + <c>Fun</c> and <c>Args</c>, respectively. + <c>Args</c> is to be in the same format as for + <seealso marker="erts:erlang#apply/3"> + <c>erlang:apply/3</c></seealso> in <c>ERTS</c>.</p> + <p>Notice that this flag takes exactly one argument, so quoting + can be necessary to group <c>Mod</c>, + <c>Fun</c>, and <c>Args</c> in a manner + dependent on the behavior of your command shell.</p> </item> - <tag>-c Cookie</tag> + <tag><c>-c Cookie</c></tag> <item> - <p>(<em>optional</em>): Use this option to specify a certain cookie. If no cookie is specified, the <c><![CDATA[~/.erlang.cookie]]></c> file is read and its content are used as cookie. The Erlang node we want to communicate with must have the same cookie.</p> + <p>(<em>Optional.</em>) Use this option to specify a certain cookie. + If no cookie is specified, the <c>~/.erlang.cookie</c> + file is read and its content is used as cookie. The Erlang node + we want to communicate with must have the same cookie.</p> </item> - <tag>-d</tag> + <tag><c>-d</c></tag> <item> - <p>(<em>optional</em>): Debug mode. This causes all IO to be output - to the file <c><![CDATA[~/.erl_call.out.Nodename]]></c>, where <c><![CDATA[Nodename]]></c> + <p>(<em>Optional.</em>) Debug mode. This causes all I/O to be output + to the <c>~/.erl_call.out.Nodename</c> file, where + <c>Nodename</c> is the node name of the Erlang node in question.</p> - <p></p> </item> - <tag>-e</tag> + <tag><c>-e</c></tag> <item> - <p>(<em>optional</em>): Reads a sequence of Erlang expressions, separated - by '<em>,</em>' and ended with a '<em>.</em>', from <c><![CDATA[stdin]]></c> until - EOF (Control-D). Evaluates the expressions and returns the result from - the last expression. Returns <c><![CDATA[{ok,Result}]]></c> if successful.</p> - <p></p> + <p>(<em>Optional.</em>) Reads a sequence of Erlang expressions, + separated by comma (,) and ended with a full stop (.), from + <c>stdin</c> until EOF (Control-D). Evaluates the + expressions and returns the result from the last expression. + Returns <c>{ok,Result}</c> on success.</p> </item> - <tag>-h HiddenName</tag> + <tag><c>-h HiddenName</c></tag> <item> - <p>(<em>optional</em>): Specifies the name of the hidden node - that <c><![CDATA[erl_call]]></c> represents.</p> - <p></p> + <p>(<em>Optional.</em>) Specifies the name of the hidden node + that <c>erl_call</c> represents.</p> </item> - <tag>-m</tag> + <tag><c>-m</c></tag> <item> - <p>(<em>optional</em>): Reads an Erlang module from <c><![CDATA[stdin]]></c> and - compiles it.</p> - <p></p> + <p>(<em>Optional.</em>) Reads an Erlang module from + <c>stdin</c> and compiles it.</p> </item> - <tag>-n Node</tag> + <tag><c>-n Node</c></tag> <item> - <p>(one of <c><![CDATA[-n, -name, -sname]]></c> is required): - Has the same meaning as <c><![CDATA[-name]]></c> and can still be used for - backwards compatibility reasons.</p> - <p></p> + <p>(One of <c>-n, -name, -sname</c> is required.) + Has the same meaning as <c>-name</c> and can still be + used for backward compatibility reasons.</p> </item> - <tag>-name Node</tag> + <tag><c>-name Node</c></tag> <item> - <p>(one of <c><![CDATA[-n, -name, -sname]]></c> is required): <c><![CDATA[Node]]></c> is the name of the node to be - started or communicated with. It is assumed that - <c><![CDATA[Node]]></c> is started with <c><![CDATA[erl -name]]></c>, which means that fully - qualified long node names are used. - If the <c><![CDATA[-s]]></c> option is given, an Erlang node will (if necessary) - be started with <c><![CDATA[erl -name]]></c>.</p> - <p></p> + <p>(One of <c>-n, -name, -sname</c> is required.) + <c>Node</c> is the name of the node to be + started or communicated with. It is assumed that + <c>Node</c> is started with + <c>erl -name</c>, which means that fully + qualified long node names are used. If option + <c>-s</c> is specified, an Erlang node will (if + necessary) be started with <c>erl -name</c>.</p> </item> - <tag>-q</tag> + <tag><c>-q</c></tag> <item> - <p>(<em>optional</em>): Halts the Erlang node specified - with the -n switch. This switch overrides the -s switch.</p> - <p></p> + <p>(<em>Optional.</em>) Halts the Erlang node specified + with switch <c>-n</c>. This switch overrides switch <c>-s</c>.</p> </item> - <tag>-r</tag> + <tag><c>-r</c></tag> <item> - <p>(<em>optional</em>): Generates a random name of the hidden node - that <c><![CDATA[erl_call]]></c> represents.</p> - <p></p> + <p>(<em>Optional.</em>) Generates a random name of the hidden node + that <c>erl_call</c> represents.</p> </item> - <tag>-s</tag> + <tag><c>-s</c></tag> <item> - <p>(<em>optional</em>): Starts a distributed Erlang node if necessary. - This means that in a sequence of calls, where the '<c><![CDATA[-s]]></c>' - and '<c><![CDATA[-n Node]]></c>' are constant, only the first call will start - the Erlang node. This makes the rest of the communication - very fast. This flag is currently only available on the Unix platform.</p> - <p></p> + <p>(<em>Optional.</em>) Starts a distributed Erlang node if + necessary. This means that in a sequence of calls, where + '<c>-s</c>' and '<c>-n Node</c>' are + constant, only the first call starts the Erlang node. This makes + the rest of the communication very fast. This flag is currently + only available on Unix-like platforms (Linux, Mac OS X, Solaris, + and so on).</p> </item> - <tag>-sname Node</tag> + <tag><c>-sname Node</c></tag> <item> - <p>(one of <c><![CDATA[-n, -name, -sname]]></c> is required): <c><![CDATA[Node]]></c> is the name of the node to - be started or communicated with. It is assumed that <c><![CDATA[Node]]></c> is started with <c><![CDATA[erl -sname]]></c> which means that short node names are used. - If <c><![CDATA[-s]]></c> option is given, an Erlang node will be started (if necessary) with <c><![CDATA[erl -sname]]></c>.</p> - <p></p> + <p>(One of <c>-n, -name, -sname</c> is required.) + <c>Node</c> is the name of the node to be started + or communicated with. It is assumed that <c>Node</c> + is started with <c>erl -sname</c>, which means that + short node names are used. If option <c>-s</c> is + specified, an Erlang node is started (if necessary) with + <c>erl -sname</c>.</p> </item> - <tag>-v</tag> + <tag><c>-v</c></tag> <item> - <p>(<em>optional</em>): Prints a lot of <c><![CDATA[verbose]]></c> information. - This is only useful for the developer and maintainer of <c><![CDATA[erl_call]]></c>.</p> - <p></p> + <p>(<em>Optional.</em>) Prints a lot of <c>verbose</c> + information. This is only useful for the developer and maintainer + of <c>erl_call</c>.</p> </item> - <tag>-x ErlScript</tag> + <tag><c>-x ErlScript</c></tag> <item> - <p>(<em>optional</em>): Specifies another name of the Erlang start-up script - to be used. If not specified, the standard <c><![CDATA[erl]]></c> start-up script - is used.</p> + <p>(<em>Optional.</em>) Specifies another name of the Erlang + startup script to be used. If not specified, the standard + <c>erl</c> startup script is used.</p> </item> </taglist> </desc> @@ -165,20 +176,29 @@ <section> <title>Examples</title> - <p>Starts an Erlang node and calls <c><![CDATA[erlang:time/0]]></c>.</p> + <p>To start an Erlang node and call <c>erlang:time/0</c>:</p> + <code type="none"><![CDATA[ erl_call -s -a 'erlang time' -n madonna {18,27,34} ]]></code> - <p>Terminates an Erlang node by calling <c><![CDATA[erlang:halt/0]]></c>.</p> + + <p>To terminate an Erlang node by calling + <c>erlang:halt/0</c>:</p> + <code type="none"><![CDATA[ erl_call -s -a 'erlang halt' -n madonna ]]></code> - <p>An apply with several arguments.</p> + + <p>To apply with many arguments:</p> + <code type="none"><![CDATA[ erl_call -s -a 'lists map [{math,sqrt},[1,4,9,16,25]]' -n madonna ]]></code> - <p>Evaluates a couple of expressions. <em>The input ends with EOF (Control-D)</em>.</p> + + <p>To evaluate some expressions + (<em>the input ends with EOF (Control-D)</em>):</p> + <code type="none"><![CDATA[ erl_call -s -e -n madonna statistics(runtime), @@ -189,10 +209,14 @@ Y=2, ^D {ok,{3,0}} ]]></code> - <p>Compiles a module and runs it. <em>Again, the input ends with EOF (Control-D)</em>. (In the example shown, the output has been formatted afterwards).</p> + + <p>To compile a module and run it (<em>again, the input ends with EOF + (Control-D)</em>):</p> + <p>(In the example, the output has been formatted afterwards.)</p> + <code type="none"><![CDATA[ -erl_call -s -m -a lolita -n madonna --module(lolita). +erl_call -s -m -a procnames -n madonna +-module(procnames). -compile(export_all). start() -> P = processes(), @@ -238,4 +262,3 @@ start() -> ]]></code> </section> </comref> - diff --git a/lib/erl_interface/doc/src/erl_connect.xml b/lib/erl_interface/doc/src/erl_connect.xml index 0fad98cd17..76ef6588c2 100644 --- a/lib/erl_interface/doc/src/erl_connect.xml +++ b/lib/erl_interface/doc/src/erl_connect.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>erl_connect</title> @@ -28,127 +28,110 @@ <docno></docno> <approved>Bjarne Däcker</approved> <checked>Torbjörn Törnkvist</checked> - <date>980703</date> + <date>1998-07-03</date> <rev>A</rev> - <file>erl_connect.sgml</file> + <file>erl_connect.xml</file> </header> <lib>erl_connect</lib> - <libsummary>Communicate with Distributed Erlang</libsummary> + <libsummary>Communicate with distributed Erlang.</libsummary> <description> <p>This module provides support for communication between distributed - Erlang nodes and C nodes, in a manner that is transparent to Erlang + Erlang nodes and C-nodes, in a manner that is transparent to Erlang processes.</p> - <p>A C node appears to Erlang as a - <em>hidden node</em>. + + <p>A C-node appears to Erlang as a <em>hidden node</em>. That is, Erlang processes that know the name of the - C node are able to communicate with it in a normal manner, but - the node name will not appear in the listing provided by the - Erlang function <c><![CDATA[nodes/0]]></c>.</p> + C-node can communicate with it in a normal manner, but + the node name does not appear in the listing provided by + <seealso marker="erts:erlang#nodes/0"><c>erlang:nodes/0</c></seealso> + in <c>ERTS</c>.</p> </description> + <funcs> <func> - <name><ret>int</ret><nametext>erl_connect_init(number, cookie, creation)</nametext></name> - <name><ret>int</ret><nametext>erl_connect_xinit(host, alive, node, addr, cookie, creation)</nametext></name> - <fsummary>Initialize communication</fsummary> + <name><ret>int</ret><nametext>erl_accept(listensock, conp)</nametext></name> + <fsummary>Accept a connection.</fsummary> <type> - <v>int number;</v> - <v>char *cookie;</v> - <v>short creation;</v> - <v>char *host,*alive,*node;</v> - <v>struct in_addr *addr;</v> + <v>int listensock;</v> + <v>ErlConnect *conp;</v> </type> <desc> - <p>These functions initialize the <c><![CDATA[erl_connect]]></c> - module. In particular, they are used to identify the name of the - C-node from which they are called. One of these functions must - be called before any of the other functions in the erl_connect - module are used.</p> - <p><c><![CDATA[erl_connect_xinit()]]></c> stores for later use information about - the node's host name <c><![CDATA[host]]></c>, alive name <c><![CDATA[alive]]></c>, node - name <c><![CDATA[node]]></c>, IP address <c><![CDATA[addr]]></c>, cookie <c><![CDATA[cookie]]></c>, - and creation number <c><![CDATA[creation]]></c>. <c><![CDATA[erl_connect_init()]]></c> - provides an alternative interface which does not require as much - information from the caller. Instead, <c><![CDATA[erl_connect_init()]]></c> - uses <c><![CDATA[gethostbyname()]]></c> to obtain default values. - </p> - <p>If you use <c><![CDATA[erl_connect_init()]]></c> your node will have a - short name, i.e., it will not be fully qualified. If you need to - use fully qualified (a.k.a. long) names, use - <c><![CDATA[erl_connect_xinit()]]></c> instead. - </p> - <p><c><![CDATA[host]]></c> is the name of the host on which the node is running.</p> - <p><c><![CDATA[alive]]></c> is the alivename of the node.</p> - <p><c><![CDATA[node]]></c> is the name of the node. The nodename should - be of the form <em>alivename@hostname</em>.</p> - <p><c><![CDATA[addr]]></c> is the 32-bit IP address of <c><![CDATA[host]]></c>.</p> - <p><c><![CDATA[cookie]]></c> is the authorization string required for access - to the remote node. If NULL the user HOME directory is - searched for a cookie file <c><![CDATA[.erlang.cookie]]></c>. The path to - the home directory is retrieved from the environment variable - <c><![CDATA[HOME]]></c> on Unix and from the <c><![CDATA[HOMEDRIVE]]></c> and - <c><![CDATA[HOMEPATH]]></c> variables on Windows. Refer to the <c><![CDATA[auth]]></c> - module for more details.</p> - <p><c><![CDATA[creation]]></c> helps identify a particular instance of a C - node. In particular, it can help prevent us from receiving - messages sent to an earlier process with the same registered - name.</p> - <p>A C node acting as a server will be assigned a creation number - when it calls <c><![CDATA[erl_publish()]]></c>.</p> - <p><c><![CDATA[number]]></c> is used by <c><![CDATA[erl_connect_init()]]></c> to - construct the actual node name. In the second example shown - below, <em>"[email protected]"</em> will be the resulting node - name.</p> - <p>Example 1:</p> - <code type="none"><![CDATA[ -struct in_addr addr; -addr = inet_addr("150.236.14.75"); -if (!erl_connect_xinit("chivas", - "madonna", - "[email protected]", - &addr; - "samplecookiestring..."), - 0) - erl_err_quit("<ERROR> when initializing !"); - ]]></code> - <p>Example 2:</p> + <p>This function is used by a server process to accept a + connection from a client process.</p> + <list type="bulleted"> + <item><c>listensock</c> is an open socket descriptor on + which <c>listen()</c> has previously been called.</item> + <item><c>conp</c> is a pointer to an + <c>ErlConnect</c> struct, described as follows:</item> + </list> <code type="none"><![CDATA[ -if (!erl_connect_init(17, "samplecookiestring...", 0)) - erl_err_quit("<ERROR> when initializing !"); +typedef struct { + char ipadr[4]; + char nodename[MAXNODELEN]; +} ErlConnect; ]]></code> + <p>On success, <c>conp</c> is filled in with the address and + node name of the connecting client and a file descriptor is + returned. On failure, <c>ERL_ERROR</c> is returned and + <c>erl_errno</c> is set to <c>EIO</c>.</p> </desc> </func> + + <func> + <name><ret>int</ret><nametext>erl_close_connection(fd)</nametext></name> + <fsummary>Close a connection to an Erlang node.</fsummary> + <type> + <v>int fd;</v> + </type> + <desc> + <p>Closes an open connection to an Erlang node.</p> + <p><c>Fd</c> is a file descriptor obtained from + <c>erl_connect()</c> or + <c>erl_xconnect()</c>.</p> + <p>Returns <c>0</c> on success. If the call fails, a non-zero value + is returned, and the reason for the error can be obtained with the + appropriate platform-dependent call.</p> + </desc> + </func> + <func> <name><ret>int</ret><nametext>erl_connect(node)</nametext></name> <name><ret>int</ret><nametext>erl_xconnect(addr, alive)</nametext></name> - <fsummary>Establishe a connection to an Erlang node</fsummary> + <fsummary>Establish a connection to an Erlang node.</fsummary> <type> <v>char *node, *alive;</v> <v>struct in_addr *addr;</v> </type> <desc> - <p>These functions set up a connection to an Erlang node.</p> - <p><c><![CDATA[erl_xconnect()]]></c> requires the IP address of the remote - host and the alive name of the remote node - to be specified. <c><![CDATA[erl_connect()]]></c> provides an alternative + <p>Sets up a connection to an Erlang node.</p> + <p><c>erl_xconnect()</c> requires the IP address of the + remote host and the alivename of the remote node to be + specified. <c>erl_connect()</c> provides an alternative interface, and determines the information from the node name provided.</p> - <p><c><![CDATA[addr]]></c> is the 32-bit IP address of the remote host.</p> - <p><c><![CDATA[alive]]></c> is the alivename of the remote node.</p> - <p><c><![CDATA[node]]></c> is the name of the remote node.</p> - <p>These functions return an open file descriptor on success, or - a negative value indicating that an error occurred --- in - which case they will set <c><![CDATA[erl_errno]]></c> to one of:</p> + <list type="bulleted"> + <item><c>addr</c> is the 32-bit IP address of the remote + host.</item> + <item><c>alive</c> is the alivename of the remote node. + </item> + <item><c>node</c> is the name of the remote node.</item> + </list> + <p>Returns an open file descriptor on success, otherwise a negative + value. In the latter case <c>erl_errno</c> is set to one + of:</p> <taglist> - <tag><c><![CDATA[EHOSTUNREACH]]></c></tag> - <item>The remote host <c><![CDATA[node]]></c> is unreachable</item> - <tag><c><![CDATA[ENOMEM]]></c></tag> - <item>No more memory available.</item> - <tag><c><![CDATA[EIO]]></c></tag> + <tag><c>EHOSTUNREACH</c></tag> + <item>The remote host <c>node</c> is unreachable.</item> + <tag><c>ENOMEM</c></tag> + <item>No more memory is available.</item> + <tag><c>EIO</c></tag> <item>I/O error.</item> </taglist> - <p>Additionally, <c><![CDATA[errno]]></c> values from - <c><![CDATA[socket]]></c><em>(2)</em> and <c><![CDATA[connect]]></c><em>(2)</em> - system calls may be propagated into <c><![CDATA[erl_errno]]></c>.</p> + <p>Also, <c>errno</c> values from + <c>socket</c><em>(2)</em> and + <c>connect</c><em>(2)</em> + system calls can be propagated into <c>erl_errno</c>.</p> + <p><em>Example:</em></p> <code type="none"><![CDATA[ #define NODE "[email protected]" #define ALIVE "madonna" @@ -164,59 +147,177 @@ erl_xconnect( &addr , ALIVE ); ]]></code> </desc> </func> + <func> - <name><ret>int</ret><nametext>erl_close_connection(fd)</nametext></name> - <fsummary>Close a connection to an Erlang node</fsummary> + <name><ret>int</ret><nametext>erl_connect_init(number, cookie, creation)</nametext></name> + <name><ret>int</ret><nametext>erl_connect_xinit(host, alive, node, addr, cookie, creation)</nametext></name> + <fsummary>Initialize communication.</fsummary> <type> - <v>int fd;</v> + <v>int number;</v> + <v>char *cookie;</v> + <v>short creation;</v> + <v>char *host,*alive,*node;</v> + <v>struct in_addr *addr;</v> + </type> + <desc> + <p>Initializes the <c>erl_connect</c> module. + In particular, these functions are used to identify the name of the + C-node from which they are called. One of these functions must + be called before any of the other functions in the <c>erl_connect</c> + module are used.</p> + <p><c>erl_connect_xinit()</c> stores for later use + information about:</p> + <list type="bulleted"> + <item>Hostname of the node, <c>host</c></item> + <item>Alivename, <c>alive</c></item> + <item>Node name, <c>node</c></item> + <item>IP address, <c>addr</c></item> + <item>Cookie, <c>cookie</c></item> + <item>Creation number, <c>creation</c></item> + </list> + <p><c>erl_connect_init()</c> + provides an alternative interface that does not require as much + information from the caller. Instead, + <c>erl_connect_init()</c> + uses <c>gethostbyname()</c> to obtain default values.</p> + <p>If you use <c>erl_connect_init()</c>, your node will + have a short name, that is, it will not be fully qualified. If you + need to use fully qualified (long) names, use + <c>erl_connect_xinit()</c> instead.</p> + <list type="bulleted"> + <item> + <p><c>host</c> is the name of the host on which the node + is running.</p> + </item> + <item> + <p><c>alive</c> is the alivename of the node.</p> + </item> + <item> + <p><c>node</c> is the node name. It is to + be of the form <em>alivename@hostname</em>.</p> + </item> + <item> + <p><c>addr</c> is the 32-bit IP address of + <c>host</c>.</p> + </item> + <item> + <p><c>cookie</c> is the authorization string required + for access to the remote node. If <c>NULL</c>, the user + <c>HOME</c> directory is searched for a cookie file + <c>.erlang.cookie</c>. The path to + the home directory is retrieved from environment variable + <c>HOME</c> on Unix and from the + <c>HOMEDRIVE</c> and + <c>HOMEPATH</c> variables on Windows. For more + details, see the <seealso marker="kernel:auth"> + <c>auth</c></seealso> module in Kernel.</p> + </item> + <item> + <p><c>creation</c> helps identifying a particular + instance of a C-node. In particular, it can help prevent us from + receiving messages sent to an earlier process with the same + registered name.</p> + </item> + </list> + <p>A C-node acting as a server is assigned a creation number + when it calls <c>erl_publish()</c>.</p> + <p><c>number</c> is used by + <c>erl_connect_init()</c> to + construct the actual node name. In Example 2 + below, <em>"[email protected]"</em> is the resulting node name.</p> + <p><em>Example 1:</em></p> + <code type="none"><![CDATA[ +struct in_addr addr; +addr = inet_addr("150.236.14.75"); +if (!erl_connect_xinit("chivas", + "madonna", + "[email protected]", + &addr; + "samplecookiestring..."), + 0) + erl_err_quit("<ERROR> when initializing !"); + ]]></code> + <p><em>Example 2:</em></p> + <code type="none"><![CDATA[ +if (!erl_connect_init(17, "samplecookiestring...", 0)) + erl_err_quit("<ERROR> when initializing !"); + ]]></code> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>erl_publish(port)</nametext></name> + <fsummary>Publish a node name.</fsummary> + <type> + <v>int port;</v> </type> <desc> - <p>This function closes an open connection to an Erlang node.</p> - <p><c><![CDATA[Fd]]></c> is a file descriptor obtained from - <c><![CDATA[erl_connect()]]></c> or <c><![CDATA[erl_xconnect()]]></c>.</p> - <p>On success, 0 is returned. If the call fails, a non-zero value - is returned, and the reason for - the error can be obtained with the appropriate platform-dependent - call.</p> + <p>This function is used by a server process to register + with the local name server EPMD, thereby allowing + other processes to send messages by using the registered name. + Before calling this function, the process should + have called <c>bind()</c> and <c>listen()</c> + on an open socket.</p> + <p><c>port</c> is the local name to register, and is to be + the same as the port number that was previously bound to the + socket.</p> + <p>To unregister with EPMD, simply close the returned descriptor.</p> + <p>On success, a descriptor connecting the calling process to EPMD is + returned. On failure, <c>-1</c> is returned and + <c>erl_errno</c> is set to:</p> + <taglist> + <tag><c>EIO</c></tag> + <item>I/O error.</item> + </taglist> + <p>Also, <c>errno</c> values from + <c>socket</c><em>(2)</em> + and <c>connect</c><em>(2)</em> system calls can be + propagated into <c>erl_errno</c>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_receive(fd, bufp, bufsize)</nametext></name> - <fsummary>Receive a message</fsummary> + <fsummary>Receive a message.</fsummary> <type> <v>int fd;</v> <v>char *bufp;</v> <v>int bufsize;</v> </type> <desc> - <p>This function receives a message consisting of a sequence + <p>Receives a message consisting of a sequence of bytes in the Erlang external format.</p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection.</p> - <p><c><![CDATA[bufp]]></c> is a buffer large enough to hold the expected - message. </p> - <p><c><![CDATA[bufsize]]></c> indicates the size of <c><![CDATA[bufp]]></c>.</p> - <p>If a <em>tick</em> occurs, i.e., the Erlang node on the + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>bufp</c> is a buffer large enough to hold the + expected message.</item> + <item><c>bufsize</c> indicates the size of + <c>bufp</c>.</item> + </list> + <p>If a <em>tick</em> occurs, that is, the Erlang node on the other end of the connection has polled this node to see if it - is still alive, the function will return <c><![CDATA[ERL_TICK]]></c> and - no message will be placed in the buffer. Also, - <c><![CDATA[erl_errno]]></c> will be set to <c><![CDATA[EAGAIN]]></c>.</p> + is still alive, the function returns <c>ERL_TICK</c> and + no message is placed in the buffer. Also, + <c>erl_errno</c> is set to <c>EAGAIN</c>.</p> <p>On success, the message is placed in the specified buffer and the function returns the number of bytes actually read. On - failure, the function returns a negative value and will set - <c><![CDATA[erl_errno]]></c> to one of:</p> + failure, the function returns a negative value and sets + <c>erl_errno</c> to one of:</p> <taglist> - <tag><c><![CDATA[EAGAIN]]></c></tag> + <tag><c>EAGAIN</c></tag> <item>Temporary error: Try again.</item> - <tag><c><![CDATA[EMSGSIZE]]></c></tag> - <item>Buffer too small.</item> - <tag><c><![CDATA[EIO]]></c></tag> + <tag><c>EMSGSIZE</c></tag> + <item>Buffer is too small.</item> + <tag><c>EIO</c></tag> <item>I/O error.</item> </taglist> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_receive_msg(fd, bufp, bufsize, emsg)</nametext></name> - <fsummary>Receive and decodes a message</fsummary> + <fsummary>Receive and decode a message.</fsummary> <type> <v>int fd;</v> <v>unsigned char *bufp;</v> @@ -224,14 +325,20 @@ erl_xconnect( &addr , ALIVE ); <v>ErlMessage *emsg;</v> </type> <desc> - <p>This function receives the message into the specified buffer, - and decodes into the <c><![CDATA[(ErlMessage *) emsg]]></c>.</p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection.</p> - <p><c><![CDATA[bufp]]></c> is a buffer large enough to hold the expected message.</p> - <p><c><![CDATA[bufsize]]></c> indicates the size of <c><![CDATA[bufp]]></c>.</p> - <p><c><![CDATA[emsg]]></c> is a pointer to an <c><![CDATA[ErlMessage]]></c> structure, - into which the message will be decoded. <c><![CDATA[ErlMessage]]></c> is - defined as follows:</p> + <p>Receives the message into the specified buffer + and decodes into <c>(ErlMessage *) emsg</c>.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>bufp</c> is a buffer large enough to hold the + expected message.</item> + <item><c>bufsize</c> indicates the size of + <c>bufp</c>.</item> + <item>><c>emsg</c> is a pointer to an + <c>ErlMessage</c> structure + into which the message will be decoded. + <c>ErlMessage</c> is defined as follows:</item> + </list> <code type="none"><![CDATA[ typedef struct { int type; @@ -242,144 +349,100 @@ typedef struct { } ErlMessage; ]]></code> <note> - <p>The definition of <c><![CDATA[ErlMessage]]></c> has changed since - earlier versions of Erl_Interface.</p> + <p>The definition of <c>ErlMessage</c> has changed since + earlier versions of <c>Erl_Interface</c>.</p> </note> - <p><c><![CDATA[type]]></c> identifies the type of message, one of - <c><![CDATA[ERL_SEND]]></c>, <c><![CDATA[ERL_REG_SEND]]></c>, <c><![CDATA[ERL_LINK]]></c>, - <c><![CDATA[ERL_UNLINK]]></c> and <c><![CDATA[ERL_EXIT]]></c>. - </p> - <p>If <c><![CDATA[type]]></c> contains <c><![CDATA[ERL_SEND]]></c> - this indicates that an ordinary send operation has taken - place, and <c><![CDATA[emsg->to]]></c> contains the Pid of the - recipient. If <c><![CDATA[type]]></c> contains <c><![CDATA[ERL_REG_SEND]]></c> then a - registered send operation took place, and <c><![CDATA[emsg->from]]></c> - contains the Pid of the sender. In both cases, the actual - message will be in <c><![CDATA[emsg->msg]]></c>. - </p> - <p>If <c><![CDATA[type]]></c> contains one of <c><![CDATA[ERL_LINK]]></c> or - <c><![CDATA[ERL_UNLINK]]></c>, then <c><![CDATA[emsg->to]]></c> and <c><![CDATA[emsg->from]]></c> - contain the pids of the sender and recipient of the link or unlink. - <c><![CDATA[emsg->msg]]></c> is not used in these cases. - </p> - <p>If <c><![CDATA[type]]></c> contains <c><![CDATA[ERL_EXIT]]></c>, then this - indicates that a link has been broken. In this case, - <c><![CDATA[emsg->to]]></c> and <c><![CDATA[emsg->from]]></c> contain the pids of the - linked processes, and <c><![CDATA[emsg->msg]]></c> contains the reason for - the exit. - </p> + <p><c>type</c> identifies the type of message, one of the + following:</p> + <taglist> + <tag><c>ERL_SEND</c></tag> + <item> + <p>An ordinary send operation has occurred and + <c>emsg->to</c> contains the pid of the recipient. + The message is in <c>emsg->msg</c>.</p> + </item> + <tag><c>ERL_REG_SEND</c></tag> + <item> + <p>A registered send operation has occurred and + <c>emsg->from</c> contains the pid of the sender. + The message is in <c>emsg->msg</c>.</p> + </item> + <tag><c>ERL_LINK</c> or <c>ERL_UNLINK</c> + </tag> + <item> + <p><c>emsg->to</c> and <c>emsg->from</c> + contain the pids of the sender and recipient of the link or + unlink. <c>emsg->msg</c> is not used.</p> + </item> + <tag><c>ERL_EXIT</c></tag> + <item> + <p>A link is broken. <c>emsg->to</c> and + <c>emsg->from</c> contain the pids of the linked + processes, and <c>emsg->msg</c> contains the reason + for the exit.</p> + </item> + </taglist> <note> <p>It is the caller's responsibility to release the - memory pointed to by <c><![CDATA[emsg->msg]]></c>, <c><![CDATA[emsg->to]]></c> and - <c><![CDATA[emsg->from]]></c>.</p> + memory pointed to by <c>emsg->msg</c>, + <c>emsg->to</c>, and + <c>emsg->from</c>.</p> </note> - <p>If a <em>tick</em> occurs, i.e., the Erlang node on the + <p>If a <em>tick</em> occurs, that is, the Erlang node on the other end of the connection has polled this node to see if it - is still alive, the function will return <c><![CDATA[ERL_TICK]]></c> + is still alive, the function returns <c>ERL_TICK</c> indicating that the tick has been received and responded to, - but no message will be placed in the buffer. In this case you - should call <c><![CDATA[erl_receive_msg()]]></c> again.</p> - <p>On success, the function returns <c><![CDATA[ERL_MSG]]></c> and the - <c><![CDATA[Emsg]]></c> struct will be initialized as described above, or - <c><![CDATA[ERL_TICK]]></c>, in which case no message is returned. On - failure, the function returns <c><![CDATA[ERL_ERROR]]></c> and will set - <c><![CDATA[erl_errno]]></c> to one of:</p> + but no message is placed in the buffer. In this case you + are to call <c>erl_receive_msg()</c> again.</p> + <p>On success, the function returns <c>ERL_MSG</c> and the + <c>Emsg</c> struct is initialized as described above, or + <c>ERL_TICK</c>, in which case no message is returned. On + failure, the function returns <c>ERL_ERROR</c> and sets + <c>erl_errno</c> to one of:</p> <taglist> - <tag><c><![CDATA[EMSGSIZE]]></c></tag> - <item>Buffer too small.</item> - <tag><c><![CDATA[ENOMEM]]></c></tag> - <item>No more memory available.</item> - <tag><c><![CDATA[EIO]]></c></tag> - <item>I/O error.</item> - </taglist> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>erl_xreceive_msg(fd, bufpp, bufsizep, emsg)</nametext></name> - <fsummary>Receive and decodes a message</fsummary> - <type> - <v>int fd;</v> - <v>unsigned char **bufpp;</v> - <v>int *bufsizep;</v> - <v>ErlMessage *emsg;</v> - </type> - <desc> - <p>This function is similar to <c><![CDATA[erl_receive_msg]]></c>. The - difference is that <c><![CDATA[erl_xreceive_msg]]></c> expects the buffer to - have been allocated by <c><![CDATA[malloc]]></c>, and reallocates it if the received - message does not fit into the original buffer. For that reason, - both buffer and buffer length are given as pointers - their values - may change by the call. - </p> - <p>On success, the function returns <c><![CDATA[ERL_MSG]]></c> and the - <c><![CDATA[Emsg]]></c> struct will be initialized as described above, or - <c><![CDATA[ERL_TICK]]></c>, in which case no message is returned. On - failure, the function returns <c><![CDATA[ERL_ERROR]]></c> and will set - <c><![CDATA[erl_errno]]></c> to one of:</p> - <taglist> - <tag><c><![CDATA[EMSGSIZE]]></c></tag> - <item>Buffer too small.</item> - <tag><c><![CDATA[ENOMEM]]></c></tag> - <item>No more memory available.</item> - <tag><c><![CDATA[EIO]]></c></tag> - <item>I/O error.</item> - </taglist> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>erl_send(fd, to, msg)</nametext></name> - <fsummary>Send a message</fsummary> - <type> - <v>int fd;</v> - <v>ETERM *to, *msg;</v> - </type> - <desc> - <p>This function sends an Erlang term to a process.</p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection.</p> - <p><c><![CDATA[to]]></c> is an Erlang term containing the Pid of the - intended recipient of the message.</p> - <p><c><![CDATA[msg]]></c> is the Erlang term to be sent.</p> - <p>The function returns 1 if successful, otherwise 0 --- in - which case it will set <c><![CDATA[erl_errno]]></c> to one of:</p> - <taglist> - <tag><c><![CDATA[EINVAL]]></c></tag> - <item>Invalid argument: <c><![CDATA[to]]></c> is not a valid Erlang pid.</item> - <tag><c><![CDATA[ENOMEM]]></c></tag> - <item>No more memory available.</item> - <tag><c><![CDATA[EIO]]></c></tag> + <tag><c>EMSGSIZE</c></tag> + <item>Buffer is too small.</item> + <tag><c>ENOMEM</c></tag> + <item>No more memory is available.</item> + <tag><c>EIO</c></tag> <item>I/O error.</item> </taglist> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_reg_send(fd, to, msg)</nametext></name> - <fsummary>Send a message to a registered name</fsummary> + <fsummary>Send a message to a registered name.</fsummary> <type> <v>int fd;</v> <v>char *to;</v> <v>ETERM *msg;</v> </type> <desc> - <p>This function sends an Erlang term to a registered process.</p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection.</p> - <p><c><![CDATA[to]]></c> is a string containing the registered name of - the intended recipient of the message.</p> - <p><c><![CDATA[msg]]></c> is the Erlang term to be sent.</p> - <p>The function returns 1 if successful, otherwise 0 --- in - which case it will set <c><![CDATA[erl_errno]]></c> to one of:</p> + <p>Sends an Erlang term to a registered process.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>to</c> is a string containing the registered name + of the intended recipient of the message.</item> + <item><c>msg</c> is the Erlang term to be sent.</item> + </list> + <p>Returns <c>1</c> on success, otherwise <c>0</c>. In + the latter case <c>erl_errno</c> is set to one of:</p> <taglist> - <tag><c><![CDATA[ENOMEM]]></c></tag> - <item>No more memory available.</item> - <tag><c><![CDATA[EIO]]></c></tag> + <tag><c>ENOMEM</c></tag> + <item>No more memory is available.</item> + <tag><c>EIO</c></tag> <item>I/O error.</item> </taglist> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_rpc(fd, mod, fun, args)</nametext></name> - <name><ret>int</ret><nametext>erl_rpc_to(fd, mod, fun, args)</nametext></name> <name><ret>int</ret><nametext>erl_rpc_from(fd, timeout, emsg)</nametext></name> - <fsummary>Remote Procedure Call</fsummary> + <name><ret>int</ret><nametext>erl_rpc_to(fd, mod, fun, args)</nametext></name> + <fsummary>Remote Procedure Call.</fsummary> <type> <v>int fd, timeout;</v> <v>char *mod, *fun;</v> @@ -387,158 +450,178 @@ typedef struct { <v>ErlMessage *emsg;</v> </type> <desc> - <p>These functions support calling Erlang functions on remote nodes. - <c><![CDATA[erl_rpc_to()]]></c> sends an rpc request to a remote node and - <c><![CDATA[erl_rpc_from()]]></c> receives the results of such a call. - <c><![CDATA[erl_rpc()]]></c> combines the functionality of these two functions - by sending an rpc request and waiting for the results. See also - <c><![CDATA[rpc:call/4]]></c>. </p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection.</p> - <p><c><![CDATA[timeout]]></c> is the maximum time (in ms) to wait for - results. Specify <c><![CDATA[ERL_NO_TIMEOUT]]></c> to wait forever. - When erl_rpc() calls erl_rpc_from(), the call will never - timeout.</p> - <p><c><![CDATA[mod]]></c> is the name of the module containing the function - to be run on the remote node.</p> - <p><c><![CDATA[fun]]></c> is the name of the function to run.</p> - <p><c><![CDATA[args]]></c> is an Erlang list, containing the arguments to be - passed to the function. </p> - <p><c><![CDATA[emsg]]></c> is a message containing the result of the - function call.</p> - <p>The actual message returned by the rpc server - is a 2-tuple <c><![CDATA[{rex,Reply}]]></c>. If you are using - <c><![CDATA[erl_rpc_from()]]></c> in your code then this is the message you - will need to parse. If you are using <c><![CDATA[erl_rpc()]]></c> then the + <p>Supports calling Erlang functions on remote nodes. + <c>erl_rpc_to()</c> sends an RPC request to a remote node + and <c>erl_rpc_from()</c> receives the results of such a + call. <c>erl_rpc()</c> combines the functionality of + these two functions by sending an RPC request and waiting for the + results. See also <seealso marker="kernel:rpc#call/4"> + <c>rpc:call/4</c></seealso> in <c>Kernel</c>.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>timeout</c> is the maximum time (in milliseconds) + to wait for + results. To wait forever, specify <c>ERL_NO_TIMEOUT</c>. + When <c>erl_rpc()</c> calls <c>erl_rpc_from()</c>, the call will + never timeout.</item> + <item><c>mod</c> is the name of the module containing the + function to be run on the remote node.</item> + <item><c>fun</c> is the name of the function to run. + </item> + <item><c>args</c> is an Erlang list, containing the + arguments to be passed to the function.</item> + <item><c>emsg</c> is a message containing the result of + the function call.</item> + </list> + <p>The actual message returned by the RPC server + is a 2-tuple <c>{rex,Reply}</c>. If you use + <c>erl_rpc_from()</c> in your code, this is the message + you will need to parse. If you use <c>erl_rpc()</c>, the tuple itself is parsed for you, and the message returned to your - program is the erlang term containing <c><![CDATA[Reply]]></c> only. Replies - to rpc requests are always ERL_SEND messages. - </p> + program is the Erlang term containing <c>Reply</c> only. + Replies to RPC requests are always <c>ERL_SEND</c> messages.</p> <note> <p>It is the caller's responsibility to free the returned - <c><![CDATA[ETERM]]></c> structure as well as the memory pointed to by - <c><![CDATA[emsg->msg]]></c> and <c><![CDATA[emsg->to]]></c>. </p> + <c>ETERM</c> structure and the memory pointed to by + <c>emsg->msg</c> and <c>emsg->to</c>.</p> </note> - <p><c><![CDATA[erl_rpc()]]></c> returns the remote function's return value (or - <c><![CDATA[NULL]]></c> if it failed). <c><![CDATA[erl_rpc_to()]]></c> returns 0 on - success, and a negative number on failure. <c><![CDATA[erl_rcp_from()]]></c> - returns <c><![CDATA[ERL_MSG]]></c> when successful (with <c><![CDATA[Emsg]]></c> now - containing the reply tuple), and one of <c><![CDATA[ERL_TICK]]></c>, - <c><![CDATA[ERL_TIMEOUT]]></c> and <c><![CDATA[ERL_ERROR]]></c> otherwise. When failing, - all three functions set <c><![CDATA[erl_errno]]></c> to one of:</p> + <p><c>erl_rpc()</c> returns the remote function's return + value on success, otherwise <c>NULL</c>.</p> + <p><c>erl_rpc_to()</c> returns <c>0</c> on + success, otherwise a negative number.</p> + <p><c>erl_rcp_from()</c> returns <c>ERL_MSG</c> + on success (with <c>Emsg</c> now + containing the reply tuple), otherwise one of + <c>ERL_TICK</c>, <c>ERL_TIMEOUT</c>, or + <c>ERL_ERROR</c>.</p> + <p>When failing, + all three functions set <c>erl_errno</c> to one of:</p> <taglist> - <tag><c><![CDATA[ENOMEM]]></c></tag> - <item>No more memory available.</item> - <tag><c><![CDATA[EIO]]></c></tag> + <tag><c>ENOMEM</c></tag> + <item>No more memory is available.</item> + <tag><c>EIO</c></tag> <item>I/O error.</item> - <tag><c><![CDATA[ETIMEDOUT]]></c></tag> - <item>Timeout expired.</item> - <tag><c><![CDATA[EAGAIN]]></c></tag> + <tag><c>ETIMEDOUT</c></tag> + <item>Timeout has expired.</item> + <tag><c>EAGAIN</c></tag> <item>Temporary error: Try again.</item> </taglist> </desc> </func> + <func> - <name><ret>int</ret><nametext>erl_publish(port)</nametext></name> - <fsummary>Publish a node name</fsummary> + <name><ret>int</ret><nametext>erl_send(fd, to, msg)</nametext></name> + <fsummary>Send a message.</fsummary> <type> - <v>int port;</v> + <v>int fd;</v> + <v>ETERM *to, *msg;</v> </type> <desc> - <p>These functions are used by a server process to register - with the local name server <em>epmd</em>, thereby allowing - other processes to send messages by using the registered name. - Before calling either of these functions, the process should - have called <c><![CDATA[bind()]]></c> and <c><![CDATA[listen()]]></c> on an open socket.</p> - <p><c><![CDATA[port]]></c> is the local name to register, and should be the - same as the port number that was previously bound to the socket.</p> - <p>To unregister with epmd, simply close the returned - descriptor. - </p> - <p>On success, the functions return a descriptor connecting the - calling process to epmd. On failure, they return -1 and set - <c><![CDATA[erl_errno]]></c> to:</p> + <p>Sends an Erlang term to a process.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>to</c> is an Erlang term containing the pid of + the intended recipient of the message.</item> + <item>><c>msg</c> is the Erlang term to be sent.</item> + </list> + <p>Returns <c>1</c> on success, otherwise <c>0</c>. In + the latter case <c>erl_errno</c> is set to one of:</p> <taglist> - <tag><c><![CDATA[EIO]]></c></tag> - <item>I/O error</item> + <tag><c>EINVAL</c></tag> + <item>Invalid argument: <c>to</c> is not a valid Erlang + pid.</item> + <tag><c>ENOMEM</c></tag> + <item>No more memory is available.</item> + <tag><c>EIO</c></tag> + <item>I/O error.</item> </taglist> - <p>Additionally, <c><![CDATA[errno]]></c> values from <c><![CDATA[socket]]></c><em>(2)</em> - and <c><![CDATA[connect]]></c><em>(2)</em> system calls may be propagated - into <c><![CDATA[erl_errno]]></c>. - </p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>erl_accept(listensock, conp)</nametext></name> - <fsummary>Accept a connection</fsummary> - <type> - <v>int listensock;</v> - <v>ErlConnect *conp;</v> - </type> - <desc> - <p>This function is used by a server process to accept a - connection from a client process.</p> - <p><c><![CDATA[listensock]]></c> is an open socket descriptor on which - <c><![CDATA[listen()]]></c> has previously been called.</p> - <p><c><![CDATA[conp]]></c> is a pointer to an <c><![CDATA[ErlConnect]]></c> struct, - described as follows:</p> - <code type="none"><![CDATA[ -typedef struct { - char ipadr[4]; - char nodename[MAXNODELEN]; -} ErlConnect; - ]]></code> - <p>On success, <c><![CDATA[conp]]></c> is filled in with the address and - node name of the connecting client and a file descriptor is - returned. On failure, <c><![CDATA[ERL_ERROR]]></c> is returned and - <c><![CDATA[erl_errno]]></c> is set to <c><![CDATA[EIO]]></c>.</p> </desc> </func> + <func> - <name><ret>const char *</ret><nametext>erl_thiscookie()</nametext></name> - <name><ret>const char *</ret><nametext>erl_thisnodename()</nametext></name> - <name><ret>const char *</ret><nametext>erl_thishostname()</nametext></name> <name><ret>const char *</ret><nametext>erl_thisalivename()</nametext></name> + <name><ret>const char *</ret><nametext>erl_thiscookie()</nametext></name> <name><ret>short</ret><nametext>erl_thiscreation()</nametext></name> - <fsummary>Retrieve some values</fsummary> + <name><ret>const char *</ret><nametext>erl_thishostname()</nametext></name> + <name><ret>const char *</ret><nametext>erl_thisnodename()</nametext></name> + <fsummary>Retrieve some values.</fsummary> <desc> - <p>These functions can be used to retrieve information about - the C Node. These values are initially set with - <c><![CDATA[erl_connect_init()]]></c> or <c><![CDATA[erl_connect_xinit()]]></c>.</p> + <p>Retrieves information about + the C-node. These values are initially set with + <c>erl_connect_init()</c> or + <c>erl_connect_xinit()</c>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_unpublish(alive)</nametext></name> - <fsummary>Forcefully unpublish a node name</fsummary> + <fsummary>Forcefully unpublish a node name.</fsummary> <type> <v>char *alive;</v> </type> <desc> <p>This function can be called by a process to unregister a - specified node from epmd on the localhost. This is however usually not - allowed, unless epmd was started with the -relaxed_command_check - flag, which it normally isn't.</p> - - <p>To unregister a node you have published, you should instead - close the descriptor that was returned by - <c><![CDATA[ei_publish()]]></c>.</p> - + specified node from EPMD on the local host. This is, however, usually + not allowed, unless EPMD was started with flag + <c>-relaxed_command_check</c>, which it normally is not.</p> + <p>To unregister a node you have published, you should instead + close the descriptor that was returned by + <c>ei_publish()</c>.</p> <warning> - <p>This function is deprecated and will be removed in a future - release.</p> + <p>This function is deprecated and will be removed in a future + release.</p> </warning> - <p><c><![CDATA[alive]]></c> is the name of the node to unregister, i.e., the - first component of the nodename, without the <c><![CDATA[@hostname]]></c>.</p> - <p>If the node was successfully unregistered from epmd, the - function returns 0. Otherwise, it returns -1 and sets - <c><![CDATA[erl_errno]]></c> is to <c><![CDATA[EIO]]></c>.</p> + <p><c>alive</c> is the name of the node to unregister, that + is, the first component of the node name, without + <c>@hostname</c>.</p> + <p>If the node was successfully unregistered from EPMD, <c>0</c> is + returned, otherwise <c>-1</c> is returned and + <c>erl_errno</c> is set to <c>EIO</c>.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>erl_xreceive_msg(fd, bufpp, bufsizep, emsg)</nametext></name> + <fsummary>Receive and decode a message.</fsummary> + <type> + <v>int fd;</v> + <v>unsigned char **bufpp;</v> + <v>int *bufsizep;</v> + <v>ErlMessage *emsg;</v> + </type> + <desc> + <p>Similar to <c>erl_receive_msg</c>. The difference is + that <c>erl_xreceive_msg</c> expects the buffer to + have been allocated by <c>malloc</c>, and reallocates it + if the received + message does not fit into the original buffer. Therefore + both buffer and buffer length are given as pointers; their values + can change by the call.</p> + <p>On success, the function returns <c>ERL_MSG</c> and the + <c>Emsg</c> struct is initialized as described above, or + <c>ERL_TICK</c>, in which case no message is returned. On + failure, the function returns <c>ERL_ERROR</c> and sets + <c>erl_errno</c> to one of:</p> + <taglist> + <tag><c>EMSGSIZE</c></tag> + <item>Buffer is too small.</item> + <tag><c>ENOMEM</c></tag> + <item>No more memory is available.</item> + <tag><c>EIO</c></tag> + <item>I/O error.</item> + </taglist> </desc> </func> + <func> - <name><ret>struct hostent</ret><nametext>*erl_gethostbyname(name)</nametext></name> <name><ret>struct hostent</ret><nametext>*erl_gethostbyaddr(addr, length, type)</nametext></name> - <name><ret>struct hostent</ret><nametext>*erl_gethostbyname_r(name, hostp, buffer, buflen, h_errnop)</nametext></name> <name><ret>struct hostent</ret><nametext>*erl_gethostbyaddr_r(addr, length, type, hostp, buffer, buflen, h_errnop)</nametext></name> - <fsummary>Name lookup functions</fsummary> + <name><ret>struct hostent</ret><nametext>*erl_gethostbyname(name)</nametext></name> + <name><ret>struct hostent</ret><nametext>*erl_gethostbyname_r(name, hostp, buffer, buflen, h_errnop)</nametext></name> + + <fsummary>Name lookup functions.</fsummary> <type> <v>const char *name;</v> <v>const char *addr;</v> @@ -550,7 +633,7 @@ typedef struct { <v>int *h_errnop;</v> </type> <desc> - <p>These are convenience functions for some common name lookup functions.</p> + <p>Convenience functions for some common name lookup functions.</p> </desc> </func> </funcs> @@ -558,13 +641,13 @@ typedef struct { <section> <title>Debug Information</title> <p>If a connection attempt fails, the following can be checked:</p> + <list type="bulleted"> - <item><c><![CDATA[erl_errno]]></c></item> - <item>that the right cookie was used</item> - <item>that <em>epmd</em> is running</item> - <item>the remote Erlang node on the other side is running the same - version of Erlang as the <c><![CDATA[erl_interface]]></c> library.</item> + <item><c>erl_errno</c></item> + <item>That the correct cookie was used</item> + <item>That EPMD is running</item> + <item>That the remote Erlang node on the other side is running the same + version of Erlang as the <c>erl_interface</c> library</item> </list> </section> </cref> - diff --git a/lib/erl_interface/doc/src/erl_error.xml b/lib/erl_interface/doc/src/erl_error.xml index abe84780e1..8139c9b343 100644 --- a/lib/erl_interface/doc/src/erl_error.xml +++ b/lib/erl_interface/doc/src/erl_error.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>erl_error</title> @@ -28,61 +28,66 @@ <docno></docno> <approved>Bjarne Däcker</approved> <checked>Torbjörn Törnkvist</checked> - <date>961014</date> + <date>1996-10-14</date> <rev>A</rev> - <file>erl_error.sgml</file> + <file>erl_error.xml</file> </header> <lib>erl_error</lib> - <libsummary>Error Print Routines</libsummary> + <libsummary>Error print routines.</libsummary> <description> <p>This module contains some error printing routines taken - from <em>Advanced Programming in the UNIX Environment</em> - by W. Richard Stevens. </p> + from "Advanced Programming in the UNIX Environment" + by W. Richard Stevens.</p> + <p>These functions are all called in the same manner as - <c><![CDATA[printf()]]></c>, i.e. with a string containing format specifiers - followed by a list of corresponding arguments. All output from - these functions is to <c><![CDATA[stderr]]></c>.</p> + <c>printf()</c>, that is, with a string containing format + specifiers followed by a list of corresponding arguments. All output from + these functions is to <c>stderr</c>.</p> </description> + <funcs> <func> <name><ret>void</ret><nametext>erl_err_msg(FormatStr, ... )</nametext></name> - <fsummary>Non-fatal error, and not system call error</fsummary> + <fsummary>Non-fatal error, and not system call error.</fsummary> <type> <v>const char *FormatStr;</v> </type> <desc> <p>The message provided by the caller is printed. This - function is simply a wrapper for <c><![CDATA[fprintf()]]></c>.</p> + function is simply a wrapper for <c>fprintf()</c>.</p> </desc> </func> + <func> <name><ret>void</ret><nametext>erl_err_quit(FormatStr, ... )</nametext></name> - <fsummary>Fatal error, but not system call error</fsummary> + <fsummary>Fatal error, but not system call error.</fsummary> <type> <v>const char *FormatStr;</v> </type> <desc> <p>Use this function when a fatal error has occurred that - is not due to a system call. The message provided by the - caller is printed and the process terminates with an exit - value of 1. The function does not return.</p> + is not because of a system call. The message provided by the + caller is printed and the process terminates with exit + value <c>1</c>. This function does not return.</p> </desc> </func> + <func> <name><ret>void</ret><nametext>erl_err_ret(FormatStr, ... )</nametext></name> - <fsummary>Non-fatal system call error</fsummary> + <fsummary>Non-fatal system call error.</fsummary> <type> <v>const char *FormatStr;</v> </type> <desc> <p>Use this function after a failed system call. The message provided by the caller is printed followed by a string - describing the reason for failure. </p> + describing the reason for failure.</p> </desc> </func> + <func> <name><ret>void</ret><nametext>erl_err_sys(FormatStr, ... )</nametext></name> - <fsummary>Fatal system call error</fsummary> + <fsummary>Fatal system call error.</fsummary> <type> <v>const char *FormatStr;</v> </type> @@ -90,7 +95,7 @@ <p>Use this function after a failed system call. The message provided by the caller is printed followed by a string describing the reason for failure, and the process - terminates with an exit value of 1. The function does not + terminates with exit value <c>1</c>. This function does not return.</p> </desc> </func> @@ -98,40 +103,43 @@ <section> <title>Error Reporting</title> - <p>Most functions in erl_interface report failures to the caller by - returning some otherwise meaningless value (typically <c><![CDATA[NULL]]></c> + <p>Most functions in <c>Erl_Interface</c> report failures to the caller by + returning some otherwise meaningless value (typically + <c>NULL</c> or a negative number). As this only tells you that things did not - go well, you will have to examine the error code in - <c><![CDATA[erl_errno]]></c> if you want to find out more about the failure.</p> + go well, examine the error code in <c>erl_errno</c> if you + want to find out more about the failure.</p> </section> + <funcs> <func> <name><ret>volatile int</ret><nametext>erl_errno</nametext></name> - <fsummary>The variable <c><![CDATA[erl_errno]]></c>contains the erl_interface error number. You can change the value if you wish. </fsummary> + <fsummary>Variable <c>erl_errno</c> contains the + Erl_Interface error number. You can change the value if you wish. + </fsummary> <desc> - <p><c><![CDATA[erl_errno]]></c> is initially (at program startup) zero and - is then set by many erl_interface functions on failure to a - non-zero error code to indicate what kind of error it - encountered. A successful function call might change - <c><![CDATA[erl_errno]]></c> (by calling some other function that - fails), but no function will ever set it to zero. This means - that you cannot use <c><![CDATA[erl_errno]]></c> to see <em>if</em> a + <p><c>erl_errno</c> is initially (at program startup) zero + and is then set by many <c>Erl_Interface</c> functions on failure to + a non-zero error code to indicate what kind of error it + encountered. A successful function call can change + <c>erl_errno</c> (by calling some other function that + fails), but no function does never set it to zero. This means + that you cannot use <c>erl_errno</c> to see <em>if</em> a function call failed. Instead, each function reports failure in its own way (usually by returning a negative number or - <c><![CDATA[NULL]]></c>), in which case you can examine <c><![CDATA[erl_errno]]></c> - for details.</p> - <p><c><![CDATA[erl_errno]]></c> uses the error codes defined in your - system's <c><![CDATA[<errno.h>]]></c>.</p> + <c>NULL</c>), in which case you can examine + <c>erl_errno</c> for details.</p> + <p><c>erl_errno</c> uses the error codes defined in your + system's <c><errno.h></c>.</p> <note> - <p>Actually, <c><![CDATA[erl_errno]]></c> is a "modifiable lvalue" (just - like ISO C defines <c><![CDATA[errno]]></c> to be) rather than a - variable. This means it might be implemented as a macro - (expanding to, e.g., <c><![CDATA[*_erl_errno()]]></c>). For reasons of - thread- (or task-)safety, this is exactly what we do on most - platforms.</p> + <p><c>erl_errno</c> is a "modifiable lvalue" (just + like ISO C defines <c>errno</c> to be) rather than a + variable. This means it can be implemented as a macro + (expanding to, for example, <c>*_erl_errno()</c>). + For reasons of thread safety (or task safety), this is exactly what + we do on most platforms.</p> </note> </desc> </func> </funcs> </cref> - diff --git a/lib/erl_interface/doc/src/erl_eterm.xml b/lib/erl_interface/doc/src/erl_eterm.xml index 800f8a3207..9a05196a70 100644 --- a/lib/erl_interface/doc/src/erl_eterm.xml +++ b/lib/erl_interface/doc/src/erl_eterm.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>erl_eterm</title> @@ -28,131 +28,145 @@ <docno></docno> <approved>Bjarne Däcker</approved> <checked>Torbjörn Törnkvist</checked> - <date>980703</date> + <date>1998-07-03</date> <rev>A</rev> - <file>erl_eterm.sgml</file> + <file>erl_eterm.xml</file> </header> <lib>erl_eterm</lib> - <libsummary>Functions for Erlang Term Construction</libsummary> + <libsummary>Functions for Erlang term construction.</libsummary> <description> - <p>This module contains functions for creating and manipulating - Erlang terms. </p> + <p>This module provides functions for creating and manipulating + Erlang terms.</p> + <p>An Erlang term is represented by a C structure of type - <c><![CDATA[ETERM]]></c>. Applications should not reference any fields in this - structure directly, because it may be changed in future releases + <c>ETERM</c>. Applications should not reference any fields + in this structure directly, as it can be changed in future releases to provide faster and more compact term storage. Instead, - applications should us the macros and functions provided. </p> - <p>The following macros each take a single ETERM pointer as an - argument. They return a non-zero value if the test is true, and 0 - otherwise:</p> + applications should use the macros and functions provided.</p> + + <p>Each of the following macros takes a single <c>ETERM</c> pointer as an + argument. The macros return a non-zero value if the test is true, + otherwise <c>0</c>.</p> + <taglist> - <tag><c><![CDATA[ERL_IS_INTEGER(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is an integer.</item> - <tag><c><![CDATA[ERL_IS_UNSIGNED_INTEGER(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is an integer.</item> - <tag><c><![CDATA[ERL_IS_FLOAT(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is a floating point number.</item> - <tag><c><![CDATA[ERL_IS_ATOM(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is an atom.</item> - <tag><c><![CDATA[ERL_IS_PID(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is a Pid (process identifier).</item> - <tag><c><![CDATA[ERL_IS_PORT(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is a port.</item> - <tag><c><![CDATA[ERL_IS_REF(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is a reference.</item> - <tag><c><![CDATA[ERL_IS_TUPLE(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is a tuple.</item> - <tag><c><![CDATA[ERL_IS_BINARY(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is a binary.</item> - <tag><c><![CDATA[ERL_IS_LIST(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is a list with zero or more elements.</item> - <tag><c><![CDATA[ERL_IS_EMPTY_LIST(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is an empty list.</item> - <tag><c><![CDATA[ERL_IS_CONS(t)]]></c></tag> - <item>True if <c><![CDATA[t]]></c> is a list with at least one element.</item> + <tag><c>ERL_IS_INTEGER(t)</c></tag> + <item>True if <c>t</c> is an integer.</item> + <tag><c>ERL_IS_UNSIGNED_INTEGER(t)</c></tag> + <item>True if <c>t</c> is an integer.</item> + <tag><c>ERL_IS_FLOAT(t)</c></tag> + <item>True if <c>t</c> is a floating point number.</item> + <tag><c>ERL_IS_ATOM(t)</c></tag> + <item>True if <c>t</c> is an atom.</item> + <tag><c>ERL_IS_PID(t)</c></tag> + <item>True if <c>t</c> is a pid (process identifier).</item> + <tag><c>ERL_IS_PORT(t)</c></tag> + <item>True if <c>t</c> is a port.</item> + <tag><c>ERL_IS_REF(t)</c></tag> + <item>True if <c>t</c> is a reference.</item> + <tag><c>ERL_IS_TUPLE(t)</c></tag> + <item>True if <c>t</c> is a tuple.</item> + <tag><c>ERL_IS_BINARY(t)</c></tag> + <item>True if <c>t</c> is a binary.</item> + <tag><c>ERL_IS_LIST(t)</c></tag> + <item>True if <c>t</c> is a list with zero or more + elements.</item> + <tag><c>ERL_IS_EMPTY_LIST(t)</c></tag> + <item>True if <c>t</c> is an empty list.</item> + <tag><c>ERL_IS_CONS(t)</c></tag> + <item>True if <c>t</c> is a list with at least one + element.</item> </taglist> + <p>The following macros can be used for retrieving parts of Erlang - terms. None of these do any type checking; results are undefined - if you pass an ETERM* containing the wrong type. For example, - passing a tuple to ERL_ATOM_PTR() will likely result in garbage. - </p> + terms. None of these do any type checking. Results are undefined + if you pass an <c>ETERM*</c> containing the wrong type. For example, + passing a tuple to <c>ERL_ATOM_PTR()</c> likely results in garbage.</p> + <taglist> - <tag><c><![CDATA[char *ERL_ATOM_PTR(t)]]></c></tag> - <item/> - <tag><c><![CDATA[char *ERL_ATOM_PTR_UTF8(t)]]></c></tag> - <item>A string representing atom <c><![CDATA[t]]></c>. - </item> - <tag><c><![CDATA[int ERL_ATOM_SIZE(t)]]></c></tag> - <item/> - <tag><c><![CDATA[int ERL_ATOM_SIZE_UTF8(t)]]></c></tag> - <item>The length (in bytes) of atom t.</item> - <tag><c><![CDATA[void *ERL_BIN_PTR(t)]]></c></tag> - <item>A pointer to the contents of <c><![CDATA[t]]></c></item> - <tag><c><![CDATA[int ERL_BIN_SIZE(t)]]></c></tag> - <item>The length (in bytes) of binary object <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_INT_VALUE(t)]]></c></tag> - <item>The integer of <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[unsigned int ERL_INT_UVALUE(t)]]></c></tag> - <item>The unsigned integer value of <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[double ERL_FLOAT_VALUE(t)]]></c></tag> - <item>The floating point value of <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[ETERM *ERL_PID_NODE(t)]]></c></tag> - <item/> - <tag><c><![CDATA[ETERM *ERL_PID_NODE_UTF8(t)]]></c></tag> - <item>The Node in pid <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_PID_NUMBER(t)]]></c></tag> - <item>The sequence number in pid <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_PID_SERIAL(t)]]></c></tag> - <item>The serial number in pid <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_PID_CREATION(t)]]></c></tag> - <item>The creation number in pid <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_PORT_NUMBER(t)]]></c></tag> - <item>The sequence number in port <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_PORT_CREATION(t)]]></c></tag> - <item>The creation number in port <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[ETERM *ERL_PORT_NODE(t)]]></c></tag> - <item/> - <tag><c><![CDATA[ETERM *ERL_PORT_NODE_UTF8(t)]]></c></tag> - <item>The node in port <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_REF_NUMBER(t)]]></c></tag> - <item>The first part of the reference number in ref <c><![CDATA[t]]></c>. Use - only for compatibility.</item> - <tag><c><![CDATA[int ERL_REF_NUMBERS(t)]]></c></tag> - <item>Pointer to the array of reference numbers in ref <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_REF_LEN(t)]]></c></tag> - <item>The number of used reference numbers in ref <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_REF_CREATION(t)]]></c></tag> - <item>The creation number in ref <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[int ERL_TUPLE_SIZE(t)]]></c></tag> - <item>The number of elements in tuple <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[ETERM *ERL_CONS_HEAD(t)]]></c></tag> - <item>The head element of list <c><![CDATA[t]]></c>.</item> - <tag><c><![CDATA[ETERM *ERL_CONS_TAIL(t)]]></c></tag> - <item>A List representing the tail elements of list <c><![CDATA[t]]></c>.</item> + <tag><c>char *ERL_ATOM_PTR(t)</c></tag> + <item></item> + <tag><c>char *ERL_ATOM_PTR_UTF8(t)</c></tag> + <item>A string representing atom <c>t</c>.</item> + <tag><c>int ERL_ATOM_SIZE(t)</c></tag> + <item></item> + <tag><c>int ERL_ATOM_SIZE_UTF8(t)</c></tag> + <item>The length (in bytes) of atom <c>t</c>.</item> + <tag><c>void *ERL_BIN_PTR(t)</c></tag> + <item>A pointer to the contents of <c>t</c>.</item> + <tag><c>int ERL_BIN_SIZE(t)</c></tag> + <item>The length (in bytes) of binary object <c>t</c>.</item> + <tag><c>int ERL_INT_VALUE(t)</c></tag> + <item>The integer of <c>t</c>.</item> + <tag><c>unsigned int ERL_INT_UVALUE(t)</c></tag> + <item>The unsigned integer value of <c>t</c>.</item> + <tag><c>double ERL_FLOAT_VALUE(t)</c></tag> + <item>The floating point value of <c>t</c>.</item> + <tag><c>ETERM *ERL_PID_NODE(t)</c></tag> + <item></item> + <tag><c>ETERM *ERL_PID_NODE_UTF8(t)</c></tag> + <item>The node in pid <c>t</c>.</item> + <tag><c>int ERL_PID_NUMBER(t)</c></tag> + <item>The sequence number in pid <c>t</c>.</item> + <tag><c>int ERL_PID_SERIAL(t)</c></tag> + <item>The serial number in pid <c>t</c>.</item> + <tag><c>int ERL_PID_CREATION(t)</c></tag> + <item>The creation number in pid <c>t</c>.</item> + <tag><c>int ERL_PORT_NUMBER(t)</c></tag> + <item>The sequence number in port <c>t</c>.</item> + <tag><c>int ERL_PORT_CREATION(t)</c></tag> + <item>The creation number in port <c>t</c>.</item> + <tag><c>ETERM *ERL_PORT_NODE(t)</c></tag> + <item></item> + <tag><c>ETERM *ERL_PORT_NODE_UTF8(t)</c></tag> + <item>The node in port <c>t</c>.</item> + <tag><c>int ERL_REF_NUMBER(t)</c></tag> + <item>The first part of the reference number in ref <c>t</c>. + Use only for compatibility.</item> + <tag><c>int ERL_REF_NUMBERS(t)</c></tag> + <item>Pointer to the array of reference numbers in ref + <c>t</c>.</item> + <tag><c>int ERL_REF_LEN(t)</c></tag> + <item>The number of used reference numbers in ref + <c>t</c>.</item> + <tag><c>int ERL_REF_CREATION(t)</c></tag> + <item>The creation number in ref <c>t</c>.</item> + <tag><c>int ERL_TUPLE_SIZE(t)</c></tag> + <item>The number of elements in tuple <c>t</c>.</item> + <tag><c>ETERM *ERL_CONS_HEAD(t)</c></tag> + <item>The head element of list <c>t</c>.</item> + <tag><c>ETERM *ERL_CONS_TAIL(t)</c></tag> + <item>A list representing the tail elements of list + <c>t</c>.</item> </taglist> </description> + <funcs> <func> <name><ret>ETERM *</ret><nametext>erl_cons(head, tail)</nametext></name> - <fsummary>Prepends a term to the head of a list.</fsummary> + <fsummary>Prepend a term to the head of a list.</fsummary> <type> <v>ETERM *head;</v> <v>ETERM *tail;</v> </type> <desc> - <p>This function concatenates two Erlang terms, prepending - <c><![CDATA[head]]></c> onto <c><![CDATA[tail]]></c> and thereby creating a <c><![CDATA[cons]]></c> cell. - To make a proper list, <c><![CDATA[tail]]></c> should always be a - list or an empty list. Note that NULL is not a valid list.</p> - <p><c><![CDATA[head]]></c> is the new term to be added.</p> - <p><c><![CDATA[tail]]></c> is the existing list to which <c><![CDATA[head]]></c> will - be concatenated.</p> + <p>Concatenates two Erlang terms, prepending <c>head</c> + onto <c>tail</c> and thereby creating a + <c>cons</c> cell. + To make a proper list, <c>tail</c> is always to be a list + or an empty list. Notice that <c>NULL</c> is not a valid list.</p> + <list type="bulleted"> + <item><c>head</c> is the new term to be added.</item> + <item><c>tail</c> is the existing list to which + <c>head</c> is concatenated.</item> + </list> <p>The function returns a new list.</p> - <p><c><![CDATA[ERL_CONS_HEAD(list)]]></c> and <c><![CDATA[ERL_CONS_TAIL(list)]]></c> + <p><c>ERL_CONS_HEAD(list)</c> and + <c>ERL_CONS_TAIL(list)</c> can be used to retrieve the head and tail components - from the list. <c><![CDATA[erl_hd(list)]]></c> and <c><![CDATA[erl_tl(list)]]></c> will do + from the list. <c>erl_hd(list)</c> and + <c>erl_tl(list)</c> do the same thing, but check that the argument really is a list.</p> - <p>For example:</p> + <p><em>Example:</em></p> <code type="none"><![CDATA[ ETERM *list,*anAtom,*anInt; anAtom = erl_mk_atom("madonna"); @@ -165,79 +179,102 @@ erl_free_compound(list); ]]></code> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_copy_term(term)</nametext></name> - <fsummary>Creates a copy of an Erlang term</fsummary> + <fsummary>Create a copy of an Erlang term.</fsummary> <type> <v>ETERM *term;</v> </type> <desc> - <p>This function creates and returns a copy of the Erlang term - <c><![CDATA[term]]></c>.</p> + <p>Creates and returns a copy of the Erlang term + <c>term</c>.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_element(position, tuple)</nametext></name> - <fsummary>Extracts an element from an Erlang tuple</fsummary> + <fsummary>Extract an element from an Erlang tuple.</fsummary> <type> <v>int position;</v> <v>ETERM *tuple;</v> </type> <desc> - <p>This function extracts a specified element from an Erlang - tuple. </p> - <p><c><![CDATA[position]]></c> specifies which element to retrieve from - <c><![CDATA[tuple]]></c>. The elements are numbered starting from 1.</p> - <p><c><![CDATA[tuple]]></c> is an Erlang term containing at least - <c><![CDATA[position]]></c> elements.</p> - <p>The function returns a new Erlang term corresponding to the - requested element, or NULL if <c><![CDATA[position]]></c> was greater than - the arity of <c><![CDATA[tuple]]></c>.</p> + <p>Extracts a specified element from an Erlang tuple.</p> + <list type="bulleted"> + <item><c>position</c> specifies which element to retrieve + from <c>tuple</c>. The elements are numbered starting + from 1.</item> + <item><c>tuple</c> is an Erlang term containing at least + <c>position</c> elements.</item> + </list> + <p>Returns a new Erlang term corresponding to the requested element, or + <c>NULL</c> if <c>position</c> was greater + than the arity of <c>tuple</c>.</p> + </desc> + </func> + + <func> + <name><ret>ETERM *</ret><nametext>erl_hd(list)</nametext></name> + <fsummary>Extract the first element from a list.</fsummary> + <type> + <v>ETERM *list;</v> + </type> + <desc> + <p>Extracts the first element from a list.</p> + <p><c>list</c> is an Erlang term containing a list.</p> + <p>Returns an Erlang term corresponding to the head + head element in the list, or a <c>NULL</c> pointer if + <c>list</c> was not a list.</p> </desc> </func> + <func> <name><ret>void</ret><nametext>erl_init(NULL, 0)</nametext></name> - <fsummary>Initialization routine</fsummary> + <fsummary>Initialization routine.</fsummary> <type> <v>void *NULL;</v> <v>int 0;</v> </type> <desc> - <marker id="erl_init"></marker> - <p>This function must be called before any of the others in - the <c><![CDATA[erl_interface]]></c> library in order to initialize the - library functions. The arguments must be specified as - <c><![CDATA[erl_init(NULL,0)]]></c>.</p> + <p>This function must be called before any of the others in the + <c>Erl_Interface</c> library to initialize the + library functions. The arguments must be specified as + <c>erl_init(NULL,0)</c>.</p> </desc> </func> + <func> - <name><ret>ETERM *</ret><nametext>erl_hd(list)</nametext></name> - <fsummary>Extracts the first element from a list</fsummary> + <name><ret>int</ret><nametext>erl_iolist_length(list)</nametext></name> + <fsummary>Return the length of an I/O list.</fsummary> <type> <v>ETERM *list;</v> </type> <desc> - <p>Extracts the first element from a list.</p> - <p><c><![CDATA[list]]></c> is an Erlang term containing a list.</p> - <p>The function returns an Erlang term corresponding to the - head element in the list, or a NULL pointer if <c><![CDATA[list]]></c> was - not a list.</p> + <p>Returns the length of an I/O list.</p> + <p><c>list</c> is an Erlang term containing an I/O list.</p> + <p>Returns the length of <c>list</c>, or + <c>-1</c> if <c>list</c> is not an I/O list.</p> + <p>For the definition of an I/O list, see + <seealso marker="#erl_iolist_to_binary"> + <c>erl_iolist_to_binary</c></seealso>.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_iolist_to_binary(term)</nametext></name> - <fsummary>Converts an IO list to a binary</fsummary> + <fsummary>Convert an I/O list to a binary.</fsummary> <type> <v>ETERM *list;</v> </type> <desc> - <p>This function converts an IO list to a binary term.</p> - <p><c><![CDATA[list]]></c> is an Erlang term containing a list.</p> - <p>This function an Erlang binary term, or NULL if <c><![CDATA[list]]></c> - was not an IO list. </p> - <p>Informally, an IO list is a deep list of characters and - binaries which can be sent to an Erlang port. In BNF, an IO - list is formally defined as follows: </p> + <p>Converts an I/O list to a binary term.</p> + <p><c>list</c> is an Erlang term containing a list.</p> + <p>Returns an Erlang binary term, or <c>NULL</c> if + <c>list</c> was not an I/O list.</p> + <p>Informally, an I/O list is a deep list of characters and + binaries that can be sent to an Erlang port. In BNF, an I/O + list is formally defined as follows:</p> <code type="none"><![CDATA[ iolist ::= [] | Binary @@ -250,158 +287,164 @@ iohead ::= Binary ]]></code> </desc> </func> + <func> <name><ret>char *</ret><nametext>erl_iolist_to_string(list)</nametext></name> - <fsummary>Converts an IO list to a zero terminated string</fsummary> + <fsummary>Convert an I/O list to a <c>NULL</c>-terminated string.</fsummary> <type> <v>ETERM *list;</v> </type> <desc> - <p>This function converts an IO list to a '\0' terminated C - string. </p> - <p><c><![CDATA[list]]></c> is an Erlang term containing an IO list. The IO - list must not contain the integer 0, since C strings may not + <p>Converts an I/O list to a <c>NULL</c>-terminated C string.</p> + <p><c>list</c> is an Erlang term containing an I/O list. + The I/O list must not contain the integer 0, as C strings may not contain this value except as a terminating marker.</p> - <p>This function returns a pointer to a dynamically allocated - buffer containing a string. If <c><![CDATA[list]]></c> is not an IO list, - or if <c><![CDATA[list]]></c> contains the integer 0, NULL is returned. It - is the caller's responsibility free the allocated buffer - with <c><![CDATA[erl_free()]]></c>. </p> - <p>Refer to <c><![CDATA[erl_iolist_to_binary()]]></c> for the definition of an - IO list. </p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>erl_iolist_length(list)</nametext></name> - <fsummary>Return the length of an IO list</fsummary> - <type> - <v>ETERM *list;</v> - </type> - <desc> - <p>Returns the length of an IO list. - </p> - <p><c><![CDATA[list]]></c> is an Erlang term containing an IO list. </p> - <p>The function returns the length of <c><![CDATA[list]]></c>, or -1 if - <c><![CDATA[list]]></c> is not an IO list.</p> - <p>Refer to <c><![CDATA[erl_iolist_to_binary()]]></c> for the definition of - an IO list. </p> + <p>Returns a pointer to a dynamically allocated + buffer containing a string. If <c>list</c> is not an I/O + list, or if <c>list</c> contains the integer 0, + <c>NULL</c> is returned. It + is the caller's responsibility to free the allocated buffer + with <c>erl_free()</c>.</p> + <p>For the definition of an I/O list, see + <seealso marker="#erl_iolist_to_binary"> + <c>erl_iolist_to_binary</c></seealso>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_length(list)</nametext></name> - <fsummary>Determines the length of a list</fsummary> + <fsummary>Determine the length of a list.</fsummary> <type> <v>ETERM *list;</v> </type> <desc> <p>Determines the length of a proper list.</p> - <p><c><![CDATA[list]]></c> is an Erlang term containing proper list. In a - proper list, all tails except the last point to another list + <p><c>list</c> is an Erlang term containing a proper list. + In a proper list, all tails except the last point to another list cell, and the last tail points to an empty list.</p> - <p>Returns -1 if <c><![CDATA[list]]></c> is not a proper list.</p> + <p>Returns <c>-1</c> if <c>list</c> is not a proper + list.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_atom(string)</nametext></name> - <fsummary>Creates an atom</fsummary> + <fsummary>Create an atom.</fsummary> <type> <v>const char *string;</v> </type> <desc> <p>Creates an atom.</p> - <p><c><![CDATA[string]]></c> is the sequence of characters that will be + <p><c>string</c> is the sequence of characters that will be used to create the atom.</p> - <p>Returns an Erlang term containing an atom. Note that it is - the callers responsibility to make sure that <c><![CDATA[string]]></c> + <p>Returns an Erlang term containing an atom. Notice that it is + the caller's responsibility to ensure that <c>string</c> contains a valid name for an atom.</p> - <p><c><![CDATA[ERL_ATOM_PTR(atom)]]></c> and <c><![CDATA[ERL_ATOM_PTR_UTF8(atom)]]></c> - can be used to retrieve the atom name (as a null terminated string). <c><![CDATA[ERL_ATOM_SIZE(atom)]]></c> - and <c><![CDATA[ERL_ATOM_SIZE_UTF8(atom)]]></c> returns the length of the atom name.</p> - <note><p>Note that the UTF8 variants were introduced in Erlang/OTP releases R16 - and the string returned by <c>ERL_ATOM_PTR(atom)</c> was not null terminated on older releases.</p> + <p><c>ERL_ATOM_PTR(atom)</c> and + <c>ERL_ATOM_PTR_UTF8(atom)</c> + can be used to retrieve the atom name (as a <c>NULL</c>-terminated string). + <c>ERL_ATOM_SIZE(atom)</c> + and <c>ERL_ATOM_SIZE_UTF8(atom)</c> return the length + of the atom name.</p> + <note> + <p>The UTF-8 variants were introduced in Erlang/OTP R16 and the + string returned by <c>ERL_ATOM_PTR(atom)</c> was not + <c>NULL</c>-terminated on older releases.</p> </note> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_binary(bptr, size)</nametext></name> - <fsummary>Creates a binary object</fsummary> + <fsummary>Create a binary object.</fsummary> <type> <v>char *bptr;</v> <v>int size;</v> </type> <desc> - <p>This function produces an Erlang binary object from a + <p>Produces an Erlang binary object from a buffer containing a sequence of bytes.</p> - <p><c><![CDATA[bptr]]></c> is a pointer to a buffer containing data to be converted.</p> - <p><c><![CDATA[size]]></c> indicates the length of <c><![CDATA[bptr]]></c>.</p> - <p>The function returns an Erlang binary object.</p> - <p><c><![CDATA[ERL_BIN_PTR(bin)]]></c> retrieves a pointer to - the binary data. <c><![CDATA[ERL_BIN_SIZE(bin)]]></c> retrieves the - size. </p> + <list type="bulleted"> + <item><c>bptr</c> is a pointer to a buffer containing + data to be converted.</item> + <item><c>size</c> indicates the length of + <c>bptr</c>.</item> + </list> + <p>Returns an Erlang binary object.</p> + <p><c>ERL_BIN_PTR(bin)</c> retrieves a pointer to + the binary data. <c>ERL_BIN_SIZE(bin)</c> retrieves the + size.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_empty_list()</nametext></name> - <fsummary>Creates an empty Erlang list</fsummary> + <fsummary>Create an empty Erlang list.</fsummary> <desc> - <p>This function creates and returns an empty Erlang list. - Note that NULL is not used to represent an empty list; + <p>Creates and returns an empty Erlang list. + Notice that <c>NULL</c> is not used to represent an empty list; Use this function instead.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_estring(string, len)</nametext></name> - <fsummary>Creates an Erlang string</fsummary> + <fsummary>Create an Erlang string.</fsummary> <type> <v>char *string;</v> <v>int len;</v> </type> <desc> - <p>This function creates a list from a sequence of bytes.</p> - <p><c><![CDATA[string]]></c> is a buffer containing a sequence of - bytes. The buffer does not need to be zero-terminated.</p> - <p><c><![CDATA[len]]></c> is the length of <c><![CDATA[string]]></c>.</p> - <p>The function returns an Erlang list object corresponding to - the character sequence in <c><![CDATA[string]]></c>.</p> + <p>Creates a list from a sequence of bytes.</p> + <list type="bulleted"> + <item><c>string</c> is a buffer containing a sequence of + bytes. The buffer does not need to be <c>NULL</c>-terminated.</item> + <item><c>len</c> is the length of + <c>string</c>.</item> + </list> + <p>Returns an Erlang list object corresponding to + the character sequence in <c>string</c>.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_float(f)</nametext></name> - <fsummary>Creates an Erlang float</fsummary> + <fsummary>Create an Erlang float.</fsummary> <type> <v>double f;</v> </type> <desc> <p>Creates an Erlang float.</p> - <p><c><![CDATA[f]]></c> is a value to be converted to an Erlang float.</p> - <p></p> - <p>The function returns an Erlang float object with the value - specified in <c><![CDATA[f]]></c> or <c><![CDATA[NULL]]></c> if - <c><![CDATA[f]]></c> is not finite. - </p> - <p><c><![CDATA[ERL_FLOAT_VALUE(t)]]></c> can be used to retrieve the - value from an Erlang float.</p> + <p><c>f</c> is a value to be converted to an Erlang + float.</p> + <p>Returns an Erlang float object with the value + specified in <c>f</c> or <c>NULL</c> if + <c>f</c> is not finite.</p> + <p><c>ERL_FLOAT_VALUE(t)</c> can be used to retrieve the + value from an Erlang float.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_int(n)</nametext></name> - <fsummary>Creates an Erlang integer</fsummary> + <fsummary>Create an Erlang integer.</fsummary> <type> <v>int n;</v> </type> <desc> <p>Creates an Erlang integer.</p> - <p><c><![CDATA[n]]></c> is a value to be converted to an Erlang integer.</p> - <p></p> - <p>The function returns an Erlang integer object with the - value specified in <c><![CDATA[n]]></c>.</p> - <p><c><![CDATA[ERL_INT_VALUE(t)]]></c> can be used to retrieve the value + <p><c>n</c> is a value to be converted to an Erlang + integer.</p> + <p>Returns an Erlang integer object with the + value specified in <c>n</c>.</p> + <p><c>ERL_INT_VALUE(t)</c> can be used to retrieve the value from an Erlang integer.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_list(array, arrsize)</nametext></name> - <fsummary>Creates a list from an array</fsummary> + <fsummary>Create a list from an array.</fsummary> <type> <v>ETERM **array;</v> <v>int arrsize;</v> @@ -409,280 +452,316 @@ iohead ::= Binary <desc> <p>Creates an Erlang list from an array of Erlang terms, such that each element in the list corresponds to one element in - the array. </p> - <p><c><![CDATA[array]]></c> is an array of Erlang terms.</p> - <p><c><![CDATA[arrsize]]></c> is the number of elements in <c><![CDATA[array]]></c>.</p> + the array.</p> + <list type="bulleted"> + <item><c>array</c> is an array of Erlang terms.</item> + <item><c>arrsize</c> is the number of elements in + <c>array</c>.</item> + </list> <p>The function creates an Erlang list object, whose length - <c><![CDATA[arrsize]]></c> and whose elements are taken from the terms in - <c><![CDATA[array]]></c>.</p> + <c>arrsize</c> and whose elements are taken from the + terms in <c>array</c>.</p> </desc> </func> + <func> - <name><ret>ETERM *</ret><nametext>erl_mk_pid(node, number, serial, creation)</nametext></name> - <fsummary>Creates a process identifier</fsummary> + <name><ret>ETERM *</ret><nametext>erl_mk_long_ref(node, n1, n2, n3, creation)</nametext></name> + <fsummary>Create an Erlang reference.</fsummary> <type> <v>const char *node;</v> - <v>unsigned int number;</v> - <v>unsigned int serial;</v> + <v>unsigned int n1, n2, n3;</v> <v>unsigned int creation;</v> </type> <desc> - <p>This function creates an Erlang process identifier. The - resulting pid can be used by Erlang processes wishing to - communicate with the C node.</p> - <p><c><![CDATA[node]]></c> is the name of the C node.</p> - <p><c><![CDATA[number]]></c>, <c><![CDATA[serial]]></c> and <c><![CDATA[creation]]></c> are - arbitrary numbers. Note though, that these are limited in - precision, so only the low 15, 3 and 2 bits of these numbers - are actually used.</p> - <p>The function returns an Erlang pid object.</p> - <p><c><![CDATA[ERL_PID_NODE(pid)]]></c>, <c><![CDATA[ERL_PID_NUMBER(pid)]]></c>, - <c><![CDATA[ERL_PID_SERIAL(pid)]]></c> and <c><![CDATA[ERL_PID_CREATION(pid)]]></c> - can be used to retrieve the four values used to create the pid.</p> + <p>Creates an Erlang reference, with 82 bits.</p> + <list type="bulleted"> + <item><c>node</c> is the name of the C-node.</item> + <item><c>n1</c>, <c>n2</c>, and + <c>n3</c> can be seen as one big number + <c>n1*2^64+n2*2^32+n3</c>, which is to be chosen + uniquely for each reference created for a given C-node.</item> + <item><c>creation</c> is an arbitrary number.</item> + </list> + <p>Notice that <c>n3</c> and <c>creation</c> + are limited in precision, so only the low 18 and 2 bits of these + numbers are used.</p> + <p>Returns an Erlang reference object.</p> + <p><c>ERL_REF_NODE(ref)</c>, + <c>ERL_REF_NUMBERS(ref)</c>, + <c>ERL_REF_LEN(ref)</c>, and + <c>ERL_REF_CREATION(ref)</c> can be used to retrieve the + values used to create the reference.</p> </desc> </func> + <func> - <name><ret>ETERM *</ret><nametext>erl_mk_port(node, number, creation)</nametext></name> - <fsummary>Creates a port identifier</fsummary> + <name><ret>ETERM *</ret><nametext>erl_mk_pid(node, number, serial, creation)</nametext></name> + <fsummary>Create a process identifier.</fsummary> <type> <v>const char *node;</v> <v>unsigned int number;</v> + <v>unsigned int serial;</v> <v>unsigned int creation;</v> </type> <desc> - <p>This function creates an Erlang port identifier. </p> - <p><c><![CDATA[node]]></c> is the name of the C node.</p> - <p><c><![CDATA[number]]></c> and <c><![CDATA[creation]]></c> are arbitrary numbers. - Note though, that these are limited in - precision, so only the low 18 and 2 bits of these numbers - are actually used.</p> - <p>The function returns an Erlang port object.</p> - <p><c><![CDATA[ERL_PORT_NODE(port)]]></c>, <c><![CDATA[ERL_PORT_NUMBER(port)]]></c> - and <c><![CDATA[ERL_PORT_CREATION]]></c> can be used to retrieve the three - values used to create the port. </p> + <p>Creates an Erlang process identifier (pid). The + resulting pid can be used by Erlang processes wishing to + communicate with the C-node.</p> + <list type="bulleted"> + <item><c>node</c> is the name of the C-node.</item> + <item><c>number</c>, <c>serial</c>, and + <c>creation</c> are + arbitrary numbers. Notice that these are limited in + precision, so only the low 15, 3, and 2 bits of these numbers + are used.</item> + </list> + <p>Returns an Erlang pid object.</p> + <p><c>ERL_PID_NODE(pid)</c>, + <c>ERL_PID_NUMBER(pid)</c>, + <c>ERL_PID_SERIAL(pid)</c>, and + <c>ERL_PID_CREATION(pid)</c> + can be used to retrieve the four values used to create the pid.</p> </desc> </func> + <func> - <name><ret>ETERM *</ret><nametext>erl_mk_ref(node, number, creation)</nametext></name> - <fsummary>Creates an old Erlang reference</fsummary> + <name><ret>ETERM *</ret><nametext>erl_mk_port(node, number, creation)</nametext></name> + <fsummary>Create a port identifier.</fsummary> <type> <v>const char *node;</v> <v>unsigned int number;</v> <v>unsigned int creation;</v> </type> <desc> - <p>This function creates an old Erlang reference, with - only 18 bits - use <c><![CDATA[erl_mk_long_ref]]></c> instead.</p> - <p><c><![CDATA[node]]></c> is the name of the C node.</p> - <p><c><![CDATA[number]]></c> should be chosen uniquely for each reference - created for a given C node.</p> - <p><c><![CDATA[creation]]></c> is an arbitrary number.</p> - <p>Note that <c><![CDATA[number]]></c> and <c><![CDATA[creation]]></c> are limited in - precision, so only the low 18 and 2 bits of these numbers - are actually used. - </p> - <p>The function returns an Erlang reference object.</p> - <p><c><![CDATA[ERL_REF_NODE(ref)]]></c>, <c><![CDATA[ERL_REF_NUMBER(ref)]]></c>, and - <c><![CDATA[ERL_REF_CREATION(ref)]]></c> to retrieve the three values used - to create the reference. </p> + <p>Creates an Erlang port identifier.</p> + <list type="bulleted"> + <item><c>node</c> is the name of the C-node.</item> + <item><c>number</c> and <c>creation</c> are + arbitrary numbers. Notice that these are limited in + precision, so only the low 18 and 2 bits of these numbers + are used.</item> + </list> + <p>Returns an Erlang port object.</p> + <p><c>ERL_PORT_NODE(port)</c>, + <c>ERL_PORT_NUMBER(port)</c>, + and <c>ERL_PORT_CREATION</c> can be used to retrieve the + three values used to create the port.</p> </desc> </func> + <func> - <name><ret>ETERM *</ret><nametext>erl_mk_long_ref(node, n1, n2, n3, creation)</nametext></name> - <fsummary>Creates an Erlang reference</fsummary> + <name><ret>ETERM *</ret><nametext>erl_mk_ref(node, number, creation)</nametext></name> + <fsummary>Create an old Erlang reference.</fsummary> <type> <v>const char *node;</v> - <v>unsigned int n1, n2, n3;</v> + <v>unsigned int number;</v> <v>unsigned int creation;</v> </type> <desc> - <p>This function creates an Erlang reference, with 82 bits.</p> - <p><c><![CDATA[node]]></c> is the name of the C node.</p> - <p><c><![CDATA[n1]]></c>, <c><![CDATA[n2]]></c> and <c><![CDATA[n3]]></c> can be seen as one big number - <c><![CDATA[n1*2^64+n2*2^32+n3]]></c> which should be chosen uniquely for - each reference - created for a given C node.</p> - <p><c><![CDATA[creation]]></c> is an arbitrary number.</p> - <p>Note that <c><![CDATA[n3]]></c> and <c><![CDATA[creation]]></c> are limited in - precision, so only the low 18 and 2 bits of these numbers - are actually used. - </p> - <p>The function returns an Erlang reference object.</p> - <p><c><![CDATA[ERL_REF_NODE(ref)]]></c>, <c><![CDATA[ERL_REF_NUMBERS(ref)]]></c>, - <c><![CDATA[ERL_REF_LEN(ref)]]></c> and - <c><![CDATA[ERL_REF_CREATION(ref)]]></c> to retrieve the values used - to create the reference. </p> + <p>Creates an old Erlang reference, with + only 18 bits - use <c>erl_mk_long_ref</c> instead.</p> + <list type="bulleted"> + <item><c>node</c> is the name of the C-node.</item> + <item><c>number</c> is to be chosen uniquely for each + reference created for a given C-node.</item> + <item><c>creation</c> is an arbitrary number.</item> + </list> + <p>Notice that <c>number</c> and <c>creation</c> + are limited in precision, so only the low 18 and 2 bits of these + numbers are used.</p> + <p>Returns an Erlang reference object.</p> + <p><c>ERL_REF_NODE(ref)</c>, + <c>ERL_REF_NUMBER(ref)</c>, and + <c>ERL_REF_CREATION(ref)</c> can be used to retrieve the + three values used to create the reference.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_string(string)</nametext></name> - <fsummary>Creates a string</fsummary> + <fsummary>Create a string.</fsummary> <type> <v>char *string;</v> </type> <desc> - <p>This function creates a list from a zero terminated string.</p> - <p><c><![CDATA[string]]></c> is the zero-terminated sequence of characters - (i.e. a C string) from which the list will be created.</p> - <p>The function returns an Erlang list.</p> + <p>Creates a list from a <c>NULL</c>-terminated string.</p> + <p><c>string</c> is a <c>NULL</c>-terminated sequence of + characters + (that is, a C string) from which the list will be created.</p> + <p>Returns an Erlang list.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_tuple(array, arrsize)</nametext></name> - <fsummary>Creates an Erlang tuple from an array</fsummary> + <fsummary>Create an Erlang tuple from an array.</fsummary> <type> <v>ETERM **array;</v> <v>int arrsize;</v> </type> <desc> <p>Creates an Erlang tuple from an array of Erlang terms.</p> - <p><c><![CDATA[array]]></c> is an array of Erlang terms.</p> - <p><c><![CDATA[arrsize]]></c> is the number of elements in <c><![CDATA[array]]></c>.</p> + <list type="bulleted"> + <item><c>array</c> is an array of Erlang terms.</item> + <item><c>arrsize</c> is the number of elements in + <c>array</c>.</item> + </list> <p>The function creates an Erlang tuple, whose arity is - <c><![CDATA[size]]></c> and whose elements are taken from the terms in - <c><![CDATA[array]]></c>.</p> - <p>To retrieve the size of a tuple, either use the - <c><![CDATA[erl_size]]></c> function (which checks the type of the checked - term and works for a binary as well as for a tuple), or the - <c><![CDATA[ERL_TUPLE_SIZE(tuple)]]></c> returns the arity of a tuple. - <c><![CDATA[erl_size()]]></c> will do the same thing, but it checks that - the argument really is a tuple. - <c><![CDATA[erl_element(index,tuple)]]></c> returns the element - corresponding to a given position in the tuple. </p> + <c>size</c> and whose elements are taken from the terms + in <c>array</c>.</p> + <p>To retrieve the size of a tuple, either use function + <c>erl_size</c> (which checks the type of the + checked term and works for a binary as well as for a tuple) or + <c>ERL_TUPLE_SIZE(tuple)</c> returns the arity of a tuple. + <c>erl_size()</c> does the same thing, but it checks + that the argument is a tuple. + <c>erl_element(index,tuple)</c> returns the element + corresponding to a given position in the tuple.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_uint(n)</nametext></name> - <fsummary>Creates an unsigned integer</fsummary> + <fsummary>Create an unsigned integer.</fsummary> <type> <v>unsigned int n;</v> </type> <desc> <p>Creates an Erlang unsigned integer.</p> - <p><c><![CDATA[n]]></c> is a value to be converted to an Erlang + <p><c>n</c> is a value to be converted to an Erlang unsigned integer.</p> - <p></p> - <p>The function returns an Erlang unsigned integer object with - the value specified in <c><![CDATA[n]]></c>.</p> - <p><c><![CDATA[ERL_INT_UVALUE(t)]]></c> can be used to retrieve the + <p>Returns an Erlang unsigned integer object with + the value specified in <c>n</c>.</p> + <p><c>ERL_INT_UVALUE(t)</c> can be used to retrieve the value from an Erlang unsigned integer.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_mk_var(name)</nametext></name> - <fsummary>Creates an Erlang variable</fsummary> + <fsummary>Create an Erlang variable.</fsummary> <type> <v>char *name;</v> </type> <desc> - <p>This function creates an unbound Erlang variable. The - variable can later be bound through pattern matching or assignment.</p> - <p><c><![CDATA[name]]></c> specifies a name for the variable.</p> - <p>The function returns an Erlang variable object with the - name <c><![CDATA[name]]></c>. </p> + <p>Creates an unbound Erlang variable. The variable can later be bound + through pattern matching or assignment.</p> + <p><c>name</c> specifies a name for the variable.</p> + <p>Returns an Erlang variable object with the + name <c>name</c>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_print_term(stream, term)</nametext></name> - <fsummary>Prints an Erlang term</fsummary> + <fsummary>Print an Erlang term.</fsummary> <type> <v>FILE *stream;</v> <v>ETERM *term;</v> </type> <desc> - <p>This function prints the specified Erlang term to the given - output stream.</p> - <p><c><![CDATA[stream]]></c> indicates where the function should send its - output.</p> - <p><c><![CDATA[term]]></c> is the Erlang term to print.</p> - <p>The function returns the number of characters written, or a - negative value if there was an error.</p> + <p>Prints the specified Erlang term to the specified output stream.</p> + <list type="bulleted"> + <item><c>stream</c> indicates where the function is to + send its output.</item> + <item><c>term</c> is the Erlang term to print.</item> + </list> + <p>Returns the number of characters written on success, otherwise a + negative value.</p> </desc> </func> + <func> <name><ret>void</ret><nametext>erl_set_compat_rel(release_number)</nametext></name> - <fsummary>Set the erl_interface library in compatibility mode</fsummary> + <fsummary>Set the Erl_Interface library in compatibility mode.</fsummary> <type> <v>unsigned release_number;</v> </type> <desc> - <marker id="erl_set_compat_rel"></marker> - <p>By default, the <c><![CDATA[erl_interface]]></c> library is only guaranteed - to be compatible with other Erlang/OTP components from the same - release as the <c><![CDATA[erl_interface]]></c> library itself. For example, - <c><![CDATA[erl_interface]]></c> from the OTP R10 release is not compatible - with an Erlang emulator from the OTP R9 release by default.</p> - <p>A call to <c><![CDATA[erl_set_compat_rel(release_number)]]></c> sets the - <c><![CDATA[erl_interface]]></c> library in compatibility mode of release - <c><![CDATA[release_number]]></c>. Valid range of <c><![CDATA[release_number]]></c> + <p>By default, the <c>Erl_Interface</c> library is only + guaranteed to be compatible with other Erlang/OTP components from the + same release as the <c>Erl_Interface</c> library itself. + For example, <c>Erl_Interface</c> from Erlang/OTP R10 + is not compatible + with an Erlang emulator from Erlang/OTP R9 by default.</p> + <p>A call to <c>erl_set_compat_rel(release_number)</c> sets + the <c>Erl_Interface</c> library in compatibility mode of + release <c>release_number</c>. Valid range of + <c>release_number</c> is [7, current release]. This makes it possible to communicate with Erlang/OTP components from earlier releases.</p> <note> <p>If this function is called, it may only be called once - directly after the call to the - <seealso marker="#erl_init">erl_init()</seealso> function.</p> + directly after the call to function + <seealso marker="#erl_init">erl_init()</seealso>.</p> </note> <warning> <p>You may run into trouble if this feature is used - carelessly. Always make sure that all communicating + carelessly. Always ensure that all communicating components are either from the same Erlang/OTP release, or from release X and release Y where all components from release Y are in compatibility mode of release X.</p> </warning> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_size(term)</nametext></name> - <fsummary>Return the arity of a tuple or binary</fsummary> + <fsummary>Return the arity of a tuple or binary.</fsummary> <type> <v>ETERM *term;</v> </type> <desc> - <p>Returns the arity of an Erlang tuple, or the - number of bytes in an Erlang binary object. </p> - <p><c><![CDATA[term]]></c> is an Erlang tuple or an Erlang binary object.</p> - <p>The function returns the size of <c><![CDATA[term]]></c> as described - above, or -1 if <c><![CDATA[term]]></c> is not one of the two supported - types. </p> + <p>Returns either the arity of an Erlang tuple or the + number of bytes in an Erlang binary object.</p> + <p><c>term</c> is an Erlang tuple or an Erlang binary + object.</p> + <p>Returns the size of <c>term</c> as described + above, or <c>-1</c> if <c>term</c> is not one of the two + supported types.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_tl(list)</nametext></name> - <fsummary>Extracts the tail from a list</fsummary> + <fsummary>Extract the tail from a list.</fsummary> <type> <v>ETERM *list;</v> </type> <desc> <p>Extracts the tail from a list.</p> - <p><c><![CDATA[list]]></c> is an Erlang term containing a list.</p> - <p>The function returns an Erlang list corresponding to the - original list minus the first element, or NULL pointer if - <c><![CDATA[list]]></c> was not a list.</p> + <p><c>list</c> is an Erlang term containing a list.</p> + <p>Returns an Erlang list corresponding to the + original list minus the first element, or <c>NULL</c> pointer if + <c>list</c> was not a list.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_var_content(term, name)</nametext></name> - <fsummary>Extracts the content of a variable</fsummary> + <fsummary>Extract the content of a variable.</fsummary> <type> <v>ETERM *term;</v> <v>char *name;</v> </type> <desc> - <p>This function returns the contents of the specified - variable in an Erlang term. - </p> - <p><c><![CDATA[term]]></c> is an Erlang term. In order for this function - to succeed, <c><![CDATA[term]]></c> must be an Erlang variable with the - specified name, or it must be an Erlang list or tuple - containing a variable with the specified name. Other Erlang - types cannot contain variables.</p> - <p><c><![CDATA[name]]></c> is the name of an Erlang variable.</p> + <p>Returns the contents of the specified variable in an Erlang term.</p> + <list type="bulleted"> + <item><c>term</c> is an Erlang term. In order for this + function to succeed, + <c>term</c> must either be an Erlang variable with + the specified name, or it must be an Erlang list or tuple + containing a variable with the specified name. Other Erlang + types cannot contain variables.</item> + <item><c>name</c> is the name of an Erlang variable. + </item> + </list> <p>Returns the Erlang object corresponding to the value of - <c><![CDATA[name]]></c> in <c><![CDATA[term]]></c>. If no variable with the name - <c><![CDATA[name]]></c> was found in <c><![CDATA[term]]></c>, or if <c><![CDATA[term]]></c> is - not a valid Erlang term, NULL is returned.</p> + <c>name</c> in <c>term</c>. If no variable + with the name <c>name</c> is found in + <c>term</c>, or if <c>term</c> is + not a valid Erlang term, <c>NULL</c> is returned.</p> </desc> </func> </funcs> </cref> - diff --git a/lib/erl_interface/doc/src/erl_format.xml b/lib/erl_interface/doc/src/erl_format.xml index 6e3ac4f0c9..5b8b7b5e78 100644 --- a/lib/erl_interface/doc/src/erl_format.xml +++ b/lib/erl_interface/doc/src/erl_format.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>erl_format</title> @@ -28,51 +28,42 @@ <docno></docno> <approved>Bjarne Däcker</approved> <checked>Torbjörn Törnkvist</checked> - <date>961016</date> + <date>1996-10-16</date> <rev>A</rev> - <file>erl_format.sgml</file> + <file>erl_format.xml</file> </header> <lib>erl_format</lib> - <libsummary>Create and Match Erlang Terms</libsummary> + <libsummary>Create and match Erlang terms.</libsummary> <description> - <p>This module contains two routines - one general function for + <p>This module contains two routines: one general function for creating Erlang terms and one for pattern matching Erlang terms.</p> </description> + <funcs> <func> - <name><ret>ETERM *</ret><nametext>erl_format(FormatStr, ... )</nametext></name> - <fsummary>Creates an Erlang term</fsummary> + <name><ret>ETERM *</ret><nametext>erl_format(FormatStr, ...)</nametext></name> + <fsummary>Create an Erlang term.</fsummary> <type> <v>char *FormatStr;</v> </type> <desc> - <p>This is a general function for creating Erlang terms using + <p>A general function for creating Erlang terms using a format specifier and a corresponding set of arguments, much - in the way <c><![CDATA[printf()]]></c> works.</p> - <p><c><![CDATA[FormatStr]]></c> is a format specification string. The set - of valid format specifiers is as follows:</p> + in the way <c>printf()</c> works.</p> + <p><c>FormatStr</c> is a format specification string. + The valid format specifiers are as follows:</p> <list type="bulleted"> - <item> - <p>~i - Integer</p> - </item> - <item> - <p>~f - Floating point</p> - </item> - <item> - <p>~a - Atom</p> - </item> - <item> - <p>~s - String</p> - </item> - <item> - <p>~w - Arbitrary Erlang term</p> - </item> + <item><c>~i</c> - Integer</item> + <item><c>~f</c> - Floating point</item> + <item><c>~a</c> - Atom</item> + <item><c>~s</c> - String</item> + <item><c>~w</c> - Arbitrary Erlang term</item> </list> - <p>For each format specifier that appears in <c><![CDATA[FormatStr]]></c>, + <p>For each format specifier included in <c>FormatStr</c>, there must be a corresponding argument following - <c><![CDATA[FormatStr]]></c>. An Erlang term is built according to the - <c><![CDATA[FormatStr]]></c> with values and Erlang terms substituted from - the corresponding arguments and according to the individual + <c>FormatStr</c>. An Erlang term is built according to + <c>FormatStr</c> with values and Erlang terms substituted + from the corresponding arguments, and according to the individual format specifiers. For example:</p> <code type="none"><![CDATA[ erl_format("[{name,~a},{age,~i},{data,~w}]", @@ -80,34 +71,40 @@ erl_format("[{name,~a},{age,~i},{data,~w}]", 21, erl_format("[{adr,~s,~i}]","E-street",42)); ]]></code> - <p>This will create an <c><![CDATA[(ETERM *)]]></c> structure corresponding - to the Erlang term: - <c><![CDATA[[{name,madonna},{age,21},{data,[{adr,"E-street",42}]}]]]></c></p> - <p>The function returns an Erlang term, or NULL if - <c><![CDATA[FormatStr]]></c> does not describe a valid Erlang term.</p> + <p>This creates an <c>(ETERM *)</c> structure corresponding + to the Erlang term + <c>[{name,madonna},{age,21},{data,[{adr,"E-street",42}]}]</c></p> + <p>The function returns an Erlang term, or <c>NULL</c> if + <c>FormatStr</c> does not describe a valid Erlang + term.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_match(Pattern, Term)</nametext></name> - <fsummary>Performs pattern matching</fsummary> + <fsummary>Perform pattern matching.</fsummary> <type> <v>ETERM *Pattern,*Term;</v> </type> <desc> <p>This function is used to perform pattern matching similar - to that done in Erlang. Refer to an Erlang manual for matching - rules and more examples.</p> - <p><c><![CDATA[Pattern]]></c> is an Erlang term, possibly containing unbound - variables. </p> - <p><c><![CDATA[Term]]></c> is an Erlang term that we wish to match against - <c><![CDATA[Pattern]]></c>.</p> - <p><c><![CDATA[Term]]></c> and <c><![CDATA[Pattern]]></c> are compared, and any - unbound variables in <c><![CDATA[Pattern]]></c> are bound to corresponding - values in <c><![CDATA[Term]]></c>. </p> - <p>If <c><![CDATA[Term]]></c> and <c><![CDATA[Pattern]]></c> can be matched, the - function returns a non-zero value and binds any unbound - variables in <c><![CDATA[Pattern]]></c>. If <c><![CDATA[Term]]></c> <c><![CDATA[Pattern]]></c> do - not match, the function returns 0. For example:</p> + to that done in Erlang. For matching rules and more examples, see + section <seealso marker="doc/reference_manual:patterns"> + Pattern Matching</seealso> in the Erlang Reference Manual.</p> + <list type="bulleted"> + <item><c>Pattern</c> is an Erlang term, possibly + containing unbound variables.</item> + <item><c>Term</c> is an Erlang term that we wish to match + against <c>Pattern</c>.</item> + </list> + <p><c>Term</c> and <c>Pattern</c> are compared + and any unbound variables in <c>Pattern</c> are bound to + corresponding values in <c>Term</c>.</p> + <p>If <c>Term</c> and <c>Pattern</c> can be + matched, the function returns a non-zero value and binds any unbound + variables in <c>Pattern</c>. If <c>Term</c> + and <c>Pattern</c> do + not match, <c>0</c> is returned. For example:</p> <code type="none"><![CDATA[ ETERM *term, *pattern, *pattern2; term1 = erl_format("{14,21}"); @@ -132,11 +129,10 @@ if (erl_match(pattern2, term2)) { ... } ]]></code> - <p><c><![CDATA[erl_var_content()]]></c> can be used to retrieve the + <p><c>erl_var_content()</c> can be used to retrieve the content of any variables bound as a result of a call to - <c><![CDATA[erl_match()]]></c>.</p> + <c>erl_match()</c>.</p> </desc> </func> </funcs> </cref> - diff --git a/lib/erl_interface/doc/src/erl_global.xml b/lib/erl_interface/doc/src/erl_global.xml index d6bfffc69d..2fa0045adf 100644 --- a/lib/erl_interface/doc/src/erl_global.xml +++ b/lib/erl_interface/doc/src/erl_global.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>erl_global</title> @@ -28,115 +28,125 @@ <docno></docno> <approved>Gordon Beaton</approved> <checked>Gordon Beaton</checked> - <date>980703</date> + <date>1998-07-03</date> <rev>A</rev> - <file>erl_global.sgml</file> + <file>erl_global.xml</file> </header> <lib>erl_global</lib> - <libsummary>Access globally registered names</libsummary> + <libsummary>Access globally registered names.</libsummary> <description> <p>This module provides support for registering, looking - up and unregistering names in the Erlang Global module. For more - information, see the description of Global in the reference manual.</p> - <p>Note that the functions below perform an RPC using an open file - descriptor provided by the caller. This file descriptor must - not be used for other traffic during the global operation or the - function may receive unexpected data and fail.</p> + up, and unregistering names in the <c>global</c> module. + For more information, see + <seealso marker="kernel:global"><c>kernel:global</c></seealso>.</p> + + <p>Notice that the functions below perform an RPC using an open file + descriptor provided by the caller. This file descriptor must + not be used for other traffic during the global operation, as the + function can then receive unexpected data and fail.</p> </description> + <funcs> <func> <name><ret>char **</ret><nametext>erl_global_names(fd,count)</nametext></name> - <fsummary>Obtain list of Global names</fsummary> + <fsummary>Obtain list of global names.</fsummary> <type> <v>int fd;</v> <v>int *count;</v> </type> <desc> - <p>Retrieve a list of all known global names. - </p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection. - </p> - <p><c><![CDATA[count]]></c> is the address of an integer, or NULL. If - <c><![CDATA[count]]></c> is not NULL, it will be set by the function to - the number of names found. - </p> + <p>Retrieves a list of all known global names.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>count</c> is the address of an integer, or + <c>NULL</c>. If <c>count</c> is not <c>NULL</c>, it is + set by the function to the number of names found.</item> + </list> <p>On success, the function returns an array of strings, each - containing a single registered name, and sets <c><![CDATA[count]]></c> to + containing a single registered name, and sets + <c>count</c> to the number of names found. The array is terminated - by a single NULL pointer. On failure, the function returns - NULL and <c><![CDATA[count]]></c> is not modified. - </p> + by a single <c>NULL</c> pointer. On failure, the function returns + <c>NULL</c> and <c>count</c> is not modified.</p> <note> <p>It is the caller's responsibility to free the array afterwards. It has been allocated by the function with a - single call to <c><![CDATA[malloc()]]></c>, so a single <c><![CDATA[free()]]></c> is - all that is necessary.</p> + single call to <c>malloc()</c>, so a single + <c>free()</c> is all that is necessary.</p> </note> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_global_register(fd,name,pid)</nametext></name> - <fsummary>Register a name in Global</fsummary> + <fsummary>Register a name in global.</fsummary> <type> <v>int fd;</v> <v>const char *name;</v> <v>ETERM *pid;</v> </type> <desc> - <p>This function registers a name in Global. - </p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection. - </p> - <p><c><![CDATA[name]]></c> is the name to register in Global. - </p> - <p><c><![CDATA[pid]]></c> is the pid that should be associated with - <c><![CDATA[name]]></c>. This is the value that Global will return when - processes request the location of <c><![CDATA[name]]></c>. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> + <p>Registers a name in <c>global</c>.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>name</c> is the name to register in + <c>global</c>.</item> + <item><c>pid</c> is the pid that is to be associated with + <c>name</c>. This value is returned by <c>global</c> + when processes request the location of <c>name</c>. + </item> + </list> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_global_unregister(fd,name)</nametext></name> - <fsummary>Unregister a name in Global</fsummary> + <fsummary>Unregister a name from global.</fsummary> <type> <v>int fd;</v> <v>const char *name;</v> </type> <desc> - <p>This function unregisters a name from Global. - </p> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection. - </p> - <p><c><![CDATA[name]]></c> is the name to unregister from Global. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> + <p>Unregisters a name from <c>global</c>.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>name</c> is the name to unregister from + <c>global</c>.</item> + </list> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_global_whereis(fd,name,node)</nametext></name> - <fsummary>Look up a name in global</fsummary> + <fsummary>Look up a name in global.</fsummary> <type> <v>int fd;</v> <v>const char *name;</v> <v>char *node;</v> </type> <desc> - <p><c><![CDATA[fd]]></c> is an open descriptor to an Erlang connection. - </p> - <p><c><![CDATA[name]]></c> is the name that is to be looked up in Global. - </p> - <p>If <c><![CDATA[node]]></c> is not NULL, it is a pointer to a buffer - where the function can fill in the name of the node where - <c><![CDATA[name]]></c> is found. <c><![CDATA[node]]></c> can be passed directly to - <c><![CDATA[erl_connect()]]></c> if necessary. - </p> - <p>On success, the function returns an Erlang Pid containing the address - of the given name, and node will be initialized to - the nodename where <c><![CDATA[name]]></c> is found. On failure NULL will be - returned and <c><![CDATA[node]]></c> will not be modified.</p> + <p>Looks up a name in <c>global</c>.</p> + <list type="bulleted"> + <item><c>fd</c> is an open descriptor to an Erlang + connection.</item> + <item><c>name</c> is the name that is to be looked up in + <c>global</c>.</item> + </list> + <p>If <c>node</c> is not <c>NULL</c>, it is a pointer to a + buffer where the function can fill in the name of the node where + <c>name</c> is found. <c>node</c> can be + passed directly to <c>erl_connect()</c> if necessary.</p> + <p>On success, the function returns an Erlang pid containing the address + of the specified name, and the node is initialized to + the node name where <c>name</c> is found. On failure, + <c>NULL</c> is returned and <c>node</c> is not + modified.</p> </desc> </func> </funcs> </cref> - diff --git a/lib/erl_interface/doc/src/erl_interface.xml b/lib/erl_interface/doc/src/erl_interface.xml index a9d421bbeb..4e66655b39 100644 --- a/lib/erl_interface/doc/src/erl_interface.xml +++ b/lib/erl_interface/doc/src/erl_interface.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>The Erl_Interface Library</title> @@ -72,51 +72,51 @@ Eshell V4.7.4 (abort with ^G) 1> code:root_dir(). /usr/local/otp ]]></code> <p>To compile your code, make sure that your C compiler knows where - to find <c><![CDATA[erl_interface.h]]></c> by specifying an appropriate <c><![CDATA[-I]]></c> - argument on the command line, or by adding it to the <c><![CDATA[CFLAGS]]></c> - definition in your <c><![CDATA[Makefile]]></c>. The correct value for this path is - <c><![CDATA[$OTPROOT/lib/erl_interface]]></c><em>Vsn</em><c><![CDATA[/include]]></c>, where <c><![CDATA[$OTPROOT]]></c> is the path - reported by <c><![CDATA[code:root_dir/0]]></c> in the above example, and <em>Vsn</em> is + to find <c>erl_interface.h</c> by specifying an appropriate <c>-I</c> + argument on the command line, or by adding it to the <c>CFLAGS</c> + definition in your <c>Makefile</c>. The correct value for this path is + <c>$OTPROOT/lib/erl_interface</c><em>Vsn</em><c>/include</c>, where <c>$OTPROOT</c> is the path + reported by <c>code:root_dir/0</c> in the above example, and <em>Vsn</em> is the version of the Erl_interface application, for example - <c><![CDATA[erl_interface-3.2.3]]></c></p> + <c>erl_interface-3.2.3</c></p> <code type="none"><![CDATA[ $ cc -c -I/usr/local/otp/lib/erl_interface-3.2.3/include myprog.c ]]></code> <p>When linking, you will need to specify the path to - <c><![CDATA[liberl_interface.a]]></c> and <c><![CDATA[libei.a]]></c> with - <c><![CDATA[-L$OTPROOT/lib/erl_interface-3.2.3/lib]]></c>, and you will need to specify the - name of the libraries with <c><![CDATA[-lerl_interface -lei]]></c>. You can do - this on the command line or by adding the flags to the <c><![CDATA[LDFLAGS]]></c> - definition in your <c><![CDATA[Makefile]]></c>.</p> + <c>liberl_interface.a</c> and <c>libei.a</c> with + <c>-L$OTPROOT/lib/erl_interface-3.2.3/lib</c>, and you will need to specify the + name of the libraries with <c>-lerl_interface -lei</c>. You can do + this on the command line or by adding the flags to the <c>LDFLAGS</c> + definition in your <c>Makefile</c>.</p> <code type="none"><![CDATA[ $ ld -L/usr/local/otp/lib/erl_interface-3.2.3/ lib myprog.o -lerl_interface -lei -o myprog ]]></code> <p>Also, on some systems it may be necessary to link with some - additional libraries (e.g. <c><![CDATA[libnsl.a]]></c> and <c><![CDATA[libsocket.a]]></c> on - Solaris, or <c><![CDATA[wsock32.lib]]></c> on Windows) in order to use the + additional libraries (e.g. <c>libnsl.a</c> and <c>libsocket.a</c> on + Solaris, or <c>wsock32.lib</c> on Windows) in order to use the communication facilities of Erl_Interface.</p> <p>If you are using Erl_Interface functions in a threaded application based on POSIX threads or Solaris threads, then Erl_Interface needs access to some of the synchronization facilities in your threads package, and you will need to specify additional compiler flags in order to indicate which of the packages - you are using. Define <c><![CDATA[_REENTRANT]]></c> and either <c><![CDATA[STHREADS]]></c> or - <c><![CDATA[PTHREADS]]></c>. The default is to use POSIX threads if - <c><![CDATA[_REENTRANT]]></c> is specified.</p> + you are using. Define <c>_REENTRANT</c> and either <c>STHREADS</c> or + <c>PTHREADS</c>. The default is to use POSIX threads if + <c>_REENTRANT</c> is specified.</p> <p>Note that both single threaded and default versions of the Erl_interface and Ei libraries are provided. (The single threaded versions are named - <c><![CDATA[liberl_interface_st]]></c> and <c><![CDATA[libei_st]]></c>). Whether the default + <c>liberl_interface_st</c> and <c>libei_st</c>). Whether the default versions of the libraries have support for threads or not is determined by if the platform in question has support for POSIX or Solaris threads. To check this, - have a look in the <c><![CDATA[eidefs.mk]]></c> file in the erl_interface src directory.</p> + have a look in the <c>eidefs.mk</c> file in the erl_interface src directory.</p> </section> <section> <title>Initializing the erl_interface Library</title> <p>Before calling any of the other Erl_Interface functions, you - must call <c><![CDATA[erl_init()]]></c> exactly once to initialize the library. - <c><![CDATA[erl_init()]]></c> takes two arguments, however the arguments are no + must call <c>erl_init()</c> exactly once to initialize the library. + <c>erl_init()</c> takes two arguments, however the arguments are no longer used by Erl_Interface, and should therefore be specified - as <c><![CDATA[erl_init(NULL,0)]]></c>.</p> + as <c>erl_init(NULL,0)</c>.</p> </section> <section> @@ -129,7 +129,7 @@ $ ld -L/usr/local/otp/lib/erl_interface-3.2.3/ number of C functions which create and manipulate Erlang data structures. The library also contains an encode and a decode function. The example below shows how to create and encode an Erlang tuple - <c><![CDATA[{tobbe,3928}]]></c>:</p> + <c>{tobbe,3928}</c>:</p> <code type="none"><![CDATA[ ETERM *arr[2], *tuple; @@ -140,26 +140,26 @@ arr[0] = erl_mk_atom("tobbe"); arr[1] = erl_mk_integer(3928); tuple = erl_mk_tuple(arr, 2); i = erl_encode(tuple, buf); ]]></code> - <p>Alternatively, you can use <c><![CDATA[erl_send()]]></c> and - <c><![CDATA[erl_receive_msg]]></c>, which handle the encoding and decoding of + <p>Alternatively, you can use <c>erl_send()</c> and + <c>erl_receive_msg</c>, which handle the encoding and decoding of messages transparently.</p> <p>Refer to the Reference Manual for a complete description of the following modules:</p> <list type="bulleted"> - <item>the <c><![CDATA[erl_eterm]]></c> module for creating Erlang terms</item> - <item>the <c><![CDATA[erl_marshal]]></c> module for encoding and decoding routines.</item> + <item>the <c>erl_eterm</c> module for creating Erlang terms</item> + <item>the <c>erl_marshal</c> module for encoding and decoding routines.</item> </list> </section> <section> <title>Building Terms and Patterns</title> - <p>The previous example can be simplified by using - <c><![CDATA[erl_format()]]></c> to create an Erlang term.</p> + <p>The previous example can be simplified by using + <c>erl_format()</c> to create an Erlang term.</p> <code type="none"><![CDATA[ ETERM *ep; ep = erl_format("{~a,~i}", "tobbe", 3928); ]]></code> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_format]]></c> module, for a + <p>Refer to the Reference Manual, the <c>erl_format</c> module, for a full description of the different format directives. The following example is more complex:</p> <code type="none"><![CDATA[ @@ -171,10 +171,10 @@ ep = erl_format("[{name,~a},{age,~i},{data,~w}]", erl_format("[{adr,~s,~i}]", "E-street", 42)); erl_free_compound(ep); ]]></code> <p>As in previous examples, it is your responsibility to free the - memory allocated for Erlang terms. In this example, - <c><![CDATA[erl_free_compound()]]></c> ensures that the complete term pointed to - by <c><![CDATA[ep]]></c> is released. This is necessary, because the pointer from - the second call to <c><![CDATA[erl_format()]]></c> is lost. </p> + memory allocated for Erlang terms. In this example, + <c>erl_free_compound()</c> ensures that the complete term pointed to + by <c>ep</c> is released. This is necessary, because the pointer from + the second call to <c>erl_format()</c> is lost. </p> <p>The following example shows a slightly different solution:</p> <code type="none"><![CDATA[ @@ -186,7 +186,7 @@ ep = erl_format("[{name,~a},{age,~i},{data,~w}]", erl_free_term(ep); erl_free_term(ep2); ]]></code> <p>In this case, you free the two terms independently. The order in - which you free the terms <c><![CDATA[ep]]></c> and <c><![CDATA[ep2]]></c> is not important, + which you free the terms <c>ep</c> and <c>ep2</c> is not important, because the Erl_Interface library uses reference counting to determine when it is safe to actually remove objects. </p> <p>If you are not sure whether you have freed the terms properly, you @@ -204,14 +204,14 @@ printf("length of freelist: %ld\ /* really free the freelist */ erl_eterm_release(); ]]></code> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_malloc]]></c> module for more + <p>Refer to the Reference Manual, the <c>erl_malloc</c> module for more information.</p> </section> <section> <title>Pattern Matching</title> <p>An Erlang pattern is a term that may contain unbound variables or - <c><![CDATA["do not care"]]></c> symbols. Such a pattern can be matched against a + <c>"do not care"</c> symbols. Such a pattern can be matched against a term and, if the match is successful, any unbound variables in the pattern will be bound as a side effect. The content of a bound variable can then be retrieved.</p> @@ -219,13 +219,13 @@ erl_eterm_release(); ETERM *pattern; pattern = erl_format("{madonna,Age,_}"); ]]></code> - <p><c><![CDATA[erl_match()]]></c> is used to perform pattern matching. It takes a + <p><c>erl_match()</c> is used to perform pattern matching. It takes a pattern and a term and tries to match them. As a side effect any unbound variables in the pattern will be bound. In the following example, we create a pattern with a variable <em>Age</em> which appears at two positions in the tuple. The pattern match is performed as follows:</p> <list type="ordered"> - <item><c><![CDATA[erl_match()]]></c> will bind the contents of + <item><c>erl_match()</c> will bind the contents of <em>Age</em> to <em>21</em> the first time it reaches the variable</item> <item>the second occurrence of <em>Age</em> will cause a test for equality between the terms since <em>Age</em> is already bound to @@ -248,14 +248,14 @@ if (erl_match(pattern, term)) { } erl_free_term(pattern); erl_free_term(term); ]]></code> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_match()]]></c> function for + <p>Refer to the Reference Manual, the <c>erl_match()</c> function for more information.</p> </section> <section> <title>Connecting to a Distributed Erlang Node</title> <p>In order to connect to a distributed Erlang node you need to first - initialize the connection routine with <c><![CDATA[erl_connect_init()]]></c>, + initialize the connection routine with <c>erl_connect_init()</c>, which stores information such as the host name, node name, and IP address for later use:</p> <code type="none"><![CDATA[ @@ -263,9 +263,9 @@ int identification_number = 99; int creation=1; char *cookie="a secret cookie string"; /* An example */ erl_connect_init(identification_number, cookie, creation); ]]></code> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_connect]]></c> module for more information.</p> + <p>Refer to the Reference Manual, the <c>erl_connect</c> module for more information.</p> <p>After initialization, you set up the connection to the Erlang node. - Use <c><![CDATA[erl_connect()]]></c> to specify the Erlang node you want to + Use <c>erl_connect()</c> to specify the Erlang node you want to connect to. The following example sets up the connection and should result in a valid socket file descriptor:</p> <code type="none"><![CDATA[ @@ -273,45 +273,45 @@ int sockfd; char *nodename="[email protected]"; /* An example */ if ((sockfd = erl_connect(nodename)) < 0) erl_err_quit("ERROR: erl_connect failed"); ]]></code> - <p><c><![CDATA[erl_err_quit()]]></c> prints the specified string and terminates - the program. Refer to the Reference Manual, the <c><![CDATA[erl_error()]]></c> + <p><c>erl_err_quit()</c> prints the specified string and terminates + the program. Refer to the Reference Manual, the <c>erl_error()</c> function for more information.</p> </section> <section> <title>Using EPMD</title> - <p><c><![CDATA[Epmd]]></c> is the Erlang Port Mapper Daemon. Distributed Erlang nodes - register with <c><![CDATA[epmd]]></c> on the localhost to indicate to other nodes that - they exist and can accept connections. <c><![CDATA[Epmd]]></c> maintains a register of + <p><c>Epmd</c> is the Erlang Port Mapper Daemon. Distributed Erlang nodes + register with <c>epmd</c> on the localhost to indicate to other nodes that + they exist and can accept connections. <c>Epmd</c> maintains a register of node and port number information, and when a node wishes to connect to - another node, it first contacts <c><![CDATA[epmd]]></c> in order to find out the correct + another node, it first contacts <c>epmd</c> in order to find out the correct port number to connect to.</p> - <p>When you use <c><![CDATA[erl_connect()]]></c> to connect to an Erlang node, a - connection is first made to <c><![CDATA[epmd]]></c> and, if the node is known, a + <p>When you use <c>erl_connect()</c> to connect to an Erlang node, a + connection is first made to <c>epmd</c> and, if the node is known, a connection is then made to the Erlang node.</p> - <p>C nodes can also register themselves with <c><![CDATA[epmd]]></c> if they want other + <p>C nodes can also register themselves with <c>epmd</c> if they want other nodes in the system to be able to find and connect to them.</p> - <p>Before registering with <c><![CDATA[epmd]]></c>, you need to first create a listen socket + <p>Before registering with <c>epmd</c>, you need to first create a listen socket and bind it to a port. Then:</p> <code type="none"><![CDATA[ int pub; pub = erl_publish(port); ]]></code> - <p><c><![CDATA[pub]]></c> is a file descriptor now connected to <c><![CDATA[epmd]]></c>. <c><![CDATA[Epmd]]></c> + <p><c>pub</c> is a file descriptor now connected to <c>epmd</c>. <c>Epmd</c> monitors the other end of the connection, and if it detects that the connection has been closed, the node will be unregistered. So, if you explicitly close the descriptor or if your node fails, it will be - unregistered from <c><![CDATA[epmd]]></c>.</p> + unregistered from <c>epmd</c>.</p> <p>Be aware that on some systems (such as VxWorks), a failed node will not be detected by this mechanism since the operating system does not automatically close descriptors that were left open when the node - failed. If a node has failed in this way, <c><![CDATA[epmd]]></c> will prevent you from + failed. If a node has failed in this way, <c>epmd</c> will prevent you from registering a new node with the old name, since it thinks that the old name is still in use. In this case, you must unregister the name explicitly:</p> <code type="none"><![CDATA[ erl_unpublish(node); ]]></code> - <p>This will cause <c><![CDATA[epmd]]></c> to close the connection from the far end. Note + <p>This will cause <c>epmd</c> to close the connection from the far end. Note that if the name was in fact still in use by a node, the results of this operation are unpredictable. Also, doing this does not cause the local end of the connection to close, so resources may be consumed.</p> @@ -321,8 +321,8 @@ erl_unpublish(node); ]]></code> <title>Sending and Receiving Erlang Messages</title> <p>Use one of the following two functions to send messages:</p> <list type="bulleted"> - <item><c><![CDATA[erl_send()]]></c></item> - <item><c><![CDATA[erl_reg_send()]]></c></item> + <item><c>erl_send()</c></item> + <item><c>erl_reg_send()</c></item> </list> <p>As in Erlang, it is possible to send messages to a <em>Pid</em> or to a registered name. It is easier to send a @@ -330,17 +330,17 @@ erl_unpublish(node); ]]></code> a suitable <em>Pid</em>.</p> <p>Use one of the following two functions to receive messages:</p> <list type="bulleted"> - <item><c><![CDATA[erl_receive()]]></c></item> - <item><c><![CDATA[erl_receive_msg()]]></c></item> + <item><c>erl_receive()</c></item> + <item><c>erl_receive_msg()</c></item> </list> - <p><c><![CDATA[erl_receive()]]></c> receives the message into a buffer, while - <c><![CDATA[erl_receive_msg()]]></c> decodes the message into an Erlang term. </p> + <p><c>erl_receive()</c> receives the message into a buffer, while + <c>erl_receive_msg()</c> decodes the message into an Erlang term. </p> <section> <title>Example of Sending Messages</title> - <p>In the following example, <c><![CDATA[{Pid, hello_world}]]></c> is - sent to a registered process <c><![CDATA[my_server]]></c>. The message is encoded - by <c><![CDATA[erl_send()]]></c>:</p> + <p>In the following example, <c>{Pid, hello_world}</c> is + sent to a registered process <c>my_server</c>. The message is encoded + by <c>erl_send()</c>:</p> <code type="none"><![CDATA[ extern const char *erl_thisnodename(void); extern short erl_thiscreation(void); @@ -355,15 +355,15 @@ emsg = erl_mk_tuple(arr, 2); erl_reg_send(sockfd, "my_server", emsg); erl_free_term(emsg); ]]></code> <p>The first element of the tuple that is sent is your own - <em>Pid</em>. This enables <c><![CDATA[my_server]]></c> to reply. Refer to the - Reference Manual, the <c><![CDATA[erl_connect]]></c> module for more information + <em>Pid</em>. This enables <c>my_server</c> to reply. Refer to the + Reference Manual, the <c>erl_connect</c> module for more information about send primitives.</p> </section> <section> <title>Example of Receiving Messages</title> - <p>In this example <c><![CDATA[{Pid, Something}]]></c> is received. The - received Pid is then used to return <c><![CDATA[{goodbye,Pid}]]></c></p> + <p>In this example <c>{Pid, Something}</c> is received. The + received Pid is then used to return <c>{goodbye,Pid}</c></p> <code type="none"><![CDATA[ ETERM *arr[2], *answer; int sockfd,rc; @@ -383,18 +383,18 @@ if ((rc = erl_receive_msg(sockfd , buf, BUFSIZE, &emsg)) == ERL_MSG) { <p>In order to provide robustness, a distributed Erlang node occasionally polls all its connected neighbours in an attempt to detect failed nodes or communication links. A node which receives such - a message is expected to respond immediately with an <c><![CDATA[ERL_TICK]]></c> message. - This is done automatically by <c><![CDATA[erl_receive()]]></c>, however when this - has occurred <c><![CDATA[erl_receive]]></c> returns <c><![CDATA[ERL_TICK]]></c> to the caller - without storing a message into the <c><![CDATA[ErlMessage]]></c> structure.</p> + a message is expected to respond immediately with an <c>ERL_TICK</c> message. + This is done automatically by <c>erl_receive()</c>, however when this + has occurred <c>erl_receive</c> returns <c>ERL_TICK</c> to the caller + without storing a message into the <c>ErlMessage</c> structure.</p> <p>When a message has been received, it is the caller's responsibility - to free the received message <c><![CDATA[emsg.msg]]></c> as well as <c><![CDATA[emsg.to]]></c> - or <c><![CDATA[emsg.from]]></c>, depending on the type of message received.</p> + to free the received message <c>emsg.msg</c> as well as <c>emsg.to</c> + or <c>emsg.from</c>, depending on the type of message received.</p> <p>Refer to the Reference Manual for additional information about the following modules:</p> <list type="bulleted"> - <item><c><![CDATA[erl_connect]]></c></item> - <item><c><![CDATA[erl_eterm]]></c>.</item> + <item><c>erl_connect</c></item> + <item><c>erl_eterm</c>.</item> </list> </section> </section> @@ -421,12 +421,12 @@ if (!erl_match(ep, reply)) "); erl_free_term(ep); erl_free_term(reply); ]]></code> - <p><c><![CDATA[c:c/1]]></c> is called to compile the specified module on the - remote node. <c><![CDATA[erl_match()]]></c> checks that the compilation was - successful by testing for the expected <c><![CDATA[ok]]></c>.</p> - <p>Refer to the Reference Manual, the <c><![CDATA[erl_connect]]></c> module for - more information about <c><![CDATA[erl_rpc()]]></c>, and its companions - <c><![CDATA[erl_rpc_to()]]></c> and <c><![CDATA[erl_rpc_from()]]></c>.</p> + <p><c>c:c/1</c> is called to compile the specified module on the + remote node. <c>erl_match()</c> checks that the compilation was + successful by testing for the expected <c>ok</c>.</p> + <p>Refer to the Reference Manual, the <c>erl_connect</c> module for + more information about <c>erl_rpc()</c>, and its companions + <c>erl_rpc_to()</c> and <c>erl_rpc_from()</c>.</p> </section> <section> @@ -454,14 +454,14 @@ if (names) ",names[i]); free(names); ]]></code> - <p><c><![CDATA[erl_global_names()]]></c> allocates and returns a buffer containing - all the names known to global. <c><![CDATA[count]]></c> will be initialized to + <p><c>erl_global_names()</c> allocates and returns a buffer containing + all the names known to global. <c>count</c> will be initialized to indicate how many names are in the array. The array of strings in names is terminated by a NULL pointer, so it is not necessary to use - <c><![CDATA[count]]></c> to determine when the last name is reached.</p> + <c>count</c> to determine when the last name is reached.</p> <p>It is the caller's responsibility to free the array. - <c><![CDATA[erl_global_names()]]></c> allocates the array and all of the strings - using a single call to <c><![CDATA[malloc()]]></c>, so <c><![CDATA[free(names)]]></c> is all + <c>erl_global_names()</c> allocates the array and all of the strings + using a single call to <c>malloc()</c>, so <c>free(names)</c> is all that is necessary.</p> <p>To look up one of the names:</p> <code type="none"><![CDATA[ @@ -469,13 +469,13 @@ ETERM *pid; char node[256]; pid = erl_global_whereis(fd,"schedule",node); ]]></code> - <p>If <c><![CDATA["schedule"]]></c> is known to global, an Erlang pid is returned + <p>If <c>"schedule"</c> is known to global, an Erlang pid is returned that can be used to send messages to the schedule service. - Additionally, <c><![CDATA[node]]></c> will be initialized to contain the name of + Additionally, <c>node</c> will be initialized to contain the name of the node where the service is registered, so that you can make a - connection to it by simply passing the variable to <c><![CDATA[erl_connect()]]></c>.</p> + connection to it by simply passing the variable to <c>erl_connect()</c>.</p> <p>Before registering a name, you should already have registered your - port number with <c><![CDATA[epmd]]></c>. This is not strictly necessary, but if you + port number with <c>epmd</c>. This is not strictly necessary, but if you neglect to do so, then other nodes wishing to communicate with your service will be unable to find or connect to your process.</p> <p>Create a pid that Erlang processes can use to communicate with your @@ -485,9 +485,9 @@ ETERM *pid; pid = erl_mk_pid(thisnode,14,0,0); erl_global_register(fd,servicename,pid); ]]></code> - <p>After registering the name, you should use <c><![CDATA[erl_accept()]]></c> to wait for + <p>After registering the name, you should use <c>erl_accept()</c> to wait for incoming connections.</p> - <p>Do not forget to free <c><![CDATA[pid]]></c> later with <c><![CDATA[erl_free_term()]]></c>!</p> + <p>Do not forget to free <c>pid</c> later with <c>erl_free_term()</c>!</p> <p>To unregister a name:</p> <code type="none"><![CDATA[ erl_global_unregister(fd,servicename); ]]></code> @@ -500,7 +500,7 @@ erl_global_unregister(fd,servicename); ]]></code> restoring them from a Mnesia table on an Erlang node. More detailed information about the individual API functions can be found in the Reference Manual.</p> - <p>Keys are strings, i.e. 0-terminated arrays of characters, and values + <p>Keys are strings, i.e. <c>NULL</c>-terminated arrays of characters, and values are arbitrary objects. Although integers and floating point numbers are treated specially by the registry, you can store strings or binary objects of any type as pointers.</p> @@ -570,12 +570,12 @@ ei_reg_close(reg); ]]></code> <title>Backing Up the Registry to Mnesia</title> <p>The contents of a registry can be backed up to Mnesia on a "nearby" Erlang node. You need to provide an open connection to the Erlang node - (see <c><![CDATA[erl_connect()]]></c>). Also, Mnesia 3.0 or later must be running + (see <c>erl_connect()</c>). Also, Mnesia 3.0 or later must be running on the Erlang node before the backup is initiated:</p> <code type="none"><![CDATA[ ei_reg_dump(fd, reg, "mtab", dumpflags); ]]></code> <p>The example above will backup the contents of the registry to the - specified Mnesia table <c><![CDATA["mtab"]]></c>. Once a registry has been backed + specified Mnesia table <c>"mtab"</c>. Once a registry has been backed up to Mnesia in this manner, additional backups will only affect objects that have been modified since the most recent backup, i.e. objects that have been created, changed or deleted. The backup @@ -584,7 +584,7 @@ ei_reg_dump(fd, reg, "mtab", dumpflags); ]]></code> <p>In the same manner, a registry can be restored from a Mnesia table:</p> <code type="none"><![CDATA[ ei_reg_restore(fd, reg, "mtab"); ]]></code> - <p>This will read the entire contents of <c><![CDATA["mtab"]]></c> into the specified + <p>This will read the entire contents of <c>"mtab"</c> into the specified registry. After the restore, all of the objects in the registry will be marked as unmodified, so a subsequent backup will only affect objects that you have modified since the restore.</p> @@ -600,8 +600,8 @@ ei_reg_restore(fd, reg, "mtab"); ]]></code> <p>When string or binary objects are stored in the registry it is important that a number of simple guidelines are followed. </p> <p>Most importantly, the object must have been created with a single call - to <c><![CDATA[malloc()]]></c> (or similar), so that it can later be removed by a - single call to <c><![CDATA[free()]]></c>. Objects will be freed by the registry + to <c>malloc()</c> (or similar), so that it can later be removed by a + single call to <c>free()</c>. Objects will be freed by the registry when it is closed, or when you assign a new value to an object that previously contained a string or binary.</p> <p>You should also be aware that if you store binary objects that are @@ -618,9 +618,8 @@ ei_reg_restore(fd, reg, "mtab"); ]]></code> you make, possibly causing it to be missed the next time you make a Mnesia backup of the registry contents. This can be avoided if you mark the object as dirty after any such changes with - <c><![CDATA[ei_reg_markdirty()]]></c>, or pass appropriate flags to - <c><![CDATA[ei_reg_dump()]]></c>.</p> + <c>ei_reg_markdirty()</c>, or pass appropriate flags to + <c>ei_reg_dump()</c>.</p> </section> </section> </chapter> - diff --git a/lib/erl_interface/doc/src/erl_malloc.xml b/lib/erl_interface/doc/src/erl_malloc.xml index 799c903b1a..c0eebc29e9 100644 --- a/lib/erl_interface/doc/src/erl_malloc.xml +++ b/lib/erl_interface/doc/src/erl_malloc.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>erl_malloc</title> @@ -28,174 +28,177 @@ <docno></docno> <approved>Bjarne Däcker</approved> <checked>Torbjörn Törnkvist</checked> - <date>980703</date> + <date>1998-07-03</date> <rev>A</rev> - <file>erl_malloc.sgml</file> + <file>erl_malloc.xml</file> </header> <lib>erl_malloc</lib> - <libsummary>Memory Allocation Functions</libsummary> + <libsummary>Memory allocation functions.</libsummary> <description> <p>This module provides functions for allocating and deallocating memory.</p> </description> + <funcs> <func> <name><ret>ETERM *</ret><nametext>erl_alloc_eterm(etype)</nametext></name> - <fsummary>Allocates an ETERM structure</fsummary> + <fsummary>Allocate an ETERM structure.</fsummary> <type> <v>unsigned char etype;</v> </type> <desc> - <p>This function allocates an <c><![CDATA[(ETERM)]]></c> structure. - Specify <c><![CDATA[etype]]></c> as one of the following constants:</p> + <p>Allocates an <c>(ETERM)</c> structure.</p> + <p>Specify <c>etype</c> as one of the following + constants:</p> <list type="bulleted"> - <item> - <p>ERL_INTEGER</p> + <item><c>ERL_INTEGER</c> </item> - <item> - <p>ERL_U_INTEGER <c><![CDATA[/* unsigned integer */]]></c></p> + <item><c>ERL_U_INTEGER</c> (unsigned integer) </item> - <item> - <p>ERL_ATOM</p> + <item><c>ERL_ATOM</c> </item> - <item> - <p>ERL_PID <c><![CDATA[/* Erlang process identifier */]]></c></p> + <item><c>ERL_PID</c> (Erlang process identifier) </item> - <item> - <p>ERL_PORT</p> + <item><c>ERL_PORT</c> </item> - <item> - <p>ERL_REF <c><![CDATA[/* Erlang reference */]]></c></p> + <item><c>ERL_REF</c> (Erlang reference) </item> - <item> - <p>ERL_LIST</p> + <item><c>ERL_LIST</c> </item> - <item> - <p>ERL_EMPTY_LIST</p> + <item><c>ERL_EMPTY_LIST</c> </item> - <item> - <p>ERL_TUPLE</p> + <item><c>ERL_TUPLE</c> </item> - <item> - <p>ERL_BINARY</p> + <item><c>ERL_BINARY</c> </item> - <item> - <p>ERL_FLOAT</p> + <item><c>ERL_FLOAT</c> </item> - <item> - <p>ERL_VARIABLE</p> + <item><c>ERL_VARIABLE</c> </item> - <item> - <p>ERL_SMALL_BIG <c><![CDATA[/* bignum */]]></c></p> + <item><c>ERL_SMALL_BIG</c> (bignum) </item> - <item> - <p>ERL_U_SMALL_BIG <c><![CDATA[/* bignum */]]></c></p> + <item><c>ERL_U_SMALL_BIG</c> (bignum) </item> </list> - <p><c><![CDATA[ERL_SMALL_BIG]]></c> and <c><![CDATA[ERL_U_SMALL_BIG]]></c> are for - creating Erlang <c><![CDATA[bignums]]></c>, which can contain integers of - arbitrary size. The size of an integer in Erlang is machine - dependent, but in general any integer larger than 2^28 - requires a bignum.</p> + <p><c>ERL_SMALL_BIG</c> and + <c>ERL_U_SMALL_BIG</c> are for + creating Erlang <c>bignums</c>, which can contain integers + of any size. The size of an integer in Erlang is machine-dependent, + but any integer > 2^28 requires a bignum.</p> </desc> </func> + <func> <name><ret>void</ret><nametext>erl_eterm_release(void)</nametext></name> - <fsummary>Clears the ETERM freelist</fsummary> + <fsummary>Clear the ETERM freelist.</fsummary> <desc> - <p>Clears the - freelist, where blocks are placed when they are - released by <c><![CDATA[erl_free_term()]]></c> and - <c><![CDATA[erl_free_compound()]]></c>. </p> + <p>Clears the freelist, where blocks are placed when they are + released by <c>erl_free_term()</c> and + <c>erl_free_compound()</c>.</p> </desc> </func> + <func> <name><ret>void</ret><nametext>erl_eterm_statistics(allocated, freed)</nametext></name> - <fsummary>Reports term allocation statistics</fsummary> + <fsummary>Report term allocation statistics.</fsummary> <type> <v>long *allocated;</v> <v>long *freed;</v> </type> <desc> - <p><c><![CDATA[allocated]]></c> and <c><![CDATA[freed]]></c> are initialized to + <p>Reports term allocation statistics.</p> + <p><c>allocated</c> and <c>freed</c> are + initialized to contain information about the fix-allocator used to allocate - ETERM components. <c><![CDATA[allocated]]></c> is the number of blocks - currently allocated to ETERM objects. <c><![CDATA[freed]]></c> is the - length of the freelist, where blocks are placed when they are - released by <c><![CDATA[erl_free_term()]]></c> and - <c><![CDATA[erl_free_compound()]]></c>. </p> + <c>ETERM</c> components.</p> + <list type="bulleted"> + <item> + <p><c>allocated</c> is the number of blocks currently + allocated to <c>ETERM</c> objects.</p> + </item> + <item> + <p><c>freed</c> is the length of the freelist, where + blocks are placed when they are + released by <c>erl_free_term()</c> and + <c>erl_free_compound()</c>.</p> + </item> + </list> </desc> </func> + <func> - <name><ret>void</ret><nametext>erl_free_array(array, size)</nametext></name> - <fsummary>Frees an array of ETERM structures</fsummary> + <name><ret>void</ret><nametext>erl_free(ptr)</nametext></name> + <fsummary>Free some memory.</fsummary> <type> - <v>ETERM **array;</v> - <v>int size;</v> + <v>void *ptr;</v> </type> <desc> - <p>This function frees an array of Erlang terms.</p> - <p><c><![CDATA[array]]></c> is an array of ETERM* objects. - </p> - <p><c><![CDATA[size]]></c> is the number of terms in the array.</p> + <p>Calls the standard + <c>free()</c> function.</p> </desc> </func> + <func> - <name><ret>void</ret><nametext>erl_free_term(t)</nametext></name> - <fsummary>Frees an ETERM structure</fsummary> + <name><ret>void</ret><nametext>erl_free_array(array, size)</nametext></name> + <fsummary>Free an array of ETERM structures.</fsummary> <type> - <v>ETERM *t;</v> + <v>ETERM **array;</v> + <v>int size;</v> </type> <desc> - <p>Use this function to free an Erlang term.</p> + <p>Frees an array of Erlang terms.</p> + <list type="bulleted"> + <item><c>array</c> is an array of ETERM* objects.</item> + <item><c>size</c> is the number of terms in the array. + </item> + </list> </desc> </func> + <func> <name><ret>void</ret><nametext>erl_free_compound(t)</nametext></name> - <fsummary>Frees an array of ETERM structures</fsummary> + <fsummary>Free an array of ETERM structures.</fsummary> <type> <v>ETERM *t;</v> </type> <desc> <p>Normally it is the programmer's responsibility to free each Erlang term that has been returned from any of the - <c><![CDATA[erl_interface]]></c> functions. However since many of the + <c>Erl_Interface</c> functions. However, as many of the functions that build new Erlang terms in fact share objects - with other existing terms, it may be difficult for the - programmer to maintain pointers to all such terms in order to - free them individually. - </p> - <p><c><![CDATA[erl_free_compound()]]></c> will recursively free all of the - sub-terms associated with a given Erlang term, regardless of - whether we are still holding pointers to the sub-terms. - </p> - <p>There is an example in the User Manual under "Building - Terms and Patterns" - </p> + with other existing terms, it can be difficult for the + programmer to maintain pointers to all such terms to + free them individually.</p> + <p><c>erl_free_compound()</c> recursively frees all of the + subterms associated with a specified Erlang term, regardless of + whether we are still holding pointers to the subterms.</p> + <p>For an example, see section + <seealso marker="ei_users_guide#building_terms_and_patterns">Building Terms and Patterns</seealso> + in the User's Guide.</p> </desc> </func> + <func> - <name><ret>void</ret><nametext>erl_malloc(size)</nametext></name> - <fsummary>Allocates some memory</fsummary> + <name><ret>void</ret><nametext>erl_free_term(t)</nametext></name> + <fsummary>Free an ETERM structure.</fsummary> <type> - <v>long size;</v> + <v>ETERM *t;</v> </type> <desc> - <p>This function calls the standard - <c><![CDATA[malloc()]]></c> function. </p> + <p>Frees an Erlang term.</p> </desc> </func> + <func> - <name><ret>void</ret><nametext>erl_free(ptr)</nametext></name> - <fsummary>Frees some memory</fsummary> + <name><ret>void</ret><nametext>erl_malloc(size)</nametext></name> + <fsummary>Allocate some memory.</fsummary> <type> - <v>void *ptr;</v> + <v>long size;</v> </type> <desc> - <p>This function calls the standard - <c><![CDATA[free()]]></c> function. </p> + <p>Calls the standard + <c>malloc()</c> function.</p> </desc> </func> </funcs> </cref> - diff --git a/lib/erl_interface/doc/src/erl_marshal.xml b/lib/erl_interface/doc/src/erl_marshal.xml index 7c56089016..2ad658f78b 100644 --- a/lib/erl_interface/doc/src/erl_marshal.xml +++ b/lib/erl_interface/doc/src/erl_marshal.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>erl_marshal</title> @@ -28,246 +28,241 @@ <docno></docno> <approved>Bjarne Däcker</approved> <checked>Torbjörn Törnkvist</checked> - <date>980703</date> + <date>1998-07-03</date> <rev>A</rev> - <file>erl_marshal.sgml</file> + <file>erl_marshal.xml</file> </header> <lib>erl_marshal</lib> - <libsummary>Encoding and Decoding of Erlang terms</libsummary> + <libsummary>Encoding and decoding of Erlang terms.</libsummary> <description> <p>This module contains functions for encoding Erlang terms into a sequence of bytes, and for decoding Erlang terms from a sequence of bytes.</p> </description> + <funcs> <func> <name><ret>int</ret><nametext>erl_compare_ext(bufp1, bufp2)</nametext></name> - <fsummary>Compares encoded byte sequences</fsummary> + <fsummary>Compare encoded byte sequences.</fsummary> <type> <v>unsigned char *bufp1,*bufp2;</v> </type> <desc> - <p>This function compares two encoded terms. - </p> - <p><c><![CDATA[bufp1]]></c> is a buffer containing an encoded Erlang - term term1. - </p> - <p><c><![CDATA[bufp2]]></c> is a buffer containing an encoded Erlang - term term2. - </p> - <p>The function returns 0 if the terms are equal, -1 if term1 - is less than term2, or 1 if term2 is less than term1. - </p> + <p>Compares two encoded terms.</p> + <list type="bulleted"> + <item><c>bufp1</c> is a buffer containing an encoded + Erlang term term1.</item> + <item><c>bufp2</c> is a buffer containing an encoded + Erlang term term2.</item> + </list> + <p>Returns <c>0</c> if the terms are equal, <c>-1</c> if + <c>term1</c> < <c>term2</c>, or <c>1</c> if <c>term2</c> < + <c>term1</c>.</p> </desc> </func> + <func> <name><ret>ETERM *</ret><nametext>erl_decode(bufp)</nametext></name> <name><ret>ETERM *</ret><nametext>erl_decode_buf(bufpp)</nametext></name> - <fsummary>Converts a term from Erlang external format</fsummary> + <fsummary>Convert a term from Erlang external format.</fsummary> <type> <v>unsigned char *bufp;</v> <v>unsigned char **bufpp;</v> </type> <desc> - <p><c><![CDATA[erl_decode()]]></c> and <c><![CDATA[erl_decode_buf()]]></c> decode + <p><c>erl_decode()</c> and + <c>erl_decode_buf()</c> decode the contents of a buffer and return the corresponding - Erlang term. <c><![CDATA[erl_decode_buf()]]></c> provides a simple + Erlang term. <c>erl_decode_buf()</c> provides a simple mechanism for dealing with several encoded terms stored consecutively in the buffer.</p> - <p><c><![CDATA[bufp]]></c> is a pointer to a buffer containing one or - more encoded Erlang terms. - </p> - <p><c><![CDATA[bufpp]]></c> is the address of a buffer pointer. The buffer - contains one or more consecutively encoded Erlang terms. - Following a successful call to <c><![CDATA[erl_decode_buf()]]></c>, - <c><![CDATA[bufpp]]></c> will be updated so that it points to the next - encoded term. - </p> - <p><c><![CDATA[erl_decode()]]></c> returns an Erlang term - corresponding to the contents of <c><![CDATA[bufp]]></c> on success, or - NULL on failure. <c><![CDATA[erl_decode_buf()]]></c> returns an Erlang + <list type="bulleted"> + <item> + <p><c>bufp</c> is a pointer to a buffer containing one + or more encoded Erlang terms.</p> + </item> + <item> + <p><c>bufpp</c> is the address of a buffer pointer. The + buffer contains one or more consecutively encoded Erlang terms. + Following a successful call to + <c>erl_decode_buf()</c>, <c>bufpp</c> is + updated so that it points to the next encoded term.</p> + </item> + </list> + <p><c>erl_decode()</c> returns an Erlang term + corresponding to the contents of <c>bufp</c> on success, + otherwise <c>NULL</c>. <c>erl_decode_buf()</c> + returns an Erlang term corresponding to the first of the consecutive terms in - <c><![CDATA[bufpp]]></c> and moves <c><![CDATA[bufpp]]></c> forward to point to the + <c>bufpp</c> and moves <c>bufpp</c> forward + to point to the next term in the buffer. On failure, each of the functions - returns NULL. - </p> + return <c>NULL</c>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_encode(term, bufp)</nametext></name> <name><ret>int</ret><nametext>erl_encode_buf(term, bufpp)</nametext></name> - <fsummary>Converts a term into Erlang external format</fsummary> + <fsummary>Convert a term into Erlang external format.</fsummary> <type> <v>ETERM *term;</v> <v>unsigned char *bufp;</v> <v>unsigned char **bufpp;</v> </type> <desc> - <p><c><![CDATA[erl_encode()]]></c> and <c><![CDATA[erl_encode_buf()]]></c> encode + <p><c>erl_encode()</c> and + <c>erl_encode_buf()</c> encode Erlang terms into external format for storage or transmission. - <c><![CDATA[erl_encode_buf()]]></c> provides a simple mechanism for - encoding several terms consecutively in the same - buffer. - </p> - <p><c>term</c> is an Erlang term to be encoded. - </p> - <p><c>bufp</c> is a pointer to a buffer containing one or - more encoded Erlang terms. - </p> - <p><c>bufpp</c> is a pointer to a pointer to a buffer - containing one or more consecutively encoded Erlang terms. - Following a successful call to <c><![CDATA[erl_encode_buf()]]></c>, - <c>bufpp</c> will be updated so that it points to the - position for the next encoded term. - </p> - <p> - These functions returns the number of bytes written to buffer - if successful, otherwise returns 0. - </p> - <p>Note that no bounds checking is done on the buffer. It is - the caller's responsibility to make sure that the buffer is + <c>erl_encode_buf()</c> provides a simple mechanism for + encoding several terms consecutively in the same buffer.</p> + <list type="bulleted"> + <item> + <p><c>term</c> is an Erlang term to be encoded.</p> + </item> + <item> + <p><c>bufp</c> is a pointer to a buffer containing one or + more encoded Erlang terms.</p> + </item> + <item> + <p><c>bufpp</c> is a pointer to a pointer to a buffer + containing one or more consecutively encoded Erlang terms. + Following a successful call to + <c>erl_encode_buf()</c>, <c>bufpp</c> is updated so + that it points to the + position for the next encoded term.</p> + </item> + </list> + <p>These functions return the number of bytes written to buffer + on success, otherwise <c>0</c>.</p> + <p>Notice that no bounds checking is done on the buffer. It is + the caller's responsibility to ensure that the buffer is large enough to hold the encoded terms. You can either use a - static buffer that is large enough to hold the terms you - expect to need in your program, or use <c><![CDATA[erl_term_len()]]></c> - to determine the exact requirements for a given term. - </p> + static buffer that is large enough to hold the terms you expect + to need in your program, or use <c>erl_term_len()</c> + to determine the exact requirements for a given term.</p> <p>The following can help you estimate the buffer - requirements for a term. Note that this information is - implementation specific, and may change in future versions. - If you are unsure, use <c><![CDATA[erl_term_len()]]></c>. - </p> + requirements for a term. Notice that this information is + implementation-specific, and can change in future versions. + If you are unsure, use <c>erl_term_len()</c>.</p> <p>Erlang terms are encoded with a 1 byte tag that identifies the type of object, a 2- or 4-byte length field, - and then the data itself. Specifically: - </p> + and then the data itself. Specifically:</p> <taglist> - <tag><c><![CDATA[Tuples]]></c></tag> - <item>need 5 bytes, plus the space for each element.</item> - <tag><c><![CDATA[Lists]]></c></tag> - <item>need 5 bytes, plus the space for each element, and 1 - additional byte for the empty list at the end.</item> - <tag><c><![CDATA[Strings and atoms]]></c></tag> - <item>need 3 bytes, plus 1 byte for each character (the - terminating 0 is not encoded). Really long strings (more - than 64k characters) are encoded as lists. Atoms cannot - contain more than 256 characters.</item> - <tag><c><![CDATA[Integers]]></c></tag> - <item>need 5 bytes.</item> - <tag><c><![CDATA[Characters]]></c></tag> - <item>(integers < 256) need 2 bytes.</item> - <tag><c><![CDATA[Floating point numbers]]></c></tag> - <item>need 32 bytes.</item> - <tag><c><![CDATA[Pids]]></c></tag> - <item>need 10 bytes, plus the space for the node name, which - is an atom.</item> - <tag><c><![CDATA[Ports and Refs]]></c></tag> - <item>need 6 bytes, plus the space for the node name, which - is an atom.</item> + <tag><c>Tuples</c></tag> + <item>Need 5 bytes, plus the space for each element.</item> + <tag><c>Lists</c></tag> + <item>Need 5 bytes, plus the space for each element, and 1 + more byte for the empty list at the end.</item> + <tag><c>Strings and atoms</c></tag> + <item>Need 3 bytes, plus 1 byte for each character (the + terminating 0 is not encoded). Really long strings (more + than 64k characters) are encoded as lists. Atoms cannot + contain more than 256 characters.</item> + <tag><c>Integers</c></tag> + <item>Need 5 bytes.</item> + <tag><c>Characters</c></tag> + <item>(Integers < 256) need 2 bytes.</item> + <tag><c>Floating point numbers</c></tag> + <item>Need 32 bytes.</item> + <tag><c>Pids</c></tag> + <item>Need 10 bytes, plus the space for the node name, which + is an atom.</item> + <tag><c>Ports and Refs</c></tag> + <item>Need 6 bytes, plus the space for the node name, which + is an atom.</item> </taglist> - <p>The total space required will be the result calculated - from the information above, plus 1 additional byte for a - version identifier. - </p> + <p>The total space required is the result calculated + from the information above, plus 1 more byte for a + version identifier.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_ext_size(bufp)</nametext></name> - <fsummary>Counts elements in encoded term</fsummary> + <fsummary>Count elements in encoded term.</fsummary> <type> <v>unsigned char *bufp;</v> </type> <desc> - <p>This function returns the number of elements in an - encoded term.</p> + <p>Returns the number of elements in an encoded term.</p> </desc> </func> + <func> <name><ret>unsigned char</ret><nametext>erl_ext_type(bufp)</nametext></name> - <fsummary>Determines type of an encoded byte sequence</fsummary> + <fsummary>Determine type of an encoded byte sequence.</fsummary> <type> <v>unsigned char *bufp;</v> </type> <desc> - <p>This function identifies and returns the type of Erlang term encoded - in a buffer. It will skip a trailing <em>magic</em> identifier. - Returns <c><![CDATA[0]]></c> if the type can't be determined or one of</p> + <p>Identifies and returns the type of Erlang term encoded + in a buffer. It skips a trailing <em>magic</em> identifier.</p> + <p>Returns <c>0</c> if the type cannot be determined or + one of:</p> <list type="bulleted"> - <item> - <p>ERL_INTEGER</p> + <item><c>ERL_INTEGER</c> </item> - <item> - <p>ERL_ATOM</p> + <item><c>ERL_ATOM</c> </item> - <item> - <p>ERL_PID <c><![CDATA[/* Erlang process identifier */]]></c></p> + <item><c>ERL_PID</c> (Erlang process identifier) </item> - <item> - <p>ERL_PORT</p> + <item><c>ERL_PORT</c> </item> - <item> - <p>ERL_REF <c><![CDATA[/* Erlang reference */]]></c></p> + <item><c>ERL_REF</c> (Erlang reference) </item> - <item> - <p>ERL_EMPTY_LIST</p> + <item><c>ERL_EMPTY_LIST</c> </item> - <item> - <p>ERL_LIST</p> + <item><c>ERL_LIST</c> </item> - <item> - <p>ERL_TUPLE</p> + <item><c>ERL_TUPLE</c> </item> - <item> - <p>ERL_FLOAT</p> + <item><c>ERL_FLOAT</c> </item> - <item> - <p>ERL_BINARY</p> + <item><c>ERL_BINARY</c> </item> - <item> - <p>ERL_FUNCTION</p> + <item><c>ERL_FUNCTION</c> </item> </list> </desc> </func> + <func> <name><ret>unsigned char *</ret><nametext>erl_peek_ext(bufp, pos)</nametext></name> - <fsummary>Steps over encoded term</fsummary> + <fsummary>Step over encoded term.</fsummary> <type> <v>unsigned char *bufp;</v> <v>int pos;</v> </type> <desc> <p>This function is used for stepping over one or more - encoded terms in a buffer, in order to directly access a - later term. - </p> - <p><c><![CDATA[bufp]]></c> is a pointer to a buffer containing one or - more encoded Erlang terms. - </p> - <p><c><![CDATA[pos]]></c> indicates how many terms to step over in the - buffer. - </p> - <p>The function returns a pointer to a sub-term that can be - used in a subsequent call to <c><![CDATA[erl_decode()]]></c> in order to retrieve - the term at that position. If there is no term, or <c><![CDATA[pos]]></c> - would exceed the size of the terms in the buffer, NULL is returned. - </p> + encoded terms in a buffer, to directly access later term.</p> + <list type="bulleted"> + <item><c>bufp</c> is a pointer to a buffer containing one + or more encoded Erlang terms.</item> + <item><c>pos</c> indicates how many terms to step over in + the buffer.</item> + </list> + <p>Returns a pointer to a subterm that can be + used in a later call to <c>erl_decode()</c> to retrieve + the term at that position. If there is no term, or + <c>pos</c> would exceed the size of the terms in the + buffer, <c>NULL</c> is returned.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>erl_term_len(t)</nametext></name> - <fsummary>Determines encoded size of term</fsummary> + <fsummary>Determine encoded size of term.</fsummary> <type> <v>ETERM *t;</v> </type> <desc> - <p>This function determines the buffer space that would be - needed by <c><![CDATA[t]]></c> if it were encoded into Erlang external - format by <c><![CDATA[erl_encode()]]></c>. - </p> - <p>The size in bytes is returned. - </p> + <p>Determines the buffer space that would be + needed by <c>t</c> if it were encoded into Erlang external + format by <c>erl_encode()</c>.</p> + <p>Returns the size in bytes.</p> </desc> </func> </funcs> </cref> - diff --git a/lib/erl_interface/doc/src/fascicules.xml b/lib/erl_interface/doc/src/fascicules.xml deleted file mode 100644 index f7edd8a973..0000000000 --- a/lib/erl_interface/doc/src/fascicules.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE fascicules SYSTEM "fascicules.dtd"> - -<fascicules> - <fascicule file="part_ei" href="part_ei_frame.html" entry="no"> - EI User's Guide - </fascicule> - <fascicule file="ref_man_ei" href="ref_man_ei_frame.html" entry="yes"> - EI Library Reference - </fascicule> - <fascicule file="ref_man_erl_interface" href="ref_man_erl_interface_frame.html" entry="no"> - Erl_interface Library Reference - </fascicule> - <fascicule file="ref_man" href="ref_man_frame.html" entry="no"> - Command Reference - </fascicule> - <fascicule file="part_notes" href="part_notes_frame.html" entry="no"> - Release Notes - </fascicule> - <fascicule file="" href="../../../../doc/print.html" entry="no"> - Off-Print - </fascicule> -</fascicules> - diff --git a/lib/erl_interface/doc/src/part.xml b/lib/erl_interface/doc/src/part.xml index d044e2b981..3b761df221 100644 --- a/lib/erl_interface/doc/src/part.xml +++ b/lib/erl_interface/doc/src/part.xml @@ -22,7 +22,7 @@ </legalnotice> - <title>EI User's Guide</title> + <title>Erl_Interface User's Guide</title> <prepared>Gordon Beaton</prepared> <docno></docno> <date>1998-11-30</date> diff --git a/lib/erl_interface/doc/src/part_erl_interface.xml b/lib/erl_interface/doc/src/part_erl_interface.xml index 2abe7ecd60..e256cfa193 100644 --- a/lib/erl_interface/doc/src/part_erl_interface.xml +++ b/lib/erl_interface/doc/src/part_erl_interface.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>Erl_Interface User's Guide</title> @@ -31,4 +31,3 @@ </header> <xi:include href="erl_interface.xml"/> </part> - diff --git a/lib/erl_interface/doc/src/ref_man.xml b/lib/erl_interface/doc/src/ref_man.xml index 0cf060829b..1e20637cb7 100644 --- a/lib/erl_interface/doc/src/ref_man.xml +++ b/lib/erl_interface/doc/src/ref_man.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,9 +19,9 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> - <title>Erl_Interface Command Reference</title> + <title>Erl_Interface Reference Manual</title> <prepared>Gordon Beaton</prepared> <docno></docno> <date>1998-11.30</date> @@ -29,17 +29,6 @@ <file>ref_man.xml</file> </header> <description> - <p>The <c>ei</c> and <c>erl_interface</c> are <c>C</c> interface libraries for - communication with <c>Erlang</c>.</p> - <note> - <p>By default, the <c>ei</c> and <c>erl_interface</c> libraries are only guaranteed - to be compatible with other Erlang/OTP components from the same - release as the libraries themself. See the documentation of the - <seealso marker="ei#ei_set_compat_rel">ei_set_compat_rel()</seealso> and - <seealso marker="erl_eterm#erl_set_compat_rel">erl_set_compat_rel()</seealso> - functions on how to communicate with Erlang/OTP components from earlier - releases.</p> - </note> </description> <xi:include href="ei.xml"/> <xi:include href="ei_connect.xml"/> @@ -53,4 +42,3 @@ <xi:include href="erl_marshal.xml"/> <xi:include href="erl_call.xml"/> </application> - diff --git a/lib/erl_interface/doc/src/ref_man_ei.xml b/lib/erl_interface/doc/src/ref_man_ei.xml index d24828c394..92ff9ed328 100644 --- a/lib/erl_interface/doc/src/ref_man_ei.xml +++ b/lib/erl_interface/doc/src/ref_man_ei.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>EI Library Reference</title> @@ -30,12 +30,12 @@ <file>ref_man_ei.xml</file> </header> <description> - <p>The <c><![CDATA[ei]]></c> library is a <c><![CDATA[C]]></c> interface library for - communication with <c><![CDATA[Erlang]]></c>.</p> + <p>The <c>ei</c> library is a <c>C</c> interface library for + communication with <c>Erlang</c>.</p> <note> - <p>By default, the <c><![CDATA[ei]]></c> library is only guaranteed + <p>By default, the <c>ei</c> library is only guaranteed to be compatible with other Erlang/OTP components from the same - release as the <c><![CDATA[ei]]></c> library itself. See the documentation of the + release as the <c>ei</c> library itself. See the documentation of the <seealso marker="ei#ei_set_compat_rel">ei_set_compat_rel()</seealso> function on how to communicate with Erlang/OTP components from earlier releases.</p> @@ -45,4 +45,3 @@ <xi:include href="ei_connect.xml"/> <xi:include href="registry.xml"/> </application> - diff --git a/lib/erl_interface/doc/src/ref_man_erl_interface.xml b/lib/erl_interface/doc/src/ref_man_erl_interface.xml index fb39c5a7e4..4b1d0e9981 100644 --- a/lib/erl_interface/doc/src/ref_man_erl_interface.xml +++ b/lib/erl_interface/doc/src/ref_man_erl_interface.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>Erl_Interface Library Reference</title> @@ -50,4 +50,3 @@ <xi:include href="erl_malloc.xml"/> <xi:include href="erl_marshal.xml"/> </application> - diff --git a/lib/erl_interface/doc/src/registry.xml b/lib/erl_interface/doc/src/registry.xml index 285a2402b8..6d70fb3475 100644 --- a/lib/erl_interface/doc/src/registry.xml +++ b/lib/erl_interface/doc/src/registry.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>registry</title> @@ -28,457 +28,585 @@ <docno></docno> <approved>Gordon Beaton</approved> <checked>Gordon Beaton</checked> - <date>980707</date> + <date>1998-07-07</date> <rev>A</rev> - <file>registry.sgml</file> + <file>registry.xml</file> </header> <lib>registry</lib> - <libsummary>Store and backup key-value pairs</libsummary> + <libsummary>Store and back up key-value pairs.</libsummary> <description> <p>This module provides support for storing key-value pairs in a table known as a registry, backing up registries to - Mnesia in an atomic manner, and later restoring the contents of a - registry from Mnesia.</p> + <seealso marker="mnesia:mnesia">Mnesia</seealso> + in an atomic manner, and later restoring the contents of a + registry from <c>Mnesia</c>.</p> </description> + <funcs> <func> - <name><ret>ei_reg *</ret><nametext>ei_reg_open(size)</nametext></name> - <fsummary>Create and open a registry</fsummary> + <name><ret>int</ret><nametext>ei_reg_close(reg)</nametext></name> + <fsummary>Close a registry.</fsummary> <type> - <v>int size;</v> + <v>ei_reg *reg;</v> </type> <desc> - <p>Open (create) a registry. The registry will be - initially empty. Use <c><![CDATA[ei_reg_close()]]></c> to close the registry - later. - </p> - <p><c><![CDATA[size]]></c> is the approximate number of objects you intend - to store in the registry. Since the registry uses a hash table - with collision chaining, there is no absolute upper limit on the - number of objects that can be stored in it. However for reasons - of efficiency, it is a good idea to choose a number that is - appropriate for your needs. It is possible to use - <c><![CDATA[ei_reg_resize()]]></c> to change the size later. Note that the - number you provide will be increased to the nearest larger prime - number. - </p> - <p>On success, an empty registry will be returned. On failure, NULL - will be returned.</p> + <p>A registry that has previously been created with + <c>ei_reg_open()</c> is closed, and all the objects it + contains are freed.</p> + <p><c>reg</c> is the registry to close.</p> + <p>Returns <c>0</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_resize(reg,newsize)</nametext></name> - <fsummary>Resize a registry</fsummary> + <name><ret>int</ret><nametext>ei_reg_delete(reg,key)</nametext></name> + <fsummary>Delete an object from the registry.</fsummary> <type> <v>ei_reg *reg;</v> - <v>int newsize;</v> + <v>const char *key;</v> </type> <desc> - <p>Change the size of a registry. - </p> - <p><c><![CDATA[newsize]]></c> is the new size to make the registry. The - number will be increased to the nearest larger prime number. - </p> - <p>On success, the registry will be resized, all contents - rehashed, and the function will return 0. On failure, the - registry will be left unchanged and the function will return -1.</p> + <p>Deletes an object from the registry. The object is not + removed from the registry, it is only marked for later + removal so that on later backups to <c>Mnesia</c>, the + corresponding object can be removed from the <c>Mnesia</c> table as + well. If another object is later created with the same key, the + object will be reused. </p> + <p>The object is removed from the registry after a call to + <c>ei_reg_dump()</c> or <c>ei_reg_purge()</c>. + </p> + <list type="bulleted"> + <item><c>reg</c> is the registry containing + <c>key</c>.</item> + <item><c>key</c> is the object to remove.</item> + </list> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_close(reg)</nametext></name> - <fsummary>Close a registry </fsummary> + <name><ret>int</ret><nametext>ei_reg_dump(fd,reg,mntab,flags)</nametext></name> + <fsummary>Back up a registry to Mnesia.</fsummary> <type> + <v>int fd;</v> <v>ei_reg *reg;</v> + <v>const char *mntab;</v> + <v>int flags;</v> </type> <desc> - <p>A registry that has previously been created with - <c><![CDATA[ei_reg_open()]]></c> is closed, and all the objects it contains - are freed. - </p> - <p><c><![CDATA[reg]]></c> is the registry to close. - </p> - <p>The function returns 0.</p> + <p>Dumps the contents of a registry to a <c>Mnesia</c> table in an + atomic manner, that is, either all data or no data is updated. + If any errors are encountered while backing up + the data, the entire operation is aborted.</p> + <list type="bulleted"> + <item><c>fd</c> is an open connection to Erlang. + <c>Mnesia</c> 3.0 or later must be running on the Erlang node. + </item> + <item><c>reg</c> is the registry to back up.</item> + <item><c>mntab</c> is the name of the <c>Mnesia</c> table + where the backed up data is to be placed. If the table does not + exist, it is created automatically using configurable defaults. + For information about configuring this behavior, see + <seealso marker="mnesia:mnesia"><c>Mnesia</c></seealso>.</item> + </list> + <p>If <c>flags</c> is <c>0</c>, the backup includes only + those objects that have been created, modified, or deleted since the + last backup or restore (that is, an incremental backup). After the + backup, any objects that were marked dirty are now clean, and any + objects that had been marked for deletion are deleted.</p> + <p>Alternatively, setting flags to <c>EI_FORCE</c> causes a full + backup to be done, and <c>EI_NOPURGE</c> causes the deleted objects + to be left in the registry afterwards. These can be bitwise OR'ed + together if both behaviors are desired. If <c>EI_NOPURGE</c> was + specified, <c>ei_reg_purge()</c> can be used to + explicitly remove the deleted items from the registry later.</p> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_setival(reg,key,i)</nametext></name> - <fsummary>Assign an integer object</fsummary> + <name><ret>double</ret><nametext>ei_reg_getfval(reg,key)</nametext></name> + <fsummary>Get a floating point object.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> - <v>int i;</v> </type> <desc> - <p>Create a key-value pair with the specified <c><![CDATA[key]]></c> and integer - value <c><![CDATA[i]]></c>. If an object already existed with the same - <c><![CDATA[key]]></c>, the new value replaces the old one. If the previous - value was a binary or string, it is freed with <c><![CDATA[free()]]></c>. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object should be placed. - </p> - <p><c><![CDATA[key]]></c> is the name of the object. - </p> - <p><c><![CDATA[i]]></c> is the integer value to assign. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> + <p>Gets the value associated with <c>key</c> in the + registry. The value must be a floating point type.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry where the object will be + looked up.</item> + <item><c>key</c> is the name of the object to look up. + </item> + </list> + <p>On success, the function returns the value associated with + <c>key</c>. + If the object is not found or if it is not a floating point + object, <c>-1.0</c> is returned. To avoid problems with in-band error + reporting (that is, if you cannot distinguish between <c>-1.0</c> and + a valid result), use the more general function + <c>ei_reg_getval()</c> instead.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_setfval(reg,key,f)</nametext></name> - <fsummary>Assign a floating point object</fsummary> + <name><ret>int</ret><nametext>ei_reg_getival(reg,key)</nametext></name> + <fsummary>Get an integer object.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> - <v>double f;</v> </type> <desc> - <p>Create a key-value pair with the specified <c><![CDATA[key]]></c> and - floating point value <c><![CDATA[f]]></c>. If an object already existed with - the same <c><![CDATA[key]]></c>, the new value replaces the old one. If the - previous value was a binary or string, it is freed with <c><![CDATA[free()]]></c>. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object should be placed. - </p> - <p><c><![CDATA[key]]></c> is the name of the object. - </p> - <p><c><![CDATA[f]]></c> is the floating point value to assign. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> + <p>Gets the value associated with <c>key</c> in the + registry. The value must be an integer.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry where the object will be + looked up.</item> + <item><c>key</c> is the name of the object to look up. + </item> + </list> + <p>On success, the function returns the value associated with + <c>key</c>. + If the object is not found or if it is not an integer + object, <c>-1</c> is returned. To avoid problems with in-band error + reporting (that is, if you cannot distinguish between <c>-1</c> and a + valid result), use the more general function + <c>ei_reg_getval()</c> instead.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_setsval(reg,key,s)</nametext></name> - <fsummary>Assign a string object</fsummary> + <name><ret>const void *</ret><nametext>ei_reg_getpval(reg,key,size)</nametext></name> + <fsummary>Get a binary object.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> - <v>const char *s;</v> + <v>int size;</v> </type> <desc> - <p>Create a key-value pair with the specified <c><![CDATA[key]]></c> whose - "value" is the specified string <c><![CDATA[s]]></c>. If an object already - existed with the same <c><![CDATA[key]]></c>, the new value replaces the old - one. If the previous value was a binary or string, it is freed - with <c><![CDATA[free()]]></c>. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object should be placed. - </p> - <p><c><![CDATA[key]]></c> is the name of the object. - </p> - <p><c><![CDATA[s]]></c> is the string to assign. The string itself - must have been created through a single call to <c><![CDATA[malloc()]]></c> or - similar function, so that the registry can later delete it if - necessary by calling <c><![CDATA[free()]]></c>. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> + <p>Gets the value associated with <c>key</c> in the + registry. The value must be a binary (pointer) type.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry where the object will be + looked up.</item> + <item><c>key</c> is the name of the object to look up. + </item> + <item><c>size</c> is initialized to contain the length in + bytes of the object, if it is found.</item> + </list> + <p>On success, the function returns the value associated with + <c>key</c> and indicates its length in + <c>size</c>. + If the object is not found or if it is not a binary object, + <c>NULL</c> is returned. To avoid problems with in-band error + reporting (that is, if you cannot distinguish between <c>NULL</c> and + a valid result), use the more general function + <c>ei_reg_getval()</c> instead.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_setpval(reg,key,p,size)</nametext></name> - <fsummary>Assign a binary object</fsummary> + <name><ret>const char *</ret><nametext>ei_reg_getsval(reg,key)</nametext></name> + <fsummary>Get a string object.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> - <v>const void *p;</v> - <v>int size;</v> </type> <desc> - <p>Create a key-value pair with the specified <c><![CDATA[key]]></c> whose - "value" is the binary object pointed to by <c><![CDATA[p]]></c>. If an - object already existed with the same <c><![CDATA[key]]></c>, the new value - replaces the old one. If the previous value was a binary or - string, it is freed with <c><![CDATA[free()]]></c>. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object should be placed. - </p> - <p><c><![CDATA[key]]></c> is the name of the object. - </p> - <p><c><![CDATA[p]]></c> is a pointer to the binary object. The object itself - must have been created through a single call to <c><![CDATA[malloc()]]></c> or - similar function, so that the registry can later delete it if - necessary by calling <c><![CDATA[free()]]></c>. - </p> - <p><c><![CDATA[size]]></c> is the length in bytes of the binary object. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> + <p>Gets the value associated with <c>key</c> in the + registry. The value must be a string.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry where the object will be + looked up.</item> + <item><c>key</c> is the name of the object to look up. + </item> + </list> + <p>On success, the function returns the value associated with + <c>key</c>. If the object is not found or if it is not a + string, <c>NULL</c> is returned. To avoid problems with in-band error + reporting (that is, if you cannot distinguish between <c>NULL</c> and + a valid result), use the more general function + <c>ei_reg_getval()</c> instead.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_setval(reg,key,flags,v,...)</nametext></name> - <fsummary>Assign a value to any object type</fsummary> + <name><ret>int</ret><nametext>ei_reg_getval(reg,key,flags,v,...)</nametext></name> + <fsummary>Get any object.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> <v>int flags;</v> - <v>v (see below)</v> + <v>void *v (see below)</v> </type> <desc> - <p>Create a key-value pair with the specified <c><![CDATA[key]]></c> whose - value is specified by <c><![CDATA[v]]></c>. If an object already - existed with the same <c><![CDATA[key]]></c>, the new value replaces the old - one. If the previous value was a binary or string, it is freed - with <c><![CDATA[free()]]></c>. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object should be placed. - </p> - <p><c><![CDATA[key]]></c> is the name of the object. - </p> - <p><c><![CDATA[flags]]></c> indicates the type of the object specified by - <c><![CDATA[v]]></c>. Flags must be one of EI_INT, EI_FLT, EI_STR and - EI_BIN, indicating whether <c><![CDATA[v]]></c> is <c><![CDATA[int]]></c>, <c><![CDATA[double]]></c>, - <c><![CDATA[char*]]></c> or <c><![CDATA[void*]]></c>. If <c><![CDATA[flags]]></c> is EI_BIN, then a - fifth argument <c><![CDATA[size]]></c> is required, indicating the size - in bytes of the object pointed to by <c><![CDATA[v]]></c>. - </p> - <p>If you wish to store an arbitrary pointer in the registry, - specify a <c><![CDATA[size]]></c> of 0. In this case, the object itself will - not be transferred by an <c><![CDATA[ei_reg_dump()]]></c> operation, just - the pointer value. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> + <p>A general function for retrieving any kind of + object from the registry.</p> + <list type="bulleted"> + <item> + <p><c>reg</c> is the registry where the object will be + looked up.</p> + </item> + <item> + <p><c>key</c> is the name of the object to look up.</p> + </item> + <item> + <p><c>flags</c> indicates the type of object that you + are looking for. If <c>flags</c> is <c>0</c>, any + kind of object is returned. + If <c>flags</c> is <c>EI_INT</c>, <c>EI_FLT</c>, + <c>EI_STR</c>, or <c>EI_BIN</c>, then only values of + that kind are returned.</p> + <p>The buffer pointed to by <c>v</c> + must be large enough to hold the return data, that is, it must be + a pointer to one of <c>int</c>, + <c>double</c>, <c>char*</c>, or + <c>void*</c>, respectively.</p> + <p>If <c>flags</c> is <c>EI_BIN</c>, a fifth argument + <c>int *size</c> is required, so that the size of the + object can be returned.</p> + </item> + </list> + <p>On success, <c>v</c> (and <c>size</c> if the + object is binary) is initialized with the value associated + with <c>key</c>, and the function returns <c>EI_INT</c>, + <c>EI_FLT</c>, <c>EI_STR</c>, or <c>EI_BIN</c>, indicating the type + of object. On failure, <c>-1</c> is returned and the + arguments are not updated.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_getival(reg,key)</nametext></name> - <fsummary>Get an integer object</fsummary> + <name><ret>int</ret><nametext>ei_reg_markdirty(reg,key)</nametext></name> + <fsummary>Mark an object as dirty.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> </type> <desc> - <p>Get the value associated with <c><![CDATA[key]]></c> in the - registry. The value must be an integer. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object will be looked - up. - </p> - <p><c><![CDATA[key]]></c> is the name of the object to look up. - </p> - <p>On success, the function returns the value associated with <c><![CDATA[key]]></c>. - If the object was not found or it was not an integer - object, -1 is returned. To avoid problems with in-band error - reporting (i.e. if you cannot distinguish between -1 and a - valid result) use the more general function <c><![CDATA[ei_reg_getval()]]></c> - instead.</p> + <p>Marks a registry object as dirty. This ensures that + it is included in the next backup to <c>Mnesia</c>. Normally this + operation is not necessary, as all of the normal registry + 'set' functions do this automatically. However, if you have + retrieved the value of a string or binary object from the + registry and modified the contents, then the change is + invisible to the registry and the object is assumed to be + unmodified. This function allows you to make such modifications + and then let the registry know about them.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry containing the object. + </item> + <item><c>key</c> is the name of the object to mark. + </item> + </list> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> - <name><ret>double</ret><nametext>ei_reg_getfval(reg,key)</nametext></name> - <fsummary>Get a floating point object</fsummary> + <name><ret>ei_reg *</ret><nametext>ei_reg_open(size)</nametext></name> + <fsummary>Create and open a registry.</fsummary> + <type> + <v>int size;</v> + </type> + <desc> + <p>Opens (creates) a registry, which initially is empty. To + close the registry later, use <c>ei_reg_close()</c>.</p> + <p><c>size</c> is the approximate number of objects you + intend to store in the registry. As the registry uses a hash table + with collision chaining, no absolute upper limit exists on the + number of objects that can be stored in it. However, for reasons + of efficiency, it is a good idea to choose a number that is + appropriate for your needs. To change the size later, use + <c>ei_reg_resize()</c>. Notice that the number + you provide is increased to the nearest larger prime number.</p> + <p>Returns an empty registry on success, otherwise <c>NULL</c>.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_reg_purge(reg)</nametext></name> + <fsummary>Remove deleted objects.</fsummary> <type> <v>ei_reg *reg;</v> - <v>const char *key;</v> </type> <desc> - <p>Get the value associated with <c><![CDATA[key]]></c> in the - registry. The value must be a floating point type. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object will be looked - up. - </p> - <p><c><![CDATA[key]]></c> is the name of the object to look up. - </p> - <p>On success, the function returns the value associated with <c><![CDATA[key]]></c>. - If the object was not found or it was not a floating point - object, -1.0 is returned. To avoid problems with in-band error - reporting (i.e. if you cannot distinguish between -1.0 and a - valid result) use the more general function <c><![CDATA[ei_reg_getval()]]></c> - instead.</p> + <p>Removes all objects marked for deletion. When objects + are deleted with <c>ei_reg_delete()</c> they are not + removed from the registry, only marked for later removal. + On a later backup to <c>Mnesia</c>, the + objects can also be removed from the <c>Mnesia</c> table. If you are + not backing up to <c>Mnesia</c>, you may wish to remove the objects + manually with this function.</p> + <p><c>reg</c> is a registry containing objects marked for + deletion.</p> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> - <name><ret>const char *</ret><nametext>ei_reg_getsval(reg,key)</nametext></name> - <fsummary>Get a string object</fsummary> + <name><ret>int</ret><nametext>ei_reg_resize(reg,newsize)</nametext></name> + <fsummary>Resize a registry.</fsummary> + <type> + <v>ei_reg *reg;</v> + <v>int newsize;</v> + </type> + <desc> + <p>Changes the size of a registry.</p> + <p><c>newsize</c> is the new size to make the registry. The + number is increased to the nearest larger prime number.</p> + <p>On success, the registry is resized, all contents + rehashed, and <c>0</c> is returned. On failure, the + registry is left unchanged and <c>-1</c> is returned.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_reg_restore(fd,reg,mntab)</nametext></name> + <fsummary>Restore a registry from Mnesia.</fsummary> + <type> + <v>int fd;</v> + <v>ei_reg *reg;</v> + <v>const char *mntab;</v> + </type> + <desc> + <p>The contents of a <c>Mnesia</c> table are read into the registry.</p> + <list type="bulleted"> + <item><c>fd</c> is an open connection to Erlang. + <c>Mnesia</c> 3.0 or later must be running on the Erlang node. + </item> + <item><c>reg</c> is the registry where the data is to be + placed.</item> + <item><c>mntab</c> is the name of the <c>Mnesia</c> table + to read data from.</item> + </list> + <p>Notice that only tables of a certain format can be + restored, that is, those that have been created and backed up to + with <c>ei_reg_dump()</c>. If the registry was not empty + before the operation, the contents of the table are added to the + contents of the registry. If the table contains objects with the + same keys as those already in the registry, the registry objects + are overwritten with the new values. If the registry + contains objects that were not in the table, they are + unchanged by this operation.</p> + <p>After the restore operation, the entire contents of the + registry is marked as unmodified. Notice that this includes any + objects that were modified before the restore and not + overwritten by the restore.</p> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> + </desc> + </func> + + <func> + <name><ret>int</ret><nametext>ei_reg_setfval(reg,key,f)</nametext></name> + <fsummary>Assign a floating point object.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> + <v>double f;</v> </type> <desc> - <p>Get the value associated with <c><![CDATA[key]]></c> in the - registry. The value must be a string. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object will be looked - up. - </p> - <p><c><![CDATA[key]]></c> is the name of the object to look up. - </p> - <p>On success, the function returns the value associated with - <c><![CDATA[key]]></c>. If the object was not found or it was not a string, - NULL is returned. To avoid problems with in-band error - reporting (i.e. if you cannot distinguish between NULL and a - valid result) use the more general function <c><![CDATA[ei_reg_getval()]]></c> - instead.</p> + <p>Creates a key-value pair with the specified <c>key</c> + and floating point value <c>f</c>. If an object already + exists with the same <c>key</c>, the new value replaces + the old one. If the previous value was a binary or string, it is + freed with <c>free()</c>.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry where the object is to be + placed.</item> + <item><c>key</c> is the object name.</item> + <item><c>f</c> is the floating point value to assign. + </item> + </list> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> - <name><ret>const void *</ret><nametext>ei_reg_getpval(reg,key,size)</nametext></name> - <fsummary>Get a binary object</fsummary> + <name><ret>int</ret><nametext>ei_reg_setival(reg,key,i)</nametext></name> + <fsummary>Assign an integer object.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> - <v>int size;</v> + <v>int i;</v> </type> <desc> - <p>Get the value associated with <c><![CDATA[key]]></c> in the - registry. The value must be a binary (pointer) type. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object will be looked - up. - </p> - <p><c><![CDATA[key]]></c> is the name of the object to look up. - </p> - <p><c><![CDATA[size]]></c> will be initialized to contain the length in - bytes of the object, if it is found. - </p> - <p>On success, the function returns the value associated with - <c><![CDATA[key]]></c> and indicates its length in <c><![CDATA[size]]></c>. - If the object was not found or it was not a binary object, - NULL is returned. To avoid problems with in-band error - reporting (i.e. if you cannot distinguish between NULL and a - valid result) use the more general function <c><![CDATA[ei_reg_getval()]]></c> - instead.</p> + <p>Creates a key-value pair with the specified <c>key</c> + and integer value <c>i</c>. If an object already exists + with the same <c>key</c>, the new value replaces the old + one. If the previous value was a binary or string, it is freed with + <c>free()</c>.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry where the object is to be + placed.</item> + <item><c>key</c> is the object name.</item> + <item><c>i</c> is the integer value to assign.</item> + </list> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_getval(reg,key,flags,v,...)</nametext></name> - <fsummary>Get any object</fsummary> + <name><ret>int</ret><nametext>ei_reg_setpval(reg,key,p,size)</nametext></name> + <fsummary>Assign a binary object.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> - <v>int flags;</v> - <v>void *v (see below)</v> + <v>const void *p;</v> + <v>int size;</v> </type> <desc> - <p>This is a general function for retrieving any kind of - object from the registry. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the object will be looked - up. - </p> - <p><c><![CDATA[key]]></c> is the name of the object to look up. - </p> - <p><c><![CDATA[flags]]></c> indicates the type of object that you are - looking for. If <c><![CDATA[flags]]></c> is 0, then any kind of object will - be returned. If <c><![CDATA[flags]]></c> is one of EI_INT, EI_FLT, EI_STR or - EI_BIN, then only values of that kind will be returned. The - buffer pointed to by <c><![CDATA[v]]></c> must be large enough to hold the return - data, i.e. it must be a pointer to one of <c><![CDATA[int]]></c>, - <c><![CDATA[double]]></c>, <c><![CDATA[char*]]></c> or <c><![CDATA[void*]]></c>, respectively. Also, - if <c><![CDATA[flags]]></c> is EI_BIN, then a fifth argument <c><![CDATA[int *size]]></c> is required, so that the size of the object can be - returned. - </p> - <p>If the function succeeds, <c><![CDATA[v]]></c> (and <c><![CDATA[size]]></c> if the - object is binary) will be initialized with the value associated - with <c><![CDATA[key]]></c>, and the function will return one of EI_INT, - EI_FLT, EI_STR or EI_BIN, indicating the type of object. On failure the - function will return -1 and the arguments will not be updated.</p> + <p>Creates a key-value pair with the specified <c>key</c> + whose "value" is the binary object pointed to by <c>p</c>. + If an object already exists with the same <c>key</c>, + the new value replaces the old one. If the previous value was a + binary or string, it is freed with <c>free()</c>.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry where the object is to be + placed.</item> + <item><c>key</c> is the object name.</item> + <item><c>p</c> is a pointer to the binary object. The + object itself must have been created through a single call to + <c>malloc()</c> or a similar function, so that the + registry can later delete it if necessary by calling + <c>free()</c>.</item> + <item><c>size</c> is the length in bytes of the binary + object.</item> + </list> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_markdirty(reg,key)</nametext></name> - <fsummary>Mark an object as dirty </fsummary> + <name><ret>int</ret><nametext>ei_reg_setsval(reg,key,s)</nametext></name> + <fsummary>Assign a string object.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> + <v>const char *s;</v> </type> <desc> - <p>Mark a registry object as dirty. This will ensure that - it is included in the next backup to Mnesia. Normally this - operation will not be necessary since all of the normal registry - 'set' functions do this automatically. However if you have - retrieved the value of a string or binary object from the - registry and modified the contents, then the change will be - invisible to the registry and the object will be assumed to be - unmodified. This function allows you to make such modifications - and then let the registry know about them. - </p> - <p><c><![CDATA[reg]]></c> is the registry containing the object. - </p> - <p><c><![CDATA[key]]></c> is the name of the object to mark. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> + <p>Creates a key-value pair with the specified <c>key</c> + whose "value" is the specified string <c>s</c>. If an + object already exists with the same <c>key</c>, the new + value replaces the old one. If the previous value was a binary or + string, it is freed with <c>free()</c>.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry where the object is to be + placed.</item> + <item><c>key</c> is the object name.</item> + <item><c>s</c> is the string to assign. The string itself + must have been created through a single call to + <c>malloc()</c> or similar a function, + so that the registry can later delete it if + necessary by calling <c>free()</c>.</item> + </list> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> - <name><ret>int</ret><nametext>ei_reg_delete(reg,key)</nametext></name> - <fsummary>Delete an object from the registry</fsummary> + <name><ret>int</ret><nametext>ei_reg_setval(reg,key,flags,v,...)</nametext></name> + <fsummary>Assign a value to any object type.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> + <v>int flags;</v> + <v>v (see below)</v> </type> <desc> - <p>Delete an object from the registry. The object is not - actually removed from the registry, it is only marked for later - removal so that on subsequent backups to Mnesia, the - corresponding object can be removed from the Mnesia table as - well. If another object is later created with the same key, the - object will be reused. - </p> - <p>The object will be removed from the registry after a call to - <c><![CDATA[ei_reg_dump()]]></c> or <c><![CDATA[ei_reg_purge()]]></c>. - </p> - <p><c><![CDATA[reg]]></c> is the registry containing <c><![CDATA[key]]></c>. - </p> - <p><c><![CDATA[key]]></c> is the object to remove. - </p> - <p>If the object was found, the function returns 0 indicating - success. Otherwise the function returns -1.</p> + <p>Creates a key-value pair with the specified <c>key</c> + whose value is specified by <c>v</c>. If an object already + exists with the same <c>key</c>, the new value replaces + the old one. If the previous value was a binary or string, it is freed + with <c>free()</c>.</p> + <list type="bulleted"> + <item> + <p><c>reg</c> is the registry where the object is to be + placed.</p> + </item> + <item> + <p><c>key</c> is the object name.</p> + </item> + <item> + <p><c>flags</c> indicates the type of the object + specified by <c>v</c>. Flags must be one of + <c>EI_INT</c>, <c>EI_FLT</c>, <c>EI_STR</c>, and <c>EI_BIN</c>, + indicating whether + <c>v</c> is <c>int</c>, + <c>double</c>, <c>char*</c>, or + <c>void*</c>.</p> + <p>If <c>flags</c> is <c>EI_BIN</c>, a fifth argument + <c>size</c> is required, indicating the size + in bytes of the object pointed to by <c>v</c>.</p> + </item> + </list> + <p>If you wish to store an arbitrary pointer in the registry, + specify a <c>size</c> of <c>0</c>. In this case, the + object itself is not transferred by an + <c>ei_reg_dump()</c> operation, only the pointer + value.</p> + <p>Returns <c>0</c> on success, otherwise <c>-1</c>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_reg_stat(reg,key,obuf)</nametext></name> - <fsummary>Get object information</fsummary> + <fsummary>Get object information.</fsummary> <type> <v>ei_reg *reg;</v> <v>const char *key;</v> <v>struct ei_reg_stat *obuf;</v> </type> <desc> - <p>Return information about an object. - </p> - <p><c><![CDATA[reg]]></c> is the registry containing the object. - </p> - <p><c><![CDATA[key]]></c> is the name of the object. - </p> - <p><c><![CDATA[obuf]]></c> is a pointer to an <c><![CDATA[ei_reg_stat]]></c> structure, - defined below: - </p> + <p>Returns information about an object.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry containing the object. + </item> + <item><c>key</c> is the object name.</item> + <item><c>obuf</c> is a pointer to an + <c>ei_reg_stat</c> structure, defined as follows:</item> + </list> <code type="none"><![CDATA[ struct ei_reg_stat { int attr; int size; }; ]]></code> - <p>In <c><![CDATA[attr]]></c> the object's attributes are stored as the logical - OR of its type (one of EI_INT, EI_FLT, EI_BIN and EI_STR), - whether it is marked for deletion (EI_DELET) and whether it has - been modified since the last backup to Mnesia (EI_DIRTY). - </p> - <p>The <c><![CDATA[size]]></c> field indicates the size in bytes required to store - EI_STR (including the terminating 0) and EI_BIN objects, or 0 - for EI_INT and EI_FLT. - </p> - <p>The function returns 0 and initializes <c><![CDATA[obuf]]></c> on - success, or returns -1 on failure.</p> + <p>In <c>attr</c> the attributes of the object are stored + as the logical <em>OR</em> of its type (one of <c>EI_INT</c>, + <c>EI_FLT</c>, <c>EI_BIN</c>, and <c>EI_STR</c>), + whether it is marked for deletion (<c>EI_DELET</c>), and whether it + has been modified since the last backup to <c>Mnesia</c> + (<c>EI_DIRTY</c>).</p> + <p>Field <c>size</c> indicates the size in bytes required + to store <c>EI_STR</c> (including the terminating <c>0</c>) and + <c>EI_BIN</c> objects, or <c>0</c> for <c>EI_INT</c> and + <c>EI_FLT</c>.</p> + <p>Returns <c>0</c> and initializes <c>obuf</c> on success, + otherwise <c>-1</c>.</p> </desc> </func> + <func> <name><ret>int</ret><nametext>ei_reg_tabstat(reg,obuf)</nametext></name> - <fsummary>Get registry information</fsummary> + <fsummary>Get registry information.</fsummary> <type> <v>ei_reg *reg;</v> <v>struct ei_reg_tabstat *obuf;</v> </type> <desc> - <p>Return information about a registry. Using information + <p>Returns information about a registry. Using information returned by this function, you can see whether the size of the - registry is suitable for the amount of data it contains. - </p> - <p><c><![CDATA[reg]]></c> is the registry to return information about. - </p> - <p><c><![CDATA[obuf]]></c> is a pointer to an <c><![CDATA[ei_reg_tabstat]]></c> structure, - defined below: - </p> + registry is suitable for the amount of data it contains.</p> + <list type="bulleted"> + <item><c>reg</c> is the registry to return information + about.</item> + <item><c>obuf</c> is a pointer to an + <c>ei_reg_tabstat</c> structure, defined as follows: + </item> + </list> <code type="none"><![CDATA[ struct ei_reg_tabstat { int size; @@ -487,126 +615,23 @@ struct ei_reg_tabstat { int collisions; }; ]]></code> - <p>The <c><![CDATA[size]]></c> field indicates the number of hash positions + <p>Field <c>size</c> indicates the number of hash positions in the registry. This is the number you provided when you created or last resized the registry, rounded up to the nearest - prime. - </p> - <p><c><![CDATA[nelem]]></c> indicates the number of elements stored in the - registry. It includes objects that are deleted but not purged. - </p> - <p><c><![CDATA[npos]]></c> indicates the number of unique positions that are - occupied in the registry. - </p> - <p><c><![CDATA[collisions]]></c> indicates how many elements are sharing - positions in the registry. - </p> - <p>On success, the function returns 0 and <c><![CDATA[obuf]]></c> is - initialized to contain table statistics. On failure, the function - returns -1.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_reg_dump(fd,reg,mntab,flags)</nametext></name> - <fsummary>Back up a registry to Mnesia</fsummary> - <type> - <v>int fd;</v> - <v>ei_reg *reg;</v> - <v>const char *mntab;</v> - <v>int flags;</v> - </type> - <desc> - <p>Dump the contents of a registry to a Mnesia table in an - atomic manner, i.e. either all data will be updated, or none of - it will. If any errors are encountered while backing up - the data, the entire operation is aborted. - </p> - <p><c><![CDATA[fd]]></c> is an open connection to Erlang. - Mnesia 3.0 or later must be running on the Erlang node. - </p> - <p><c><![CDATA[reg]]></c> is the registry to back up. - </p> - <p><c><![CDATA[mntab]]></c> is the name of the Mnesia table where the backed - up data should be placed. If the table does not exist, it will - be created automatically using configurable defaults. See your - Mnesia documentation for information about configuring this - behaviour. - </p> - <p>If <c><![CDATA[flags]]></c> is 0, the backup will include only those - objects which have been created, modified or deleted since the - last backup or restore (i.e. an incremental backup). After the - backup, any objects that were marked dirty are now clean, and any - objects that had been marked for deletion are deleted. - </p> - <p>Alternatively, setting flags to EI_FORCE will cause a full - backup to be done, and EI_NOPURGE will cause the deleted objects - to be left in the registry afterwards. These can be bitwise ORed - together if both behaviours are desired. If EI_NOPURGE was - specified, you can use <c><![CDATA[ei_reg_purge()]]></c> to explicitly remove - the deleted items from the registry later. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_reg_restore(fd,reg,mntab)</nametext></name> - <fsummary>Restore a registry from Mnesia</fsummary> - <type> - <v>int fd;</v> - <v>ei_reg *reg;</v> - <v>const char *mntab;</v> - </type> - <desc> - <p>The contents of a Mnesia table are read into the - registry. - </p> - <p><c><![CDATA[fd]]></c> is an open connection to Erlang. - Mnesia 3.0 or later must be running on the Erlang node. - </p> - <p><c><![CDATA[reg]]></c> is the registry where the data should be placed. - </p> - <p><c><![CDATA[mntab]]></c> is the name of the Mnesia table to read data - from. - </p> - <p>Note that only tables of a certain format can be - restored, i.e. those that have been created and backed up to - with <c><![CDATA[ei_reg_dump()]]></c>. If the registry was not empty before - the operation, then the contents of the table are added to the - contents of the registry. If the table contains objects with the - same keys as those already in the registry, the registry objects - will be overwritten with the new values. If the registry - contains objects that were not in the table, they will be - unchanged by this operation. - </p> - <p>After the restore operation, the entire contents of the - registry is marked as unmodified. Note that this includes any - objects that were modified before the restore and not - overwritten by the restore. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> - </desc> - </func> - <func> - <name><ret>int</ret><nametext>ei_reg_purge(reg)</nametext></name> - <fsummary>Remove deleted objects</fsummary> - <type> - <v>ei_reg *reg;</v> - </type> - <desc> - <p>Remove all objects marked for deletion. When objects - are deleted with <c><![CDATA[ei_reg_delete()]]></c> they are not actually - removed from the registry, only marked for later removal. This - is so that on a subsequent backup to Mnesia, the - objects can also be removed from the Mnesia table. If you are - not backing up to Mnesia then you may wish to remove the objects - manually with this function. - </p> - <p><c><![CDATA[reg]]></c> is a registry containing objects marked for - deletion. - </p> - <p>The function returns 0 on success, or -1 on failure.</p> + prime number.</p> + <list type="bulleted"> + <item><c>nelem</c> indicates the number of elements stored + in the registry. It includes objects that are deleted but not + purged.</item> + <item><c>npos</c> indicates the number of unique positions + that are occupied in the registry.</item> + <item><c>collisions</c> indicates how many elements are + sharing positions in the registry.</item> + </list> + <p>On success, <c>0</c> is returned and + <c>obuf</c> is initialized to contain table statistics, + otherwise <c>-1</c> is returned.</p> </desc> </func> </funcs> </cref> - diff --git a/lib/erl_interface/src/connect/ei_connect.c b/lib/erl_interface/src/connect/ei_connect.c index 624100ad49..c193fd804a 100644 --- a/lib/erl_interface/src/connect/ei_connect.c +++ b/lib/erl_interface/src/connect/ei_connect.c @@ -423,7 +423,7 @@ int ei_connect_xinit(ei_cnode* ec, const char *thishostname, } #endif /* _REENTRANT */ - ec->creation = creation; + ec->creation = creation & 0x3; /* 2 bits */ if (cookie) { if (strlen(cookie) >= sizeof(ec->ei_connect_cookie)) { @@ -462,7 +462,7 @@ int ei_connect_xinit(ei_cnode* ec, const char *thishostname, strcpy(ec->self.node,thisnodename); ec->self.num = 0; ec->self.serial = 0; - ec->self.creation = creation; + ec->self.creation = creation & 0x3; /* 2 bits */ if ((dbglevel = getenv("EI_TRACELEVEL")) != NULL || (dbglevel = getenv("ERL_DEBUG_DIST")) != NULL) diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl index 15f7b793a1..226a5d0f61 100644 --- a/lib/hipe/cerl/erl_types.erl +++ b/lib/hipe/cerl/erl_types.erl @@ -611,9 +611,13 @@ t_decorate_with_opaque(T1, T2, Opaques) -> false -> T1; true -> R = decorate(T1, T, Opaques), - ?debug(case catch t_is_equal(t_unopaque(R), t_unopaque(T1)) of - true -> ok; - false -> + ?debug(case catch + not t_is_equal(t_unopaque(R), t_unopaque(T1)) + orelse + t_is_equal(T1, T) andalso not t_is_equal(T1, R) + of + false -> ok; + _ -> io:format("T1 = ~p,\n", [T1]), io:format("T2 = ~p,\n", [T2]), io:format("O = ~p,\n", [Opaques]), @@ -642,7 +646,6 @@ decorate(?tuple_set(List), ?tuple_set(L), Opaques) -> decorate(?union(List), T, Opaques) when T =/= ?any -> ?union(L) = force_union(T), union_decorate(List, L, Opaques); -decorate(?opaque(_)=T, _, _Opaques) -> T; decorate(T, ?union(L), Opaques) when T =/= ?any -> ?union(List) = force_union(T), union_decorate(List, L, Opaques); @@ -656,7 +659,7 @@ decorate_with_opaque(Type, ?opaque(Set2), Opaques) -> case decoration(set_to_list(Set2), Type, Opaques, [], false) of {[], false} -> Type; {List, All} when List =/= [] -> - NewType = ?opaque(ordsets:from_list(List)), + NewType = sup_opaque(List), case All of true -> NewType; false -> t_sup(NewType, Type) @@ -670,9 +673,10 @@ decoration([#opaque{struct = S} = Opaque|OpaqueTypes], Type, Opaques, case not IsOpaque orelse t_is_none(I) of true -> decoration(OpaqueTypes, Type, Opaques, NewOpaqueTypes0, All); false -> - NewOpaque = Opaque#opaque{struct = decorate(I, S, Opaques)}, + NewI = decorate(I, S, Opaques), + NewOpaque = combine(NewI, [Opaque]), NewAll = All orelse t_is_equal(I, Type), - NewOpaqueTypes = [NewOpaque|NewOpaqueTypes0], + NewOpaqueTypes = NewOpaque ++ NewOpaqueTypes0, decoration(OpaqueTypes, Type, Opaques, NewOpaqueTypes, NewAll) end; decoration([], _Type, _Opaques, NewOpaqueTypes, All) -> @@ -2991,27 +2995,21 @@ inf_collect(_T1, [], _Opaques, OpL) -> OpL. combine(S, T1, T2) -> - #opaque{mod = Mod1, name = Name1, args = Args1} = T1, - #opaque{mod = Mod2, name = Name2, args = Args2} = T2, - Comb1 = comb(Mod1, Name1, Args1, S, T1), - case is_compat_opaque_names({Mod1, Name1, Args1}, {Mod2, Name2, Args2}) of - true -> Comb1; - false -> Comb1 ++ comb(Mod2, Name2, Args2, S, T2) + case is_compat_opaque_names(T1, T2) of + true -> combine(S, [T1]); + false -> combine(S, [T1, T2]) end. -comb(Mod, Name, Args, S, T) -> - case can_combine_opaque_names(Mod, Name, Args, S) of - true -> - ?opaque(Set) = S, - Set; - false -> - [T#opaque{struct = S}] - end. +combine(?opaque(Set), Ts) -> + [comb2(O, T) || O <- Set, T <- Ts]; +combine(S, Ts) -> + [T#opaque{struct = S} || T <- Ts]. -can_combine_opaque_names(Mod1, Name1, Args1, - ?opaque([#opaque{mod = Mod2, name = Name2, args = Args2}])) -> - is_compat_opaque_names({Mod1, Name1, Args1}, {Mod2, Name2, Args2}); -can_combine_opaque_names(_, _, _, _) -> false. +comb2(O, T) -> + case is_compat_opaque_names(O, T) of + true -> O; + false -> T#opaque{struct = ?opaque(set_singleton(O))} + end. %% Combining two lists this way can be very time consuming... %% Note: two parameterized opaque types are not the same if their @@ -3020,32 +3018,27 @@ inf_opaque(Set1, Set2, Opaques) -> List1 = inf_look_up(Set1, Opaques), List2 = inf_look_up(Set2, Opaques), List0 = [combine(Inf, T1, T2) || - {Is1, ModNameArgs1, T1} <- List1, - {Is2, ModNameArgs2, T2} <- List2, - not t_is_none(Inf = inf_opaque_types(Is1, ModNameArgs1, T1, - Is2, ModNameArgs2, T2, - Opaques))], - List = lists:sort(lists:append(List0)), + {Is1, T1} <- List1, + {Is2, T2} <- List2, + not t_is_none(Inf = inf_opaque_types(Is1, T1, Is2, T2, Opaques))], + List = lists:append(List0), sup_opaque(List). %% Optimization: do just one lookup. inf_look_up(Set, Opaques) -> - [{Opaques =:= 'universe' orelse inf_is_opaque_type2(T, Opaques), - {M, N, Args}, T} || - #opaque{mod = M, name = N, args = Args} = T <- set_to_list(Set)]. + [{Opaques =:= 'universe' orelse inf_is_opaque_type2(T, Opaques), T} || + T <- set_to_list(Set)]. inf_is_opaque_type2(T, {match, Opaques}) -> is_opaque_type2(T, Opaques); inf_is_opaque_type2(T, Opaques) -> is_opaque_type2(T, Opaques). -inf_opaque_types(IsOpaque1, ModNameArgs1, T1, - IsOpaque2, ModNameArgs2, T2, Opaques) -> +inf_opaque_types(IsOpaque1, T1, IsOpaque2, T2, Opaques) -> #opaque{struct = S1}=T1, #opaque{struct = S2}=T2, case - Opaques =:= 'universe' orelse - is_compat_opaque_names(ModNameArgs1, ModNameArgs2) + Opaques =:= 'universe' orelse is_compat_opaque_names(T1, T2) of true -> t_inf(S1, S2, Opaques); false -> @@ -3059,10 +3052,15 @@ inf_opaque_types(IsOpaque1, ModNameArgs1, T1, end end. -is_compat_opaque_names(ModNameArgs, ModNameArgs) -> true; -is_compat_opaque_names({Mod,Name,Args1}, {Mod,Name,Args2}) -> - is_compat_args(Args1, Args2); -is_compat_opaque_names(_, _) -> false. +is_compat_opaque_names(Opaque1, Opaque2) -> + #opaque{mod = Mod1, name = Name1, args = Args1} = Opaque1, + #opaque{mod = Mod2, name = Name2, args = Args2} = Opaque2, + case {{Mod1, Name1, Args1}, {Mod2, Name2, Args2}} of + {ModNameArgs, ModNameArgs} -> true; + {{Mod, Name, Args1}, {Mod, Name, Args2}} -> + is_compat_args(Args1, Args2); + _ -> false + end. is_compat_args([A1|Args1], [A2|Args2]) -> is_compat_arg(A1, A2) andalso is_compat_args(Args1, Args2); @@ -3109,6 +3107,10 @@ is_specialization(?tuple_set(List1), ?tuple_set(List2)) -> [sup_tuple_elements(T) || {_Arity, T} <- List2]) catch _:_ -> false end; +is_specialization(?opaque(_) = T1, T2) -> + is_specialization(t_opaque_structure(T1), T2); +is_specialization(T1, ?opaque(_) = T2) -> + is_specialization(T1, t_opaque_structure(T2)); is_specialization(?union(List1)=T1, ?union(List2)=T2) -> case specialization_union2(T1, T2) of {yes, Type1, Type2} -> is_specialization(Type1, Type2); @@ -3124,10 +3126,6 @@ is_specialization(T1, ?union(List)) -> {yes, Type} -> is_specialization(T1, Type); no -> false end; -is_specialization(?opaque(_) = T1, T2) -> - is_specialization(t_opaque_structure(T1), T2); -is_specialization(T1, ?opaque(_) = T2) -> - is_specialization(T1, t_opaque_structure(T2)); is_specialization(?var(_), _) -> exit(error); is_specialization(_, ?var(_)) -> exit(error); is_specialization(?none, _) -> false; @@ -4379,7 +4377,7 @@ record_field_diffs_to_string(?tuple([_|Fs], Arity, Tag), RecDict) -> string:join(FieldDiffs, " and "). field_diffs([F|Fs], [{FName, _Abstr, DefType}|FDefs], RecDict, Acc) -> - %% Don't care about opaqueness for now. + %% Don't care about opacity for now. NewAcc = case not t_is_none(t_inf(F, DefType)) of true -> Acc; @@ -4482,28 +4480,31 @@ t_from_form1(Form, ET, Site, MR, V, C) -> vtab = V, tnames = TypeNames}, L = ?EXPAND_LIMIT, - {T1, L1, C1} = from_form(Form, State, ?EXPAND_DEPTH, L, C), + {T0, L0, C0} = from_form(Form, State, ?EXPAND_DEPTH, L, C), if - L1 =< 0 -> - from_form_loop(Form, State, 1, L, C1); + L0 =< 0 -> + {T1, _, C1} = from_form(Form, State, 1, L, C0), + from_form_loop(Form, State, 2, L, C1, T1); true -> - {T1, C1} + {T0, C0} end. initial_typenames({type, _MTA}=Site) -> [Site]; initial_typenames({spec, _MFA}) -> []; initial_typenames({record, _MRA}) -> []. -from_form_loop(Form, State, D, Limit, C) -> +from_form_loop(Form, State, D, Limit, C, T0) -> {T1, L1, C1} = from_form(Form, State, D, Limit, C), Delta = Limit - L1, if - %% Save some time by assuming next depth will exceed the limit. + L1 =< 0 -> + {T0, C1}; Delta * 8 > Limit -> + %% Save some time by assuming next depth will exceed the limit. {T1, C1}; true -> D1 = D + 1, - from_form_loop(Form, State, D1, Limit, C1) + from_form_loop(Form, State, D1, Limit, C1, T1) end. -spec from_form(parse_form(), diff --git a/lib/hipe/icode/hipe_beam_to_icode.erl b/lib/hipe/icode/hipe_beam_to_icode.erl index 224aacd8d7..3386523206 100644 --- a/lib/hipe/icode/hipe_beam_to_icode.erl +++ b/lib/hipe/icode/hipe_beam_to_icode.erl @@ -763,32 +763,10 @@ trans_fun([{test,bs_test_unit,{f,Lbl},[Ms,Unit]}| [MsVar], [], Env, Instructions); trans_fun([{test,bs_match_string,{f,Lbl},[Ms,BitSize,Bin]}| Instructions], Env) -> - True = mk_label(new), - FalseLabName = map_label(Lbl), - TrueLabName = hipe_icode:label_name(True), + %% the current match buffer MsVar = mk_var(Ms), - TmpVar = mk_var(new), - ByteSize = BitSize div 8, - ExtraBits = BitSize rem 8, - WordSize = hipe_rtl_arch:word_size(), - if ExtraBits =:= 0 -> - trans_op_call({hipe_bs_primop,{bs_match_string,Bin,ByteSize}}, Lbl, - [MsVar], [MsVar], Env, Instructions); - BitSize =< ((WordSize * 8) - 5) -> - <<Int:BitSize, _/bits>> = Bin, - {I1,Env1} = trans_one_op_call({hipe_bs_primop,{bs_get_integer,BitSize,0}}, Lbl, - [MsVar], [TmpVar, MsVar], Env), - I2 = hipe_icode:mk_type([TmpVar], {integer,Int}, TrueLabName, FalseLabName), - I1 ++ [I2,True] ++ trans_fun(Instructions, Env1); - true -> - <<RealBin:ByteSize/binary, Int:ExtraBits, _/bits>> = Bin, - {I1,Env1} = trans_one_op_call({hipe_bs_primop,{bs_match_string,RealBin,ByteSize}}, Lbl, - [MsVar], [MsVar], Env), - {I2,Env2} = trans_one_op_call({hipe_bs_primop,{bs_get_integer,ExtraBits,0}}, Lbl, - [MsVar], [TmpVar, MsVar], Env1), - I3 = hipe_icode:mk_type([TmpVar], {integer,Int}, TrueLabName, FalseLabName), - I1 ++ I2 ++ [I3,True] ++ trans_fun(Instructions, Env2) - end; + Primop = {hipe_bs_primop, {bs_match_string, Bin, BitSize}}, + trans_op_call(Primop, Lbl, [MsVar], [MsVar], Env, Instructions); trans_fun([{bs_context_to_binary,Var}|Instructions], Env) -> %% the current match buffer IVars = [trans_arg(Var)], diff --git a/lib/hipe/icode/hipe_icode_primops.erl b/lib/hipe/icode/hipe_icode_primops.erl index cee37b6a57..2a141c514e 100644 --- a/lib/hipe/icode/hipe_icode_primops.erl +++ b/lib/hipe/icode/hipe_icode_primops.erl @@ -287,8 +287,8 @@ pp(Dev, Op) -> io:format(Dev, "bs_start_match<~w>", [Max]); {{bs_start_match, Type}, Max} -> io:format(Dev, "bs_start_match<~w,~w>", [Type,Max]); - {bs_match_string, String, SizeInBytes} -> - io:format(Dev, "bs_match_string<~w, ~w>", [String, SizeInBytes]); + {bs_match_string, String, SizeInBits} -> + io:format(Dev, "bs_match_string<~w, ~w>", [String, SizeInBits]); {bs_get_integer, Size, Flags} -> io:format(Dev, "bs_get_integer<~w, ~w>", [Size, Flags]); {bs_get_float, Size, Flags} -> @@ -596,10 +596,10 @@ type(Primop, Args) -> erl_types:t_subtract(Type, erl_types:t_matchstate()), erl_types:t_matchstate_slot( erl_types:t_inf(Type, erl_types:t_matchstate()), 0)); - {hipe_bs_primop, {bs_match_string,_,Bytes}} -> + {hipe_bs_primop, {bs_match_string,_,Bits}} -> [MatchState] = Args, BinType = erl_types:t_matchstate_present(MatchState), - NewBinType = match_bin(erl_types:t_bitstr(0, Bytes*8), BinType), + NewBinType = match_bin(erl_types:t_bitstr(0, Bits), BinType), erl_types:t_matchstate_update_present(NewBinType, MatchState); {hipe_bs_primop, {bs_test_unit,Unit}} -> [MatchState] = Args, diff --git a/lib/hipe/llvm/hipe_llvm_main.erl b/lib/hipe/llvm/hipe_llvm_main.erl index 476d6fb49c..7f70826046 100644 --- a/lib/hipe/llvm/hipe_llvm_main.erl +++ b/lib/hipe/llvm/hipe_llvm_main.erl @@ -84,7 +84,7 @@ compile_with_llvm(FunName, Arity, LLVMCode, Options, UseBuffer) -> __ = file:close(File_llvm), %% Invoke LLVM compiler tools to produce an object file llvm_opt(Dir, Filename, Options), - llvm_llc(Dir, Filename, Options), + llvm_llc(Dir, Filename, Ver, Options), compile(Dir, Filename, "gcc"), %%FIXME: use llc -filetype=obj and skip this! {ok, Dir, Dir ++ Filename ++ ".o"}. @@ -103,12 +103,14 @@ llvm_opt(Dir, Filename, Options) -> %% @doc Invoke llc tool to compile the bitcode to object file %% (_name.bc -> _name.o). -llvm_llc(Dir, Filename, Options) -> +llvm_llc(Dir, Filename, Ver, Options) -> Source = Dir ++ Filename ++ ".bc", OptLevel = trans_optlev_flag(llc, Options), + VerFlags = llc_ver_flags(Ver), Align = find_stack_alignment(), LlcFlags = [OptLevel, "-code-model=medium", "-stack-alignment=" ++ Align - , "-tailcallopt", "-filetype=asm"], %%FIXME + , "-tailcallopt", "-filetype=asm" %FIXME + | VerFlags], Command = "llc " ++ fix_opts(LlcFlags) ++ " " ++ Source, %% io:format("LLC: ~s~n", [Command]), case os:cmd(Command) of @@ -153,6 +155,12 @@ trans_optlev_flag(Tool, Options) -> undefined -> "-O2" end. +llc_ver_flags(Ver = {_, _}) when Ver >= {3,9} -> + %% Works around a bug in the x86-call-frame-opt pass (as of LLVM 3.9) that + %% break the garbage collection stack descriptors. + ["-no-x86-call-frame-opt"]; +llc_ver_flags({_, _}) -> []. + %%------------------------------------------------------------------------------ %% Functions to manage Relocations %%------------------------------------------------------------------------------ diff --git a/lib/hipe/llvm/hipe_rtl_to_llvm.erl b/lib/hipe/llvm/hipe_rtl_to_llvm.erl index 66b2e10fb8..2179f7f765 100644 --- a/lib/hipe/llvm/hipe_rtl_to_llvm.erl +++ b/lib/hipe/llvm/hipe_rtl_to_llvm.erl @@ -10,7 +10,8 @@ -include("../rtl/hipe_literals.hrl"). -include("hipe_llvm_arch.hrl"). --define(WORD_WIDTH, (?bytes_to_bits(hipe_rtl_arch:word_size()))). +-define(BITS_IN_WORD, (?bytes_to_bits(hipe_rtl_arch:word_size()))). +-define(BITS_IN_BYTE, (?bytes_to_bits(1))). -define(BRANCH_META_TAKEN, "0"). -define(BRANCH_META_NOT_TAKEN, "1"). -define(FIRST_FREE_META_NO, 2). @@ -95,9 +96,9 @@ do_alloca_stack([], _, _, Acc) -> Acc; do_alloca_stack([D|Ds], Params, Roots, Acc) -> {Name, _I} = trans_dst(D), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), - ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(8)), + ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(?BITS_IN_BYTE)), case hipe_rtl:is_var(D) of true -> Num = hipe_rtl:var_index(D), @@ -233,7 +234,7 @@ trans_alu(I, Relocs) -> {Src1, I1} = trans_src(hipe_rtl:alu_src1(I)), {Src2, I2} = trans_src(hipe_rtl:alu_src2(I)), Op = trans_op(hipe_rtl:alu_op(I)), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), I3 = hipe_llvm:mk_operation(TmpDst, Op, WordTy, Src1, Src2, []), I4 = store_stack_dst(TmpDst, RtlDst), {[I4, I3, I2, I1], Relocs}. @@ -258,7 +259,7 @@ trans_alub_overflow(I, Sign, Relocs) -> TmpDst = mk_temp(), Name = trans_alub_op(I, Sign), NewRelocs = relocs_store(Name, {call, {llvm, Name, 2}}, Relocs), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), ReturnType = hipe_llvm:mk_struct([WordTy, hipe_llvm:mk_int(1)]), T1 = mk_temp(), I3 = hipe_llvm:mk_call(T1, false, [], [], ReturnType, "@" ++ Name, @@ -320,7 +321,7 @@ trans_alub_no_overflow(I, Relocs) -> {Dst, I2} = trans_src(hipe_rtl:alub_dst(I)), Cond = trans_rel_op(hipe_rtl:alub_cond(I)), T3 = mk_temp(), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), I5 = hipe_llvm:mk_icmp(T3, Cond, WordTy, Dst, "0"), %% br Metadata = branch_metadata(hipe_rtl:alub_pred(I)), @@ -338,7 +339,7 @@ trans_branch(I, Relocs) -> Cond = trans_rel_op(hipe_rtl:branch_cond(I)), %% icmp T1 = mk_temp(), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), I3 = hipe_llvm:mk_icmp(T1, Cond, WordTy, Src1, Src2), %% br True_label = mk_jump_label(hipe_rtl:branch_true_label(I)), @@ -366,7 +367,7 @@ trans_call(I, Relocs) -> {Name, I3, Relocs2} = trans_call_name(RtlCallName, Relocs1, CallArgs, FinalArgs), T1 = mk_temp(), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), FunRetTy = hipe_llvm:mk_struct(lists:duplicate(?NR_PINNED_REGS + 1, WordTy)), I4 = case hipe_rtl:call_fail(I) of @@ -450,7 +451,7 @@ trans_call_name(RtlCallName, Relocs, CallArgs, FinalArgs) -> %% order to make the call TT1 = mk_temp(), {RegName, II1} = trans_src(Reg), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), II2 = hipe_llvm:mk_conversion(TT1, inttoptr, WordTy, RegName, WordTyPtr), @@ -503,7 +504,7 @@ trans_enter(I, Relocs) -> {Name, I2, NewRelocs} = trans_call_name(hipe_rtl:enter_fun(I), Relocs, CallArgs, FinalArgs), T1 = mk_temp(), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), FunRetTy = hipe_llvm:mk_struct(lists:duplicate(?NR_PINNED_REGS + 1, WordTy)), I3 = hipe_llvm:mk_call(T1, true, "cc 11", [], FunRetTy, Name, FinalArgs, []), I4 = hipe_llvm:mk_ret([{FunRetTy, T1}]), @@ -518,7 +519,7 @@ trans_fconv(I, Relocs) -> TmpDst = mk_temp(), {Src, I1} = trans_float_src(hipe_rtl:fconv_src(I)), FloatTy = hipe_llvm:mk_double(), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), I2 = hipe_llvm:mk_conversion(TmpDst, sitofp, WordTy, Src, FloatTy), I3 = store_float_stack(TmpDst, RtlDst), {[I3, I2, I1], Relocs}. @@ -538,7 +539,7 @@ trans_fload(I, Relocs) -> {Src, I1} = trans_float_src(RtlSrc), {Offset, I2} = trans_float_src(_Offset), T1 = mk_temp(), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), FloatTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_double()), I3 = hipe_llvm:mk_operation(T1, add, WordTy, Src, Offset, []), T2 = mk_temp(), @@ -619,7 +620,7 @@ trans_fstore(I, Relocs) -> trans_fstore_reg(I, Relocs) -> {Base, I0} = trans_reg(hipe_rtl:fstore_base(I), dst), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), FloatTy = hipe_llvm:mk_double(), FloatTyPtr = hipe_llvm:mk_pointer(FloatTy), @@ -659,7 +660,7 @@ trans_load(I, Relocs) -> {Src, I1} = trans_src(hipe_rtl:load_src(I)), {Offset, I2} = trans_src(hipe_rtl:load_offset(I)), T1 = mk_temp(), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), I3 = hipe_llvm:mk_operation(T1, add, WordTy, Src, Offset, []), %%---------------------------------------------------------------- @@ -737,7 +738,7 @@ trans_move(I, Relocs) -> %% return %% trans_return(I, Relocs) -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), {VarRet, I1} = case hipe_rtl:return_varlist(I) of [] -> @@ -777,7 +778,7 @@ trans_store(I, Relocs) -> {Offset, I2} = trans_src(hipe_rtl:store_offset(I)), {Value, I3} = trans_src(hipe_rtl:store_src(I)), T1 = mk_temp(), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), I4 = hipe_llvm:mk_operation(T1, add, WordTy, Base, Offset, []), I5 = @@ -811,14 +812,14 @@ trans_switch(I, Relocs, Data) -> JumpLabels = [mk_jump_label(L) || L <- Labels], SortOrder = hipe_rtl:switch_sort_order(I), NrLabels = length(Labels), - ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(8)), + ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(?BITS_IN_BYTE)), TableType = hipe_llvm:mk_array(NrLabels, ByteTyPtr), TableTypeP = hipe_llvm:mk_pointer(TableType), TypedJumpLabels = [{hipe_llvm:mk_label_type(), X} || X <- JumpLabels], T1 = mk_temp(), {Src2, []} = trans_dst(RtlSrc), TableName = "table_" ++ tl(Src2), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), I2 = hipe_llvm:mk_getelementptr(T1, TableTypeP, "@"++TableName, [{WordTy, "0"}, {WordTy, Src}], false), T2 = mk_temp(), @@ -933,7 +934,7 @@ create_fail_blocks(Label, FailLabels, Acc) -> false -> Acc; {value, {Label, FailLabel, SpAdj}, RestFailLabels} -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), I1 = hipe_llvm:mk_label(FailLabel), LP = hipe_llvm:mk_landingpad(), I2 = @@ -962,7 +963,7 @@ create_fail_blocks(Label, FailLabels, Acc) -> %% @doc Convert RTL argument list to LLVM argument list. trans_args(ArgList) -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), MakeArg = fun(A) -> {Name, I1} = trans_src(A), @@ -972,13 +973,13 @@ trans_args(ArgList) -> %% @doc Convert a list of Precoloured registers to LLVM argument list. fix_reg_args(ArgList) -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), [{WordTy, A} || A <- ArgList]. %% @doc Load Precoloured registers. load_fixed_regs(RegList) -> Names = [mk_temp_reg(R) || R <- RegList], - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), Fun1 = fun (X, Y) -> @@ -991,7 +992,7 @@ load_fixed_regs(RegList) -> store_fixed_regs(RegList, Name) -> Names = [mk_temp_reg(R) || R <- RegList], Indexes = lists:seq(0, erlang:length(RegList) - 1), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), FunRetTy = hipe_llvm:mk_struct(lists:duplicate(?NR_PINNED_REGS + 1, WordTy)), Fun1 = @@ -1060,7 +1061,7 @@ mk_temp_reg(Name) -> store_stack_dst(TempDst, Dst) -> {Dst2, II1} = trans_dst(Dst), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), II2 = hipe_llvm:mk_store(WordTy, TempDst, WordTyPtr, Dst2, [], [], false), [II2, II1]. @@ -1078,7 +1079,7 @@ trans_float_src(Src) -> Name = "@DL" ++ integer_to_list(hipe_rtl:const_label_label(Src)), T1 = mk_temp(), %% XXX: Hardcoded offset - ByteTy = hipe_llvm:mk_int(8), + ByteTy = hipe_llvm:mk_int(?BITS_IN_BYTE), ByteTyPtr = hipe_llvm:mk_pointer(ByteTy), I1 = hipe_llvm:mk_getelementptr(T1, ByteTyPtr, Name, [{ByteTy, integer_to_list(?FLOAT_OFFSET)}], true), @@ -1094,7 +1095,7 @@ trans_float_src(Src) -> end. trans_src(A) -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), case hipe_rtl:is_imm(A) of true -> @@ -1197,7 +1198,7 @@ map_precoloured_reg(Index) -> fix_reg_dst(Register) -> case Register of {Name, Offset} -> %% Case of %fcalls, %hplim - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), pointer_from_reg(Name, WordTy, Offset); Name -> %% Case of %p and %hp {Name, []} @@ -1205,7 +1206,7 @@ fix_reg_dst(Register) -> %% @doc Load precoloured src register. fix_reg_src(Register) -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), case Register of {Name, Offset} -> %% Case of %fcalls, %hplim @@ -1327,10 +1328,10 @@ insn_dst(I) -> llvm_type_from_size(Size) -> case Size of - byte -> hipe_llvm:mk_int(8); + byte -> hipe_llvm:mk_int(?BITS_IN_BYTE); int16 -> hipe_llvm:mk_int(16); int32 -> hipe_llvm:mk_int(32); - word -> hipe_llvm:mk_int(64) + word -> hipe_llvm:mk_int(?BITS_IN_WORD) end. %% @doc Create definition for the compiled function. The parameters that are @@ -1360,13 +1361,13 @@ create_function_definition(Fun, Params, Code, LocalVars) -> lists:flatten([EntryLabel, ExceptionSync, I2, LocalVars, StoredParams, I3]), Final_Code = EntryBlock ++ Code, FunctionOptions = [nounwind, noredzone, list_to_atom("gc \"erlang\"")], - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), FunRetTy = hipe_llvm:mk_struct(lists:duplicate(?NR_PINNED_REGS + 1, WordTy)), hipe_llvm:mk_fun_def([], [], "cc 11", [], FunRetTy, FunctionName, Args, FunctionOptions, [], Final_Code). header_params(Params) -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), [{WordTy, "%v" ++ integer_to_list(hipe_rtl:var_index(P))} || P <- Params]. store_params(Params) -> @@ -1375,7 +1376,7 @@ store_params(Params) -> Index = hipe_rtl:var_index(X), {Name, _} = trans_dst(X), ParamName = "%v" ++ integer_to_list(Index), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), hipe_llvm:mk_store(WordTy, ParamName, WordTyPtr, Name, [], [], false) end, @@ -1392,11 +1393,11 @@ fixed_registers() -> end. header_regs(Registers) -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), [{WordTy, "%" ++ X ++ "_in"} || X <- Registers]. load_regs(Registers) -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), WordTyPtr = hipe_llvm:mk_pointer(WordTy), Fun1 = fun(X) -> @@ -1496,28 +1497,30 @@ seperate_relocs([R|Rs], CallAcc, AtomAcc, ClosureAcc, LabelAcc, JmpTableAcc) -> %% @doc External declaration of an atom. declare_atom({AtomName, _}) -> - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), - hipe_llvm:mk_const_decl("@" ++ AtomName, "external constant", WordTy, ""). + %% The type has to be byte, or a backend might assume the constant is aligned + %% and incorrectly optimise away type tests + ByteTy = hipe_llvm:mk_int(?BITS_IN_BYTE), + hipe_llvm:mk_const_decl("@" ++ AtomName, "external constant", ByteTy, ""). %% @doc Creation of local variable for an atom. load_atom({AtomName, _}) -> Dst = "%" ++ AtomName ++ "_var", Name = "@" ++ AtomName, - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), - WordTyPtr = hipe_llvm:mk_pointer(WordTy), - hipe_llvm:mk_conversion(Dst, ptrtoint, WordTyPtr, Name, WordTy). + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), + ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(?BITS_IN_BYTE)), + hipe_llvm:mk_conversion(Dst, ptrtoint, ByteTyPtr, Name, WordTy). %% @doc External declaration of a closure. declare_closure({ClosureName, _})-> - ByteTy = hipe_llvm:mk_int(8), + ByteTy = hipe_llvm:mk_int(?BITS_IN_BYTE), hipe_llvm:mk_const_decl("@" ++ ClosureName, "external constant", ByteTy, ""). %% @doc Creation of local variable for a closure. load_closure({ClosureName, _})-> Dst = "%" ++ ClosureName ++ "_var", Name = "@" ++ ClosureName, - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), - ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(8)), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), + ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(?BITS_IN_BYTE)), hipe_llvm:mk_conversion(Dst, ptrtoint, ByteTyPtr, Name, WordTy). %% @doc Declaration of a local variable for a switch jump table. @@ -1548,7 +1551,7 @@ declare_closure_labels(ClosureLabels, Relocs, Fun) -> List3 = string:join(List2, ",\n"), List4 = "[\n" ++ List3 ++ "\n]\n", NrLabels = length(LabelList), - ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(8)), + ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(?BITS_IN_BYTE)), TableType = hipe_llvm:mk_array(NrLabels, ByteTyPtr), ConstDecl = hipe_llvm:mk_const_decl("@table_closures", "constant", TableType, List4), @@ -1563,7 +1566,7 @@ is_external_call(_, _) -> true. call_to_decl({Name, {call, MFA}}) -> {M, _F, A} = MFA, CConv = "cc 11", - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), FunRetTy = hipe_llvm:mk_struct(lists:duplicate(?NR_PINNED_REGS + 1, WordTy)), {Type, Args} = case M of @@ -1578,14 +1581,14 @@ call_to_decl({Name, {call, MFA}}) -> %% @doc These functions are always declared, even if not used. fixed_fun_decl() -> - ByteTy = hipe_llvm:mk_int(8), + ByteTy = hipe_llvm:mk_int(?BITS_IN_BYTE), ByteTyPtr = hipe_llvm:mk_pointer(ByteTy), LandPad = hipe_llvm:mk_fun_decl([], [], [], [], hipe_llvm:mk_int(32), "@__gcc_personality_v0", [hipe_llvm:mk_int(32), hipe_llvm:mk_int(64), ByteTyPtr, ByteTyPtr], []), GCROOTDecl = hipe_llvm:mk_fun_decl([], [], [], [], hipe_llvm:mk_void(), "@llvm.gcroot", [hipe_llvm:mk_pointer(ByteTyPtr), ByteTyPtr], []), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), FunRetTy = hipe_llvm:mk_struct(lists:duplicate(?NR_PINNED_REGS + 1, WordTy)), FixPinnedRegs = hipe_llvm:mk_fun_decl([], [], [], [], FunRetTy, "@hipe_bifs.llvm_fix_pinned_regs.0", [], []), @@ -1599,7 +1602,7 @@ fixed_fun_decl() -> %% values, add the offset and convert them again to pointers. declare_constant(Label) -> Name = "@DL" ++ integer_to_list(Label), - ByteTy = hipe_llvm:mk_int(8), + ByteTy = hipe_llvm:mk_int(?BITS_IN_BYTE), hipe_llvm:mk_const_decl(Name, "external constant", ByteTy, ""). %% @doc Load a constant is achieved by converting a pointer to an integer of @@ -1607,8 +1610,8 @@ declare_constant(Label) -> load_constant(Label) -> Dst = "%DL" ++ integer_to_list(Label) ++ "_var", Name = "@DL" ++ integer_to_list(Label), - WordTy = hipe_llvm:mk_int(?WORD_WIDTH), - ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(8)), + WordTy = hipe_llvm:mk_int(?BITS_IN_WORD), + ByteTyPtr = hipe_llvm:mk_pointer(hipe_llvm:mk_int(?BITS_IN_BYTE)), hipe_llvm:mk_conversion(Dst, ptrtoint, ByteTyPtr, Name, WordTy). %% @doc Store external constants and calls to dictionary. diff --git a/lib/hipe/rtl/hipe_rtl_binary.erl b/lib/hipe/rtl/hipe_rtl_binary.erl index fb9c0c196d..9b400f4c93 100644 --- a/lib/hipe/rtl/hipe_rtl_binary.erl +++ b/lib/hipe/rtl/hipe_rtl_binary.erl @@ -19,7 +19,7 @@ %%% %CopyrightEnd% %%% %%%------------------------------------------------------------------- -%%% File : hipe_rtl_binary_2.erl +%%% File : hipe_rtl_binary.erl %%% Author : Per Gustafsson <[email protected]> %%% Description : %%% diff --git a/lib/hipe/rtl/hipe_rtl_binary_match.erl b/lib/hipe/rtl/hipe_rtl_binary_match.erl index 528672b893..d999cd2743 100644 --- a/lib/hipe/rtl/hipe_rtl_binary_match.erl +++ b/lib/hipe/rtl/hipe_rtl_binary_match.erl @@ -270,24 +270,23 @@ gen_rtl({bs_save, Slot}, [NewMs], [Ms], TrueLblName, _FalseLblName) -> set_field_from_term({matchstate, {saveoffset, Slot}}, Ms, Offset), hipe_rtl:mk_goto(TrueLblName)]; %% ----- bs_match_string ----- -gen_rtl({bs_match_string, String, ByteSize}, Dst, [Ms], +gen_rtl({bs_match_string, String, BitSize}, Dst, [Ms], TrueLblName, FalseLblName) -> {[Offset, BinSize, Base], Instrs} = extract_matchstate_vars([offset, binsize, base], Ms), [SuccessLbl, ALbl, ULbl] = create_lbls(3), [NewOffset, BitOffset] = create_gcsafe_regs(2), - Unit = hipe_rtl_arch:word_size() - 1, - Loops = ByteSize div Unit, - Init = + Unit = (hipe_rtl_arch:word_size() - 1) * ?BYTE_SIZE, + Init = [Instrs, opt_update_ms(Dst, Ms), - check_size(Offset, hipe_rtl:mk_imm(ByteSize*?BYTE_SIZE), BinSize, + check_size(Offset, hipe_rtl:mk_imm(BitSize), BinSize, NewOffset, hipe_rtl:label_name(SuccessLbl), FalseLblName), SuccessLbl], SplitCode = [hipe_rtl:mk_alub(BitOffset, Offset, 'and', hipe_rtl:mk_imm(?LOW_BITS), eq, hipe_rtl:label_name(ALbl), hipe_rtl:label_name(ULbl))], - Loops = ByteSize div Unit, + Loops = BitSize div Unit, SkipSize = Loops * Unit, {ACode1, UCode1} = case Loops of @@ -297,9 +296,9 @@ gen_rtl({bs_match_string, String, ByteSize}, Dst, [Ms], create_loops(Loops, Unit, String, Base, Offset, BitOffset, FalseLblName) end, - <<_:SkipSize/binary, RestString/binary>> = String, + <<_:SkipSize/bits, RestString/bits>> = String, {ACode2, UCode2} = - case ByteSize rem Unit of + case BitSize rem Unit of 0 -> {[], []}; Rem -> @@ -393,12 +392,12 @@ validate_unicode_retract_c_code(Src, Ms, TrueLblName, FalseLblName) -> create_loops(Loops, Unit, String, Base, Offset, BitOffset, FalseLblName) -> [Reg] = create_gcsafe_regs(1), AlignedFun = fun(Value) -> - [get_int_to_reg(Reg, Unit*?BYTE_SIZE, Base, Offset, 'srl', + [get_int_to_reg(Reg, Unit, Base, Offset, 'srl', {unsigned, big}), update_and_test(Reg, Unit, Offset, Value, FalseLblName)] end, UnAlignedFun = fun(Value) -> - [get_unaligned_int_to_reg(Reg, Unit*?BYTE_SIZE, + [get_unaligned_int_to_reg(Reg, Unit, Base, Offset, BitOffset, 'srl', {unsigned, big})| update_and_test(Reg, Unit, Offset, Value, FalseLblName)] @@ -406,31 +405,31 @@ create_loops(Loops, Unit, String, Base, Offset, BitOffset, FalseLblName) -> {create_loops(Loops, Unit, String, AlignedFun), create_loops(Loops, Unit, String, UnAlignedFun)}. -create_rests(Rem, String, Base, Offset, BitOffset, FalseLblName) -> +create_rests(RemBits, String, Base, Offset, BitOffset, FalseLblName) -> [Reg] = create_gcsafe_regs(1), AlignedFun = fun(Value) -> - [get_int_to_reg(Reg, Rem*?BYTE_SIZE, Base, Offset, 'srl', + [get_int_to_reg(Reg, RemBits, Base, Offset, 'srl', {unsigned, big})| just_test(Reg, Value, FalseLblName)] end, UnAlignedFun = fun(Value) -> - [get_unaligned_int_to_reg(Reg, Rem*?BYTE_SIZE, + [get_unaligned_int_to_reg(Reg, RemBits, Base, Offset, BitOffset, 'srl', {unsigned, big})| just_test(Reg, Value, FalseLblName)] end, - {create_loops(1, Rem, String, AlignedFun), - create_loops(1, Rem, String, UnAlignedFun)}. + {create_loops(1, RemBits, String, AlignedFun), + create_loops(1, RemBits, String, UnAlignedFun)}. create_loops(0, _Unit, _String, _IntFun) -> []; create_loops(N, Unit, String, IntFun) -> - {Value, RestString} = get_value(Unit,String), + {Value, RestString} = get_value(Unit, String), [IntFun(Value), create_loops(N-1, Unit, RestString, IntFun)]. update_and_test(Reg, Unit, Offset, Value, FalseLblName) -> - [add_to_offset(Offset, Offset, hipe_rtl:mk_imm(Unit*?BYTE_SIZE), FalseLblName), + [add_to_offset(Offset, Offset, hipe_rtl:mk_imm(Unit), FalseLblName), just_test(Reg, Value, FalseLblName)]. just_test(Reg, Value, FalseLblName) -> @@ -439,8 +438,8 @@ just_test(Reg, Value, FalseLblName) -> hipe_rtl:label_name(ContLbl), FalseLblName), ContLbl]. -get_value(N,String) -> - <<I:N/integer-unit:8, Rest/binary>> = String, +get_value(N, String) -> + <<I:N, Rest/bits>> = String, {I, Rest}. make_int_gc_code(I) when is_integer(I) -> diff --git a/lib/hipe/test/bs_SUITE_data/bs_pmatch_bugs.erl b/lib/hipe/test/bs_SUITE_data/bs_pmatch_bugs.erl index b280705a47..d9f3278b45 100644 --- a/lib/hipe/test/bs_SUITE_data/bs_pmatch_bugs.erl +++ b/lib/hipe/test/bs_SUITE_data/bs_pmatch_bugs.erl @@ -9,6 +9,7 @@ test() -> <<49,50,51>> = lex_digits1(Bin, 1, []), <<49,50,51>> = lex_digits2(Bin, 1, []), ok = var_bind_bug(<<1, 2, 3, 4, 5, 6, 7, 8>>), + ok = bs_match_string_bug(), ok. %%-------------------------------------------------------------------- @@ -65,3 +66,50 @@ var_bind_bug(<<A:1/binary, B:8/integer, _C:B/binary, _Rest/binary>>) -> B -> wrong; _ -> ok end. + +%%-------------------------------------------------------------------- +%% From: Andreas Schultz +%% Date: 2/11/2016 +%% +%% Either HiPE is messing up binary matches in some cases or I'm not +%% seeing the problem. ... <SNIP PROGRAM - CLEANED UP VERSION BELOW> +%% With Erlang 19.1.3 the HiPE compiled version behaves differently +%% than the non-HiPE version: ... <SNIP TEST RUNS> +%% So, do I do something wrong here or is this a legitimate HiPE bug? +%% +%% Yes, this was a legitimate HiPE bug: The BEAM to ICode tranaslation +%% of the bs_match_string instruction, written long ago for binaries +%% (i.e., with byte-sized strings), tried to do a `clever' translation +%% of even bit-sized strings using a HiPE primop that took a `Size' +%% argument expressed in *bytes*. ICode is not really the place to do +%% such a thing, and moreover there is really no reason for the HiPE +%% primop not to take a Size argument expressed in *bits* instead. +%% The bug was fixed by changing the `Size' argument to be in bits, +%% postponing the translation of the bs_match_string primop until RTL +%% and doing a proper translation using bit-sized quantities there. +%%-------------------------------------------------------------------- + +bs_match_string_bug() -> + ok = test0(<<50>>), + Bin = data(), + ok = test1(Bin), + ok = test2(Bin), + ok. + +%% Minimal test case showing the problem matching with strings +test0(<<6:5, 0:1, 0:2>>) -> weird; +test0(<<6:5, _:1, _:2>>) -> ok; +test0(_) -> default. + +data() -> <<50,16,0>>. + +%% This was the problematic test case in HiPE: 'default' was returned +test1(<<1:3, 1:1, _:1, 0:1, 0:1, 0:1, _/binary>>) -> weird; +test1(<<1:3, 1:1, _:1, _:1, _:1, _:1, _/binary>>) -> ok; +test1(_) -> default. + +%% This variation of test1/1 above worked OK, even in HiPE +test2(<<1:3, 1:1, _:1, A:1, B:1, C:1, _/binary>>) + when A =:= 1; B =:= 1; C =:= 1 -> ok; +test2(<<1:3, 1:1, _:1, 0:1, 0:1, 0:1, _/binary>>) -> weird; +test2(_) -> default. diff --git a/lib/inets/doc/src/http_uri.xml b/lib/inets/doc/src/http_uri.xml index 8e0301c520..2ef36d23ee 100644 --- a/lib/inets/doc/src/http_uri.xml +++ b/lib/inets/doc/src/http_uri.xml @@ -118,7 +118,7 @@ <v>Option = {ipv6_host_with_brackets, boolean()} | {scheme_defaults, scheme_defaults()} | {fragment, boolean()} | - {schema_validation_fun, fun()}]</v> + {scheme_validation_fun, fun()}]</v> <v>Result = {Scheme, UserInfo, Host, Port, Path, Query} | {Scheme, UserInfo, Host, Port, Path, Query, Fragment}</v> <v>UserInfo = user_info()</v> diff --git a/lib/inets/doc/src/httpc.xml b/lib/inets/doc/src/httpc.xml index 13471aab2c..705afec022 100644 --- a/lib/inets/doc/src/httpc.xml +++ b/lib/inets/doc/src/httpc.xml @@ -68,7 +68,7 @@ this module:</p> <p><c>boolean() = true | false</c></p> <p><c>string()</c> = list of ASCII characters</p> - <p><c>request_id() = ref()</c></p> + <p><c>request_id() = reference()</c></p> <p><c>profile() = atom()</c></p> <p><c>path() = string()</c> representing a file path or directory path</p> <p><c>ip_address()</c> = See the diff --git a/lib/inets/doc/src/mod_esi.xml b/lib/inets/doc/src/mod_esi.xml index 006fca1bdf..46cc796c8a 100644 --- a/lib/inets/doc/src/mod_esi.xml +++ b/lib/inets/doc/src/mod_esi.xml @@ -67,7 +67,7 @@ <tag><c>{remote_adress, inet:ip_address()} </c></tag> <item><p>The clients ip address.</p></item> - <tag><c>{peer_cert, undefined | no_peercert | DER:binary()</c></tag> + <tag><c>{peer_cert, undefined | no_peercert | DER:binary()}</c></tag> <item> <p>For TLS connections where client certificates are used this will be an ASN.1 DER-encoded X509-certificate as an Erlang binary. diff --git a/lib/inets/src/ftp/ftp.erl b/lib/inets/src/ftp/ftp.erl index 8bad91bf98..911f5b71a7 100644 --- a/lib/inets/src/ftp/ftp.erl +++ b/lib/inets/src/ftp/ftp.erl @@ -108,6 +108,7 @@ -define(DBG(F,A), 'n/a'). %%-define(DBG(F,A), io:format(F,A)). +%%-define(DBG(F,A), if is_list(F) -> ct:pal(F,A); is_atom(F)->ct:pal(atom_to_list(F),A) end). %%%========================================================================= %%% API - CLIENT FUNCTIONS @@ -1095,7 +1096,7 @@ init(Options) -> erlang:monitor(process, Client), %% Make sure inet is started - inet_db:start(), + _ = inet_db:start(), %% Where are we {ok, Dir} = file:get_cwd(), @@ -1105,15 +1106,17 @@ init(Options) -> trace -> dbg:tracer(), dbg:p(all, [call]), - dbg:tpl(ftp, [{'_', [], [{return_trace}]}]), - dbg:tpl(ftp_response, [{'_', [], [{return_trace}]}]), - dbg:tpl(ftp_progress, [{'_', [], [{return_trace}]}]); + {ok, _} = dbg:tpl(ftp, [{'_', [], [{return_trace}]}]), + {ok, _} = dbg:tpl(ftp_response, [{'_', [], [{return_trace}]}]), + {ok, _} = dbg:tpl(ftp_progress, [{'_', [], [{return_trace}]}]), + ok; debug -> dbg:tracer(), dbg:p(all, [call]), - dbg:tp(ftp, [{'_', [], [{return_trace}]}]), - dbg:tp(ftp_response, [{'_', [], [{return_trace}]}]), - dbg:tp(ftp_progress, [{'_', [], [{return_trace}]}]); + {ok, _} = dbg:tp(ftp, [{'_', [], [{return_trace}]}]), + {ok, _} = dbg:tp(ftp_response, [{'_', [], [{return_trace}]}]), + {ok, _} = dbg:tp(ftp_progress, [{'_', [], [{return_trace}]}]), + ok; _ -> %% Keep silent ok @@ -1295,8 +1298,7 @@ handle_call({_,{rmdir, Dir}}, From, #state{chunk = false} = State) -> activate_ctrl_connection(State), {noreply, State#state{client = From}}; -handle_call({_,{type, Type}}, From, #state{chunk = false} - = State) -> +handle_call({_,{type, Type}}, From, #state{chunk = false} = State) -> case Type of ascii -> send_ctrl_message(State, mk_cmd("TYPE A", [])), @@ -1454,7 +1456,7 @@ handle_info({Trpt, Socket, Data}, #state{dsock = {Trpt,Socket}, caller = {recv_file, Fd}} = State0) when Trpt==tcp;Trpt==ssl -> ?DBG('L~p --data ~p ----> ~s~p~n',[?LINE,Socket,Data,State0]), - file_write(binary_to_list(Data), Fd), + ok = file_write(binary_to_list(Data), Fd), progress_report({binary, Data}, State0), State = activate_data_connection(State0), {noreply, State}; @@ -1473,16 +1475,19 @@ handle_info({Trpt, Socket, Data}, #state{dsock = {Trpt,Socket}} = State0) when T Data/binary>>}}; handle_info({Cls, Socket}, #state{dsock = {Trpt,Socket}, - caller = {recv_file, Fd}} - = State) when {Cls,Trpt}=={tcp_closed,tcp} ; {Cls,Trpt}=={ssl_closed,ssl} -> - file_close(Fd), + caller = {recv_file, Fd}} = State) + when {Cls,Trpt}=={tcp_closed,tcp} ; {Cls,Trpt}=={ssl_closed,ssl} -> + case file_close(Fd) of + ok -> ok; + {error,einval} -> ok + end, progress_report({transfer_size, 0}, State), activate_ctrl_connection(State), {noreply, State#state{dsock = undefined, data = <<>>}}; handle_info({Cls, Socket}, #state{dsock = {Trpt,Socket}, client = From, - caller = recv_chunk} - = State) when {Cls,Trpt}=={tcp_closed,tcp} ; {Cls,Trpt}=={ssl_closed,ssl} -> + caller = recv_chunk} = State) + when {Cls,Trpt}=={tcp_closed,tcp} ; {Cls,Trpt}=={ssl_closed,ssl} -> gen_server:reply(From, ok), {noreply, State#state{dsock = undefined, client = undefined, data = <<>>, caller = undefined, @@ -2061,7 +2066,10 @@ handle_ctrl_result({pos_prel, _}, #state{caller = {recv_file, _}} = State0) -> end; handle_ctrl_result({Status, _}, #state{caller = {recv_file, Fd}} = State) -> - file_close(Fd), + case file_close(Fd) of + ok -> ok; + {error, einval} -> ok + end, close_data_connection(State), ctrl_result_response(Status, State#state{dsock = undefined}, {error, epath}); @@ -2220,16 +2228,16 @@ setup_data_connection(#state{mode = active, {ok, Port} = inet:port(LSock), case FtpExt of false -> - {IP1, IP2, IP3, IP4} = IP, - {Port1, Port2} = {Port div 256, Port rem 256}, - send_ctrl_message(State, - mk_cmd("PORT ~w,~w,~w,~w,~w,~w", - [IP1, IP2, IP3, IP4, Port1, Port2])); - true -> - IpAddress = inet_parse:ntoa(IP), - Cmd = mk_cmd("EPRT |1|~s|~p|", [IpAddress, Port]), - send_ctrl_message(State, Cmd) - end, + {IP1, IP2, IP3, IP4} = IP, + {Port1, Port2} = {Port div 256, Port rem 256}, + send_ctrl_message(State, + mk_cmd("PORT ~w,~w,~w,~w,~w,~w", + [IP1, IP2, IP3, IP4, Port1, Port2])); + true -> + IpAddress = inet_parse:ntoa(IP), + Cmd = mk_cmd("EPRT |1|~s|~p|", [IpAddress, Port]), + send_ctrl_message(State, Cmd) + end, activate_ctrl_connection(State), {noreply, State#state{caller = {setup_data_connection, {LSock, Caller}}}} @@ -2337,7 +2345,7 @@ accept_data_connection(#state{mode = passive} = State) -> send_ctrl_message(_S=#state{csock = Socket, verbose = Verbose}, Message) -> verbose(lists:flatten(Message),Verbose,send), ?DBG('<--ctrl ~p ---- ~s~p~n',[Socket,Message,_S]), - send_message(Socket, Message). + ok = send_message(Socket, Message). send_data_message(_S=#state{dsock = Socket}, Message) -> ?DBG('<==data ~p ==== ~s~n~p~n',[Socket,Message,_S]), @@ -2359,23 +2367,26 @@ send_message({ssl, Socket}, Message) -> ssl:send(Socket, Message). activate_ctrl_connection(#state{csock = Socket, ctrl_data = {<<>>, _, _}}) -> - activate_connection(Socket); + ok = activate_connection(Socket); activate_ctrl_connection(#state{csock = Socket}) -> + ok = activate_connection(Socket), %% We have already received at least part of the next control message, %% that has been saved in ctrl_data, process this first. - self() ! {tcp, unwrap_socket(Socket), <<>>}. + self() ! {socket_type(Socket), unwrap_socket(Socket), <<>>}, + ok. unwrap_socket({tcp,Socket}) -> Socket; -unwrap_socket({ssl,Socket}) -> Socket; -unwrap_socket(Socket) -> Socket. +unwrap_socket({ssl,Socket}) -> Socket. +socket_type({tcp,_Socket}) -> tcp; +socket_type({ssl,_Socket}) -> ssl. activate_data_connection(#state{dsock = Socket} = State) -> - activate_connection(Socket), + ok = activate_connection(Socket), State. -activate_connection({tcp, Socket}) -> inet:setopts(Socket, [{active, once}]); -activate_connection({ssl, Socket}) -> ssl:setopts(Socket, [{active, once}]). +activate_connection({tcp, Socket}) -> inet:setopts(Socket, [{active, once}]); +activate_connection({ssl, Socket}) -> ssl:setopts(Socket, [{active, once}]). close_ctrl_connection(#state{csock = undefined}) -> ok; close_ctrl_connection(#state{csock = Socket}) -> close_connection(Socket). @@ -2383,21 +2394,21 @@ close_ctrl_connection(#state{csock = Socket}) -> close_connection(Socket). close_data_connection(#state{dsock = undefined}) -> ok; close_data_connection(#state{dsock = Socket}) -> close_connection(Socket). -close_connection({lsock,Socket}) -> gen_tcp:close(Socket); +close_connection({lsock,Socket}) -> gen_tcp:close(Socket); close_connection({tcp, Socket}) -> gen_tcp:close(Socket); close_connection({ssl, Socket}) -> ssl:close(Socket). -%% ------------ FILE HANDELING ---------------------------------------- +%% ------------ FILE HANDLING ---------------------------------------- send_file(#state{tls_upgrading_data_connection = {true, CTRL, _}} = State, Fd) -> {noreply, State#state{tls_upgrading_data_connection = {true, CTRL, ?MODULE, send_file, Fd}}}; send_file(State, Fd) -> case file_read(Fd) of - {ok, N, Bin} when N > 0-> + {ok, N, Bin} when N > 0 -> send_data_message(State, Bin), progress_report({binary, Bin}, State), send_file(State, Fd); {ok, _, _} -> - file_close(Fd), + ok = file_close(Fd), close_data_connection(State), progress_report({transfer_size, 0}, State), activate_ctrl_connection(State), @@ -2504,7 +2515,7 @@ progress_report(stop, #state{progress = ProgressPid}) -> ftp_progress:stop(ProgressPid); progress_report({binary, Data}, #state{progress = ProgressPid}) -> ftp_progress:report(ProgressPid, {transfer_size, size(Data)}); -progress_report(Report, #state{progress = ProgressPid}) -> +progress_report(Report, #state{progress = ProgressPid}) -> ftp_progress:report(ProgressPid, Report). diff --git a/lib/inets/src/ftp/ftp_progress.erl b/lib/inets/src/ftp/ftp_progress.erl index 68185a222d..a6263e5cd7 100644 --- a/lib/inets/src/ftp/ftp_progress.erl +++ b/lib/inets/src/ftp/ftp_progress.erl @@ -36,11 +36,11 @@ -include_lib("kernel/include/file.hrl"). -record(progress, { - file, % string() - cb_module, % atom() - cb_function, % atom() - init_progress_term, % term() - current_progress_term % term() + file :: string() | 'undefined', + cb_module :: module(), + cb_function :: atom(), + init_progress_term :: term(), + current_progress_term :: term() }). %%%========================================================================= @@ -53,13 +53,15 @@ %% Description: Starts the progress report process unless progress reporting %% should not be performed. %%-------------------------------------------------------------------------- +-type options() :: 'ignore' | {module(), atom(), term()}. +-spec start_link(options()) -> 'ignore' | pid(). start_link(ignore) -> ignore; start_link(Options) -> spawn_link(?MODULE, init, [Options]). %%-------------------------------------------------------------------------- -%% report_progress(Pid, Report) -> _ +%% report_progress(Pid, Report) -> ok %% Pid = pid() %% Report = {local_file, File} | {remote_file, File} | %% {transfer_size, Size} @@ -68,17 +70,23 @@ start_link(Options) -> %% Description: Reports progress to the reporting process that calls the %% user defined callback function. %%-------------------------------------------------------------------------- +-type report() :: {'local_file', string()} | {'remote_file', string()} + | {'transfer_size', non_neg_integer()}. +-spec report(pid(), report()) -> 'ok'. report(Pid, Report) -> - Pid ! {progress_report, Report}. + Pid ! {progress_report, Report}, + ok. %%-------------------------------------------------------------------------- -%% stop(Pid) -> _ +%% stop(Pid) -> ok %% Pid = pid() %% %% Description: %%-------------------------------------------------------------------------- +-spec stop(pid()) -> 'ok'. stop(Pid) -> - Pid ! stop. + Pid ! stop, + ok. %%%========================================================================= %%% Internal functions diff --git a/lib/inets/src/ftp/ftp_response.erl b/lib/inets/src/ftp/ftp_response.erl index 7533bc4550..d54d97dc91 100644 --- a/lib/inets/src/ftp/ftp_response.erl +++ b/lib/inets/src/ftp/ftp_response.erl @@ -90,19 +90,23 @@ parse_lines(<<C1, C2, C3, ?WHITE_SPACE, Bin/binary>>, Lines, start) -> parse_lines(Bin, [?WHITE_SPACE, C3, C2, C1 | Lines], finish); %% Last line found -parse_lines(<<C1, C2, C3, ?WHITE_SPACE, Rest/binary>>, Lines, {C1, C2, C3}) -> - parse_lines(Rest, [?WHITE_SPACE, C3, C2, C1 | Lines], finish); +parse_lines(<<?CR, ?LF, C1, C2, C3, ?WHITE_SPACE, Rest/binary>>, Lines, {C1, C2, C3}) -> + parse_lines(Rest, [?WHITE_SPACE, C3, C2, C1, ?LF, ?CR | Lines], finish); %% Potential end found wait for more data -parse_lines(<<C1, C2, C3>> = Bin, Lines, {C1, C2, C3}) -> +parse_lines(<<?CR, ?LF, C1, C2, C3>> = Bin, Lines, {C1, C2, C3}) -> {continue, {Bin, Lines, {C1, C2, C3}}}; %% Intermidate line begining with status code -parse_lines(<<C1, C2, C3, Rest/binary>>, Lines, {C1, C2, C3}) -> - parse_lines(Rest, [C3, C2, C1 | Lines], {C1, C2, C3}); +parse_lines(<<?CR, ?LF, C1, C2, C3, Rest/binary>>, Lines, {C1, C2, C3}) -> + parse_lines(Rest, [C3, C2, C1, ?LF, ?CR | Lines], {C1, C2, C3}); %% Potential last line wait for more data -parse_lines(<<C1, C2>> = Data, Lines, {C1, C2, _} = StatusCode) -> +parse_lines(<<?CR, ?LF, C1, C2>> = Data, Lines, {C1, C2, _} = StatusCode) -> {continue, {Data, Lines, StatusCode}}; -parse_lines(<<C1>> = Data, Lines, {C1, _, _} = StatusCode) -> +parse_lines(<<?CR, ?LF, C1>> = Data, Lines, {C1, _, _} = StatusCode) -> + {continue, {Data, Lines, StatusCode}}; +parse_lines(<<?CR, ?LF>> = Data, Lines, {_,_,_} = StatusCode) -> + {continue, {Data, Lines, StatusCode}}; +parse_lines(<<?LF>> = Data, Lines, {_,_,_} = StatusCode) -> {continue, {Data, Lines, StatusCode}}; parse_lines(<<>> = Data, Lines, {_,_,_} = StatusCode) -> {continue, {Data, Lines, StatusCode}}; diff --git a/lib/inets/src/http_client/httpc_handler.erl b/lib/inets/src/http_client/httpc_handler.erl index d1c52dcc78..59cb1299e9 100644 --- a/lib/inets/src/http_client/httpc_handler.erl +++ b/lib/inets/src/http_client/httpc_handler.erl @@ -45,28 +45,30 @@ -record(timers, { - request_timers = [], % [ref()] - queue_timer % ref() + request_timers = [] :: [reference()], + queue_timer :: reference() | 'undefined' }). +-type session_failed() :: {'connect_failed',term()} | {'send_failed',term()}. + -record(state, { - request, % #request{} - session, % #session{} + request :: request() | 'undefined', + session :: session() | session_failed() | 'undefined', status_line, % {Version, StatusCode, ReasonPharse} - headers, % #http_response_h{} - body, % binary() + headers :: http_response_h() | 'undefined', + body :: binary() | 'undefined', mfa, % {Module, Function, Args} - pipeline = queue:new(), % queue:queue() - keep_alive = queue:new(), % queue:queue() + pipeline = queue:new() :: queue:queue(), + keep_alive = queue:new() :: queue:queue(), status, % undefined | new | pipeline | keep_alive | close | {ssl_tunnel, Request} canceled = [], % [RequestId] - max_header_size = nolimit, % nolimit | integer() - max_body_size = nolimit, % nolimit | integer() - options, % #options{} - timers = #timers{}, % #timers{} - profile_name, % atom() - id of httpc_manager process. - once = inactive % inactive | once + max_header_size = nolimit :: nolimit | integer(), + max_body_size = nolimit :: nolimit | integer(), + options :: options(), + timers = #timers{} :: #timers{}, + profile_name :: atom(), % id of httpc_manager process. + once = inactive :: 'inactive' | 'once' }). @@ -113,7 +115,7 @@ send(Request, Pid) -> %%-------------------------------------------------------------------- %% Function: cancel(RequestId, Pid) -> ok -%% RequestId = ref() +%% RequestId = reference() %% Pid = pid() - the pid of the http-request handler process. %% %% Description: Cancels a request. Intended to be called by the httpc @@ -789,47 +791,6 @@ deliver_answer(Request) -> %% Purpose: Convert process state when code is changed %%-------------------------------------------------------------------- -code_change(_, - #state{session = OldSession, - profile_name = ProfileName} = State, - upgrade_from_pre_5_8_1) -> - case OldSession of - {session, - Id, ClientClose, Scheme, Socket, SocketType, QueueLen, Type} -> - NewSession = #session{id = Id, - client_close = ClientClose, - scheme = Scheme, - socket = Socket, - socket_type = SocketType, - queue_length = QueueLen, - type = Type}, - insert_session(NewSession, ProfileName), - {ok, State#state{session = NewSession}}; - _ -> - {ok, State} - end; - -code_change(_, - #state{session = OldSession, - profile_name = ProfileName} = State, - downgrade_to_pre_5_8_1) -> - case OldSession of - #session{id = Id, - client_close = ClientClose, - scheme = Scheme, - socket = Socket, - socket_type = SocketType, - queue_length = QueueLen, - type = Type} -> - NewSession = {session, - Id, ClientClose, Scheme, Socket, SocketType, - QueueLen, Type}, - insert_session(NewSession, ProfileName), - {ok, State#state{session = NewSession}}; - _ -> - {ok, State} - end; - code_change(_, State, _) -> {ok, State}. @@ -934,8 +895,7 @@ connect_and_send_first_request(Address, Request, #state{options = Options} = Sta TmpState = State#state{request = Request, session = Session, mfa = init_mfa(Request, State), - status_line = - init_status_line(Request), + status_line = init_status_line(Request), headers = undefined, body = undefined, status = new}, @@ -947,8 +907,7 @@ connect_and_send_first_request(Address, Request, #state{options = Options} = Sta self() ! {init_error, error_sending, httpc_response:error(Request, Reason)}, {ok, State#state{request = Request, - session = - #session{socket = Socket}}} + session = #session{socket = Socket}}} end; {error, Reason} -> self() ! {init_error, error_connecting, @@ -1796,7 +1755,7 @@ tls_tunnel_request(#request{headers = Headers, URI = Host ++":" ++ integer_to_list(Port), #request{ - id = make_ref(), + id = make_ref(), from = self(), scheme = http, %% Use tcp-first and then upgrade! address = Adress, @@ -1887,10 +1846,13 @@ update_session(ProfileName, #session{id = SessionId} = Session, Pos, Value) -> httpc_manager:update_session(ProfileName, SessionId, Pos, Value) end catch - error:undef -> % This could happen during code upgrade + error:undef -> %% This could happen during code upgrade Session2 = erlang:setelement(Pos, Session, Value), insert_session(Session2, ProfileName); - T:E -> + error:badarg -> + exit(normal); %% Manager has been shutdown + T:E -> + %% Unexpected this must be an error! Stacktrace = erlang:get_stacktrace(), error_logger:error_msg("Failed updating session: " "~n ProfileName: ~p" @@ -1922,8 +1884,8 @@ update_session(ProfileName, #session{id = SessionId} = Session, Pos, Value) -> %% --------------------------------------------------------------------- call(Msg, Pid) -> - Timeout = infinity, - call(Msg, Pid, Timeout). + call(Msg, Pid, infinity). + call(Msg, Pid, Timeout) -> gen_server:call(Pid, Msg, Timeout). diff --git a/lib/inets/src/http_client/httpc_internal.hrl b/lib/inets/src/http_client/httpc_internal.hrl index f4e69cc1fa..5f8c70f28d 100644 --- a/lib/inets/src/http_client/httpc_internal.hrl +++ b/lib/inets/src/http_client/httpc_internal.hrl @@ -43,32 +43,32 @@ %%% HTTP Client per request settings -record(http_options, { - %% string() - "HTTP/1.1" | "HTTP/1.0" | "HTTP/0.9" - version, + %% "HTTP/1.1" | "HTTP/1.0" | "HTTP/0.9" + version :: 'undefined' | string(), - %% integer() | infinity - ms before a request times out - timeout = ?HTTP_REQUEST_TIMEOUT, + %% ms before a request times out + timeout = ?HTTP_REQUEST_TIMEOUT :: timeout(), - %% bool() - true if auto redirect on 30x response - autoredirect = true, + %% true if auto redirect on 30x response + autoredirect = true :: boolean(), %% ssl socket options - ssl = [], + ssl = [], %% {User, Password} = {string(), string()} proxy_auth, - %% bool() - true if not strictly std compliant - relaxed = false, + %% true if not strictly std compliant + relaxed = false :: boolean(), %% integer() - ms before a connect times out - connect_timeout = ?HTTP_REQUEST_CTIMEOUT, - - %% bool() - Use %-encoding rfc 2396 - url_encode + connect_timeout = ?HTTP_REQUEST_CTIMEOUT :: timeout(), + %% Use %-encoding rfc 2396 + url_encode :: 'undefined' | boolean() } ). +-type http_options() :: #http_options{}. %%% HTTP Client per profile setting. -record(options, @@ -82,18 +82,19 @@ keep_alive_timeout = ?HTTP_KEEP_ALIVE_TIMEOUT, % Used when pipeline_timeout = 0 max_sessions = ?HTTP_MAX_TCP_SESSIONS, cookies = disabled, % enabled | disabled | verify - verbose = false, + verbose = false, % boolean(), ipfamily = inet, % inet | inet6 | inet6fb4 ip = default, % specify local interface port = default, % specify local port socket_opts = [] % other socket options } ). +-type options() :: #options{}. %%% All data associated to a specific HTTP request -record(request, { - id, % ref() - Request Id + id :: 'undefined' | reference(), % Request Id from, % pid() - Caller redircount = 0,% Number of redirects made for this request scheme, % http | https @@ -103,7 +104,7 @@ method, % atom() - HTTP request Method headers, % #http_request_h{} content, % {ContentType, Body} - Current HTTP request - settings, % #http_options{} - User defined settings + settings :: http_options(), % User defined settings abs_uri, % string() ex: "http://www.erlang.org" userinfo, % string() - optinal "<userinfo>@<host>:<port>" stream, % boolean() - stream async reply? @@ -112,20 +113,19 @@ % for testing purposes. started, % integer() > 0 - When we started processing the % request - timer, % undefined | ref() + timer :: undefined | reference(), socket_opts, % undefined | [socket_option()] ipv6_host_with_brackets % boolean() } - ). - + ). +-type request() :: #request{}. -record(session, { %% {{Host, Port}, HandlerPid} id, - %% true | false - client_close, + client_close :: 'undefined' | boolean(), %% http (HTTP/TCP) | https (HTTP/SSL/TCP) scheme, @@ -140,14 +140,13 @@ queue_length = 1, %% pipeline | keep_alive (wait for response before sending new request) - type, + type :: 'undefined' | 'pipeline' | 'keep_alive', - %% true | false %% This will be true, when a response has been received for %% the first request. See type above. - available = false + available = false :: boolean() }). - +-type session() :: #session{}. -record(http_cookie, { @@ -162,7 +161,7 @@ secure = false, version = "0" }). - +-type http_cookie() :: #http_cookie{}. %% -record(parsed_uri, %% { diff --git a/lib/inets/src/http_client/httpc_manager.erl b/lib/inets/src/http_client/httpc_manager.erl index 4cb6f005ad..a63864493f 100644 --- a/lib/inets/src/http_client/httpc_manager.erl +++ b/lib/inets/src/http_client/httpc_manager.erl @@ -137,7 +137,7 @@ redirect_request(Request, ProfileName) -> %%-------------------------------------------------------------------- %% Function: cancel_request(RequestId, ProfileName) -> ok -%% RequestId - ref() +%% RequestId - reference() %% ProfileName = atom() %% %% Description: Cancels the request with <RequestId>. @@ -148,7 +148,7 @@ cancel_request(RequestId, ProfileName) -> %%-------------------------------------------------------------------- %% Function: request_done(RequestId, ProfileName) -> ok -%% RequestId - ref() +%% RequestId - reference() %% ProfileName = atom() %% %% Description: Inform tha manager that a request has been completed. diff --git a/lib/inets/src/http_client/httpc_request.erl b/lib/inets/src/http_client/httpc_request.erl index e8d020c165..89872a3831 100644 --- a/lib/inets/src/http_client/httpc_request.erl +++ b/lib/inets/src/http_client/httpc_request.erl @@ -88,9 +88,11 @@ send(SendAddr, Socket, SocketType, case Address of SendAddr -> {TmpHdrs2, Path ++ Query}; - _Proxy -> + _Proxy when SocketType == ip_comm -> TmpHdrs3 = handle_proxy(HttpOptions, TmpHdrs2), - {TmpHdrs3, AbsUri} + {TmpHdrs3, AbsUri}; + _ -> + {TmpHdrs2, Path ++ Query} end, FinalHeaders = diff --git a/lib/inets/src/http_client/httpc_response.erl b/lib/inets/src/http_client/httpc_response.erl index 91256fa6a2..d8bdac24e3 100644 --- a/lib/inets/src/http_client/httpc_response.erl +++ b/lib/inets/src/http_client/httpc_response.erl @@ -110,27 +110,30 @@ result(Response = {{_, 300, _}, _, _}, redirect(Response, Request); result(Response = {{_, Code, _}, _, _}, + Request = #request{settings = + #http_options{autoredirect = true}, + method = post}) when (Code =:= 301) orelse + (Code =:= 302) orelse + (Code =:= 303) -> + redirect(Response, Request#request{method = get}); +result(Response = {{_, Code, _}, _, _}, + Request = #request{settings = + #http_options{autoredirect = true}, + method = post}) when (Code =:= 307) -> + redirect(Response, Request); +result(Response = {{_, Code, _}, _, _}, Request = #request{settings = #http_options{autoredirect = true}, - method = head}) when (Code =:= 301) orelse + method = Method}) when (Code =:= 301) orelse (Code =:= 302) orelse (Code =:= 303) orelse (Code =:= 307) -> - redirect(Response, Request); -result(Response = {{_, Code, _}, _, _}, - Request = #request{settings = - #http_options{autoredirect = true}, - method = get}) when (Code =:= 301) orelse - (Code =:= 302) orelse - (Code =:= 303) orelse - (Code =:= 307) -> - redirect(Response, Request); -result(Response = {{_, 303, _}, _, _}, - Request = #request{settings = - #http_options{autoredirect = true}, - method = post}) -> - redirect(Response, Request#request{method = get}); - + case lists:member(Method, [get, head, options, trace]) of + true -> + redirect(Response, Request); + false -> + transparent(Response, Request) + end; result(Response = {{_,503,_}, _, _}, Request) -> status_service_unavailable(Response, Request); diff --git a/lib/inets/src/http_lib/http_internal.hrl b/lib/inets/src/http_lib/http_internal.hrl index ae92b5df8f..991417cb36 100644 --- a/lib/inets/src/http_lib/http_internal.hrl +++ b/lib/inets/src/http_lib/http_internal.hrl @@ -71,7 +71,7 @@ 'last-modified', other=[] % list() - Key/Value list with other headers }). - +-type http_response_h() :: #http_response_h{}. %%% Request headers -record(http_request_h,{ @@ -118,5 +118,6 @@ 'last-modified', other=[] % list() - Key/Value list with other headers }). +-type http_request_h() :: #http_request_h{}. -endif. % -ifdef(http_internal_hrl). diff --git a/lib/inets/src/http_server/httpd_request_handler.erl b/lib/inets/src/http_server/httpd_request_handler.erl index 071fa94ef6..7e20a9ba67 100644 --- a/lib/inets/src/http_server/httpd_request_handler.erl +++ b/lib/inets/src/http_server/httpd_request_handler.erl @@ -37,18 +37,19 @@ -include("httpd_internal.hrl"). -define(HANDSHAKE_TIMEOUT, 5000). + -record(state, {mod, %% #mod{} manager, %% pid() status, %% accept | busy | blocked mfa, %% {Module, Function, Args} max_keep_alive_request = infinity, %% integer() | infinity - response_sent = false, %% true | false - timeout, %% infinity | integer() > 0 - timer, %% ref() - Request timer - headers, %% #http_request_h{} + response_sent = false :: boolean(), + timeout, %% infinity | integer() > 0 + timer :: 'undefined' | reference(), % Request timer + headers, %% #http_request_h{} body, %% binary() data, %% The total data received in bits, checked after 10s - byte_limit %% Bit limit per second before kick out + byte_limit %% Bit limit per second before kick out }). %%==================================================================== diff --git a/lib/inets/test/ftp_format_SUITE.erl b/lib/inets/test/ftp_format_SUITE.erl index a33b31f46f..95d594a44b 100644 --- a/lib/inets/test/ftp_format_SUITE.erl +++ b/lib/inets/test/ftp_format_SUITE.erl @@ -38,8 +38,8 @@ all() -> groups() -> [{ftp_response, [], [ftp_150, ftp_200, ftp_220, ftp_226, ftp_257, ftp_331, - ftp_425, ftp_other_status_codes, ftp_multiple_lines, - ftp_multipel_ctrl_messages]}]. + ftp_425, ftp_other_status_codes, ftp_multiple_lines_status_in_msg, + ftp_multiple_lines, ftp_multipel_ctrl_messages]}]. init_per_suite(Config) -> Config. @@ -141,6 +141,15 @@ ftp_425(Config) when is_list(Config) -> {trans_neg_compl, _} = ftp_response:interpret(Msg), ok. +ftp_multiple_lines_status_in_msg() -> + [{doc, "check that multiple lines gets parsed correct, even if we have " + " the status code within the msg being sent"}]. +ftp_multiple_lines_status_in_msg(Config) when is_list(Config) -> + ML = "230-User usr-230 is logged in\r\n" ++ + "230 OK. Current directory is /\r\n", + {ok, ML, <<>>} = ftp_response:parse_lines(list_to_binary(ML), [], start), + ok. + ftp_multiple_lines() -> [{doc, "Especially check multiple lines devided in significant places"}]. ftp_multiple_lines(Config) when is_list(Config) -> diff --git a/lib/inets/test/httpc_SUITE.erl b/lib/inets/test/httpc_SUITE.erl index 932567ec55..57da82c6ad 100644 --- a/lib/inets/test/httpc_SUITE.erl +++ b/lib/inets/test/httpc_SUITE.erl @@ -500,10 +500,11 @@ redirect_multiple_choises(Config) when is_list(Config) -> httpc:request(get, {URL300, []}, [{autoredirect, false}], []). %%------------------------------------------------------------------------- redirect_moved_permanently() -> - [{doc, "If the 301 status code is received in response to a request other " - "than GET or HEAD, the user agent MUST NOT automatically redirect the request " - "unless it can be confirmed by the user, since this might change " - "the conditions under which the request was issued."}]. + [{doc, "The server SHOULD generate a Location header field in the response " + "containing a preferred URI reference for the new permanent URI. The user " + "agent MAY use the Location field value for automatic redirection. The server's " + "response payload usually contains a short hypertext note with a " + "hyperlink to the new URI(s)."}]. redirect_moved_permanently(Config) when is_list(Config) -> URL301 = url(group_name(Config), "/301.html", Config), @@ -514,15 +515,16 @@ redirect_moved_permanently(Config) when is_list(Config) -> {ok, {{_,200,_}, [_ | _], []}} = httpc:request(head, {URL301, []}, [], []), - {ok, {{_,301,_}, [_ | _], [_|_]}} + {ok, {{_,200,_}, [_ | _], [_|_]}} = httpc:request(post, {URL301, [],"text/plain", "foobar"}, [], []). %%------------------------------------------------------------------------- redirect_found() -> - [{doc," If the 302 status code is received in response to a request other " - "than GET or HEAD, the user agent MUST NOT automatically redirect the " - "request unless it can be confirmed by the user, since this might change " - "the conditions under which the request was issued."}]. + [{doc, "The server SHOULD generate a Location header field in the response " + "containing a URI reference for the different URI. The user agent MAY " + "use the Location field value for automatic redirection. The server's " + "response payload usually contains a short hypertext note with a " + "hyperlink to the different URI(s)."}]. redirect_found(Config) when is_list(Config) -> URL302 = url(group_name(Config), "/302.html", Config), @@ -533,14 +535,14 @@ redirect_found(Config) when is_list(Config) -> {ok, {{_,200,_}, [_ | _], []}} = httpc:request(head, {URL302, []}, [], []), - {ok, {{_,302,_}, [_ | _], [_|_]}} + {ok, {{_,200,_}, [_ | _], [_|_]}} = httpc:request(post, {URL302, [],"text/plain", "foobar"}, [], []). %%------------------------------------------------------------------------- redirect_see_other() -> [{doc, "The different URI SHOULD be given by the Location field in the response. " "Unless the request method was HEAD, the entity of the response SHOULD contain a short " - "hypertext note with a hyperlink to the new URI(s). "}]. + "hypertext note with a hyperlink to the new URI(s)."}]. redirect_see_other(Config) when is_list(Config) -> URL303 = url(group_name(Config), "/303.html", Config), @@ -556,10 +558,11 @@ redirect_see_other(Config) when is_list(Config) -> [], []). %%------------------------------------------------------------------------- redirect_temporary_redirect() -> - [{doc," If the 307 status code is received in response to a request other " - "than GET or HEAD, the user agent MUST NOT automatically redirect the request " - "unless it can be confirmed by the user, since this might change " - "the conditions under which the request was issued."}]. + [{doc, "The server SHOULD generate a Location header field in the response " + "containing a URI reference for the different URI. The user agent MAY " + "use the Location field value for automatic redirection. The server's " + "response payload usually contains a short hypertext note with a " + "hyperlink to the different URI(s)."}]. redirect_temporary_redirect(Config) when is_list(Config) -> URL307 = url(group_name(Config), "/307.html", Config), @@ -570,7 +573,7 @@ redirect_temporary_redirect(Config) when is_list(Config) -> {ok, {{_,200,_}, [_ | _], []}} = httpc:request(head, {URL307, []}, [], []), - {ok, {{_,307,_}, [_ | _], [_|_]}} + {ok, {{_,200,_}, [_ | _], [_|_]}} = httpc:request(post, {URL307, [],"text/plain", "foobar"}, [], []). diff --git a/lib/kernel/doc/src/code.xml b/lib/kernel/doc/src/code.xml index 4db377bcde..3143cdc825 100644 --- a/lib/kernel/doc/src/code.xml +++ b/lib/kernel/doc/src/code.xml @@ -382,9 +382,14 @@ zip:create("mnesia-4.4.7.ez", <name name="add_pathsa" arity="1"/> <fsummary>Add directories to the beginning of the code path.</fsummary> <desc> - <p>Adds the directories in <c><anno>Dirs</anno></c> to the beginning of - the code path. If a <c><anno>Dir</anno></c> exists, it is removed - from the old position in the code path.</p> + <p>Traverses <c><anno>Dirs</anno></c> and adds + each <c><anno>Dir</anno></c> to the beginning of the code + path. This means that the order of <c><anno>Dirs</anno></c> + is reversed in the resulting code path. For example, if you + add <c>[Dir1,Dir2]</c>, the resulting path will + be <c>[Dir2,Dir1|OldCodePath]</c>.</p> + <p>If a <c><anno>Dir</anno></c> already exists in the code + path, it is removed from the old position.</p> <p>Always returns <c>ok</c>, regardless of the validity of each individual <c><anno>Dir</anno></c>.</p> </desc> diff --git a/lib/kernel/doc/src/file.xml b/lib/kernel/doc/src/file.xml index 09497482cf..b674b3ca93 100644 --- a/lib/kernel/doc/src/file.xml +++ b/lib/kernel/doc/src/file.xml @@ -1477,8 +1477,8 @@ f.txt: {person, "kalle", 25}. <tag><c>16#400</c></tag> <item><p>set group id on execution</p></item> </taglist> - <p>On Unix platforms, the following bits - can also be set:</p> + <p>On Unix platforms, other bits than those listed above + may be set.</p> </item> <tag><c>links = integer() >= 0</c></tag> <item> @@ -2042,8 +2042,8 @@ f.txt: {person, "kalle", 25}. <tag><c>16#400</c></tag> <item><p>Set group id on execution</p></item> </taglist> - <p>On Unix platforms, the following bits - can also be set.</p> + <p>On Unix platforms, other bits than those listed above + may be set.</p> </item> <tag><c>uid = integer() >= 0</c></tag> <item> diff --git a/lib/kernel/doc/src/gen_tcp.xml b/lib/kernel/doc/src/gen_tcp.xml index 08454b9832..e97db20062 100644 --- a/lib/kernel/doc/src/gen_tcp.xml +++ b/lib/kernel/doc/src/gen_tcp.xml @@ -231,7 +231,11 @@ do_recv(Sock, Bs) -> <c><anno>Socket</anno></c>. The controlling process is the process that receives messages from the socket. If called by any other process than the current controlling process, - <c>{error, not_owner}</c> is returned.</p> + <c>{error, not_owner}</c> is returned. If the process identified + by <c><anno>Pid</anno></c> is not an existing local pid, + <c>{error, badarg}</c> is returned. <c>{error, badarg}</c> may also + be returned in some cases when <c><anno>Socket</anno></c> is closed + during the execution of this function.</p> <p>If the socket is set in active mode, this function will transfer any messages in the mailbox of the caller to the new controlling process. diff --git a/lib/kernel/doc/src/gen_udp.xml b/lib/kernel/doc/src/gen_udp.xml index 3f88a0272d..f79566ef71 100644 --- a/lib/kernel/doc/src/gen_udp.xml +++ b/lib/kernel/doc/src/gen_udp.xml @@ -68,7 +68,11 @@ <c><anno>Socket</anno></c>. The controlling process is the process that receives messages from the socket. If called by any other process than the current controlling process, - <c>{error, not_owner}</c> is returned.</p> + <c>{error, not_owner}</c> is returned. If the process identified + by <c><anno>Pid</anno></c> is not an existing local pid, + <c>{error, badarg}</c> is returned. <c>{error, badarg}</c> may also + be returned in some cases when <c><anno>Socket</anno></c> is closed + during the execution of this function.</p> </desc> </func> diff --git a/lib/kernel/doc/src/rpc.xml b/lib/kernel/doc/src/rpc.xml index 5944e9321a..adec2d9520 100644 --- a/lib/kernel/doc/src/rpc.xml +++ b/lib/kernel/doc/src/rpc.xml @@ -88,6 +88,12 @@ to retrieve the value of evaluating <c>apply(<anno>Module</anno>, <anno>Function</anno>, <anno>Args</anno>)</c> on node <c><anno>Node</anno></c>.</p> + <note> + <p><seealso marker="#yield/1"><c>yield/1</c></seealso> and + <seealso marker="#nb_yield/1"><c>nb_yield/1,2</c></seealso> + must be called by the same process from which this function + was made otherwise they will never yield correctly.</p> + </note> </desc> </func> @@ -299,6 +305,11 @@ the tuple <c>{value, <anno>Val</anno>}</c> when the computation is finished, or <c>timeout</c> when <c><anno>Timeout</anno></c> milliseconds has elapsed.</p> + <note> + <p>This function must be called by the same process from which + <seealso marker="#async_call/4"><c>async_call/4</c></seealso> + was made otherwise it will only return <c>timeout</c>.</p> + </note> </desc> </func> @@ -407,6 +418,11 @@ If the answer is available, it is returned immediately. Otherwise, the calling process is suspended until the answer arrives from <c>Node</c>.</p> + <note> + <p>This function must be called by the same process from which + <seealso marker="#async_call/4"><c>async_call/4</c></seealso> + was made otherwise it will never return.</p> + </note> </desc> </func> </funcs> diff --git a/lib/kernel/src/gen_sctp.erl b/lib/kernel/src/gen_sctp.erl index b133e6fed4..a6aa0edd15 100644 --- a/lib/kernel/src/gen_sctp.erl +++ b/lib/kernel/src/gen_sctp.erl @@ -439,7 +439,7 @@ error_string(X) -> -spec controlling_process(Socket, Pid) -> ok | {error, Reason} when Socket :: sctp_socket(), Pid :: pid(), - Reason :: closed | not_owner | inet:posix(). + Reason :: closed | not_owner | badarg | inet:posix(). controlling_process(S, Pid) when is_port(S), is_pid(Pid) -> inet:udp_controlling_process(S, Pid); diff --git a/lib/kernel/src/gen_tcp.erl b/lib/kernel/src/gen_tcp.erl index 1a21541b7c..ac61dbc792 100644 --- a/lib/kernel/src/gen_tcp.erl +++ b/lib/kernel/src/gen_tcp.erl @@ -320,7 +320,7 @@ unrecv(S, Data) when is_port(S) -> -spec controlling_process(Socket, Pid) -> ok | {error, Reason} when Socket :: socket(), Pid :: pid(), - Reason :: closed | not_owner | inet:posix(). + Reason :: closed | not_owner | badarg | inet:posix(). controlling_process(S, NewOwner) -> case inet_db:lookup_socket(S) of diff --git a/lib/kernel/src/gen_udp.erl b/lib/kernel/src/gen_udp.erl index 98d2f0bcfb..3121544719 100644 --- a/lib/kernel/src/gen_udp.erl +++ b/lib/kernel/src/gen_udp.erl @@ -195,7 +195,7 @@ connect(S, Address, Port) when is_port(S) -> -spec controlling_process(Socket, Pid) -> ok | {error, Reason} when Socket :: socket(), Pid :: pid(), - Reason :: closed | not_owner | inet:posix(). + Reason :: closed | not_owner | badarg | inet:posix(). controlling_process(S, NewOwner) -> inet:udp_controlling_process(S, NewOwner). diff --git a/lib/kernel/src/kernel.app.src b/lib/kernel/src/kernel.app.src index 56d1699656..d184223524 100644 --- a/lib/kernel/src/kernel.app.src +++ b/lib/kernel/src/kernel.app.src @@ -118,6 +118,6 @@ {applications, []}, {env, [{error_logger, tty}]}, {mod, {kernel, []}}, - {runtime_dependencies, ["erts-8.0", "stdlib-3.0", "sasl-3.0"]} + {runtime_dependencies, ["erts-8.1", "stdlib-3.0", "sasl-3.0"]} ] }. diff --git a/lib/kernel/src/kernel.appup.src b/lib/kernel/src/kernel.appup.src index d16e200cb3..82cf73cbda 100644 --- a/lib/kernel/src/kernel.appup.src +++ b/lib/kernel/src/kernel.appup.src @@ -18,9 +18,9 @@ %% %CopyrightEnd% {"%VSN%", %% Up from - max one major revision back - [{<<"5\\.0(\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* + [{<<"5\\.[0-1](\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* {<<"4\\.[0-2](\\.[0-9]+)*">>,[restart_new_emulator]}], % OTP-18.* %% Down to - max one major revision back - [{<<"5\\.0(\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* + [{<<"5\\.[0-1](\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* {<<"4\\.[0-2](\\.[0-9]+)*">>,[restart_new_emulator]}] % OTP-18.* }. diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl index 5f049c6f99..c37d114a58 100644 --- a/lib/kernel/test/file_SUITE.erl +++ b/lib/kernel/test/file_SUITE.erl @@ -493,22 +493,13 @@ read_write_file(Config) when is_list(Config) -> %% Try writing and reading back some term SomeTerm = {"This term",{will,be},[written,$t,$o],1,file,[]}, - ok = ?FILE_MODULE:write_file(Name,term_to_binary(SomeTerm)), - {ok,Bin1} = ?FILE_MODULE:read_file(Name), - SomeTerm = binary_to_term(Bin1), + Bin1 = term_to_binary(SomeTerm), + ok = do_read_write_file(Name, Bin1), %% Try a "null" term NullTerm = [], - ok = ?FILE_MODULE:write_file(Name,term_to_binary(NullTerm)), - {ok,Bin2} = ?FILE_MODULE:read_file(Name), - NullTerm = binary_to_term(Bin2), - - %% Try some "complicated" types - BigNum = 123456789012345678901234567890, - ComplTerm = {self(),make_ref(),BigNum,3.14159}, - ok = ?FILE_MODULE:write_file(Name,term_to_binary(ComplTerm)), - {ok,Bin3} = ?FILE_MODULE:read_file(Name), - ComplTerm = binary_to_term(Bin3), + Bin2 = term_to_binary(NullTerm), + ok = do_read_write_file(Name, Bin2), %% Try reading a nonexistent file Name2 = filename:join(RootDir, @@ -519,25 +510,42 @@ read_write_file(Config) when is_list(Config) -> {error, enoent} = ?FILE_MODULE:read_file(''), %% Try writing to a bad filename - {error, enoent} = - ?FILE_MODULE:write_file("",term_to_binary(NullTerm)), + {error, enoent} = do_read_write_file("", Bin2), %% Try writing something else than a binary - {error, badarg} = ?FILE_MODULE:write_file(Name,{1,2,3}), - {error, badarg} = ?FILE_MODULE:write_file(Name,self()), + {error, badarg} = do_read_write_file(Name, {1,2,3}), + {error, badarg} = do_read_write_file(Name, self()), %% Some non-term binaries - ok = ?FILE_MODULE:write_file(Name,[]), - {ok,Bin4} = ?FILE_MODULE:read_file(Name), - 0 = byte_size(Bin4), + ok = do_read_write_file(Name, []), - ok = ?FILE_MODULE:write_file(Name,[Bin1,[],[[Bin2]]]), - {ok,Bin5} = ?FILE_MODULE:read_file(Name), - {Bin1,Bin2} = split_binary(Bin5,byte_size(Bin1)), + %% Write some iolists + ok = do_read_write_file(Name, [Bin1,[],[[Bin2]]]), + ok = do_read_write_file(Name, ["string",<<"binary">>]), + ok = do_read_write_file(Name, "pure string"), [] = flush(), ok. +do_read_write_file(Name, Data) -> + case ?FILE_MODULE:write_file(Name, Data) of + ok -> + BinData = iolist_to_binary(Data), + {ok,BinData} = ?FILE_MODULE:read_file(Name), + + ok = ?FILE_MODULE:write_file(Name, Data, []), + {ok,BinData} = ?FILE_MODULE:read_file(Name), + + ok = ?FILE_MODULE:write_file(Name, Data, [raw]), + {ok,BinData} = ?FILE_MODULE:read_file(Name), + + ok; + {error,_}=Res -> + Res = ?FILE_MODULE:write_file(Name, Data, []), + Res = ?FILE_MODULE:write_file(Name, Data, [raw]), + Res + end. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/lib/mnesia/src/mnesia.erl b/lib/mnesia/src/mnesia.erl index 9586adbf93..5bf2fc2dc3 100644 --- a/lib/mnesia/src/mnesia.erl +++ b/lib/mnesia/src/mnesia.erl @@ -1409,8 +1409,14 @@ select_cont(Tid,_,State=#mnesia_select{tid=Tid,written=[]}) -> select_state(dirty_sel_cont(State),State); select_cont(Tid,_Ts,State=#mnesia_select{tid=Tid}) -> trans_select(dirty_sel_cont(State), State); -select_cont(_Tid2,_,#mnesia_select{tid=_Tid1}) -> % Missmatching tids +select_cont(Tid2,_,#mnesia_select{tid=_Tid1}) + when element(1,Tid2) == tid -> % Mismatching tids abort(wrong_transaction); +select_cont(Tid,Ts,State=#mnesia_select{}) -> + % Repair mismatching tids in non-transactional contexts + RepairedState = State#mnesia_select{tid = Tid, written = [], + spec = undefined, type = undefined}, + select_cont(Tid,Ts,RepairedState); select_cont(_,_,Cont) -> abort({badarg, Cont}). diff --git a/lib/mnesia/src/mnesia_controller.erl b/lib/mnesia/src/mnesia_controller.erl index 4791e2e290..17b47c059e 100644 --- a/lib/mnesia/src/mnesia_controller.erl +++ b/lib/mnesia/src/mnesia_controller.erl @@ -1703,9 +1703,10 @@ add_active_replica(Tab, Node, Cs = #cstruct{}) -> block_table(Tab) -> Var = {Tab, where_to_commit}, - Old = val(Var), - New = {blocked, Old}, - set(Var, New). % where_to_commit + case is_tab_blocked(val(Var)) of + {true, _} -> ok; + {false, W2C} -> set(Var, mark_blocked_tab(true, W2C)) + end. unblock_table(Tab) -> call({unblock_table, Tab}). diff --git a/lib/mnesia/src/mnesia_loader.erl b/lib/mnesia/src/mnesia_loader.erl index 71e5829c87..c710470a2c 100644 --- a/lib/mnesia/src/mnesia_loader.erl +++ b/lib/mnesia/src/mnesia_loader.erl @@ -342,9 +342,12 @@ spawned_receiver(ReplyTo,Tab,Storage,Cs, SenderPid,TabSize,DetsData, Init) -> Done = do_init_table(Tab,Storage,Cs, SenderPid,TabSize,DetsData, ReplyTo, Init), - ReplyTo ! {self(),Done}, - unlink(ReplyTo), - unlink(whereis(mnesia_controller)), + try + ReplyTo ! {self(),Done}, + unlink(ReplyTo), + unlink(whereis(mnesia_controller)) + catch _:_ -> ok %% avoid error reports when stopping down mnesia + end, exit(normal). wait_on_load_complete(Pid) -> @@ -916,9 +919,15 @@ send_packet(_N, _Pid, _Chunk, DataState) -> finish_copy(Pid, Tab, Storage, RemoteS, NeedLock) -> RecNode = node(Pid), DatBin = dat2bin(Tab, Storage, RemoteS), + Node = node(Pid), Trans = fun() -> NeedLock andalso mnesia:read_lock_table(Tab), + %% Check that receiver is still alive + receive {copier_done, Node} -> + throw(receiver_died) + after 0 -> ok + end, A = val({Tab, access_mode}), mnesia_controller:sync_and_block_table_whereabouts(Tab, RecNode, RemoteS, A), cleanup_tab_copier(Pid, Storage, Tab), @@ -927,7 +936,7 @@ finish_copy(Pid, Tab, Storage, RemoteS, NeedLock) -> receive {Pid, no_more} -> % Dont bother about the spurious 'more' message no_more; - {copier_done, Node} when Node == node(Pid)-> + {copier_done, Node} -> verbose("Tab receiver ~p crashed (more): ~p~n", [Tab, Node]), receiver_died end diff --git a/lib/mnesia/src/mnesia_tm.erl b/lib/mnesia/src/mnesia_tm.erl index b116b48312..388b42cf15 100644 --- a/lib/mnesia/src/mnesia_tm.erl +++ b/lib/mnesia/src/mnesia_tm.erl @@ -950,7 +950,7 @@ return_abort(Fun, Args, Reason) -> if Level == 1 -> mnesia_locker:async_release_tid(Nodes, Tid), - ?MODULE ! {delete_transaction, Tid}, + ?SAFE(?MODULE ! {delete_transaction, Tid}), erase(mnesia_activity_state), flush_downs(), ?SAFE(unlink(whereis(?MODULE))), diff --git a/lib/mnesia/test/mnesia_test_lib.erl b/lib/mnesia/test/mnesia_test_lib.erl index 6e84a27ec9..0fabdc7929 100644 --- a/lib/mnesia/test/mnesia_test_lib.erl +++ b/lib/mnesia/test/mnesia_test_lib.erl @@ -263,6 +263,7 @@ slave_start_link(Host, Name, Retries) -> Path = code:get_path(), ok = rpc:call(NewNode, file, set_cwd, [Cwd]), true = rpc:call(NewNode, code, set_path, [Path]), + ok = rpc:call(NewNode, error_logger, tty, [false]), spawn_link(NewNode, ?MODULE, slave_sup, []), rpc:multicall([node() | nodes()], global, sync, []), {ok, NewNode}; diff --git a/lib/mnesia/test/mnesia_trans_access_test.erl b/lib/mnesia/test/mnesia_trans_access_test.erl index aa50ee4cb1..4ed73ea859 100644 --- a/lib/mnesia/test/mnesia_trans_access_test.erl +++ b/lib/mnesia/test/mnesia_trans_access_test.erl @@ -307,6 +307,7 @@ select14(Config) when is_list(Config) -> %% Some Helpers Trans = fun(Fun) -> mnesia:transaction(Fun) end, + Dirty = fun(Fun) -> mnesia:async_dirty(Fun) end, LoopHelp = fun('$end_of_table',_) -> []; ({Recs,Cont},Fun) -> Sel = mnesia:select(Cont), @@ -334,8 +335,13 @@ select14(Config) when is_list(Config) -> ?match({atomic, [OneRec]}, Trans(fun() -> Loop(Tab, OnePat) end)), ?match({atomic, All}, Trans(fun() -> Loop(Tab, AllPat) end)), - {atomic,{_, Cont}} = Trans(fun() -> mnesia:select(Tab, OnePat, 1, read) end), - ?match({aborted, wrong_transaction}, Trans(fun() -> mnesia:select(Cont) end)), + {atomic,{_, ContOne}} = Trans(fun() -> mnesia:select(Tab, OnePat, 1, read) end), + ?match({aborted, wrong_transaction}, Trans(fun() -> mnesia:select(ContOne) end)), + ?match('$end_of_table', Dirty(fun() -> mnesia:select(ContOne) end)), + + {atomic,{_, ContAll}} = Trans(fun() -> mnesia:select(Tab, AllPat, 1, read) end), + ?match({aborted, wrong_transaction}, Trans(fun() -> mnesia:select(ContAll) end)), + ?match({[_], _}, Dirty(fun() -> mnesia:select(ContAll) end)), ?match({aborted, _}, Trans(fun() -> mnesia:select(Tab, {match, '$1', 2},1,read) end)), ?match({aborted, _}, Trans(fun() -> mnesia:select(Tab, [{'_', [], '$1'}],1,read) end)), diff --git a/lib/observer/doc/src/ttb.xml b/lib/observer/doc/src/ttb.xml index 42b0fa1d8a..7cd15e15d3 100644 --- a/lib/observer/doc/src/ttb.xml +++ b/lib/observer/doc/src/ttb.xml @@ -114,7 +114,8 @@ ttb:p(all, call).</input></pre> <v>Opt = {file,Client} | {handler, FormatHandler} | {process_info,PI} | shell | {shell, ShellSpec} | {timer, TimerSpec} | {overload_check, {MSec, Module, Function}} | - {flush, MSec} | resume | {resume, FetchTimeout}</v> + {flush, MSec} | resume | {resume, FetchTimeout} | + {queue_size, QueueSize}</v> <v>TimerSpec = MSec | {MSec, StopOpts}</v> <v>MSec = FetchTimeout = integer()</v> <v>Module = Function = atom() </v> @@ -126,6 +127,7 @@ ttb:p(all, call).</input></pre> <v>FormatHandler = See format/2</v> <v>PI = true | false </v> <v>ShellSpec = true | false | only</v> + <v>QueueSize = non_neg_integer()</v> </type> <desc> <p>Starts a file trace port on all specified nodes @@ -147,6 +149,18 @@ ttb:p(all, call).</input></pre> <c>Client</c> must be <c>{local, File}</c>. All trace information is then sent to the trace control node where it is written to file.</p></item> + <tag><c>queue_size</c></tag> + <item><p>When tracing to shell or <c>{local,File}</c>, an ip + trace driver is used internally. The ip trace driver has a + queue of maximum <c>QueueSize</c> messages waiting to be + delivered. If the driver cannot deliver messages as fast as + they are produced, the queue size might be exceeded and + messages are dropped. This parameter is optional, and is + only useful if many <c>{drop,N}</c> trace messages are + received by the trace handler. It has no meaning if shell + or <c>{local,File}</c> is not used. See + <seealso marker="runtime_tools:dbg#trace_port/2">dbg:trace_port/2</seealso> + for more information about the ip trace driver.</p></item> <tag><c>process_info</c></tag> <item><p>Indicates if process information is to be collected. If <c>PI = true</c> (which is diff --git a/lib/observer/src/ttb.erl b/lib/observer/src/ttb.erl index ac6c4572eb..87a50e046b 100644 --- a/lib/observer/src/ttb.erl +++ b/lib/observer/src/ttb.erl @@ -78,6 +78,11 @@ do_tracer(Nodes0,PI,Client,Traci) -> do_tracer(Clients,PI,Traci) -> Shell = proplists:get_value(shell, Traci, false), + IpPortSpec = + case proplists:get_value(queue_size, Traci) of + undefined -> 0; + QS -> {0,QS} + end, DefShell = fun(Trace) -> dbg:dhandler(Trace, standard_io) end, {ClientSucc,Succ} = lists:foldl( @@ -98,7 +103,7 @@ do_tracer(Clients,PI,Traci) -> [_,H] = string:tokens(atom_to_list(N),"@"), H end, - case catch dbg:tracer(N,port,dbg:trace_port(ip,0)) of + case catch dbg:tracer(N,port,dbg:trace_port(ip,IpPortSpec)) of {ok,N} -> {ok,Port} = dbg:trace_port_control(N,get_listen_port), {ok,T} = dbg:get_tracer(N), @@ -160,6 +165,8 @@ opt([{resume,MSec}|O],{PI,Client,Traci}) -> opt(O,{PI,Client,[{resume, {true, MSec}}|Traci]}); opt([{flush,MSec}|O],{PI,Client,Traci}) -> opt(O,{PI,Client,[{flush, MSec}|Traci]}); +opt([{queue_size,QueueSize}|O],{PI,Client,Traci}) -> + opt(O,{PI,Client,[{queue_size,QueueSize}|Traci]}); opt([],Opt) -> ensure_opt(Opt). diff --git a/lib/odbc/configure.in b/lib/odbc/configure.in index d26daa5eda..2dec6e5abf 100644 --- a/lib/odbc/configure.in +++ b/lib/odbc/configure.in @@ -65,7 +65,7 @@ dnl --------------------------------------------------------------------- dnl Special windows stuff regarding CFLAGS and details in the environment... dnl --------------------------------------------------------------------- LM_WINDOWS_ENVIRONMENT - + AC_PROG_MAKE_SET AC_CHECK_PROGS(LD, ld.sh) @@ -136,8 +136,8 @@ AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_addr], [], [], dnl Checks for library functions. AC_CHECK_FUNCS([memset socket]) - -# ODBC + +# ODBC $RM -f "$ERL_TOP/lib/odbc/SKIP" LM_CHECK_THR_LIB @@ -146,24 +146,24 @@ AC_SUBST(THR_LIBS) odbc_lib_link_success=no AC_SUBST(TARGET_FLAGS) - case $host_os in - darwin1[[0-5]].*|darwin[[0-9]].*) + case $host_os in + darwin1[[0-9]].*) TARGET_FLAGS="-DUNIX" if test ! -d "$with_odbc" || test "$with_odbc" = "yes"; then - ODBC_LIB= -L"/usr/lib" - ODBC_INCLUDE="-I/usr/lib/include" + ODBC_LIB= -L"/usr/local/lib" + ODBC_INCLUDE="-I/usr/local/include" else ODBC_LIB=-L"$with_odbc/lib" ODBC_INCLUDE="-I$with_odbc/include" fi - - AC_CHECK_LIB(iodbc, SQLAllocHandle,[ODBC_LIB="$ODBC_LIB -liodbc"; odbc_lib_link_success=yes]) + + AC_CHECK_LIB(iodbc, SQLAllocHandle,[ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes]) ;; win32|cygwin) TARGET_FLAGS="-DWIN32" AC_CHECK_LIB(ws2_32, main) if test ! -d "$with_odbc" || test "$with_odbc" = "yes"; then - ODBC_LIB="" + ODBC_LIB="" ODBC_INCLUDE="" else ODBC_LIB=-L"$with_odbc/lib" @@ -196,7 +196,7 @@ AC_SUBST(TARGET_FLAGS) elif test -d "${libdir}/64/."; then libdir="${libdir}/64" fi - fi + fi ODBC_LIB="-L$libdir" ODBC_INCLUDE="-I$erl_xcomp_isysroot$rdir/include" break @@ -207,7 +207,7 @@ AC_SUBST(TARGET_FLAGS) echo "No odbc library found" > "$ERL_TOP/lib/odbc/SKIP" else AC_MSG_RESULT($ODBC_LIB) - AC_CHECK_LIB(odbc, SQLAllocHandle,[ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes]) + AC_CHECK_LIB(odbc, SQLAllocHandle,[ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes]) fi ;; diff --git a/lib/parsetools/include/leexinc.hrl b/lib/parsetools/include/leexinc.hrl index 2657fdcfaa..b4449607cb 100644 --- a/lib/parsetools/include/leexinc.hrl +++ b/lib/parsetools/include/leexinc.hrl @@ -36,8 +36,10 @@ string(Ics0, L0, Tcs, Ts) -> string_cont(Ics1, L1, yyaction(A, Alen, Tcs, L0), Ts); {reject,_Alen,Tlen,_Ics1,L1,_S1} -> % After a non-accepting state {error,{L0,?MODULE,{illegal,yypre(Tcs, Tlen+1)}},L1}; - {A,Alen,_Tlen,_Ics1,_L1,_S1} -> - string_cont(yysuf(Tcs, Alen), L0, yyaction(A, Alen, Tcs, L0), Ts) + {A,Alen,Tlen,_Ics1,L1,_S1} -> + Tcs1 = yysuf(Tcs, Alen), + L2 = adjust_line(Tlen, Alen, Tcs1, L1), + string_cont(Tcs1, L2, yyaction(A, Alen, Tcs, L0), Ts) end. %% string_cont(RestChars, Line, Token, Tokens) @@ -107,8 +109,10 @@ token(S0, Ics0, L0, Tcs, Tlen0, Tline, A0, Alen0) -> {reject,_Alen1,Tlen1,Ics1,L1,_S1} -> % No token match Error = {Tline,?MODULE,{illegal,yypre(Tcs, Tlen1+1)}}, {done,{error,Error,L1},Ics1}; - {A1,Alen1,_Tlen1,_Ics1,_L1,_S1} -> % Use last accept match - token_cont(yysuf(Tcs, Alen1), L0, yyaction(A1, Alen1, Tcs, Tline)) + {A1,Alen1,Tlen1,_Ics1,L1,_S1} -> % Use last accept match + Tcs1 = yysuf(Tcs, Alen1), + L2 = adjust_line(Tlen1, Alen1, Tcs1, L1), + token_cont(Tcs1, L2, yyaction(A1, Alen1, Tcs, Tline)) end. %% token_cont(RestChars, Line, Token) @@ -181,9 +185,11 @@ tokens(S0, Ics0, L0, Tcs, Tlen0, Tline, Ts, A0, Alen0) -> %% Skip rest of tokens. Error = {L1,?MODULE,{illegal,yypre(Tcs, Tlen1+1)}}, skip_tokens(yysuf(Tcs, Tlen1+1), L1, Error); - {A1,Alen1,_Tlen1,_Ics1,_L1,_S1} -> + {A1,Alen1,Tlen1,_Ics1,L1,_S1} -> Token = yyaction(A1, Alen1, Tcs, Tline), - tokens_cont(yysuf(Tcs, Alen1), L0, Token, Ts) + Tcs1 = yysuf(Tcs, Alen1), + L2 = adjust_line(Tlen1, Alen1, Tcs1, L1), + tokens_cont(Tcs1, L2, Token, Ts) end. %% tokens_cont(RestChars, Line, Token, Tokens) @@ -235,9 +241,11 @@ skip_tokens(S0, Ics0, L0, Tcs, Tlen0, Tline, Error, A0, Alen0) -> {done,{error,Error,L1},eof}; {reject,_Alen1,Tlen1,_Ics1,L1,_S1} -> skip_tokens(yysuf(Tcs, Tlen1+1), L1, Error); - {A1,Alen1,_Tlen1,_Ics1,L1,_S1} -> + {A1,Alen1,Tlen1,_Ics1,L1,_S1} -> Token = yyaction(A1, Alen1, Tcs, Tline), - skip_cont(yysuf(Tcs, Alen1), L1, Token, Error) + Tcs1 = yysuf(Tcs, Alen1), + L2 = adjust_line(Tlen1, Alen1, Tcs1, L1), + skip_cont(Tcs1, L2, Token, Error) end. %% skip_cont(RestChars, Line, Token, Error) @@ -269,6 +277,17 @@ yyrev(List, Tail) -> lists:reverse(List, Tail). yypre(List, N) -> lists:sublist(List, N). yysuf(List, N) -> lists:nthtail(N, List). +%% adjust_line(TokenLength, AcceptLength, Chars, Line) -> NewLine +%% Make sure that newlines in Chars are not counted twice. +%% Line has been updated with respect to newlines in the prefix of +%% Chars consisting of (TokenLength - AcceptLength) characters. + +adjust_line(N, N, _Cs, L) -> L; +adjust_line(T, A, [$\n|Cs], L) -> + adjust_line(T-1, A, Cs, L-1); +adjust_line(T, A, [_|Cs], L) -> + adjust_line(T-1, A, Cs, L). + %% yystate() -> InitialState. %% yystate(State, InChars, Line, CurrTokLen, AcceptAction, AcceptLen) -> %% {Action, AcceptLen, RestChars, Line} | diff --git a/lib/parsetools/src/leex.erl b/lib/parsetools/src/leex.erl index 15d42a4d9c..602e47404d 100644 --- a/lib/parsetools/src/leex.erl +++ b/lib/parsetools/src/leex.erl @@ -1586,6 +1586,8 @@ out_dfa_graph(St, DFA, DF) -> case file:open(St#leex.gfile, [write]) of {ok,Gfile} -> try + %% Set the same encoding as infile: + set_encoding(St, Gfile), io:fwrite(Gfile, "digraph DFA {~n", []), out_dfa_states(Gfile, DFA, DF), out_dfa_edges(Gfile, DFA), @@ -1621,7 +1623,7 @@ out_dfa_edges(File, DFA) -> foreach(fun (T) -> Crs = orddict:fetch(T, Tdict), Edgelab = dfa_edgelabel(Crs), - io:fwrite(File, " ~b -> ~b [label=\"~s\"];~n", + io:fwrite(File, " ~b -> ~b [label=\"~ts\"];~n", [S,T,Edgelab]) end, sort(orddict:fetch_keys(Tdict))) end, DFA). diff --git a/lib/parsetools/test/leex_SUITE.erl b/lib/parsetools/test/leex_SUITE.erl index 949ef3c36e..54602848ec 100644 --- a/lib/parsetools/test/leex_SUITE.erl +++ b/lib/parsetools/test/leex_SUITE.erl @@ -45,7 +45,7 @@ pt/1, man/1, ex/1, ex2/1, not_yet/1, line_wrap/1, - otp_10302/1, otp_11286/1, unicode/1]). + otp_10302/1, otp_11286/1, unicode/1, otp_13916/1]). % Default timetrap timeout (set in init_per_testcase). -define(default_timeout, ?t:minutes(1)). @@ -62,12 +62,12 @@ end_per_testcase(_Case, Config) -> suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> - [{group, checks}, {group, examples}, {group, bugs}]. + [{group, checks}, {group, examples}, {group, tickets}, {group, bugs}]. groups() -> [{checks, [], [file, compile, syntax]}, {examples, [], [pt, man, ex, ex2, not_yet, unicode]}, - {tickets, [], [otp_10302, otp_11286]}, + {tickets, [], [otp_10302, otp_11286, otp_13916]}, {bugs, [], [line_wrap]}]. init_per_suite(Config) -> @@ -408,12 +408,12 @@ unicode(Config) when is_list(Config) -> Ts = [{unicode_1, <<"%% -*- coding: utf-8 -*-\n" "Definitions.\n" - "RTLarrow = (←)\n" + "RTLarrow = (â)\n" "Rules.\n" - "{RTLarrow} : {token,{'<-',TokenLine}}.\n" + "{RTLarrow} : {token,{\"â\",TokenLine}}.\n" "Erlang code.\n" "-export([t/0]).\n" - "t() -> {ok, [{'<-', 1}], 1} = string(\"←\"), ok.">>, + "t() -> {ok, [{\"â\", 1}], 1} = string(\"â\"), ok.">>, default, ok}], @@ -1052,7 +1052,7 @@ otp_11286(Config) when is_list(Config) -> Dir = ?privdir, UName = [1024] ++ "u", UDir = filename:join(Dir, UName), - ok = rpc:call(Node, file, make_dir, [UDir]), + _ = rpc:call(Node, file, make_dir, [UDir]), %% Note: Cannot use UName as filename since the filename is used %% as module name. To be fixed in R18. @@ -1095,6 +1095,42 @@ otp_11286(Config) when is_list(Config) -> true = test_server:stop_node(Node), ok. +otp_13916(doc) -> + "OTP-13916. Leex rules with newlines result in bad line numbers"; +otp_13916(suite) -> []; +otp_13916(Config) when is_list(Config) -> + Ts = [{otp_13916_1, + <<"Definitions.\n" + "W = [a-zA-Z0-9]\n" + "S = [\\s\\t]\n" + "B = [\\n\\r]\n" + "Rules.\n" + "%% mark line break(s) and empty lines by token 'break'\n" + "%% in order to use as delimiters\n" + "{B}({S}*{B})+ : {token, {break, TokenLine}}.\n" + "{B} : {token, {break, TokenLine}}.\n" + "{S}+ : {token, {blank, TokenLine, TokenChars}}.\n" + "{W}+ : {token, {word, TokenLine, TokenChars}}.\n" + "Erlang code.\n" + "-export([t/0]).\n" + "t() ->\n" + " {ok,[{break,1},{blank,4,\" \"},{word,4,\"breaks\"}],4} =\n" + " string(\"\\n\\n \\n breaks\"),\n" + " {ok,[{break,1},{word,4,\"works\"}],4} =\n" + " string(\"\\n\\n \\nworks\"),\n" + " {ok,[{break,1},{word,4,\"L4\"},{break,4},\n" + " {word,5,\"L5\"},{break,5},{word,7,\"L7\"}], 7} =\n" + " string(\"\\n\\n \\nL4\\nL5\\n\\nL7\"),\n" + " {ok,[{break,1},{blank,4,\" \"},{word,4,\"L4\"},\n" + " {break,4},{blank,5,\" \"},{word,5,\"L5\"},\n" + " {break,5},{blank,7,\" \"},{word,7,\"L7\"}], 7} =\n" + " string(\"\\n\\n \\n L4\\n L5\\n\\n L7\"),\n" + " ok.\n">>, + default, + ok}], + ?line run(Config, Ts), + ok. + start_node(Name, Args) -> [_,Host] = string:tokens(atom_to_list(node()), "@"), ct:log("Trying to start ~w@~s~n", [Name,Host]), @@ -1137,7 +1173,7 @@ run_test(Config, Def, Pre) -> XrlFile = filename:join(DataDir, DefFile), ErlFile = filename:join(DataDir, Filename), Opts = [return, warn_unused_vars,{outdir,DataDir}], - ok = file:write_file(XrlFile, Def, [{encoding, unicode}]), + ok = file:write_file(XrlFile, Def), LOpts = [return, {report, false} | case Pre of default -> diff --git a/lib/parsetools/test/yecc_SUITE.erl b/lib/parsetools/test/yecc_SUITE.erl index e91ddb11d1..5bd71d5d19 100644 --- a/lib/parsetools/test/yecc_SUITE.erl +++ b/lib/parsetools/test/yecc_SUITE.erl @@ -2009,7 +2009,7 @@ otp_11286(Config) when is_list(Config) -> Dir = ?privdir, UName = [1024] ++ "u", UDir = filename:join(Dir, UName), - ok = rpc:call(Node, file, make_dir, [UDir]), + _ = rpc:call(Node, file, make_dir, [UDir]), %% Note: Cannot use UName as filename since the filename is used %% as module name. To be fixed in R18. diff --git a/lib/public_key/doc/src/public_key_app.xml b/lib/public_key/doc/src/public_key_app.xml index 1f87932b6c..923a9f1dfb 100644 --- a/lib/public_key/doc/src/public_key_app.xml +++ b/lib/public_key/doc/src/public_key_app.xml @@ -61,7 +61,7 @@ <section> <title>DEPENDENCIES</title> <p>The <c>public_key</c> application uses the - Crypto application to preform cryptographic operations and the + Crypto application to perform cryptographic operations and the ASN-1 application to handle PKIX-ASN-1 specifications, hence these applications must be loaded for the <c>public_key</c> application to work. In an embedded environment this means they must be started with @@ -72,7 +72,7 @@ <section> <title>ERROR LOGGER AND EVENT HANDLERS</title> <p> The <c>public_key</c> application is a library application - and does not use the error logger. The functions will either sucssed + and does not use the error logger. The functions will either succeed or fail with a runtime error. </p> </section> diff --git a/lib/public_key/test/pbe_SUITE.erl b/lib/public_key/test/pbe_SUITE.erl index 004eaefc27..44caf479e5 100644 --- a/lib/public_key/test/pbe_SUITE.erl +++ b/lib/public_key/test/pbe_SUITE.erl @@ -219,7 +219,12 @@ pbes2() -> pbes2(Config) when is_list(Config) -> decode_encode_key_file("pbes2_des_cbc_enc_key.pem", "password", "DES-CBC", Config), decode_encode_key_file("pbes2_des_ede3_cbc_enc_key.pem", "password", "DES-EDE3-CBC", Config), - decode_encode_key_file("pbes2_rc2_cbc_enc_key.pem", "password", "RC2-CBC", Config). + case lists:member(rc2_cbc, proplists:get_value(ciphers, crypto:supports())) of + true -> + decode_encode_key_file("pbes2_rc2_cbc_enc_key.pem", "password", "RC2-CBC", Config); + false -> + ok + end. check_key_info(#'PrivateKeyInfo'{privateKeyAlgorithm = #'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = ?rsaEncryption}, diff --git a/lib/runtime_tools/doc/src/dbg.xml b/lib/runtime_tools/doc/src/dbg.xml index db04bfdf7b..95f74d4607 100644 --- a/lib/runtime_tools/doc/src/dbg.xml +++ b/lib/runtime_tools/doc/src/dbg.xml @@ -954,7 +954,7 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\ as the tuple <c>{drop, N}</c> where <c>N</c> is the number of consecutive messages dropped. In case of heavy tracing, drop's are likely to occur, and they surely occur if no client is reading the trace - messages.</p> + messages. The default value of <c>QueSize</c> is 200.</p> </desc> </func> <func> diff --git a/lib/runtime_tools/src/dbg.erl b/lib/runtime_tools/src/dbg.erl index c0d4665bda..f17aa528ed 100644 --- a/lib/runtime_tools/src/dbg.erl +++ b/lib/runtime_tools/src/dbg.erl @@ -427,7 +427,7 @@ trace_port(file, Filename) -> trace_port1(file, Filename, nowrap); trace_port(ip, Portno) when is_integer(Portno) -> - trace_port(ip,{Portno,50}); + trace_port(ip,{Portno,200}); trace_port(ip, {Portno, Qsiz}) when is_integer(Portno), is_integer(Qsiz) -> fun() -> diff --git a/lib/sasl/doc/src/script.xml b/lib/sasl/doc/src/script.xml index 8ed132354d..b40ff28179 100644 --- a/lib/sasl/doc/src/script.xml +++ b/lib/sasl/doc/src/script.xml @@ -88,7 +88,7 @@ follows:</p> <list type="bulleted"> <item><c>-pa Dir1 Dir2 ... DirN</c> adds the directories - <c>Dir1, Dir2, ..., DirN</c> to the front of the initial + <c>DirN, DirN-1, ..., Dir2, Dir1</c> to the front of the initial load path.</item> <item><c>-pz Dir1 Dir2 ... DirN</c> adds the directories <c>Dir1, Dir2, ..., DirN</c> to the end of the initial diff --git a/lib/ssh/src/Makefile b/lib/ssh/src/Makefile index 69d5a47f83..7ab6f22424 100644 --- a/lib/ssh/src/Makefile +++ b/lib/ssh/src/Makefile @@ -96,7 +96,7 @@ APP_TARGET= $(EBIN)/$(APP_FILE) APPUP_SRC= $(APPUP_FILE).src APPUP_TARGET= $(EBIN)/$(APPUP_FILE) -INTERNAL_HRL_FILES = ssh_auth.hrl ssh_connect.hrl ssh_transport.hrl ssh.hrl ssh_userauth.hrl ssh_xfer.hrl +INTERNAL_HRL_FILES = ssh_auth.hrl ssh_connect.hrl ssh_transport.hrl ssh.hrl ssh_userauth.hrl ssh_xfer.hrl ssh_dbg.hrl # ---------------------------------------------------- # FLAGS diff --git a/lib/ssh/src/ssh_channel.erl b/lib/ssh/src/ssh_channel.erl index 426e2f5125..85b31f3669 100644 --- a/lib/ssh/src/ssh_channel.erl +++ b/lib/ssh/src/ssh_channel.erl @@ -261,7 +261,7 @@ handle_info({ssh_cm, _, _} = Msg, #state{cm = ConnectionManager, adjust_window(Msg), {noreply, State#state{channel_state = ChannelState}, Timeout}; {stop, ChannelId, ChannelState} -> - ssh_connection:close(ConnectionManager, ChannelId), + catch ssh_connection:close(ConnectionManager, ChannelId), {stop, normal, State#state{close_sent = true, channel_state = ChannelState}} end; diff --git a/lib/ssh/src/ssh_cli.erl b/lib/ssh/src/ssh_cli.erl index 74cd2e081a..8af0ecc5f9 100644 --- a/lib/ssh/src/ssh_cli.erl +++ b/lib/ssh/src/ssh_cli.erl @@ -208,8 +208,15 @@ handle_msg({Group, Req}, #state{group = Group, buf = Buf, pty = Pty, write_chars(ConnectionHandler, ChannelId, Chars), {ok, State#state{buf = NewBuf}}; -handle_msg({'EXIT', Group, _Reason}, #state{group = Group, - channel = ChannelId} = State) -> +handle_msg({'EXIT', Group, Reason}, #state{group = Group, + cm = ConnectionHandler, + channel = ChannelId} = State) -> + Status = case Reason of + normal -> 0; + _ -> -1 + end, + ssh_connection:exit_status(ConnectionHandler, ChannelId, Status), + ssh_connection:send_eof(ConnectionHandler, ChannelId), {stop, ChannelId, State}; handle_msg(_, State) -> diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index dd414894d4..7451c9e6d0 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -928,6 +928,7 @@ handle_event(internal, Msg=#ssh_msg_channel_request{}, StateName, D) - handle_connection_msg(Msg, StateName, D); handle_event(internal, Msg=#ssh_msg_channel_success{}, StateName, D) -> + update_inet_buffers(D#data.socket), handle_connection_msg(Msg, StateName, D); handle_event(internal, Msg=#ssh_msg_channel_failure{}, StateName, D) -> @@ -1007,6 +1008,7 @@ handle_event(cast, {reply_request,success,ChannelId}, {connected,_}, D) -> case ssh_channel:cache_lookup(cache(D), ChannelId) of #channel{remote_id = RemoteId} -> Msg = ssh_connection:channel_success_msg(RemoteId), + update_inet_buffers(D#data.socket), {keep_state, send_msg(Msg,D)}; undefined -> @@ -1194,12 +1196,12 @@ handle_event(info, {Proto, Sock, NewData}, StateName, D0 = #data{socket = Sock, ssh_message:decode(set_kex_overload_prefix(DecryptedBytes,D)) of Msg = #ssh_msg_kexinit{} -> - {keep_state, D, [{next_event, internal, {Msg,DecryptedBytes}}, - {next_event, internal, prepare_next_packet} + {keep_state, D, [{next_event, internal, prepare_next_packet}, + {next_event, internal, {Msg,DecryptedBytes}} ]}; Msg -> - {keep_state, D, [{next_event, internal, Msg}, - {next_event, internal, prepare_next_packet} + {keep_state, D, [{next_event, internal, prepare_next_packet}, + {next_event, internal, Msg} ]} catch _C:_E -> @@ -1738,6 +1740,11 @@ send_replies(Repls, State) -> Repls). get_repl({connection_reply,Msg}, {CallRepls,S}) -> + if is_record(Msg, ssh_msg_channel_success) -> + update_inet_buffers(S#data.socket); + true -> + ok + end, {CallRepls, send_msg(Msg,S)}; get_repl({channel_data,undefined,_Data}, Acc) -> Acc; @@ -1926,3 +1933,13 @@ handshake(Pid, Ref, Timeout) -> {error, timeout} end. +update_inet_buffers(Socket) -> + {ok, BufSzs0} = inet:getopts(Socket, [sndbuf,recbuf]), + MinVal = 655360, + case + [{Tag,MinVal} || {Tag,Val} <- BufSzs0, + Val < MinVal] + of + [] -> ok; + NewOpts -> inet:setopts(Socket, NewOpts) + end. diff --git a/lib/ssh/src/ssh_dbg.erl b/lib/ssh/src/ssh_dbg.erl index bd6bc0335b..dff2bae9f2 100644 --- a/lib/ssh/src/ssh_dbg.erl +++ b/lib/ssh/src/ssh_dbg.erl @@ -28,6 +28,9 @@ stop/0 ]). +-export([shrink_bin/1, + wr_record/3]). + -include("ssh.hrl"). -include("ssh_transport.hrl"). -include("ssh_connect.hrl"). @@ -113,7 +116,12 @@ setup_tracer(Write, MangleArg) -> ok. %%%---------------------------------------------------------------- -shrink_bin(B) when is_binary(B), size(B)>100 -> {'*** SHRINKED BIN',size(B),element(1,split_binary(B,20)),'***'}; +shrink_bin(B) when is_binary(B), size(B)>100 -> {'*** SHRINKED BIN', + size(B), + element(1,split_binary(B,20)), + '...', + element(2,split_binary(B,size(B)-20)) + }; shrink_bin(L) when is_list(L) -> lists:map(fun shrink_bin/1, L); shrink_bin(T) when is_tuple(T) -> list_to_tuple(shrink_bin(tuple_to_list(T))); shrink_bin(X) -> X. diff --git a/lib/ssh/src/ssh_dbg.hrl b/lib/ssh/src/ssh_dbg.hrl new file mode 100644 index 0000000000..e94664737b --- /dev/null +++ b/lib/ssh/src/ssh_dbg.hrl @@ -0,0 +1,27 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +-ifndef(SSH_DBG_HRL). +-define(SSH_DBG_HRL, 1). + +-define(formatrec(RecName,R), + ssh_dbg:wr_record(R, record_info(fields,RecName), [])). + +-endif. % SSH_DBG_HRL defined diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl index d52d453007..0a0ab5cdf7 100644 --- a/lib/ssh/test/ssh_basic_SUITE.erl +++ b/lib/ssh/test/ssh_basic_SUITE.erl @@ -67,7 +67,8 @@ shell_unicode_string/1, ssh_info_print/1, key_callback/1, - key_callback_options/1 + key_callback_options/1, + shell_exit_status/1 ]). %%% Common test callbacks @@ -106,7 +107,8 @@ all() -> multi_daemon_opt_fd, packet_size_zero, ssh_info_print, - {group, login_bad_pwd_no_retry} + {group, login_bad_pwd_no_retry}, + shell_exit_status ]. groups() -> @@ -313,9 +315,9 @@ init_per_testcase(TC, Config) when TC==shell_no_unicode ; {user_passwords, [{"foo", "bar"}]}]), ct:sleep(500), IO = ssh_test_lib:start_io_server(), - Shell = ssh_test_lib:start_shell(Port, IO, UserDir, - [{silently_accept_hosts, true}, - {user,"foo"},{password,"bar"}]), + Shell = ssh_test_lib:start_shell(Port, IO, [{user_dir,UserDir}, + {silently_accept_hosts, true}, + {user,"foo"},{password,"bar"}]), ct:log("IO=~p, Shell=~p, self()=~p",[IO,Shell,self()]), ct:log("file:native_name_encoding() = ~p,~nio:getopts() = ~p", [file:native_name_encoding(),io:getopts()]), @@ -341,14 +343,15 @@ end_per_testcase(TC, Config) when TC==shell_no_unicode ; TC==shell_unicode_string -> case proplists:get_value(sftpd, Config) of {Pid, _, _} -> - ssh:stop_daemon(Pid), - ssh:stop(); + catch ssh:stop_daemon(Pid); _ -> - ssh:stop() - end; + ok + end, + end_per_testcase(Config); end_per_testcase(_TestCase, Config) -> end_per_testcase(Config). -end_per_testcase(_Config) -> + +end_per_testcase(_Config) -> ssh:stop(), ok. @@ -522,7 +525,7 @@ shell(Config) when is_list(Config) -> ct:sleep(500), IO = ssh_test_lib:start_io_server(), - Shell = ssh_test_lib:start_shell(Port, IO, UserDir), + Shell = ssh_test_lib:start_shell(Port, IO, [{user_dir,UserDir}]), receive {'EXIT', _, _} -> ct:fail(no_ssh_connection); @@ -560,10 +563,10 @@ exec_key_differs(Config, UserPKAlgs) -> ct:sleep(500), IO = ssh_test_lib:start_io_server(), - Shell = ssh_test_lib:start_shell(Port, IO, UserDir, - [{preferred_algorithms,[{public_key,['ssh-rsa']}]}, - {pref_public_key_algs,UserPKAlgs} - ]), + Shell = ssh_test_lib:start_shell(Port, IO, [{user_dir,UserDir}, + {preferred_algorithms,[{public_key,['ssh-rsa']}]}, + {pref_public_key_algs,UserPKAlgs} + ]), receive @@ -594,9 +597,9 @@ exec_key_differs_fail(Config) when is_list(Config) -> ct:sleep(500), IO = ssh_test_lib:start_io_server(), - ssh_test_lib:start_shell(Port, IO, UserDir, - [{preferred_algorithms,[{public_key,['ssh-rsa']}]}, - {pref_public_key_algs,['ssh-dss']}]), + ssh_test_lib:start_shell(Port, IO, [{user_dir,UserDir}, + {preferred_algorithms,[{public_key,['ssh-rsa']}]}, + {pref_public_key_algs,['ssh-dss']}]), receive {'EXIT', _, _} -> ok; @@ -1167,6 +1170,33 @@ login_bad_pwd_no_retry(Config, AuthMethods) -> end end. + +%%---------------------------------------------------------------------------- +%%% Test that when shell REPL exit with reason normal client receives status 0 +shell_exit_status(Config) when is_list(Config) -> + process_flag(trap_exit, true), + SystemDir = proplists:get_value(data_dir, Config), + UserDir = proplists:get_value(priv_dir, Config), + + ShellFun = fun (_User) -> spawn(fun() -> ok end) end, + {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir}, + {user_dir, UserDir}, + {user_passwords, [{"vego", "morot"}]}, + {shell, ShellFun}, + {failfun, fun ssh_test_lib:failfun/2}]), + ConnectionRef = + ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true}, + {user_dir, UserDir}, + {user, "vego"}, + {password, "morot"}, + {user_interaction, false}]), + + {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity), + ok = ssh_connection:shell(ConnectionRef, ChannelId), + ssh_test_lib:receive_exec_end(ConnectionRef, ChannelId), + ssh:stop_daemon(Pid). + + %%-------------------------------------------------------------------- %% Internal functions ------------------------------------------------ %%-------------------------------------------------------------------- diff --git a/lib/ssh/test/ssh_connection_SUITE.erl b/lib/ssh/test/ssh_connection_SUITE.erl index bcf3b01824..e898d55b6f 100644 --- a/lib/ssh/test/ssh_connection_SUITE.erl +++ b/lib/ssh/test/ssh_connection_SUITE.erl @@ -381,13 +381,13 @@ do_interrupted_send(Config, SendSize, EchoSize) -> {password, "morot"}, {subsystems, [{"echo_n",EchoSS_spec}]}]), - ct:log("connect", []), + ct:log("~p:~p connect", [?MODULE,?LINE]), ConnectionRef = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true}, {user, "foo"}, {password, "morot"}, {user_interaction, false}, {user_dir, UserDir}]), - ct:log("connected", []), + ct:log("~p:~p connected", [?MODULE,?LINE]), %% build big binary Data = << <<X:32>> || X <- lists:seq(1,SendSize div 4)>>, @@ -399,9 +399,9 @@ do_interrupted_send(Config, SendSize, EchoSize) -> Parent = self(), ResultPid = spawn( fun() -> - ct:log("open channel",[]), + ct:log("~p:~p open channel",[?MODULE,?LINE]), {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity), - ct:log("start subsystem", []), + ct:log("~p:~p start subsystem", [?MODULE,?LINE]), case ssh_connection:subsystem(ConnectionRef, ChannelId, "echo_n", infinity) of success -> Parent ! {self(), channelId, ChannelId}, @@ -410,47 +410,69 @@ do_interrupted_send(Config, SendSize, EchoSize) -> try collect_data(ConnectionRef, ChannelId) of ExpectedData -> + ct:log("~p:~p got expected data",[?MODULE,?LINE]), ok; - _ -> - {fail,"unexpected result"} + Other -> + ct:log("~p:~p unexpect: ~p", [?MODULE,?LINE,Other]), + {fail,"unexpected result in listener"} catch Class:Exception -> - {fail, io_lib:format("Exception ~p:~p",[Class,Exception])} + {fail, io_lib:format("Listener exception ~p:~p",[Class,Exception])} end, - Parent ! {self(), Result}; + Parent ! {self(), result, Result}; Other -> Parent ! {self(), channelId, error, Other} end end), receive + {ResultPid, channelId, error, Other} -> + ct:log("~p:~p channelId error ~p", [?MODULE,?LINE,Other]), + ssh:close(ConnectionRef), + ssh:stop_daemon(Pid), + {fail, "ssh_connection:subsystem"}; + {ResultPid, channelId, ChannelId} -> - %% pre-adjust receive window so the other end doesn't block - ct:log("adjust window", []), - ssh_connection:adjust_window(ConnectionRef, ChannelId, size(ExpectedData) + 1), - - ct:log("going to send ~p bytes", [size(Data)]), - case ssh_connection:send(ConnectionRef, ChannelId, Data, 30000) of - {error, closed} -> - ct:log("{error,closed} - That's what we expect :)", []), - ok; - Msg -> - ct:log("Got ~p - that's bad, very bad indeed",[Msg]), - ct:fail({expected,{error,closed}, got, Msg}) - end, - ct:log("going to check the result (if it is available)", []), + ct:log("~p:~p ~p going to send ~p bytes", [?MODULE,?LINE,self(),size(Data)]), + SenderPid = spawn(fun() -> + Parent ! {self(), ssh_connection:send(ConnectionRef, ChannelId, Data, 30000)} + end), receive - {ResultPid, Result} -> - ct:log("Got result: ~p", [Result]), + {ResultPid, result, {fail, Fail}} -> + ct:log("~p:~p Listener failed: ~p", [?MODULE,?LINE,Fail]), + {fail, Fail}; + + {ResultPid, result, Result} -> + ct:log("~p:~p Got result: ~p", [?MODULE,?LINE,Result]), ssh:close(ConnectionRef), ssh:stop_daemon(Pid), - Result - end; + ct:log("~p:~p Check sender", [?MODULE,?LINE]), + receive + {SenderPid, {error, closed}} -> + ct:log("~p:~p {error,closed} - That's what we expect :)",[?MODULE,?LINE]), + ok; + Msg -> + ct:log("~p:~p Not expected send result: ~p",[?MODULE,?LINE,Msg]), + {fail, "Not expected msg"} + end; + + {SenderPid, {error, closed}} -> + ct:log("~p:~p {error,closed} - That's what we expect, but client channel handler has not reported yet",[?MODULE,?LINE]), + receive + {ResultPid, result, Result} -> + ct:log("~p:~p Now got the result: ~p", [?MODULE,?LINE,Result]), + ssh:close(ConnectionRef), + ssh:stop_daemon(Pid), + ok; + Msg -> + ct:log("~p:~p Got an unexpected msg ~p",[?MODULE,?LINE,Msg]), + {fail, "Un-expected msg"} + end; - {ResultPid, channelId, error, Other} -> - ssh:close(ConnectionRef), - ssh:stop_daemon(Pid), - {fail, io_lib:format("ssh_connection:subsystem: ~p",[Other])} + Msg -> + ct:log("~p:~p Got unexpected ~p",[?MODULE,?LINE,Msg]), + {fail, "Unexpected msg"} + end end. %%-------------------------------------------------------------------- @@ -910,34 +932,35 @@ big_cat_rx(ConnectionRef, ChannelId, Acc) -> end. collect_data(ConnectionRef, ChannelId) -> - ct:log("Listener ~p running! ConnectionRef=~p, ChannelId=~p",[self(),ConnectionRef,ChannelId]), + ct:log("~p:~p Listener ~p running! ConnectionRef=~p, ChannelId=~p",[?MODULE,?LINE,self(),ConnectionRef,ChannelId]), collect_data(ConnectionRef, ChannelId, [], 0). collect_data(ConnectionRef, ChannelId, Acc, Sum) -> TO = 5000, receive {ssh_cm, ConnectionRef, {data, ChannelId, 0, Data}} when is_binary(Data) -> - ct:log("collect_data: received ~p bytes. total ~p bytes",[size(Data),Sum+size(Data)]), + ct:log("~p:~p collect_data: received ~p bytes. total ~p bytes",[?MODULE,?LINE,size(Data),Sum+size(Data)]), + ssh_connection:adjust_window(ConnectionRef, ChannelId, size(Data)), collect_data(ConnectionRef, ChannelId, [Data | Acc], Sum+size(Data)); {ssh_cm, ConnectionRef, {eof, ChannelId}} -> try iolist_to_binary(lists:reverse(Acc)) of Bin -> - ct:log("collect_data: received eof.~nGot in total ~p bytes",[size(Bin)]), + ct:log("~p:~p collect_data: received eof.~nGot in total ~p bytes",[?MODULE,?LINE,size(Bin)]), Bin catch C:E -> - ct:log("collect_data: received eof.~nAcc is strange...~nException=~p:~p~nAcc=~p", - [C,E,Acc]), + ct:log("~p:~p collect_data: received eof.~nAcc is strange...~nException=~p:~p~nAcc=~p", + [?MODULE,?LINE,C,E,Acc]), {error,{C,E}} end; Msg -> - ct:log("collect_data: ***** unexpected message *****~n~p",[Msg]), + ct:log("~p:~p collect_data: ***** unexpected message *****~n~p",[?MODULE,?LINE,Msg]), collect_data(ConnectionRef, ChannelId, Acc, Sum) after TO -> - ct:log("collect_data: ----- Nothing received for ~p seconds -----~n",[]), + ct:log("~p:~p collect_data: ----- Nothing received for ~p seconds -----~n",[?MODULE,?LINE,TO]), collect_data(ConnectionRef, ChannelId, Acc, Sum) end. diff --git a/lib/ssh/test/ssh_options_SUITE.erl b/lib/ssh/test/ssh_options_SUITE.erl index 61883c0647..4cc12cbcbe 100644 --- a/lib/ssh/test/ssh_options_SUITE.erl +++ b/lib/ssh/test/ssh_options_SUITE.erl @@ -540,10 +540,18 @@ connectfun_disconnectfun_server(Config) -> {disconnect,Ref,R} -> ct:log("Disconnect result: ~p",[R]), ssh:stop_daemon(Pid) - after 2000 -> + after 5000 -> + receive + X -> ct:log("received ~p",[X]) + after 0 -> ok + end, {fail, "No disconnectfun action"} end - after 2000 -> + after 5000 -> + receive + X -> ct:log("received ~p",[X]) + after 0 -> ok + end, {fail, "No connectfun action"} end. @@ -649,7 +657,7 @@ disconnectfun_option_server(Config) -> ct:log("Server detected disconnect: ~p",[Reason]), ssh:stop_daemon(Pid), ok - after 3000 -> + after 5000 -> receive X -> ct:log("received ~p",[X]) after 0 -> ok @@ -974,7 +982,14 @@ ssh_connect_negtimeout(Config, Parallel) -> ct:sleep(round(Factor * NegTimeOut)), case inet:sockname(Socket) of - {ok,_} -> ct:fail("Socket not closed"); + {ok,_} -> + %% Give it another chance... + ct:log("Sleep more...",[]), + ct:sleep(round(Factor * NegTimeOut)), + case inet:sockname(Socket) of + {ok,_} -> ct:fail("Socket not closed"); + {error,_} -> ok + end; {error,_} -> ok end. @@ -1003,7 +1018,7 @@ ssh_connect_nonegtimeout_connected(Config, Parallel) -> ct:sleep(500), IO = ssh_test_lib:start_io_server(), - Shell = ssh_test_lib:start_shell(Port, IO, UserDir), + Shell = ssh_test_lib:start_shell(Port, IO, [{user_dir,UserDir}]), receive Error = {'EXIT', _, _} -> ct:log("~p",[Error]), diff --git a/lib/ssh/test/ssh_renegotiate_SUITE.erl b/lib/ssh/test/ssh_renegotiate_SUITE.erl index b10ec3707f..74bbc291b2 100644 --- a/lib/ssh/test/ssh_renegotiate_SUITE.erl +++ b/lib/ssh/test/ssh_renegotiate_SUITE.erl @@ -92,11 +92,11 @@ rekey(Config) -> ConnectionRef = ssh_test_lib:std_connect(Config, Host, Port, [{rekey_limit, 0}]), - Kex1 = get_kex_init(ConnectionRef), + Kex1 = ssh_test_lib:get_kex_init(ConnectionRef), receive after ?REKEY_DATA_TMO -> %%By this time rekeying would have been done - Kex2 = get_kex_init(ConnectionRef), + Kex2 = ssh_test_lib:get_kex_init(ConnectionRef), false = (Kex2 == Kex1), ssh:close(ConnectionRef), ssh:stop_daemon(Pid) @@ -120,31 +120,31 @@ rekey_limit(Config) -> {max_random_length_padding,0}]), {ok, SftpPid} = ssh_sftp:start_channel(ConnectionRef), - Kex1 = get_kex_init(ConnectionRef), + Kex1 = ssh_test_lib:get_kex_init(ConnectionRef), timer:sleep(?REKEY_DATA_TMO), - Kex1 = get_kex_init(ConnectionRef), + Kex1 = ssh_test_lib:get_kex_init(ConnectionRef), Data = lists:duplicate(159000,1), ok = ssh_sftp:write_file(SftpPid, DataFile, Data), timer:sleep(?REKEY_DATA_TMO), - Kex2 = get_kex_init(ConnectionRef), + Kex2 = ssh_test_lib:get_kex_init(ConnectionRef), false = (Kex2 == Kex1), timer:sleep(?REKEY_DATA_TMO), - Kex2 = get_kex_init(ConnectionRef), + Kex2 = ssh_test_lib:get_kex_init(ConnectionRef), ok = ssh_sftp:write_file(SftpPid, DataFile, "hi\n"), timer:sleep(?REKEY_DATA_TMO), - Kex2 = get_kex_init(ConnectionRef), + Kex2 = ssh_test_lib:get_kex_init(ConnectionRef), false = (Kex2 == Kex1), timer:sleep(?REKEY_DATA_TMO), - Kex2 = get_kex_init(ConnectionRef), + Kex2 = ssh_test_lib:get_kex_init(ConnectionRef), ssh_sftp:stop_channel(SftpPid), ssh:close(ConnectionRef), @@ -169,7 +169,7 @@ renegotiate1(Config) -> ConnectionRef = ssh_test_lib:std_connect(Config, Host, RPort, [{max_random_length_padding,0}]), {ok, SftpPid} = ssh_sftp:start_channel(ConnectionRef), - Kex1 = get_kex_init(ConnectionRef), + Kex1 = ssh_test_lib:get_kex_init(ConnectionRef), {ok, Handle} = ssh_sftp:open(SftpPid, DataFile, [write]), @@ -181,7 +181,7 @@ renegotiate1(Config) -> timer:sleep(2000), - Kex2 = get_kex_init(ConnectionRef), + Kex2 = ssh_test_lib:get_kex_init(ConnectionRef), false = (Kex2 == Kex1), @@ -208,7 +208,7 @@ renegotiate2(Config) -> ConnectionRef = ssh_test_lib:std_connect(Config, Host, RPort, [{max_random_length_padding,0}]), {ok, SftpPid} = ssh_sftp:start_channel(ConnectionRef), - Kex1 = get_kex_init(ConnectionRef), + Kex1 = ssh_test_lib:get_kex_init(ConnectionRef), {ok, Handle} = ssh_sftp:open(SftpPid, DataFile, [write]), @@ -223,7 +223,7 @@ renegotiate2(Config) -> timer:sleep(2000), - Kex2 = get_kex_init(ConnectionRef), + Kex2 = ssh_test_lib:get_kex_init(ConnectionRef), false = (Kex2 == Kex1), @@ -235,19 +235,3 @@ renegotiate2(Config) -> %%-------------------------------------------------------------------- %% Internal functions ------------------------------------------------ %%-------------------------------------------------------------------- -%% get_kex_init - helper function to get key_exchange_init_msg -get_kex_init(Conn) -> - %% First, validate the key exchange is complete (StateName == connected) - {{connected,_},S} = sys:get_state(Conn), - %% Next, walk through the elements of the #state record looking - %% for the #ssh_msg_kexinit record. This method is robust against - %% changes to either record. The KEXINIT message contains a cookie - %% unique to each invocation of the key exchange procedure (RFC4253) - SL = tuple_to_list(S), - case lists:keyfind(ssh_msg_kexinit, 1, SL) of - false -> - throw(not_found); - KexInit -> - KexInit - end. - diff --git a/lib/ssh/test/ssh_test_lib.erl b/lib/ssh/test/ssh_test_lib.erl index 6fd401d182..f93237f3e7 100644 --- a/lib/ssh/test/ssh_test_lib.erl +++ b/lib/ssh/test/ssh_test_lib.erl @@ -127,24 +127,19 @@ std_simple_exec(Host, Port, Config, Opts) -> ssh:close(ConnectionRef). -start_shell(Port, IOServer, UserDir) -> - start_shell(Port, IOServer, UserDir, []). - -start_shell(Port, IOServer, UserDir, Options) -> - spawn_link(?MODULE, init_shell, [Port, IOServer, [{user_dir, UserDir}|Options]]). - start_shell(Port, IOServer) -> - spawn_link(?MODULE, init_shell, [Port, IOServer, []]). + start_shell(Port, IOServer, []). -init_shell(Port, IOServer, UserDir) -> - Host = hostname(), - Options = [{user_interaction, false}, {silently_accept_hosts, - true}] ++ UserDir, - group_leader(IOServer, self()), - loop_shell(Host, Port, Options). +start_shell(Port, IOServer, ExtraOptions) -> + spawn_link( + fun() -> + Host = hostname(), + Options = [{user_interaction, false}, + {silently_accept_hosts,true} | ExtraOptions], + group_leader(IOServer, self()), + ssh:shell(Host, Port, Options) + end). -loop_shell(Host, Port, Options) -> - ssh:shell(Host, Port, Options). start_io_server() -> spawn_link(?MODULE, init_io_server, [self()]). @@ -802,3 +797,40 @@ busy_wait(Nus, T0) -> end. %%%---------------------------------------------------------------- +%% get_kex_init - helper function to get key_exchange_init_msg + +get_kex_init(Conn) -> + Ref = make_ref(), + {ok,TRef} = timer:send_after(15000, {reneg_timeout,Ref}), + get_kex_init(Conn, Ref, TRef). + +get_kex_init(Conn, Ref, TRef) -> + %% First, validate the key exchange is complete (StateName == connected) + case sys:get_state(Conn) of + {{connected,_}, S} -> + timer:cancel(TRef), + %% Next, walk through the elements of the #state record looking + %% for the #ssh_msg_kexinit record. This method is robust against + %% changes to either record. The KEXINIT message contains a cookie + %% unique to each invocation of the key exchange procedure (RFC4253) + SL = tuple_to_list(S), + case lists:keyfind(ssh_msg_kexinit, 1, SL) of + false -> + throw(not_found); + KexInit -> + KexInit + end; + + {OtherState, S} -> + ct:log("Not in 'connected' state: ~p",[OtherState]), + receive + {reneg_timeout,Ref} -> + ct:log("S = ~p", [S]), + ct:fail(reneg_timeout) + after 0 -> + timer:sleep(100), % If renegotiation is complete we do not + % want to exit on the reneg_timeout + get_kex_init(Conn, Ref, TRef) + end + end. + diff --git a/lib/ssh/test/ssh_to_openssh_SUITE.erl b/lib/ssh/test/ssh_to_openssh_SUITE.erl index f481e9c1ce..86c3d5de26 100644 --- a/lib/ssh/test/ssh_to_openssh_SUITE.erl +++ b/lib/ssh/test/ssh_to_openssh_SUITE.erl @@ -29,6 +29,7 @@ -define(TIMEOUT, 50000). -define(SSH_DEFAULT_PORT, 22). +-define(REKEY_DATA_TMO, 65000). %%-------------------------------------------------------------------- %% Common Test interface functions ----------------------------------- @@ -55,7 +56,8 @@ groups() -> erlang_client_openssh_server_publickey_rsa, erlang_client_openssh_server_password, erlang_client_openssh_server_kexs, - erlang_client_openssh_server_nonexistent_subsystem + erlang_client_openssh_server_nonexistent_subsystem, + erlang_client_openssh_server_renegotiate ]}, {erlang_server, [], [erlang_server_openssh_client_public_key_dsa, erlang_server_openssh_client_public_key_rsa, @@ -105,6 +107,11 @@ init_per_testcase(erlang_server_openssh_client_public_key_rsa, Config) -> chk_key(sshc, 'ssh-rsa', ".ssh/id_rsa", Config); init_per_testcase(erlang_client_openssh_server_publickey_dsa, Config) -> chk_key(sshd, 'ssh-dss', ".ssh/id_dsa", Config); +init_per_testcase(erlang_server_openssh_client_renegotiate, Config) -> + case os:type() of + {unix,_} -> ssh:start(), Config; + Type -> {skip, io_lib:format("Unsupported test on ~p",[Type])} + end; init_per_testcase(_TestCase, Config) -> ssh:start(), Config. @@ -146,7 +153,7 @@ erlang_shell_client_openssh_server(Config) when is_list(Config) -> IO = ssh_test_lib:start_io_server(), Shell = ssh_test_lib:start_shell(?SSH_DEFAULT_PORT, IO), IO ! {input, self(), "echo Hej\n"}, - receive_hej(), + receive_data("Hej"), IO ! {input, self(), "exit\n"}, receive_logout(), receive_normal_exit(Shell). @@ -393,33 +400,103 @@ erlang_server_openssh_client_renegotiate(Config) -> SystemDir = proplists:get_value(data_dir, Config), PrivDir = proplists:get_value(priv_dir, Config), KnownHosts = filename:join(PrivDir, "known_hosts"), + {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir}, {public_key_alg, PubKeyAlg}, {failfun, fun ssh_test_lib:failfun/2}]), - ct:sleep(500), + RenegLimitK = 3, DataFile = filename:join(PrivDir, "renegotiate_openssh_client.data"), - Data = lists:duplicate(32000, $a), + Data = lists:duplicate(trunc(1.1*RenegLimitK*1024), $a), ok = file:write_file(DataFile, Data), Cmd = "ssh -p " ++ integer_to_list(Port) ++ " -o UserKnownHostsFile=" ++ KnownHosts ++ - " -o RekeyLimit=20K" ++ + " -o RekeyLimit=" ++ integer_to_list(RenegLimitK) ++"K" ++ " " ++ Host ++ " < " ++ DataFile, OpenSsh = ssh_test_lib:open_port({spawn, Cmd}), Expect = fun({data,R}) -> - try lists:prefix(binary_to_list(R), Data) + try + NonAlphaChars = [C || C<-lists:seq(1,255), + not lists:member(C,lists:seq($a,$z)), + not lists:member(C,lists:seq($A,$Z)) + ], + Lines = string:tokens(binary_to_list(R), NonAlphaChars), + lists:any(fun(L) -> length(L)>1 andalso lists:prefix(L, Data) end, + Lines) catch _:_ -> false end; + + ({exit_status,E}) when E=/=0 -> + ct:log("exit_status ~p",[E]), + throw({skip,"exit status"}); + (_) -> false end, + + try + ssh_test_lib:rcv_expected(Expect, OpenSsh, ?TIMEOUT) + of + _ -> + %% Unfortunatly we can't check that there has been a renegotiation, just trust OpenSSH. + ssh:stop_daemon(Pid) + catch + throw:{skip,R} -> {skip,R} + end. - ssh_test_lib:rcv_expected(Expect, OpenSsh, ?TIMEOUT), - ssh:stop_daemon(Pid). +%%-------------------------------------------------------------------- +erlang_client_openssh_server_renegotiate(_Config) -> + process_flag(trap_exit, true), + + IO = ssh_test_lib:start_io_server(), + Ref = make_ref(), + Parent = self(), + + Shell = + spawn_link( + fun() -> + Host = ssh_test_lib:hostname(), + Options = [{user_interaction, false}, + {silently_accept_hosts,true}], + group_leader(IO, self()), + {ok, ConnRef} = ssh:connect(Host, ?SSH_DEFAULT_PORT, Options), + case ssh_connection:session_channel(ConnRef, infinity) of + {ok,ChannelId} -> + success = ssh_connection:ptty_alloc(ConnRef, ChannelId, []), + Args = [{channel_cb, ssh_shell}, + {init_args,[ConnRef, ChannelId]}, + {cm, ConnRef}, {channel_id, ChannelId}], + {ok, State} = ssh_channel:init([Args]), + Parent ! {ok, Ref, ConnRef}, + ssh_channel:enter_loop(State); + Error -> + Parent ! {error, Ref, Error} + end, + receive + nothing -> ok + end + end), + + receive + {error, Ref, Error} -> + ct:fail("Error=~p",[Error]); + {ok, Ref, ConnectionRef} -> + IO ! {input, self(), "echo Hej1\n"}, + receive_data("Hej1"), + Kex1 = ssh_test_lib:get_kex_init(ConnectionRef), + ssh_connection_handler:renegotiate(ConnectionRef), + IO ! {input, self(), "echo Hej2\n"}, + receive_data("Hej2"), + Kex2 = ssh_test_lib:get_kex_init(ConnectionRef), + IO ! {input, self(), "exit\n"}, + receive_logout(), + receive_normal_exit(Shell), + true = (Kex1 =/= Kex2) + end. %%-------------------------------------------------------------------- erlang_client_openssh_server_password() -> @@ -476,27 +553,24 @@ erlang_client_openssh_server_nonexistent_subsystem(Config) when is_list(Config) %%-------------------------------------------------------------------- %%% Internal functions ----------------------------------------------- %%-------------------------------------------------------------------- -receive_hej() -> +receive_data(Data) -> receive - <<"Hej", _binary>> = Hej -> - ct:log("Expected result: ~p~n", [Hej]); - <<"Hej\n", _binary>> = Hej -> - ct:log("Expected result: ~p~n", [Hej]); - <<"Hej\r\n", _/binary>> = Hej -> - ct:log("Expected result: ~p~n", [Hej]); - Info -> - Lines = binary:split(Info, [<<"\r\n">>], [global]), - case lists:member(<<"Hej">>, Lines) of + Info when is_binary(Info) -> + Lines = string:tokens(binary_to_list(Info), "\r\n "), + case lists:member(Data, Lines) of true -> ct:log("Expected result found in lines: ~p~n", [Lines]), ok; false -> ct:log("Extra info: ~p~n", [Info]), - receive_hej() - end + receive_data(Data) + end; + Other -> + ct:log("Unexpected: ~p",[Other]), + receive_data(Data) after 30000 -> ct:fail("timeout ~p:~p",[?MODULE,?LINE]) - end. + end. receive_logout() -> receive diff --git a/lib/ssl/doc/src/ssl.xml b/lib/ssl/doc/src/ssl.xml index abba5aaf59..edc7e0d8b2 100644 --- a/lib/ssl/doc/src/ssl.xml +++ b/lib/ssl/doc/src/ssl.xml @@ -155,7 +155,7 @@ <tag><c>cipher() =</c></tag> <item><p><c>rc4_128 | des_cbc | '3des_ede_cbc' - | aes_128_cbc | aes_256_cbc | aes_128_gcm | aes_256_gcm</c></p></item> + | aes_128_cbc | aes_256_cbc | aes_128_gcm | aes_256_gcm | chacha20_poly1305</c></p></item> <tag><c>hash() =</c></tag> <item><p><c>md5 | sha | sha224 | sha256 | sha348 | sha512</c></p></item> @@ -170,6 +170,14 @@ <tag><c>SNIfun::fun()</c></tag> <item><p><c>= fun(ServerName :: string()) -> [ssl_option()]</c></p></item> + <tag><c>named_curve() =</c></tag> + <item><p><c>sect571r1 | sect571k1 | secp521r1 | brainpoolP512r1 + | sect409k1 | sect409r1 | brainpoolP384r1 | secp384r1 + | sect283k1 | sect283r1 | brainpoolP256r1 | secp256k1 | secp256r1 + | sect239k1 | sect233k1 | sect233r1 | secp224k1 | secp224r1 + | sect193r1 | sect193r2 | secp192k1 | secp192r1 | sect163k1 + | sect163r1 | sect163r2 | secp160k1 | secp160r1 | secp160r2</c></p></item> + </taglist> </section> @@ -217,6 +225,11 @@ Anonymous cipher suites are supported for testing purposes only and are not be used when security matters.</p></item> + <tag><c>{eccs, [named_curve()]}</c></tag> + <item><p> Allows to specify the order of preference for named curves + and to restrict their usage when using a cipher suite supporting them. + </p></item> + <tag><c>{secure_renegotiate, boolean()}</c></tag> <item><p>Specifies if to reject renegotiation attempt that does not live up to @@ -751,6 +764,11 @@ fun(srp, Username :: string(), UserState :: term()) -> (the default), use the client's preference. </item> + <tag><c>{honor_ecc_order, boolean()}</c></tag> + <item>If true, use the server's preference for ECC curve selection. If false + (the default), use the client's preference. + </item> + <tag><c>{signature_algs, [{hash(), ecdsa | rsa | dsa}]}</c></tag> <item><p> The algorithms specified by this option will be the ones accepted by the server in a signature algorithm @@ -804,6 +822,17 @@ fun(srp, Username :: string(), UserState :: term()) -> </func> <func> + <name>eccs() -></name> + <name>eccs(protocol()) -> [named_curve()]</name> + <fsummary>Returns a list of supported ECCs.</fsummary> + + <desc><p>Returns a list of supported ECCs. <c>eccs()</c> + is equivalent to calling <c>eccs(Protocol)</c> with all + supported protocols and then deduplicating the output.</p> + </desc> + </func> + + <func> <name>clear_pem_cache() -> ok </name> <fsummary> Clears the pem cache</fsummary> @@ -898,7 +927,7 @@ fun(srp, Username :: string(), UserState :: term()) -> <fsummary>Returns all the connection information. </fsummary> <type> - <v>Item = protocol | cipher_suite | sni_hostname | atom()</v> + <v>Item = protocol | cipher_suite | sni_hostname | ecc | atom()</v> <d>Meaningful atoms, not specified above, are the ssl option names.</d> <v>Result = [{Item::atom(), Value::term()}]</v> <v>Reason = term()</v> diff --git a/lib/ssl/doc/src/ssl_distribution.xml b/lib/ssl/doc/src/ssl_distribution.xml index 1150043e76..61f88e3860 100644 --- a/lib/ssl/doc/src/ssl_distribution.xml +++ b/lib/ssl/doc/src/ssl_distribution.xml @@ -43,7 +43,7 @@ Erlang node distributed, <c>net_kernel</c> uses this module to set up listen ports and connections.</p> - <p>In the SSL application, an exra distribution + <p>In the SSL application, an extra distribution module, <c>inet_tls_dist</c>, can be used as an alternative. All distribution connections will use SSL and all participating Erlang nodes in a distributed system must use diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl index 27b753af2e..aa62ab8865 100644 --- a/lib/ssl/src/ssl.erl +++ b/lib/ssl/src/ssl.erl @@ -38,7 +38,7 @@ getopts/2, setopts/2, getstat/1, getstat/2 ]). %% SSL/TLS protocol handling --export([cipher_suites/0, cipher_suites/1, +-export([cipher_suites/0, cipher_suites/1, eccs/0, eccs/1, connection_info/1, versions/0, session_info/1, format_error/1, renegotiate/1, prf/5, negotiated_protocol/1, negotiated_next_protocol/1, connection_information/1, connection_information/2]). @@ -420,6 +420,33 @@ cipher_suites(all) -> [ssl_cipher:erl_suite_definition(Suite) || Suite <- available_suites(all)]. %%-------------------------------------------------------------------- +-spec eccs() -> tls_v1:curves(). +%% Description: returns all supported curves across all versions +%%-------------------------------------------------------------------- +eccs() -> + Curves = tls_v1:ecc_curves(all), % only tls_v1 has named curves right now + eccs_filter_supported(Curves). + +%%-------------------------------------------------------------------- +-spec eccs(tls_record:tls_version() | tls_record:tls_atom_version()) -> + tls_v1:curves(). +%% Description: returns the curves supported for a given version of +%% ssl/tls. +%%-------------------------------------------------------------------- +eccs({3,0}) -> + []; +eccs({3,_}) -> + Curves = tls_v1:ecc_curves(all), + eccs_filter_supported(Curves); +eccs(AtomVersion) when is_atom(AtomVersion) -> + eccs(tls_record:protocol_version(AtomVersion)). + +eccs_filter_supported(Curves) -> + CryptoCurves = crypto:ec_curves(), + lists:filter(fun(Curve) -> proplists:get_bool(Curve, CryptoCurves) end, + Curves). + +%%-------------------------------------------------------------------- -spec getopts(#sslsocket{}, [gen_tcp:option_name()]) -> {ok, [gen_tcp:option()]} | {error, reason()}. %% @@ -647,6 +674,8 @@ do_connect(Address, Port, end. %% Handle extra ssl options given to ssl_accept +-spec handle_options([any()], #ssl_options{}) -> #ssl_options{} + ; ([any()], client | server) -> {ok, #config{}}. handle_options(Opts0, #ssl_options{protocol = Protocol, cacerts = CaCerts0, cacertfile = CaCertFile0} = InheritedSslOpts) -> RecordCB = record_cb(Protocol), @@ -725,6 +754,8 @@ handle_options(Opts0, Role) -> srp_identity = handle_option(srp_identity, Opts, undefined), ciphers = handle_cipher_option(proplists:get_value(ciphers, Opts, []), RecordCb:highest_protocol_version(Versions)), + eccs = handle_eccs_option(proplists:get_value(eccs, Opts, eccs()), + RecordCb:highest_protocol_version(Versions)), signature_algs = handle_hashsigns_option(proplists:get_value(signature_algs, Opts, default_option_role(server, tls_v1:default_signature_algs(Versions), Role)), @@ -755,6 +786,9 @@ handle_options(Opts0, Role) -> honor_cipher_order = handle_option(honor_cipher_order, Opts, default_option_role(server, false, Role), server, Role), + honor_ecc_order = handle_option(honor_ecc_order, Opts, + default_option_role(server, false, Role), + server, Role), protocol = proplists:get_value(protocol, Opts, tls), padding_check = proplists:get_value(padding_check, Opts, true), beast_mitigation = handle_option(beast_mitigation, Opts, one_n_minus_one), @@ -780,7 +814,7 @@ handle_options(Opts0, Role) -> alpn_preferred_protocols, next_protocols_advertised, client_preferred_next_protocols, log_alert, server_name_indication, honor_cipher_order, padding_check, crl_check, crl_cache, - fallback, signature_algs, beast_mitigation, v2_hello_compatible], + fallback, signature_algs, eccs, honor_ecc_order, beast_mitigation, v2_hello_compatible], SockOpts = lists:foldl(fun(Key, PropList) -> proplists:delete(Key, PropList) @@ -1010,6 +1044,8 @@ validate_option(sni_fun, Fun) when is_function(Fun) -> Fun; validate_option(honor_cipher_order, Value) when is_boolean(Value) -> Value; +validate_option(honor_ecc_order, Value) when is_boolean(Value) -> + Value; validate_option(padding_check, Value) when is_boolean(Value) -> Value; validate_option(fallback, Value) when is_boolean(Value) -> @@ -1164,6 +1200,14 @@ binary_cipher_suites(Version, Ciphers0) -> Ciphers = [ssl_cipher:openssl_suite(C) || C <- string:tokens(Ciphers0, ":")], binary_cipher_suites(Version, Ciphers). +handle_eccs_option(Value, {_Major, Minor}) when is_list(Value) -> + try tls_v1:ecc_curves(Minor, Value) of + Curves -> #elliptic_curves{elliptic_curve_list = Curves} + catch + exit:_ -> throw({error, {options, {eccs, Value}}}); + error:_ -> throw({error, {options, {eccs, Value}}}) + end. + unexpected_format(Error) -> lists:flatten(io_lib:format("Unexpected error: ~p", [Error])). @@ -1334,6 +1378,14 @@ new_ssl_options([{server_name_indication, Value} | Rest], #ssl_options{} = Opts, new_ssl_options(Rest, Opts#ssl_options{server_name_indication = validate_option(server_name_indication, Value)}, RecordCB); new_ssl_options([{honor_cipher_order, Value} | Rest], #ssl_options{} = Opts, RecordCB) -> new_ssl_options(Rest, Opts#ssl_options{honor_cipher_order = validate_option(honor_cipher_order, Value)}, RecordCB); +new_ssl_options([{honor_ecc_order, Value} | Rest], #ssl_options{} = Opts, RecordCB) -> + new_ssl_options(Rest, Opts#ssl_options{honor_ecc_order = validate_option(honor_ecc_order, Value)}, RecordCB); +new_ssl_options([{eccs, Value} | Rest], #ssl_options{} = Opts, RecordCB) -> + new_ssl_options(Rest, + Opts#ssl_options{eccs = + handle_eccs_option(Value, RecordCB:highest_protocol_version()) + }, + RecordCB); new_ssl_options([{signature_algs, Value} | Rest], #ssl_options{} = Opts, RecordCB) -> new_ssl_options(Rest, Opts#ssl_options{signature_algs = diff --git a/lib/ssl/src/ssl_cipher.erl b/lib/ssl/src/ssl_cipher.erl index e935c033c7..605bbd859a 100644 --- a/lib/ssl/src/ssl_cipher.erl +++ b/lib/ssl/src/ssl_cipher.erl @@ -46,9 +46,9 @@ erl_cipher_suite/0, openssl_cipher_suite/0, hash/0, key_algo/0, sign_algo/0]). --type cipher() :: null |rc4_128 | idea_cbc | des40_cbc | des_cbc | '3des_ede_cbc' +-type cipher() :: null |rc4_128 | des_cbc | '3des_ede_cbc' | aes_128_cbc | aes_256_cbc | aes_128_gcm | aes_256_gcm | chacha20_poly1305. --type hash() :: null | sha | md5 | sha224 | sha256 | sha384 | sha512. +-type hash() :: null | md5 | sha | sha224 | sha256 | sha384 | sha512. -type sign_algo() :: rsa | dsa | ecdsa. -type key_algo() :: null | rsa | dhe_rsa | dhe_dss | ecdhe_ecdsa| ecdh_ecdsa | ecdh_rsa| srp_rsa| srp_dss | psk | dhe_psk | rsa_psk | dh_anon | ecdh_anon | srp_anon. @@ -333,21 +333,27 @@ anonymous_suites({3, N}) -> anonymous_suites(N) when N >= 3 -> [?TLS_DH_anon_WITH_AES_128_GCM_SHA256, - ?TLS_DH_anon_WITH_AES_256_GCM_SHA384 - ] ++ anonymous_suites(0); - -anonymous_suites(_) -> - [?TLS_DH_anon_WITH_RC4_128_MD5, - ?TLS_DH_anon_WITH_DES_CBC_SHA, - ?TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, - ?TLS_DH_anon_WITH_AES_128_CBC_SHA, - ?TLS_DH_anon_WITH_AES_256_CBC_SHA, + ?TLS_DH_anon_WITH_AES_256_GCM_SHA384, ?TLS_DH_anon_WITH_AES_128_CBC_SHA256, ?TLS_DH_anon_WITH_AES_256_CBC_SHA256, - ?TLS_ECDH_anon_WITH_RC4_128_SHA, - ?TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, ?TLS_ECDH_anon_WITH_AES_128_CBC_SHA, - ?TLS_ECDH_anon_WITH_AES_256_CBC_SHA]. + ?TLS_ECDH_anon_WITH_AES_256_CBC_SHA, + ?TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, + ?TLS_DH_anon_WITH_RC4_128_MD5]; + +anonymous_suites(2) -> + [?TLS_ECDH_anon_WITH_AES_128_CBC_SHA, + ?TLS_ECDH_anon_WITH_AES_256_CBC_SHA, + ?TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, + ?TLS_DH_anon_WITH_DES_CBC_SHA, + ?TLS_DH_anon_WITH_RC4_128_MD5]; + +anonymous_suites(N) when N == 0; + N == 1 -> + [?TLS_DH_anon_WITH_RC4_128_MD5, + ?TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, + ?TLS_DH_anon_WITH_DES_CBC_SHA + ]. %%-------------------------------------------------------------------- -spec psk_suites(ssl_record:ssl_version() | integer()) -> [cipher_suite()]. @@ -1441,25 +1447,60 @@ filter_suites(Suites) -> is_acceptable_prf(Prf, Hashs) end, Suites). -is_acceptable_keyexchange(KeyExchange, Algos) - when KeyExchange == ecdh_ecdsa; - KeyExchange == ecdhe_ecdsa; - KeyExchange == ecdh_rsa; - KeyExchange == ecdhe_rsa; - KeyExchange == ecdh_anon -> +is_acceptable_keyexchange(KeyExchange, _Algos) when KeyExchange == psk; + KeyExchange == null -> + true; +is_acceptable_keyexchange(KeyExchange, Algos) when KeyExchange == dh_anon; + KeyExchange == dhe_psk -> + proplists:get_bool(dh, Algos); +is_acceptable_keyexchange(dhe_dss, Algos) -> + proplists:get_bool(dh, Algos) andalso + proplists:get_bool(dss, Algos); +is_acceptable_keyexchange(dhe_rsa, Algos) -> + proplists:get_bool(dh, Algos) andalso + proplists:get_bool(rsa, Algos); +is_acceptable_keyexchange(ecdh_anon, Algos) -> proplists:get_bool(ecdh, Algos); -is_acceptable_keyexchange(_, _) -> - true. - +is_acceptable_keyexchange(KeyExchange, Algos) when KeyExchange == ecdh_ecdsa; + KeyExchange == ecdhe_ecdsa -> + proplists:get_bool(ecdh, Algos) andalso + proplists:get_bool(ecdsa, Algos); +is_acceptable_keyexchange(KeyExchange, Algos) when KeyExchange == ecdh_rsa; + KeyExchange == ecdhe_rsa -> + proplists:get_bool(ecdh, Algos) andalso + proplists:get_bool(rsa, Algos); +is_acceptable_keyexchange(KeyExchange, Algos) when KeyExchange == rsa; + KeyExchange == rsa_psk -> + proplists:get_bool(rsa, Algos); +is_acceptable_keyexchange(srp_anon, Algos) -> + proplists:get_bool(srp, Algos); +is_acceptable_keyexchange(srp_dss, Algos) -> + proplists:get_bool(srp, Algos) andalso + proplists:get_bool(dss, Algos); +is_acceptable_keyexchange(srp_rsa, Algos) -> + proplists:get_bool(srp, Algos) andalso + proplists:get_bool(rsa, Algos); +is_acceptable_keyexchange(_KeyExchange, _Algos) -> + false. + +is_acceptable_cipher(null, _Algos) -> + true; +is_acceptable_cipher(rc4_128, Algos) -> + proplists:get_bool(rc4, Algos); +is_acceptable_cipher(des_cbc, Algos) -> + proplists:get_bool(des_cbc, Algos); +is_acceptable_cipher('3des_ede_cbc', Algos) -> + proplists:get_bool(des3_cbc, Algos); +is_acceptable_cipher(aes_128_cbc, Algos) -> + proplists:get_bool(aes_cbc128, Algos); +is_acceptable_cipher(aes_256_cbc, Algos) -> + proplists:get_bool(aes_cbc256, Algos); is_acceptable_cipher(Cipher, Algos) when Cipher == aes_128_gcm; Cipher == aes_256_gcm -> proplists:get_bool(aes_gcm, Algos); -is_acceptable_cipher(Cipher, Algos) - when Cipher == chacha20_poly1305 -> - proplists:get_bool(Cipher, Algos); -is_acceptable_cipher(_, _) -> - true. +is_acceptable_cipher(Cipher, Algos) -> + proplists:get_bool(Cipher, Algos). is_acceptable_hash(null, _Algos) -> true; diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl index 08fca76123..b6e4d5b433 100644 --- a/lib/ssl/src/ssl_connection.erl +++ b/lib/ssl/src/ssl_connection.erl @@ -1172,14 +1172,23 @@ handle_alert(#alert{level = ?WARNING} = Alert, StateName, %%% Internal functions %%-------------------------------------------------------------------- connection_info(#state{sni_hostname = SNIHostname, - session = #session{cipher_suite = CipherSuite}, + session = #session{cipher_suite = CipherSuite, ecc = ECCCurve}, protocol_cb = Connection, negotiated_version = {_,_} = Version, ssl_options = Opts}) -> RecordCB = record_cb(Connection), + CipherSuiteDef = ssl_cipher:erl_suite_definition(CipherSuite), + IsNamedCurveSuite = lists:member(element(1,CipherSuiteDef), + [ecdh_ecdsa, ecdhe_ecdsa, ecdh_anon]), + CurveInfo = case ECCCurve of + {namedCurve, Curve} when IsNamedCurveSuite -> + [{ecc, {named_curve, pubkey_cert_records:namedCurves(Curve)}}]; + _ -> + [] + end, [{protocol, RecordCB:protocol_version(Version)}, - {cipher_suite, ssl_cipher:erl_suite_definition(CipherSuite)}, - {sni_hostname, SNIHostname}] ++ ssl_options_list(Opts). + {cipher_suite, CipherSuiteDef}, + {sni_hostname, SNIHostname} | CurveInfo] ++ ssl_options_list(Opts). do_server_hello(Type, #hello_extensions{next_protocol_negotiation = NextProtocols} = ServerHelloExt, @@ -1741,12 +1750,13 @@ calculate_secret(#server_dh_params{dh_p = Prime, dh_g = Base, Connection, certify, certify); calculate_secret(#server_ecdh_params{curve = ECCurve, public = ECServerPubKey}, - State, Connection) -> + State=#state{session=Session}, Connection) -> ECDHKeys = public_key:generate_key(ECCurve), PremasterSecret = ssl_handshake:premaster_secret(#'ECPoint'{point = ECServerPubKey}, ECDHKeys), calculate_master_secret(PremasterSecret, - State#state{diffie_hellman_keys = ECDHKeys}, + State#state{diffie_hellman_keys = ECDHKeys, + session = Session#session{ecc = ECCurve}}, Connection, certify, certify); calculate_secret(#server_psk_params{ diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl index 5b51ac0916..4acc745c5f 100644 --- a/lib/ssl/src/ssl_handshake.erl +++ b/lib/ssl/src/ssl_handshake.erl @@ -70,7 +70,7 @@ %% Extensions handling -export([client_hello_extensions/6, handle_client_hello_extensions/9, %% Returns server hello extensions - handle_server_hello_extensions/9, select_curve/2 + handle_server_hello_extensions/9, select_curve/2, select_curve/3 ]). %% MISC @@ -120,11 +120,13 @@ server_hello_done() -> #server_hello_done{}. client_hello_extensions(Host, Version, CipherSuites, - #ssl_options{signature_algs = SupportedHashSigns, versions = AllVersions} = SslOpts, ConnectionStates, Renegotiation) -> + #ssl_options{signature_algs = SupportedHashSigns, + eccs = SupportedECCs, + versions = AllVersions} = SslOpts, ConnectionStates, Renegotiation) -> {EcPointFormats, EllipticCurves} = case advertises_ec_ciphers(lists:map(fun ssl_cipher:suite_definition/1, CipherSuites)) of true -> - client_ecc_extensions(tls_v1, Version); + client_ecc_extensions(SupportedECCs); false -> {undefined, undefined} end, @@ -1169,8 +1171,9 @@ select_session(SuggestedSessionId, CipherSuites, HashSigns, Compressions, Port, {resumed, Resumed} end. -supported_ecc({Major, Minor} = Version) when ((Major == 3) and (Minor >= 1)) orelse (Major > 3) -> - Curves = tls_v1:ecc_curves(Version), +%% Deprecated? +supported_ecc({Major, Minor}) when ((Major == 3) and (Minor >= 1)) orelse (Major > 3) -> + Curves = tls_v1:ecc_curves(Minor), #elliptic_curves{elliptic_curve_list = Curves}; supported_ecc(_) -> #elliptic_curves{elliptic_curve_list = []}. @@ -1454,12 +1457,12 @@ srp_user(#ssl_options{srp_identity = {UserName, _}}) -> srp_user(_) -> undefined. -client_ecc_extensions(Module, Version) -> +client_ecc_extensions(SupportedECCs) -> CryptoSupport = proplists:get_value(public_keys, crypto:supports()), case proplists:get_bool(ecdh, CryptoSupport) of true -> EcPointFormats = #ec_point_formats{ec_point_format_list = [?ECPOINT_UNCOMPRESSED]}, - EllipticCurves = #elliptic_curves{elliptic_curve_list = Module:ecc_curves(Version)}, + EllipticCurves = SupportedECCs, {EcPointFormats, EllipticCurves}; _ -> {undefined, undefined} @@ -1493,22 +1496,34 @@ advertises_ec_ciphers([{ecdh_anon, _,_,_} | _]) -> true; advertises_ec_ciphers([_| Rest]) -> advertises_ec_ciphers(Rest). -select_curve(#elliptic_curves{elliptic_curve_list = ClientCurves}, - #elliptic_curves{elliptic_curve_list = ServerCurves}) -> - select_curve(ClientCurves, ServerCurves); -select_curve(undefined, _) -> + +select_curve(Client, Server) -> + select_curve(Client, Server, false). + +select_curve(#elliptic_curves{elliptic_curve_list = ClientCurves}, + #elliptic_curves{elliptic_curve_list = ServerCurves}, + ServerOrder) -> + case ServerOrder of + false -> + select_shared_curve(ClientCurves, ServerCurves); + true -> + select_shared_curve(ServerCurves, ClientCurves) + end; +select_curve(undefined, _, _) -> %% Client did not send ECC extension use default curve if %% ECC cipher is negotiated - {namedCurve, ?secp256r1}; -select_curve(_, []) -> + {namedCurve, ?secp256r1}. + +select_shared_curve([], _) -> no_curve; -select_curve(Curves, [Curve| Rest]) -> +select_shared_curve([Curve | Rest], Curves) -> case lists:member(Curve, Curves) of true -> {namedCurve, Curve}; false -> - select_curve(Curves, Rest) + select_shared_curve(Rest, Curves) end. + %% RFC 6066, Section 3: Currently, the only server names supported are %% DNS hostnames sni(_, disable) -> diff --git a/lib/ssl/src/ssl_internal.hrl b/lib/ssl/src/ssl_internal.hrl index c19c1787ff..487d1fa096 100644 --- a/lib/ssl/src/ssl_internal.hrl +++ b/lib/ssl/src/ssl_internal.hrl @@ -140,6 +140,8 @@ crl_check :: boolean() | peer | best_effort, crl_cache, signature_algs, + eccs, + honor_ecc_order :: boolean(), v2_hello_compatible :: boolean() }). diff --git a/lib/ssl/src/tls_handshake.erl b/lib/ssl/src/tls_handshake.erl index a2486bf752..2bd103c18a 100644 --- a/lib/ssl/src/tls_handshake.erl +++ b/lib/ssl/src/tls_handshake.erl @@ -160,13 +160,15 @@ handle_client_hello(Version, #client_hello{session_id = SugesstedId, extensions = #hello_extensions{elliptic_curves = Curves, signature_algs = ClientHashSigns} = HelloExt}, #ssl_options{versions = Versions, - signature_algs = SupportedHashSigns} = SslOpts, + signature_algs = SupportedHashSigns, + eccs = SupportedECCs, + honor_ecc_order = ECCOrder} = SslOpts, {Port, Session0, Cache, CacheCb, ConnectionStates0, Cert, _}, Renegotiation) -> case tls_record:is_acceptable_version(Version, Versions) of true -> AvailableHashSigns = ssl_handshake:available_signature_algs( ClientHashSigns, SupportedHashSigns, Cert, Version), - ECCCurve = ssl_handshake:select_curve(Curves, ssl_handshake:supported_ecc(Version)), + ECCCurve = ssl_handshake:select_curve(Curves, SupportedECCs, ECCOrder), {Type, #session{cipher_suite = CipherSuite} = Session1} = ssl_handshake:select_session(SugesstedId, CipherSuites, AvailableHashSigns, Compressions, Port, Session0#session{ecc = ECCCurve}, Version, diff --git a/lib/ssl/src/tls_v1.erl b/lib/ssl/src/tls_v1.erl index 711db77708..7f24ce5192 100644 --- a/lib/ssl/src/tls_v1.erl +++ b/lib/ssl/src/tls_v1.erl @@ -31,9 +31,18 @@ -export([master_secret/4, finished/5, certificate_verify/3, mac_hash/7, setup_keys/8, suites/1, prf/5, - ecc_curves/1, oid_to_enum/1, enum_to_oid/1, + ecc_curves/1, ecc_curves/2, oid_to_enum/1, enum_to_oid/1, default_signature_algs/1, signature_algs/2]). +-type named_curve() :: sect571r1 | sect571k1 | secp521r1 | brainpoolP512r1 | + sect409k1 | sect409r1 | brainpoolP384r1 | secp384r1 | + sect283k1 | sect283r1 | brainpoolP256r1 | secp256k1 | secp256r1 | + sect239k1 | sect233k1 | sect233r1 | secp224k1 | secp224r1 | + sect193r1 | sect193r2 | secp192k1 | secp192r1 | sect163k1 | + sect163r1 | sect163r2 | secp160k1 | secp160r1 | secp160r2. +-type curves() :: [named_curve()]. +-export_type([curves/0, named_curve/0]). + %%==================================================================== %% Internal application API %%==================================================================== @@ -399,13 +408,20 @@ is_pair(Hash, rsa, Hashs) -> lists:member(Hash, AtLeastMd5). %% list ECC curves in prefered order -ecc_curves(_Minor) -> - TLSCurves = [sect571r1,sect571k1,secp521r1,brainpoolP512r1, - sect409k1,sect409r1,brainpoolP384r1,secp384r1, - sect283k1,sect283r1,brainpoolP256r1,secp256k1,secp256r1, - sect239k1,sect233k1,sect233r1,secp224k1,secp224r1, - sect193r1,sect193r2,secp192k1,secp192r1,sect163k1, - sect163r1,sect163r2,secp160k1,secp160r1,secp160r2], +-spec ecc_curves(1..3 | all) -> [named_curve()]. +ecc_curves(all) -> + [sect571r1,sect571k1,secp521r1,brainpoolP512r1, + sect409k1,sect409r1,brainpoolP384r1,secp384r1, + sect283k1,sect283r1,brainpoolP256r1,secp256k1,secp256r1, + sect239k1,sect233k1,sect233r1,secp224k1,secp224r1, + sect193r1,sect193r2,secp192k1,secp192r1,sect163k1, + sect163r1,sect163r2,secp160k1,secp160r1,secp160r2]; +ecc_curves(Minor) -> + TLSCurves = ecc_curves(all), + ecc_curves(Minor, TLSCurves). + +-spec ecc_curves(1..3, [named_curve()]) -> [named_curve()]. +ecc_curves(_Minor, TLSCurves) -> CryptoCurves = crypto:ec_curves(), lists:foldr(fun(Curve, Curves) -> case proplists:get_bool(Curve, CryptoCurves) of @@ -414,6 +430,7 @@ ecc_curves(_Minor) -> end end, [], TLSCurves). + %% ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005) oid_to_enum(?sect163k1) -> 1; oid_to_enum(?sect163r1) -> 2; diff --git a/lib/ssl/test/ssl_ECC_SUITE.erl b/lib/ssl/test/ssl_ECC_SUITE.erl index 258922d128..76999185b6 100644 --- a/lib/ssl/test/ssl_ECC_SUITE.erl +++ b/lib/ssl/test/ssl_ECC_SUITE.erl @@ -46,7 +46,7 @@ groups() -> {'tlsv1', [], all_versions_groups()}, {'erlang_server', [], key_cert_combinations()}, {'erlang_client', [], key_cert_combinations()}, - {'erlang', [], key_cert_combinations() ++ misc()} + {'erlang', [], key_cert_combinations() ++ misc() ++ ecc_negotiation()} ]. all_versions_groups ()-> @@ -68,6 +68,23 @@ key_cert_combinations() -> misc()-> [client_ecdsa_server_ecdsa_with_raw_key]. +ecc_negotiation() -> + [ecc_default_order, + ecc_default_order_custom_curves, + ecc_client_order, + ecc_client_order_custom_curves, + ecc_unknown_curve, + client_ecdh_server_ecdh_ecc_server_custom, + client_rsa_server_ecdh_ecc_server_custom, + client_ecdh_server_rsa_ecc_server_custom, + client_rsa_server_rsa_ecc_server_custom, + client_ecdsa_server_ecdsa_ecc_server_custom, + client_ecdsa_server_rsa_ecc_server_custom, + client_rsa_server_ecdsa_ecc_server_custom, + client_ecdsa_server_ecdsa_ecc_client_custom, + client_rsa_server_ecdsa_ecc_client_custom + ]. + %%-------------------------------------------------------------------- init_per_suite(Config0) -> end_per_suite(Config0), @@ -218,6 +235,132 @@ client_ecdsa_server_ecdsa_with_raw_key(Config) when is_list(Config) -> check_result(Server, SType, Client, CType), close(Server, Client). +ecc_default_order(Config) -> + COpts = proplists:get_value(client_ecdsa_opts, Config), + SOpts = proplists:get_value(server_ecdsa_opts, Config), + ECCOpts = [], + case supported_eccs([{eccs, [sect571r1]}]) of + true -> ecc_test(sect571r1, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +ecc_default_order_custom_curves(Config) -> + COpts = proplists:get_value(client_ecdsa_opts, Config), + SOpts = proplists:get_value(server_ecdsa_opts, Config), + ECCOpts = [{eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(sect571r1, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +ecc_client_order(Config) -> + COpts = proplists:get_value(client_ecdsa_opts, Config), + SOpts = proplists:get_value(server_ecdsa_opts, Config), + ECCOpts = [{honor_ecc_order, false}], + case supported_eccs([{eccs, [sect571r1]}]) of + true -> ecc_test(sect571r1, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +ecc_client_order_custom_curves(Config) -> + COpts = proplists:get_value(client_ecdsa_opts, Config), + SOpts = proplists:get_value(server_ecdsa_opts, Config), + ECCOpts = [{honor_ecc_order, false}, {eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(sect571r1, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +ecc_unknown_curve(Config) -> + COpts = proplists:get_value(client_ecdsa_opts, Config), + SOpts = proplists:get_value(server_ecdsa_opts, Config), + ECCOpts = [{eccs, ['123_fake_curve']}], + ecc_test_error(COpts, SOpts, [], ECCOpts, Config). + +%% We can only expect to see a named curve on a conn with +%% a server supporting ecdsa. Otherwise the curve is selected +%% but not used and communicated to the client? +client_ecdh_server_ecdh_ecc_server_custom(Config) -> + COpts = proplists:get_value(client_ecdh_rsa_opts, Config), + SOpts = proplists:get_value(server_ecdh_rsa_opts, Config), + ECCOpts = [{honor_ecc_order, true}, {eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(undefined, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +client_ecdh_server_rsa_ecc_server_custom(Config) -> + COpts = proplists:get_value(client_ecdh_rsa_opts, Config), + SOpts = proplists:get_value(server_opts, Config), + ECCOpts = [{honor_ecc_order, true}, {eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(undefined, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +client_rsa_server_ecdh_ecc_server_custom(Config) -> + COpts = proplists:get_value(client_opts, Config), + SOpts = proplists:get_value(server_ecdh_rsa_opts, Config), + ECCOpts = [{honor_ecc_order, true}, {eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(undefined, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +client_rsa_server_rsa_ecc_server_custom(Config) -> + COpts = proplists:get_value(client_opts, Config), + SOpts = proplists:get_value(server_opts, Config), + ECCOpts = [{honor_ecc_order, true}, {eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(undefined, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +client_ecdsa_server_ecdsa_ecc_server_custom(Config) -> + COpts = proplists:get_value(client_ecdsa_opts, Config), + SOpts = proplists:get_value(server_ecdsa_opts, Config), + ECCOpts = [{honor_ecc_order, true}, {eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(secp256r1, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +client_ecdsa_server_rsa_ecc_server_custom(Config) -> + COpts = proplists:get_value(client_ecdsa_opts, Config), + SOpts = proplists:get_value(server_opts, Config), + ECCOpts = [{honor_ecc_order, true}, {eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(undefined, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +client_rsa_server_ecdsa_ecc_server_custom(Config) -> + COpts = proplists:get_value(client_opts, Config), + SOpts = proplists:get_value(server_ecdsa_opts, Config), + ECCOpts = [{honor_ecc_order, true}, {eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(secp256r1, COpts, SOpts, [], ECCOpts, Config); + false -> {skip, "unsupported named curves"} + end. + +client_ecdsa_server_ecdsa_ecc_client_custom(Config) -> + COpts = proplists:get_value(client_ecdsa_opts, Config), + SOpts = proplists:get_value(server_ecdsa_opts, Config), + ECCOpts = [{eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(secp256r1, COpts, SOpts, ECCOpts, [], Config); + false -> {skip, "unsupported named curves"} + end. + +client_rsa_server_ecdsa_ecc_client_custom(Config) -> + COpts = proplists:get_value(client_opts, Config), + SOpts = proplists:get_value(server_ecdsa_opts, Config), + ECCOpts = [{eccs, [secp256r1, sect571r1]}], + case supported_eccs(ECCOpts) of + true -> ecc_test(secp256r1, COpts, SOpts, ECCOpts, [], Config); + false -> {skip, "unsupported named curves"} + end. + %%-------------------------------------------------------------------- %% Internal functions ------------------------------------------------ %%-------------------------------------------------------------------- @@ -244,6 +387,30 @@ basic_test(ClientCert, ClientKey, ClientCA, ServerCert, ServerKey, ServerCA, Con check_result(Server, SType, Client, CType), close(Server, Client). +ecc_test(Expect, COpts, SOpts, CECCOpts, SECCOpts, Config) -> + CCA = proplists:get_value(cacertfile, COpts), + CCert = proplists:get_value(certfile, COpts), + CKey = proplists:get_value(keyfile, COpts), + SCA = proplists:get_value(cacertfile, SOpts), + SCert = proplists:get_value(certfile, SOpts), + SKey = proplists:get_value(keyfile, SOpts), + {Server, Port} = start_server_ecc(erlang, CCA, SCA, SCert, SKey, Expect, SECCOpts, Config), + Client = start_client_ecc(erlang, Port, SCA, CCA, CCert, CKey, Expect, CECCOpts, Config), + ssl_test_lib:check_result(Server, ok, Client, ok), + close(Server, Client). + +ecc_test_error(COpts, SOpts, CECCOpts, SECCOpts, Config) -> + CCA = proplists:get_value(cacertfile, COpts), + CCert = proplists:get_value(certfile, COpts), + CKey = proplists:get_value(keyfile, COpts), + SCA = proplists:get_value(cacertfile, SOpts), + SCert = proplists:get_value(certfile, SOpts), + SKey = proplists:get_value(keyfile, SOpts), + {Server, Port} = start_server_ecc_error(erlang, CCA, SCA, SCert, SKey, SECCOpts, Config), + Client = start_client_ecc_error(erlang, Port, SCA, CCA, CCert, CKey, CECCOpts, Config), + Error = {error, {tls_alert, "insufficient security"}}, + ssl_test_lib:check_result(Server, Error, Client, Error). + start_client(openssl, Port, PeerCA, OwnCa, Cert, Key, _Config) -> CA = new_openssl_ca("openssl_client_ca", PeerCA, OwnCa), Version = tls_record:protocol_version(tls_record:highest_protocol_version([])), @@ -267,6 +434,31 @@ start_client(erlang, Port, PeerCA, OwnCa, Cert, Key, Config) -> {cacertfile, CA}, {certfile, Cert}, {keyfile, Key}]}]). +start_client_ecc(erlang, Port, PeerCA, OwnCa, Cert, Key, Expect, ECCOpts, Config) -> + CA = new_ca("erlang_client_ca", PeerCA, OwnCa), + {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config), + ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, + {host, Hostname}, + {from, self()}, + {mfa, {?MODULE, check_ecc, [client, Expect]}}, + {options, + ECCOpts ++ + [{verify, verify_peer}, + {cacertfile, CA}, + {certfile, Cert}, {keyfile, Key}]}]). + +start_client_ecc_error(erlang, Port, PeerCA, OwnCa, Cert, Key, ECCOpts, Config) -> + CA = new_ca("erlang_client_ca", PeerCA, OwnCa), + {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config), + ssl_test_lib:start_client_error([{node, ClientNode}, {port, Port}, + {host, Hostname}, + {from, self()}, + {options, + ECCOpts ++ + [{verify, verify_peer}, + {cacertfile, CA}, + {certfile, Cert}, {keyfile, Key}]}]). + start_server(openssl, PeerCA, OwnCa, Cert, Key, _Config) -> CA = new_openssl_ca("openssl_server_ca", PeerCA, OwnCa), Port = ssl_test_lib:inet_port(node()), @@ -290,6 +482,7 @@ start_server(erlang, PeerCA, OwnCa, Cert, Key, Config) -> [{verify, verify_peer}, {cacertfile, CA}, {certfile, Cert}, {keyfile, Key}]}]), {Server, ssl_test_lib:inet_port(Server)}. + start_server_with_raw_key(erlang, PeerCA, OwnCa, Cert, Key, Config) -> CA = new_ca("erlang_server_ca", PeerCA, OwnCa), {_, ServerNode, _} = ssl_test_lib:run_where(Config), @@ -303,6 +496,29 @@ start_server_with_raw_key(erlang, PeerCA, OwnCa, Cert, Key, Config) -> {certfile, Cert}, {key, Key}]}]), {Server, ssl_test_lib:inet_port(Server)}. +start_server_ecc(erlang, PeerCA, OwnCa, Cert, Key, Expect, ECCOpts, Config) -> + CA = new_ca("erlang_server_ca", PeerCA, OwnCa), + {_, ServerNode, _} = ssl_test_lib:run_where(Config), + Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, + {from, self()}, + {mfa, {?MODULE, check_ecc, [server, Expect]}}, + {options, + ECCOpts ++ + [{verify, verify_peer}, {cacertfile, CA}, + {certfile, Cert}, {keyfile, Key}]}]), + {Server, ssl_test_lib:inet_port(Server)}. + +start_server_ecc_error(erlang, PeerCA, OwnCa, Cert, Key, ECCOpts, Config) -> + CA = new_ca("erlang_server_ca", PeerCA, OwnCa), + {_, ServerNode, _} = ssl_test_lib:run_where(Config), + Server = ssl_test_lib:start_server_error([{node, ServerNode}, {port, 0}, + {from, self()}, + {options, + ECCOpts ++ + [{verify, verify_peer}, {cacertfile, CA}, + {certfile, Cert}, {keyfile, Key}]}]), + {Server, ssl_test_lib:inet_port(Server)}. + check_result(Server, erlang, Client, erlang) -> ssl_test_lib:check_result(Server, ok, Client, ok); check_result(Server, erlang, _, _) -> @@ -350,15 +566,20 @@ new_openssl_ca(FileName, CA, OwnCa) -> E1 = public_key:pem_decode(P1), {ok, P2} = file:read_file(OwnCa), E2 = public_key:pem_decode(P2), - case os:cmd("openssl version") of - "OpenSSL 1.0.1p-freebsd" ++ _ -> - Pem = public_key:pem_encode(E1 ++E2), - file:write_file(FileName, Pem); - "LibreSSL" ++ _ -> - Pem = public_key:pem_encode(E1 ++E2), - file:write_file(FileName, Pem); - _ -> - Pem = public_key:pem_encode(E2 ++E1), - file:write_file(FileName, Pem) - end, + Pem = public_key:pem_encode(E2 ++E1), + file:write_file(FileName, Pem), FileName. + +supported_eccs(Opts) -> + ToCheck = proplists:get_value(eccs, Opts, []), + Supported = ssl:eccs(), + lists:all(fun(Curve) -> lists:member(Curve, Supported) end, ToCheck). + +check_ecc(SSL, Role, Expect) -> + {ok, Data} = ssl:connection_information(SSL), + case lists:keyfind(ecc, 1, Data) of + {ecc, {named_curve, Expect}} -> ok; + false when Expect =:= undefined -> ok; + Other -> {error, Role, Expect, Other} + end. + diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl index 57963fd44b..392da738ec 100644 --- a/lib/ssl/test/ssl_basic_SUITE.erl +++ b/lib/ssl/test/ssl_basic_SUITE.erl @@ -150,6 +150,7 @@ api_tests() -> peercert_with_client_cert, sockname, versions, + eccs, controlling_process, getstat, close_with_timeout, @@ -364,6 +365,16 @@ init_per_testcase(TestCase, Config) when TestCase == psk_cipher_suites; ct:timetrap({seconds, 60}), Config; +init_per_testcase(version_option, Config) -> + ssl_test_lib:ct_log_supported_protocol_versions(Config), + ct:timetrap({seconds, 10}), + Config; + +init_per_testcase(reuse_session, Config) -> + ssl_test_lib:ct_log_supported_protocol_versions(Config), + ct:timetrap({seconds, 10}), + Config; + init_per_testcase(rizzo, Config) -> ssl_test_lib:ct_log_supported_protocol_versions(Config), ct:timetrap({seconds, 40}), @@ -446,6 +457,15 @@ init_per_testcase(accept_pool, Config) -> init_per_testcase(controller_dies, Config) -> ct:timetrap({seconds, 10}), Config; +init_per_testcase(eccs, Config) -> + case ssl:eccs() of + [] -> + {skip, "named curves not supported"}; + [_|_] -> + ssl_test_lib:ct_log_supported_protocol_versions(Config), + ct:timetrap({seconds, 5}), + Config + end; init_per_testcase(_TestCase, Config) -> ssl_test_lib:ct_log_supported_protocol_versions(Config), ct:timetrap({seconds, 5}), @@ -1494,6 +1514,25 @@ versions(Config) when is_list(Config) -> [_|_] = Versions = ssl:versions(), ct:log("~p~n", [Versions]). + +%%-------------------------------------------------------------------- +eccs() -> + [{doc, "Test API functions eccs/0 and eccs/1"}]. + +eccs(Config) when is_list(Config) -> + [_|_] = All = ssl:eccs(), + [] = SSL3 = ssl:eccs({3,0}), + [_|_] = Tls = ssl:eccs({3,1}), + [_|_] = Tls1 = ssl:eccs({3,2}), + [_|_] = Tls2 = ssl:eccs({3,3}), + [] = SSL3 = ssl:eccs(sslv3), + [_|_] = Tls = ssl:eccs(tlsv1), + [_|_] = Tls1 = ssl:eccs('tlsv1.1'), + [_|_] = Tls2 = ssl:eccs('tlsv1.2'), + %% ordering is currently unverified by the test + true = lists:sort(All) =:= lists:usort(SSL3 ++ Tls ++ Tls1 ++ Tls2), + ok. + %%-------------------------------------------------------------------- send_recv() -> [{doc,""}]. @@ -2154,7 +2193,7 @@ ciphers_dsa_signed_certs() -> ciphers_dsa_signed_certs(Config) when is_list(Config) -> Version = ssl_test_lib:protocol_version(Config), - Ciphers = ssl_test_lib:dsa_suites(), + Ciphers = ssl_test_lib:dsa_suites(tls_record:protocol_version(Version)), ct:log("~p erlang cipher suites ~p~n", [Version, Ciphers]), run_suites(Ciphers, Version, Config, dsa). %%------------------------------------------------------------------- @@ -2171,7 +2210,7 @@ anonymous_cipher_suites()-> [{doc,"Test the anonymous ciphersuites"}]. anonymous_cipher_suites(Config) when is_list(Config) -> Version = ssl_test_lib:protocol_version(Config), - Ciphers = ssl_test_lib:anonymous_suites(), + Ciphers = ssl_test_lib:anonymous_suites(Version), run_suites(Ciphers, Version, Config, anonymous). %%------------------------------------------------------------------- psk_cipher_suites() -> @@ -2272,8 +2311,8 @@ default_reject_anonymous(Config) when is_list(Config) -> {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), ClientOpts = ssl_test_lib:ssl_options(client_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_opts, Config), - - [Cipher | _] = ssl_test_lib:anonymous_suites(), + Version = tls_record:highest_protocol_version(tls_record:supported_protocol_versions()), + [CipherSuite | _] = ssl_test_lib:anonymous_suites(Version), Server = ssl_test_lib:start_server_error([{node, ServerNode}, {port, 0}, {from, self()}, @@ -2283,7 +2322,7 @@ default_reject_anonymous(Config) when is_list(Config) -> {host, Hostname}, {from, self()}, {options, - [{ciphers,[Cipher]} | + [{ciphers,[CipherSuite]} | ClientOpts]}]), ssl_test_lib:check_result(Server, {error, {tls_alert, "insufficient security"}}, @@ -2295,7 +2334,7 @@ ciphers_ecdsa_signed_certs() -> ciphers_ecdsa_signed_certs(Config) when is_list(Config) -> Version = ssl_test_lib:protocol_version(Config), - Ciphers = ssl_test_lib:ecdsa_suites(), + Ciphers = ssl_test_lib:ecdsa_suites(tls_record:protocol_version(Version)), ct:log("~p erlang cipher suites ~p~n", [Version, Ciphers]), run_suites(Ciphers, Version, Config, ecdsa). %%-------------------------------------------------------------------- @@ -2313,7 +2352,7 @@ ciphers_ecdh_rsa_signed_certs() -> ciphers_ecdh_rsa_signed_certs(Config) when is_list(Config) -> Version = ssl_test_lib:protocol_version(Config), - Ciphers = ssl_test_lib:ecdh_rsa_suites(), + Ciphers = ssl_test_lib:ecdh_rsa_suites(tls_record:protocol_version(Version)), ct:log("~p erlang cipher suites ~p~n", [Version, Ciphers]), run_suites(Ciphers, Version, Config, ecdh_rsa). %%-------------------------------------------------------------------- @@ -3624,9 +3663,10 @@ no_rizzo_rc4() -> [{doc,"Test that there is no 1/n-1-split for RC4 as it is not vunrable to Rizzo/Dungon attack"}]. no_rizzo_rc4(Config) when is_list(Config) -> - Ciphers = [X || X ={_,Y,_} <- ssl:cipher_suites(),Y == rc4_128], Prop = proplists:get_value(tc_group_properties, Config), Version = proplists:get_value(name, Prop), + Ciphers = [ssl_cipher:erl_suite_definition(Suite) || + Suite <- ssl_test_lib:rc4_suites(tls_record:protocol_version(Version))], run_send_recv_rizzo(Ciphers, Config, Version, {?MODULE, send_recv_result_active_no_rizzo, []}). @@ -3634,9 +3674,10 @@ rizzo_one_n_minus_one() -> [{doc,"Test that the 1/n-1-split mitigation of Rizzo/Dungon attack can be explicitly selected"}]. rizzo_one_n_minus_one(Config) when is_list(Config) -> - Ciphers = [X || X ={_,Y,_} <- ssl:cipher_suites(), Y =/= rc4_128], Prop = proplists:get_value(tc_group_properties, Config), Version = proplists:get_value(name, Prop), + AllSuites = ssl_test_lib:available_suites(tls_record:protocol_version(Version)), + Ciphers = [X || X ={_,Y,_} <- AllSuites, Y =/= rc4_128], run_send_recv_rizzo(Ciphers, Config, Version, {?MODULE, send_recv_result_active_rizzo, []}). @@ -3644,9 +3685,10 @@ rizzo_zero_n() -> [{doc,"Test that the 0/n-split mitigation of Rizzo/Dungon attack can be explicitly selected"}]. rizzo_zero_n(Config) when is_list(Config) -> - Ciphers = [X || X ={_,Y,_} <- ssl:cipher_suites(), Y =/= rc4_128], Prop = proplists:get_value(tc_group_properties, Config), Version = proplists:get_value(name, Prop), + AllSuites = ssl_test_lib:available_suites(tls_record:protocol_version(Version)), + Ciphers = [X || X ={_,Y,_} <- AllSuites, Y =/= rc4_128], run_send_recv_rizzo(Ciphers, Config, Version, {?MODULE, send_recv_result_active_no_rizzo, []}). @@ -4397,7 +4439,7 @@ rizzo_test(Cipher, Config, Version, Mfa) -> {host, Hostname}, {from, self()}, {mfa, Mfa}, - {options, [{active, true} | ClientOpts]}]), + {options, [{active, true}, {ciphers, [Cipher]}| ClientOpts]}]), Result = ssl_test_lib:check_result(Server, ok, Client, ok), ssl_test_lib:close(Server), @@ -4437,7 +4479,7 @@ run_suites(Ciphers, Version, Config, Type) -> anonymous -> %% No certs in opts! {ssl_test_lib:ssl_options(client_verification_opts, Config), - ssl_test_lib:ssl_options(server_anon, Config)}; + [{reuseaddr, true}, {ciphers, ssl_test_lib:anonymous_suites(Version)}]}; psk -> {ssl_test_lib:ssl_options(client_psk, Config), ssl_test_lib:ssl_options(server_psk, Config)}; @@ -4688,3 +4730,4 @@ first_rsa_suite([_ | Rest]) -> wait_for_send(Socket) -> %% Make sure TLS process processed send message event _ = ssl:connection_information(Socket). + diff --git a/lib/ssl/test/ssl_certificate_verify_SUITE.erl b/lib/ssl/test/ssl_certificate_verify_SUITE.erl index 4c6f1d7c01..5265c87e29 100644 --- a/lib/ssl/test/ssl_certificate_verify_SUITE.erl +++ b/lib/ssl/test/ssl_certificate_verify_SUITE.erl @@ -1097,7 +1097,8 @@ client_with_cert_cipher_suites_handshake(Config) when is_list(Config) -> {mfa, {ssl_test_lib, send_recv_result_active, []}}, {options, [{active, true}, - {ciphers, ssl_test_lib:rsa_non_signed_suites()} + {ciphers, + ssl_test_lib:rsa_non_signed_suites(tls_record:highest_protocol_version([]))} | ServerOpts]}]), Port = ssl_test_lib:inet_port(Server), Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, diff --git a/lib/ssl/test/ssl_crl_SUITE.erl b/lib/ssl/test/ssl_crl_SUITE.erl index bc2822f0c4..e293d183f7 100644 --- a/lib/ssl/test/ssl_crl_SUITE.erl +++ b/lib/ssl/test/ssl_crl_SUITE.erl @@ -99,32 +99,37 @@ init_per_group(check_peer, Config) -> init_per_group(check_best_effort, Config) -> [{crl_check, best_effort} | Config]; init_per_group(Group, Config0) -> - case is_idp(Group) of - true -> - [{idp_crl, true} | Config0]; - false -> - DataDir = proplists:get_value(data_dir, Config0), - CertDir = filename:join(proplists:get_value(priv_dir, Config0), Group), - {CertOpts, Config} = init_certs(CertDir, Group, Config0), - {ok, _} = make_certs:all(DataDir, CertDir, CertOpts), - case Group of - crl_hash_dir -> - CrlDir = filename:join(CertDir, "crls"), - %% Copy CRLs to their hashed filenames. - %% Find the hashes with 'openssl crl -noout -hash -in crl.pem'. - populate_crl_hash_dir(CertDir, CrlDir, - [{"erlangCA", "d6134ed3"}, - {"otpCA", "d4c8d7e5"}], - replace), - CrlCacheOpts = [{crl_cache, - {ssl_crl_hash_dir, - {internal, [{dir, CrlDir}]}}}]; - _ -> - CrlCacheOpts = [] - end, - [{crl_cache_opts, CrlCacheOpts}, - {cert_dir, CertDir}, - {idp_crl, false} | Config] + try + case is_idp(Group) of + true -> + [{idp_crl, true} | Config0]; + false -> + DataDir = proplists:get_value(data_dir, Config0), + CertDir = filename:join(proplists:get_value(priv_dir, Config0), Group), + {CertOpts, Config} = init_certs(CertDir, Group, Config0), + {ok, _} = make_certs:all(DataDir, CertDir, CertOpts), + CrlCacheOpts = case Group of + crl_hash_dir -> + CrlDir = filename:join(CertDir, "crls"), + %% Copy CRLs to their hashed filenames. + %% Find the hashes with 'openssl crl -noout -hash -in crl.pem'. + populate_crl_hash_dir(CertDir, CrlDir, + [{"erlangCA", "d6134ed3"}, + {"otpCA", "d4c8d7e5"}], + replace), + [{crl_cache, + {ssl_crl_hash_dir, + {internal, [{dir, CrlDir}]}}}]; + _ -> + [] + end, + [{crl_cache_opts, CrlCacheOpts}, + {cert_dir, CertDir}, + {idp_crl, false} | Config] + end + catch + _:_ -> + {skip, "Unable to create crls"} end. end_per_group(_GroupName, Config) -> @@ -187,7 +192,7 @@ crl_verify_valid(Config) when is_list(Config) -> {crl_cache, {ssl_crl_cache, {internal, [{http, 5000}]}}}, {verify, verify_peer}]; false -> - ?config(crl_cache_opts, Config) ++ + proplists:get_value(crl_cache_opts, Config) ++ [{cacertfile, filename:join([PrivDir, "server", "cacerts.pem"])}, {crl_check, Check}, {verify, verify_peer}] @@ -220,7 +225,7 @@ crl_verify_revoked(Config) when is_list(Config) -> {crl_check, Check}, {verify, verify_peer}]; false -> - ?config(crl_cache_opts, Config) ++ + proplists:get_value(crl_cache_opts, Config) ++ [{cacertfile, filename:join([PrivDir, "revoked", "cacerts.pem"])}, {crl_check, Check}, {verify, verify_peer}] @@ -279,8 +284,8 @@ crl_verify_no_crl(Config) when is_list(Config) -> crl_hash_dir_collision() -> [{doc,"Verify ssl_crl_hash_dir behaviour with hash collisions"}]. crl_hash_dir_collision(Config) when is_list(Config) -> - PrivDir = ?config(cert_dir, Config), - Check = ?config(crl_check, Config), + PrivDir = proplists:get_value(cert_dir, Config), + Check = proplists:get_value(crl_check, Config), %% Create two CAs whose names hash to the same value CA1 = "hash-collision-0000000000", @@ -307,13 +312,17 @@ crl_hash_dir_collision(Config) when is_list(Config) -> {CA2, "b68fc624"}], replace), - ClientOpts = ?config(crl_cache_opts, Config) ++ - [{cacertfile, filename:join([PrivDir, "erlangCA", "cacerts.pem"])}, + NewCA = new_ca(filename:join([PrivDir, "new_ca"]), + filename:join([PrivDir, "erlangCA", "cacerts.pem"]), + filename:join([PrivDir, "server", "cacerts.pem"])), + + ClientOpts = proplists:get_value(crl_cache_opts, Config) ++ + [{cacertfile, NewCA}, {crl_check, Check}, {verify, verify_peer}], - + {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), - + %% Neither certificate revoked; both succeed. crl_verify_valid(Hostname, ServerNode, ServerOpts1, ClientNode, ClientOpts), crl_verify_valid(Hostname, ServerNode, ServerOpts2, ClientNode, ClientOpts), @@ -346,8 +355,8 @@ crl_hash_dir_collision(Config) when is_list(Config) -> crl_hash_dir_expired() -> [{doc,"Verify ssl_crl_hash_dir behaviour with expired CRLs"}]. crl_hash_dir_expired(Config) when is_list(Config) -> - PrivDir = ?config(cert_dir, Config), - Check = ?config(crl_check, Config), + PrivDir = proplists:get_value(cert_dir, Config), + Check = proplists:get_value(crl_check, Config), CA = "CRL-maybe-expired-CA", %% Add "issuing distribution point", to ensure that verification @@ -362,7 +371,7 @@ crl_hash_dir_expired(Config) when is_list(Config) -> ServerOpts = [{keyfile, filename:join([PrivDir, EndUser, "key.pem"])}, {certfile, filename:join([PrivDir, EndUser, "cert.pem"])}, {cacertfile, filename:join([PrivDir, EndUser, "cacerts.pem"])}], - ClientOpts = ?config(crl_cache_opts, Config) ++ + ClientOpts = proplists:get_value(crl_cache_opts, Config) ++ [{cacertfile, filename:join([PrivDir, CA, "cacerts.pem"])}, {crl_check, Check}, {verify, verify_peer}], @@ -492,3 +501,12 @@ find_free_name(CrlDir, Hash, N) -> false -> Name end. + +new_ca(FileName, CA1, CA2) -> + {ok, P1} = file:read_file(CA1), + E1 = public_key:pem_decode(P1), + {ok, P2} = file:read_file(CA2), + E2 = public_key:pem_decode(P2), + Pem = public_key:pem_encode(E1 ++E2), + file:write_file(FileName, Pem), + FileName. diff --git a/lib/ssl/test/ssl_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl index 81a49776e4..3446a566c4 100644 --- a/lib/ssl/test/ssl_packet_SUITE.erl +++ b/lib/ssl/test/ssl_packet_SUITE.erl @@ -41,9 +41,9 @@ -define(MANY, 1000). -define(SOME, 50). --define(BASE_TIMEOUT_SECONDS, 30). --define(SOME_SCALE, 20). --define(MANY_SCALE, 20). +-define(BASE_TIMEOUT_SECONDS, 5). +-define(SOME_SCALE, 2). +-define(MANY_SCALE, 3). %%-------------------------------------------------------------------- %% Common Test interface functions ----------------------------------- @@ -2011,26 +2011,19 @@ active_once_raw(Socket, Data, N) -> active_once_raw(_, _, 0, _) -> ok; -active_once_raw(Socket, Data, N, Acc) -> - receive - {ssl, Socket, Byte} when length(Byte) == 1 -> - ssl:setopts(Socket, [{active, once}]), +active_once_raw(Socket, Data, N, Acc0) -> + case lists:prefix(Data, Acc0) of + true -> + DLen = length(Data), + Start = DLen + 1, + Len = length(Acc0) - DLen, + Acc = string:substr(Acc0, Start, Len), + active_once_raw(Socket, Data, N-1, Acc); + false -> receive - {ssl, Socket, _} -> - ssl:setopts(Socket, [{active, once}]), - active_once_raw(Socket, Data, N-1, []) - end; - {ssl, Socket, Data} -> - ssl:setopts(Socket, [{active, once}]), - active_once_raw(Socket, Data, N-1, []); - {ssl, Socket, Other} -> - case Acc ++ Other of - Data -> - ssl:setopts(Socket, [{active, once}]), - active_once_raw(Socket, Data, N-1, []); - NewAcc -> + {ssl, Socket, Info} -> ssl:setopts(Socket, [{active, once}]), - active_once_raw(Socket, Data, N, NewAcc) + active_once_raw(Socket, Data, N, Acc0 ++ Info) end end. diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl index 81f16030f7..9632103696 100644 --- a/lib/ssl/test/ssl_test_lib.erl +++ b/lib/ssl/test/ssl_test_lib.erl @@ -398,7 +398,7 @@ cert_options(Config) -> {ssl_imp, new}]}, {server_opts, [{ssl_imp, new},{reuseaddr, true}, {cacertfile, ServerCaCertFile}, {certfile, ServerCertFile}, {keyfile, ServerKeyFile}]}, - {server_anon, [{ssl_imp, new},{reuseaddr, true}, {ciphers, anonymous_suites()}]}, + %%{server_anon, [{ssl_imp, new},{reuseaddr, true}, {ciphers, anonymous_suites()}]}, {client_psk, [{ssl_imp, new},{reuseaddr, true}, {psk_identity, "Test-User"}, {user_lookup_fun, {fun user_lookup/3, PskSharedSecret}}]}, @@ -462,9 +462,10 @@ cert_options(Config) -> make_dsa_cert(Config) -> - - {ServerCaCertFile, ServerCertFile, ServerKeyFile} = make_cert_files("server", Config, dsa, dsa, ""), - {ClientCaCertFile, ClientCertFile, ClientKeyFile} = make_cert_files("client", Config, dsa, dsa, ""), + {ServerCaCertFile, ServerCertFile, ServerKeyFile} = + make_cert_files("server", Config, dsa, dsa, "", []), + {ClientCaCertFile, ClientCertFile, ClientKeyFile} = + make_cert_files("client", Config, dsa, dsa, "", []), [{server_dsa_opts, [{ssl_imp, new},{reuseaddr, true}, {cacertfile, ServerCaCertFile}, {certfile, ServerCertFile}, {keyfile, ServerKeyFile}]}, @@ -490,8 +491,10 @@ make_ecdsa_cert(Config) -> CryptoSupport = crypto:supports(), case proplists:get_bool(ecdsa, proplists:get_value(public_keys, CryptoSupport)) of true -> - {ServerCaCertFile, ServerCertFile, ServerKeyFile} = make_cert_files("server", Config, ec, ec, ""), - {ClientCaCertFile, ClientCertFile, ClientKeyFile} = make_cert_files("client", Config, ec, ec, ""), + {ServerCaCertFile, ServerCertFile, ServerKeyFile} = + make_cert_files("server", Config, ec, ec, "", [{digest, appropriate_sha(CryptoSupport)}]), + {ClientCaCertFile, ClientCertFile, ClientKeyFile} = + make_cert_files("client", Config, ec, ec, "", [{digest, appropriate_sha(CryptoSupport)}]), [{server_ecdsa_opts, [{ssl_imp, new},{reuseaddr, true}, {cacertfile, ServerCaCertFile}, {certfile, ServerCertFile}, {keyfile, ServerKeyFile}]}, @@ -507,6 +510,14 @@ make_ecdsa_cert(Config) -> Config end. +appropriate_sha(CryptoSupport) -> + case proplists:get_bool(sha256, CryptoSupport) of + true -> + sha256; + false -> + sha1 + end. + %% RFC 4492, Sect. 2.3. ECDH_RSA %% %% This key exchange algorithm is the same as ECDH_ECDSA except that the @@ -515,8 +526,10 @@ make_ecdh_rsa_cert(Config) -> CryptoSupport = crypto:supports(), case proplists:get_bool(ecdh, proplists:get_value(public_keys, CryptoSupport)) of true -> - {ServerCaCertFile, ServerCertFile, ServerKeyFile} = make_cert_files("server", Config, rsa, ec, "rsa_"), - {ClientCaCertFile, ClientCertFile, ClientKeyFile} = make_cert_files("client", Config, rsa, ec, "rsa_"), + {ServerCaCertFile, ServerCertFile, ServerKeyFile} = + make_cert_files("server", Config, rsa, ec, "rsa_", []), + {ClientCaCertFile, ClientCertFile, ClientKeyFile} = + make_cert_files("client", Config, rsa, ec, "rsa_",[]), [{server_ecdh_rsa_opts, [{ssl_imp, new},{reuseaddr, true}, {cacertfile, ServerCaCertFile}, {certfile, ServerCertFile}, {keyfile, ServerKeyFile}]}, @@ -534,9 +547,9 @@ make_ecdh_rsa_cert(Config) -> make_mix_cert(Config) -> {ServerCaCertFile, ServerCertFile, ServerKeyFile} = make_cert_files("server", Config, dsa, - rsa, "mix"), + rsa, "mix", []), {ClientCaCertFile, ClientCertFile, ClientKeyFile} = make_cert_files("client", Config, dsa, - rsa, "mix"), + rsa, "mix", []), [{server_mix_opts, [{ssl_imp, new},{reuseaddr, true}, {cacertfile, ServerCaCertFile}, {certfile, ServerCertFile}, {keyfile, ServerKeyFile}]}, @@ -549,11 +562,11 @@ make_mix_cert(Config) -> {certfile, ClientCertFile}, {keyfile, ClientKeyFile}]} | Config]. -make_cert_files(RoleStr, Config, Alg1, Alg2, Prefix) -> +make_cert_files(RoleStr, Config, Alg1, Alg2, Prefix, Opts) -> Alg1Str = atom_to_list(Alg1), Alg2Str = atom_to_list(Alg2), - CaInfo = {CaCert, _} = erl_make_certs:make_cert([{key, Alg1}]), - {Cert, CertKey} = erl_make_certs:make_cert([{key, Alg2}, {issuer, CaInfo}]), + CaInfo = {CaCert, _} = erl_make_certs:make_cert([{key, Alg1}| Opts]), + {Cert, CertKey} = erl_make_certs:make_cert([{key, Alg2}, {issuer, CaInfo} | Opts]), CaCertFile = filename:join([proplists:get_value(priv_dir, Config), RoleStr, Prefix ++ Alg1Str ++ "_cacerts.pem"]), CertFile = filename:join([proplists:get_value(priv_dir, Config), @@ -840,37 +853,42 @@ common_ciphers(openssl) -> lists:member(ssl_cipher:openssl_suite_name(S), OpenSslSuites) ]. -rsa_non_signed_suites() -> +available_suites(Version) -> + [ssl_cipher:erl_suite_definition(Suite) || + Suite <- ssl_cipher:filter_suites(ssl_cipher:suites(Version))]. + + +rsa_non_signed_suites(Version) -> lists:filter(fun({rsa, _, _}) -> true; (_) -> false end, - ssl:cipher_suites()). + available_suites(Version)). -dsa_suites() -> +dsa_suites(Version) -> lists:filter(fun({dhe_dss, _, _}) -> true; (_) -> false end, - ssl:cipher_suites()). + available_suites(Version)). -ecdsa_suites() -> +ecdsa_suites(Version) -> lists:filter(fun({ecdhe_ecdsa, _, _}) -> true; (_) -> false end, - ssl:cipher_suites()). + available_suites(Version)). -ecdh_rsa_suites() -> +ecdh_rsa_suites(Version) -> lists:filter(fun({ecdh_rsa, _, _}) -> true; (_) -> false end, - ssl:cipher_suites()). + available_suites(Version)). openssl_rsa_suites(CounterPart) -> Ciphers = ssl:cipher_suites(openssl), @@ -908,19 +926,8 @@ string_regex_filter(Str, Search) when is_list(Str) -> string_regex_filter(_Str, _Search) -> false. -anonymous_suites() -> - Suites = - [{dh_anon, rc4_128, md5}, - {dh_anon, des_cbc, sha}, - {dh_anon, '3des_ede_cbc', sha}, - {dh_anon, aes_128_cbc, sha}, - {dh_anon, aes_256_cbc, sha}, - {dh_anon, aes_128_gcm, null, sha256}, - {dh_anon, aes_256_gcm, null, sha384}, - {ecdh_anon,rc4_128,sha}, - {ecdh_anon,'3des_ede_cbc',sha}, - {ecdh_anon,aes_128_cbc,sha}, - {ecdh_anon,aes_256_cbc,sha}], +anonymous_suites(Version) -> + Suites = ssl_cipher:anonymous_suites(Version), ssl_cipher:filter_suites(Suites). psk_suites() -> @@ -1185,14 +1192,15 @@ is_fips(_) -> false. cipher_restriction(Config0) -> + Version = tls_record:protocol_version(protocol_version(Config0)), case is_sane_ecc(openssl) of false -> Opts = proplists:get_value(server_opts, Config0), Config1 = proplists:delete(server_opts, Config0), VerOpts = proplists:get_value(server_verification_opts, Config1), Config = proplists:delete(server_verification_opts, Config1), - Restricted0 = ssl:cipher_suites() -- ecdsa_suites(), - Restricted = Restricted0 -- ecdh_rsa_suites(), + Restricted0 = ssl:cipher_suites() -- ecdsa_suites(Version), + Restricted = Restricted0 -- ecdh_rsa_suites(Version), [{server_opts, [{ciphers, Restricted} | Opts]}, {server_verification_opts, [{ciphers, Restricted} | VerOpts] } | Config]; true -> Config0 diff --git a/lib/ssl/test/ssl_to_openssl_SUITE.erl b/lib/ssl/test/ssl_to_openssl_SUITE.erl index 9ecfe5b0ea..e99340822d 100644 --- a/lib/ssl/test/ssl_to_openssl_SUITE.erl +++ b/lib/ssl/test/ssl_to_openssl_SUITE.erl @@ -834,7 +834,7 @@ ciphers_dsa_signed_certs() -> [{doc,"Test cipher suites that uses dsa certs"}]. ciphers_dsa_signed_certs(Config) when is_list(Config) -> Version = ssl_test_lib:protocol_version(Config), - Ciphers = ssl_test_lib:dsa_suites(), + Ciphers = ssl_test_lib:dsa_suites(tls_record:protocol_version(Version)), run_suites(Ciphers, Version, Config, dsa). %%-------------------------------------------------------------------- diff --git a/lib/stdlib/doc/src/gen_statem.xml b/lib/stdlib/doc/src/gen_statem.xml index 3322571b2c..fd498ee82e 100644 --- a/lib/stdlib/doc/src/gen_statem.xml +++ b/lib/stdlib/doc/src/gen_statem.xml @@ -54,7 +54,8 @@ <p> This is a new behavior in Erlang/OTP 19.0. It has been thoroughly reviewed, is stable enough - to be used by at least two heavy OTP applications, and is here to stay. + to be used by at least two heavy OTP applications, + and is here to stay. Depending on user feedback, we do not expect but can find it necessary to make minor not backward compatible changes into Erlang/OTP 20.0. @@ -70,6 +71,7 @@ <item>The state can be any term.</item> <item>Events can be postponed.</item> <item>Events can be self-generated.</item> + <item>Automatic state enter code can be called.</item> <item>A reply can be sent from a later state.</item> <item>There can be multiple <c>sys</c> traceable replies.</item> </list> @@ -125,9 +127,9 @@ erlang:'!' -----> Module:StateName/3 is not regarded as an error but as a valid return from all callback functions. </p> - <marker id="state_function"/> + <marker id="state callback"/> <p> - The "<em>state function</em>" for a specific + The "<em>state callback</em>" for a specific <seealso marker="#type-state">state</seealso> in a <c>gen_statem</c> is the callback function that is called for all events in this state. It is selected depending on which @@ -139,7 +141,7 @@ erlang:'!' -----> Module:StateName/3 When the <seealso marker="#type-callback_mode"><em>callback mode</em></seealso> is <c>state_functions</c>, the state must be an atom and - is used as the state function name; see + is used as the state callback name; see <seealso marker="#Module:StateName/3"><c>Module:StateName/3</c></seealso>. This gathers all code for a specific state in one function as the <c>gen_statem</c> engine @@ -152,7 +154,7 @@ erlang:'!' -----> Module:StateName/3 When the <seealso marker="#type-callback_mode"><em>callback mode</em></seealso> is <c>handle_event_function</c>, the state can be any term - and the state function name is + and the state callback name is <seealso marker="#Module:handle_event/4"><c>Module:handle_event/4</c></seealso>. This makes it easy to branch depending on state or event as you desire. Be careful about which events you handle in which @@ -162,8 +164,8 @@ erlang:'!' -----> Module:StateName/3 <p> The <c>gen_statem</c> enqueues incoming events in order of arrival and presents these to the - <seealso marker="#state_function">state function</seealso> - in that order. The state function can postpone an event + <seealso marker="#state callback">state callback</seealso> + in that order. The state callback can postpone an event so it is not retried in the current state. After a state change the queue restarts with the postponed events. </p> @@ -175,12 +177,12 @@ erlang:'!' -----> Module:StateName/3 to entering a new receive statement. </p> <p> - The <seealso marker="#state_function">state function</seealso> + The <seealso marker="#state callback">state callback</seealso> can insert events using the <seealso marker="#type-action"><c>action()</c></seealso> <c>next_event</c> and such an event is inserted as the next to present - to the state function. That is, as if it is + to the state callback. That is, as if it is the oldest incoming event. A dedicated <seealso marker="#type-event_type"><c>event_type()</c></seealso> <c>internal</c> can be used for such events making them impossible @@ -193,9 +195,19 @@ erlang:'!' -----> Module:StateName/3 <seealso marker="gen_fsm"><c>gen_fsm</c></seealso> to force processing an inserted event before others. </p> + <p> + The <c>gen_statem</c> engine can automatically + make a specialized call to the + <seealso marker="#state callback">state callback</seealso> + whenever a new state is entered; see + <seealso marker="#type-state_enter"><c>state_enter()</c></seealso>. + This is for writing code common to all state entries. + Another way to do it is to insert events at state transitions, + but you have to do so everywhere it is needed. + </p> <note> <p>If you in <c>gen_statem</c>, for example, postpone - an event in one state and then call another state function + an event in one state and then call another state callback of yours, you have not changed states and hence the postponed event is not retried, which is logical but can be confusing. </p> @@ -224,7 +236,7 @@ erlang:'!' -----> Module:StateName/3 The <c>gen_statem</c> process can go into hibernation; see <seealso marker="proc_lib#hibernate/3"><c>proc_lib:hibernate/3</c></seealso>. It is done when a - <seealso marker="#state_function">state function</seealso> or + <seealso marker="#state callback">state callback</seealso> or <seealso marker="#Module:init/1"><c>Module:init/1</c></seealso> specifies <c>hibernate</c> in the returned <seealso marker="#type-action"><c>Actions</c></seealso> @@ -282,7 +294,7 @@ init([]) -> {ok,State,Data}. callback_mode() -> state_functions. -%%% State function(s) +%%% state callback(s) off({call,From}, push, Data) -> %% Go to 'on', increment count and reply @@ -336,7 +348,7 @@ ok <code type="erl"> callback_mode() -> handle_event_function. -%%% State function(s) +%%% state callback(s) handle_event({call,From}, push, off, Data) -> %% Go to 'on', increment count and reply @@ -470,6 +482,10 @@ handle_event(_, _, State, Data) -> <name name="state"/> <desc> <p> + If the + <seealso marker="#type-callback_mode"><em>callback mode</em></seealso> + is <c>handle_event_function</c>, + the state can be any term. After a state change (<c>NextState =/= State</c>), all postponed events are retried. </p> @@ -483,6 +499,8 @@ handle_event(_, _, State, Data) -> <seealso marker="#type-callback_mode"><em>callback mode</em></seealso> is <c>state_functions</c>, the state must be of this type. + After a state change (<c>NextState =/= State</c>), + all postponed events are retried. </p> </desc> </datatype> @@ -515,7 +533,22 @@ handle_event(_, _, State, Data) -> Type <c>info</c> originates from regular process messages sent to the <c>gen_statem</c>. Also, the state machine implementation can generate events of types - <c>timeout</c> and <c>internal</c> to itself. + <c>timeout</c>, <c>state_timeout</c>, + and <c>internal</c> to itself. + </p> + </desc> + </datatype> + <datatype> + <name name="callback_mode_result"/> + <desc> + <p> + This is the return type from + <seealso marker="#Module:callback_mode/0"><c>Module:callback_mode/0</c></seealso> + and selects + <seealso marker="#type-callback_mode">callback mode</seealso> + and whether to do + <seealso marker="#type-state_enter">state enter calls</seealso>, + or not. </p> </desc> </datatype> @@ -551,16 +584,75 @@ handle_event(_, _, State, Data) -> </desc> </datatype> <datatype> + <name name="state_enter"/> + <desc> + <p> + If the state machine should use <em>state enter calls</em> + is selected when starting the <c>gen_statem</c> + and after code change using the return value from + <seealso marker="#Module:callback_mode/0"><c>Module:callback_mode/0</c></seealso>. + </p> + <p> + If + <seealso marker="#Module:callback_mode/0"><c>Module:callback_mode/0</c></seealso> + returns a list containing <c>state_enter</c>, + the <c>gen_statem</c> engine will, at every state change, + call the + <seealso marker="#state callback">state callback</seealso> + with arguments <c>(enter, OldState, Data)</c>. + This may look like an event but is really a call + performed after the previous state callback returned + and before any event is delivered to the new state callback. + See + <seealso marker="#Module:StateName/3"><c>Module:StateName/3</c></seealso> + and + <seealso marker="#Module:handle_event/4"><c>Module:handle_event/4</c></seealso>. + </p> + <p> + If + <seealso marker="#Module:callback_mode/0"><c>Module:callback_mode/0</c></seealso> + does not return such a list, no state enter calls are done. + </p> + <p> + If + <seealso marker="#Module:code_change/4"><c>Module:code_change/4</c></seealso> + should transform the state to a state with a different + name it is still regarded as the same state so this + does not cause a state enter call. + </p> + <p> + Note that a state enter call <em>will</em> be done + right before entering the initial state even though this + formally is not a state change. + In this case <c>OldState</c> will be the same as <c>State</c>, + which can not happen for a subsequent state change. + </p> + </desc> + </datatype> + <datatype> <name name="transition_option"/> <desc> <p> Transition options can be set by <seealso marker="#type-action">actions</seealso> - and they modify the following in how - the state transition is done: + and they modify how the state transition is done: </p> <list type="ordered"> <item> + <p> + If the state changes or is the initial state, and + <seealso marker="#type-state_enter"><em>state enter calls</em></seealso> + are used, the <c>gen_statem</c> calls + the new state callback with arguments + <seealso marker="#type-state_enter">(enter, OldState, Data)</seealso>. + Any + <seealso marker="#type-enter_action"><c>actions</c></seealso> + returned from this call are handled as if they were + appended to the actions + returned by the state callback that changed states. + </p> + </item> + <item> <p> All <seealso marker="#type-action">actions</seealso> @@ -586,27 +678,46 @@ handle_event(_, _, State, Data) -> All events stored with <seealso marker="#type-action"><c>action()</c></seealso> <c>next_event</c> - are inserted in the queue to be processed before - all other events. + are inserted to be processed before the other queued events. </p> </item> <item> <p> - If an + Timeout timers + <seealso marker="#type-state_timeout"><c>state_timeout()</c></seealso> + and <seealso marker="#type-event_timeout"><c>event_timeout()</c></seealso> - is set through - <seealso marker="#type-action"><c>action()</c></seealso> - <c>timeout</c>, - an event timer can be started or a time-out zero event - can be enqueued. + are handled. Time-outs with zero time are guaranteed to be + delivered to the state machine before any external + not yet received event so if there is such a timeout requested, + the corresponding time-out zero event is enqueued as + the newest event. + </p> + <p> + Any event cancels an + <seealso marker="#type-event_timeout"><c>event_timeout()</c></seealso> + so a zero time event time-out is only generated + if the event queue is empty. + </p> + <p> + A state change cancels a + <seealso marker="#type-state_timeout"><c>state_timeout()</c></seealso> + and any new transition option of this type + belongs to the new state. + </p> + </item> + <item> + <p> + If there are enqueued events the + <seealso marker="#state callback">state callback</seealso> + for the possibly new state + is called with the oldest enqueued event, + and we start again from the top of this list. </p> </item> <item> <p> - The (possibly new) - <seealso marker="#state_function">state function</seealso> - is called with the oldest enqueued event if there is any, - otherwise the <c>gen_statem</c> goes into <c>receive</c> + Otherwise the <c>gen_statem</c> goes into <c>receive</c> or hibernation (if <seealso marker="#type-hibernate"><c>hibernate()</c></seealso> @@ -614,8 +725,11 @@ handle_event(_, _, State, Data) -> to wait for the next message. In hibernation the next non-system event awakens the <c>gen_statem</c>, or rather the next incoming message awakens the <c>gen_statem</c>, - but if it is a system event - it goes right back into hibernation. + but if it is a system event it goes right back into hibernation. + When a new message arrives the + <seealso marker="#state callback">state callback</seealso> + is called with the corresponding event, + and we start again from the top of this list. </p> </item> </list> @@ -657,34 +771,66 @@ handle_event(_, _, State, Data) -> <seealso marker="#type-event_type"><c>event_type()</c></seealso> <c>timeout</c> after this time (in milliseconds) unless another - event arrives in which case this time-out is cancelled. - Notice that a retried or inserted event - counts like a new in this respect. + event arrives or has arrived + in which case this time-out is cancelled. + Note that a retried or inserted event counts as arrived. + So does a state time-out zero event, if it was generated + before this timer is requested. </p> <p> If the value is <c>infinity</c>, no timer is started, as - it never triggers anyway. + it never would trigger anyway. </p> <p> - If the value is <c>0</c>, the time-out event is immediately enqueued - unless there already are enqueued events, as the - time-out is then immediately cancelled. - This is a feature ensuring that a time-out <c>0</c> event - is processed before any not yet received external event. + If the value is <c>0</c> no timer is actually started, + instead the the time-out event is enqueued to ensure + that it gets processed before any not yet + received external event. </p> <p> - Notice that it is not possible or needed to cancel this time-out, + Note that it is not possible or needed to cancel this time-out, as it is cancelled automatically by any other event. </p> </desc> </datatype> <datatype> + <name name="state_timeout"/> + <desc> + <p> + Generates an event of + <seealso marker="#type-event_type"><c>event_type()</c></seealso> + <c>state_timeout</c> + after this time (in milliseconds) unless the <c>gen_statem</c> + changes states (<c>NewState =/= OldState</c>) + which case this time-out is cancelled. + </p> + <p> + If the value is <c>infinity</c>, no timer is started, as + it never would trigger anyway. + </p> + <p> + If the value is <c>0</c> no timer is actually started, + instead the the time-out event is enqueued to ensure + that it gets processed before any not yet + received external event. + </p> + <p> + Setting this timer while it is running will restart it with + the new time-out value. Therefore it is possible to cancel + this time-out by setting it to <c>infinity</c>. + </p> + </desc> + </datatype> + <datatype> <name name="action"/> <desc> <p> These state transition actions can be invoked by returning them from the - <seealso marker="#state_function">state function</seealso>, from + <seealso marker="#state callback">state callback</seealso> + when it is called with an + <seealso marker="#type-event_type">event</seealso>, + from <seealso marker="#Module:init/1"><c>Module:init/1</c></seealso> or by giving them to <seealso marker="#enter_loop/5"><c>enter_loop/5,6</c></seealso>. @@ -698,8 +844,8 @@ handle_event(_, _, State, Data) -> override any previous of the same type, so the last in the containing list wins. For example, the last - <seealso marker="#type-event_timeout"><c>event_timeout()</c></seealso> - overrides any other <c>event_timeout()</c> in the list. + <seealso marker="#type-postpone"><c>postpone()</c></seealso> + overrides any previous <c>postpone()</c> in the list. </p> <taglist> <tag><c>postpone</c></tag> @@ -716,6 +862,53 @@ handle_event(_, _, State, Data) -> as there is no event to postpone in those cases. </p> </item> + <tag><c>next_event</c></tag> + <item> + <p> + Stores the specified <c><anno>EventType</anno></c> + and <c><anno>EventContent</anno></c> for insertion after all + actions have been executed. + </p> + <p> + The stored events are inserted in the queue as the next to process + before any already queued events. The order of these stored events + is preserved, so the first <c>next_event</c> in the containing + list becomes the first to process. + </p> + <p> + An event of type + <seealso marker="#type-event_type"><c>internal</c></seealso> + is to be used when you want to reliably distinguish + an event inserted this way from any external event. + </p> + </item> + </taglist> + </desc> + </datatype> + <datatype> + <name name="enter_action"/> + <desc> + <p> + These state transition actions can be invoked by + returning them from the + <seealso marker="#state callback">state callback</seealso>, from + <seealso marker="#Module:init/1"><c>Module:init/1</c></seealso> + or by giving them to + <seealso marker="#enter_loop/5"><c>enter_loop/5,6</c></seealso>. + </p> + <p> + Actions are executed in the containing list order. + </p> + <p> + Actions that set + <seealso marker="#type-transition_option">transition options</seealso> + override any previous of the same type, + so the last in the containing list wins. + For example, the last + <seealso marker="#type-event_timeout"><c>event_timeout()</c></seealso> + overrides any previous <c>event_timeout()</c> in the list. + </p> + <taglist> <tag><c>hibernate</c></tag> <item> <p> @@ -731,7 +924,7 @@ handle_event(_, _, State, Data) -> Short for <c>{timeout,Timeout,Timeout}</c>, that is, the time-out message is the time-out time. This form exists to make the - <seealso marker="#state_function">state function</seealso> + <seealso marker="#state callback">state callback</seealso> return value <c>{next_state,NextState,NewData,Timeout}</c> allowed like for <c>gen_fsm</c>'s <seealso marker="gen_fsm#Module:StateName/2"><c>Module:StateName/2</c></seealso>. @@ -746,30 +939,13 @@ handle_event(_, _, State, Data) -> to <c><anno>Time</anno></c> with <c><anno>EventContent</anno></c>. </p> </item> - <tag><c>reply_action()</c></tag> + <tag><c>state_timeout</c></tag> <item> <p> - Replies to a caller. - </p> - </item> - <tag><c>next_event</c></tag> - <item> - <p> - Stores the specified <c><anno>EventType</anno></c> - and <c><anno>EventContent</anno></c> for insertion after all - actions have been executed. - </p> - <p> - The stored events are inserted in the queue as the next to process - before any already queued events. The order of these stored events - is preserved, so the first <c>next_event</c> in the containing - list becomes the first to process. - </p> - <p> - An event of type - <seealso marker="#type-event_type"><c>internal</c></seealso> - is to be used when you want to reliably distinguish - an event inserted this way from any external event. + Sets the + <seealso marker="#type-transition_option"><c>transition_option()</c></seealso> + <seealso marker="#type-state_timeout"><c>state_timeout()</c></seealso> + to <c><anno>Time</anno></c> with <c><anno>EventContent</anno></c>. </p> </item> </taglist> @@ -779,39 +955,70 @@ handle_event(_, _, State, Data) -> <name name="reply_action"/> <desc> <p> - Replies to a caller waiting for a reply in + This state transition action can be invoked by + returning it from the + <seealso marker="#state callback">state callback</seealso>, from + <seealso marker="#Module:init/1"><c>Module:init/1</c></seealso> + or by giving it to + <seealso marker="#enter_loop/5"><c>enter_loop/5,6</c></seealso>. + </p> + <p> + It replies to a caller waiting for a reply in <seealso marker="#call/2"><c>call/2</c></seealso>. <c><anno>From</anno></c> must be the term from argument <seealso marker="#type-event_type"><c>{call,<anno>From</anno>}</c></seealso> - to the - <seealso marker="#state_function">state function</seealso>. + in a call to a + <seealso marker="#state callback">state callback</seealso>. + </p> + <p> + Note that using this action from + <seealso marker="#Module:init/1"><c>Module:init/1</c></seealso> + or + <seealso marker="#enter_loop/5"><c>enter_loop/5,6</c></seealso> + would be weird on the border of whichcraft + since there has been no earlier call to a + <seealso marker="#state callback">state callback</seealso> + in this server. </p> </desc> </datatype> <datatype> - <name name="state_function_result"/> + <name name="state_enter_result"/> <desc> + <p> + <c><anno>State</anno></c> is the current state + and it can not be changed since the state callback + was called with a + <seealso marker="#type-state_enter"><em>state enter call</em></seealso>. + </p> <taglist> <tag><c>next_state</c></tag> <item> <p> The <c>gen_statem</c> does a state transition to - <c><anno>NextStateName</anno></c> - (which can be the same as the current state), + <c><anno>State</anno></c>, which has to be + the current state, sets <c><anno>NewData</anno></c>, and executes all <c><anno>Actions</anno></c>. </p> </item> </taglist> - <p> - All these terms are tuples or atoms and this property - will hold in any future version of <c>gen_statem</c>. - </p> </desc> </datatype> <datatype> - <name name="handle_event_result"/> + <name name="event_handler_result"/> <desc> + <p> + <c><anno>StateType</anno></c> is + <seealso marker="#type-state_name"><c>state_name()</c></seealso> + if + <seealso marker="#type-callback_mode"><em>callback mode</em></seealso> + is <c>state_functions</c>, or + <seealso marker="#type-state"><c>state()</c></seealso> + if + <seealso marker="#type-callback_mode"><em>callback mode</em></seealso> + is <c>handle_event_function</c>. + </p> <taglist> <tag><c>next_state</c></tag> <item> @@ -824,35 +1031,21 @@ handle_event(_, _, State, Data) -> </p> </item> </taglist> - <p> - All these terms are tuples or atoms and this property - will hold in any future version of <c>gen_statem</c>. - </p> </desc> </datatype> <datatype> - <name name="common_state_callback_result"/> + <name name="state_callback_result"/> <desc> + <p> + <c><anno>ActionType</anno></c> is + <seealso marker="#type-enter_action"><c>enter_action()</c></seealso> + if the state callback was called with a + <seealso marker="#type-state_enter"><em>state enter call</em></seealso> + and + <seealso marker="#type-action"><c>action()</c></seealso> + if the state callback was called with an event. + </p> <taglist> - <tag><c>stop</c></tag> - <item> - <p> - Terminates the <c>gen_statem</c> by calling - <seealso marker="#Module:terminate/3"><c>Module:terminate/3</c></seealso> - with <c>Reason</c> and - <c><anno>NewData</anno></c>, if specified. - </p> - </item> - <tag><c>stop_and_reply</c></tag> - <item> - <p> - Sends all <c><anno>Replies</anno></c>, - then terminates the <c>gen_statem</c> by calling - <seealso marker="#Module:terminate/3"><c>Module:terminate/3</c></seealso> - with <c>Reason</c> and - <c><anno>NewData</anno></c>, if specified. - </p> - </item> <tag><c>keep_state</c></tag> <item> <p> @@ -875,6 +1068,25 @@ handle_event(_, _, State, Data) -> <c>{next_state,CurrentState,CurrentData,<anno>Actions</anno>}</c>. </p> </item> + <tag><c>stop</c></tag> + <item> + <p> + Terminates the <c>gen_statem</c> by calling + <seealso marker="#Module:terminate/3"><c>Module:terminate/3</c></seealso> + with <c>Reason</c> and + <c><anno>NewData</anno></c>, if specified. + </p> + </item> + <tag><c>stop_and_reply</c></tag> + <item> + <p> + Sends all <c><anno>Replies</anno></c>, + then terminates the <c>gen_statem</c> by calling + <seealso marker="#Module:terminate/3"><c>Module:terminate/3</c></seealso> + with <c>Reason</c> and + <c><anno>NewData</anno></c>, if specified. + </p> + </item> </taglist> <p> All these terms are tuples or atoms and this property @@ -896,14 +1108,14 @@ handle_event(_, _, State, Data) -> by sending a request and waiting until its reply arrives. The <c>gen_statem</c> calls the - <seealso marker="#state_function">state function</seealso> with + <seealso marker="#state callback">state callback</seealso> with <seealso marker="#type-event_type"><c>event_type()</c></seealso> <c>{call,From}</c> and event content <c><anno>Request</anno></c>. </p> <p> A <c><anno>Reply</anno></c> is generated when a - <seealso marker="#state_function">state function</seealso> + <seealso marker="#state callback">state callback</seealso> returns with <c>{reply,From,<anno>Reply</anno>}</c> as one <seealso marker="#type-action"><c>action()</c></seealso>, @@ -919,18 +1131,40 @@ handle_event(_, _, State, Data) -> </p> <note> <p> - For <c><anno>Timeout</anno> =/= infinity</c>, + For <c><anno>Timeout</anno> < infinity</c>, to avoid getting a late reply in the caller's - inbox, this function spawns a proxy process that + inbox if the caller should catch exceptions, + this function spawns a proxy process that does the call. A late reply gets delivered to the dead proxy process, hence gets discarded. This is less efficient than using - <c><anno>Timeout</anno> =:= infinity</c>. + <c><anno>Timeout</anno> == infinity</c>. + </p> + </note> + <p> + <c><anno>Timeout</anno></c> can also be a tuple + <c>{clean_timeout,<anno>T</anno>}</c> or + <c>{dirty_timeout,<anno>T</anno>}</c>, where + <c><anno>T</anno></c> is the time-out time. + <c>{clean_timeout,<anno>T</anno>}</c> works like + just <c>T</c> described in the note above + and uses a proxy process for <c>T < infinity</c>, + while <c>{dirty_timeout,<anno>T</anno>}</c> + bypasses the proxy process which is more lightweight. + </p> + <note> + <p> + If you combine catching exceptions from this function + with <c>{dirty_timeout,<anno>T</anno>}</c> + to avoid that the calling process dies when the call + times out, you will have to be prepared to handle + a late reply. + So why not just allow the calling process to die? </p> </note> <p> - The call can fail, for example, if the <c>gen_statem</c> dies - before or during this function call. + The call can also fail, for example, if the <c>gen_statem</c> + dies before or during this function call. </p> </desc> </func> @@ -946,7 +1180,7 @@ handle_event(_, _, State, Data) -> ignoring if the destination node or <c>gen_statem</c> does not exist. The <c>gen_statem</c> calls the - <seealso marker="#state_function">state function</seealso> with + <seealso marker="#state callback">state callback</seealso> with <seealso marker="#type-event_type"><c>event_type()</c></seealso> <c>cast</c> and event content <c><anno>Msg</anno></c>. @@ -1060,17 +1294,18 @@ handle_event(_, _, State, Data) -> <seealso marker="#call/2"><c>call/2</c></seealso> when the reply cannot be defined in the return value of a - <seealso marker="#state_function">state function</seealso>. + <seealso marker="#state callback">state callback</seealso>. </p> <p> <c><anno>From</anno></c> must be the term from argument <seealso marker="#type-event_type"><c>{call,<anno>From</anno>}</c></seealso> to the - <seealso marker="#state_function">state function</seealso>. - <c><anno>From</anno></c> and <c><anno>Reply</anno></c> - can also be specified using a - <seealso marker="#type-reply_action"><c>reply_action()</c></seealso> - and multiple replies with a list of them. + <seealso marker="#state callback">state callback</seealso>. + A reply or multiple replies canalso be sent + using one or several + <seealso marker="#type-reply_action"><c>reply_action()</c></seealso>s + from a + <seealso marker="#state callback">state callback</seealso>. </p> <note> <p> @@ -1266,7 +1501,9 @@ handle_event(_, _, State, Data) -> <type> <v> CallbackMode = - <seealso marker="#type-callback_mode">callback_mode()</seealso> + <seealso marker="#type-callback_mode">callback_mode()</seealso> | + [ <seealso marker="#type-callback_mode">callback_mode()</seealso> + | <seealso marker="#type-state_enter">state_enter()</seealso> ] </v> </type> <desc> @@ -1278,8 +1515,9 @@ handle_event(_, _, State, Data) -> for efficiency reasons, so this function is only called once after server start and after code change, but before the first - <seealso marker="#state_function">state function</seealso> - is called. More occasions may be added in future versions + <seealso marker="#state callback">state callback</seealso> + in the current code version is called. + More occasions may be added in future versions of <c>gen_statem</c>. </p> <p> @@ -1291,12 +1529,18 @@ handle_event(_, _, State, Data) -> <seealso marker="#Module:code_change/4"><c>Module:code_change/4</c></seealso> returns. </p> + <p> + The <c>CallbackMode</c> is either just + <seealso marker="#type-callback_mode"><c>callback_mode()</c></seealso> + or a list containing + <seealso marker="#type-callback_mode"><c>callback_mode()</c></seealso> + and possibly the atom + <seealso marker="#type-state_enter"><c>state_enter</c></seealso>. + </p> <note> <p> - If this function's body does not consist of solely one of two - possible - <seealso marker="#type-callback_mode">atoms</seealso> - the callback module is doing something strange. + If this function's body does not return an inline constant + value the callback module is doing something strange. </p> </note> </desc> @@ -1416,7 +1660,7 @@ handle_event(_, _, State, Data) -> The <seealso marker="#type-action"><c>Actions</c></seealso> are executed when entering the first <seealso marker="#type-state">state</seealso> just as for a - <seealso marker="#state_function">state function</seealso>. + <seealso marker="#state callback">state callback</seealso>. </p> <p> If the initialization fails, @@ -1512,7 +1756,8 @@ handle_event(_, _, State, Data) -> </p> <p> The function is to return <c>Status</c>, a term that - changes the details of the current state and status of + contains the appropriate details + of the current state and status of the <c>gen_statem</c>. There are no restrictions on the form <c>Status</c> can take, but for the <seealso marker="sys#get_status/1"><c>sys:get_status/1,2</c></seealso> @@ -1536,11 +1781,17 @@ handle_event(_, _, State, Data) -> </func> <func> + <name>Module:StateName(enter, OldState, Data) -> + StateEnterResult(StateName) + </name> <name>Module:StateName(EventType, EventContent, Data) -> StateFunctionResult </name> - <name>Module:handle_event(EventType, EventContent, - State, Data) -> HandleEventResult + <name>Module:handle_event(enter, OldState, State, Data) -> + StateEnterResult(State) + </name> + <name>Module:handle_event(EventType, EventContent, State, Data) -> + HandleEventResult </name> <fsummary>Handle an event.</fsummary> <type> @@ -1558,12 +1809,20 @@ handle_event(_, _, State, Data) -> <seealso marker="#type-data">data()</seealso> </v> <v> + StateEnterResult(StateName) = + <seealso marker="#type-state_enter_result">state_enter_result(StateName)</seealso> + </v> + <v> StateFunctionResult = - <seealso marker="#type-state_function_result">state_function_result()</seealso> + <seealso marker="#type-event_handler_result">event_handler_result</seealso>(<seealso marker="#type-state_name">state_name()</seealso>) + </v> + <v> + StateEnterResult(State) = + <seealso marker="#type-state_enter_result">state_enter_result(State)</seealso> </v> <v> HandleEventResult = - <seealso marker="#type-handle_event_result">handle_event_result()</seealso> + <seealso marker="#type-event_handler_result">event_handler_result</seealso>(<seealso marker="#type-state">state()</seealso>) </v> </type> <desc> @@ -1582,7 +1841,7 @@ handle_event(_, _, State, Data) -> <seealso marker="#type-event_type"><c>{call,From}</c></seealso>, the caller waits for a reply. The reply can be sent from this or from any other - <seealso marker="#state_function">state function</seealso> + <seealso marker="#state callback">state callback</seealso> by returning with <c>{reply,From,Reply}</c> in <seealso marker="#type-action"><c>Actions</c></seealso>, in <seealso marker="#type-reply_action"><c>Replies</c></seealso>, @@ -1606,6 +1865,24 @@ handle_event(_, _, State, Data) -> see <seealso marker="#type-action"><c>action()</c></seealso>. </p> <p> + When the <c>gen_statem</c> runs with + <seealso marker="#type-state_enter">state enter calls</seealso>, + these functions are also called with arguments + <c>(enter, OldState, ...)</c> whenever the state changes. + In this case there are some restrictions on the + <seealso marker="#type-enter_action">actions</seealso> + that may be returned: + <seealso marker="#type-postpone"><c>postpone()</c></seealso> + and + <seealso marker="#type-action"><c>{next_event,_,_}</c></seealso> + are not allowed. + You may also not change states from this call. + Should you return <c>{next_state,NextState, ...}</c> + with <c>NextState =/= State</c> the <c>gen_statem</c> crashes. + You are advised to use <c>{keep_state,...}</c> or + <c>keep_state_and_data</c>. + </p> + <p> Note the fact that you can use <seealso marker="erts:erlang#throw/1"><c>throw</c></seealso> to return the result, which can be useful. diff --git a/lib/stdlib/doc/src/maps.xml b/lib/stdlib/doc/src/maps.xml index e1edbadcd3..8c7270816b 100644 --- a/lib/stdlib/doc/src/maps.xml +++ b/lib/stdlib/doc/src/maps.xml @@ -160,7 +160,7 @@ val1 <p><em>Example:</em></p> <code type="none"> > Map = #{"42" => value}. -#{"42"> => value} +#{"42" => value} > maps:is_key("42",Map). true > maps:is_key(value,Map). diff --git a/lib/stdlib/doc/src/shell_default.xml b/lib/stdlib/doc/src/shell_default.xml index 81c99bce10..75bf89ba8d 100644 --- a/lib/stdlib/doc/src/shell_default.xml +++ b/lib/stdlib/doc/src/shell_default.xml @@ -51,7 +51,7 @@ <p>In command one, module <seealso marker="lists"><c>lists</c></seealso> is called. In command two, no module name is specified. The shell searches module <c>user_default</c> followed by module <c>shell_default</c> for - function <c>foo/1</c>.</p> + function <c>c/1</c>.</p> <p><c>shell_default</c> is intended for "system wide" customizations to the shell. <c>user_default</c> is intended for diff --git a/lib/stdlib/src/edlin_expand.erl b/lib/stdlib/src/edlin_expand.erl index ec64470461..5f821caef0 100644 --- a/lib/stdlib/src/edlin_expand.erl +++ b/lib/stdlib/src/edlin_expand.erl @@ -118,7 +118,7 @@ format_col([A|T], Width, Len, Acc0) -> {H1, _} -> H1; H2 -> H2 end, - Acc = [io_lib:format("~-*s", [Width,H]) | Acc0], + Acc = [io_lib:format("~-*ts", [Width,H]) | Acc0], format_col(T, Width, Len+Width, Acc); format_col([], _, _, Acc) -> lists:reverse(Acc, "\n"). diff --git a/lib/stdlib/src/erl_parse.yrl b/lib/stdlib/src/erl_parse.yrl index 85b2816451..4f38256e6b 100644 --- a/lib/stdlib/src/erl_parse.yrl +++ b/lib/stdlib/src/erl_parse.yrl @@ -612,11 +612,11 @@ Erlang code. | af_bin(abstract_expr()) | af_binary_op(abstract_expr()) | af_unary_op(abstract_expr()) - | af_record_access(abstract_expr()) + | af_record_creation(abstract_expr()) | af_record_update(abstract_expr()) | af_record_index() | af_record_field_access(abstract_expr()) - | af_map_access(abstract_expr()) + | af_map_creation(abstract_expr()) | af_map_update(abstract_expr()) | af_catch() | af_local_call() @@ -720,26 +720,25 @@ Erlang code. | af_bin(af_guard_test()) | af_binary_op(af_guard_test()) | af_unary_op(af_guard_test()) - | af_record_access(af_guard_test()) + | af_record_creation(af_guard_test()) | af_record_index() | af_record_field_access(af_guard_test()) - | af_map_access(abstract_expr()) % FIXME - | af_map_update(abstract_expr()) % FIXME + | af_map_creation(abstract_expr()) + | af_map_update(abstract_expr()) | af_guard_call() | af_remote_guard_call(). -type af_record_field_access(T) :: {'record_field', anno(), T, record_name(), af_field_name()}. --type af_map_access(T) :: {'map', anno(), [af_map_field(T)]}. - --type af_map_update(T) :: {'map', anno(), T, [af_map_field(T)]}. +-type af_map_creation(T) :: {'map', anno(), [af_assoc(T)]}. --type af_map_field(T) :: af_map_field_assoc(T) | af_map_field_exact(T). +-type af_map_update(T) :: {'map', anno(), T, [af_assoc(T)]}. --type af_map_field_assoc(T) :: {'map_field_assoc', anno(), T, T}. +-type af_assoc(T) :: {'map_field_assoc', anno(), T, T} + | af_assoc_exact(T). --type af_map_field_exact(T) :: {'map_field_exact', anno(), T, T}. +-type af_assoc_exact(T) :: {'map_field_exact', anno(), T, T}. -type af_guard_call() :: {'call', anno(), function_name(), [af_guard_test()]}. @@ -757,20 +756,20 @@ Erlang code. | af_bin(af_pattern()) | af_binary_op(af_pattern()) | af_unary_op(af_pattern()) - | af_record_access(af_pattern()) + | af_record_creation(af_pattern()) | af_record_index() | af_map_pattern(). -type af_record_index() :: {'record_index', anno(), record_name(), af_field_name()}. --type af_record_access(T) :: +-type af_record_creation(T) :: {'record', anno(), record_name(), [af_record_field(T)]}. -type af_record_field(T) :: {'record_field', anno(), af_field_name(), T}. -type af_map_pattern() :: - {'map', anno(), [af_map_field_exact(abstract_expr)]}. % FIXME? + {'map', anno(), [af_assoc_exact(abstract_expr)]}. -type abstract_type() :: af_annotated_type() | af_atom() @@ -807,9 +806,9 @@ Erlang code. {'type', anno(), 'range', [af_singleton_integer_type()]}. -type af_map_type() :: {'type', anno(), 'map', 'any'} - | {'type', anno(), 'map', [af_map_pair_type()]}. + | {'type', anno(), 'map', [af_assoc_type()]}. --type af_map_pair_type() :: +-type af_assoc_type() :: {'type', anno(), 'map_field_assoc', [abstract_type()]} | {'type', anno(), 'map_field_exact', [abstract_type()]}. diff --git a/lib/stdlib/src/gen_statem.erl b/lib/stdlib/src/gen_statem.erl index 3b3477b282..018aca90e6 100644 --- a/lib/stdlib/src/gen_statem.erl +++ b/lib/stdlib/src/gen_statem.erl @@ -44,15 +44,20 @@ -export( [wakeup_from_hibernate/3]). -%% Type exports for templates +%% Type exports for templates and callback modules -export_type( [event_type/0, - callback_mode/0, + init_result/0, + callback_mode_result/0, state_function_result/0, handle_event_result/0, + state_enter_result/1, + event_handler_result/1, + reply_action/0, + enter_action/0, action/0]). -%% Fix problem for doc build +%% Type that is exported just to be documented -export_type([transition_option/0]). %%%========================================================================== @@ -63,7 +68,7 @@ {To :: pid(), Tag :: term()}. % Reply-to specifier for call -type state() :: - state_name() | % For StateName/3 callback functios + state_name() | % For StateName/3 callback functions term(). % For handle_event/4 callback function -type state_name() :: atom(). @@ -72,12 +77,16 @@ -type event_type() :: {'call',From :: from()} | 'cast' | - 'info' | 'timeout' | 'internal'. + 'info' | 'timeout' | 'state_timeout' | 'internal'. +-type callback_mode_result() :: + callback_mode() | [callback_mode() | state_enter()]. -type callback_mode() :: 'state_functions' | 'handle_event_function'. +-type state_enter() :: 'state_enter'. -type transition_option() :: - postpone() | hibernate() | event_timeout(). + postpone() | hibernate() | + event_timeout() | state_timeout(). -type postpone() :: %% If 'true' postpone the current event %% and retry it when the state changes (=/=) @@ -89,6 +98,10 @@ %% Generate a ('timeout', EventContent, ...) event after Time %% unless some other event is delivered Time :: timeout(). +-type state_timeout() :: + %% Generate a ('state_timeout', EventContent, ...) event after Time + %% unless the state is changed + Time :: timeout(). -type action() :: %% During a state change: @@ -96,7 +109,7 @@ %% * All action()s are executed in order of apperance. %% * Postponing the current event is performed %% iff 'postpone' is 'true'. - %% * A state timer is started iff 'timeout' is set. + %% * A state timeout is started iff 'timeout' is set. %% * Pending events are handled or if there are %% no pending events the server goes into receive %% or hibernate (iff 'hibernate' is 'true') @@ -108,44 +121,67 @@ 'postpone' | % Set the postpone option {'postpone', Postpone :: postpone()} | %% + %% All 'next_event' events are kept in a list and then + %% inserted at state changes so the first in the + %% action() list is the first to be delivered. + {'next_event', % Insert event as the next to handle + EventType :: event_type(), + EventContent :: term()} | + enter_action(). +-type enter_action() :: 'hibernate' | % Set the hibernate option {'hibernate', Hibernate :: hibernate()} | %% (Timeout :: event_timeout()) | % {timeout,Timeout} - {'timeout', % Set the event timeout option + {'timeout', % Set the event_timeout option Time :: event_timeout(), EventContent :: term()} | + {'state_timeout', % Set the state_timeout option + Time :: state_timeout(), EventContent :: term()} | %% - reply_action() | - %% - %% All 'next_event' events are kept in a list and then - %% inserted at state changes so the first in the - %% action() list is the first to be delivered. - {'next_event', % Insert event as the next to handle - EventType :: event_type(), - EventContent :: term()}. + reply_action(). -type reply_action() :: {'reply', % Reply to a caller From :: from(), Reply :: term()}. +-type init_result() :: + {ok, state(), data()} | + {ok, state(), data(), [action()] | action()} | + 'ignore' | + {'stop', Reason :: term()}. + +%% Old, not advertised -type state_function_result() :: - {'next_state', % {next_state,NextStateName,NewData,[]} - NextStateName :: state_name(), + event_handler_result(state_name()). +-type handle_event_result() :: + event_handler_result(state()). +%% +-type state_enter_result(State) :: + {'next_state', % {next_state,NextState,NewData,[]} + State, NewData :: data()} | {'next_state', % State transition, maybe to the same state - NextStateName :: state_name(), + State, NewData :: data(), - Actions :: [action()] | action()} | - common_state_callback_result(). --type handle_event_result() :: + Actions :: [enter_action()] | enter_action()} | + state_callback_result(enter_action()). +-type event_handler_result(StateType) :: {'next_state', % {next_state,NextState,NewData,[]} - NextState :: state(), + NextState :: StateType, NewData :: data()} | {'next_state', % State transition, maybe to the same state - NextState :: state(), + NextState :: StateType, NewData :: data(), Actions :: [action()] | action()} | - common_state_callback_result(). --type common_state_callback_result() :: + state_callback_result(action()). +-type state_callback_result(ActionType) :: + {'keep_state', % {keep_state,NewData,[]} + NewData :: data()} | + {'keep_state', % Keep state, change data + NewData :: data(), + Actions :: [ActionType] | ActionType} | + 'keep_state_and_data' | % {keep_state_and_data,[]} + {'keep_state_and_data', % Keep state and data -> only actions + Actions :: [ActionType] | ActionType} | 'stop' | % {stop,normal} {'stop', % Stop the server Reason :: term()} | @@ -158,32 +194,20 @@ {'stop_and_reply', % Reply then stop the server Reason :: term(), Replies :: [reply_action()] | reply_action(), - NewData :: data()} | - {'keep_state', % {keep_state,NewData,[]} - NewData :: data()} | - {'keep_state', % Keep state, change data - NewData :: data(), - Actions :: [action()] | action()} | - 'keep_state_and_data' | % {keep_state_and_data,[]} - {'keep_state_and_data', % Keep state and data -> only actions - Actions :: [action()] | action()}. + NewData :: data()}. %% The state machine init function. It is called only once and %% the server is not running until this function has returned %% an {ok, ...} tuple. Thereafter the state callbacks are called %% for all events to this server. --callback init(Args :: term()) -> - {ok, state(), data()} | - {ok, state(), data(), [action()] | action()} | - 'ignore' | - {'stop', Reason :: term()}. +-callback init(Args :: term()) -> init_result(). %% This callback shall return the callback mode of the callback module. %% %% It is called once after init/0 and code_change/4 but before %% the first state callback StateName/3 or handle_event/4. --callback callback_mode() -> callback_mode(). +-callback callback_mode() -> callback_mode_result(). %% Example state callback for StateName = 'state_name' %% when callback_mode() =:= state_functions. @@ -194,19 +218,28 @@ %% StateName/3 callbacks and terminate/3, so the state name %% 'terminate' is unusable in this mode. -callback state_name( - event_type(), + 'enter', + OldStateName :: state_name(), + Data :: data()) -> + state_enter_result('state_name'); + (event_type(), EventContent :: term(), Data :: data()) -> - state_function_result(). + event_handler_result(state_name()). %% %% State callback for all states %% when callback_mode() =:= handle_event_function. -callback handle_event( - event_type(), + 'enter', + OldState :: state(), + State, % Current state + Data :: data()) -> + state_enter_result(State); + (event_type(), EventContent :: term(), State :: state(), % Current state Data :: data()) -> - handle_event_result(). + event_handler_result(state()). %% Clean up before the server terminates. -callback terminate( @@ -385,53 +418,79 @@ call(ServerRef, Request) -> -spec call( ServerRef :: server_ref(), Request :: term(), - Timeout :: timeout()) -> + Timeout :: + timeout() | + {'clean_timeout',T :: timeout()} | + {'dirty_timeout',T :: timeout()}) -> Reply :: term(). -call(ServerRef, Request, infinity) -> - try gen:call(ServerRef, '$gen_call', Request, infinity) of - {ok,Reply} -> - Reply - catch - Class:Reason -> - erlang:raise( - Class, - {Reason,{?MODULE,call,[ServerRef,Request,infinity]}}, - erlang:get_stacktrace()) - end; call(ServerRef, Request, Timeout) -> - %% Call server through proxy process to dodge any late reply - Ref = make_ref(), - Self = self(), - Pid = spawn( - fun () -> - Self ! - try gen:call( - ServerRef, '$gen_call', Request, Timeout) of - Result -> - {Ref,Result} - catch Class:Reason -> - {Ref,Class,Reason,erlang:get_stacktrace()} - end - end), - Mref = monitor(process, Pid), - receive - {Ref,Result} -> - demonitor(Mref, [flush]), - case Result of + case parse_timeout(Timeout) of + {dirty_timeout,T} -> + try gen:call(ServerRef, '$gen_call', Request, T) of {ok,Reply} -> Reply + catch + Class:Reason -> + erlang:raise( + Class, + {Reason,{?MODULE,call,[ServerRef,Request,Timeout]}}, + erlang:get_stacktrace()) + end; + {clean_timeout,T} -> + %% Call server through proxy process to dodge any late reply + Ref = make_ref(), + Self = self(), + Pid = spawn( + fun () -> + Self ! + try gen:call( + ServerRef, '$gen_call', Request, T) of + Result -> + {Ref,Result} + catch Class:Reason -> + {Ref,Class,Reason, + erlang:get_stacktrace()} + end + end), + Mref = monitor(process, Pid), + receive + {Ref,Result} -> + demonitor(Mref, [flush]), + case Result of + {ok,Reply} -> + Reply + end; + {Ref,Class,Reason,Stacktrace} -> + demonitor(Mref, [flush]), + erlang:raise( + Class, + {Reason,{?MODULE,call,[ServerRef,Request,Timeout]}}, + Stacktrace); + {'DOWN',Mref,_,_,Reason} -> + %% There is a theoretical possibility that the + %% proxy process gets killed between try--of and ! + %% so this clause is in case of that + exit(Reason) end; - {Ref,Class,Reason,Stacktrace} -> - demonitor(Mref, [flush]), - erlang:raise( - Class, - {Reason,{?MODULE,call,[ServerRef,Request,Timeout]}}, - Stacktrace); - {'DOWN',Mref,_,_,Reason} -> - %% There is a theoretical possibility that the - %% proxy process gets killed between try--of and ! - %% so this clause is in case of that - exit(Reason) + Error when is_atom(Error) -> + erlang:error(Error, [ServerRef,Request,Timeout]) + end. + +parse_timeout(Timeout) -> + case Timeout of + {clean_timeout,infinity} -> + {dirty_timeout,infinity}; + {clean_timeout,_} -> + Timeout; + {dirty_timeout,_} -> + Timeout; + {_,_} -> + %% Be nice and throw a badarg for speling errors + badarg; + infinity -> + {dirty_timeout,infinity}; + T -> + {clean_timeout,T} end. %% Reply from a state machine callback to whom awaits in call/2 @@ -517,8 +576,9 @@ enter(Module, Opts, State, Data, Server, Actions, Parent) -> %% The values should already have been type checked Name = gen:get_proc_name(Server), Debug = gen:debug_options(Name, Opts), - P = Events = [], - Event = {internal,initial_state}, + Events = [], + P = [], + Event = {internal,init_state}, %% We enforce {postpone,false} to ensure that %% our fake Event gets discarded, thought it might get logged NewActions = @@ -530,19 +590,32 @@ enter(Module, Opts, State, Data, Server, Actions, Parent) -> end, S = #{ callback_mode => undefined, + state_enter => false, module => Module, name => Name, - %% All fields below will be replaced according to the arguments to - %% loop_event_actions/10 when it finally loops back to loop/3 state => State, data => Data, postponed => P, - hibernate => false, - timer => undefined}, + %% The rest of the fields are set from to the arguments to + %% loop_event_actions/10 when it finally loops back to loop/3 + %% in loop_events/10 + %% + %% Marker for initial state, cleared immediately when used + init_state => true + }, NewDebug = sys_debug(Debug, S, State, {enter,Event,State}), - loop_event_actions( - Parent, NewDebug, S, Events, - State, Data, P, Event, State, NewActions). + case call_callback_mode(S) of + {ok,NewS} -> + TimerRefs = #{}, + TimerTypes = #{}, + loop_event_actions( + Parent, NewDebug, NewS, TimerRefs, TimerTypes, + Events, Event, State, Data, NewActions); + {Class,Reason,Stacktrace} -> + terminate( + Class, Reason, Stacktrace, + NewDebug, S, [Event|Events]) + end. %%%========================================================================== %%% gen callbacks @@ -563,7 +636,9 @@ init_it(Starter, Parent, ServerRef, Module, Args, Opts) -> proc_lib:init_ack(Starter, {error,Reason}), error_info( Class, Reason, Stacktrace, - #{name => Name, callback_mode => undefined}, + #{name => Name, + callback_mode => undefined, + state_enter => false}, [], [], undefined), erlang:raise(Class, Reason, Stacktrace) end. @@ -594,7 +669,9 @@ init_result(Starter, Parent, ServerRef, Module, Result, Opts) -> proc_lib:init_ack(Starter, {error,Error}), error_info( error, Error, ?STACKTRACE(), - #{name => Name, callback_mode => undefined}, + #{name => Name, + callback_mode => undefined, + state_enter => false}, [], [], undefined), exit(Error) end. @@ -605,12 +682,10 @@ init_result(Starter, Parent, ServerRef, Module, Result, Opts) -> system_continue(Parent, Debug, S) -> loop(Parent, Debug, S). -system_terminate( - Reason, _Parent, Debug, - #{state := State, data := Data, postponed := P} = S) -> +system_terminate(Reason, _Parent, Debug, S) -> terminate( exit, Reason, ?STACKTRACE(), - Debug, S, [], State, Data, P). + Debug, S, []). system_code_change( #{module := Module, @@ -647,7 +722,7 @@ system_replace_state( format_status( Opt, [PDict,SysState,Parent,Debug, - #{name := Name, postponed := P, state := State, data := Data} = S]) -> + #{name := Name, postponed := P} = S]) -> Header = gen:format_status_header("Status for state machine", Name), Log = sys:get_debug(log, Debug, []), [{header,Header}, @@ -656,7 +731,7 @@ format_status( {"Parent",Parent}, {"Logged Events",Log}, {"Postponed",P}]} | - case format_status(Opt, PDict, S, State, Data) of + case format_status(Opt, PDict, S) of L when is_list(L) -> L; T -> [T] end]. @@ -674,6 +749,10 @@ print_event(Dev, {out,Reply,{To,_Tag}}, {Name,State}) -> io:format( Dev, "*DBG* ~p send ~p to ~p from state ~p~n", [Name,Reply,To,State]); +print_event(Dev, {terminate,Reason}, {Name,State}) -> + io:format( + Dev, "*DBG* ~p terminate ~p in state ~p~n", + [Name,Reason,State]); print_event(Dev, {Tag,Event,NextState}, {Name,State}) -> StateString = case NextState of @@ -732,7 +811,8 @@ loop(Parent, Debug, #{hibernate := Hibernate} = S) -> end. %% Entry point for wakeup_from_hibernate/3 -loop_receive(Parent, Debug, #{timer := Timer} = S) -> +loop_receive( + Parent, Debug, #{timer_refs := TimerRefs, timer_types := TimerTypes} = S) -> receive Msg -> case Msg of @@ -743,34 +823,28 @@ loop_receive(Parent, Debug, #{timer := Timer} = S) -> sys:handle_system_msg( Req, Pid, Parent, ?MODULE, Debug, S, Hibernate); {'EXIT',Parent,Reason} = EXIT -> - #{state := State, data := Data, postponed := P} = S, %% EXIT is not a 2-tuple and therefore %% not an event and has no event_type(), %% but this will stand out in the crash report... terminate( - exit, Reason, ?STACKTRACE(), - Debug, S, [EXIT], State, Data, P); - {timeout,Timer,Content} when Timer =/= undefined -> - loop_receive_result( - Parent, Debug, S, {timeout,Content}); - _ -> - %% Cancel Timer if running - case Timer of - undefined -> - ok; + exit, Reason, ?STACKTRACE(), Debug, S, [EXIT]); + {timeout,TimerRef,TimerMsg} -> + case TimerRefs of + #{TimerRef := TimerType} -> + Event = {TimerType,TimerMsg}, + %% Unregister the triggered timeout + loop_receive_result( + Parent, Debug, S, + maps:remove(TimerRef, TimerRefs), + maps:remove(TimerType, TimerTypes), + Event); _ -> - case erlang:cancel_timer(Timer) of - TimeLeft when is_integer(TimeLeft) -> - ok; - false -> - receive - {timeout,Timer,_} -> - ok - after 0 -> - ok - end - end - end, + Event = {info,Msg}, + loop_receive_result( + Parent, Debug, S, + TimerRefs, TimerTypes, Event) + end; + _ -> Event = case Msg of {'$gen_call',From,Request} -> @@ -780,112 +854,303 @@ loop_receive(Parent, Debug, #{timer := Timer} = S) -> _ -> {info,Msg} end, - loop_receive_result(Parent, Debug, S, Event) + loop_receive_result( + Parent, Debug, S, + TimerRefs, TimerTypes, Event) end end. loop_receive_result( - Parent, Debug, - #{state := State, - data := Data, - postponed := P} = S, - Event) -> - %% The engine state map S is now dismantled - %% and will not be restored until we return to loop/3. - %% - %% The fields 'callback_mode', 'module', and 'name' are still valid. - %% The fields 'state', 'data', and 'postponed' are held in arguments. - %% The fields 'timer' and 'hibernate' will be recalculated. + Parent, Debug, #{state := State} = S, + TimerRefs, TimerTypes, Event) -> + %% The fields 'timer_refs', 'timer_types' and 'hibernate' + %% are now invalid in state map S - they will be recalculated + %% and restored when we return to loop/3 %% NewDebug = sys_debug(Debug, S, State, {in,Event}), %% Here the queue of not yet handled events is created Events = [], Hibernate = false, loop_event( - Parent, NewDebug, S, Events, State, Data, P, Event, Hibernate). + Parent, NewDebug, S, TimerRefs, TimerTypes, Events, Event, Hibernate). -%% Process the event queue, or if it is empty -%% loop back to loop/3 to receive a new event -loop_events( - Parent, Debug, S, [Event|Events], - State, Data, P, Hibernate, _Timeout) -> +%% Entry point for handling an event, received or enqueued +loop_event( + Parent, Debug, #{state := State, data := Data} = S, TimerRefs, TimerTypes, + Events, {Type,Content} = Event, Hibernate) -> %% - %% If there was a state timer requested we just ignore that - %% since we have events to handle which cancels the timer - loop_event( - Parent, Debug, S, Events, State, Data, P, Event, Hibernate); -loop_events( - Parent, Debug, S, [], - State, Data, P, Hibernate, Timeout) -> - case Timeout of - {timeout,0,EventContent} -> - %% Immediate timeout - simulate it - %% so we do not get the timeout message - %% after any received event - loop_event( - Parent, Debug, S, [], - State, Data, P, {timeout,EventContent}, Hibernate); - {timeout,Time,EventContent} -> - %% Actually start a timer - Timer = erlang:start_timer(Time, self(), EventContent), - loop_events_done( - Parent, Debug, S, Timer, State, Data, P, Hibernate); - undefined -> - %% No state timeout has been requested - Timer = undefined, - loop_events_done( - Parent, Debug, S, Timer, State, Data, P, Hibernate) + %% If Hibernate is true here it can only be + %% because it was set from an event action + %% and we did not go into hibernation since there + %% were events in queue, so we do what the user + %% might rely on i.e collect garbage which + %% would have happened if we actually hibernated + %% and immediately was awakened + Hibernate andalso garbage_collect(), + case call_state_function(S, Type, Content, State, Data) of + {ok,Result,NewS} -> + %% Cancel event timeout + {NewTimerRefs,NewTimerTypes} = + cancel_timer_by_type( + timeout, TimerRefs, TimerTypes), + {NewData,NextState,Actions} = + parse_event_result( + true, Debug, NewS, Result, + Events, Event, State, Data), + loop_event_actions( + Parent, Debug, S, NewTimerRefs, NewTimerTypes, + Events, Event, NextState, NewData, Actions); + {Class,Reason,Stacktrace} -> + terminate( + Class, Reason, Stacktrace, Debug, S, [Event|Events]) end. + +loop_event_actions( + Parent, Debug, + #{state := State, state_enter := StateEnter} = S, TimerRefs, TimerTypes, + Events, Event, NextState, NewData, Actions) -> + case parse_actions(Debug, S, State, Actions) of + {ok,NewDebug,Hibernate,TimeoutsR,Postpone,NextEventsR} -> + if + StateEnter, NextState =/= State -> + loop_event_enter( + Parent, NewDebug, S, TimerRefs, TimerTypes, + Events, Event, NextState, NewData, + Hibernate, TimeoutsR, Postpone, NextEventsR); + StateEnter -> + case maps:is_key(init_state, S) of + true -> + %% Avoid infinite loop in initial state + %% with state entry events + NewS = maps:remove(init_state, S), + loop_event_enter( + Parent, NewDebug, NewS, TimerRefs, TimerTypes, + Events, Event, NextState, NewData, + Hibernate, TimeoutsR, Postpone, NextEventsR); + false -> + loop_event_result( + Parent, NewDebug, S, TimerRefs, TimerTypes, + Events, Event, NextState, NewData, + Hibernate, TimeoutsR, Postpone, NextEventsR) + end; + true -> + loop_event_result( + Parent, NewDebug, S, TimerRefs, TimerTypes, + Events, Event, NextState, NewData, + Hibernate, TimeoutsR, Postpone, NextEventsR) + end; + {Class,Reason,Stacktrace} -> + terminate( + Class, Reason, Stacktrace, + Debug, S#{data := NewData}, [Event|Events]) + end. + +loop_event_enter( + Parent, Debug, #{state := State} = S, TimerRefs, TimerTypes, + Events, Event, NextState, NewData, + Hibernate, TimeoutsR, Postpone, NextEventsR) -> + case call_state_function(S, enter, State, NextState, NewData) of + {ok,Result,NewS} -> + {NewerData,_,Actions} = + parse_event_result( + false, Debug, NewS, Result, + Events, Event, NextState, NewData), + loop_event_enter_actions( + Parent, Debug, NewS, TimerRefs, TimerTypes, + Events, Event, NextState, NewerData, + Hibernate, TimeoutsR, Postpone, NextEventsR, Actions); + {Class,Reason,Stacktrace} -> + terminate( + Class, Reason, Stacktrace, + Debug, S#{state := NextState, data := NewData}, + [Event|Events]) + end. + +loop_event_enter_actions( + Parent, Debug, S, TimerRefs, TimerTypes, + Events, Event, NextState, NewData, + Hibernate, TimeoutsR, Postpone, NextEventsR, Actions) -> + case + parse_enter_actions( + Debug, S, NextState, Actions, + Hibernate, TimeoutsR) + of + {ok,NewDebug,NewHibernate,NewTimeoutsR,_,_} -> + loop_event_result( + Parent, NewDebug, S, TimerRefs, TimerTypes, + Events, Event, NextState, NewData, + NewHibernate, NewTimeoutsR, Postpone, NextEventsR); + {Class,Reason,Stacktrace} -> + terminate( + Class, Reason, Stacktrace, + Debug, S#{state := NextState, data := NewData}, + [Event|Events]) + end. + +loop_event_result( + Parent, Debug, + #{state := State, postponed := P_0} = S, TimerRefs_0, TimerTypes_0, + Events, Event, NextState, NewData, + Hibernate, TimeoutsR, Postpone, NextEventsR) -> + %% + %% All options have been collected and next_events are buffered. + %% Do the actual state transition. + %% + {NewDebug,P_1} = % Move current event to postponed if Postpone + case Postpone of + true -> + {sys_debug(Debug, S, State, {postpone,Event,State}), + [Event|P_0]}; + false -> + {sys_debug(Debug, S, State, {consume,Event,State}), + P_0} + end, + {Events_1,NewP,{TimerRefs_1,TimerTypes_1}} = + %% Move all postponed events to queue and cancel the + %% state timeout if the state changes + if + NextState =:= State -> + {Events,P_1,{TimerRefs_0,TimerTypes_0}}; + true -> + {lists:reverse(P_1, Events),[], + cancel_timer_by_type( + state_timeout, TimerRefs_0, TimerTypes_0)} + end, + {TimerRefs_2,TimerTypes_2,TimeoutEvents} = + %% Stop and start timers non-event timers + parse_timers(TimerRefs_1, TimerTypes_1, TimeoutsR), + %% Place next events last in reversed queue + Events_2R = lists:reverse(Events_1, NextEventsR), + %% Enqueue immediate timeout events and start event timer + {NewTimerRefs,NewTimerTypes,Events_3R} = + process_timeout_events( + TimerRefs_2, TimerTypes_2, TimeoutEvents, Events_2R), + NewEvents = lists:reverse(Events_3R), + loop_events( + Parent, NewDebug, S, NewTimerRefs, NewTimerTypes, + NewEvents, Hibernate, NextState, NewData, NewP). + +%% Loop until out of enqueued events %% -loop_events_done(Parent, Debug, S, Timer, State, Data, P, Hibernate) -> +loop_events( + Parent, Debug, S, TimerRefs, TimerTypes, + [] = _Events, Hibernate, State, Data, P) -> + %% Update S and loop back to loop/3 to receive a new event NewS = S#{ state := State, data := Data, postponed := P, - hibernate := Hibernate, - timer := Timer}, - loop(Parent, Debug, NewS). + hibernate => Hibernate, + timer_refs => TimerRefs, + timer_types => TimerTypes}, + loop(Parent, Debug, NewS); +loop_events( + Parent, Debug, S, TimerRefs, TimerTypes, + [Event|Events], Hibernate, State, Data, P) -> + %% Update S and continue with enqueued events + NewS = + S#{ + state := State, + data := Data, + postponed := P}, + loop_event( + Parent, Debug, NewS, TimerRefs, TimerTypes, Events, Event, Hibernate). -loop_event( - Parent, Debug, + + +%%--------------------------------------------------------------------------- +%% Server loop helpers + +call_callback_mode(#{module := Module} = S) -> + try Module:callback_mode() of + CallbackMode -> + callback_mode_result(S, CallbackMode) + catch + CallbackMode -> + callback_mode_result(S, CallbackMode); + error:undef -> + %% Process undef to check for the simple mistake + %% of calling a nonexistent state function + %% to make the undef more precise + case erlang:get_stacktrace() of + [{Module,callback_mode,[]=Args,_} + |Stacktrace] -> + {error, + {undef_callback,{Module,callback_mode,Args}}, + Stacktrace}; + Stacktrace -> + {error,undef,Stacktrace} + end; + Class:Reason -> + {Class,Reason,erlang:get_stacktrace()} + end. + +callback_mode_result(S, CallbackMode) -> + case + parse_callback_mode( + if + is_atom(CallbackMode) -> + [CallbackMode]; + true -> + CallbackMode + end, undefined, false) + of + {undefined,_} -> + {error, + {bad_return_from_callback_mode,CallbackMode}, + ?STACKTRACE()}; + {CBMode,StateEnter} -> + {ok, + S#{ + callback_mode := CBMode, + state_enter := StateEnter}} + end. + +parse_callback_mode([], CBMode, StateEnter) -> + {CBMode,StateEnter}; +parse_callback_mode([H|T], CBMode, StateEnter) -> + case callback_mode(H) of + true -> + parse_callback_mode(T, H, StateEnter); + false -> + case H of + state_enter -> + parse_callback_mode(T, CBMode, true); + _ -> + {undefined,StateEnter} + end + end; +parse_callback_mode(_, _CBMode, StateEnter) -> + {undefined,StateEnter}. + + +call_state_function( + #{callback_mode := undefined} = S, + Type, Content, State, Data) -> + case call_callback_mode(S) of + {ok,NewS} -> + call_state_function(NewS, Type, Content, State, Data); + Error -> + Error + end; +call_state_function( #{callback_mode := CallbackMode, module := Module} = S, - Events, - State, Data, P, {Type,Content} = Event, Hibernate) -> - %% - %% If Hibernate is true here it can only be - %% because it was set from an event action - %% and we did not go into hibernation since there - %% were events in queue, so we do what the user - %% might depend on i.e collect garbage which - %% would have happened if we actually hibernated - %% and immediately was awakened - Hibernate andalso garbage_collect(), - %% + Type, Content, State, Data) -> try case CallbackMode of - undefined -> - Module:callback_mode(); state_functions -> erlang:apply(Module, State, [Type,Content,Data]); handle_event_function -> Module:handle_event(Type, Content, State, Data) end of - Result when CallbackMode =:= undefined -> - loop_event_callback_mode( - Parent, Debug, S, Events, State, Data, P, Event, Result); Result -> - loop_event_result( - Parent, Debug, S, Events, State, Data, P, Event, Result) + {ok,Result,S} catch - Result when CallbackMode =:= undefined -> - loop_event_callback_mode( - Parent, Debug, S, Events, State, Data, P, Event, Result); Result -> - loop_event_result( - Parent, Debug, S, Events, State, Data, P, Event, Result); + {ok,Result,S}; error:badarg -> case erlang:get_stacktrace() of [{erlang,apply, @@ -895,329 +1160,323 @@ loop_event( when CallbackMode =:= state_functions -> %% We get here e.g if apply fails %% due to State not being an atom - terminate( - error, - {undef_state_function,{Module,State,Args}}, - Stacktrace, - Debug, S, [Event|Events], State, Data, P); + {error, + {undef_state_function,{Module,State,Args}}, + Stacktrace}; Stacktrace -> - terminate( - error, badarg, Stacktrace, - Debug, S, [Event|Events], State, Data, P) + {error,badarg,Stacktrace} end; error:undef -> %% Process undef to check for the simple mistake %% of calling a nonexistent state function %% to make the undef more precise case erlang:get_stacktrace() of - [{Module,callback_mode,[]=Args,_} - |Stacktrace] - when CallbackMode =:= undefined -> - terminate( - error, - {undef_callback,{Module,callback_mode,Args}}, - Stacktrace, - Debug, S, [Event|Events], State, Data, P); [{Module,State,[Type,Content,Data]=Args,_} |Stacktrace] when CallbackMode =:= state_functions -> - terminate( - error, - {undef_state_function,{Module,State,Args}}, - Stacktrace, - Debug, S, [Event|Events], State, Data, P); + {error, + {undef_state_function,{Module,State,Args}}, + Stacktrace}; [{Module,handle_event,[Type,Content,State,Data]=Args,_} |Stacktrace] when CallbackMode =:= handle_event_function -> - terminate( - error, - {undef_state_function,{Module,handle_event,Args}}, - Stacktrace, - Debug, S, [Event|Events], State, Data, P); + {error, + {undef_state_function,{Module,handle_event,Args}}, + Stacktrace}; Stacktrace -> - terminate( - error, undef, Stacktrace, - Debug, S, [Event|Events], State, Data, P) + {error,undef,Stacktrace} end; Class:Reason -> - Stacktrace = erlang:get_stacktrace(), - terminate( - Class, Reason, Stacktrace, - Debug, S, [Event|Events], State, Data, P) + {Class,Reason,erlang:get_stacktrace()} end. -%% Interpret callback_mode() result -loop_event_callback_mode( - Parent, Debug, S, Events, State, Data, P, Event, CallbackMode) -> - case callback_mode(CallbackMode) of - true -> - Hibernate = false, % We have already GC:ed recently - loop_event( - Parent, Debug, - S#{callback_mode := CallbackMode}, - Events, - State, Data, P, Event, Hibernate); - false -> - terminate( - error, - {bad_return_from_callback_mode,CallbackMode}, - ?STACKTRACE(), - Debug, S, [Event|Events], State, Data, P) - end. %% Interpret all callback return variants -loop_event_result( - Parent, Debug, S, Events, State, Data, P, Event, Result) -> +parse_event_result( + AllowStateChange, Debug, S, Result, Events, Event, State, Data) -> case Result of stop -> terminate( - exit, normal, ?STACKTRACE(), - Debug, S, [Event|Events], State, Data, P); + exit, normal, ?STACKTRACE(), Debug, S, [Event|Events]); {stop,Reason} -> terminate( - exit, Reason, ?STACKTRACE(), - Debug, S, [Event|Events], State, Data, P); + exit, Reason, ?STACKTRACE(), Debug, S, [Event|Events]); {stop,Reason,NewData} -> terminate( exit, Reason, ?STACKTRACE(), - Debug, S, [Event|Events], State, NewData, P); + Debug, S#{data := NewData}, [Event|Events]); {stop_and_reply,Reason,Replies} -> Q = [Event|Events], reply_then_terminate( exit, Reason, ?STACKTRACE(), - Debug, S, Q, State, Data, P, Replies); + Debug, S, Q, Replies); {stop_and_reply,Reason,Replies,NewData} -> Q = [Event|Events], reply_then_terminate( exit, Reason, ?STACKTRACE(), - Debug, S, Q, State, NewData, P, Replies); - {next_state,NextState,NewData} -> - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, []); - {next_state,NextState,NewData,Actions} -> - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, Actions); + Debug, S#{data := NewData}, Q, Replies); + {next_state,State,NewData} -> + {NewData,State,[]}; + {next_state,NextState,NewData} when AllowStateChange -> + {NewData,NextState,[]}; + {next_state,State,NewData,Actions} -> + {NewData,State,Actions}; + {next_state,NextState,NewData,Actions} when AllowStateChange -> + {NewData,NextState,Actions}; {keep_state,NewData} -> - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, State, []); + {NewData,State,[]}; {keep_state,NewData,Actions} -> - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, State, Actions); + {NewData,State,Actions}; keep_state_and_data -> - loop_event_actions( - Parent, Debug, S, Events, - State, Data, P, Event, State, []); + {Data,State,[]}; {keep_state_and_data,Actions} -> - loop_event_actions( - Parent, Debug, S, Events, - State, Data, P, Event, State, Actions); + {Data,State,Actions}; _ -> terminate( error, {bad_return_from_state_function,Result}, ?STACKTRACE(), - Debug, S, [Event|Events], State, Data, P) + Debug, S, [Event|Events]) end. -loop_event_actions( - Parent, Debug, S, Events, State, NewData, P, Event, NextState, Actions) -> - Postpone = false, % Shall we postpone this event; boolean() + +parse_enter_actions( + Debug, S, State, Actions, + Hibernate, TimeoutsR) -> + Postpone = forbidden, + NextEventsR = forbidden, + parse_actions( + Debug, S, State, listify(Actions), + Hibernate, TimeoutsR, Postpone, NextEventsR). + +parse_actions(Debug, S, State, Actions) -> Hibernate = false, - Timeout = undefined, - NextEvents = [], - loop_event_actions( - Parent, Debug, S, Events, State, NewData, P, Event, NextState, - if - is_list(Actions) -> - Actions; - true -> - [Actions] - end, - Postpone, Hibernate, Timeout, NextEvents). + TimeoutsR = [], + Postpone = false, + NextEventsR = [], + parse_actions( + Debug, S, State, listify(Actions), + Hibernate, TimeoutsR, Postpone, NextEventsR). %% -%% Process all actions -loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, [Action|Actions], - Postpone, Hibernate, Timeout, NextEvents) -> +parse_actions( + Debug, _S, _State, [], + Hibernate, TimeoutsR, Postpone, NextEventsR) -> + {ok,Debug,Hibernate,TimeoutsR,Postpone,NextEventsR}; +parse_actions( + Debug, S, State, [Action|Actions], + Hibernate, TimeoutsR, Postpone, NextEventsR) -> case Action of %% Actual actions {reply,From,Reply} -> case from(From) of true -> NewDebug = do_reply(Debug, S, State, From, Reply), - loop_event_actions( - Parent, NewDebug, S, Events, - State, NewData, P, Event, NextState, Actions, - Postpone, Hibernate, Timeout, NextEvents); + parse_actions( + NewDebug, S, State, Actions, + Hibernate, TimeoutsR, Postpone, NextEventsR); false -> - terminate( - error, - {bad_action_from_state_function,Action}, - ?STACKTRACE(), - Debug, S, [Event|Events], State, NewData, P) - end; - {next_event,Type,Content} -> - case event_type(Type) of - true -> - NewDebug = - sys_debug(Debug, S, State, {in,{Type,Content}}), - loop_event_actions( - Parent, NewDebug, S, Events, - State, NewData, P, Event, NextState, Actions, - Postpone, Hibernate, Timeout, - [{Type,Content}|NextEvents]); - false -> - terminate( - error, - {bad_action_from_state_function,Action}, - ?STACKTRACE(), - Debug, S, [Event|Events], State, NewData, P) + {error, + {bad_action_from_state_function,Action}, + ?STACKTRACE()} end; %% Actions that set options - {postpone,NewPostpone} when is_boolean(NewPostpone) -> - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, Actions, - NewPostpone, Hibernate, Timeout, NextEvents); - {postpone,_} -> - terminate( - error, - {bad_action_from_state_function,Action}, - ?STACKTRACE(), - Debug, S, [Event|Events], State, NewData, P); - postpone -> - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, Actions, - true, Hibernate, Timeout, NextEvents); {hibernate,NewHibernate} when is_boolean(NewHibernate) -> - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, Actions, - Postpone, NewHibernate, Timeout, NextEvents); + parse_actions( + Debug, S, State, Actions, + NewHibernate, TimeoutsR, Postpone, NextEventsR); {hibernate,_} -> - terminate( - error, - {bad_action_from_state_function,Action}, - ?STACKTRACE(), - Debug, S, [Event|Events], State, NewData, P); + {error, + {bad_action_from_state_function,Action}, + ?STACKTRACE()}; hibernate -> - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, Actions, - Postpone, true, Timeout, NextEvents); - {timeout,infinity,_} -> % Clear timer - it will never trigger - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, Actions, - Postpone, Hibernate, undefined, NextEvents); - {timeout,Time,_} = NewTimeout when is_integer(Time), Time >= 0 -> - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, Actions, - Postpone, Hibernate, NewTimeout, NextEvents); + parse_actions( + Debug, S, State, Actions, + true, TimeoutsR, Postpone, NextEventsR); + {state_timeout,Time,_} = StateTimeout + when is_integer(Time), Time >= 0; + Time =:= infinity -> + parse_actions( + Debug, S, State, Actions, + Hibernate, [StateTimeout|TimeoutsR], Postpone, NextEventsR); + {state_timeout,_,_} -> + {error, + {bad_action_from_state_function,Action}, + ?STACKTRACE()}; + {timeout,infinity,_} -> + %% Ignore - timeout will never happen and already cancelled + parse_actions( + Debug, S, State, Actions, + Hibernate, TimeoutsR, Postpone, NextEventsR); + {timeout,Time,_} = Timeout when is_integer(Time), Time >= 0 -> + parse_actions( + Debug, S, State, Actions, + Hibernate, [Timeout|TimeoutsR], Postpone, NextEventsR); {timeout,_,_} -> - terminate( - error, - {bad_action_from_state_function,Action}, - ?STACKTRACE(), - Debug, S, [Event|Events], State, NewData, P); - infinity -> % Clear timer - it will never trigger - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, Actions, - Postpone, Hibernate, undefined, NextEvents); + {error, + {bad_action_from_state_function,Action}, + ?STACKTRACE()}; + infinity -> % Ignore - timeout will never happen + parse_actions( + Debug, S, State, Actions, + Hibernate, TimeoutsR, Postpone, NextEventsR); Time when is_integer(Time), Time >= 0 -> - NewTimeout = {timeout,Time,Time}, - loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P, Event, NextState, Actions, - Postpone, Hibernate, NewTimeout, NextEvents); + Timeout = {timeout,Time,Time}, + parse_actions( + Debug, S, State, Actions, + Hibernate, [Timeout|TimeoutsR], Postpone, NextEventsR); + {postpone,NewPostpone} + when is_boolean(NewPostpone), Postpone =/= forbidden -> + parse_actions( + Debug, S, State, Actions, + Hibernate, TimeoutsR, NewPostpone, NextEventsR); + {postpone,_} -> + {error, + {bad_action_from_state_function,Action}, + ?STACKTRACE()}; + postpone when Postpone =/= forbidden -> + parse_actions( + Debug, S, State, Actions, + Hibernate, TimeoutsR, true, NextEventsR); + {next_event,Type,Content} -> + case event_type(Type) of + true when NextEventsR =/= forbidden -> + NewDebug = + sys_debug(Debug, S, State, {in,{Type,Content}}), + parse_actions( + NewDebug, S, State, Actions, + Hibernate, TimeoutsR, Postpone, + [{Type,Content}|NextEventsR]); + _ -> + {error, + {bad_action_from_state_function,Action}, + ?STACKTRACE()} + end; _ -> - terminate( - error, - {bad_action_from_state_function,Action}, - ?STACKTRACE(), - Debug, S, [Event|Events], State, NewData, P) - end; + {error, + {bad_action_from_state_function,Action}, + ?STACKTRACE()} + end. + + +%% Stop and start timers as well as create timeout zero events +%% and pending event timer %% -%% End of actions list -loop_event_actions( - Parent, Debug, S, Events, - State, NewData, P0, Event, NextState, [], - Postpone, Hibernate, Timeout, NextEvents) -> - %% - %% All options have been collected and next_events are buffered. - %% Do the actual state transition. - %% - P1 = % Move current event to postponed if Postpone - case Postpone of - true -> - [Event|P0]; - false -> - P0 - end, - {Q2,P} = % Move all postponed events to queue if state change - if - NextState =:= State -> - {Events,P1}; - true -> - {lists:reverse(P1, Events),[]} - end, - %% Place next events first in queue - Q = lists:reverse(NextEvents, Q2), - %% - NewDebug = - sys_debug( - Debug, S, State, - case Postpone of - true -> - {postpone,Event,NextState}; - false -> - {consume,Event,NextState} - end), - loop_events( - Parent, NewDebug, S, Q, NextState, NewData, P, Hibernate, Timeout). +%% Stop and start timers non-event timers +parse_timers(TimerRefs, TimerTypes, TimeoutsR) -> + parse_timers(TimerRefs, TimerTypes, TimeoutsR, #{}, []). +%% +parse_timers(TimerRefs, TimerTypes, [], _Seen, TimeoutEvents) -> + {TimerRefs,TimerTypes,TimeoutEvents}; +parse_timers( + TimerRefs, TimerTypes, [Timeout|TimeoutsR], Seen, TimeoutEvents) -> + {TimerType,Time,TimerMsg} = Timeout, + case Seen of + #{TimerType := _} -> + %% Type seen before - ignore + parse_timers( + TimerRefs, TimerTypes, TimeoutsR, Seen, TimeoutEvents); + #{} -> + %% Unseen type - handle + NewSeen = Seen#{TimerType => true}, + %% Cancel any running timer + {NewTimerRefs,NewTimerTypes} = + cancel_timer_by_type(TimerType, TimerRefs, TimerTypes), + if + Time =:= infinity -> + %% Ignore - timer will never fire + parse_timers( + NewTimerRefs, NewTimerTypes, TimeoutsR, + NewSeen, TimeoutEvents); + TimerType =:= timeout -> + %% Handle event timer later + parse_timers( + NewTimerRefs, NewTimerTypes, TimeoutsR, + NewSeen, [Timeout|TimeoutEvents]); + Time =:= 0 -> + %% Handle zero time timeouts later + TimeoutEvent = {TimerType,TimerMsg}, + parse_timers( + NewTimerRefs, NewTimerTypes, TimeoutsR, + NewSeen, [TimeoutEvent|TimeoutEvents]); + true -> + %% Start a new timer + TimerRef = erlang:start_timer(Time, self(), TimerMsg), + parse_timers( + NewTimerRefs#{TimerRef => TimerType}, + NewTimerTypes#{TimerType => TimerRef}, + TimeoutsR, NewSeen, TimeoutEvents) + end + end. + +%% Enqueue immediate timeout events and start event timer +process_timeout_events(TimerRefs, TimerTypes, [], EventsR) -> + {TimerRefs, TimerTypes, EventsR}; +process_timeout_events( + TimerRefs, TimerTypes, + [{timeout,0,TimerMsg}|TimeoutEvents], []) -> + %% No enqueued events - insert a timeout zero event + TimeoutEvent = {timeout,TimerMsg}, + process_timeout_events( + TimerRefs, TimerTypes, + TimeoutEvents, [TimeoutEvent]); +process_timeout_events( + TimerRefs, TimerTypes, + [{timeout,Time,TimerMsg}], []) -> + %% No enqueued events - start event timer + TimerRef = erlang:start_timer(Time, self(), TimerMsg), + process_timeout_events( + TimerRefs#{TimerRef => timeout}, TimerTypes#{timeout => TimerRef}, + [], []); +process_timeout_events( + TimerRefs, TimerTypes, + [{timeout,_Time,_TimerMsg}|TimeoutEvents], EventsR) -> + %% There will be some other event so optimize by not starting + %% an event timer to just have to cancel it again + process_timeout_events( + TimerRefs, TimerTypes, + TimeoutEvents, EventsR); +process_timeout_events( + TimerRefs, TimerTypes, + [{_TimeoutType,_TimeoutMsg} = TimeoutEvent|TimeoutEvents], EventsR) -> + process_timeout_events( + TimerRefs, TimerTypes, + TimeoutEvents, [TimeoutEvent|EventsR]). + + %%--------------------------------------------------------------------------- %% Server helpers reply_then_terminate( Class, Reason, Stacktrace, - Debug, S, Q, State, Data, P, Replies) -> + Debug, #{state := State} = S, Q, Replies) -> if is_list(Replies) -> do_reply_then_terminate( Class, Reason, Stacktrace, - Debug, S, Q, State, Data, P, Replies); + Debug, S, Q, Replies, State); true -> do_reply_then_terminate( Class, Reason, Stacktrace, - Debug, S, Q, State, Data, P, [Replies]) + Debug, S, Q, [Replies], State) end. %% do_reply_then_terminate( - Class, Reason, Stacktrace, Debug, S, Q, State, Data, P, []) -> - terminate(Class, Reason, Stacktrace, Debug, S, Q, State, Data, P); + Class, Reason, Stacktrace, Debug, S, Q, [], _State) -> + terminate(Class, Reason, Stacktrace, Debug, S, Q); do_reply_then_terminate( - Class, Reason, Stacktrace, Debug, S, Q, State, Data, P, [R|Rs]) -> + Class, Reason, Stacktrace, Debug, S, Q, [R|Rs], State) -> case R of {reply,{_To,_Tag}=From,Reply} -> NewDebug = do_reply(Debug, S, State, From, Reply), do_reply_then_terminate( - Class, Reason, Stacktrace, - NewDebug, S, Q, State, Data, P, Rs); + Class, Reason, Stacktrace, NewDebug, S, Q, Rs, State); _ -> terminate( error, {bad_reply_action_from_state_function,R}, ?STACKTRACE(), - Debug, S, Q, State, Data, P) + Debug, S, Q) end. do_reply(Debug, S, State, From, Reply) -> @@ -1227,7 +1486,9 @@ do_reply(Debug, S, State, From, Reply) -> terminate( Class, Reason, Stacktrace, - Debug, #{module := Module} = S, Q, State, Data, P) -> + Debug, + #{module := Module, state := State, data := Data, postponed := P} = S, + Q) -> try Module:terminate(Reason, State, Data) of _ -> ok catch @@ -1236,20 +1497,24 @@ terminate( ST = erlang:get_stacktrace(), error_info( C, R, ST, S, Q, P, - format_status(terminate, get(), S, State, Data)), + format_status(terminate, get(), S)), sys:print_log(Debug), erlang:raise(C, R, ST) end, - case Reason of - normal -> ok; - shutdown -> ok; - {shutdown,_} -> ok; - _ -> - error_info( - Class, Reason, Stacktrace, S, Q, P, - format_status(terminate, get(), S, State, Data)), - sys:print_log(Debug) - end, + _ = + case Reason of + normal -> + sys_debug(Debug, S, State, {terminate,Reason}); + shutdown -> + sys_debug(Debug, S, State, {terminate,Reason}); + {shutdown,_} -> + sys_debug(Debug, S, State, {terminate,Reason}); + _ -> + error_info( + Class, Reason, Stacktrace, S, Q, P, + format_status(terminate, get(), S)), + sys:print_log(Debug) + end, case Stacktrace of [] -> erlang:Class(Reason); @@ -1259,7 +1524,9 @@ terminate( error_info( Class, Reason, Stacktrace, - #{name := Name, callback_mode := CallbackMode}, + #{name := Name, + callback_mode := CallbackMode, + state_enter := StateEnter}, Q, P, FmtData) -> {FixedReason,FixedStacktrace} = case Stacktrace of @@ -1286,6 +1553,13 @@ error_info( end; _ -> {Reason,Stacktrace} end, + CBMode = + case StateEnter of + true -> + [CallbackMode,state_enter]; + false -> + CallbackMode + end, error_logger:format( "** State machine ~p terminating~n" ++ case Q of @@ -1312,8 +1586,9 @@ error_info( [] -> []; [Event|_] -> [Event] end] ++ - [FmtData,Class,FixedReason, - CallbackMode] ++ + [FmtData, + Class,FixedReason, + CBMode] ++ case Q of [_|[_|_] = Events] -> [Events]; _ -> [] @@ -1329,7 +1604,9 @@ error_info( %% Call Module:format_status/2 or return a default value -format_status(Opt, PDict, #{module := Module}, State, Data) -> +format_status( + Opt, PDict, + #{module := Module, state := State, data := Data}) -> case erlang:function_exported(Module, format_status, 2) of true -> try Module:format_status(Opt, [PDict,State,Data]) @@ -1353,3 +1630,35 @@ format_status_default(Opt, State, Data) -> _ -> [{data,[{"State",StateData}]}] end. + +listify(Item) when is_list(Item) -> + Item; +listify(Item) -> + [Item]. + +%% Cancel timer if running, otherwise no op +cancel_timer_by_type(TimerType, TimerRefs, TimerTypes) -> + case TimerTypes of + #{TimerType := TimerRef} -> + cancel_timer(TimerRef), + {maps:remove(TimerRef, TimerRefs), + maps:remove(TimerType, TimerTypes)}; + #{} -> + {TimerRefs,TimerTypes} + end. + +%%cancel_timer(undefined) -> +%% ok; +cancel_timer(TRef) -> + case erlang:cancel_timer(TRef) of + false -> + %% We have to assume that TRef is the ref of a running timer + %% and if so the timer has expired + %% hence we must wait for the timeout message + receive + {timeout,TRef,_} -> + ok + end; + _TimeLeft -> + ok + end. diff --git a/lib/stdlib/src/ms_transform.erl b/lib/stdlib/src/ms_transform.erl index c0eea652e7..98745b13f3 100644 --- a/lib/stdlib/src/ms_transform.erl +++ b/lib/stdlib/src/ms_transform.erl @@ -451,6 +451,8 @@ check_type(_,[{record,_,_,_}],ets) -> ok; check_type(_,[{cons,_,_,_}],dbg) -> ok; +check_type(_,[{nil,_}],dbg) -> + ok; check_type(Line0,[{match,_,{var,_,_},X}],Any) -> check_type(Line0,[X],Any); check_type(Line0,[{match,_,X,{var,_,_}}],Any) -> diff --git a/lib/stdlib/src/stdlib.appup.src b/lib/stdlib/src/stdlib.appup.src index 9877662743..e917b7ea1f 100644 --- a/lib/stdlib/src/stdlib.appup.src +++ b/lib/stdlib/src/stdlib.appup.src @@ -18,9 +18,9 @@ %% %CopyrightEnd% {"%VSN%", %% Up from - max one major revision back - [{<<"3\\.0(\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* + [{<<"3\\.[0-1](\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* {<<"2\\.[5-8](\\.[0-9]+)*">>,[restart_new_emulator]}], % OTP-18.* %% Down to - max one major revision back - [{<<"3\\.0(\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* + [{<<"3\\.[0-1](\\.[0-9]+)*">>,[restart_new_emulator]}, % OTP-19.* {<<"2\\.[5-8](\\.[0-9]+)*">>,[restart_new_emulator]}] % OTP-18.* }. diff --git a/lib/stdlib/src/supervisor.erl b/lib/stdlib/src/supervisor.erl index c81e72689c..1cd65fbf18 100644 --- a/lib/stdlib/src/supervisor.erl +++ b/lib/stdlib/src/supervisor.erl @@ -1087,6 +1087,10 @@ wait_dynamic_children(#child{restart_type=RType} = Child, Pids, Sz, wait_dynamic_children(Child, ?SETS:del_element(Pid, Pids), Sz-1, TRef, EStack); + {'DOWN', _MRef, process, Pid, {shutdown, _}} -> + wait_dynamic_children(Child, ?SETS:del_element(Pid, Pids), Sz-1, + TRef, EStack); + {'DOWN', _MRef, process, Pid, normal} when RType =/= permanent -> wait_dynamic_children(Child, ?SETS:del_element(Pid, Pids), Sz-1, TRef, EStack); diff --git a/lib/stdlib/test/base64_SUITE.erl b/lib/stdlib/test/base64_SUITE.erl index 9176a3664a..d0abe5c961 100644 --- a/lib/stdlib/test/base64_SUITE.erl +++ b/lib/stdlib/test/base64_SUITE.erl @@ -23,9 +23,7 @@ -include_lib("common_test/include/ct.hrl"). %% Test server specific exports --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, - init_per_group/2,end_per_group/2, - init_per_testcase/2, end_per_testcase/2]). +-export([all/0, suite/0, groups/0, group/1]). %% Test cases must be exported. -export([base64_encode/1, base64_decode/1, base64_otp_5635/1, @@ -33,41 +31,26 @@ mime_decode_to_string/1, roundtrip_1/1, roundtrip_2/1, roundtrip_3/1, roundtrip_4/1]). -init_per_testcase(_, Config) -> - Config. - -end_per_testcase(_, _Config) -> - ok. - %%------------------------------------------------------------------------- %% Test cases starts here. %%------------------------------------------------------------------------- + suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,4}}]. -all() -> +all() -> [base64_encode, base64_decode, base64_otp_5635, base64_otp_6279, big, illegal, mime_decode, mime_decode_to_string, {group, roundtrip}]. -groups() -> +groups() -> [{roundtrip, [parallel], [roundtrip_1, roundtrip_2, roundtrip_3, roundtrip_4]}]. -init_per_suite(Config) -> - Config. - -end_per_suite(_Config) -> - ok. - -init_per_group(_GroupName, Config) -> - Config. - -end_per_group(_GroupName, Config) -> - Config. - - +group(roundtrip) -> + %% valgrind needs a lot of time + [{timetrap,{minutes,10}}]. %%------------------------------------------------------------------------- %% Test base64:encode/1. @@ -78,9 +61,9 @@ base64_encode(Config) when is_list(Config) -> %% One pad <<"SGVsbG8gV29ybGQ=">> = base64:encode(<<"Hello World">>), %% No pad - "QWxhZGRpbjpvcGVuIHNlc2Ft" = + "QWxhZGRpbjpvcGVuIHNlc2Ft" = base64:encode_to_string("Aladdin:open sesam"), - + "MDEyMzQ1Njc4OSFAIzBeJiooKTs6PD4sLiBbXXt9" = base64:encode_to_string(<<"0123456789!@#0^&*();:<>,. []{}">>), ok. @@ -93,7 +76,7 @@ base64_decode(Config) when is_list(Config) -> %% One pad <<"Hello World">> = base64:decode(<<"SGVsbG8gV29ybGQ=">>), %% No pad - <<"Aladdin:open sesam">> = + <<"Aladdin:open sesam">> = base64:decode("QWxhZGRpbjpvcGVuIHNlc2Ft"), Alphabet = list_to_binary(lists:seq(0, 255)), @@ -208,7 +191,7 @@ mime_decode_to_string(Config) when is_list(Config) -> %% One pad to ignore, followed by more text "Hello World!!" = base64:mime_decode_to_string(<<"SGVsb)(G8gV29ybGQ=h IQ= =">>), %% No pad - "Aladdin:open sesam" = + "Aladdin:open sesam" = base64:mime_decode_to_string("QWxhZGRpbjpvcG¤\")(VuIHNlc2Ft"), %% Encoded base 64 strings may be divided by non base 64 chars. %% In this cases whitespaces. @@ -314,7 +297,7 @@ interleaved_ws_roundtrip_1([], Base64List, Bin, List) -> random_byte_list(0, Acc) -> Acc; -random_byte_list(N, Acc) -> +random_byte_list(N, Acc) -> random_byte_list(N-1, [rand:uniform(255)|Acc]). make_big_binary(N) -> diff --git a/lib/stdlib/test/edlin_expand_SUITE.erl b/lib/stdlib/test/edlin_expand_SUITE.erl index ccffa2e244..718d91c6a3 100644 --- a/lib/stdlib/test/edlin_expand_SUITE.erl +++ b/lib/stdlib/test/edlin_expand_SUITE.erl @@ -21,7 +21,7 @@ -export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_testcase/2, end_per_testcase/2, init_per_group/2,end_per_group/2]). --export([normal/1, quoted_fun/1, quoted_module/1, quoted_both/1]). +-export([normal/1, quoted_fun/1, quoted_module/1, quoted_both/1, erl_1152/1]). -include_lib("common_test/include/ct.hrl"). @@ -36,7 +36,7 @@ suite() -> {timetrap,{minutes,1}}]. all() -> - [normal, quoted_fun, quoted_module, quoted_both]. + [normal, quoted_fun, quoted_module, quoted_both, erl_1152]. groups() -> []. @@ -149,5 +149,12 @@ quoted_both(Config) when is_list(Config) -> {yes,"weird-fun-name'()",[]} = do_expand("'ExpandTestCaps1':'#"), ok. +erl_1152(Config) when is_list(Config) -> + "\n"++"foo"++" "++[1089]++_ = do_format(["foo",[1089]]), + ok. + do_expand(String) -> edlin_expand:expand(lists:reverse(String)). + +do_format(StringList) -> + lists:flatten(edlin_expand:format_matches(StringList)). diff --git a/lib/stdlib/test/ets_SUITE.erl b/lib/stdlib/test/ets_SUITE.erl index b02d17bdb6..00e02a06cc 100644 --- a/lib/stdlib/test/ets_SUITE.erl +++ b/lib/stdlib/test/ets_SUITE.erl @@ -19,7 +19,7 @@ %% -module(ets_SUITE). --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, +-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2]). -export([default/1,setbag/1,badnew/1,verybadnew/1,named/1,keypos2/1, privacy/1,privacy_owner/2]). @@ -31,15 +31,14 @@ -export([match_delete3/1]). -export([firstnext/1,firstnext_concurrent/1]). -export([slot/1]). --export([ match1/1, match2/1, match_object/1, match_object2/1]). --export([ dups/1, misc1/1, safe_fixtable/1, info/1, tab2list/1]). --export([ tab2file/1, tab2file2/1, tabfile_ext1/1, - tabfile_ext2/1, tabfile_ext3/1, tabfile_ext4/1, badfile/1]). --export([ heavy_lookup/1, heavy_lookup_element/1, heavy_concurrent/1]). --export([ lookup_element_mult/1]). --export([]). +-export([match1/1, match2/1, match_object/1, match_object2/1]). +-export([dups/1, misc1/1, safe_fixtable/1, info/1, tab2list/1]). +-export([tab2file/1, tab2file2/1, tabfile_ext1/1, + tabfile_ext2/1, tabfile_ext3/1, tabfile_ext4/1, badfile/1]). +-export([heavy_lookup/1, heavy_lookup_element/1, heavy_concurrent/1]). +-export([lookup_element_mult/1]). -export([foldl_ordered/1, foldr_ordered/1, foldl/1, foldr/1, fold_empty/1]). --export([t_delete_object/1, t_init_table/1, t_whitebox/1, +-export([t_delete_object/1, t_init_table/1, t_whitebox/1, t_delete_all_objects/1, t_insert_list/1, t_test_ms/1, t_select_delete/1,t_ets_dets/1]). @@ -61,8 +60,7 @@ -export([otp_7665/1]). -export([meta_wb/1]). -export([grow_shrink/1, grow_pseudo_deleted/1, shrink_pseudo_deleted/1]). --export([ - meta_lookup_unnamed_read/1, meta_lookup_unnamed_write/1, +-export([meta_lookup_unnamed_read/1, meta_lookup_unnamed_write/1, meta_lookup_named_read/1, meta_lookup_named_write/1, meta_newdel_unnamed/1, meta_newdel_named/1]). -export([smp_insert/1, smp_fixed_delete/1, smp_unfix_fix/1, smp_select_delete/1, @@ -95,7 +93,7 @@ rename_do/1, rename_unnamed_do/1, interface_equality_do/1, ordered_match_do/1, ordered_do/1, privacy_do/1, empty_do/1, badinsert_do/1, time_lookup_do/1, lookup_order_do/1, lookup_element_mult_do/1, delete_tab_do/1, delete_elem_do/1, - match_delete_do/1, match_delete3_do/1, firstnext_do/1, + match_delete_do/1, match_delete3_do/1, firstnext_do/1, slot_do/1, match1_do/1, match2_do/1, match_object_do/1, match_object2_do/1, misc1_do/1, safe_fixtable_do/1, info_do/1, dups_do/1, heavy_lookup_do/1, heavy_lookup_element_do/1, member_do/1, otp_5340_do/1, otp_7665_do/1, meta_wb_do/1, @@ -129,7 +127,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,5}}]. -all() -> +all() -> [{group, new}, {group, insert}, {group, lookup}, {group, delete}, firstnext, firstnext_concurrent, slot, {group, match}, t_match_spec_run, @@ -161,7 +159,7 @@ all() -> memory_check_summary]. % MUST BE LAST -groups() -> +groups() -> [{new, [], [default, setbag, badnew, verybadnew, named, keypos2, privacy]}, @@ -249,6 +247,7 @@ t_bucket_disappears_do(Opts) -> %% Check ets:match_spec_run/2. t_match_spec_run(Config) when is_list(Config) -> + ct:timetrap({minutes,30}), %% valgrind needs a lot init_externals(), EtsMem = etsmem(), @@ -709,7 +708,7 @@ adjust_xmem([_T1,_T2,_T3,_T4], {A0,B0,C0,D0} = _Mem0) -> {A0+TabDiff, B0+TabDiff, C0+TabDiff, D0+TabDiff}. %% Misc. whitebox tests -t_whitebox(Config) when is_list(Config) -> +t_whitebox(Config) when is_list(Config) -> EtsMem = etsmem(), repeat_for_opts(whitebox_1), repeat_for_opts(whitebox_1), @@ -1050,6 +1049,7 @@ do_reverse_chunked({L,C},Acc) -> %% Test the ets:select_delete/2 and ets:select_count/2 BIFs. t_select_delete(Config) when is_list(Config) -> + ct:timetrap({minutes,30}), %% valgrind needs a lot EtsMem = etsmem(), Tables = fill_sets_int(10000) ++ fill_sets_int(10000,[{write_concurrency,true}]), lists:foreach @@ -1495,15 +1495,15 @@ update_element(Config) when is_list(Config) -> verify_etsmem(EtsMem). update_element_opts(Opts) -> - TupleCases = [{{key,val}, 1 ,2}, - {{val,key}, 2, 1}, - {{key,val}, 1 ,[2]}, + TupleCases = [{{key,val}, 1 ,2}, + {{val,key}, 2, 1}, + {{key,val}, 1 ,[2]}, {{key,val,val}, 1, [2,3]}, {{val,key,val,val}, 2, [3,4,1]}, {{val,val,key,val}, 3, [1,4,1,2]}, % update pos1 twice {{val,val,val,key}, 4, [2,1,2,3]}],% update pos2 twice - lists:foreach(fun({Tuple,KeyPos,UpdPos}) -> update_element_opts(Tuple,KeyPos,UpdPos,Opts) end, + lists:foreach(fun({Tuple,KeyPos,UpdPos}) -> update_element_opts(Tuple,KeyPos,UpdPos,Opts) end, TupleCases), update_element_neg(Opts). @@ -1519,9 +1519,9 @@ update_element_opts(Tuple,KeyPos,UpdPos,Opts) -> true = ets:delete(OrdSet), ok. -update_element(T,Tuple,KeyPos,UpdPos) -> +update_element(T,Tuple,KeyPos,UpdPos) -> KeyList = [17,"seventeen",<<"seventeen">>,{17},list_to_binary(lists:seq(1,100)),make_ref(), self()], - lists:foreach(fun(Key) -> + lists:foreach(fun(Key) -> TupleWithKey = setelement(KeyPos,Tuple,Key), update_element_do(T,TupleWithKey,Key,UpdPos) end, @@ -1556,29 +1556,29 @@ update_element_do(Tab,Tuple,Key,UpdPos) -> {Pos, element(ToIx+1,Values)} % single {pos,value} arg end, - UpdateF = fun(ToIx,Rand) -> - PosValArg = PosValArgF(ToIx,[],UpdPos,Rand,PosValArgF), - %%io:format("update_element(~p)~n",[PosValArg]), - ArgHash = erlang:phash2({Tab,Key,PosValArg}), - true = ets:update_element(Tab, Key, PosValArg), - ArgHash = erlang:phash2({Tab,Key,PosValArg}), - NewTuple = update_tuple(PosValArg,Tuple), - [NewTuple] = ets:lookup(Tab,Key) + UpdateF = fun(ToIx,Rand) -> + PosValArg = PosValArgF(ToIx,[],UpdPos,Rand,PosValArgF), + %%io:format("update_element(~p)~n",[PosValArg]), + ArgHash = erlang:phash2({Tab,Key,PosValArg}), + true = ets:update_element(Tab, Key, PosValArg), + ArgHash = erlang:phash2({Tab,Key,PosValArg}), + NewTuple = update_tuple(PosValArg,Tuple), + [NewTuple] = ets:lookup(Tab,Key) end, - LoopF = fun(_FromIx, Incr, _Times, Checksum, _MeF) when Incr >= Length -> + LoopF = fun(_FromIx, Incr, _Times, Checksum, _MeF) when Incr >= Length -> Checksum; % done - (FromIx, Incr, 0, Checksum, MeF) -> + (FromIx, Incr, 0, Checksum, MeF) -> MeF(FromIx, Incr+1, Length, Checksum, MeF); - (FromIx, Incr, Times, Checksum, MeF) -> + (FromIx, Incr, Times, Checksum, MeF) -> ToIx = (FromIx + Incr) rem Length, UpdateF(ToIx,Checksum), - if + if Incr =:= 0 -> UpdateF(ToIx,Checksum); % extra update to same value true -> true - end, + end, MeF(ToIx, Incr, Times-1, Checksum+ToIx+1, MeF) end, @@ -1622,7 +1622,7 @@ update_element_neg_do(T) -> Object = {key, 0, "Hej"}, true = ets:insert(T,Object), - UpdateF = fun(Arg3) -> + UpdateF = fun(Arg3) -> ArgHash = erlang:phash2({T,key,Arg3}), {'EXIT',{badarg,_}} = (catch ets:update_element(T,key,Arg3)), ArgHash = erlang:phash2({T,key,Arg3}), @@ -1697,7 +1697,7 @@ update_counter_for(T) -> true = ets:lookup(T, b) =:= [setelement(1, NewObj, b)], ets:delete(T, b), Myself(NewObj,Times-1,Arg3,Myself) - end, + end, LoopF = fun(Obj, Times, Arg3) -> %%io:format("Loop start:\nObj = ~p\nArg3=~p\n",[Obj,Arg3]), @@ -1806,7 +1806,7 @@ uc_mimic(Obj, [Pits|Tail], Acc) -> uc_adder(Init, {_Pos, Add}) -> Init + Add; -uc_adder(Init, {_Pos, Add, Thres, Warp}) -> +uc_adder(Init, {_Pos, Add, Thres, Warp}) -> case Init + Add of X when X > Thres, Add > 0 -> Warp; @@ -1838,7 +1838,7 @@ update_counter_neg_for(T) -> Object = {key,0,false,1}, true = ets:insert(T,Object), - UpdateF = fun(Arg3) -> + UpdateF = fun(Arg3) -> ArgHash = erlang:phash2({T,key,Arg3}), {'EXIT',{badarg,_}} = (catch ets:update_counter(T,key,Arg3)), ArgHash = erlang:phash2({T,key,Arg3}), @@ -1978,15 +1978,16 @@ fixtable_next_do(Opts) -> verify_etsmem(EtsMem). do_fixtable_next(Tab) -> - F = fun(X,T,FF) -> case X of - 0 -> true; - _ -> - ets:insert(T, {X, - integer_to_list(X), - X rem 10}), - FF(X-1,T,FF) - end - end, + F = fun(X,T,FF) -> + case X of + 0 -> true; + _ -> + ets:insert(T, {X, + integer_to_list(X), + X rem 10}), + FF(X-1,T,FF) + end + end, F(100,Tab,F), ets:safe_fixtable(Tab,true), First = ets:first(Tab), @@ -2001,7 +2002,7 @@ do_fixtable_next(Tab) -> %% Check inserts of deleted keys in fixed bags. fixtable_insert(Config) when is_list(Config) -> - Combos = [[Type,{write_concurrency,WC}] || Type<- [bag,duplicate_bag], + Combos = [[Type,{write_concurrency,WC}] || Type<- [bag,duplicate_bag], WC <- [false,true]], lists:foreach(fun(Opts) -> fixtable_insert_do(Opts) end, Combos), @@ -2117,7 +2118,7 @@ heir_do(Opts) -> %% Different types of heir data and link/monitor relations TestFun = fun(Arg) -> {EtsMem,Arg} end, - Combos = [{Data,Mode} || Data<-[foo_data, <<"binary">>, + Combos = [{Data,Mode} || Data<-[foo_data, <<"binary">>, lists:seq(1,10), {17,TestFun,self()}, "The busy heir"], Mode<-[none,link,monitor]], @@ -2157,7 +2158,7 @@ heir_do(Opts) -> Founder4 ! {go, Heir4}, {'DOWN', MrefH4, process, Heir4, normal} = receive_any(), erts_debug:set_internal_state(next_pid, NextPidIx), - DoppelGanger = spawn_monitor_with_pid(Heir4, + DoppelGanger = spawn_monitor_with_pid(Heir4, fun()-> die_please = receive_any() end), Founder4 ! die_please, {'DOWN', MrefF4, process, Founder4, normal} = receive_any(), @@ -2170,12 +2171,12 @@ heir_do(Opts) -> failed -> io:format("Failed to spawn process with pid ~p\n", [Heir4]), true % try again - end + end end), verify_etsmem(EtsMem). -heir_founder(Master, HeirData, Opts) -> +heir_founder(Master, HeirData, Opts) -> {go,Heir} = receive_any(), HeirTpl = case Heir of none -> {heir,none}; @@ -2248,7 +2249,7 @@ heir_1(HeirData,Mode,Opts) -> {'DOWN', Mref, process, Heir, normal} = receive_any(). %% Test ets:give_way/3. -give_away(Config) when is_list(Config) -> +give_away(Config) when is_list(Config) -> repeat_for_opts(give_away_do). give_away_do(Opts) -> @@ -2387,7 +2388,7 @@ bad_table(Config) when is_list(Config) -> ok. bad_table_do(Opts, DummyFile) -> - Parent = self(), + Parent = self(), {Pid,Mref} = my_spawn_opt(fun()-> ets_new(priv,[private,named_table | Opts]), Priv = ets_new(priv,[private | Opts]), ets_new(prot,[protected,named_table | Opts]), @@ -2442,7 +2443,7 @@ bad_table_do(Opts, DummyFile) -> ], Info = {Opts, Priv, Prot}, lists:foreach(fun(Op) -> bad_table_op(Info, Op) end, - OpList), + OpList), Pid ! die_please, {'DOWN', Mref, process, Pid, normal} = receive_any(), ok. @@ -2577,14 +2578,14 @@ interface_equality_do(Opts) -> Set = ets_new(set,[set | Opts]), OrderedSet = ets_new(ordered_set,[ordered_set | Opts]), F = fun(X,T,FF) -> case X of - 0 -> true; - _ -> - ets:insert(T, {X, - integer_to_list(X), - X rem 10}), - FF(X-1,T,FF) - end - end, + 0 -> true; + _ -> + ets:insert(T, {X, + integer_to_list(X), + X rem 10}), + FF(X-1,T,FF) + end + end, F(100,Set,F), F(100,OrderedSet,F), equal_results(ets, insert, Set, OrderedSet, [{a,"a"}]), @@ -2653,20 +2654,20 @@ ordered_match_do(Opts) -> F(3000,T1,F), [[3,3],[3,3],[3,3]] = ets:match(T1, {'_','_','$1','$2',3}), F2 = fun(X,Rem,Res,FF) -> case X of - 0 -> []; - _ -> + 0 -> []; + _ -> case X rem Rem of Res -> FF(X-1,Rem,Res,FF) ++ [{X, - integer_to_list(X), + integer_to_list(X), X rem 10, X rem 100, X rem 1000}]; _ -> FF(X-1,Rem,Res,FF) end - end + end end, OL1 = F2(3000,100,2,F2), OL1 = ets:match_object(T1, {'_','_','_',2,'_'}), @@ -2744,7 +2745,7 @@ pick_all_backwards(T) -> %% Small test case for both set and bag type ets tables. -setbag(Config) when is_list(Config) -> +setbag(Config) when is_list(Config) -> EtsMem = etsmem(), Set = ets_new(set,[set]), Bag = ets_new(bag,[bag]), @@ -2821,7 +2822,7 @@ privacy_do(Opts) -> privacy_check(pub,prot,priv), - Owner ! {shift,1,{pub,prot,priv}}, + Owner ! {shift,1,{pub,prot,priv}}, receive {Pub1,Prot1,Priv1} -> ok = privacy_check(Pub1,Prot1,Priv1), @@ -2960,7 +2961,7 @@ badlookup(Config) when is_list(Config) -> verify_etsmem(EtsMem). %% Test that lookup returns objects in order of insertion for bag and dbag. -lookup_order(Config) when is_list(Config) -> +lookup_order(Config) when is_list(Config) -> EtsMem = etsmem(), repeat_for_opts(lookup_order_do, [write_concurrency,[bag,duplicate_bag]]), verify_etsmem(EtsMem), @@ -2982,7 +2983,7 @@ lookup_order_2(Opts, Fixed) -> case Fixed of true -> ets:safe_fixtable(T,true); false -> ok - end, + end, S10 = {T,[],key}, S20 = check_insert(S10,A), S30 = check_insert(S20,B), @@ -2994,7 +2995,7 @@ lookup_order_2(Opts, Fixed) -> S80 = check_delete(S70,D2b), S90 = check_insert(S80,D2a), SA0 = check_delete(S90,D3a), - SB0 = check_delete(SA0,D3b), + SB0 = check_delete(SA0,D3b), check_insert_new(SB0,D3b), true = ets:delete(T) @@ -3007,7 +3008,7 @@ check_insert({T,List0,Key},Val) -> ets:insert(T,{Key,Val}), List1 = case (ets:info(T,type) =:= bag andalso lists:member({Key,Val},List0)) of - true -> List0; + true -> List0; false -> [{Key,Val} | List0] end, check_check({T,List1,Key}). @@ -3040,8 +3041,6 @@ check_check(S={T,List,Key}) -> Items = length(List), S. - - fill_tab(Tab,Val) -> ets:insert(Tab,{key,Val}), ets:insert(Tab,{{a,144},Val}), @@ -3069,13 +3068,11 @@ lookup_element_mult_do(Opts) -> verify_etsmem(EtsMem). lem_data() -> - [ - {service,'eddie2@boromir',{150,236,14,103},httpd88,self()}, + [{service,'eddie2@boromir',{150,236,14,103},httpd88,self()}, {service,'eddie2@boromir',{150,236,14,103},httpd80,self()}, {service,'eddie3@boromir',{150,236,14,107},httpd88,self()}, {service,'eddie3@boromir',{150,236,14,107},httpd80,self()}, - {service,'eddie4@boromir',{150,236,14,108},httpd88,self()} - ]. + {service,'eddie4@boromir',{150,236,14,108},httpd88,self()}]. lem_crash(T) -> L = ets:lookup_element(T, 'eddie2@boromir', 3), @@ -3126,6 +3123,7 @@ delete_tab_do(Opts) -> %% Check that ets:delete/1 works and that other processes can run. delete_large_tab(Config) when is_list(Config) -> + ct:timetrap({minutes,30}), %% valgrind needs a lot Data = [{erlang:phash2(I, 16#ffffff),I} || I <- lists:seq(1, 200000)], EtsMem = etsmem(), repeat_for_opts(fun(Opts) -> delete_large_tab_do(Opts,Data) end), @@ -3148,7 +3146,7 @@ delete_large_tab_1(Name, Flags, Data, Fix) -> lists:foreach(fun({K,_}) -> ets:delete(Tab, K) end, Data) end, - {priority, Prio} = process_info(self(), priority), + {priority, Prio} = process_info(self(), priority), Deleter = self(), [SchedTracer] = start_loopers(1, @@ -3195,7 +3193,7 @@ delete_large_tab_1(Name, Flags, Data, Fix) -> %% Delete a large name table and try to create a new table with %% the same name in another process. -delete_large_named_table(Config) when is_list(Config) -> +delete_large_named_table(Config) when is_list(Config) -> Data = [{erlang:phash2(I, 16#ffffff),I} || I <- lists:seq(1, 200000)], EtsMem = etsmem(), repeat_for_opts(fun(Opts) -> delete_large_named_table_do(Opts,Data) end), @@ -3566,7 +3564,7 @@ dyn_lookup(T) -> dyn_lookup(T, ets:first(T)). dyn_lookup(_T, '$end_of_table') -> []; dyn_lookup(T, K) -> - NextKey=ets:next(T,K), + NextKey = ets:next(T,K), case ets:next(T,K) of NextKey -> dyn_lookup(T, NextKey); @@ -4085,9 +4083,9 @@ tabfile_ext2_do(Opts,Config) -> Name = make_ref(), [ets:insert(T,{X,integer_to_list(X)}) || X <- L], ok = ets:tab2file(T,FName,[{extended_info,[md5sum]}]), - true = lists:sort(ets:tab2list(T)) =:= + true = lists:sort(ets:tab2list(T)) =:= lists:sort(ets:tab2list(element(2,ets:file2tab(FName)))), - true = lists:sort(ets:tab2list(T)) =:= + true = lists:sort(ets:tab2list(T)) =:= lists:sort(ets:tab2list( element(2,ets:file2tab(FName,[{verify,true}])))), {ok, Name} = disk_log:open([{name,Name},{file,FName}]), @@ -4102,9 +4100,9 @@ tabfile_ext2_do(Opts,Config) -> ets:tab2list( element(2,ets:file2tab(FName2)))), {error,checksum_error} = ets:file2tab(FName2,[{verify,true}]), - {value,{extended_info,[md5sum]}} = + {value,{extended_info,[md5sum]}} = lists:keysearch(extended_info,1,element(2,ets:tabfile_info(FName2))), - {value,{extended_info,[md5sum]}} = + {value,{extended_info,[md5sum]}} = lists:keysearch(extended_info,1,element(2,ets:tabfile_info(FName))), file:delete(FName), file:delete(FName2), @@ -4149,15 +4147,14 @@ tabfile_ext4(Config) when is_list(Config) -> Name2 = make_ref(), [ets:insert(TL,{X,integer_to_list(X)}) || X <- LL], ok = ets:tab2file(TL,FName,[{extended_info,[md5sum]}]), - {ok, Name2} = disk_log:open([{name, Name2}, {file, FName}, + {ok, Name2} = disk_log:open([{name, Name2}, {file, FName}, {mode, read_only}]), {C,[_|_]} = disk_log:chunk(Name2,start), {_,[_|_]} = disk_log:chunk(Name2,C), disk_log:close(Name2), - true = lists:sort(ets:tab2list(TL)) =:= + true = lists:sort(ets:tab2list(TL)) =:= lists:sort(ets:tab2list(element(2,ets:file2tab(FName)))), - Res = [ - begin + Res = [begin {ok,FD} = file:open(FName,[binary,read,write]), {ok, Bin} = file:pread(FD,0,1000), <<B1:N/binary,Ch:8,B2/binary>> = Bin, @@ -4167,7 +4164,7 @@ tabfile_ext4(Config) when is_list(Config) -> ok = file:close(FD), X = case ets:file2tab(FName) of {ok,TL2} -> - true = lists:sort(ets:tab2list(TL)) =/= + true = lists:sort(ets:tab2list(TL)) =/= lists:sort(ets:tab2list(TL2)); _ -> totally_broken @@ -4175,7 +4172,7 @@ tabfile_ext4(Config) when is_list(Config) -> {error,Y} = ets:file2tab(FName,[{verify,true}]), ets:tab2file(TL,FName,[{extended_info,[md5sum]}]), {X,Y} - end || N <- lists:seq(500,600) ], + end || N <- lists:seq(500,600)], io:format("~p~n",[Res]), file:delete(FName), ok. @@ -4404,16 +4401,14 @@ member_do(Opts) -> build_table(L1,L2,Num) -> - T = ets_new(xxx, [ordered_set] - ), + T = ets_new(xxx, [ordered_set]), lists:foreach( fun(X1) -> lists:foreach( fun(X2) -> F = fun(FF,N) -> - ets:insert(T,{{X1,X2,N}, - X1, X2, N}), - case N of + ets:insert(T,{{X1,X2,N}, X1, X2, N}), + case N of 0 -> ok; _ -> @@ -4426,16 +4421,14 @@ build_table(L1,L2,Num) -> T. build_table2(L1,L2,Num) -> - T = ets_new(xxx, [ordered_set] - ), + T = ets_new(xxx, [ordered_set]), lists:foreach( fun(X1) -> lists:foreach( fun(X2) -> F = fun(FF,N) -> - ets:insert(T,{{N,X1,X2}, - N, X1, X2}), - case N of + ets:insert(T,{{N,X1,X2}, N, X1, X2}), + case N of 0 -> ok; _ -> @@ -4726,7 +4719,7 @@ del_one_by_one_dbag_3(T,From,To) -> N = (ets:info(T,size) + 1), Obj2 = {From, integer_to_list(From)}, ets:delete_object(T,Obj2), - N = (ets:info(T,size) + 2) + N = (ets:info(T,size) + 2) end, Next = if From < To -> @@ -4773,14 +4766,14 @@ gen_dets_filename(Config,N) -> filename:join(proplists:get_value(priv_dir,Config), "testdets_" ++ integer_to_list(N) ++ ".dets"). -otp_6842_select_1000(Config) when is_list(Config) -> +otp_6842_select_1000(Config) when is_list(Config) -> Tab = ets_new(xxx,[ordered_set]), [ets:insert(Tab,{X,X}) || X <- lists:seq(1,10000)], AllTrue = lists:duplicate(10,true), AllTrue = [ length( element(1, - ets:select(Tab,[{'_',[],['$_']}],X*1000))) =:= + ets:select(Tab,[{'_',[],['$_']}],X*1000))) =:= X*1000 || X <- lists:seq(1,10) ], Sequences = [[1000,1000,1000,1000,1000,1000,1000,1000,1000,1000], [2000,2000,2000,2000,2000], @@ -4806,7 +4799,13 @@ check_seq(A,B,C) -> false. otp_6338(Config) when is_list(Config) -> - L = binary_to_term(<<131,108,0,0,0,2,104,2,108,0,0,0,2,103,100,0,19,112,112,98,49,95,98,115,49,50,64,98,108,97,100,101,95,48,95,53,0,0,33,50,0,0,0,4,1,98,0,0,23,226,106,100,0,4,101,120,105,116,104,2,108,0,0,0,2,104,2,100,0,3,115,98,109,100,0,19,112,112,98,50,95,98,115,49,50,64,98,108,97,100,101,95,48,95,56,98,0,0,18,231,106,100,0,4,114,101,99,118,106>>), + L = binary_to_term(<<131,108,0,0,0,2,104,2,108,0,0,0,2,103,100,0,19,112,112, + 98,49,95,98,115,49,50,64,98,108,97,100,101,95,48,95,53, + 0,0,33,50,0,0,0,4,1,98,0,0,23,226,106,100,0,4,101,120, + 105,116,104,2,108,0,0,0,2,104,2,100,0,3,115,98,109,100, + 0,19,112,112,98,50,95,98,115,49,50,64,98,108,97,100, + 101,95,48,95,56,98,0,0,18,231,106,100,0,4,114,101,99, + 118,106>>), T = ets_new(xxx,[ordered_set]), lists:foreach(fun(X) -> ets:insert(T,X) end,L), [[4839,recv]] = ets:match(T,{[{sbm,ppb2_bs12@blade_0_8},'$1'],'$2'}), @@ -4825,7 +4824,7 @@ otp_5340_do(Opts) -> ets:delete(T). w(_,0, _) -> ok; -w(T,N, Id) -> +w(T,N, Id) -> ets:insert(T, {N, Id}), w(T,N-1,Id). @@ -4915,7 +4914,7 @@ meta_wb_new(Name, _, Tabs, Opts) -> case (catch ets_new(Name,[named_table|Opts])) of Name -> false = lists:member(Name, Tabs), - [Name | Tabs]; + [Name | Tabs]; {'EXIT',{badarg,_}} -> true = lists:member(Name, Tabs), Tabs @@ -5090,7 +5089,7 @@ meta_lookup_unnamed_read(Config) when is_list(Config) -> Tab end, ExecF = fun(Tab) -> [{key,data}] = ets:lookup(Tab,key), - Tab + Tab end, FiniF = fun(Tab) -> true = ets:delete(Tab) end, @@ -5114,7 +5113,7 @@ meta_lookup_named_read(Config) when is_list(Config) -> Tab end, ExecF = fun(Tab) -> [{key,data}] = ets:lookup(Tab,key), - Tab + Tab end, FiniF = fun(Tab) -> true = ets:delete(Tab) end, @@ -5173,9 +5172,9 @@ smp_fixed_delete_do() -> ets:safe_fixtable(T,true), Buckets = num_of_buckets(T), InitF = fun([ProcN,NumOfProcs|_]) -> {ProcN,NumOfProcs} end, - ExecF = fun({Key,_}) when Key > NumOfObjs -> + ExecF = fun({Key,_}) when Key > NumOfObjs -> [end_of_work]; - ({Key,Increment}) -> + ({Key,Increment}) -> true = ets:delete(T,Key), {Key+Increment,Increment} end, @@ -5204,7 +5203,7 @@ smp_unfix_fix_do() -> T = ets_new(foo,[public,{write_concurrency,true}]), %%Mem = ets:info(T,memory), NumOfObjs = 100000, - Deleted = 50000, + Deleted = 50000, filltabint(T,NumOfObjs), ets:safe_fixtable(T,true), Buckets = num_of_buckets(T), @@ -5217,7 +5216,7 @@ smp_unfix_fix_do() -> true = ets:info(T,fixed), Deleted = get_kept_objects(T), - {Child, Mref} = + {Child, Mref} = my_spawn_opt( fun()-> true = ets:info(T,fixed), @@ -5276,22 +5275,19 @@ otp_8166_do(WC) -> NumOfObjs = 3000, %% Need more than 1000 live objects for match_object to trap one time Deleted = NumOfObjs div 2, filltabint(T,NumOfObjs), - {ReaderPid, ReaderMref} = - my_spawn_opt(fun()-> otp_8166_reader(T,NumOfObjs) end, - [link, monitor, {scheduler,2}]), - {ZombieCrPid, ZombieCrMref} = - my_spawn_opt(fun()-> otp_8166_zombie_creator(T,Deleted) end, - [link, monitor, {scheduler,3}]), + {ReaderPid, ReaderMref} = my_spawn_opt(fun()-> otp_8166_reader(T,NumOfObjs) end, + [link, monitor, {scheduler,2}]), + {ZombieCrPid, ZombieCrMref} = my_spawn_opt(fun()-> otp_8166_zombie_creator(T,Deleted) end, + [link, monitor, {scheduler,3}]), repeat(fun() -> ZombieCrPid ! {loop, self()}, zombies_created = receive_any(), otp_8166_trapper(T, 10, ZombieCrPid) - end, - 100), + end, 100), ReaderPid ! quit, {'DOWN', ReaderMref, process, ReaderPid, normal} = receive_any(), - ZombieCrPid ! quit, + ZombieCrPid ! quit, {'DOWN', ZombieCrMref, process, ZombieCrPid, normal} = receive_any(), false = ets:info(T,fixed), 0 = get_kept_objects(T), @@ -5301,7 +5297,7 @@ otp_8166_do(WC) -> %% Keep reading the table otp_8166_reader(T, NumOfObjs) -> - repeat_while(fun(0) -> + repeat_while(fun(0) -> receive quit -> {false,done} after 0 -> {true,NumOfObjs} end; @@ -5315,14 +5311,14 @@ otp_8166_reader(T, NumOfObjs) -> otp_8166_trapper(T, Try, ZombieCrPid) -> [] = ets:match_object(T,{'_',"Pink Unicorn"}), case {ets:info(T,fixed),Try} of - {true,1} -> + {true,1} -> io:format("failed to provoke unsafe unfix, give up...\n",[]), ZombieCrPid ! unfix; - {true,_} -> + {true,_} -> io:format("trapper too fast, trying again...\n",[]), otp_8166_trapper(T, Try-1, ZombieCrPid); {false,_} -> done - end. + end. %% Fixate table and create some pseudo-deleted objects (zombies) @@ -5342,7 +5338,7 @@ otp_8166_zombie_creator(T,Deleted) -> repeat_while(fun() -> case ets:info(T,safe_fixed_monotonic_time) of {_,[_P1,_P2]} -> false; - _ -> + _ -> receive unfix -> false after 0 -> true end @@ -5399,7 +5395,7 @@ smp_select_delete(Config) when is_list(Config) -> Mod = 17, Zeros = erlang:make_tuple(Mod,0), InitF = fun(_) -> Zeros end, - ExecF = fun(Diffs0) -> + ExecF = fun(Diffs0) -> case rand:uniform(20) of 1 -> Mod = 17, @@ -5421,7 +5417,7 @@ smp_select_delete(Config) when is_list(Config) -> Diffs1; false -> Diffs0 end - end + end end, FiniF = fun(Result) -> Result end, Results = run_workers_do(InitF,ExecF,FiniF,20000), @@ -5432,7 +5428,7 @@ smp_select_delete(Config) when is_list(Config) -> 0, TotCnts), io:format("LeftInTab = ~p\n",[LeftInTab]), LeftInTab = ets:info(T,size), - lists:foldl(fun(Cnt,Eq) -> + lists:foldl(fun(Cnt,Eq) -> WasCnt = ets:select_count(T, [{{'_', '$1'}, [{'=:=', {'rem', '$1', Mod}, Eq}], @@ -5440,7 +5436,7 @@ smp_select_delete(Config) when is_list(Config) -> io:format("~p: ~p =?= ~p\n",[Eq,Cnt,WasCnt]), Cnt = WasCnt, Eq+1 - end, + end, 0, TotCnts), verify_table_load(T), LeftInTab = ets:select_delete(T, [{{'$1','$1'}, [], [true]}]), @@ -5478,8 +5474,8 @@ types_do(Opts) -> %% OTP-9932: Memory overwrite when inserting large integers in compressed bag. %% Will crash with segv on 64-bit opt if not fixed. otp_9932(Config) when is_list(Config) -> - T = ets:new(xxx, [bag, compressed]), - Fun = fun(N) -> + T = ets:new(xxx, [bag, compressed]), + Fun = fun(N) -> Key = {1316110174588445 bsl N,1316110174588583 bsl N}, S = {Key, Key}, true = ets:insert(T, S), @@ -5495,9 +5491,9 @@ otp_9932(Config) when is_list(Config) -> %% write_concurrency table. otp_9423(Config) when is_list(Config) -> InitF = fun(_) -> {0,0} end, - ExecF = fun({S,F}) -> - receive - stop -> + ExecF = fun({S,F}) -> + receive + stop -> io:format("~p got stop\n", [self()]), [end_of_work | {"Succeded=",S,"Failed=",F}] after 0 -> @@ -5593,12 +5589,12 @@ take(Config) when is_list(Config) -> %% Utility functions: %% -add_lists(L1,L2) -> +add_lists(L1,L2) -> add_lists(L1,L2,[]). add_lists([],[],Acc) -> lists:reverse(Acc); add_lists([E1|T1], [E2|T2], Acc) -> - add_lists(T1, T2, [E1+E2 | Acc]). + add_lists(T1, T2, [E1+E2 | Acc]). run_workers(InitF,ExecF,FiniF,Laps) -> run_workers(InitF,ExecF,FiniF,Laps, 0). @@ -5644,9 +5640,9 @@ worker_loop(infinite, ExecF, State) -> worker_loop(N, ExecF, State) -> worker_loop(N-1,ExecF,ExecF(State)). -wait_pids(Pids) -> +wait_pids(Pids) -> wait_pids(Pids,[]). -wait_pids([],Acc) -> +wait_pids([],Acc) -> Acc; wait_pids(Pids, Acc) -> receive @@ -5683,7 +5679,7 @@ etsmem() -> wait_for_memory_deallocations(), AllTabs = lists:map(fun(T) -> {T,ets:info(T,name),ets:info(T,size), - ets:info(T,memory),ets:info(T,type)} + ets:info(T,memory),ets:info(T,type)} end, ets:all()), EtsAllocInfo = erlang:system_info({allocator,ets_alloc}), @@ -5895,7 +5891,7 @@ receive_any() -> receive_any_spinning() -> receive_any_spinning(1000000). receive_any_spinning(Loops) -> - receive_any_spinning(Loops,Loops,1). + receive_any_spinning(Loops,Loops,1). receive_any_spinning(Loops,0,Tries) -> receive M -> io:format("Spinning process ~p got msg ~p after ~p tries\n", [self(),M,Tries]), diff --git a/lib/stdlib/test/gen_statem_SUITE.erl b/lib/stdlib/test/gen_statem_SUITE.erl index 1d1417c2e6..119546be98 100644 --- a/lib/stdlib/test/gen_statem_SUITE.erl +++ b/lib/stdlib/test/gen_statem_SUITE.erl @@ -37,7 +37,8 @@ all() -> {group, stop_handle_event}, {group, abnormal}, {group, abnormal_handle_event}, - shutdown, stop_and_reply, event_order, code_change, + shutdown, stop_and_reply, state_enter, event_order, + state_timeout, code_change, {group, sys}, hibernate, enter_loop]. @@ -57,7 +58,7 @@ tcs(start) -> tcs(stop) -> [stop1, stop2, stop3, stop4, stop5, stop6, stop7, stop8, stop9, stop10]; tcs(abnormal) -> - [abnormal1, abnormal2]; + [abnormal1, abnormal1clean, abnormal1dirty, abnormal2]; tcs(sys) -> [sys1, call_format_status, error_format_status, terminate_crash_format, @@ -451,8 +452,52 @@ abnormal1(Config) -> gen_statem:call(Name, {delayed_answer,1000}, 10), Reason), ok = gen_statem:stop(Name), + ?t:sleep(1100), ok = verify_empty_msgq(). +%% Check that time outs in calls work +abnormal1clean(Config) -> + Name = abnormal1clean, + LocalSTM = {local,Name}, + + {ok, _Pid} = + gen_statem:start(LocalSTM, ?MODULE, start_arg(Config, []), []), + + %% timeout call. + delayed = + gen_statem:call(Name, {delayed_answer,1}, {clean_timeout,100}), + {timeout,_} = + ?EXPECT_FAILURE( + gen_statem:call( + Name, {delayed_answer,1000}, {clean_timeout,10}), + Reason), + ok = gen_statem:stop(Name), + ?t:sleep(1100), + ok = verify_empty_msgq(). + +%% Check that time outs in calls work +abnormal1dirty(Config) -> + Name = abnormal1dirty, + LocalSTM = {local,Name}, + + {ok, _Pid} = + gen_statem:start(LocalSTM, ?MODULE, start_arg(Config, []), []), + + %% timeout call. + delayed = + gen_statem:call(Name, {delayed_answer,1}, {dirty_timeout,100}), + {timeout,_} = + ?EXPECT_FAILURE( + gen_statem:call( + Name, {delayed_answer,1000}, {dirty_timeout,10}), + Reason), + ok = gen_statem:stop(Name), + ?t:sleep(1100), + case flush() of + [{Ref,delayed}] when is_reference(Ref) -> + ok + end. + %% Check that bad return values makes the stm crash. Note that we must %% trap exit since we must link to get the real bad_return_ error abnormal2(Config) -> @@ -512,7 +557,8 @@ stop_and_reply(_Config) -> {stop_and_reply,Reason, [R1,{reply,From2,Reply2}]} end}, - {ok,STM} = gen_statem:start_link(?MODULE, {map_statem,Machine}, []), + {ok,STM} = + gen_statem:start_link(?MODULE, {map_statem,Machine,[]}, []), Self = self(), Tag1 = make_ref(), @@ -537,6 +583,61 @@ stop_and_reply(_Config) -> +state_enter(_Config) -> + process_flag(trap_exit, true), + Self = self(), + + Machine = + %% Abusing the internal format of From... + #{init => + fun () -> + {ok,start,1} + end, + start => + fun (enter, Prev, N) -> + Self ! {enter,start,Prev,N}, + {keep_state,N + 1}; + (internal, Prev, N) -> + Self ! {internal,start,Prev,N}, + {keep_state,N + 1}; + ({call,From}, echo, N) -> + {next_state,wait,N + 1,{reply,From,{echo,start,N}}}; + ({call,From}, {stop,Reason}, N) -> + {stop_and_reply,Reason,[{reply,From,{stop,N}}],N + 1} + end, + wait => + fun (enter, Prev, N) -> + Self ! {enter,wait,Prev,N}, + {keep_state,N + 1}; + ({call,From}, echo, N) -> + {next_state,start,N + 1, + [{next_event,internal,wait}, + {reply,From,{echo,wait,N}}]} + end}, + {ok,STM} = + gen_statem:start_link( + ?MODULE, {map_statem,Machine,[state_enter]}, []), + + [{enter,start,start,1}] = flush(), + {echo,start,2} = gen_statem:call(STM, echo), + [{enter,wait,start,3}] = flush(), + {wait,[4|_]} = sys:get_state(STM), + {echo,wait,4} = gen_statem:call(STM, echo), + [{enter,start,wait,5},{internal,start,wait,6}] = flush(), + {stop,7} = gen_statem:call(STM, {stop,bye}), + [{'EXIT',STM,bye}] = flush(), + + {noproc,_} = + ?EXPECT_FAILURE(gen_statem:call(STM, hej), Reason), + case flush() of + [] -> + ok; + Other2 -> + ct:fail({unexpected,Other2}) + end. + + + event_order(_Config) -> process_flag(trap_exit, true), @@ -579,7 +680,7 @@ event_order(_Config) -> Result end}, - {ok,STM} = gen_statem:start_link(?MODULE, {map_statem,Machine}, []), + {ok,STM} = gen_statem:start_link(?MODULE, {map_statem,Machine,[]}, []), Self = self(), Tag1 = make_ref(), gen_statem:cast(STM, {reply,{Self,Tag1},ok1}), @@ -609,6 +710,97 @@ event_order(_Config) -> +state_timeout(_Config) -> + process_flag(trap_exit, true), + + Machine = + #{init => + fun () -> + {ok,start,0} + end, + start => + fun + ({call,From}, {go,Time}, 0) -> + self() ! message_to_self, + {next_state, state1, {Time,From}, + %% Verify that internal events goes before external + [{state_timeout,Time,1}, + {next_event,internal,1}]} + end, + state1 => + fun + (internal, 1, Data) -> + %% Verify that a state change cancels timeout 1 + {next_state, state2, Data, + [{timeout,0,2}, + {state_timeout,0,2}, + {next_event,internal,2}]} + end, + state2 => + fun + (internal, 2, Data) -> + %% Verify that {state_timeout,0,_} + %% comes after next_event and that + %% {timeout,0,_} is cancelled by + %% pending {state_timeout,0,_} + {keep_state, {ok,2,Data}, + [{timeout,0,3}]}; + (state_timeout, 2, {ok,2,Data}) -> + %% Verify that timeout 0's are processed + %% in order + {keep_state, {ok,3,Data}, + [{timeout,0,4},{state_timeout,0,5}]}; + (timeout, 4, {ok,3,Data}) -> + %% Verify that timeout 0 is cancelled by + %% enqueued state_timeout 0 and that + %% multiple state_timeout 0 can be enqueued + {keep_state, {ok,4,Data}, + [{state_timeout,0,6},{timeout,0,7}]}; + (state_timeout, 5, {ok,4,Data}) -> + {keep_state, {ok,5,Data}}; + (state_timeout, 6, {ok,5,{Time,From}}) -> + {next_state, state3, 6, + [{reply,From,ok}, + {state_timeout,Time,8}]} + end, + state3 => + fun + (info, message_to_self, 6) -> + {keep_state, 7}; + ({call,From}, check, 7) -> + {keep_state, From}; + (state_timeout, 8, From) -> + {stop_and_reply, normal, + {reply,From,ok}} + end}, + + {ok,STM} = gen_statem:start_link(?MODULE, {map_statem,Machine,[]}, []), + sys:trace(STM, true), + TRef = erlang:start_timer(1000, self(), kull), + ok = gen_statem:call(STM, {go,500}), + ok = gen_statem:call(STM, check), + receive + {timeout,TRef,kull} -> + ct:fail(late_timeout) + after 0 -> + receive + {timeout,TRef,kull} -> + ok + after 1000 -> + ct:fail(no_check_timeout) + end + end, + receive + {'EXIT',STM,normal} -> + ok + after 500 -> + ct:fail(did_not_stop) + end, + + verify_empty_msgq(). + + + sys1(Config) -> {ok,Pid} = gen_statem:start(?MODULE, start_arg(Config, []), []), {status, Pid, {module,gen_statem}, _} = sys:get_status(Pid), @@ -1271,9 +1463,9 @@ init({callback_mode,CallbackMode,Arg}) -> ets:new(?MODULE, [named_table,private]), ets:insert(?MODULE, {callback_mode,CallbackMode}), init(Arg); -init({map_statem,#{init := Init}=Machine}) -> +init({map_statem,#{init := Init}=Machine,Modes}) -> ets:new(?MODULE, [named_table,private]), - ets:insert(?MODULE, {callback_mode,handle_event_function}), + ets:insert(?MODULE, {callback_mode,[handle_event_function|Modes]}), case Init() of {ok,State,Data,Ops} -> {ok,State,[Data|Machine],Ops}; diff --git a/lib/stdlib/test/ms_transform_SUITE.erl b/lib/stdlib/test/ms_transform_SUITE.erl index 1c5faa960b..f35013b1b2 100644 --- a/lib/stdlib/test/ms_transform_SUITE.erl +++ b/lib/stdlib/test/ms_transform_SUITE.erl @@ -296,6 +296,8 @@ basic_dbg(Config) when is_list(Config) -> compile_and_run(<<"dbg:fun2ms(fun([A,B]) -> bindings() end)">>), [{['$1','$2'],[],['$_']}] = compile_and_run(<<"dbg:fun2ms(fun([A,B]) -> object() end)">>), + [{[],[],[{return_trace}]}] = + compile_and_run(<<"dbg:fun2ms(fun([]) -> return_trace() end)">>), ok. %% Test calling of ets/dbg:fun2ms from the shell. diff --git a/lib/stdlib/test/rand_SUITE.erl b/lib/stdlib/test/rand_SUITE.erl index cb778c96d4..02b7cb10c2 100644 --- a/lib/stdlib/test/rand_SUITE.erl +++ b/lib/stdlib/test/rand_SUITE.erl @@ -18,7 +18,11 @@ %% %CopyrightEnd% -module(rand_SUITE). --export([all/0, suite/0,groups/0]). +-compile({nowarn_deprecated_function,[{random,seed,1}, + {random,uniform_s,1}, + {random,uniform_s,2}]}). + +-export([all/0, suite/0, groups/0, group/1]). -export([interval_int/1, interval_float/1, seed/1, api_eq/1, reference/1, @@ -47,18 +51,22 @@ groups() -> [{basic_stats, [parallel], [basic_stats_uniform_1, basic_stats_uniform_2, basic_stats_normal]}]. +group(basic_stats) -> + %% valgrind needs a lot of time + [{timetrap,{minutes,10}}]. + %% A simple helper to test without test_server during dev test() -> Tests = all(), lists:foreach(fun(Test) -> - try - ok = ?MODULE:Test([]), - io:format("~p: ok~n", [Test]) - catch _:Reason -> - io:format("Failed: ~p: ~p ~p~n", - [Test, Reason, erlang:get_stacktrace()]) - end - end, Tests). + try + ok = ?MODULE:Test([]), + io:format("~p: ok~n", [Test]) + catch _:Reason -> + io:format("Failed: ~p: ~p ~p~n", + [Test, Reason, erlang:get_stacktrace()]) + end + end, Tests). algs() -> [exs64, exsplus, exs1024]. diff --git a/lib/stdlib/test/tar_SUITE.erl b/lib/stdlib/test/tar_SUITE.erl index 64dd41e75a..6f3979bb77 100644 --- a/lib/stdlib/test/tar_SUITE.erl +++ b/lib/stdlib/test/tar_SUITE.erl @@ -720,20 +720,25 @@ memory(Config) when is_list(Config) -> %% Test filenames with characters outside the US ASCII range. unicode(Config) when is_list(Config) -> - PrivDir = proplists:get_value(priv_dir, Config), - do_unicode(PrivDir), + run_unicode_node(Config, "+fnu"), case has_transparent_naming() of true -> - Pa = filename:dirname(code:which(?MODULE)), - Node = start_node(unicode, "+fnl -pa "++Pa), - ok = rpc:call(Node, erlang, apply, - [fun() -> do_unicode(PrivDir) end,[]]), - true = test_server:stop_node(Node), - ok; + run_unicode_node(Config, "+fnl"); false -> ok end. +run_unicode_node(Config, Option) -> + PrivDir = proplists:get_value(priv_dir, Config), + Pa = filename:dirname(code:which(?MODULE)), + Args = Option ++ " -pa "++Pa, + io:format("~s\n", [Args]), + Node = start_node(unicode, Args), + ok = rpc:call(Node, erlang, apply, + [fun() -> do_unicode(PrivDir) end,[]]), + true = test_server:stop_node(Node), + ok. + has_transparent_naming() -> case os:type() of {unix,darwin} -> false; @@ -745,10 +750,11 @@ do_unicode(PrivDir) -> ok = file:set_cwd(PrivDir), ok = file:make_dir("unicöde"), - Names = unicode_create_files(), + Names = lists:sort(unicode_create_files()), Tar = "unicöde.tar", ok = erl_tar:create(Tar, ["unicöde"], []), - {ok,Names} = erl_tar:table(Tar, []), + {ok,Names0} = erl_tar:table(Tar, []), + Names = lists:sort(Names0), _ = [ok = file:delete(Name) || Name <- Names], ok = erl_tar:extract(Tar), _ = [{ok,_} = file:read_file(Name) || Name <- Names], diff --git a/lib/tools/emacs/Makefile b/lib/tools/emacs/Makefile index 585425e5f1..35c93ba4ed 100644 --- a/lib/tools/emacs/Makefile +++ b/lib/tools/emacs/Makefile @@ -38,11 +38,13 @@ MAN_FILES= \ tags.3 EMACS_FILES= \ + erldoc \ erlang-skels \ erlang-skels-old \ erlang_appwiz \ erlang-start \ erlang-eunit \ + erlang-edoc \ erlang-flymake \ erlang diff --git a/lib/tools/emacs/erlang-edoc.el b/lib/tools/emacs/erlang-edoc.el new file mode 100644 index 0000000000..034036ad04 --- /dev/null +++ b/lib/tools/emacs/erlang-edoc.el @@ -0,0 +1,172 @@ +;;; erlang-edoc.el --- EDoc support for Erlang mode -*- lexical-binding: t; -*- + +;; %CopyrightBegin% +;; +;; Copyright Ericsson AB 1996-2016. All Rights Reserved. +;; +;; Licensed under the Apache License, Version 2.0 (the "License"); +;; you may not use this file except in compliance with the License. +;; You may obtain a copy of the License at +;; +;; http://www.apache.org/licenses/LICENSE-2.0 +;; +;; Unless required by applicable law or agreed to in writing, software +;; distributed under the License is distributed on an "AS IS" BASIS, +;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +;; See the License for the specific language governing permissions and +;; limitations under the License. +;; +;; %CopyrightEnd% + +;;; Commentary: + +;; Ref: http://www.erlang.org/doc/apps/edoc/users_guide.html +;; +;; To use: (add-hook 'erlang-mode-hook 'erlang-edoc-mode) + +;;; Code: + +(defcustom erlang-edoc-indent-level 2 + "Indentation level of xhtml in Erlang edoc." + :safe 'integerp + :group 'erlang) + +(defvar erlang-edoc-generic-tags + '("clear" "docfile" "end" "headerfile" "todo" "TODO" "type") + "Tags that can be used anywhere within a module.") + +(defvar erlang-edoc-overview-tags + '("author" "copyright" "reference" "see" "since" "title" "version") + "Tags that can be used in an overview file.") + +(defvar erlang-edoc-module-tags + '("author" "copyright" "deprecated" "doc" "hidden" "private" "reference" + "see" "since" "version") + "Tags that can be used before a module declaration.") + +(defvar erlang-edoc-function-tags + '("deprecated" "doc" "equiv" "hidden" "private" "see" "since" "spec" + "throws" "type") + "Tags that can be used before a function definition.") + +(defvar erlang-edoc-predefined-macros + '("date" "docRoot" "link" "module" "package" "section" "time" + "type" "version")) + +(defface erlang-edoc-tag '((t (:inherit font-lock-constant-face))) + "Face used to highlight edoc tags." + :group 'erlang) + +(defface erlang-edoc-macro '((t (:inherit font-lock-preprocessor-face))) + "Face used to highlight edoc macros." + :group 'erlang) + +(defface erlang-edoc-verbatim + '((t (:family "Monospace" :inherit font-lock-keyword-face))) + "Face used to highlight verbatim text." + :group 'erlang) + +(defface erlang-edoc-todo '((t (:inherit font-lock-warning-face))) + "Face used to highlight edoc macros." + :group 'erlang) + +(defface erlang-edoc-heading '((t (:inherit bold))) + "Face used to highlight edoc headings." + :group 'erlang) + +(defvar erlang-edoc-font-lock-keywords + '(("^%+\\s-*\\(@\\w+\\)\\_>" 1 'erlang-edoc-tag prepend) + ("^%+\\s-*" ("{\\(@\\w+\\)\\_>" nil nil (1 'erlang-edoc-macro prepend))) + ("^%+\\s-*" ("\\(?:@@\\)*\\(@[@{}]\\)" nil nil (1 'escape-glyph prepend))) + ("^%+\\s-*@\\(deprecated\\)\\_>" 1 font-lock-warning-face prepend) + ;; http://www.erlang.org/doc/apps/edoc/chapter.html#Wiki_notation + ("^%+\\s-*" ("[^`]`\\([^`]?\\|[^`].*?[^']\\)'" + (forward-char -1) nil (1 'erlang-edoc-verbatim prepend))) + ("^%+\\s-*" ("\\[\\(\\(?:https?\\|file\\|ftp\\)://[^][]+\\)\\]" + nil nil (1 'link prepend))) + ("^%+\\s-*\\(?:\\(?1:@todo\\|@TODO\\)\\_>\\|\\(?1:TODO\\):\\)" + 1 'erlang-edoc-todo prepend) + ("^%+\\s-*\\(\\(=\\{2,4\\}\\)[^=\n].*[^=\n]\\2\\)\\s-*$" + 1 'erlang-edoc-heading prepend))) + +(defun erlang-edoc-xml-context () + "Parse edoc x(ht)ml context at comment start of current line." + (eval-and-compile (require 'xmltok)) + (save-excursion + (beginning-of-line) + (when (looking-at "^%+\\s-*") + (let ((pt (match-end 0)) context) + (forward-comment (- (point))) + (while (< (point) pt) + (xmltok-forward) + (cond ((eq xmltok-type 'start-tag) + (push (cons xmltok-type xmltok-start) context)) + ((eq xmltok-type 'end-tag) + (pop context)))) + (goto-char pt) + (xmltok-forward) + (push (car (memq xmltok-type '(start-tag end-tag))) context) + context)))) + +(defun erlang-edoc-indent-line () + (let ((context (erlang-edoc-xml-context))) + (when context + (save-excursion + (beginning-of-line) + (re-search-forward "^%+\\s-*" (line-end-position)) + (when (or (car context) (cadr context)) + (let ((pad (when (cadr context) + (save-excursion + (goto-char (cdr (cadr context))) + (- (current-column) + (progn + (beginning-of-line) + (skip-chars-forward "%") + (current-column))))))) + (just-one-space (cond ((not pad) 1) + ((eq (car context) 'end-tag) pad) + (t (+ erlang-edoc-indent-level pad))))))) + (when (looking-back "^%*\\s-*" (line-beginning-position)) + (re-search-forward "\\=%*\\s-*"))))) + +(defun erlang-edoc-before-module-declaration-p () + (save-excursion + (beginning-of-line) + (forward-comment (point-max)) + (or (eobp) (re-search-forward "^-module\\s-*(" nil t)))) + +(defun erlang-edoc-completion-at-point () + (when (eq (syntax-ppss-context (syntax-ppss)) 'comment) + (save-excursion + (skip-syntax-backward "w_") + (when (= (preceding-char) ?@) + (let* ((is-tag (looking-back "^%+\\s-*@" (line-beginning-position))) + (beg (point)) + (end (progn (skip-syntax-forward "w_") (point))) + (table (cond + ((not is-tag) + erlang-edoc-predefined-macros) + ((erlang-edoc-before-module-declaration-p) + (append erlang-edoc-module-tags + erlang-edoc-generic-tags)) + (t (append erlang-edoc-function-tags + erlang-edoc-generic-tags))))) + (list beg end table)))))) + +;;;###autoload +(define-minor-mode erlang-edoc-mode nil + :lighter " EDoc" + (cond (erlang-edoc-mode + (add-hook 'erlang-indent-line-hook #'erlang-edoc-indent-line nil t) + (font-lock-add-keywords nil erlang-edoc-font-lock-keywords t) + (add-hook 'completion-at-point-functions + #'erlang-edoc-completion-at-point nil t)) + (t + (remove-hook 'erlang-indent-line-hook #'erlang-edoc-indent-line t) + (font-lock-remove-keywords nil erlang-edoc-font-lock-keywords) + (remove-hook 'completion-at-point-functions + #'erlang-edoc-completion-at-point t))) + (jit-lock-refontify)) + +(provide 'erlang-edoc) +;;; erlang-edoc.el ends here diff --git a/lib/tools/emacs/erlang-skels.el b/lib/tools/emacs/erlang-skels.el index 0284c9d686..eeba7f34e9 100644 --- a/lib/tools/emacs/erlang-skels.el +++ b/lib/tools/emacs/erlang-skels.el @@ -904,7 +904,7 @@ Please see the function `tempo-define-template'.") "%% @doc" n "%% Define the callback_mode() for this callback module." n (erlang-skel-separator-end 2) - "-spec callback_mode() -> gen_statem:callback_mode()." n + "-spec callback_mode() -> gen_statem:callback_mode_result()." n "callback_mode() -> state_functions." n n (erlang-skel-separator-start 2) @@ -931,14 +931,16 @@ Please see the function `tempo-define-template'.") "%% Whenever a gen_statem receives an event, the function " n "%% with the name of the current state (StateName) " n "%% is called to handle the event." n - "%%" n - "%% NOTE: If there is an exported function handle_event/4, it is called" n - "%% instead of StateName/3 functions like this!" n (erlang-skel-separator-end 2) - "-spec state_name(" n> - "gen_statem:event_type(), Msg :: term()," n> + "-spec state_name('enter'," n> + "OldState :: atom()," n> + "Data :: term()) ->" n> + "gen_statem:state_enter_result('state_name');" n> + "(gen_statem:event_type()," n> + "Msg :: term()," n> "Data :: term()) ->" n> - "gen_statem:state_function_result()." n + "gen_statem:event_handler_result(atom())." n + ;; "state_name({call,Caller}, _Msg, Data) ->" n> "{next_state, state_name, Data, [{reply,Caller,ok}]}." n n @@ -1015,7 +1017,7 @@ Please see the function `tempo-define-template'.") "%% @doc" n "%% Define the callback_mode() for this callback module." n (erlang-skel-separator-end 2) - "-spec callback_mode() -> gen_statem:callback_mode()." n + "-spec callback_mode() -> gen_statem:callback_mode_result()." n "callback_mode() -> handle_event_function." n n (erlang-skel-separator-start 2) @@ -1039,14 +1041,18 @@ Please see the function `tempo-define-template'.") "%% @private" n "%% @doc" n "%% This function is called for every event a gen_statem receives." n - "%%" n - "%% NOTE: If there is no exported function handle_event/4," n - "%% StateName/3 functions are called instead!" n (erlang-skel-separator-end 2) - "-spec handle_event(" n> - "gen_statem:event_type(), Msg :: term()," n> - "State :: term(), Data :: term()) ->" n> - "gen_statem:handle_event_result()." n + "-spec handle_event('enter'," n> + "OldState :: term()," n> + "State :: term()," n> + "Data :: term()) ->" n> + "gen_statem:state_enter_result(term());" n> + "(gen_statem:event_type()," n> + "Msg :: term()," n> + "State :: term()," n> + "Data :: term()) ->" n> + "gen_statem:event_handler_result(term())." n + ;; "handle_event({call,From}, _Msg, State, Data) ->" n> "{next_state, State, Data, [{reply,From,ok}]}." n n diff --git a/lib/tools/emacs/erlang-start.el b/lib/tools/emacs/erlang-start.el index 76e0575e68..160057e179 100644 --- a/lib/tools/emacs/erlang-start.el +++ b/lib/tools/emacs/erlang-start.el @@ -78,6 +78,21 @@ (autoload 'erlang-find-tag-other-window "erlang" "Like `find-tag-other-window'. Capable of retreiving Erlang modules.") +;; +;; Declare functions in "erlang-edoc.el". +;; + +(autoload 'erlang-edoc-mode "erlang-edoc" "Toggle Erlang-Edoc mode on or off." t) + +;; +;; Declare functions in "erldoc.el". +;; + +(autoload 'erldoc-browse "erldoc" "\n\n(fn MFA)" t nil) +(autoload 'erldoc-browse-topic "erldoc" "\n\n(fn TOPIC)" t nil) +(autoload 'erldoc-apropos "erldoc" "\n\n(fn PATTERN)" t nil) +(autoload 'erldoc-eldoc-function "erldoc" "\ +A function suitable for `eldoc-documentation-function'.\n\n(fn)" nil nil) ;; ;; Associate files extensions ".erl" and ".hrl" with Erlang mode. diff --git a/lib/tools/emacs/erlang.el b/lib/tools/emacs/erlang.el index 73c6b8d768..40f0bb7f80 100644 --- a/lib/tools/emacs/erlang.el +++ b/lib/tools/emacs/erlang.el @@ -59,7 +59,7 @@ ;; Please state as exactly as possible: ;; - Version number of Erlang Mode (see the menu), Emacs, Erlang, -;; and of any other relevant software. +;; and of any other relevant software. ;; - What the expected result was. ;; - What you did, preferably in a repeatable step-by-step form. ;; - A description of the unexpected result. @@ -78,6 +78,10 @@ ;; Variables: +(defgroup erlang nil + "The Erlang programming language." + :group 'languages) + (defconst erlang-version "2.7" "The version number of Erlang mode.") @@ -91,20 +95,20 @@ Erlang mode menu.") (eval-and-compile (defconst erlang-emacs-major-version (if (boundp 'emacs-major-version) - emacs-major-version + emacs-major-version (string-match "\\([0-9]+\\)\\.\\([0-9]+\\)" emacs-version) (erlang-string-to-int (substring emacs-version - (match-beginning 1) (match-end 1)))) + (match-beginning 1) (match-end 1)))) "Major version number of Emacs.")) (eval-and-compile (defconst erlang-emacs-minor-version - (if (boundp 'emacs-minor-version) - emacs-minor-version - (string-match "\\([0-9]+\\)\\.\\([0-9]+\\)" emacs-version) - (erlang-string-to-int (substring emacs-version - (match-beginning 2) (match-end 2)))) - "Minor version number of Emacs.")) + (if (boundp 'emacs-minor-version) + emacs-minor-version + (string-match "\\([0-9]+\\)\\.\\([0-9]+\\)" emacs-version) + (erlang-string-to-int (substring emacs-version + (match-beginning 2) (match-end 2)))) + "Minor version number of Emacs.")) (defconst erlang-xemacs-p (string-match "Lucid\\|XEmacs" emacs-version) "Non-nil when running under XEmacs or Lucid Emacs.") @@ -119,12 +123,12 @@ buffers in Erlang mode, just like under GNU Emacs. Never EVER set this variable!") (defvar erlang-menu-items '(erlang-menu-base-items - erlang-menu-skel-items - erlang-menu-shell-items - erlang-menu-compile-items - erlang-menu-man-items - erlang-menu-personal-items - erlang-menu-version-items) + erlang-menu-skel-items + erlang-menu-shell-items + erlang-menu-compile-items + erlang-menu-man-items + erlang-menu-personal-items + erlang-menu-version-items) "*List of menu item list to combine to create Erlang mode menu. External programs which temporarily add menu items to the Erlang mode @@ -170,7 +174,7 @@ variable.") ("TAGS" (("Find Tag" find-tag) ("Find Next Tag" erlang-find-next-tag) - ;("Find Regexp" find-tag-regexp) + ;("Find Regexp" find-tag-regexp) ("Complete Word" erlang-complete-tag) ("Tags Apropos" tags-apropos) ("Search Files" tags-search)))) @@ -558,35 +562,35 @@ This is an elisp list of options. Each option can be either: Supporting \_< and \_> This is determined by checking the version of Emacs used.")) (eval-and-compile - (defconst erlang-atom-quoted-regexp + (defconst erlang-atom-quoted-regexp "'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'" "Regexp describing a single-quoted atom")) (eval-and-compile (defconst erlang-atom-regular-regexp (if erlang-regexp-modern-p - "\\_<[[:lower:]]\\(?:\\sw\\|\\s_\\)*\\_>" + "\\_<[[:lower:]]\\(?:\\sw\\|\\s_\\)*\\_>" "\\<[[:lower:]]\\(?:\\sw\\|\\s_\\)*\\>") "Regexp describing a regular (non-quoted) atom")) (eval-and-compile - (defconst erlang-atom-regexp - (concat "\\(" erlang-atom-quoted-regexp "\\|" - erlang-atom-regular-regexp "\\)") + (defconst erlang-atom-regexp + (concat "\\(" erlang-atom-quoted-regexp "\\|" + erlang-atom-regular-regexp "\\)") "Regexp describing an Erlang atom.")) (eval-and-compile (defconst erlang-atom-regexp-matches 1 "Number of regexp parenthesis pairs in `erlang-atom-regexp'. - + This is used to determine parenthesis matches in complex regexps which contains `erlang-atom-regexp'.")) (eval-and-compile - (defconst erlang-variable-regexp - (if erlang-regexp-modern-p - "\\_<\\([[:upper:]_]\\(?:\\sw\\|\\s_\\)*\\)\\_>" + (defconst erlang-variable-regexp + (if erlang-regexp-modern-p + "\\_<\\([[:upper:]_]\\(?:\\sw\\|\\s_\\)*\\)\\_>" "\\<\\([[:upper:]_]\\(?:\\sw\\|\\s_\\)*\\)\\>") "Regexp which should match an Erlang variable. @@ -605,13 +609,13 @@ This is used to determine matches in complex regexps which contains "Like `regexp-opt', except if PAREN is `symbols', then the resulting regexp is surrounded by \\_< and \\_>." (if (eq paren 'symbols) - (if erlang-regexp-modern-p - (concat "\\_<" (regexp-opt strings t) "\\_>") - (concat "\\<" (regexp-opt strings t) "\\>")) + (if erlang-regexp-modern-p + (concat "\\_<" (regexp-opt strings t) "\\_>") + (concat "\\<" (regexp-opt strings t) "\\>")) (regexp-opt strings paren)))) -(eval-and-compile +(eval-and-compile (defvar erlang-keywords '("after" "begin" @@ -630,7 +634,7 @@ resulting regexp is surrounded by \\_< and \\_>." (eval-and-compile (defconst erlang-keywords-regexp (erlang-regexp-opt erlang-keywords 'symbols))) - + (eval-and-compile (defvar erlang-operators '("and" @@ -653,7 +657,7 @@ resulting regexp is surrounded by \\_< and \\_>." (eval-and-compile (defconst erlang-operators-regexp (erlang-regexp-opt erlang-operators 'symbols))) - + (eval-and-compile (defvar erlang-guards @@ -676,7 +680,7 @@ resulting regexp is surrounded by \\_< and \\_>." "binary" "bitstring" "boolean" - ;;"float" ; Not included to avoid clashes with the bif float/1 + ;;"float" ; Not included to avoid clashes with the bif float/1 "function" "integer" "list" @@ -722,7 +726,7 @@ resulting regexp is surrounded by \\_< and \\_>." "Erlang type specs types")) (eval-and-compile - (defconst erlang-predefined-types-regexp + (defconst erlang-predefined-types-regexp (erlang-regexp-opt erlang-predefined-types 'symbols))) @@ -842,7 +846,7 @@ resulting regexp is surrounded by \\_< and \\_>." (eval-and-compile (defconst erlang-int-bif-regexp (erlang-regexp-opt erlang-int-bifs 'symbols))) - + (eval-and-compile (defvar erlang-ext-bifs @@ -997,8 +1001,8 @@ behaviour.") (let ((map (make-sparse-keymap))) (unless (boundp 'indent-line-function) (define-key map "\t" 'erlang-indent-command)) - (define-key map ";" 'erlang-electric-semicolon) - (define-key map "," 'erlang-electric-comma) + (define-key map ";" 'erlang-electric-semicolon) + (define-key map "," 'erlang-electric-comma) (define-key map "<" 'erlang-electric-lt) (define-key map ">" 'erlang-electric-gt) (define-key map "\C-m" 'erlang-electric-newline) @@ -1010,7 +1014,7 @@ behaviour.") (unless (boundp 'beginning-of-defun-function) (define-key map "\M-\C-a" 'erlang-beginning-of-function) (define-key map "\M-\C-e" 'erlang-end-of-function) - (define-key map '(meta control h) 'erlang-mark-function)) ; Xemacs + (define-key map '(meta control h) 'erlang-mark-function)) ; Xemacs (define-key map "\M-\t" 'erlang-complete-tag) (define-key map "\C-c\M-\t" 'tempo-complete-tag) (define-key map "\M-+" 'erlang-find-next-tag) @@ -1064,7 +1068,7 @@ behaviour.") (defvar erlang-font-lock-keywords-function-header (list (list (concat "^" erlang-atom-regexp "\\s-*(") - 1 'font-lock-function-name-face t)) + 1 'font-lock-function-name-face t)) "Font lock keyword highlighting a function header.") (defface erlang-font-lock-exported-function-name-face @@ -1086,7 +1090,7 @@ behaviour.") (defvar erlang-font-lock-keywords-exported-function-header (list (list #'erlang-match-next-exported-function - 1 'erlang-font-lock-exported-function-name-face t)) + 1 'erlang-font-lock-exported-function-name-face t)) "Font lock keyword highlighting an exported function header.") (defvar erlang-font-lock-keywords-int-bifs @@ -1098,8 +1102,8 @@ behaviour.") (defvar erlang-font-lock-keywords-ext-bifs (list (list (concat "\\<\\(erlang\\)\\s-*:\\s-*" erlang-ext-bif-regexp "\\s-*(") - '(1 'font-lock-builtin-face) - '(2 'font-lock-builtin-face))) + '(1 'font-lock-builtin-face) + '(2 'font-lock-builtin-face))) "Font lock keyword highlighting built in functions.") (defvar erlang-font-lock-keywords-int-function-calls @@ -1113,7 +1117,7 @@ behaviour.") (list (concat erlang-atom-regexp "\\s-*:\\s-*" erlang-atom-regexp "\\s-*(") '(1 'font-lock-type-face) - '(2 'font-lock-type-face))) + '(2 'font-lock-type-face))) "Font lock keyword highlighting an external function call.") (defvar erlang-font-lock-keywords-fun-n @@ -1131,7 +1135,7 @@ behaviour.") (defvar erlang-font-lock-keywords-dollar (list (list "\\(\\$\\([^\\]\\|\\\\\\([^0-7^\n]\\|[0-7]+\\|\\^[a-zA-Z]\\)\\)\\)" - 1 'font-lock-constant-face)) + 1 'font-lock-constant-face)) "Font lock keyword highlighting numbers in ASCII form (e.g. $A).") (defvar erlang-font-lock-keywords-arrow @@ -1151,18 +1155,18 @@ behaviour.") (defvar erlang-font-lock-keywords-attr (list - (list (concat "^\\(-" erlang-atom-regexp "\\)\\(\\s-\\|\\.\\|(\\)") - 1 (if (boundp 'font-lock-preprocessor-face) - 'font-lock-preprocessor-face - 'font-lock-constant-face))) + (list (concat "^\\(-" erlang-atom-regexp "\\)\\(\\s-\\|\\.\\|(\\)") + 1 (if (boundp 'font-lock-preprocessor-face) + 'font-lock-preprocessor-face + 'font-lock-constant-face))) "Font lock keyword highlighting attributes.") (defvar erlang-font-lock-keywords-quotes (list (list "`\\([-+a-zA-Z0-9_:*][-+a-zA-Z0-9_:*]+\\)'" - 1 - 'font-lock-keyword-face - t)) + 1 + 'font-lock-keyword-face + t)) "Font lock keyword highlighting words in single quotes in comments. This is not the highlighting of Erlang strings and atoms, which @@ -1171,27 +1175,27 @@ are highlighted by syntactic analysis.") (defvar erlang-font-lock-keywords-guards (list (list (concat "[^:]" erlang-guards-regexp "\\s-*(") - 1 'font-lock-builtin-face)) + 1 'font-lock-builtin-face)) "Font lock keyword highlighting guards.") (defvar erlang-font-lock-keywords-predefined-types (list (list (concat "[^:]" erlang-predefined-types-regexp "\\s-*(") - 1 'font-lock-builtin-face)) + 1 'font-lock-builtin-face)) "Font lock keyword highlighting predefined types.") (defvar erlang-font-lock-keywords-macros (list (list (concat "?\\s-*\\(" erlang-atom-regexp - "\\|" erlang-variable-regexp "\\)") - 1 'font-lock-constant-face) + "\\|" erlang-variable-regexp "\\)") + 1 'font-lock-constant-face) (list (concat "^\\(-\\(?:define\\|ifn?def\\)\\)\\s-*(\\s-*\\(" erlang-atom-regexp - "\\|" erlang-variable-regexp "\\)") - (if (boundp 'font-lock-preprocessor-face) - (list 1 'font-lock-preprocessor-face t) - (list 1 'font-lock-constant-face t)) - (list 3 'font-lock-type-face t t)) + "\\|" erlang-variable-regexp "\\)") + (if (boundp 'font-lock-preprocessor-face) + (list 1 'font-lock-preprocessor-face t) + (list 1 'font-lock-constant-face t)) + (list 3 'font-lock-type-face t t)) (list "^-e\\(lse\\|ndif\\)\\>" 0 'font-lock-preprocessor-face t)) "Font lock keyword highlighting macros. This must be placed in front of `erlang-font-lock-keywords-vars'.") @@ -1202,8 +1206,8 @@ This must be placed in front of `erlang-font-lock-keywords-vars'.") 1 'font-lock-type-face) ;; Don't highlight numerical constants. (list (if erlang-regexp-modern-p - "\\_<[0-9]+#\\([0-9a-zA-Z]+\\)" - "\\<[0-9]+#\\([0-9a-zA-Z]+\\)") + "\\_<[0-9]+#\\([0-9a-zA-Z]+\\)" + "\\<[0-9]+#\\([0-9a-zA-Z]+\\)") 1 nil t) (list (concat "^-record\\s-*(\\s-*" erlang-atom-regexp) 1 'font-lock-type-face)) @@ -1212,8 +1216,8 @@ This must be placed in front of `erlang-font-lock-keywords-vars'.") (defvar erlang-font-lock-keywords-vars (list - (list (concat "[^#]" erlang-variable-regexp) ; no numerical constants - 1 'font-lock-variable-name-face)) + (list (concat "[^#]" erlang-variable-regexp) ; no numerical constants + 1 'font-lock-variable-name-face)) "Font lock keyword highlighting Erlang variables. Must be preceded by `erlang-font-lock-keywords-macros' to work properly.") @@ -1236,32 +1240,32 @@ Example: (defvar erlang-font-lock-keywords-1 (append erlang-font-lock-keywords-function-header - erlang-font-lock-keywords-dollar - erlang-font-lock-keywords-arrow - erlang-font-lock-keywords-keywords - ) + erlang-font-lock-keywords-dollar + erlang-font-lock-keywords-arrow + erlang-font-lock-keywords-keywords + ) ;; DocStringOrig: erlang-font-lock-keywords erlang-font-lock-descr-string) (defvar erlang-font-lock-keywords-2 (append erlang-font-lock-keywords-1 - erlang-font-lock-keywords-int-bifs - erlang-font-lock-keywords-ext-bifs - erlang-font-lock-keywords-attr - erlang-font-lock-keywords-quotes - erlang-font-lock-keywords-guards - ) + erlang-font-lock-keywords-int-bifs + erlang-font-lock-keywords-ext-bifs + erlang-font-lock-keywords-attr + erlang-font-lock-keywords-quotes + erlang-font-lock-keywords-guards + ) ;; DocStringCopy: erlang-font-lock-keywords erlang-font-lock-descr-string) (defvar erlang-font-lock-keywords-3 (append erlang-font-lock-keywords-2 - erlang-font-lock-keywords-operators - erlang-font-lock-keywords-macros - erlang-font-lock-keywords-records - erlang-font-lock-keywords-vars - erlang-font-lock-keywords-predefined-types - ) + erlang-font-lock-keywords-operators + erlang-font-lock-keywords-macros + erlang-font-lock-keywords-records + erlang-font-lock-keywords-vars + erlang-font-lock-keywords-predefined-types + ) ;; DocStringCopy: erlang-font-lock-keywords erlang-font-lock-descr-string) @@ -1269,10 +1273,10 @@ Example: (append erlang-font-lock-keywords-3 erlang-font-lock-keywords-exported-function-header erlang-font-lock-keywords-int-function-calls - erlang-font-lock-keywords-ext-function-calls - erlang-font-lock-keywords-fun-n + erlang-font-lock-keywords-ext-function-calls + erlang-font-lock-keywords-fun-n erlang-font-lock-keywords-lc - ) + ) ;; DocStringCopy: erlang-font-lock-keywords erlang-font-lock-descr-string) @@ -1333,17 +1337,17 @@ replaced by `erlang-etags-tags-completion-table'.") (eval-when-compile (if (or (featurep 'bytecomp) - (featurep 'byte-compile)) + (featurep 'byte-compile)) (progn - (cond ((string-match "Lucid\\|XEmacs" emacs-version) - (put 'comment-indent-hook 'byte-obsolete-variable nil) - ;; Do not warn for unused variables - ;; when compiling under XEmacs. - (setq byte-compile-warnings - '(free-vars unresolved callargs redefine)))) - (require 'comint) - (require 'tempo) - (require 'compile)))) + (cond ((string-match "Lucid\\|XEmacs" emacs-version) + (put 'comment-indent-hook 'byte-obsolete-variable nil) + ;; Do not warn for unused variables + ;; when compiling under XEmacs. + (setq byte-compile-warnings + '(free-vars unresolved callargs redefine)))) + (require 'comint) + (require 'tempo) + (require 'compile)))) (defun erlang-version () @@ -1351,7 +1355,7 @@ replaced by `erlang-etags-tags-completion-table'.") (interactive) (if (erlang-interactive-p) (message "Erlang mode version %s, written by Anders Lindgren" - erlang-version)) + erlang-version)) erlang-version) (defun erlang-interactive-p () @@ -1389,7 +1393,7 @@ useful commands: C-c C-q - Indent current function. M-; - Create a comment at the end of the line. M-q - Fill a comment, i.e. wrap lines so that they (hopefully) - will look better. + will look better. M-a - Goto the beginning of an Erlang clause. M-C-a - Ditto for function. M-e - Goto the end of an Erlang clause. @@ -1436,6 +1440,11 @@ Other commands: (erlang-skel-init) (when (fboundp 'tempo-use-tag-list) (tempo-use-tag-list 'erlang-tempo-tags)) + (when (and (fboundp 'add-function) (fboundp 'erldoc-eldoc-function)) + (or eldoc-documentation-function + (setq-local eldoc-documentation-function #'ignore)) + (add-function :before-until (local 'eldoc-documentation-function) + #'erldoc-eldoc-function)) (run-hooks 'erlang-mode-hook) (if (zerop (buffer-size)) (run-hooks 'erlang-new-file-hook))) @@ -1448,35 +1457,35 @@ Other commands: (defun erlang-syntax-table-init () (if (null erlang-mode-syntax-table) (let ((table (make-syntax-table))) - (modify-syntax-entry ?\n ">" table) - (modify-syntax-entry ?\" "\"" table) - (modify-syntax-entry ?# "." table) -;; (modify-syntax-entry ?$ "\\" table) ;; Creates problems with indention afterwards -;; (modify-syntax-entry ?$ "'" table) ;; Creates syntax highlighting and indention problems - (modify-syntax-entry ?$ "/" table) ;; Misses the corner case "string that ends with $" - ;; we have to live with that for now..it is the best alternative - ;; that can be worked around with "string hat ends with \$" - (modify-syntax-entry ?% "<" table) - (modify-syntax-entry ?& "." table) - (modify-syntax-entry ?\' "\"" table) - (modify-syntax-entry ?* "." table) - (modify-syntax-entry ?+ "." table) - (modify-syntax-entry ?- "." table) - (modify-syntax-entry ?/ "." table) - (modify-syntax-entry ?: "." table) - (modify-syntax-entry ?< "." table) - (modify-syntax-entry ?= "." table) - (modify-syntax-entry ?> "." table) - (modify-syntax-entry ?\\ "\\" table) - (modify-syntax-entry ?_ "_" table) - (modify-syntax-entry ?| "." table) - (modify-syntax-entry ?^ "'" table) - - ;; Pseudo bit-syntax: Latin1 double angle quotes as parens. - ;;(modify-syntax-entry ?\253 "(?\273" table) - ;;(modify-syntax-entry ?\273 ")?\253" table) - - (setq erlang-mode-syntax-table table))) + (modify-syntax-entry ?\n ">" table) + (modify-syntax-entry ?\" "\"" table) + (modify-syntax-entry ?# "." table) + ;; (modify-syntax-entry ?$ "\\" table) ;; Creates problems with indention afterwards + ;; (modify-syntax-entry ?$ "'" table) ;; Creates syntax highlighting and indention problems + (modify-syntax-entry ?$ "/" table) ;; Misses the corner case "string that ends with $" + ;; we have to live with that for now..it is the best alternative + ;; that can be worked around with "string hat ends with \$" + (modify-syntax-entry ?% "<" table) + (modify-syntax-entry ?& "." table) + (modify-syntax-entry ?\' "\"" table) + (modify-syntax-entry ?* "." table) + (modify-syntax-entry ?+ "." table) + (modify-syntax-entry ?- "." table) + (modify-syntax-entry ?/ "." table) + (modify-syntax-entry ?: "." table) + (modify-syntax-entry ?< "." table) + (modify-syntax-entry ?= "." table) + (modify-syntax-entry ?> "." table) + (modify-syntax-entry ?\\ "\\" table) + (modify-syntax-entry ?_ "_" table) + (modify-syntax-entry ?| "." table) + (modify-syntax-entry ?^ "'" table) + + ;; Pseudo bit-syntax: Latin1 double angle quotes as parens. + ;;(modify-syntax-entry ?\253 "(?\273" table) + ;;(modify-syntax-entry ?\273 ")?\253" table) + + (setq erlang-mode-syntax-table table))) (set-syntax-table erlang-mode-syntax-table)) @@ -1486,12 +1495,12 @@ Other commands: ;; delsel/pending-del mode. Also, set up text properties for bit ;; syntax handling. (mapc #'(lambda (cmd) - (put cmd 'delete-selection t) ;for delsel (Emacs) - (put cmd 'pending-delete t)) ;for pending-del (XEmacs) - '(erlang-electric-semicolon - erlang-electric-comma - erlang-electric-gt)) - + (put cmd 'delete-selection t) ;for delsel (Emacs) + (put cmd 'pending-delete t)) ;for pending-del (XEmacs) + '(erlang-electric-semicolon + erlang-electric-comma + erlang-electric-gt)) + (put 'bitsyntax-open-outer 'syntax-table '(4 . ?>)) (put 'bitsyntax-open-outer 'rear-nonsticky '(category)) (put 'bitsyntax-open-inner 'rear-nonsticky '(category)) @@ -1512,8 +1521,6 @@ Other commands: (setq paragraph-separate paragraph-start) (make-local-variable 'paragraph-ignore-fill-prefix) (setq paragraph-ignore-fill-prefix t) - (make-local-variable 'require-final-newline) - (setq require-final-newline t) (make-local-variable 'defun-prompt-regexp) (setq defun-prompt-regexp erlang-defun-prompt-regexp) (make-local-variable 'comment-start) @@ -1552,9 +1559,9 @@ Other commands: "Initialize Font Lock for Erlang mode." (or erlang-font-lock-syntax-table (setq erlang-font-lock-syntax-table - (let ((table (copy-syntax-table erlang-mode-syntax-table))) - (modify-syntax-entry ?_ "w" table) - table))) + (let ((table (copy-syntax-table erlang-mode-syntax-table))) + (modify-syntax-entry ?_ "w" table) + table))) (set (make-local-variable 'font-lock-syntax-table) erlang-font-lock-syntax-table) (set (make-local-variable (if (boundp 'syntax-begin-function) @@ -1563,23 +1570,23 @@ Other commands: 'erlang-beginning-of-clause) (make-local-variable 'font-lock-keywords) (let ((level (cond ((boundp 'font-lock-maximum-decoration) - (symbol-value 'font-lock-maximum-decoration)) - ((boundp 'font-lock-use-maximal-decoration) - (symbol-value 'font-lock-use-maximal-decoration)) - (t nil)))) + (symbol-value 'font-lock-maximum-decoration)) + ((boundp 'font-lock-use-maximal-decoration) + (symbol-value 'font-lock-use-maximal-decoration)) + (t nil)))) (if (consp level) - (setq level (cdr-safe (or (assq 'erlang-mode level) - (assq t level))))) + (setq level (cdr-safe (or (assq 'erlang-mode level) + (assq t level))))) ;; `level' can here be: ;; A number - The fontification level ;; nil - Use the default ;; t - Use maximum (cond ((eq level nil) - (set 'font-lock-keywords erlang-font-lock-keywords)) - ((eq level 1) - (set 'font-lock-keywords erlang-font-lock-keywords-1)) - ((eq level 2) - (set 'font-lock-keywords erlang-font-lock-keywords-2)) + (set 'font-lock-keywords erlang-font-lock-keywords)) + ((eq level 1) + (set 'font-lock-keywords erlang-font-lock-keywords-1)) + ((eq level 2) + (set 'font-lock-keywords erlang-font-lock-keywords-2)) ((eq level 3) (set 'font-lock-keywords erlang-font-lock-keywords-3)) (t @@ -1588,11 +1595,11 @@ Other commands: ;; Modern font-locks can handle the above much more elegantly: (set (make-local-variable 'font-lock-defaults) '((erlang-font-lock-keywords erlang-font-lock-keywords-1 - erlang-font-lock-keywords-2 - erlang-font-lock-keywords-3 - erlang-font-lock-keywords-4) - nil nil ((?_ . "w")) erlang-beginning-of-clause - (font-lock-mark-block-function . erlang-mark-clause) + erlang-font-lock-keywords-2 + erlang-font-lock-keywords-3 + erlang-font-lock-keywords-4) + nil nil ((?_ . "w")) erlang-beginning-of-clause + (font-lock-mark-block-function . erlang-mark-clause) (font-lock-syntactic-keywords ;; A dollar sign right before the double quote that ends a ;; string is not a character escape. @@ -1606,8 +1613,8 @@ Other commands: ;; know whether matching started inside a string: limiting ;; search to a single line keeps things sane. . (("\\(?:^\\|[^$]\\)\"\\(?:[^\"\n]\\|\\\\\"\\)*\\(\\$\\)\"" 1 "w") - ;; Likewise for atoms - ("\\(?:^\\|[^$]\\)'\\(?:[^'\n]\\|\\\\'\\)*\\(\\$\\)'" 1 "w") + ;; Likewise for atoms + ("\\(?:^\\|[^$]\\)'\\(?:[^'\n]\\|\\\\'\\)*\\(\\$\\)'" 1 "w") ;; And the dollar sign in $\" or $\' escapes two ;; characters, not just one. ("\\(\\$\\)\\\\[\"']" 1 "'")))))) @@ -1653,17 +1660,17 @@ For a more elaborate example, please see the beginning of the file (let ((res '())) (while ks (let* ((regexp (car (car ks))) - (number (car (cdr (car ks)))) - (new-face (if (and faces (car faces)) - (car faces) - (car (cdr (cdr (car ks)))))) - (overwrite (car (cdr (cdr (cdr (car ks)))))) - (new-keyword (list regexp number new-face))) - (if overwrite (nconc new-keyword (list overwrite))) - (setq res (cons new-keyword res)) - (setq ks (cdr ks)) - (if (and faces (cdr faces)) - (setq faces (cdr faces))))) + (number (car (cdr (car ks)))) + (new-face (if (and faces (car faces)) + (car faces) + (car (cdr (cdr (car ks)))))) + (overwrite (car (cdr (cdr (cdr (car ks)))))) + (new-keyword (list regexp number new-face))) + (if overwrite (nconc new-keyword (list overwrite))) + (setq res (cons new-keyword res)) + (setq ks (cdr ks)) + (if (and faces (cdr faces)) + (setq faces (cdr faces))))) (nreverse res))) @@ -1755,57 +1762,57 @@ variable, i.e. it will popup when pressing the right mouse button. Please see the variable `erlang-menu-base-items'." (cond (erlang-xemacs-p - (let ((menu (erlang-menu-xemacs name items keymap))) - ;; We add the menu to the global menubar. - ;;(funcall (symbol-function 'set-buffer-menubar) - ;; (symbol-value 'current-menubar)) - (funcall (symbol-function 'add-submenu) nil menu) - (setcdr erlang-xemacs-popup-menu (cdr menu)) - (if (and popup (boundp 'mode-popup-menu)) - (funcall (symbol-function 'set) - 'mode-popup-menu erlang-xemacs-popup-menu)))) - ((>= erlang-emacs-major-version 19) - (define-key keymap (vector 'menu-bar (intern name)) - (erlang-menu-make-keymap name items))) - (t nil))) + (let ((menu (erlang-menu-xemacs name items keymap))) + ;; We add the menu to the global menubar. + ;;(funcall (symbol-function 'set-buffer-menubar) + ;; (symbol-value 'current-menubar)) + (funcall (symbol-function 'add-submenu) nil menu) + (setcdr erlang-xemacs-popup-menu (cdr menu)) + (if (and popup (boundp 'mode-popup-menu)) + (funcall (symbol-function 'set) + 'mode-popup-menu erlang-xemacs-popup-menu)))) + ((>= erlang-emacs-major-version 19) + (define-key keymap (vector 'menu-bar (intern name)) + (erlang-menu-make-keymap name items))) + (t nil))) (defun erlang-menu-make-keymap (name items) "Build a menu for Emacs 19." (let ((menumap (funcall (symbol-function 'make-sparse-keymap) - name)) - (count 0) - id def first second third) + name)) + (count 0) + id def first second third) (setq items (reverse items)) (while items ;; Replace any occurrence of atoms by their value. (while (and items (atom (car items)) (not (null (car items)))) - (if (and (boundp (car items)) - (listp (symbol-value (car items)))) - (setq items (append (reverse (symbol-value (car items))) - (cdr items))) - (setq items (cdr items)))) + (if (and (boundp (car items)) + (listp (symbol-value (car items)))) + (setq items (append (reverse (symbol-value (car items))) + (cdr items))) + (setq items (cdr items)))) (setq first (car-safe (car items))) (setq second (car-safe (cdr-safe (car items)))) (setq third (car-safe (cdr-safe (cdr-safe (car items))))) (cond ((null first) - (setq count (+ count 1)) - (setq id (intern (format "separator-%d" count))) - (setq def '("--" . nil))) - ((and (consp second) (eq (car second) 'lambda)) - (setq count (+ count 1)) - (setq id (intern (format "lambda-%d" count))) - (setq def (cons first second))) - ((symbolp second) - (setq id second) - (setq def (cons first second))) - (t - (setq count (+ count 1)) - (setq id (intern (format "submenu-%d" count))) - (setq def (erlang-menu-make-keymap first second)))) + (setq count (+ count 1)) + (setq id (intern (format "separator-%d" count))) + (setq def '("--" . nil))) + ((and (consp second) (eq (car second) 'lambda)) + (setq count (+ count 1)) + (setq id (intern (format "lambda-%d" count))) + (setq def (cons first second))) + ((symbolp second) + (setq id second) + (setq def (cons first second))) + (t + (setq count (+ count 1)) + (setq id (intern (format "submenu-%d" count))) + (setq def (erlang-menu-make-keymap first second)))) (define-key menumap (vector id) def) (if third - (put id 'menu-enable third)) + (put id 'menu-enable third)) (setq items (cdr items))) (cons name menumap))) @@ -1813,30 +1820,30 @@ Please see the variable `erlang-menu-base-items'." (defun erlang-menu-xemacs (name items &optional keymap) "Build a menu for XEmacs." (let ((res '()) - first second third entry) + first second third entry) (while items ;; Replace any occurrence of atoms by their value. (while (and items (atom (car items)) (not (null (car items)))) - (if (and (boundp (car items)) - (listp (symbol-value (car items)))) - (setq items (append (reverse (symbol-value (car items))) - (cdr items))) - (setq items (cdr items)))) + (if (and (boundp (car items)) + (listp (symbol-value (car items)))) + (setq items (append (reverse (symbol-value (car items))) + (cdr items))) + (setq items (cdr items)))) (setq first (car-safe (car items))) (setq second (car-safe (cdr-safe (car items)))) (setq third (car-safe (cdr-safe (cdr-safe (car items))))) (cond ((null first) - (setq res (cons "------" res))) - ((symbolp second) - (setq res (cons (vector first second (or third t)) res))) - ((and (consp second) (eq (car second) 'lambda)) - (setq res (cons (vector first (list 'call-interactively second) - (or third t)) res))) - (t - (setq res (cons (cons first - (cdr (erlang-menu-xemacs - first second))) - res)))) + (setq res (cons "------" res))) + ((symbolp second) + (setq res (cons (vector first second (or third t)) res))) + ((and (consp second) (eq (car second) 'lambda)) + (setq res (cons (vector first (list 'call-interactively second) + (or third t)) res))) + (t + (setq res (cons (cons first + (cdr (erlang-menu-xemacs + first second))) + res)))) (setq items (cdr items))) (setq res (reverse res)) ;; When adding a menu to a minor-mode keymap under Emacs, @@ -1845,15 +1852,15 @@ Please see the variable `erlang-menu-base-items'." ;; (This could be expressed much clearer using backquotes, ;; but I don't want to pull in every package.) (if keymap - (let ((expr (list 'or - (list 'eq keymap 'global-map) - (list 'eq keymap (list 'current-local-map)) - (list 'symbol-value - (list 'car-safe - (list 'rassq - keymap - 'minor-mode-map-alist)))))) - (setq res (cons ':included (cons expr res))))) + (let ((expr (list 'or + (list 'eq keymap 'global-map) + (list 'eq keymap (list 'current-local-map)) + (list 'symbol-value + (list 'car-safe + (list 'rassq + keymap + 'minor-mode-map-alist)))))) + (setq res (cons ':included (cons expr res))))) (cons name res))) @@ -1868,13 +1875,13 @@ ALIST is list of pairs where the car is the old function and cdr the new." (setq first (car-safe (car items))) (setq second (car-safe (cdr-safe (car items)))) (cond ((null first)) - ((symbolp second) - (setq pair (and second (assq second alist))) - (if pair - (setcar (cdr (car items)) (cdr pair)))) - ((and (consp second) (eq (car second) 'lambda))) - (t - (erlang-menu-substitute second alist))) + ((symbolp second) + (setq pair (and second (assq second alist))) + (if pair + (setcar (cdr (car items)) (cdr pair)))) + ((and (consp second) (eq (car second) 'lambda))) + (t + (erlang-menu-substitute second alist))) (setq items (cdr items))))) @@ -1909,27 +1916,27 @@ Example: \(setq erlang-menu-items (erlang-menu-add-below 'my-erlang-menu-items - 'erlang-menu-base-items + 'erlang-menu-base-items erlang-menu-items))" (if (memq entry items) - items ; Return the original menu. + items ; Return the original menu. (let ((head '()) - (done nil) - res) + (done nil) + res) (while (not done) - (cond ((null items) - (setq res (append head (list entry))) - (setq done t)) - ((eq below (car items)) - (setq res - (if above-p - (append head (cons entry items)) - (append head (cons (car items) - (cons entry (cdr items)))))) - (setq done t)) - (t - (setq head (append head (list (car items)))) - (setq items (cdr items))))) + (cond ((null items) + (setq res (append head (list entry))) + (setq done t)) + ((eq below (car items)) + (setq res + (if above-p + (append head (cons entry items)) + (append head (cons (car items) + (cons entry (cdr items)))))) + (setq done t)) + (t + (setq head (append head (list (car items)))) + (setq items (cdr items))))) res))) (defun erlang-menu-delete (entry items) @@ -1950,16 +1957,16 @@ the location of the manual pages." (if erlang-man-inhibit () (setq erlang-menu-man-items - '(nil - ("Man - Function" erlang-man-function))) + '(nil + ("Man - Function" erlang-man-function))) (if erlang-man-dirs - (setq erlang-menu-man-items - (append erlang-menu-man-items - (erlang-man-make-top-menu erlang-man-dirs)))) + (setq erlang-menu-man-items + (append erlang-menu-man-items + (erlang-man-make-top-menu erlang-man-dirs)))) (setq erlang-menu-items - (erlang-menu-add-above 'erlang-menu-man-items - 'erlang-menu-version-items - erlang-menu-items)) + (erlang-menu-add-above 'erlang-menu-man-items + 'erlang-menu-version-items + erlang-menu-items)) (erlang-menu-init))) @@ -1967,7 +1974,7 @@ the location of the manual pages." "Remove the man pages from the Erlang mode." (interactive) (setq erlang-menu-items - (erlang-menu-delete 'erlang-menu-man-items erlang-menu-items)) + (erlang-menu-delete 'erlang-menu-man-items erlang-menu-items)) (erlang-menu-init)) @@ -1981,28 +1988,28 @@ the location of the manual pages." "Create one menu entry per element of DIR-LIST. The format is described in the documentation of `erlang-man-dirs'." (let ((menu '()) - dir) + dir) (while dir-list (setq dir (cond ((nth 2 (car dir-list)) - ;; Relative to `erlang-root-dir'. - (and (stringp erlang-root-dir) - (concat erlang-root-dir (nth 1 (car dir-list))))) - (t - ;; Absolute - (nth 1 (car dir-list))))) + ;; Relative to `erlang-root-dir'. + (and (stringp erlang-root-dir) + (concat erlang-root-dir (nth 1 (car dir-list))))) + (t + ;; Absolute + (nth 1 (car dir-list))))) (if (and dir - (file-readable-p dir)) - (setq menu (cons (list (car (car dir-list)) - (erlang-man-make-middle-menu - (erlang-man-get-files dir))) - menu))) + (file-readable-p dir)) + (setq menu (cons (list (car (car dir-list)) + (erlang-man-make-middle-menu + (erlang-man-get-files dir))) + menu))) (setq dir-list (cdr dir-list))) ;; Should no menus be found, generate a menu item which ;; will display a help text, when selected. (if menu - (nreverse menu) + (nreverse menu) '(("Man Pages" - (("Error! Why?" erlang-man-describe-error))))))) + (("Error! Why?" erlang-man-describe-error))))))) ;; Should the menu be to long, let's split it into a number of @@ -2016,32 +2023,32 @@ menus is created." (if (<= (length filelist) erlang-man-max-menu-size) (erlang-man-make-menu filelist) (let ((menu '()) - (filelist (copy-sequence filelist)) - segment submenu pair) + (filelist (copy-sequence filelist)) + segment submenu pair) (while filelist - (setq pair (nthcdr (- erlang-man-max-menu-size 1) filelist)) - (setq segment filelist) - (if (null pair) - (setq filelist nil) - (setq filelist (cdr pair)) - (setcdr pair nil)) - (setq submenu (erlang-man-make-menu segment)) - (setq menu (cons (list (concat (car (car submenu)) - " -- " - (car (car (reverse submenu)))) - submenu) - menu))) + (setq pair (nthcdr (- erlang-man-max-menu-size 1) filelist)) + (setq segment filelist) + (if (null pair) + (setq filelist nil) + (setq filelist (cdr pair)) + (setcdr pair nil)) + (setq submenu (erlang-man-make-menu segment)) + (setq menu (cons (list (concat (car (car submenu)) + " -- " + (car (car (reverse submenu)))) + submenu) + menu))) (nreverse menu)))) (defun erlang-man-make-menu (filelist) "Make a leaf menu based on FILELIST." (let ((menu '()) - item) + item) (while filelist (setq item (erlang-man-make-menu-item (car filelist))) (if item - (setq menu (cons item menu))) + (setq menu (cons item menu))) (setq filelist (cdr filelist))) (nreverse menu))) @@ -2050,11 +2057,11 @@ menus is created." "Create a menu item containing the name of the man page." (and (string-match ".+/\\([^/]+\\)\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?$" file) (let ((page (substring file (match-beginning 1) (match-end 1)))) - (list (capitalize page) - (list 'lambda '() - '(interactive) - (list 'funcall 'erlang-man-display-function - file)))))) + (list (capitalize page) + (list 'lambda '() + '(interactive) + (list 'funcall 'erlang-man-display-function + file)))))) (defun erlang-man-get-files (dir) @@ -2067,33 +2074,33 @@ menus is created." This function is aware of imported functions." (interactive (list (let* ((mod (car-safe (erlang-get-function-under-point))) - (input (read-string - (format "Manual entry for module%s: " - (if (or (null mod) (string= mod "")) - "" - (format " (default %s)" mod)))))) - (if (string= input "") - mod - input)))) + (input (read-string + (format "Manual entry for module%s: " + (if (or (null mod) (string= mod "")) + "" + (format " (default %s)" mod)))))) + (if (string= input "") + mod + input)))) (or module (setq module (car (erlang-get-function-under-point)))) (if (or (null module) (string= module "")) (error "No Erlang module name given")) (let ((dir-list erlang-man-dirs) - (pat (concat "/" (regexp-quote module) "\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?$")) - (file nil) - file-list) + (pat (concat "/" (regexp-quote module) "\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?$")) + (file nil) + file-list) (while (and dir-list (null file)) (setq file-list (erlang-man-get-files - (if (nth 2 (car dir-list)) - (concat erlang-root-dir (nth 1 (car dir-list))) - (nth 1 (car dir-list))))) + (if (nth 2 (car dir-list)) + (concat erlang-root-dir (nth 1 (car dir-list))) + (nth 1 (car dir-list))))) (while (and file-list (null file)) - (if (string-match pat (car file-list)) - (setq file (car file-list))) - (setq file-list (cdr file-list))) + (if (string-match pat (car file-list)) + (setq file (car file-list))) + (setq file-list (cdr file-list))) (setq dir-list (cdr dir-list))) (if file - (funcall erlang-man-display-function file) + (funcall erlang-man-display-function file) (error "No manual page for module %s found" module)))) @@ -2115,55 +2122,55 @@ The entry for `function' is displayed. This function is aware of imported functions." (interactive (list (let* ((mod-func (erlang-get-function-under-point)) - (mod (car-safe mod-func)) - (func (nth 1 mod-func)) - (input (read-string - (format - "Manual entry for `module:func' or `module'%s: " - (if (or (null mod) (string= mod "")) - "" - (format " (default %s:%s)" mod func)))))) - (if (string= input "") - (if (and mod func) - (concat mod ":" func) - mod) - input)))) + (mod (car-safe mod-func)) + (func (nth 1 mod-func)) + (input (read-string + (format + "Manual entry for `module:func' or `module'%s: " + (if (or (null mod) (string= mod "")) + "" + (format " (default %s:%s)" mod func)))))) + (if (string= input "") + (if (and mod func) + (concat mod ":" func) + mod) + input)))) ;; Emacs 18 doesn't provide `man'... (condition-case nil (require 'man) (error nil)) (let ((modname nil) - (funcname nil)) + (funcname nil)) (cond ((null name) - (let ((mod-func (erlang-get-function-under-point))) - (setq modname (car-safe mod-func)) - (setq funcname (nth 1 mod-func)))) - ((string-match ":" name) - (setq modname (substring name 0 (match-beginning 0))) - (setq funcname (substring name (match-end 0) nil))) - ((stringp name) - (setq modname name))) + (let ((mod-func (erlang-get-function-under-point))) + (setq modname (car-safe mod-func)) + (setq funcname (nth 1 mod-func)))) + ((string-match ":" name) + (setq modname (substring name 0 (match-beginning 0))) + (setq funcname (substring name (match-end 0) nil))) + ((stringp name) + (setq modname name))) (if (or (null modname) (string= modname "")) - (error "No Erlang module name given")) + (error "No Erlang module name given")) (cond ((fboundp 'Man-notify-when-ready) - ;; Emacs 19: The man command could possibly start an - ;; asynchronous process, i.e. we must hook ourselves into - ;; the system to be activated when the man-process - ;; terminates. - (if (null funcname) - () - (erlang-man-patch-notify) - (setq erlang-man-function-name funcname)) - (condition-case nil - (erlang-man-module modname) - (error (setq erlang-man-function-name nil)))) - (t - (erlang-man-module modname) - (if funcname - (erlang-man-find-function - (or (get-buffer "*Manual Entry*") ; Emacs 18 - (current-buffer)) ; XEmacs - funcname)))))) + ;; Emacs 19: The man command could possibly start an + ;; asynchronous process, i.e. we must hook ourselves into + ;; the system to be activated when the man-process + ;; terminates. + (if (null funcname) + () + (erlang-man-patch-notify) + (setq erlang-man-function-name funcname)) + (condition-case nil + (erlang-man-module modname) + (error (setq erlang-man-function-name nil)))) + (t + (erlang-man-module modname) + (if funcname + (erlang-man-find-function + (or (get-buffer "*Manual Entry*") ; Emacs 18 + (current-buffer)) ; XEmacs + funcname)))))) ;; Should the defadvice be at the top level, the package `advice' would @@ -2181,14 +2188,14 @@ command is executed asynchronously." ;; This should never happened since this is only called when ;; running under Emacs 19. (error (error (concat "This command needs the package `advice', " - "please upgrade your Emacs.")))) + "please upgrade your Emacs.")))) (require 'man) (defadvice Man-notify-when-ready - (after erlang-Man-notify-when-ready activate) + (after erlang-Man-notify-when-ready activate) "Set point at the documentation of the function name in `erlang-man-function-name' when the man page is displayed." (if erlang-man-function-name - (erlang-man-find-function (ad-get-arg 0) erlang-man-function-name)) + (erlang-man-find-function (ad-get-arg 0) erlang-man-function-name)) (setq erlang-man-function-name nil))) @@ -2196,17 +2203,17 @@ command is executed asynchronously." "Find manual page for function in `erlang-man-function-name' in buffer BUF." (if func (let ((win (get-buffer-window buf))) - (if win - (progn - (set-buffer buf) - (goto-char (point-min)) - (if (re-search-forward - (concat "^[ \t]+" func " ?(") - (point-max) t) - (progn - (forward-word -1) - (set-window-point win (point))) - (message "Could not find function `%s'" func))))))) + (if win + (progn + (set-buffer buf) + (goto-char (point-min)) + (if (re-search-forward + (concat "^[ \t]+" func " ?(") + (point-max) t) + (progn + (forward-word -1) + (set-window-point win (point))) + (message "Could not find function `%s'" func))))))) (defun erlang-man-display (file) @@ -2220,25 +2227,25 @@ to be used." (error nil)) (if file (let ((process-environment (copy-sequence process-environment))) - (if (string-match "\\(.*\\)/man[^/]*/\\([^.]+\\)\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?$" file) - (let ((dir (substring file (match-beginning 1) (match-end 1))) - (page (substring file (match-beginning 2) (match-end 2)))) - (if (fboundp 'setenv) - (setenv "MANPATH" dir) - ;; Emacs 18 - (setq process-environment (cons (concat "MANPATH=" dir) - process-environment))) - (cond ((not (and (not erlang-xemacs-p) - (= erlang-emacs-major-version 19) - (< erlang-emacs-minor-version 29))) - (manual-entry page)) - (t - ;; Emacs 19.28 and earlier versions of 19: - ;; The manual-entry command unconditionally prompts - ;; the user :-( - (funcall (symbol-function 'Man-getpage-in-background) - page)))) - (error "Can't find man page for %s\n" file))))) + (if (string-match "\\(.*\\)/man[^/]*/\\([^.]+\\)\\.\\([124-9]\\|3\\(erl\\)?\\)\\(\\.gz\\)?$" file) + (let ((dir (substring file (match-beginning 1) (match-end 1))) + (page (substring file (match-beginning 2) (match-end 2)))) + (if (fboundp 'setenv) + (setenv "MANPATH" dir) + ;; Emacs 18 + (setq process-environment (cons (concat "MANPATH=" dir) + process-environment))) + (cond ((not (and (not erlang-xemacs-p) + (= erlang-emacs-major-version 19) + (< erlang-emacs-minor-version 29))) + (manual-entry page)) + (t + ;; Emacs 19.28 and earlier versions of 19: + ;; The manual-entry command unconditionally prompts + ;; the user :-( + (funcall (symbol-function 'Man-getpage-in-background) + page)))) + (error "Can't find man page for %s\n" file))))) (defun erlang-man-describe-error () @@ -2281,43 +2288,43 @@ package not be present, this function does nothing." (error t)) (if (featurep 'tempo) (let ((skel erlang-skel) - (menu '())) - (while skel - (cond ((null (car skel)) - (setq menu (cons nil menu))) - (t - (funcall (symbol-function 'tempo-define-template) - (concat "erlang-" (nth 1 (car skel))) - ;; The tempo template used contains an `include' - ;; function call only, hence changes to the - ;; variables describing the templates take effect - ;; immdiately. - (list (list 'erlang-skel-include (nth 2 (car skel)))) - (nth 1 (car skel)) - (car (car skel)) - 'erlang-tempo-tags) - (setq menu (cons (erlang-skel-make-menu-item - (car skel)) menu)))) - (setq skel (cdr skel))) - (setq erlang-menu-skel-items - (list nil (list "Skeletons" (nreverse menu)))) - (setq erlang-menu-items - (erlang-menu-add-above 'erlang-menu-skel-items - 'erlang-menu-version-items - erlang-menu-items)) - (erlang-menu-init)))) + (menu '())) + (while skel + (cond ((null (car skel)) + (setq menu (cons nil menu))) + (t + (funcall (symbol-function 'tempo-define-template) + (concat "erlang-" (nth 1 (car skel))) + ;; The tempo template used contains an `include' + ;; function call only, hence changes to the + ;; variables describing the templates take effect + ;; immdiately. + (list (list 'erlang-skel-include (nth 2 (car skel)))) + (nth 1 (car skel)) + (car (car skel)) + 'erlang-tempo-tags) + (setq menu (cons (erlang-skel-make-menu-item + (car skel)) menu)))) + (setq skel (cdr skel))) + (setq erlang-menu-skel-items + (list nil (list "Skeletons" (nreverse menu)))) + (setq erlang-menu-items + (erlang-menu-add-above 'erlang-menu-skel-items + 'erlang-menu-version-items + erlang-menu-items)) + (erlang-menu-init)))) (defun erlang-skel-make-menu-item (skel) (let ((func (intern (concat "tempo-template-erlang-" (nth 1 skel))))) (cond ((null (nth 3 skel)) - (list (car skel) func)) - (t - (list (car skel) - (list 'lambda '() - '(interactive) - (list 'funcall - (list 'quote (nth 3 skel)) - (list 'quote func)))))))) + (list (car skel) func)) + (t + (list (car skel) + (list 'lambda '() + '(interactive) + (list 'funcall + (list 'quote (nth 3 skel)) + (list 'quote func)))))))) ;; Functions designed to be added to the skeleton menu. ;; (Not normally used) @@ -2350,12 +2357,12 @@ Technically, this function returns the `tempo' attribute`(l ...)' which can contain other `tempo' attributes. Please see the function `tempo-define-template' for a description of the `(l ...)' attribute." (let ((res '()) - entry) + entry) (while args (setq entry (car args)) (while entry - (setq res (cons (car entry) res)) - (setq entry (cdr entry))) + (setq res (cons (car entry) res)) + (setq entry (cdr entry))) (setq args (cdr args))) (cons 'l (nreverse res)))) @@ -2364,25 +2371,25 @@ can contain other `tempo' attributes. Please see the function (defun erlang-skel-separator (&optional percent) "Return a comment separator." (let ((percent (or percent 3))) - (concat (make-string percent ?%) - (make-string (- erlang-skel-separator-length percent) ?-) - "\n"))) + (concat (make-string percent ?%) + (make-string (- erlang-skel-separator-length percent) ?-) + "\n"))) (defun erlang-skel-double-separator (&optional percent) "Return a comment separator." (let ((percent (or percent 3))) - (concat (make-string percent ?%) - (make-string (- erlang-skel-separator-length percent) ?=) - "\n"))) + (concat (make-string percent ?%) + (make-string (- erlang-skel-separator-length percent) ?=) + "\n"))) (defun erlang-skel-dd-mmm-yyyy () "Return the current date as a string in \"DD Mon YYYY\" form. The first character of DD is space if the value is less than 10." (let ((date (current-time-string))) (format "%2d %s %s" - (erlang-string-to-int (substring date 8 10)) - (substring date 4 7) - (substring date -4)))) + (erlang-string-to-int (substring date 8 10)) + (substring date 4 7) + (substring date -4)))) ;; Indentation code: @@ -2395,23 +2402,23 @@ rigidly along with this one." ;; If arg, always indent this line as Erlang ;; and shift remaining lines of clause the same amount. (let ((shift-amt (erlang-indent-line)) - beg end) - (save-excursion - (if erlang-tab-always-indent - (beginning-of-line)) - (setq beg (point)) - (erlang-end-of-clause 1) - (setq end (point)) - (goto-char beg) - (forward-line 1) - (setq beg (point))) - (if (> end beg) - (indent-code-rigidly beg end shift-amt "\n"))) + beg end) + (save-excursion + (if erlang-tab-always-indent + (beginning-of-line)) + (setq beg (point)) + (erlang-end-of-clause 1) + (setq end (point)) + (goto-char beg) + (forward-line 1) + (setq beg (point))) + (if (> end beg) + (indent-code-rigidly beg end shift-amt "\n"))) (if (and (not erlang-tab-always-indent) - (save-excursion - (skip-chars-backward " \t") - (not (bolp)))) - (insert-tab) + (save-excursion + (skip-chars-backward " \t") + (not (bolp)))) + (insert-tab) (erlang-indent-line)))) @@ -2419,33 +2426,34 @@ rigidly along with this one." "Indent current line as Erlang code. Return the amount the indentation changed by." (let ((pos (- (point-max) (point))) - indent beg - shift-amt) + indent beg + shift-amt) (beginning-of-line 1) (setq beg (point)) (skip-chars-forward " \t") (cond ((looking-at "%") - (setq indent (funcall comment-indent-function)) - (setq shift-amt (- indent (current-column)))) - (t - (setq indent (erlang-calculate-indent)) - (cond ((null indent) - (setq indent (current-indentation))) - ((eq indent t) - ;; This should never occur here. - (error "Erlang mode error")) - ;;((= (char-syntax (following-char)) ?\)) - ;; (setq indent (1- indent))) - ) - (setq shift-amt (- indent (current-column))))) + (setq indent (funcall comment-indent-function)) + (setq shift-amt (- indent (current-column)))) + (t + (setq indent (erlang-calculate-indent)) + (cond ((null indent) + (setq indent (current-indentation))) + ((eq indent t) + ;; This should never occur here. + (error "Erlang mode error")) + ;;((= (char-syntax (following-char)) ?\)) + ;; (setq indent (1- indent))) + ) + (setq shift-amt (- indent (current-column))))) (if (zerop shift-amt) - nil + nil (delete-region beg (point)) (indent-to indent)) ;; If initial point was within line's indentation, position ;; after the indentation. Else stay at same point in text. (if (> (- (point-max) pos) (point)) - (goto-char (- (point-max) pos))) + (goto-char (- (point-max) pos))) + (run-hooks 'erlang-indent-line-hook) shift-amt)) @@ -2456,11 +2464,11 @@ This is automagically called by the user level function `indent-region'." (interactive "r") (save-excursion (let ((case-fold-search nil) - (continue t) - (from-end (- (point-max) end)) - indent-point;; The beginning of the current line - indent;; The indent amount - state) + (continue t) + (from-end (- (point-max) end)) + indent-point;; The beginning of the current line + indent;; The indent amount + state) (goto-char beg) (beginning-of-line) (setq indent-point (point)) @@ -2474,39 +2482,39 @@ This is automagically called by the user level function `indent-region'." (error "Illegal syntax")))) ;; Indent every line in the region (while continue - (goto-char indent-point) - (skip-chars-forward " \t") - (cond ((looking-at "%") - ;; Do not use our stack to help the user to customize - ;; comment indentation. - (setq indent (funcall comment-indent-function))) - ((looking-at "$") - ;; Don't indent empty lines. - (setq indent 0)) - (t - (setq indent - (save-excursion - (erlang-calculate-stack-indent (point) state))) - (cond ((null indent) - (setq indent (current-indentation))) - ((eq indent t) - ;; This should never occur here. - (error "Erlang mode error")) - ;;((= (char-syntax (following-char)) ?\)) - ;; (setq indent (1- indent))) - ))) - (if (zerop (- indent (current-column))) - nil - (delete-region indent-point (point)) - (indent-to indent)) - ;; Find the next line in the region - (goto-char indent-point) - (save-excursion - (forward-line 1) - (setq indent-point (point))) - (if (>= from-end (- (point-max) indent-point)) - (setq continue nil) - (while (< (point) indent-point) + (goto-char indent-point) + (skip-chars-forward " \t") + (cond ((looking-at "%") + ;; Do not use our stack to help the user to customize + ;; comment indentation. + (setq indent (funcall comment-indent-function))) + ((looking-at "$") + ;; Don't indent empty lines. + (setq indent 0)) + (t + (setq indent + (save-excursion + (erlang-calculate-stack-indent (point) state))) + (cond ((null indent) + (setq indent (current-indentation))) + ((eq indent t) + ;; This should never occur here. + (error "Erlang mode error")) + ;;((= (char-syntax (following-char)) ?\)) + ;; (setq indent (1- indent))) + ))) + (if (zerop (- indent (current-column))) + nil + (delete-region indent-point (point)) + (indent-to indent)) + ;; Find the next line in the region + (goto-char indent-point) + (save-excursion + (forward-line 1) + (setq indent-point (point))) + (if (>= from-end (- (point-max) indent-point)) + (setq continue nil) + (while (< (point) indent-point) (let ((pt (point))) (setq state (erlang-partial-parse pt indent-point state)) @@ -2528,7 +2536,7 @@ This is automagically called by the user level function `indent-region'." (interactive) (save-excursion (let ((end (progn (erlang-end-of-function 1) (point))) - (beg (progn (erlang-beginning-of-function 1) (point)))) + (beg (progn (erlang-beginning-of-function 1) (point)))) (erlang-indent-region beg end)))) @@ -2537,7 +2545,7 @@ This is automagically called by the user level function `indent-region'." (interactive) (save-excursion (let ((end (progn (erlang-end-of-clause 1) (point))) - (beg (progn (erlang-beginning-of-clause 1) (point)))) + (beg (progn (erlang-beginning-of-clause 1) (point)))) (erlang-indent-region beg end)))) @@ -2552,11 +2560,11 @@ This is automagically called by the user level function `indent-region'." Return nil if line starts inside string, t if in a comment." (save-excursion (let ((indent-point (point)) - (case-fold-search nil) - (state nil)) + (case-fold-search nil) + (state nil)) (if parse-start - (goto-char parse-start) - (erlang-beginning-of-clause)) + (goto-char parse-start) + (erlang-beginning-of-clause)) (while (< (point) indent-point) (let ((pt (point))) (setq state (erlang-partial-parse pt indent-point state)) @@ -2571,25 +2579,25 @@ Return nil if line starts inside string, t if in a comment." (save-excursion (let ((starting-point (point)) - (case-fold-search nil) - (state nil)) + (case-fold-search nil) + (state nil)) (erlang-beginning-of-clause) (while (< (point) starting-point) - (setq state (erlang-partial-parse (point) starting-point state))) + (setq state (erlang-partial-parse (point) starting-point state))) (message "%S" state)))) (defun erlang-partial-parse (from to &optional state) "Parse Erlang syntax starting at FROM until TO, with an optional STATE. Value is list (stack token-start token-type in-what)." - (goto-char from) ; Start at the beginning + (goto-char from) ; Start at the beginning (erlang-skip-blank to) (let ((cs (char-syntax (following-char))) - (stack (car state)) - (token (point)) - in-what) - (cond - + (stack (car state)) + (token (point)) + in-what) + (cond + ;; Done: Return previous state. ((>= token to) (setq token (nth 1 state)) @@ -2599,230 +2607,230 @@ Value is list (stack token-start token-type in-what)." ;; Word constituent: check and handle keywords. ((= cs ?w) (cond ((looking-at "\\(end\\|after\\)[^_a-zA-Z0-9]") - ;; Must pop top icr layer, `after' will push a new - ;; layer next. - (progn - (while (and stack (eq (car (car stack)) '->)) - (erlang-pop stack)) - (if (and stack (memq (car (car stack)) '(icr begin fun try))) - (erlang-pop stack)))) - ((looking-at "catch\\b.*of") - t) - ((looking-at "catch\\b\\s *\\($\\|%\\|.*->\\)") - ;; Must pop top icr layer, `catch' in try/catch - ;;will push a new layer next. - (progn - (while (and stack (eq (car (car stack)) '->)) - (erlang-pop stack)) - (if (and stack (memq (car (car stack)) '(icr begin try))) - (erlang-pop stack)))) - ) + ;; Must pop top icr layer, `after' will push a new + ;; layer next. + (progn + (while (and stack (eq (car (car stack)) '->)) + (erlang-pop stack)) + (if (and stack (memq (car (car stack)) '(icr begin fun try))) + (erlang-pop stack)))) + ((looking-at "catch\\b.*of") + t) + ((looking-at "catch\\b\\s *\\($\\|%\\|.*->\\)") + ;; Must pop top icr layer, `catch' in try/catch + ;;will push a new layer next. + (progn + (while (and stack (eq (car (car stack)) '->)) + (erlang-pop stack)) + (if (and stack (memq (car (car stack)) '(icr begin try))) + (erlang-pop stack)))) + ) (cond ((looking-at "\\(if\\|case\\|receive\\)[^_a-zA-Z0-9]") - ;; Must push a new icr (if/case/receive) layer. - (erlang-push (list 'icr token (current-column)) stack)) - ((looking-at "\\(try\\|after\\)[^_a-zA-Z0-9]") - ;; Must handle separately, try catch or try X of -> catch - ;; same for `after', it could be - ;; receive after Time -> X end, or - ;; try after X end - (erlang-push (list 'try token (current-column)) stack)) - ((looking-at "\\(of\\)[^_a-zA-Z0-9]") - ;; Must handle separately, try X of -> catch - (if (and stack (eq (car (car stack)) 'try)) - (let ((try-column (nth 2 (car stack))) - (try-pos (nth 1 (car stack)))) - (erlang-pop stack) - (erlang-push (list 'icr try-pos try-column) stack)))) - - ((looking-at "\\(fun\\)[^_a-zA-Z0-9]") - ;; Push a new layer if we are defining a `fun' - ;; expression, not when we are refering an existing - ;; function. 'fun's defines are only indented one level now. - (if (save-excursion - (goto-char (match-end 1)) - (erlang-skip-blank to) - ;; Use erlang-variable-regexp here to look for an - ;; optional variable name to match EEP37 named funs. - (if (looking-at erlang-variable-regexp) - (progn - (goto-char (match-end 0)) - (erlang-skip-blank to))) - (eq (following-char) ?\()) - (erlang-push (list 'fun token (current-column)) stack))) - ((looking-at "\\(begin\\)[^_a-zA-Z0-9]") - (erlang-push (list 'begin token (current-column)) stack)) - ;; Normal when case - ;;((looking-at "when\\s ") - ;;((looking-at "when\\s *\\($\\|%\\)") - ((looking-at "when[^_a-zA-Z0-9]") - (erlang-push (list 'when token (current-column)) stack)) - ((looking-at "catch\\b.*of") - t) - ((looking-at "catch\\b\\s *\\($\\|%\\|.*->\\)") - (erlang-push (list 'icr token (current-column)) stack)) - ;;(erlang-push (list '-> token (current-column)) stack)) - ;;((looking-at "^of$") - ;; (erlang-push (list 'icr token (current-column)) stack) - ;;(erlang-push (list '-> token (current-column)) stack)) - ) + ;; Must push a new icr (if/case/receive) layer. + (erlang-push (list 'icr token (current-column)) stack)) + ((looking-at "\\(try\\|after\\)[^_a-zA-Z0-9]") + ;; Must handle separately, try catch or try X of -> catch + ;; same for `after', it could be + ;; receive after Time -> X end, or + ;; try after X end + (erlang-push (list 'try token (current-column)) stack)) + ((looking-at "\\(of\\)[^_a-zA-Z0-9]") + ;; Must handle separately, try X of -> catch + (if (and stack (eq (car (car stack)) 'try)) + (let ((try-column (nth 2 (car stack))) + (try-pos (nth 1 (car stack)))) + (erlang-pop stack) + (erlang-push (list 'icr try-pos try-column) stack)))) + + ((looking-at "\\(fun\\)[^_a-zA-Z0-9]") + ;; Push a new layer if we are defining a `fun' + ;; expression, not when we are refering an existing + ;; function. 'fun's defines are only indented one level now. + (if (save-excursion + (goto-char (match-end 1)) + (erlang-skip-blank to) + ;; Use erlang-variable-regexp here to look for an + ;; optional variable name to match EEP37 named funs. + (if (looking-at erlang-variable-regexp) + (progn + (goto-char (match-end 0)) + (erlang-skip-blank to))) + (eq (following-char) ?\()) + (erlang-push (list 'fun token (current-column)) stack))) + ((looking-at "\\(begin\\)[^_a-zA-Z0-9]") + (erlang-push (list 'begin token (current-column)) stack)) + ;; Normal when case + ;;((looking-at "when\\s ") + ;;((looking-at "when\\s *\\($\\|%\\)") + ((looking-at "when[^_a-zA-Z0-9]") + (erlang-push (list 'when token (current-column)) stack)) + ((looking-at "catch\\b.*of") + t) + ((looking-at "catch\\b\\s *\\($\\|%\\|.*->\\)") + (erlang-push (list 'icr token (current-column)) stack)) + ;;(erlang-push (list '-> token (current-column)) stack)) + ;;((looking-at "^of$") + ;; (erlang-push (list 'icr token (current-column)) stack) + ;;(erlang-push (list '-> token (current-column)) stack)) + ) (forward-sexp 1)) - ;; String: Try to skip over it. (Catch error if not complete.) - ((= cs ?\") - (condition-case nil - (progn - (forward-sexp 1) - (if (> (point) to) - (progn - (setq in-what 'string) - (goto-char to)))) - (error - (setq in-what 'string) - (goto-char to)))) + ;; String: Try to skip over it. (Catch error if not complete.) + ((= cs ?\") + (condition-case nil + (progn + (forward-sexp 1) + (if (> (point) to) + (progn + (setq in-what 'string) + (goto-char to)))) + (error + (setq in-what 'string) + (goto-char to)))) ;; Expression prefix e.i. $ or ^ (Note ^ can be in the character ;; literal $^ or part of string and $ outside of a string denotes ;; a character literal) ((= cs ?') - (cond + (cond ((= (following-char) ?\") ;; $ or ^ was the last char in a string - (forward-char 1)) + (forward-char 1)) (t - ;; Maybe a character literal, quote the next char to avoid - ;; situations as $" being seen as the begining of a string. - ;; Note the quoting something in the middle of a string is harmless. - (quote (following-char)) - (forward-char 1)))) + ;; Maybe a character literal, quote the next char to avoid + ;; situations as $" being seen as the begining of a string. + ;; Note the quoting something in the middle of a string is harmless. + (quote (following-char)) + (forward-char 1)))) ;; Symbol constituent or punctuation - + ((memq cs '(?. ?_)) - (cond - + (cond + ;; Clause end ((= (following-char) ?\;) - (if (eq (car (car (last stack))) 'spec) - (while (memq (car (car stack)) '(when ::)) - (erlang-pop stack))) - (if (and stack (eq (car (car stack)) '->)) - (erlang-pop stack)) - (forward-char 1)) - + (if (eq (car (car (last stack))) 'spec) + (while (memq (car (car stack)) '(when ::)) + (erlang-pop stack))) + (if (and stack (eq (car (car stack)) '->)) + (erlang-pop stack)) + (forward-char 1)) + ;; Parameter separator ((looking-at ",") - (forward-char 1) - (if (and stack (eq (car (car stack)) '::)) - ;; Type or spec - (erlang-pop stack))) + (forward-char 1) + (if (and stack (eq (car (car stack)) '::)) + ;; Type or spec + (erlang-pop stack))) ;; Function end ((looking-at "\\.\\(\\s \\|\n\\|\\s<\\)") - (setq stack nil) - (forward-char 1)) - + (setq stack nil) + (forward-char 1)) + ;; Function head ((looking-at "->") - (if (and stack (eq (car (car stack)) 'when)) - (erlang-pop stack)) - (erlang-push (list '-> token (current-column)) stack) - (forward-char 2)) - + (if (and stack (eq (car (car stack)) 'when)) + (erlang-pop stack)) + (erlang-push (list '-> token (current-column)) stack) + (forward-char 2)) + ;; List-comprehension divider ((looking-at "||") - (erlang-push (list '|| token (current-column)) stack) - (forward-char 2)) + (erlang-push (list '|| token (current-column)) stack) + (forward-char 2)) ;; Bit-syntax open. Note that map syntax allows "<<" to follow ":=" ;; or "=>" without intervening whitespace, so handle that case here ((looking-at "\\(:=\\|=>\\)?<<") - (erlang-push (list '<< token (current-column)) stack) - (forward-char (- (match-end 0) (match-beginning 0)))) - + (erlang-push (list '<< token (current-column)) stack) + (forward-char (- (match-end 0) (match-beginning 0)))) + ;; Bit-syntax close ((looking-at ">>") - (while (memq (car (car stack)) '(|| ->)) - (erlang-pop stack)) - (cond ((eq (car (car stack)) '<<) - (erlang-pop stack)) - ((memq (car (car stack)) '(icr begin fun)) - (error "Missing `end'")) - (t - (error "Unbalanced parentheses"))) - (forward-char 2)) - + (while (memq (car (car stack)) '(|| ->)) + (erlang-pop stack)) + (cond ((eq (car (car stack)) '<<) + (erlang-pop stack)) + ((memq (car (car stack)) '(icr begin fun)) + (error "Missing `end'")) + (t + (error "Unbalanced parentheses"))) + (forward-char 2)) + ;; Macro ((= (following-char) ??) - ;; Skip over the ? - (forward-char 1) - ) + ;; Skip over the ? + (forward-char 1) + ) ;; Type spec's ((looking-at "-type\\s \\|-opaque\\s ") - (if stack - (forward-char 1) - (erlang-push (list 'icr token (current-column)) stack) - (forward-char 6))) + (if stack + (forward-char 1) + (erlang-push (list 'icr token (current-column)) stack) + (forward-char 6))) ((looking-at "-spec\\s ") - (if stack - (forward-char 1) - (forward-char 6) - (skip-chars-forward "^(\n") - (erlang-push (list 'spec (point) (current-column)) stack) - )) + (if stack + (forward-char 1) + (forward-char 6) + (skip-chars-forward "^(\n") + (erlang-push (list 'spec (point) (current-column)) stack) + )) ;; Type spec delimiter ((looking-at "::") - (erlang-push (list ':: token (current-column)) stack) - (forward-char 2)) - - ;; Don't follow through in the clause below - ;; '|' don't need spaces around it + (erlang-push (list ':: token (current-column)) stack) + (forward-char 2)) + + ;; Don't follow through in the clause below + ;; '|' don't need spaces around it ((looking-at "|") - (forward-char 1)) - + (forward-char 1)) + ;; Other punctuation: Skip over it and any following punctuation ((= cs ?.) - ;; Skip over all characters in the operand. - (skip-syntax-forward ".")) - + ;; Skip over all characters in the operand. + (skip-syntax-forward ".")) + ;; Other char: Skip over it. (t - (forward-char 1)))) - + (forward-char 1)))) + ;; Open parenthesis ((= cs ?\() (erlang-push (list '\( token (current-column)) stack) (forward-char 1)) - + ;; Close parenthesis ((= cs ?\)) (while (memq (car (car stack)) '(|| -> :: when)) - (erlang-pop stack)) + (erlang-pop stack)) (cond ((eq (car (car stack)) '\() - (erlang-pop stack) - (if (and (eq (car (car stack)) 'fun) - (or (eq (car (car (last stack))) 'spec) - (eq (car (car (cdr stack))) '::))) ;; -type() - ;; Inside fun type def ') closes fun definition - (erlang-pop stack))) - ((eq (car (car stack)) 'icr) - (erlang-pop stack) - ;; Normal catch not try-catch might have caused icr - ;; and then incr should be removed and is not an error. - (if (eq (car (car stack)) '\() - (erlang-pop stack) - (error "Missing `end'") - )) - ((eq (car (car stack)) 'begin) - (error "Missing `end'")) - (t - (error "Unbalanced parenthesis")) - ) - (forward-char 1)) - + (erlang-pop stack) + (if (and (eq (car (car stack)) 'fun) + (or (eq (car (car (last stack))) 'spec) + (eq (car (car (cdr stack))) '::))) ;; -type() + ;; Inside fun type def ') closes fun definition + (erlang-pop stack))) + ((eq (car (car stack)) 'icr) + (erlang-pop stack) + ;; Normal catch not try-catch might have caused icr + ;; and then incr should be removed and is not an error. + (if (eq (car (car stack)) '\() + (erlang-pop stack) + (error "Missing `end'") + )) + ((eq (car (car stack)) 'begin) + (error "Missing `end'")) + (t + (error "Unbalanced parenthesis")) + ) + (forward-char 1)) + ;; Character quote: Skip it and the quoted char. ((= cs ?/) (forward-char 2)) - + ;; Character escape: Skip it and the escape sequence. ((= cs ?\\) (forward-char 1) @@ -2851,49 +2859,49 @@ Return nil if inside string, t if in a comment." ((eq (car stack-top) '\() ;; Element of list, tuple or part of an expression, (cond ((null erlang-argument-indent) - ;; indent to next column. - (1+ (nth 2 stack-top))) - ((= (char-syntax (following-char)) ?\)) - (goto-char (nth 1 stack-top)) - (cond ((looking-at "[({]\\s *\\($\\|%\\)") - ;; Line ends with parenthesis. - (let ((previous (erlang-indent-find-preceding-expr)) - (stack-pos (nth 2 stack-top))) - (if (>= previous stack-pos) stack-pos - (- (+ previous erlang-argument-indent) 1)))) - (t - (nth 2 stack-top)))) - ((= (following-char) ?,) - ;; a comma at the start of the line: line up with opening parenthesis. - (nth 2 stack-top)) - (t - (goto-char (nth 1 stack-top)) - (let ((base (cond ((looking-at "[({]\\s *\\($\\|%\\)") - ;; Line ends with parenthesis. - (erlang-indent-parenthesis (nth 2 stack-top))) - (t - ;; Indent to the same column as the first - ;; argument. - (goto-char (1+ (nth 1 stack-top))) - (skip-chars-forward " \t") - (current-column))))) - (erlang-indent-standard indent-point token base 't))))) - ;; - ((eq (car stack-top) '<<) - ;; Element of binary (possible comprehension) expression, - (cond ((null erlang-argument-indent) - ;; indent to next column. - (+ 2 (nth 2 stack-top))) - ((looking-at "\\(>>\\)[^_a-zA-Z0-9]") - (nth 2 stack-top)) - (t - (goto-char (nth 1 stack-top)) - ;; Indent to the same column as the first - ;; argument. - (goto-char (+ 2 (nth 1 stack-top))) - (skip-chars-forward " \t") - (current-column)))) - + ;; indent to next column. + (1+ (nth 2 stack-top))) + ((= (char-syntax (following-char)) ?\)) + (goto-char (nth 1 stack-top)) + (cond ((looking-at "[({]\\s *\\($\\|%\\)") + ;; Line ends with parenthesis. + (let ((previous (erlang-indent-find-preceding-expr)) + (stack-pos (nth 2 stack-top))) + (if (>= previous stack-pos) stack-pos + (- (+ previous erlang-argument-indent) 1)))) + (t + (nth 2 stack-top)))) + ((= (following-char) ?,) + ;; a comma at the start of the line: line up with opening parenthesis. + (nth 2 stack-top)) + (t + (goto-char (nth 1 stack-top)) + (let ((base (cond ((looking-at "[({]\\s *\\($\\|%\\)") + ;; Line ends with parenthesis. + (erlang-indent-parenthesis (nth 2 stack-top))) + (t + ;; Indent to the same column as the first + ;; argument. + (goto-char (1+ (nth 1 stack-top))) + (skip-chars-forward " \t") + (current-column))))) + (erlang-indent-standard indent-point token base 't))))) + ;; + ((eq (car stack-top) '<<) + ;; Element of binary (possible comprehension) expression, + (cond ((null erlang-argument-indent) + ;; indent to next column. + (+ 2 (nth 2 stack-top))) + ((looking-at "\\(>>\\)[^_a-zA-Z0-9]") + (nth 2 stack-top)) + (t + (goto-char (nth 1 stack-top)) + ;; Indent to the same column as the first + ;; argument. + (goto-char (+ 2 (nth 1 stack-top))) + (skip-chars-forward " \t") + (current-column)))) + ((memq (car stack-top) '(icr fun spec)) ;; The default indentation is the column of the option ;; directly following the keyword. (This does not apply to @@ -2904,156 +2912,156 @@ Return nil if inside string, t if in a comment." ;; `after' should be indented to the same level as the ;; corresponding receive. (cond ((looking-at "\\(after\\|of\\)\\($\\|[^_a-zA-Z0-9]\\)") - (nth 2 stack-top)) - ((looking-at "when[^_a-zA-Z0-9]") - ;; Handling one when part - (+ (nth 2 stack-top) erlang-indent-level erlang-indent-guard)) - (t - (save-excursion - (goto-char (nth 1 stack-top)) - (if (looking-at "case[^_a-zA-Z0-9]") - (+ (nth 2 stack-top) erlang-indent-level) - (skip-chars-forward "a-z") - (skip-chars-forward " \t") - (if (memq (following-char) '(?% ?\n)) - (+ (nth 2 stack-top) erlang-indent-level) - (current-column)))))) + (nth 2 stack-top)) + ((looking-at "when[^_a-zA-Z0-9]") + ;; Handling one when part + (+ (nth 2 stack-top) erlang-indent-level erlang-indent-guard)) + (t + (save-excursion + (goto-char (nth 1 stack-top)) + (if (looking-at "case[^_a-zA-Z0-9]") + (+ (nth 2 stack-top) erlang-indent-level) + (skip-chars-forward "a-z") + (skip-chars-forward " \t") + (if (memq (following-char) '(?% ?\n)) + (+ (nth 2 stack-top) erlang-indent-level) + (current-column)))))) ) - ((and (eq (car stack-top) '||) (looking-at "\\(]\\|>>\\)[^_a-zA-Z0-9]")) - (nth 2 (car (cdr stack)))) + ((and (eq (car stack-top) '||) (looking-at "\\(]\\|>>\\)[^_a-zA-Z0-9]")) + (nth 2 (car (cdr stack)))) ;; Real indentation, where operators create extra indentation etc. ((memq (car stack-top) '(-> || try begin)) - (if (looking-at "\\(of\\)[^_a-zA-Z0-9]") - (nth 2 stack-top) - (goto-char (nth 1 stack-top)) - ;; Check if there is more code after the '->' on the - ;; same line. If so use this indentation as base, else - ;; use parent indentation + 2 * level as base. - (let ((off erlang-indent-level) - (skip 2)) - (cond ((null (cdr stack))) ; Top level in function. - ((eq (car stack-top) 'begin) - (setq skip 5)) - ((eq (car stack-top) 'try) - (setq skip 5)) - ((eq (car stack-top) '->) - ;; If in fun definition use standard indent level not double - ;;(if (not (eq (car (car (cdr stack))) 'fun)) - ;; Removed it made multi clause fun's look to bad - (setq off (* 2 erlang-indent-level)))) ;; ) - (let ((base (erlang-indent-find-base stack indent-point off skip))) - ;; Special cases - (goto-char indent-point) - (cond ((looking-at "\\(end\\|after\\)\\($\\|[^_a-zA-Z0-9]\\)") - (if (eq (car stack-top) '->) - (erlang-pop stack)) - (if stack - (erlang-caddr (car stack)) - 0)) - ((looking-at "catch\\b\\($\\|[^_a-zA-Z0-9]\\)") - ;; Are we in a try - (let ((start (if (eq (car stack-top) '->) - (car (cdr stack)) - stack-top))) - (if (null start) nil - (goto-char (nth 1 start))) - (cond ((looking-at "try\\($\\|[^_a-zA-Z0-9]\\)") - (progn - (if (eq (car stack-top) '->) - (erlang-pop stack)) - (if stack - (erlang-caddr (car stack)) - 0))) - (t (erlang-indent-standard indent-point token base 'nil))))) ;; old catch - (t - (erlang-indent-standard indent-point token base 'nil) - )))) - )) - ((eq (car stack-top) 'when) - (goto-char (nth 1 stack-top)) - (if (looking-at "when\\s *\\($\\|%\\)") - (progn - (erlang-pop stack) - (if (and stack (memq (nth 0 (car stack)) '(icr fun))) - (progn - (goto-char (nth 1 (car stack))) - (+ (nth 2 (car stack)) erlang-indent-guard - ;; receive XYZ or receive - ;; XYZ - ;; This if thing does not seem to be needed - ;;(if (looking-at "[a-z]+\\s *\\($\\|%\\)") - ;; erlang-indent-level - ;; (* 2 erlang-indent-level)))) - (* 2 erlang-indent-level))) - ;;erlang-indent-level)) - (+ erlang-indent-level erlang-indent-guard))) + (if (looking-at "\\(of\\)[^_a-zA-Z0-9]") + (nth 2 stack-top) + (goto-char (nth 1 stack-top)) + ;; Check if there is more code after the '->' on the + ;; same line. If so use this indentation as base, else + ;; use parent indentation + 2 * level as base. + (let ((off erlang-indent-level) + (skip 2)) + (cond ((null (cdr stack))) ; Top level in function. + ((eq (car stack-top) 'begin) + (setq skip 5)) + ((eq (car stack-top) 'try) + (setq skip 5)) + ((eq (car stack-top) '->) + ;; If in fun definition use standard indent level not double + ;;(if (not (eq (car (car (cdr stack))) 'fun)) + ;; Removed it made multi clause fun's look to bad + (setq off (* 2 erlang-indent-level)))) ;; ) + (let ((base (erlang-indent-find-base stack indent-point off skip))) + ;; Special cases + (goto-char indent-point) + (cond ((looking-at "\\(end\\|after\\)\\($\\|[^_a-zA-Z0-9]\\)") + (if (eq (car stack-top) '->) + (erlang-pop stack)) + (if stack + (erlang-caddr (car stack)) + 0)) + ((looking-at "catch\\b\\($\\|[^_a-zA-Z0-9]\\)") + ;; Are we in a try + (let ((start (if (eq (car stack-top) '->) + (car (cdr stack)) + stack-top))) + (if (null start) nil + (goto-char (nth 1 start))) + (cond ((looking-at "try\\($\\|[^_a-zA-Z0-9]\\)") + (progn + (if (eq (car stack-top) '->) + (erlang-pop stack)) + (if stack + (erlang-caddr (car stack)) + 0))) + (t (erlang-indent-standard indent-point token base 'nil))))) ;; old catch + (t + (erlang-indent-standard indent-point token base 'nil) + )))) + )) + ((eq (car stack-top) 'when) + (goto-char (nth 1 stack-top)) + (if (looking-at "when\\s *\\($\\|%\\)") + (progn + (erlang-pop stack) + (if (and stack (memq (nth 0 (car stack)) '(icr fun))) + (progn + (goto-char (nth 1 (car stack))) + (+ (nth 2 (car stack)) erlang-indent-guard + ;; receive XYZ or receive + ;; XYZ + ;; This if thing does not seem to be needed + ;;(if (looking-at "[a-z]+\\s *\\($\\|%\\)") + ;; erlang-indent-level + ;; (* 2 erlang-indent-level)))) + (* 2 erlang-indent-level))) + ;;erlang-indent-level)) + (+ erlang-indent-level erlang-indent-guard))) ;; "when" is followed by code, let's indent to the same ;; column. (forward-char 4) ; Skip "when" (skip-chars-forward " \t") (current-column))) - ;; Type and Spec indentation - ((eq (car stack-top) '::) - (if (looking-at "[},)]") - ;; Closing function spec, record definition with types, + ;; Type and Spec indentation + ((eq (car stack-top) '::) + (if (looking-at "[},)]") + ;; Closing function spec, record definition with types, ;; or a comma at the start of the line - ;; pop stack and recurse - (erlang-calculate-stack-indent indent-point - (cons (erlang-pop stack) (cdr state))) - (cond ((null erlang-argument-indent) - ;; indent to next column. - (+ 2 (nth 2 stack-top))) - ((looking-at "::[^_a-zA-Z0-9]") - (nth 2 stack-top)) - (t - (let ((start-alternativ (if (looking-at "|") 2 0))) - (goto-char (nth 1 stack-top)) - (- (cond ((looking-at "::\\s *\\($\\|%\\)") - ;; Line ends with :: - (if (eq (car (car (last stack))) 'spec) - (+ (erlang-indent-find-preceding-expr 1) - erlang-argument-indent) - (+ (erlang-indent-find-preceding-expr 2) - erlang-argument-indent))) - (t - ;; Indent to the same column as the first - ;; argument. - (goto-char (+ 2 (nth 1 stack-top))) - (skip-chars-forward " \t") - (current-column))) start-alternativ)))))) - ))) + ;; pop stack and recurse + (erlang-calculate-stack-indent indent-point + (cons (erlang-pop stack) (cdr state))) + (cond ((null erlang-argument-indent) + ;; indent to next column. + (+ 2 (nth 2 stack-top))) + ((looking-at "::[^_a-zA-Z0-9]") + (nth 2 stack-top)) + (t + (let ((start-alternativ (if (looking-at "|") 2 0))) + (goto-char (nth 1 stack-top)) + (- (cond ((looking-at "::\\s *\\($\\|%\\)") + ;; Line ends with :: + (if (eq (car (car (last stack))) 'spec) + (+ (erlang-indent-find-preceding-expr 1) + erlang-argument-indent) + (+ (erlang-indent-find-preceding-expr 2) + erlang-argument-indent))) + (t + ;; Indent to the same column as the first + ;; argument. + (goto-char (+ 2 (nth 1 stack-top))) + (skip-chars-forward " \t") + (current-column))) start-alternativ)))))) + ))) (defun erlang-indent-standard (indent-point token base inside-parenthesis) "Standard indent when in blocks or tuple or arguments. Look at last thing to see in what state we are, move relative to the base." - (goto-char token) + (goto-char token) (cond ((looking-at "||\\|,\\|->\\||") - base) - ((erlang-at-keyword) - (+ (current-column) erlang-indent-level)) - ((or (= (char-syntax (following-char)) ?.) - (erlang-at-operator)) - (+ base erlang-indent-level)) - (t - (goto-char indent-point) - (cond ((memq (following-char) '(?\( )) - ;; Function application. - (+ (erlang-indent-find-preceding-expr) - erlang-argument-indent)) - ;; Empty line, or end; treat it as the end of - ;; the block. (Here we have a choice: should - ;; the user be forced to reindent continued - ;; lines, or should the "end" be reindented?) - - ;; Avoid treating comments a continued line. - ((= (following-char) ?%) - base) - ;; Continued line (e.g. line beginning - ;; with an operator.) - (t - (if (or (erlang-at-operator) (not inside-parenthesis)) - (+ base erlang-indent-level) - base)))))) + base) + ((erlang-at-keyword) + (+ (current-column) erlang-indent-level)) + ((or (= (char-syntax (following-char)) ?.) + (erlang-at-operator)) + (+ base erlang-indent-level)) + (t + (goto-char indent-point) + (cond ((memq (following-char) '(?\( )) + ;; Function application. + (+ (erlang-indent-find-preceding-expr) + erlang-argument-indent)) + ;; Empty line, or end; treat it as the end of + ;; the block. (Here we have a choice: should + ;; the user be forced to reindent continued + ;; lines, or should the "end" be reindented?) + + ;; Avoid treating comments a continued line. + ((= (following-char) ?%) + base) + ;; Continued line (e.g. line beginning + ;; with an operator.) + (t + (if (or (erlang-at-operator) (not inside-parenthesis)) + (+ base erlang-indent-level) + base)))))) (defun erlang-indent-find-base (stack indent-point &optional offset skip) "Find the base column for current stack." @@ -3063,21 +3071,21 @@ Return nil if inside string, t if in a comment." (let* ((stack-top (car stack))) (goto-char (nth 1 stack-top)) (if (< skip (- (point-max) (point))) - (progn - (forward-char skip) - (if (looking-at "\\s *\\($\\|%\\)") - (progn - (if (memq (car stack-top) '(-> ||)) - (erlang-pop stack)) - ;; Take parent identation + offset, - ;; else just erlang-indent-level if no parent - (if stack - (+ (erlang-caddr (car stack)) - offset) - erlang-indent-level)) - (erlang-skip-blank indent-point) - (current-column))) - (+ (current-column) skip))))) + (progn + (forward-char skip) + (if (looking-at "\\s *\\($\\|%\\)") + (progn + (if (memq (car stack-top) '(-> ||)) + (erlang-pop stack)) + ;; Take parent identation + offset, + ;; else just erlang-indent-level if no parent + (if stack + (+ (erlang-caddr (car stack)) + offset) + erlang-indent-level)) + (erlang-skip-blank indent-point) + (current-column))) + (+ (current-column) skip))))) ;; Does not handle `begin' .. `end'. @@ -3096,51 +3104,51 @@ This assumes that the preceding expression is either simple ;; where the call (forward-sexp -1) will fail when point is at the `#'. (or (ignore-errors - ;; Needed to match the colon in "'foo':'bar'". - (cond ((eq (preceding-char) ?:) - (backward-char 1) - (forward-sexp -1) - (current-column)) - ((eq (preceding-char) ?#) - ;; We may now be at: - ;; - either a construction of a new record - ;; - or update of a record, in which case we want - ;; the column of the expression to be updated. - ;; - ;; To see which of the two cases we are at, we first - ;; move an expression backwards, check for keywords, - ;; then immediately an expression forwards. Moving - ;; backwards skips past tokens like `,' or `->', but - ;; when moving forwards again, we won't skip past such - ;; tokens. We use this: if, after having moved - ;; forwards, we're back where we started, then it was - ;; a record update. - ;; The check for keywords is to detect cases like: - ;; case Something of #record_construction{...} - (backward-char 1) - (let ((record-start (point)) - (record-start-col (current-column))) - (forward-sexp -1) - (let ((preceding-expr-col (current-column)) - ;; white space definition according to erl_scan - (white-space "\000-\040\200-\240")) - (if (erlang-at-keyword) - ;; The (forward-sexp -1) call moved past a keyword - (1+ record-start-col) - (forward-sexp 1) - (skip-chars-forward white-space record-start) - ;; Are we back where we started? If so, it was an update. - (if (= (point) record-start) - preceding-expr-col - (goto-char record-start) - (1+ (current-column))))))) - (t col))) + ;; Needed to match the colon in "'foo':'bar'". + (cond ((eq (preceding-char) ?:) + (backward-char 1) + (forward-sexp -1) + (current-column)) + ((eq (preceding-char) ?#) + ;; We may now be at: + ;; - either a construction of a new record + ;; - or update of a record, in which case we want + ;; the column of the expression to be updated. + ;; + ;; To see which of the two cases we are at, we first + ;; move an expression backwards, check for keywords, + ;; then immediately an expression forwards. Moving + ;; backwards skips past tokens like `,' or `->', but + ;; when moving forwards again, we won't skip past such + ;; tokens. We use this: if, after having moved + ;; forwards, we're back where we started, then it was + ;; a record update. + ;; The check for keywords is to detect cases like: + ;; case Something of #record_construction{...} + (backward-char 1) + (let ((record-start (point)) + (record-start-col (current-column))) + (forward-sexp -1) + (let ((preceding-expr-col (current-column)) + ;; white space definition according to erl_scan + (white-space "\000-\040\200-\240")) + (if (erlang-at-keyword) + ;; The (forward-sexp -1) call moved past a keyword + (1+ record-start-col) + (forward-sexp 1) + (skip-chars-forward white-space record-start) + ;; Are we back where we started? If so, it was an update. + (if (= (point) record-start) + preceding-expr-col + (goto-char record-start) + (1+ (current-column))))))) + (t col))) col)))) -(defun erlang-indent-parenthesis (stack-position) +(defun erlang-indent-parenthesis (stack-position) (let ((previous (erlang-indent-find-preceding-expr))) (if (> previous stack-position) - (+ stack-position erlang-argument-indent) + (+ stack-position erlang-argument-indent) (+ previous erlang-argument-indent)))) (defun erlang-skip-blank (&optional lim) @@ -3149,20 +3157,20 @@ This assumes that the preceding expression is either simple (let (stop) (while (and (not stop) (< (point) lim)) (cond ((= (following-char) ?%) - (skip-chars-forward "^\n" lim)) - ((= (following-char) ?\n) - (skip-chars-forward "\n" lim)) - ((looking-at "\\s ") - (if (re-search-forward "\\S " lim 'move) - (forward-char -1))) - (t - (setq stop t)))) + (skip-chars-forward "^\n" lim)) + ((= (following-char) ?\n) + (skip-chars-forward "\n" lim)) + ((looking-at "\\s ") + (if (re-search-forward "\\S " lim 'move) + (forward-char -1))) + (t + (setq stop t)))) stop)) (defun erlang-at-keyword () "Are we looking at an Erlang keyword which will increase indentation?" (looking-at (concat "\\(when\\|if\\|fun\\|case\\|begin\\|" - "of\\|receive\\|after\\|catch\\|try\\)\\b"))) + "of\\|receive\\|after\\|catch\\|try\\)\\b"))) (defun erlang-at-operator () "Are we looking at an Erlang operator?" @@ -3175,14 +3183,14 @@ This assumes that the preceding expression is either simple Used both by `indent-for-comment' and the Erlang specific indentation commands." (cond ((looking-at "%%%") 0) - ((looking-at "%%") - (or (erlang-calculate-indent) - (current-indentation))) - (t - (save-excursion - (skip-chars-backward " \t") - (max (if (bolp) 0 (1+ (current-column))) - comment-column))))) + ((looking-at "%%") + (or (erlang-calculate-indent) + (current-indentation))) + (t + (save-excursion + (skip-chars-backward " \t") + (max (if (bolp) 0 (1+ (current-column))) + comment-column))))) ;;; Erlang movement commands @@ -3210,18 +3218,18 @@ Return t unless search stops due to end of buffer." ;; that the regexp below includes the last character of the ;; previous line. (if (bobp) - (or (looking-at "\n") - (forward-char 1)) - (forward-char -1) - (if (looking-at "\\`\n") - (forward-char 1)))) + (or (looking-at "\n") + (forward-char 1)) + (forward-char -1) + (if (looking-at "\\`\n") + (forward-char 1)))) ;; The regexp matches a function header that isn't ;; included in a string. (and (re-search-forward "\\(\\`\\|\\`\n\\|[^\\]\n\\)\\(-?[a-z]\\|'\\|-\\)" - nil 'move (- arg)) + nil 'move (- arg)) (let ((beg (match-beginning 2))) - (and beg (goto-char beg)) - t))) + (and beg (goto-char beg)) + t))) (defun erlang-end-of-clause (&optional arg) "Move to the end of the current clause. @@ -3267,22 +3275,22 @@ Return t unless search stops due to end of buffer." ;; Search backward ((> arg 0) (while (and (> arg 0) - (and (erlang-beginning-of-clause 1) - (let ((start (point)) - (name (erlang-name-of-function)) - (arity (erlang-get-function-arity))) - ;; Note: "arity" is nil for e.g. "-import", hence - ;; two "-import" clauses are not considered to - ;; be part of the same function. - (while (and (erlang-beginning-of-clause 1) - (string-equal name - (erlang-name-of-function)) - arity - (equal arity - (erlang-get-function-arity))) - (setq start (point))) - (goto-char start) - t))) + (and (erlang-beginning-of-clause 1) + (let ((start (point)) + (name (erlang-name-of-function)) + (arity (erlang-get-function-arity))) + ;; Note: "arity" is nil for e.g. "-import", hence + ;; two "-import" clauses are not considered to + ;; be part of the same function. + (while (and (erlang-beginning-of-clause 1) + (string-equal name + (erlang-name-of-function)) + arity + (equal arity + (erlang-get-function-arity))) + (setq start (point))) + (goto-char start) + t))) (setq arg (1- arg)))) ;; Search forward ((< arg 0) @@ -3290,19 +3298,19 @@ Return t unless search stops due to end of buffer." (erlang-beginning-of-clause 1) ;; Step -arg functions forward. (while (and (< arg 0) - ;; Step one function forward, or stop if the end of - ;; the buffer was reached. Return t if we found the - ;; function. - (let ((name (erlang-name-of-function)) - (arity (erlang-get-function-arity)) - (found (erlang-beginning-of-clause -1))) - (while (and found - (string-equal name (erlang-name-of-function)) - arity - (equal arity - (erlang-get-function-arity))) - (setq found (erlang-beginning-of-clause -1))) - found)) + ;; Step one function forward, or stop if the end of + ;; the buffer was reached. Return t if we found the + ;; function. + (let ((name (erlang-name-of-function)) + (arity (erlang-get-function-arity)) + (found (erlang-beginning-of-clause -1))) + (while (and found + (string-equal name (erlang-name-of-function)) + arity + (equal arity + (erlang-get-function-arity))) + (setq found (erlang-beginning-of-clause -1))) + found)) (setq arg (1+ arg))))) (zerop arg)) @@ -3318,35 +3326,35 @@ With negative argument go towards the beginning of the buffer." ;; Forward (while (and (> arg 0) (< (point) (point-max))) (let ((pos (point))) - (while (progn - (if (and first - (progn - (forward-char 1) - (erlang-beginning-of-clause 1))) - nil - (or (bobp) (forward-char -1)) - (erlang-beginning-of-clause -1)) - (setq first nil) - (erlang-pass-over-function) - (skip-chars-forward " \t") - (if (looking-at "[%\n]") - (forward-line 1)) - (<= (point) pos)))) + (while (progn + (if (and first + (progn + (forward-char 1) + (erlang-beginning-of-clause 1))) + nil + (or (bobp) (forward-char -1)) + (erlang-beginning-of-clause -1)) + (setq first nil) + (erlang-pass-over-function) + (skip-chars-forward " \t") + (if (looking-at "[%\n]") + (forward-line 1)) + (<= (point) pos)))) (setq arg (1- arg))) ;; Backward (while (< arg 0) (let ((pos (point))) - (erlang-beginning-of-clause 1) - (erlang-pass-over-function) - (forward-line 1) - (if (>= (point) pos) - (if (erlang-beginning-of-function 2) - (progn - (erlang-pass-over-function) - (skip-chars-forward " \t") - (if (looking-at "[%\n]") - (forward-line 1))) - (goto-char (point-min))))) + (erlang-beginning-of-clause 1) + (erlang-pass-over-function) + (forward-line 1) + (if (>= (point) pos) + (if (erlang-beginning-of-function 2) + (progn + (erlang-pass-over-function) + (skip-chars-forward " \t") + (if (looking-at "[%\n]") + (forward-line 1))) + (goto-char (point-min))))) (setq arg (1+ arg))))) (eval-and-compile @@ -3360,18 +3368,18 @@ With negative argument go towards the beginning of the buffer." ;; Sets the region. In Emacs 19 and XEmacs, we want to activate ;; the region. (condition-case nil - (push-mark (point) nil t) - (error (push-mark (point)))) + (push-mark (point) nil t) + (error (push-mark (point)))) (erlang-beginning-of-function 1) ;; The above function deactivates the mark. (if (boundp 'deactivate-mark) - (funcall (symbol-function 'set) 'deactivate-mark nil))))) + (funcall (symbol-function 'set) 'deactivate-mark nil))))) (defun erlang-pass-over-function () (while (progn - (erlang-skip-blank) - (and (not (looking-at "\\.\\(\\s \\|\n\\|\\s<\\)")) - (not (eobp)))) + (erlang-skip-blank) + (and (not (looking-at "\\.\\(\\s \\|\n\\|\\s<\\)")) + (not (eobp)))) (forward-sexp 1)) (if (not (eobp)) (forward-char 1))) @@ -3380,7 +3388,7 @@ With negative argument go towards the beginning of the buffer." (save-excursion ;; Skip over attribute leader. (if (looking-at "-[ \t]*") - (re-search-forward "-[ \t]*" nil 'move)) + (re-search-forward "-[ \t]*" nil 'move)) (let ((start (point))) (forward-sexp 1) (buffer-substring start (point))))) @@ -3395,54 +3403,54 @@ paragraph of it that point is in, preserving the comment's indentation and initial `%':s." (interactive "P") (let ((has-comment nil) - ;; If has-comment, the appropriate fill-prefix for the comment. - comment-fill-prefix) + ;; If has-comment, the appropriate fill-prefix for the comment. + comment-fill-prefix) ;; Figure out what kind of comment we are looking at. (save-excursion (beginning-of-line) (cond ;; Find the command prefix. ((looking-at (concat "\\s *" comment-start-skip)) - (setq has-comment t) - (setq comment-fill-prefix (buffer-substring (match-beginning 0) - (match-end 0)))) + (setq has-comment t) + (setq comment-fill-prefix (buffer-substring (match-beginning 0) + (match-end 0)))) ;; A line with some code, followed by a comment? Remember that the ;; % which starts the comment shouldn't be part of a string or ;; character. ((progn - (while (not (looking-at "%\\|$")) - (skip-chars-forward "^%\n\"\\\\") - (cond - ((eq (char-after (point)) ?\\) (forward-char 2)) - ((eq (char-after (point)) ?\") (forward-sexp 1)))) - (looking-at comment-start-skip)) - (setq has-comment t) - (setq comment-fill-prefix - (concat (make-string (current-column) ? ) - (buffer-substring (match-beginning 0) (match-end 0))))))) + (while (not (looking-at "%\\|$")) + (skip-chars-forward "^%\n\"\\\\") + (cond + ((eq (char-after (point)) ?\\) (forward-char 2)) + ((eq (char-after (point)) ?\") (forward-sexp 1)))) + (looking-at comment-start-skip)) + (setq has-comment t) + (setq comment-fill-prefix + (concat (make-string (current-column) ? ) + (buffer-substring (match-beginning 0) (match-end 0))))))) (if (not has-comment) - (fill-paragraph justify) + (fill-paragraph justify) ;; Narrow to include only the comment, and then fill the region. (save-restriction - (narrow-to-region - ;; Find the first line we should include in the region to fill. - (save-excursion - (while (and (zerop (forward-line -1)) - (looking-at "^\\s *%"))) - ;; We may have gone to far. Go forward again. - (or (looking-at "^\\s *%") - (forward-line 1)) - (point)) - ;; Find the beginning of the first line past the region to fill. - (save-excursion - (while (progn (forward-line 1) - (looking-at "^\\s *%"))) - (point))) - ;; Lines with only % on them can be paragraph boundaries. - (let ((paragraph-start (concat paragraph-start "\\|^[ \t%]*$")) - (paragraph-separate (concat paragraph-start "\\|^[ \t%]*$")) - (fill-prefix comment-fill-prefix)) - (fill-paragraph justify)))))) + (narrow-to-region + ;; Find the first line we should include in the region to fill. + (save-excursion + (while (and (zerop (forward-line -1)) + (looking-at "^\\s *%"))) + ;; We may have gone to far. Go forward again. + (or (looking-at "^\\s *%") + (forward-line 1)) + (point)) + ;; Find the beginning of the first line past the region to fill. + (save-excursion + (while (progn (forward-line 1) + (looking-at "^\\s *%"))) + (point))) + ;; Lines with only % on them can be paragraph boundaries. + (let ((paragraph-start (concat paragraph-start "\\|^[ \t%]*$")) + (paragraph-separate (concat paragraph-start "\\|^[ \t%]*$")) + (fill-prefix comment-fill-prefix)) + (fill-paragraph justify)))))) (defun erlang-uncomment-region (beg end) @@ -3461,22 +3469,22 @@ first parenthesis is preserved. The point is placed between the parentheses." (interactive) (let ((name (save-excursion - (and (erlang-beginning-of-clause) - (erlang-get-function-name t)))) - (arrow (save-excursion - (and (erlang-beginning-of-clause) - (erlang-get-function-arrow))))) + (and (erlang-beginning-of-clause) + (erlang-get-function-name t)))) + (arrow (save-excursion + (and (erlang-beginning-of-clause) + (erlang-get-function-arrow))))) (if (or (null arrow) (null name)) - (error "Can't find name of current Erlang function")) + (error "Can't find name of current Erlang function")) (if (and (bolp) (eolp)) - nil + nil (end-of-line) (newline)) (insert name) (save-excursion (insert ") " arrow)) (if erlang-new-clause-with-arguments - (erlang-clone-arguments)))) + (erlang-clone-arguments)))) (defun erlang-clone-arguments () @@ -3486,12 +3494,12 @@ The mark is set at the beginning of the inserted text, the point at the end." (interactive) (let ((args (save-excursion - (beginning-of-line) - (and (erlang-beginning-of-clause) - (erlang-get-function-arguments)))) - (p (point))) + (beginning-of-line) + (and (erlang-beginning-of-clause) + (erlang-get-function-arguments)))) + (p (point))) (if (null args) - (error "Can't clone argument list")) + (error "Can't clone argument list")) (insert args) (set-mark p))) @@ -3514,18 +3522,18 @@ Return nil if file contains no `-module' attribute." (widen) (goto-char (point-min)) (let ((md (match-data))) - (unwind-protect - (if (re-search-forward - (eval-when-compile - (concat "^-module\\s *(\\s *\\(\\(" - erlang-atom-regexp - "\\)?\\)\\s *)\\s *\\.")) - (point-max) t) - (erlang-remove-quotes - (erlang-buffer-substring (match-beginning 1) - (match-end 1))) - nil) - (store-match-data md)))))) + (unwind-protect + (if (re-search-forward + (eval-when-compile + (concat "^-module\\s *(\\s *\\(\\(" + erlang-atom-regexp + "\\)?\\)\\s *)\\s *\\.")) + (point-max) t) + (erlang-remove-quotes + (erlang-buffer-substring (match-beginning 1) + (match-end 1))) + nil) + (store-match-data md)))))) (defun erlang-get-module-from-file-name (&optional file) @@ -3545,7 +3553,7 @@ tags system could be used by files written in other languages." nil (setq file (file-name-nondirectory file)) (if (string-match erlang-file-name-extension-regexp file) - (substring file 0 (match-beginning 0)) + (substring file 0 (match-beginning 0)) nil))) @@ -3566,30 +3574,30 @@ corresponds to the order of the parsed Erlang list." (erlang-skip-blank) (forward-char 1) (if (not (eq (preceding-char) ?\[)) - '() ; Not looking at an Erlang list. - (while ; Note: `while' has no body. - (progn - (erlang-skip-blank) - (and (looking-at (eval-when-compile - (concat erlang-atom-regexp "/\\([0-9]+\\)\\>"))) - (progn - (setq res (cons - (cons - (erlang-remove-quotes - (erlang-buffer-substring - (match-beginning 1) (match-end 1))) - (erlang-string-to-int - (erlang-buffer-substring - (match-beginning - (+ 1 erlang-atom-regexp-matches)) - (match-end - (+ 1 erlang-atom-regexp-matches))))) - res)) - (goto-char (match-end 0)) - (erlang-skip-blank) - (forward-char 1) - ;; Test if there are more exported functions. - (eq (preceding-char) ?,)))))) + '() ; Not looking at an Erlang list. + (while ; Note: `while' has no body. + (progn + (erlang-skip-blank) + (and (looking-at (eval-when-compile + (concat erlang-atom-regexp "/\\([0-9]+\\)\\>"))) + (progn + (setq res (cons + (cons + (erlang-remove-quotes + (erlang-buffer-substring + (match-beginning 1) (match-end 1))) + (erlang-string-to-int + (erlang-buffer-substring + (match-beginning + (+ 1 erlang-atom-regexp-matches)) + (match-end + (+ 1 erlang-atom-regexp-matches))))) + res)) + (goto-char (match-end 0)) + (erlang-skip-blank) + (forward-char 1) + ;; Test if there are more exported functions. + (eq (preceding-char) ?,)))))) (nreverse res))) @@ -3601,14 +3609,14 @@ corresponds to the order of the parsed Erlang list." (save-excursion (goto-char (point-min)) (let ((md (match-data)) - (res '())) + (res '())) (unwind-protect - (progn - (while (re-search-forward "^-export\\s *(" (point-max) t) - (erlang-skip-blank) - (setq res (nconc res (erlang-get-function-arity-list)))) - res) - (store-match-data md))))) + (progn + (while (re-search-forward "^-export\\s *(" (point-max) t) + (erlang-skip-blank) + (setq res (nconc res (erlang-get-function-arity-list)))) + res) + (store-match-data md))))) (defun erlang-get-import () @@ -3619,30 +3627,30 @@ function and arity as cdr part." (save-excursion (goto-char (point-min)) (let ((md (match-data)) - (res '())) + (res '())) (unwind-protect - (progn - (while (re-search-forward "^-import\\s *(" (point-max) t) - (erlang-skip-blank) - (if (looking-at erlang-atom-regexp) - (let ((module (erlang-remove-quotes - (erlang-buffer-substring - (match-beginning 0) - (match-end 0))))) - (goto-char (match-end 0)) - (erlang-skip-blank) - (if (eq (following-char) ?,) - (progn - (forward-char 1) - (erlang-skip-blank) - (let ((funcs (erlang-get-function-arity-list)) - (pair (assoc module res))) - (if pair - (setcdr pair (nconc (cdr pair) funcs)) - (setq res (cons (cons module funcs) - res))))))))) - (nreverse res)) - (store-match-data md))))) + (progn + (while (re-search-forward "^-import\\s *(" (point-max) t) + (erlang-skip-blank) + (if (looking-at erlang-atom-regexp) + (let ((module (erlang-remove-quotes + (erlang-buffer-substring + (match-beginning 0) + (match-end 0))))) + (goto-char (match-end 0)) + (erlang-skip-blank) + (if (eq (following-char) ?,) + (progn + (forward-char 1) + (erlang-skip-blank) + (let ((funcs (erlang-get-function-arity-list)) + (pair (assoc module res))) + (if pair + (setcdr pair (nconc (cdr pair) funcs)) + (setq res (cons (cons module funcs) + res))))))))) + (nreverse res)) + (store-match-data md))))) (defun erlang-get-function-name (&optional arg) @@ -3654,12 +3662,12 @@ the first `(' is returned. Normally used in conjunction with `erlang-beginning-of-clause', e.g.: (save-excursion (if (not (eobp)) (forward-char 1)) - (and (erlang-beginning-of-clause) - (erlang-get-function-name t)))" + (and (erlang-beginning-of-clause) + (erlang-get-function-name t)))" (let ((n (if arg 0 1))) (and (looking-at (eval-when-compile - (concat "^" erlang-atom-regexp "\\s *("))) - (erlang-buffer-substring (match-beginning n) (match-end n))))) + (concat "^" erlang-atom-regexp "\\s *("))) + (erlang-buffer-substring (match-beginning n) (match-end n))))) (defun erlang-get-function-arrow () @@ -3668,9 +3676,9 @@ Normally used in conjunction with `erlang-beginning-of-clause', e.g.: Normally used in conjunction with `erlang-beginning-of-clause', e.g.: (save-excursion (if (not (eobp)) (forward-char 1)) - (and (erlang-beginning-of-clause) - (erlang-get-function-arrow)))" - (and + (and (erlang-beginning-of-clause) + (erlang-get-function-arrow)))" + (and (save-excursion (re-search-forward "->" (point-max) t) (erlang-buffer-substring (- (point) 2) (+ (point) 1))))) @@ -3678,33 +3686,33 @@ Normally used in conjunction with `erlang-beginning-of-clause', e.g.: (defun erlang-get-function-arity () "Return the number of arguments of function at point, or nil." (and (looking-at (eval-when-compile - (concat "^" erlang-atom-regexp "\\s *("))) + (concat "^" erlang-atom-regexp "\\s *("))) (save-excursion - (goto-char (match-end 0)) - (condition-case nil - (let ((res 0) - (cont t)) - (while cont - (cond ((eobp) - (setq res nil) - (setq cont nil)) - ((looking-at "\\s *)") - (setq cont nil)) - ((looking-at "\\s *\\($\\|%\\)") - (forward-line 1)) - ((looking-at "\\s *<<[^>]*?>>") - (when (zerop res) - (setq res (+ 1 res))) - (goto-char (match-end 0))) - ((looking-at "\\s *,") - (setq res (+ 1 res)) - (goto-char (match-end 0))) - (t - (when (zerop res) - (setq res (+ 1 res))) - (forward-sexp 1)))) - res) - (error nil))))) + (goto-char (match-end 0)) + (condition-case nil + (let ((res 0) + (cont t)) + (while cont + (cond ((eobp) + (setq res nil) + (setq cont nil)) + ((looking-at "\\s *)") + (setq cont nil)) + ((looking-at "\\s *\\($\\|%\\)") + (forward-line 1)) + ((looking-at "\\s *<<[^>]*?>>") + (when (zerop res) + (setq res (+ 1 res))) + (goto-char (match-end 0))) + ((looking-at "\\s *,") + (setq res (+ 1 res)) + (goto-char (match-end 0))) + (t + (when (zerop res) + (setq res (+ 1 res))) + (forward-sexp 1)))) + res) + (error nil))))) (defun erlang-get-function-name-and-arity () "Return the name and arity of the function at point, or nil. @@ -3716,15 +3724,15 @@ The return value is a string of the form \"foo/1\"." (defun erlang-get-function-arguments () "Return arguments of current function, or nil." (if (not (looking-at (eval-when-compile - (concat "^" erlang-atom-regexp "\\s *(")))) + (concat "^" erlang-atom-regexp "\\s *(")))) nil (save-excursion (condition-case nil - (let ((start (match-end 0))) - (goto-char (- start 1)) - (forward-sexp) - (erlang-buffer-substring start (- (point) 1))) - (error nil))))) + (let ((start (match-end 0))) + (goto-char (- start 1)) + (forward-sexp) + (erlang-buffer-substring start (- (point) 1))) + (error nil))))) (defun erlang-get-function-under-point () @@ -3741,37 +3749,37 @@ The following could be returned: In the future the list may contain more elements." (save-excursion (let ((md (match-data)) - (res nil)) + (res nil)) (if (eq (char-syntax (following-char)) ? ) - (skip-chars-backward " \t")) + (skip-chars-backward " \t")) (skip-chars-backward "a-zA-Z0-9_:'") (cond ((looking-at (eval-when-compile - (concat erlang-atom-regexp ":" erlang-atom-regexp))) - (setq res (list - (erlang-remove-quotes - (erlang-buffer-substring - (match-beginning 1) (match-end 1))) - (erlang-remove-quotes - (erlang-buffer-substring - (match-beginning (1+ erlang-atom-regexp-matches)) - (match-end (1+ erlang-atom-regexp-matches))))))) - ((looking-at erlang-atom-regexp) - (let ((fk (erlang-remove-quotes - (erlang-buffer-substring - (match-beginning 0) (match-end 0)))) - (mod nil) - (imports (erlang-get-import))) - (while (and imports (null mod)) - (if (assoc fk (cdr (car imports))) - (setq mod (car (car imports))) - (setq imports (cdr imports)))) - (cond ((eq (preceding-char) ?#) - (setq fk (concat "-record(" fk))) - ((eq (preceding-char) ??) - (setq fk (concat "-define(" fk))) - ((and (null mod) (not (member fk erlang-int-bifs))) - (setq mod (erlang-get-module)))) - (setq res (list mod fk))))) + (concat erlang-atom-regexp ":" erlang-atom-regexp))) + (setq res (list + (erlang-remove-quotes + (erlang-buffer-substring + (match-beginning 1) (match-end 1))) + (erlang-remove-quotes + (erlang-buffer-substring + (match-beginning (1+ erlang-atom-regexp-matches)) + (match-end (1+ erlang-atom-regexp-matches))))))) + ((looking-at erlang-atom-regexp) + (let ((fk (erlang-remove-quotes + (erlang-buffer-substring + (match-beginning 0) (match-end 0)))) + (mod nil) + (imports (erlang-get-import))) + (while (and imports (null mod)) + (if (assoc fk (cdr (car imports))) + (setq mod (car (car imports))) + (setq imports (cdr imports)))) + (cond ((eq (preceding-char) ?#) + (setq fk (concat "-record(" fk))) + ((eq (preceding-char) ??) + (setq fk (concat "-define(" fk))) + ((and (null mod) (not (member fk erlang-int-bifs))) + (setq mod (erlang-get-module)))) + (setq res (list mod fk))))) (store-match-data md) res))) @@ -3782,11 +3790,11 @@ In the future the list may contain more elements." "Return STR, possibly with quotes." (let ((case-fold-search nil)) ; force string matching to be case sensitive (if (and (stringp str) - (not (string-match (eval-when-compile - (concat "\\`" erlang-atom-regexp "\\'")) str))) - (progn (if (fboundp 'replace-regexp-in-string) - (setq str (replace-regexp-in-string "'" "\\'" str t t ))) - (concat "'" str "'")) + (not (string-match (eval-when-compile + (concat "\\`" erlang-atom-regexp "\\'")) str))) + (progn (if (fboundp 'replace-regexp-in-string) + (setq str (replace-regexp-in-string "'" "\\'" str t t ))) + (concat "'" str "'")) str))) @@ -3794,9 +3802,9 @@ In the future the list may contain more elements." "Return STR without quotes, if present." (let ((md (match-data))) (prog1 - (if (string-match "\\`'\\(.*\\)'\\'" str) - (substring str 1 -1) - str) + (if (string-match "\\`'\\(.*\\)'\\'" str) + (substring str 1 -1) + str) (store-match-data md)))) (defun erlang-match-next-exported-function (max) @@ -3866,30 +3874,30 @@ is prompted. This function is normally placed in the hook `local-write-file-hooks'." (if erlang-check-module-name - (let ((mn (erlang-add-quotes-if-needed - (erlang-get-module))) - (fn (erlang-add-quotes-if-needed - (erlang-get-module-from-file-name (buffer-file-name))))) - (if (and (stringp mn) (stringp fn)) - (or (string-equal mn fn) - (if (or (eq erlang-check-module-name t) - (y-or-n-p - "Module does not match file name. Modify source? ")) - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (if (re-search-forward - (eval-when-compile - (concat "^-module\\s *(\\s *\\(\\(" - erlang-atom-regexp - "\\)?\\)\\s *)\\s *\\.")) - (point-max) t) - (progn - (goto-char (match-beginning 1)) - (delete-region (match-beginning 1) - (match-end 1)) - (insert fn)))))))))) + (let ((mn (erlang-add-quotes-if-needed + (erlang-get-module))) + (fn (erlang-add-quotes-if-needed + (erlang-get-module-from-file-name (buffer-file-name))))) + (if (and (stringp mn) (stringp fn)) + (or (string-equal mn fn) + (if (or (eq erlang-check-module-name t) + (y-or-n-p + "Module does not match file name. Modify source? ")) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (if (re-search-forward + (eval-when-compile + (concat "^-module\\s *(\\s *\\(\\(" + erlang-atom-regexp + "\\)?\\)\\s *)\\s *\\.")) + (point-max) t) + (progn + (goto-char (match-beginning 1)) + (delete-region (match-beginning 1) + (match-end 1)) + (insert fn)))))))))) ;; Must return nil since it is added to `local-write-file-hook'. nil) @@ -3915,13 +3923,13 @@ non-whitespace characters following the point on the current line." (interactive "P") (self-insert-command (prefix-numeric-value arg)) (if (or arg - (and (listp erlang-electric-commands) - (not (memq 'erlang-electric-semicolon - erlang-electric-commands))) - (erlang-in-literal) - (not (looking-at "\\s *\\(%.*\\)?$")) - (null (erlang-test-criteria-list - erlang-electric-semicolon-criteria))) + (and (listp erlang-electric-commands) + (not (memq 'erlang-electric-semicolon + erlang-electric-commands))) + (erlang-in-literal) + (not (looking-at "\\s *\\(%.*\\)?$")) + (null (erlang-test-criteria-list + erlang-electric-semicolon-criteria))) (setq erlang-electric-newline-inhibit nil) (setq erlang-electric-newline-inhibit t) (undo-boundary) @@ -3929,20 +3937,20 @@ non-whitespace characters following the point on the current line." (end-of-line) (newline) (if (condition-case nil - (progn (erlang-indent-line) t) - (error (if (bolp) (delete-char -1)))) - (if (not (bolp)) - (save-excursion - (insert " ->")) - (condition-case nil - (progn - (erlang-generate-new-clause) - (if erlang-electric-semicolon-insert-blank-lines - (save-excursion - (beginning-of-line) - (newline - erlang-electric-semicolon-insert-blank-lines)))) - (error (if (bolp) (delete-char -1)))))))) + (progn (erlang-indent-line) t) + (error (if (bolp) (delete-char -1)))) + (if (not (bolp)) + (save-excursion + (insert " ->")) + (condition-case nil + (progn + (erlang-generate-new-clause) + (if erlang-electric-semicolon-insert-blank-lines + (save-excursion + (beginning-of-line) + (newline + erlang-electric-semicolon-insert-blank-lines)))) + (error (if (bolp) (delete-char -1)))))))) (defun erlang-electric-comma (&optional arg) @@ -3958,12 +3966,12 @@ non-whitespace characters following the point on the current line." (self-insert-command (prefix-numeric-value arg)) (if (or arg - (and (listp erlang-electric-commands) - (not (memq 'erlang-electric-comma erlang-electric-commands))) - (erlang-in-literal) - (not (looking-at "\\s *\\(%.*\\)?$")) - (null (erlang-test-criteria-list - erlang-electric-comma-criteria))) + (and (listp erlang-electric-commands) + (not (memq 'erlang-electric-comma erlang-electric-commands))) + (erlang-in-literal) + (not (looking-at "\\s *\\(%.*\\)?$")) + (null (erlang-test-criteria-list + erlang-electric-comma-criteria))) (setq erlang-electric-newline-inhibit nil) (setq erlang-electric-newline-inhibit t) (undo-boundary) @@ -3971,12 +3979,12 @@ non-whitespace characters following the point on the current line." (end-of-line) (newline) (condition-case nil - (erlang-indent-line) + (erlang-indent-line) (error (if (bolp) (delete-char -1)))))) (defun erlang-electric-lt (&optional arg) "Insert a less-than sign, and optionally mark it as an open paren." - + (interactive "p") (self-insert-command arg) @@ -3986,48 +3994,48 @@ non-whitespace characters following the point on the current line." (save-excursion (backward-char 2) (when (and (eq (char-after (point)) ?<) - (not (eq (get-text-property (point) 'category) - 'bitsyntax-open-inner))) - ;; Then mark the two chars... - (put-text-property (point) (1+ (point)) - 'category 'bitsyntax-open-outer) - (forward-char 1) - (put-text-property (point) (1+ (point)) - 'category 'bitsyntax-open-inner) - ;;...and unmark any subsequent less-than chars. - (forward-char 1) - (while (eq (char-after (point)) ?<) - (remove-text-properties (point) (1+ (point)) - '(category nil)) - (forward-char 1)))))) + (not (eq (get-text-property (point) 'category) + 'bitsyntax-open-inner))) + ;; Then mark the two chars... + (put-text-property (point) (1+ (point)) + 'category 'bitsyntax-open-outer) + (forward-char 1) + (put-text-property (point) (1+ (point)) + 'category 'bitsyntax-open-inner) + ;;...and unmark any subsequent less-than chars. + (forward-char 1) + (while (eq (char-after (point)) ?<) + (remove-text-properties (point) (1+ (point)) + '(category nil)) + (forward-char 1)))))) (defun erlang-after-bitsyntax-close () "Return t if point is immediately after a bit-syntax close parenthesis (`>>')." (and (>= (point) 3) (save-excursion - (backward-char 2) - (and (eq (char-after (point)) ?>) - (not (eq (get-text-property (point) 'category) - 'bitsyntax-close-outer)))))) - + (backward-char 2) + (and (eq (char-after (point)) ?>) + (not (eq (get-text-property (point) 'category) + 'bitsyntax-close-outer)))))) + (defun erlang-after-arrow () "Return true if point is immediately after a function arrow (`->')." (and (>= (point) 2) - (and - (save-excursion - (backward-char) - (eq (char-before (point)) ?-)) - (or (not (listp erlang-electric-commands)) - (memq 'erlang-electric-gt - erlang-electric-commands)) - (not (erlang-in-literal)) - (looking-at "\\s *\\(%.*\\)?$") - (erlang-test-criteria-list erlang-electric-arrow-criteria)))) + (and + (save-excursion + (backward-char) + (eq (char-before (point)) ?-)) + (or (not (listp erlang-electric-commands)) + (memq 'erlang-electric-gt + erlang-electric-commands)) + (not (erlang-in-literal)) + (looking-at "\\s *\\(%.*\\)?$") + (erlang-test-criteria-list erlang-electric-arrow-criteria)))) (defun erlang-electric-gt (&optional arg) "Insert a greater-than sign, and optionally mark it as a close paren." - + (interactive "p") (self-insert-command arg) @@ -4038,17 +4046,17 @@ non-whitespace characters following the point on the current line." (save-excursion ;; Then mark the two chars... (backward-char 2) - (put-text-property (point) (1+ (point)) - 'category 'bitsyntax-close-inner) + (put-text-property (point) (1+ (point)) + 'category 'bitsyntax-close-inner) (forward-char) (put-text-property (point) (1+ (point)) - 'category 'bitsyntax-close-outer) + 'category 'bitsyntax-close-outer) ;;...and unmark any subsequent greater-than chars. (forward-char) (while (eq (char-after (point)) ?>) - (remove-text-properties (point) (1+ (point)) - '(category nil)) - (forward-char)))) + (remove-text-properties (point) (1+ (point)) + '(category nil)) + (forward-char)))) ;; Did we just write a function arrow (`->')? ((erlang-after-arrow) @@ -4057,13 +4065,13 @@ non-whitespace characters following the point on the current line." (end-of-line) (newline) (condition-case nil - (erlang-indent-line) - (error (if (bolp) (delete-char -1)))))) + (erlang-indent-line) + (error (if (bolp) (delete-char -1)))))) ;; Then it's just a plain greater-than. (t nil))) - + (defun erlang-electric-arrow\ off (&optional arg) "Insert a '>'-sign and possibly a new indented line. @@ -4083,22 +4091,22 @@ After being split/merged into `erlang-after-arrow' and (let ((prec (preceding-char))) (self-insert-command (prefix-numeric-value arg)) (if (or arg - (and (listp erlang-electric-commands) - (not (memq 'erlang-electric-arrow - erlang-electric-commands))) - (not (eq prec ?-)) - (erlang-in-literal) - (not (looking-at "\\s *\\(%.*\\)?$")) - (null (erlang-test-criteria-list - erlang-electric-arrow-criteria))) - (setq erlang-electric-newline-inhibit nil) + (and (listp erlang-electric-commands) + (not (memq 'erlang-electric-arrow + erlang-electric-commands))) + (not (eq prec ?-)) + (erlang-in-literal) + (not (looking-at "\\s *\\(%.*\\)?$")) + (null (erlang-test-criteria-list + erlang-electric-arrow-criteria))) + (setq erlang-electric-newline-inhibit nil) (setq erlang-electric-newline-inhibit t) (undo-boundary) (end-of-line) (newline) (condition-case nil - (erlang-indent-line) - (error (if (bolp) (delete-char -1))))))) + (erlang-indent-line) + (error (if (bolp) (delete-char -1))))))) (defun erlang-electric-newline (&optional arg) @@ -4113,30 +4121,30 @@ Should the previous command be another electric command we assume that the user pressed newline out of old habit, hence we will do nothing." (interactive "P") (cond ((and (not arg) - erlang-electric-newline-inhibit - (memq last-command erlang-electric-newline-inhibit-list)) - ()) ; Do nothing! - ((or arg - (and (listp erlang-electric-commands) - (not (memq 'erlang-electric-newline - erlang-electric-commands))) - (null (erlang-test-criteria-list - erlang-electric-newline-criteria))) - (newline (prefix-numeric-value arg))) - (t - (if (and comment-multi-line - (save-excursion - (beginning-of-line) - (looking-at (concat "\\s *" comment-start-skip)))) - (let ((str (buffer-substring - (or (match-end 1) (match-beginning 0)) - (min (match-end 0) (point))))) - (newline) - (undo-boundary) - (insert str)) - (newline) - (undo-boundary) - (indent-according-to-mode))))) + erlang-electric-newline-inhibit + (memq last-command erlang-electric-newline-inhibit-list)) + ()) ; Do nothing! + ((or arg + (and (listp erlang-electric-commands) + (not (memq 'erlang-electric-newline + erlang-electric-commands))) + (null (erlang-test-criteria-list + erlang-electric-newline-criteria))) + (newline (prefix-numeric-value arg))) + (t + (if (and comment-multi-line + (save-excursion + (beginning-of-line) + (looking-at (concat "\\s *" comment-start-skip)))) + (let ((str (buffer-substring + (or (match-end 1) (match-beginning 0)) + (min (match-end 0) (point))))) + (newline) + (undo-boundary) + (insert str)) + (newline) + (undo-boundary) + (indent-according-to-mode))))) (defun erlang-test-criteria-list (criteria) @@ -4161,14 +4169,14 @@ Return t if criteria fulfilled, nil otherwise." t (save-excursion (let ((answer nil)) - (while (and criteria (null answer)) - (if (eq (car criteria) t) - (setq answer t) - (setq answer (funcall (car criteria)))) - (setq criteria (cdr criteria))) - (if (and answer (not (eq answer 'stop))) - t - nil))))) + (while (and criteria (null answer)) + (if (eq (car criteria) t) + (setq answer t) + (setq answer (funcall (car criteria)))) + (setq criteria (cdr criteria))) + (if (and answer (not (eq answer 'stop))) + t + nil))))) (defun erlang-in-literal (&optional lim) @@ -4179,11 +4187,11 @@ Should the point be inside none of the above mentioned types of context, nil is returned." (save-excursion (let* ((lim (or lim (save-excursion - (erlang-beginning-of-clause) - (point)))) - (state (if (fboundp 'syntax-ppss) ; post Emacs 21.3 - (funcall (symbol-function 'syntax-ppss)) - (parse-partial-sexp lim (point))))) + (erlang-beginning-of-clause) + (point)))) + (state (if (fboundp 'syntax-ppss) ; post Emacs 21.3 + (funcall (symbol-function 'syntax-ppss)) + (parse-partial-sexp lim (point))))) (cond ((eq (nth 3 state) ?') 'atom) ((nth 3 state) 'string) @@ -4197,7 +4205,7 @@ context, nil is returned." This function is designed to be a member of a criteria list." (eq (save-excursion (erlang-skip-blank) (point)) (save-excursion - (erlang-beginning-of-function -1) (point)))) + (erlang-beginning-of-function -1) (point)))) (defun erlang-at-end-of-clause-p () @@ -4206,7 +4214,7 @@ This function is designed to be a member of a criteria list." This function is designed to be a member of a criteria list." (eq (save-excursion (erlang-skip-blank) (point)) (save-excursion - (erlang-beginning-of-clause -1) (point)))) + (erlang-beginning-of-clause -1) (point)))) (defun erlang-stop-when-inside-argument-list () @@ -4218,22 +4226,22 @@ after `||', `stop' is not returned. This function is designed to be a member of a criteria list." (save-excursion (condition-case nil - (let ((orig-point (point)) - (state nil)) - (up-list -1) - (if (not (eq (following-char) ?\[)) - 'stop - ;; Do not return `stop' when inside a list comprehension - ;; construction. (The point must be after `||'). - (while (< (point) orig-point) + (let ((orig-point (point)) + (state nil)) + (up-list -1) + (if (not (eq (following-char) ?\[)) + 'stop + ;; Do not return `stop' when inside a list comprehension + ;; construction. (The point must be after `||'). + (while (< (point) orig-point) (let ((pt (point))) (setq state (erlang-partial-parse pt orig-point state)) (if (= pt (point)) (error "Illegal syntax")))) - (if (and (car state) (eq (car (car (car state))) '||)) - nil - 'stop))) - (error + (if (and (car state) (eq (car (car (car state))) '||)) + nil + 'stop))) + (error nil)))) @@ -4244,11 +4252,11 @@ This function is designed to be a member of a criteria list." (save-excursion (beginning-of-line) (if (and (looking-at (eval-when-compile - (concat "^" erlang-atom-regexp "\\s *("))) - (not (looking-at - (eval-when-compile - (concat "^" erlang-atom-regexp ".*->"))))) - 'stop + (concat "^" erlang-atom-regexp "\\s *("))) + (not (looking-at + (eval-when-compile + (concat "^" erlang-atom-regexp ".*->"))))) + 'stop nil))) @@ -4273,13 +4281,13 @@ A line containing only spaces and tabs is considered empty. This function is designed to be a member of a criteria list." (and erlang-next-lines-empty-threshold (save-excursion - (let ((left erlang-next-lines-empty-threshold) - (cont t)) - (while (and cont (> left 0)) - (forward-line 1) - (setq cont (looking-at "\\s *$")) - (setq left (- left 1))) - cont)))) + (let ((left erlang-next-lines-empty-threshold) + (cont t)) + (while (and cont (> left 0)) + (forward-line 1) + (setq cont (looking-at "\\s *$")) + (setq left (- left 1))) + cont)))) (defun erlang-at-keyword-end-p () @@ -4298,9 +4306,9 @@ This function is designed to be a member of a criteria list." (eval-when-compile (if (or (featurep 'bytecomp) - (featurep 'byte-compile)) + (featurep 'byte-compile)) (progn - (require 'etags)))) + (require 'etags)))) ;; Variables: @@ -4351,11 +4359,11 @@ is not implemented under XEmacs. (Hint: The Emacs 19 etags module works under XEmacs.)" (interactive) (cond ((= erlang-emacs-major-version 18) - (require 'tags) - (erlang-tags-define-keys (current-local-map)) - (setq erlang-tags-installed t)) - (t - (require 'etags) + (require 'tags) + (erlang-tags-define-keys (current-local-map)) + (setq erlang-tags-installed t)) + (t + (require 'etags) (set (make-local-variable 'find-tag-default-function) 'erlang-find-tag-for-completion) (if (>= emacs-major-version 25) @@ -4380,11 +4388,11 @@ works under XEmacs.)" (let ((alist erlang-tags-function-alist)) (while alist (let* ((old (car (car alist))) - (new (cdr (car alist))) - (keys (append (where-is-internal old global-map)))) - (while keys - (define-key map (car keys) new) - (setq keys (cdr keys)))) + (new (cdr (car alist))) + (keys (append (where-is-internal old global-map)))) + (while keys + (define-key map (car keys) new) + (setq keys (cdr keys)))) (setq alist (cdr alist)))) ;; Update the menu. (erlang-menu-substitute erlang-menu-base-items erlang-tags-function-alist) @@ -4397,11 +4405,11 @@ Search `-import' list of imported functions. Single quotes are been stripped away." (let ((mod-func (erlang-get-function-under-point))) (cond ((null mod-func) - nil) - ((null (car mod-func)) - (nth 1 mod-func)) - (t - (concat (car mod-func) ":" (nth 1 mod-func)))))) + nil) + ((null (car mod-func)) + (nth 1 mod-func)) + (t + (concat (car mod-func) ":" (nth 1 mod-func)))))) ;; Return `t' since it is used inside `tags-loop-form'. @@ -4420,31 +4428,31 @@ Tags can be given on the forms `tag', `module:', `module:tag'." (defun erlang-find-tag-other-window (tagname &optional next-p regexp-p) "Like `find-tag-other-window' but aware of Erlang modules." (interactive (erlang-tag-interactive - "Find `module:tag' or `tag' other window: ")) + "Find `module:tag' or `tag' other window: ")) ;; This is to deal with the case where the tag is found in the ;; selected window's buffer; without this, point is moved in both ;; windows. To prevent this, we save the selected window's point ;; before doing find-tag-noselect, and restore it afterwards. (let* ((window-point (window-point (selected-window))) - (tagbuf (erlang-find-tag-noselect tagname next-p regexp-p)) - (tagpoint (progn (set-buffer tagbuf) (point)))) + (tagbuf (erlang-find-tag-noselect tagname next-p regexp-p)) + (tagpoint (progn (set-buffer tagbuf) (point)))) (set-window-point (prog1 - (selected-window) - (switch-to-buffer-other-window tagbuf) - ;; We have to set this new window's point; it - ;; might already have been displaying a - ;; different portion of tagbuf, in which case - ;; switch-to-buffer-other-window doesn't set - ;; the window's point from the buffer. - (set-window-point (selected-window) tagpoint)) - window-point))) + (selected-window) + (switch-to-buffer-other-window tagbuf) + ;; We have to set this new window's point; it + ;; might already have been displaying a + ;; different portion of tagbuf, in which case + ;; switch-to-buffer-other-window doesn't set + ;; the window's point from the buffer. + (set-window-point (selected-window) tagpoint)) + window-point))) (defun erlang-find-tag-other-frame (tagname &optional next-p) "Like `find-tag-other-frame' but aware of Erlang modules." (interactive (erlang-tag-interactive - "Find `module:tag' or `tag' other frame: ")) + "Find `module:tag' or `tag' other frame: ")) (let ((pop-up-frames t)) (erlang-find-tag-other-window tagname next-p))) @@ -4452,13 +4460,13 @@ Tags can be given on the forms `tag', `module:', `module:tag'." (defun erlang-find-tag-regexp (regexp &optional next-p other-window) "Like `find-tag-regexp' but aware of Erlang modules." (interactive (if (fboundp 'find-tag-regexp) - (erlang-tag-interactive - "Find `module:regexp' or `regexp': ") - (error "This version of Emacs can't find tags by regexps"))) + (erlang-tag-interactive + "Find `module:regexp' or `regexp': ") + (error "This version of Emacs can't find tags by regexps"))) (funcall (if other-window - 'erlang-find-tag-other-window - 'erlang-find-tag) - regexp next-p t)) + 'erlang-find-tag-other-window + 'erlang-find-tag) + regexp next-p t)) ;; Just like C-u M-. This could be added to the menu. @@ -4467,7 +4475,7 @@ Tags can be given on the forms `tag', `module:', `module:tag'." (interactive) (let ((current-prefix-arg '(4))) (if erlang-tags-installed - (call-interactively 'erlang-find-tag) + (call-interactively 'erlang-find-tag) (call-interactively 'find-tag)))) @@ -4479,9 +4487,9 @@ Tags can be given on the forms `tag', `module:', `module:tag'." ;; without extension and directory matches the module. ;; ;; * `module:tag' -;; Emacs 19: Replace test functions with functions aware of -;; Erlang modules. Tricky because the etags system wasn't -;; built for these kind of operations... +;; Emacs 19: Replace test functions with functions aware of +;; Erlang modules. Tricky because the etags system wasn't +;; built for these kind of operations... ;; ;; Emacs 18: We loop over `find-tag' until we find a file ;; whose module matches the requested module. The @@ -4500,78 +4508,78 @@ Tags can be given on the forms `tag', `module:', `module:tag'." ;; know where to restart a tags command. (if (boundp 'tags-loop-form) (funcall (symbol-function 'set) - 'tags-loop-form '(erlang-find-tag nil t))) + 'tags-loop-form '(erlang-find-tag nil t))) (save-window-excursion (cond ((string-match ":$" modtagname) ;; Only the module name was given. Read all files whose file name ;; match. (let ((modname (substring modtagname 0 (match-beginning 0))) - (file nil)) - (if (not next-p) - (save-excursion - (visit-tags-table-buffer) - (setq erlang-tags-file-list - (funcall (symbol-function 'tags-table-files))))) - (while (null file) - (or erlang-tags-file-list - (save-excursion - (if (and (featurep 'etags) - (funcall - (symbol-function 'visit-tags-table-buffer) 'same) - (funcall - (symbol-function 'visit-tags-table-buffer) t)) - (setq erlang-tags-file-list - (funcall (symbol-function 'tags-table-files))) - (error "No %stags containing %s" (if next-p "more " "") - modtagname)))) - (if erlang-tags-file-list - (let ((this-module (erlang-get-module-from-file-name - (car erlang-tags-file-list)))) - (if (and (stringp this-module) - (string= modname this-module)) - (setq file (car erlang-tags-file-list))) - (setq erlang-tags-file-list (cdr erlang-tags-file-list))))) - (set-buffer (or (get-file-buffer file) - (find-file-noselect file))))) + (file nil)) + (if (not next-p) + (save-excursion + (visit-tags-table-buffer) + (setq erlang-tags-file-list + (funcall (symbol-function 'tags-table-files))))) + (while (null file) + (or erlang-tags-file-list + (save-excursion + (if (and (featurep 'etags) + (funcall + (symbol-function 'visit-tags-table-buffer) 'same) + (funcall + (symbol-function 'visit-tags-table-buffer) t)) + (setq erlang-tags-file-list + (funcall (symbol-function 'tags-table-files))) + (error "No %stags containing %s" (if next-p "more " "") + modtagname)))) + (if erlang-tags-file-list + (let ((this-module (erlang-get-module-from-file-name + (car erlang-tags-file-list)))) + (if (and (stringp this-module) + (string= modname this-module)) + (setq file (car erlang-tags-file-list))) + (setq erlang-tags-file-list (cdr erlang-tags-file-list))))) + (set-buffer (or (get-file-buffer file) + (find-file-noselect file))))) ((string-match ":" modtagname) (if (boundp 'find-tag-tag-order) - ;; Method one: Add module-recognising functions to the - ;; list of order functions. However, the tags system - ;; from Emacs 18, and derives thereof (read: XEmacs) - ;; hasn't got this feature. - (progn - (erlang-tags-install-module-check) - (unwind-protect - (funcall (symbol-function 'find-tag) - modtagname next-p regexp-p) - (erlang-tags-remove-module-check))) - ;; Method two: Call the tags system until a file matching - ;; the module is found. This could result in that many - ;; files are read. (e.g. The tag "foo:file" will take a - ;; while to process.) - (let* ((modname (substring modtagname 0 (match-beginning 0))) - (tagname (substring modtagname (match-end 0) nil)) - (last-tag tagname) - file) - (while - (progn - (funcall (symbol-function 'find-tag) tagname next-p regexp-p) - (setq next-p t) - ;; Determine the module form the file name. (The - ;; alternative, to check `-module', would make this - ;; code useless for non-Erlang programs.) - (setq file (erlang-get-module-from-file-name buffer-file-name)) - (not (and (stringp file) - (string= modname file)))))))) + ;; Method one: Add module-recognising functions to the + ;; list of order functions. However, the tags system + ;; from Emacs 18, and derives thereof (read: XEmacs) + ;; hasn't got this feature. + (progn + (erlang-tags-install-module-check) + (unwind-protect + (funcall (symbol-function 'find-tag) + modtagname next-p regexp-p) + (erlang-tags-remove-module-check))) + ;; Method two: Call the tags system until a file matching + ;; the module is found. This could result in that many + ;; files are read. (e.g. The tag "foo:file" will take a + ;; while to process.) + (let* ((modname (substring modtagname 0 (match-beginning 0))) + (tagname (substring modtagname (match-end 0) nil)) + (last-tag tagname) + file) + (while + (progn + (funcall (symbol-function 'find-tag) tagname next-p regexp-p) + (setq next-p t) + ;; Determine the module form the file name. (The + ;; alternative, to check `-module', would make this + ;; code useless for non-Erlang programs.) + (setq file (erlang-get-module-from-file-name buffer-file-name)) + (not (and (stringp file) + (string= modname file)))))))) (t (funcall (symbol-function 'find-tag) modtagname next-p regexp-p))) - (current-buffer))) ; Return the new buffer. + (current-buffer))) ; Return the new buffer. + - @@ -4588,18 +4596,18 @@ Tags can be given on the forms `tag', `module:', `module:tag'." (require 'tags))) (if current-prefix-arg (list nil (if (< (prefix-numeric-value current-prefix-arg) 0) - '- - t)) + '- + t)) (let* ((default (erlang-find-tag-default)) - (prompt (if default - (format "%s(default %s) " prompt default) - prompt)) - (spec (if (featurep 'etags) - (completing-read prompt 'erlang-tags-complete-tag) - (read-string prompt)))) + (prompt (if default + (format "%s(default %s) " prompt default) + prompt)) + (spec (if (featurep 'etags) + (completing-read prompt 'erlang-tags-complete-tag) + (read-string prompt)))) (list (if (equal spec "") - (or default (error "There is no default tag")) - spec))))) + (or default (error "There is no default tag")) + spec))))) ;; Search tag functions which are aware of Erlang modules. The tactic @@ -4626,21 +4634,21 @@ Tags can be given on the forms `tag', `module:', `module:tag'." (setq erlang-tags-orig-format-hooks (symbol-value 'tags-table-format-hooks)) (funcall (symbol-function 'set) 'tags-table-format-hooks - (cons 'erlang-tags-recognize-tags-table - erlang-tags-orig-format-hooks)) + (cons 'erlang-tags-recognize-tags-table + erlang-tags-orig-format-hooks)) (setq erlang-tags-buffer-list '()) - )) - + )) + ;; Install our functions in the TAGS files already resident. (save-excursion (let ((files (symbol-value 'tags-table-computed-list))) (while files - (if (stringp (car files)) - (if (get-file-buffer (car files)) - (progn - (set-buffer (get-file-buffer (car files))) - (erlang-tags-install-local)))) - (setq files (cdr files)))))) + (if (stringp (car files)) + (if (get-file-buffer (car files)) + (progn + (set-buffer (get-file-buffer (car files))) + (erlang-tags-install-local)))) + (setq files (cdr files)))))) (defun erlang-tags-install-local () @@ -4650,23 +4658,23 @@ Tags can be given on the forms `tag', `module:', `module:tag'." ;; Mark this buffer as "installed" and record. (set (make-local-variable 'erlang-tags-buffer-installed-p) t) (setq erlang-tags-buffer-list - (cons (current-buffer) erlang-tags-buffer-list)) + (cons (current-buffer) erlang-tags-buffer-list)) ;; Save the original values. (set (make-local-variable 'erlang-tags-orig-tag-order) - (symbol-value 'find-tag-tag-order)) + (symbol-value 'find-tag-tag-order)) (set (make-local-variable 'erlang-tags-orig-regexp-tag-order) - (symbol-value 'find-tag-regexp-tag-order)) + (symbol-value 'find-tag-regexp-tag-order)) (set (make-local-variable 'erlang-tags-orig-search-function) - (symbol-value 'find-tag-search-function)) + (symbol-value 'find-tag-search-function)) (set (make-local-variable 'erlang-tags-orig-regexp-search-function) - (symbol-value 'find-tag-regexp-search-function)) + (symbol-value 'find-tag-regexp-search-function)) ;; Install our own functions. (set (make-local-variable 'find-tag-search-function) - 'erlang-tags-search-forward) + 'erlang-tags-search-forward) (set (make-local-variable 'find-tag-regexp-search-function) - 'erlang-tags-regexp-search-forward) + 'erlang-tags-regexp-search-forward) (set (make-local-variable 'find-tag-tag-order) (mapcar #'erlang-make-order-function-aware-of-modules erlang-tags-orig-tag-order)) @@ -4694,13 +4702,13 @@ Tags can be given on the forms `tag', `module:', `module:tag'." (cond ((>= erlang-emacs-major-version 20) (funcall (symbol-function 'set) - 'tags-table-format-functions - erlang-tags-orig-format-functions) + 'tags-table-format-functions + erlang-tags-orig-format-functions) ) - (t + (t (funcall (symbol-function 'set) - 'tags-table-format-hooks - erlang-tags-orig-format-hooks) + 'tags-table-format-hooks + erlang-tags-orig-format-hooks) )) ;; Remove our functions from the TAGS files. (Note that @@ -4709,11 +4717,11 @@ Tags can be given on the forms `tag', `module:', `module:tag'." (save-excursion (let ((buffers erlang-tags-buffer-list)) (while buffers - (if (buffer-name (car buffers)) - (progn - (set-buffer (car buffers)) - (erlang-tags-remove-local))) - (setq buffers (cdr buffers)))))) + (if (buffer-name (car buffers)) + (progn + (set-buffer (car buffers)) + (erlang-tags-remove-local))) + (setq buffers (cdr buffers)))))) (defun erlang-tags-remove-local () @@ -4722,14 +4730,14 @@ Tags can be given on the forms `tag', `module:', `module:tag'." () (funcall (symbol-function 'set) 'erlang-tags-buffer-installed-p nil) (funcall (symbol-function 'set) - 'find-tag-tag-order erlang-tags-orig-tag-order) + 'find-tag-tag-order erlang-tags-orig-tag-order) (funcall (symbol-function 'set) - 'find-tag-regexp-tag-order erlang-tags-orig-regexp-tag-order) + 'find-tag-regexp-tag-order erlang-tags-orig-regexp-tag-order) (funcall (symbol-function 'set) - 'find-tag-search-function erlang-tags-orig-search-function) + 'find-tag-search-function erlang-tags-orig-search-function) (funcall (symbol-function 'set) - 'find-tag-regexp-search-function - erlang-tags-orig-regexp-search-function))) + 'find-tag-regexp-search-function + erlang-tags-orig-regexp-search-function))) (defun erlang-tags-recognize-tags-table () @@ -4758,10 +4766,10 @@ for a tag on the form `module:tag'." (if (string-match ":" tag) (setq tag (substring tag (match-end 0) nil))) (if (eq erlang-tags-orig-regexp-search-function - 'erlang-tags-regexp-search-forward) + 'erlang-tags-regexp-search-forward) (re-search-forward tag bound noerror count) (funcall erlang-tags-orig-regexp-search-function - tag bound noerror count))) + tag bound noerror count))) ;;; Tags completion, Emacs 19 `etags' specific. ;;; @@ -4807,18 +4815,18 @@ about Erlang modules." ((and erlang-tags-installed (fboundp 'complete-tag) (fboundp 'tags-complete-tag)) ; Emacs 19-22 - (let ((orig-tags-complete-tag (symbol-function 'tags-complete-tag))) - (fset 'tags-complete-tag - (symbol-function 'erlang-tags-complete-tag)) - (unwind-protect + (let ((orig-tags-complete-tag (symbol-function 'tags-complete-tag))) + (fset 'tags-complete-tag + (symbol-function 'erlang-tags-complete-tag)) + (unwind-protect (complete-tag) - (fset 'tags-complete-tag orig-tags-complete-tag)))) - ((fboundp 'complete-tag) ; Emacs 19 + (fset 'tags-complete-tag orig-tags-complete-tag)))) + ((fboundp 'complete-tag) ; Emacs 19 (complete-tag)) - ((fboundp 'tag-complete-symbol) ; XEmacs - (funcall (symbol-function 'tag-complete-symbol))) - (t - (error "This version of Emacs can't complete tags")))) + ((fboundp 'tag-complete-symbol) ; XEmacs + (funcall (symbol-function 'tag-complete-symbol))) + (t + (error "This version of Emacs can't complete tags")))) (defun erlang-find-tag-for-completion () @@ -4842,9 +4850,9 @@ about Erlang modules." ;; If we need to ask for the tag table, allow that. (let ((enable-recursive-minibuffers t)) (visit-tags-table-buffer)) - (if (eq what t) - (all-completions string (erlang-tags-completion-table) predicate) - (try-completion string (erlang-tags-completion-table) predicate))))) + (if (eq what t) + (all-completions string (erlang-tags-completion-table) predicate) + (try-completion string (erlang-tags-completion-table) predicate))))) ;; `tags-completion-table' calls itself recursively, make it @@ -4854,22 +4862,22 @@ about Erlang modules." (defun erlang-tags-completion-table () "Build completion table. Tags on the form `tag' or `module:tag'." (setq erlang-tags-orig-completion-table - (symbol-function 'tags-completion-table)) + (symbol-function 'tags-completion-table)) (fset 'tags-completion-table - (symbol-function 'erlang-tags-completion-table-1)) + (symbol-function 'erlang-tags-completion-table-1)) (unwind-protect (erlang-tags-completion-table-1) (fset 'tags-completion-table - erlang-tags-orig-completion-table))) + erlang-tags-orig-completion-table))) (defun erlang-tags-completion-table-1 () (make-local-variable 'erlang-tags-completion-table) (or erlang-tags-completion-table (let ((tags-completion-table nil) - (tags-completion-table-function - 'erlang-etags-tags-completion-table)) - (funcall erlang-tags-orig-completion-table) - (setq erlang-tags-completion-table tags-completion-table)))) + (tags-completion-table-function + 'erlang-etags-tags-completion-table)) + (funcall erlang-tags-orig-completion-table) + (setq erlang-tags-completion-table tags-completion-table)))) @@ -4970,7 +4978,7 @@ about Erlang modules." (cl-defmethod xref-backend-identifier-completion-table ((_backend (eql erlang-etags))) (let ((erlang-replace-etags-tags-completion-table t)) - (tags-completion-table)))))) + (tags-completion-table)))))) @@ -5212,28 +5220,28 @@ The following special commands are available: ;; Some older versions of comint don't have an input ring. (if (fboundp 'comint-read-input-ring) (progn - (setq comint-input-ring-file-name erlang-input-ring-file-name) - (comint-read-input-ring t) - (make-local-variable 'kill-buffer-hook) - (add-hook 'kill-buffer-hook 'comint-write-input-ring))) + (setq comint-input-ring-file-name erlang-input-ring-file-name) + (comint-read-input-ring t) + (make-local-variable 'kill-buffer-hook) + (add-hook 'kill-buffer-hook 'comint-write-input-ring))) ;; At least in Emacs 21, we need to be in `compilation-minor-mode' ;; for `next-error' to work. We can avoid it clobbering the shell ;; keys thus. (when inferior-erlang-use-cmm (compilation-minor-mode 1) (set (make-local-variable 'minor-mode-overriding-map-alist) - `((compilation-minor-mode - . ,(let ((map (make-sparse-keymap))) - ;; It would be useful to put keymap properties on the - ;; error lines so that we could use RET and mouse-2 - ;; on them directly. - (when (boundp 'compilation-skip-threshold) ; new compile.el - (define-key map [mouse-2] #'erlang-mouse-2-command) - (define-key map "\C-m" #'erlang-RET-command)) - (if (boundp 'compilation-menu-map) - (define-key map [menu-bar compilation] - (cons "Errors" compilation-menu-map))) - map))))) + `((compilation-minor-mode + . ,(let ((map (make-sparse-keymap))) + ;; It would be useful to put keymap properties on the + ;; error lines so that we could use RET and mouse-2 + ;; on them directly. + (when (boundp 'compilation-skip-threshold) ; new compile.el + (define-key map [mouse-2] #'erlang-mouse-2-command) + (define-key map "\C-m" #'erlang-RET-command)) + (if (boundp 'compilation-menu-map) + (define-key map [menu-bar compilation] + (cons "Errors" compilation-menu-map))) + map))))) (erlang-tags-init) (run-hooks 'erlang-shell-mode-hook)) @@ -5243,9 +5251,9 @@ The following special commands are available: Selects Comint or Compilation mode command as appropriate." (interactive "e") (if (save-window-excursion - (save-excursion - (mouse-set-point event) - (consp (get-text-property (line-beginning-position) 'message)))) + (save-excursion + (mouse-set-point event) + (consp (get-text-property (line-beginning-position) 'message)))) (call-interactively (lookup-key compilation-mode-map [mouse-2])) (call-interactively (lookup-key comint-mode-map [mouse-2])))) @@ -5261,7 +5269,7 @@ Selects Comint or Compilation mode command as appropriate." (define-key map "\M-\t" 'erlang-complete-tag) (define-key map "\C-a" 'comint-bol) ; Normally the other way around. (define-key map "\C-c\C-a" 'beginning-of-line) - (define-key map "\C-d" nil) ; Was `comint-delchar-or-maybe-eof' + (define-key map "\C-d" nil) ; Was `comint-delchar-or-maybe-eof' (define-key map "\M-\C-m" 'compile-goto-error) (unless inferior-erlang-use-cmm (define-key map "\C-x`" 'erlang-next-error))) @@ -5335,8 +5343,8 @@ editing control characters: (when current-prefix-arg (list (if (fboundp 'read-shell-command) ;; `read-shell-command' is a new function in Emacs 23. - (read-shell-command "Erlang command: ") - (read-string "Erlang command: "))))) + (read-shell-command "Erlang command: ") + (read-string "Erlang command: "))))) (require 'comint) (let (cmd opts) (if command @@ -5363,16 +5371,16 @@ editing control characters: (setq list-buffers-directory fake-file-name)))) (setq inferior-erlang-process - (get-buffer-process inferior-erlang-buffer)) - (if (> 21 erlang-emacs-major-version) ; funcalls to avoid compiler warnings - (funcall (symbol-function 'set-process-query-on-exit-flag) - inferior-erlang-process nil) + (get-buffer-process inferior-erlang-buffer)) + (if (> 21 erlang-emacs-major-version) ; funcalls to avoid compiler warnings + (funcall (symbol-function 'set-process-query-on-exit-flag) + inferior-erlang-process nil) (funcall (symbol-function 'process-kill-without-query) inferior-erlang-process)) (if erlang-inferior-shell-split-window (switch-to-buffer-other-window inferior-erlang-buffer) - (switch-to-buffer inferior-erlang-buffer)) + (switch-to-buffer inferior-erlang-buffer)) (if (and (not (eq system-type 'windows-nt)) - (eq inferior-erlang-shell-type 'newshell)) + (eq inferior-erlang-shell-type 'newshell)) (setq comint-process-echoes t)) (erlang-shell-mode)) @@ -5404,22 +5412,22 @@ frame will become deselected before the next command." (or (inferior-erlang-running-p) (error "No inferior Erlang process is running")) (let ((win (inferior-erlang-window - inferior-erlang-display-buffer-any-frame)) - (frames-p (fboundp 'selected-frame))) + inferior-erlang-display-buffer-any-frame)) + (frames-p (fboundp 'selected-frame))) (if (null win) - (let ((old-win (selected-window))) - (save-excursion - (switch-to-buffer-other-window inferior-erlang-buffer) - (setq win (selected-window))) - (select-window old-win)) + (let ((old-win (selected-window))) + (save-excursion + (switch-to-buffer-other-window inferior-erlang-buffer) + (setq win (selected-window))) + (select-window old-win)) (if (and window-system - frames-p - (or select - (eq inferior-erlang-display-buffer-any-frame 'raise)) - (not (eq (selected-frame) (window-frame win)))) - (raise-frame (window-frame win)))) + frames-p + (or select + (eq inferior-erlang-display-buffer-any-frame 'raise)) + (not (eq (selected-frame) (window-frame win)))) + (raise-frame (window-frame win)))) (if select - (select-window win)) + (select-window win)) (sit-for 0) win)) @@ -5436,8 +5444,8 @@ frame will become deselected before the next command." "Return the window containing the inferior Erlang, or nil." (and (inferior-erlang-running-p) (if (and all-frames (>= erlang-emacs-major-version 19)) - (get-buffer-window inferior-erlang-buffer t) - (get-buffer-window inferior-erlang-buffer)))) + (get-buffer-window inferior-erlang-buffer t) + (get-buffer-window inferior-erlang-buffer)))) (defun inferior-erlang-wait-prompt () @@ -5445,21 +5453,21 @@ frame will become deselected before the next command." (if (eq inferior-erlang-prompt-timeout t) () (or (inferior-erlang-running-p) - (error "No inferior Erlang shell is running")) + (error "No inferior Erlang shell is running")) (with-current-buffer inferior-erlang-buffer (let ((msg nil)) - (while (save-excursion - (goto-char (process-mark inferior-erlang-process)) - (forward-line 0) - (not (looking-at comint-prompt-regexp))) - (if msg - () - (setq msg t) - (message "Waiting for Erlang shell prompt (press C-g to abort).")) - (or (accept-process-output inferior-erlang-process - inferior-erlang-prompt-timeout) - (error "No Erlang shell prompt before timeout"))) - (if msg (message "")))))) + (while (save-excursion + (goto-char (process-mark inferior-erlang-process)) + (forward-line 0) + (not (looking-at comint-prompt-regexp))) + (if msg + () + (setq msg t) + (message "Waiting for Erlang shell prompt (press C-g to abort).")) + (or (accept-process-output inferior-erlang-process + inferior-erlang-prompt-timeout) + (error "No Erlang shell prompt before timeout"))) + (if msg (message "")))))) (defun inferior-erlang-send-empty-cmd-unless-already-at-prompt () "If not already at a prompt, try to send an empty cmd to get a prompt. @@ -5468,12 +5476,12 @@ situations, for instance if a crash or error report from sasl has been printed after the last prompt." (with-current-buffer inferior-erlang-buffer (if (> (point-max) 1) - ;; make sure we get a prompt if buffer contains data - (if (save-excursion - (goto-char (process-mark inferior-erlang-process)) - (forward-line 0) - (not (looking-at comint-prompt-regexp))) - (inferior-erlang-send-command ""))))) + ;; make sure we get a prompt if buffer contains data + (if (save-excursion + (goto-char (process-mark inferior-erlang-process)) + (forward-line 0) + (not (looking-at comint-prompt-regexp))) + (inferior-erlang-send-command ""))))) (autoload 'comint-send-input "comint") @@ -5490,10 +5498,10 @@ Return the position after the newly inserted command." (or (inferior-erlang-running-p) (error "No inferior Erlang process is running")) (let ((old-buffer (current-buffer)) - (insert-point (marker-position (process-mark inferior-erlang-process))) - (insert-length (if comint-process-echoes - 0 - (1+ (length cmd))))) + (insert-point (marker-position (process-mark inferior-erlang-process))) + (insert-length (if comint-process-echoes + 0 + (1+ (length cmd))))) (set-buffer inferior-erlang-buffer) (goto-char insert-point) (insert cmd) @@ -5506,21 +5514,21 @@ Return the position after the newly inserted command." ;; This was previously cautioned against in the Lisp manual. It ;; has been sorted out in Emacs 21. -- fx (let ((comint-eol-on-send nil) - (comint-input-filter (if hist comint-input-filter 'ignore))) + (comint-input-filter (if hist comint-input-filter 'ignore))) (if (and (not erlang-xemacs-p) - (>= emacs-major-version 22)) - (comint-send-input nil t) - (comint-send-input))) + (>= emacs-major-version 22)) + (comint-send-input nil t) + (comint-send-input))) ;; Adjust all windows whose points are incorrect. (if (null comint-process-echoes) - (walk-windows - (function - (lambda (window) - (if (and (eq (window-buffer window) inferior-erlang-buffer) - (= (window-point window) insert-point)) - (set-window-point window - (+ insert-point insert-length))))) - nil t)) + (walk-windows + (function + (lambda (window) + (if (and (eq (window-buffer window) inferior-erlang-buffer) + (= (window-point window) insert-point)) + (set-window-point window + (+ insert-point insert-length))))) + nil t)) (set-buffer old-buffer) (+ insert-point insert-length))) @@ -5529,17 +5537,17 @@ Return the position after the newly inserted command." "Remove `^H' (delete) and the characters it was supposed to remove." (interactive) (if (and (boundp 'comint-last-input-end) - (boundp 'comint-last-output-start)) + (boundp 'comint-last-output-start)) (save-excursion - (goto-char - (if (erlang-interactive-p) - (symbol-value 'comint-last-input-end) - (symbol-value 'comint-last-output-start))) - (while (progn (skip-chars-forward "^\C-h") - (not (eq (point) (point-max)))) - (delete-char 1) - (or (bolp) - (backward-delete-char 1)))))) + (goto-char + (if (erlang-interactive-p) + (symbol-value 'comint-last-input-end) + (symbol-value 'comint-last-output-start))) + (while (progn (skip-chars-forward "^\C-h") + (not (eq (point) (point-max)))) + (delete-char 1) + (or (bolp) + (backward-delete-char 1)))))) ;; Basically `comint-strip-ctrl-m', with a few extra checks. @@ -5547,15 +5555,15 @@ Return the position after the newly inserted command." "Strip trailing `^M' characters from the current output group." (interactive) (if (and (boundp 'comint-last-input-end) - (boundp 'comint-last-output-start)) + (boundp 'comint-last-output-start)) (let ((pmark (process-mark (get-buffer-process (current-buffer))))) - (save-excursion - (goto-char - (if (erlang-interactive-p) - (symbol-value 'comint-last-input-end) - (symbol-value 'comint-last-output-start))) - (while (re-search-forward "\r+$" pmark t) - (replace-match "" t t)))))) + (save-excursion + (goto-char + (if (erlang-interactive-p) + (symbol-value 'comint-last-input-end) + (symbol-value 'comint-last-output-start))) + (while (re-search-forward "\r+$" pmark t) + (replace-match "" t t)))))) (defun inferior-erlang-compile (arg) @@ -5578,18 +5586,18 @@ There exists two workarounds for this bug: (save-some-buffers) (inferior-erlang-prepare-for-input) (let* ((dir (inferior-erlang-compile-outdir)) - (noext (substring (erlang-local-buffer-file-name) 0 -4)) - (opts (append (list (cons 'outdir dir)) - (if current-prefix-arg - (list 'debug_info 'export_all)) - erlang-compile-extra-opts)) - end) + (noext (substring (erlang-local-buffer-file-name) 0 -4)) + (opts (append (list (cons 'outdir dir)) + (if current-prefix-arg + (list 'debug_info 'export_all)) + erlang-compile-extra-opts)) + end) (with-current-buffer inferior-erlang-buffer (when (fboundp 'compilation-forget-errors) (compilation-forget-errors))) (setq end (inferior-erlang-send-command - (inferior-erlang-compute-compile-command noext opts) - nil)) + (inferior-erlang-compute-compile-command noext opts) + nil)) (sit-for 0) (inferior-erlang-wait-prompt) (with-current-buffer inferior-erlang-buffer @@ -5603,7 +5611,7 @@ The buffer is displayed, according to `inferior-erlang-display-buffer' unless the optional NO-DISPLAY is non-nil." (or (inferior-erlang-running-p) (save-excursion - (inferior-erlang))) + (inferior-erlang))) (or (inferior-erlang-running-p) (error "Error starting inferior Erlang shell")) (if (not no-display) @@ -5615,96 +5623,96 @@ unless the optional NO-DISPLAY is non-nil." (defun inferior-erlang-compile-outdir () "Return the directory to compile the current buffer into." (let* ((buffer-dir (directory-file-name - (file-name-directory (erlang-local-buffer-file-name)))) - (parent-dir (directory-file-name - (file-name-directory buffer-dir))) + (file-name-directory (erlang-local-buffer-file-name)))) + (parent-dir (directory-file-name + (file-name-directory buffer-dir))) (ebin-dir (concat (file-name-as-directory parent-dir) "ebin")) - (buffer-dir-base-name (file-name-nondirectory - (expand-file-name - (concat (file-name-as-directory buffer-dir) - "."))))) + (buffer-dir-base-name (file-name-nondirectory + (expand-file-name + (concat (file-name-as-directory buffer-dir) + "."))))) (if (and (string= buffer-dir-base-name "src") - (file-directory-p ebin-dir)) - (file-name-as-directory ebin-dir) + (file-directory-p ebin-dir)) + (file-name-as-directory ebin-dir) (file-name-as-directory buffer-dir)))) (defun inferior-erlang-compute-compile-command (module-name opts) (let ((ccfn erlang-compile-command-function-alist) - (res (inferior-erlang-compute-erl-compile-command module-name opts)) - ccfn-entry - done + (res (inferior-erlang-compute-erl-compile-command module-name opts)) + ccfn-entry + done result) (if (not (null (erlang-local-buffer-file-name))) - (while (and (not done) (not (null ccfn))) - (setq ccfn-entry (car ccfn)) - (setq ccfn (cdr ccfn)) - (if (string-match (car ccfn-entry) (erlang-local-buffer-file-name)) - (let ((c-fn (cdr ccfn-entry))) - (setq done t) - (if (not (null c-fn)) - (setq result (funcall c-fn module-name opts))))))) + (while (and (not done) (not (null ccfn))) + (setq ccfn-entry (car ccfn)) + (setq ccfn (cdr ccfn)) + (if (string-match (car ccfn-entry) (erlang-local-buffer-file-name)) + (let ((c-fn (cdr ccfn-entry))) + (setq done t) + (if (not (null c-fn)) + (setq result (funcall c-fn module-name opts))))))) result)) (defun inferior-erlang-compute-erl-compile-command (module-name opts) (let* ((out-dir-opt (assoc 'outdir opts)) - (out-dir (cdr out-dir-opt))) + (out-dir (cdr out-dir-opt))) (if erlang-compile-use-outdir - (format "%s(\"%s\"%s)." - erlang-compile-erlang-function - module-name - (inferior-erlang-format-comma-opts opts)) + (format "%s(\"%s\"%s)." + erlang-compile-erlang-function + module-name + (inferior-erlang-format-comma-opts opts)) (let (;; Hopefully, noone else will ever use these... - (tmpvar "Tmp7236") - (tmpvar2 "Tmp8742")) - (format - (concat - "f(%s), {ok, %s} = file:get_cwd(), " - "file:set_cwd(\"%s\"), " - "%s = %s(\"%s\"%s), file:set_cwd(%s), f(%s), %s.") - tmpvar2 tmpvar - out-dir - tmpvar2 - erlang-compile-erlang-function - module-name (inferior-erlang-format-comma-opts - (remq out-dir-opt opts)) - tmpvar tmpvar tmpvar2))))) + (tmpvar "Tmp7236") + (tmpvar2 "Tmp8742")) + (format + (concat + "f(%s), {ok, %s} = file:get_cwd(), " + "file:set_cwd(\"%s\"), " + "%s = %s(\"%s\"%s), file:set_cwd(%s), f(%s), %s.") + tmpvar2 tmpvar + out-dir + tmpvar2 + erlang-compile-erlang-function + module-name (inferior-erlang-format-comma-opts + (remq out-dir-opt opts)) + tmpvar tmpvar tmpvar2))))) (defun inferior-erlang-compute-leex-compile-command (module-name opts) (let ((file-name (erlang-local-buffer-file-name)) - (erl-compile-expr (inferior-erlang-remove-any-trailing-dot - (inferior-erlang-compute-erl-compile-command - module-name opts)))) + (erl-compile-expr (inferior-erlang-remove-any-trailing-dot + (inferior-erlang-compute-erl-compile-command + module-name opts)))) (format (concat "f(LErr1__), f(LErr2__), " - "case case leex:file(\"%s\", [%s]) of" - " ok -> ok;" - " {ok,_} -> ok;" - " {ok,_,_} -> ok;" - " LErr1__ -> LErr1__ " - "end of" - " ok -> %s;" - " LErr2__ -> LErr2__ " - "end.") - file-name - (inferior-erlang-format-comma-opts erlang-leex-compile-opts) - erl-compile-expr))) + "case case leex:file(\"%s\", [%s]) of" + " ok -> ok;" + " {ok,_} -> ok;" + " {ok,_,_} -> ok;" + " LErr1__ -> LErr1__ " + "end of" + " ok -> %s;" + " LErr2__ -> LErr2__ " + "end.") + file-name + (inferior-erlang-format-comma-opts erlang-leex-compile-opts) + erl-compile-expr))) (defun inferior-erlang-compute-yecc-compile-command (module-name opts) (let ((file-name (erlang-local-buffer-file-name)) - (erl-compile-expr (inferior-erlang-remove-any-trailing-dot - (inferior-erlang-compute-erl-compile-command - module-name opts)))) + (erl-compile-expr (inferior-erlang-remove-any-trailing-dot + (inferior-erlang-compute-erl-compile-command + module-name opts)))) (format (concat "f(YErr1__), f(YErr2__), " - "case case yecc:file(\"%s\", [%s]) of" - " {ok,_} -> ok;" - " {ok,_,_} -> ok;" - " YErr1__ -> YErr1__ " - "end of" - " ok -> %s;" - " YErr2__ -> YErr2__ " - "end.") - file-name - (inferior-erlang-format-comma-opts erlang-yecc-compile-opts) - erl-compile-expr))) + "case case yecc:file(\"%s\", [%s]) of" + " {ok,_} -> ok;" + " {ok,_,_} -> ok;" + " YErr1__ -> YErr1__ " + "end of" + " ok -> %s;" + " YErr2__ -> YErr2__ " + "end.") + file-name + (inferior-erlang-format-comma-opts erlang-yecc-compile-opts) + erl-compile-expr))) (defun inferior-erlang-remove-any-trailing-dot (str) (if (string= (substring str -1) ".") @@ -5750,11 +5758,11 @@ unless the optional NO-DISPLAY is non-nil." ;; the file name "/some/path/x.erl" without the ;; tramp-prefix "/ssh:host.example.com:". (cond ((null (buffer-file-name)) - nil) - ((erlang-tramp-remote-file-p) - (erlang-tramp-get-localname)) - (t - (buffer-file-name)))) + nil) + ((erlang-tramp-remote-file-p) + (erlang-tramp-get-localname)) + (t + (buffer-file-name)))) (defun erlang-tramp-remote-file-p () (and (fboundp 'tramp-tramp-file-p) @@ -5780,22 +5788,22 @@ unless the optional NO-DISPLAY is non-nil." Capable of finding error messages in an inferior Erlang buffer." (interactive "P") (let ((done nil) - (buf (or (and (boundp 'next-error-last-buffer) - next-error-last-buffer) - (and (boundp 'compilation-last-buffer) - compilation-last-buffer)))) + (buf (or (and (boundp 'next-error-last-buffer) + next-error-last-buffer) + (and (boundp 'compilation-last-buffer) + compilation-last-buffer)))) (if (and (bufferp buf) - (with-current-buffer buf - (and (eq major-mode 'erlang-shell-mode) - (setq major-mode 'compilation-mode)))) - (unwind-protect - (progn - (setq done t) - (next-error argp)) - (with-current-buffer buf - (setq major-mode 'erlang-shell-mode)))) + (with-current-buffer buf + (and (eq major-mode 'erlang-shell-mode) + (setq major-mode 'compilation-mode)))) + (unwind-protect + (progn + (setq done t) + (next-error argp)) + (with-current-buffer buf + (setq major-mode 'erlang-shell-mode)))) (or done - (next-error argp)))) + (next-error argp)))) (defun inferior-erlang-change-directory (&optional dir) @@ -5832,44 +5840,44 @@ sum([], Sum) -> Sum." (interactive "r") (save-excursion (let (;; regexp for matching arrows. without a prefix argument, - ;; the regexp matches function heads. With a prefix, it - ;; matches any arrow. - (re (if current-prefix-arg - "^.*\\(\\)->" - (eval-when-compile - (concat "^" erlang-atom-regexp ".*\\(\\)->")))) - ;; part of regexp matching directly before the arrow - (arrow-match-pos (if current-prefix-arg - 1 - (1+ erlang-atom-regexp-matches))) - ;; accumulator for positions where arrows are found, ordered - ;; by buffer position (from greatest to smallest) - (arrow-positions '()) - ;; accumulator for longest distance from start of line to arrow - (most-indent 0) - ;; marker to track the end of the region we're aligning - (end-marker (progn (goto-char end) - (point-marker)))) + ;; the regexp matches function heads. With a prefix, it + ;; matches any arrow. + (re (if current-prefix-arg + "^.*\\(\\)->" + (eval-when-compile + (concat "^" erlang-atom-regexp ".*\\(\\)->")))) + ;; part of regexp matching directly before the arrow + (arrow-match-pos (if current-prefix-arg + 1 + (1+ erlang-atom-regexp-matches))) + ;; accumulator for positions where arrows are found, ordered + ;; by buffer position (from greatest to smallest) + (arrow-positions '()) + ;; accumulator for longest distance from start of line to arrow + (most-indent 0) + ;; marker to track the end of the region we're aligning + (end-marker (progn (goto-char end) + (point-marker)))) ;; Pass 1: Find the arrow positions, adjust the whitespace ;; before each arrow to one space, and find the greatest ;; indentation level. (goto-char start) (while (re-search-forward re end-marker t) - (goto-char (match-beginning arrow-match-pos)) - (just-one-space) ; adjust whitespace - (setq arrow-positions (cons (point) arrow-positions)) - (setq most-indent (max most-indent (erlang-column-number)))) - (set-marker end-marker nil) ; free the marker + (goto-char (match-beginning arrow-match-pos)) + (just-one-space) ; adjust whitespace + (setq arrow-positions (cons (point) arrow-positions)) + (setq most-indent (max most-indent (erlang-column-number)))) + (set-marker end-marker nil) ; free the marker ;; Pass 2: Insert extra padding so that all arrow indentation is ;; equal. This is done last-to-first by buffer position, so that ;; inserting spaces before one arrow doesn't change the ;; positions of the next ones. (mapc (lambda (arrow-pos) - (goto-char arrow-pos) - (let* ((pad (- most-indent (erlang-column-number)))) - (when (> pad 0) - (insert-char ?\ pad)))) - arrow-positions)))) + (goto-char arrow-pos) + (let* ((pad (- most-indent (erlang-column-number)))) + (when (> pad 0) + (insert-char ?\ pad)))) + arrow-positions)))) (defun erlang-column-number () "Return the column number of the current position in the buffer. @@ -5881,7 +5889,7 @@ Tab characters are counted by their visual width." (save-excursion (erlang-beginning-of-function) (if (looking-at "[a-z0-9_]+") - (match-string 0)))) + (match-string 0)))) ;; Aliases for backward compatibility with older versions of Erlang Mode. ;; @@ -5900,7 +5908,7 @@ it assumes that NEWDEF is loaded." (erlang-obsolete 'calculate-erlang-indent 'erlang-calculate-indent) (erlang-obsolete 'calculate-erlang-stack-indent - 'erlang-calculate-stack-indent) + 'erlang-calculate-stack-indent) (erlang-obsolete 'at-erlang-keyword 'erlang-at-keyword) (erlang-obsolete 'at-erlang-operator 'erlang-at-operator) (erlang-obsolete 'beginning-of-erlang-clause 'erlang-beginning-of-clause) @@ -5915,12 +5923,12 @@ it assumes that NEWDEF is loaded." (defconst erlang-unload-hook (list (lambda () - (when (featurep 'advice) - (ad-unadvise 'Man-notify-when-ready) - (ad-unadvise 'set-visited-file-name))))) + (when (featurep 'advice) + (ad-unadvise 'Man-notify-when-ready) + (ad-unadvise 'set-visited-file-name))))) -(defun erlang-string-to-int (string) +(defun erlang-string-to-int (string) (if (fboundp 'string-to-number) (string-to-number string) (funcall (symbol-function 'string-to-int) string))) @@ -5933,6 +5941,7 @@ it assumes that NEWDEF is loaded." ;; Local variables: ;; coding: iso-8859-1 +;; indent-tabs-mode: nil ;; End: ;;; erlang.el ends here diff --git a/lib/tools/emacs/erldoc.el b/lib/tools/emacs/erldoc.el new file mode 100644 index 0000000000..cb355374d9 --- /dev/null +++ b/lib/tools/emacs/erldoc.el @@ -0,0 +1,508 @@ +;;; erldoc.el --- browse Erlang/OTP documentation -*- lexical-binding: t; -*- + +;; %CopyrightBegin% +;; +;; Copyright Ericsson AB 2016. All Rights Reserved. +;; +;; Licensed under the Apache License, Version 2.0 (the "License"); +;; you may not use this file except in compliance with the License. +;; You may obtain a copy of the License at +;; +;; http://www.apache.org/licenses/LICENSE-2.0 +;; +;; Unless required by applicable law or agreed to in writing, software +;; distributed under the License is distributed on an "AS IS" BASIS, +;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +;; See the License for the specific language governing permissions and +;; limitations under the License. +;; +;; %CopyrightEnd% + +;;; Commentary: + +;; Crawl Erlang/OTP HTML documentation and generate lookup tables. +;; +;; This package depends on `cl-lib', `pcase' and +;; `libxml-parse-html-region'; emacs 24+ compiled with libxml2 should +;; work. On emacs 24.1 and 24.2 do `M-x package-install RET cl-lib +;; RET' to install `cl-lib'. +;; +;; Please customise `erldoc-man-index' to point to your local OTP +;; documentation. +;; +;; To use: +;; +;; (define-key help-map "u" 'erldoc-browse) +;; (define-key help-map "t" 'erldoc-browse-topic) +;; (define-key help-map "a" 'erldoc-apropos) +;; +;; Note: these commands trigger indexing OTP documentation on first +;; run with cache to disk which may take 1-2 minutes. + + +;;; Examples: + +;; 1. `M-x erldoc-browse RET erlang:integer_to_binary/2 RET' opens the +;; `erlang' manual anchored on the entry for `integer_to_binary/2'. +;; +;; 2. `M-x erldoc-apropos RET first RET' list all MFAs matching +;; substring `first'. +;; +;; 3. `M-x erldoc-browse-topic RET efficiency_guide#Introduction RET' +;; opens chapter `Introduction' of the `Efficiency Guide' in the +;; browser. + +;;; History: + +;; Written in December 2013 as a temporary solution to help me browse +;; the rich Erlang/OTP documentation. Three years on I find myself +;; still using it every day. - Leo (2016) + +;;; Code: + +(eval-when-compile (require 'url-parse)) +(require 'cl-lib) +(require 'erlang) + +(eval-and-compile ;for emacs < 24.3 + (or (fboundp 'user-error) (defalias 'user-error 'error))) + +(defgroup erldoc nil + "Browse Erlang document." + :group 'help) + +(defcustom erldoc-man-index "http://www.erlang.org/doc/man_index.html" + "The URL to the man_index.html page. +Note it is advisable to customise this to a local URL for example +`file:///usr/local/19.1/lib/erlang/doc/man_index.html' to speed +up the indexing." + :type 'string + :group 'erldoc) + +(defcustom erldoc-verify-man-path nil + "If non-nil verify man path existence for `file://'." + :type 'boolean + :group 'erldoc) + +(defcustom erldoc-output-file (locate-user-emacs-file "cache/erldoc") + "File to store the parsed results." + :type 'file + :group 'erldoc) + +(defun erldoc-strip-string (s) + (let* ((re "[ \t\n\r\f\v\u00a0]+") + (from (if (string-match (concat "\\`" re) s) (match-end 0) 0)) + (to (and (string-match (concat re "\\'") s) (match-beginning 0)))) + (substring s from (and to (max to from))))) + +;; Note: don't know how to get the BASE-URL to +;; `libxml-parse-html-region' to work. +(defun erldoc-expand-url (url base-url) + (if (url-type (url-generic-parse-url url)) + url + (let* ((base (url-generic-parse-url base-url)) + (dir (directory-file-name (file-name-directory (url-filename base))))) + (setf (url-filename base) (expand-file-name url dir)) + (url-recreate-url base)))) + +(defun erldoc-parse-html (url) + (with-temp-buffer + (url-insert-file-contents url) + (libxml-parse-html-region (point-min) (point-max)))) + +(defalias 'erldoc-dom-text-node-p #'stringp) + +(defun erldoc-dom-attributes (dom) + (and (not (erldoc-dom-text-node-p dom)) (cadr dom))) + +(defun erldoc-dom-get-attribute (dom attrib-name) + (cdr (assq attrib-name (erldoc-dom-attributes dom)))) + +(defun erldoc-dom-children (dom) + (and (not (erldoc-dom-text-node-p dom)) (cddr dom))) + +(defun erldoc-dom-get-text (dom) + (let ((text (car (last (erldoc-dom-children dom))))) + (and (erldoc-dom-text-node-p text) text))) + +(defvar erldoc-dom-walk-parent nil) +(defvar erldoc-dom-walk-siblings nil) + +(defun erldoc-dom-walk (dom k) + (funcall k dom) + (let ((erldoc-dom-walk-parent dom) + (erldoc-dom-walk-siblings (unless (erldoc-dom-text-node-p dom) + (cddr dom)))) + (dolist (child erldoc-dom-walk-siblings) + (erldoc-dom-walk child k)))) + +(defun erldoc-dom-get-element (dom element-name) + (catch 'return + (erldoc-dom-walk dom (lambda (d) + (when (eq (car-safe d) element-name) + (throw 'return d)))))) + +(defun erldoc-dom-get-element-by-id (dom id) + (catch 'return + (erldoc-dom-walk dom (lambda (d) + (when (equal (erldoc-dom-get-attribute d 'id) id) + (throw 'return d)))))) + +(defun erldoc-dom-get-elements-by-id (dom id) + (let (result) + (erldoc-dom-walk dom (lambda (d) + (when (equal (erldoc-dom-get-attribute d 'id) id) + (push d result)))) + (nreverse result))) + +(defun erldoc-fix-path (url) + (if (and erldoc-verify-man-path + ;; Could only verify local files + (equal (url-type (url-generic-parse-url url)) "file")) + (let* ((obj (url-generic-parse-url url)) + (new (car (file-expand-wildcards + (replace-regexp-in-string + "-[0-9]+\\(?:[.][0-9]+\\)*" "*" + (url-filename obj)))))) + (or new (error "File %s does not exist" (url-filename obj))) + (setf (url-filename obj) new) + (url-recreate-url obj)) + url)) + +(defun erldoc-parse-man-index (url) + (let ((table (erldoc-dom-get-element (erldoc-parse-html url) 'table)) + (mans)) + (erldoc-dom-walk + table + (lambda (d) + (when (eq (car-safe d) 'a) + (let ((href (erldoc-dom-get-attribute d 'href))) + (when (and href (not (string-match-p "index\\.html\\'" href))) + (with-demoted-errors "erldoc-parse-man-index: %S" + (push (cons (erldoc-dom-get-text d) + (erldoc-fix-path (erldoc-expand-url href url))) + mans))))))) + (nreverse mans))) + +(defun erldoc-parse-man (man) + (let ((dom (erldoc-parse-html (cdr man))) + (table (make-hash-table :test #'equal))) + (erldoc-dom-walk + (erldoc-dom-get-element-by-id dom "loadscrollpos") + (lambda (d) + (let ((href (erldoc-dom-get-attribute d 'href))) + (when (and href (string-match "#" href)) + (puthash (substring href (match-end 0)) + (list (concat (car man) ":" (erldoc-strip-string + (erldoc-dom-get-text d))) + (erldoc-expand-url href (cdr man))) + table))))) + (let ((span-content + (lambda (span) + (let ((texts)) + (erldoc-dom-walk span + (lambda (d) + (and (erldoc-dom-text-node-p d) + (push (erldoc-strip-string d) texts)))) + (and texts (mapconcat 'identity (nreverse texts) " "))))) + entries) + (erldoc-dom-walk + dom + (lambda (d) + ;; Get the full function signature. + (when (and (eq (car-safe d) 'a) + (gethash (erldoc-dom-get-attribute d 'name) table)) + (push (append (gethash (erldoc-dom-get-attribute d 'name) table) + (list (funcall span-content + (or (erldoc-dom-get-element d 'span) + (cadr (memq d erldoc-dom-walk-siblings)))))) + entries)) + ;; Get data types + (when (and (eq (car-safe d) 'a) + (string-prefix-p "type-" + (or (erldoc-dom-get-attribute d 'name) ""))) + (push (list (concat (car man) ":" (funcall span-content d)) + (concat (cdr man) "#" (erldoc-dom-get-attribute d 'name)) + (funcall span-content erldoc-dom-walk-parent)) + entries)))) + entries))) + +(defun erldoc-parse-all (man-index output &optional json) + (let* ((output (expand-file-name output)) + (table (make-hash-table :size 11503 :test #'equal)) + (mans (erldoc-parse-man-index man-index)) + (progress 1) + (reporter (make-progress-reporter "Parsing Erlang/OTP documentation" + progress (length mans))) + fails all) + (dolist (man mans) + (condition-case err + (push (erldoc-parse-man man) all) + (error (push (error-message-string err) fails))) + (accept-process-output nil 0.01) + (progress-reporter-update reporter (cl-incf progress))) + (when fails + (display-warning 'erldoc-parse-all + (format "\n\n%s" (mapconcat #'identity fails "\n")) + :error)) + (progress-reporter-done reporter) + (mapc (lambda (x) (puthash (car x) (cdr x) table)) + (apply #'nconc (nreverse all))) + (with-temp-buffer + (if (not json) + (pp table (current-buffer)) + (eval-and-compile (require 'json)) + (let ((json-encoding-pretty-print t)) + (insert (json-encode table)))) + (unless (file-directory-p (file-name-directory output)) + (make-directory (file-name-directory output) t)) + (write-region nil nil output nil nil nil 'ask)))) + +(defun erldoc-otp-release () + "Get the otp release version (as string) or nil if not found." + (let ((otp (erldoc-dom-get-text + (erldoc-dom-get-element + (erldoc-parse-html + (erldoc-expand-url "index.html" erldoc-man-index)) + 'title)))) + (and (string-match "[0-9.]+\\'" otp) (match-string 0 otp)))) + +(defvar erldoc-browse-history nil) +(defvar erldoc-lookup-table nil) + +(defun erldoc-lookup-table () + (or erldoc-lookup-table + (progn + (unless (file-exists-p erldoc-output-file) + (let ((of (pcase (erldoc-otp-release) + (`nil erldoc-output-file) + (ver (concat erldoc-output-file "-" ver))))) + (unless (file-exists-p of) + (erldoc-parse-all erldoc-man-index of)) + (unless (string= erldoc-output-file of) + (make-symbolic-link of erldoc-output-file)))) + (setq erldoc-lookup-table + (with-temp-buffer + (insert-file-contents erldoc-output-file) + (read (current-buffer))))))) + +(defun erldoc-best-matches (mfa) + (pcase mfa + ((and `(,m ,f) (let a (erlang-get-function-arity))) + (let ((mfa (format "%s:%s/%s" m f a))) + (cond ((gethash mfa (erldoc-lookup-table)) (list mfa)) + (m (all-completions (concat m ":" f "/") (erldoc-lookup-table))) + (t (let* ((mod (erlang-get-module)) + (mf1 (and mod (concat mod ":" f "/"))) + (mf2 (concat "erlang:" f "/")) + (re (concat ":" (regexp-quote f) "/"))) + (or (and mf1 (all-completions mf1 (erldoc-lookup-table))) + (all-completions mf2 (erldoc-lookup-table)) + (cl-loop for k being the hash-keys of (erldoc-lookup-table) + when (string-match-p re k) + collect k))))))))) + +;;;###autoload +(defun erldoc-browse (mfa) + (interactive + (let ((default + ;; `erlang-mode-syntax-table' is lazily initialised. + (with-syntax-table (or erlang-mode-syntax-table (standard-syntax-table)) + (ignore-errors + (erldoc-best-matches + (or (erlang-get-function-under-point) + (save-excursion + (goto-char (or (cadr (syntax-ppss)) (point))) + (erlang-get-function-under-point)))))))) + (list (completing-read (format (if default "Function {%d %s} (default %s): " + "Function: ") + (length default) + (if (= (length default) 1) "guess" "guesses") + (car default)) + (erldoc-lookup-table) + nil t nil 'erldoc-browse-history default)))) + (or (stringp mfa) + (signal 'wrong-type-argument (list 'string mfa 'mfa))) + (browse-url (or (car (gethash mfa (erldoc-lookup-table))) + (user-error "No documentation for %s" mfa)))) + +;;;###autoload +(defun erldoc-apropos (pattern) + (interactive "sPattern: ") + (with-help-window (help-buffer) + (with-current-buffer standard-output + (princ (concat "Erldoc apropos pattern: " pattern "\n\n")) + (maphash (lambda (k v) + (when (string-match-p pattern k) + (insert-text-button k :type 'help-url + 'help-args (list (car v))) + (insert "\n"))) + (erldoc-lookup-table))))) + +(defun erldoc-tokenize-signature (sig) + ;; Divide SIG into (MF ARGLIST RETTYPE) + (let ((from (if (string-match "\\`.+?(" sig) + (1- (match-end 0)) + 0)) + (to (and (string-match "\\s-*->\\s-*.*?\\'" sig) (match-beginning 0)))) + (list (erldoc-strip-string (substring sig 0 from)) + (erldoc-strip-string (substring sig from (and to (max from to)))) + (and to (erldoc-strip-string (substring sig to)))))) + +(defun erldoc-format-signature (mod fn) + (when (and mod fn (or erldoc-lookup-table + (file-exists-p erldoc-output-file))) + (let ((re (concat "\\`" mod ":" fn "/\\([0-9]+\\)\\'")) + (sigs)) + (maphash (lambda (k v) + (when (string-match re k) + (push (cons (string-to-number (match-string 1 k)) + (cdr (erldoc-tokenize-signature (cadr v)))) + sigs))) + (erldoc-lookup-table)) + (when sigs + ;; Mostly single return type but there are exceptions such as + ;; `beam_lib:chunks/2,3'. + (let ((single-rettype + (cl-reduce (lambda (x1 x2) (and x1 x2 (equal x1 x2) x1)) + sigs :key #'cl-caddr)) + (sigs (sort sigs #'car-less-than-car))) + (if single-rettype + (concat mod ":" fn (mapconcat #'cadr sigs " | ") " " single-rettype) + (mapconcat (lambda (x) (concat mod ":" fn (nth 1 x) " " (nth 2 x))) + sigs "\n"))))))) + +;;;###autoload +(defun erldoc-eldoc-function () + "A function suitable for `eldoc-documentation-function'." + (save-excursion + (pcase (erlang-get-function-under-point) + (`(,_ nil) ) + (`(nil ,fn) (erldoc-format-signature "erlang" fn)) + (`(,mod ,fn) (erldoc-format-signature mod fn))))) + +(defun erldoc-parse-eeps-index () + (let* ((url "http://www.erlang.org/eeps/") + (table (catch 'return + (erldoc-dom-walk (erldoc-parse-html url) + (lambda (d) + (and (eq (car-safe d) 'table) + (equal (erldoc-dom-get-attribute d 'summary) + "Numerical Index of EEPs") + (throw 'return d)))))) + (fix-title (lambda (title) + (replace-regexp-in-string + "`` *" "" (replace-regexp-in-string " *``, *" " by " title)))) + (result)) + (erldoc-dom-walk + table (lambda (d) + (when (eq (car-safe d) 'a) + (push (cons (funcall fix-title (erldoc-dom-get-attribute d 'title)) + (erldoc-expand-url + (erldoc-dom-get-attribute d 'href) + url)) + result)))) + (nreverse result))) + +(defvar erldoc-user-guides nil) + +(defvar erldoc-missing-user-guides + '("compiler" "hipe" "kernel" "os_mon" "parsetools" "typer") + "List of standard Erlang applications with no user guides.") + +;; Search in `code:lib_dir/0' using find LIB_DIR -type f -name +;; '*_app.html'. +(defvar erldoc-app-manuals '("crypto" "diameter" "erl_docgen" + "kernel" "observer" "os_mon" + "runtime_tools" "sasl" "snmp" + "ssl" "test_server" + ("ssh" . "SSH") ("stdlib" . "STDLIB") + ("hipe" . "HiPE") ("typer" . "TypEr")) + "List of applications that come with a manual.") + +(defun erldoc-user-guide-chapters (user-guide) + (pcase-let ((`(,name . ,url) user-guide)) + (unless (member name erldoc-missing-user-guides) + (let ((chaps (erldoc-dom-get-elements-by-id + (erldoc-dom-get-element-by-id (erldoc-parse-html url) "leftnav") + "no"))) + (or chaps (warn "erldoc-user-guide-chapters no chapters found for `%s'" + (cdr user-guide))) + (mapcar (lambda (li) + (cons (concat name "#" (erldoc-dom-get-attribute li 'title)) + (erldoc-expand-url (erldoc-dom-get-attribute + (erldoc-dom-get-element li 'a) 'href) + url))) + chaps))))) + +(defun erldoc-user-guides-1 () + (let ((url (erldoc-expand-url "applications.html" erldoc-man-index)) + app-guides app-mans) + (erldoc-dom-walk + (erldoc-parse-html url) + (lambda (d) + (when (and (eq (car-safe d) 'a) + (not (string-match-p "\\`[0-9.]+\\'" (erldoc-dom-get-text d)))) + (with-demoted-errors "erldoc-user-guides-1: %S" + (let ((name (erldoc-strip-string (erldoc-dom-get-text d))) + (index-page (erldoc-fix-path (erldoc-expand-url + (erldoc-dom-get-attribute d 'href) url)))) + (push (cons name (if (member name erldoc-missing-user-guides) + index-page + (erldoc-expand-url "users_guide.html" index-page))) + app-guides) + ;; Collect application manuals. + (pcase (assoc name (mapcar (lambda (x) (if (consp x) x (cons x x))) + erldoc-app-manuals)) + (`(,_ . ,manual) + (push (cons name + (erldoc-expand-url (format "%s_app.html" manual) + index-page)) + app-mans)))))))) + (list (nreverse app-guides) + (nreverse app-mans)))) + +(defun erldoc-user-guides () + (or erldoc-user-guides + (let ((file (concat erldoc-output-file "-topics"))) + (unless (file-exists-p file) + (unless (file-directory-p (file-name-directory file)) + (make-directory (file-name-directory file) t)) + (with-temp-buffer + (pcase-let ((`(,guides ,mans) (erldoc-user-guides-1))) + (pp (append (cl-mapcan #'erldoc-user-guide-chapters + (append (mapcar + (lambda (dir) + (cons dir (erldoc-expand-url + (concat dir "/users_guide.html") + erldoc-man-index))) + '("design_principles" + "efficiency_guide" + "embedded" + "getting_started" + "installation_guide" + "oam" + "programming_examples" + "reference_manual" + "system_architecture_intro" + "system_principles" + "tutorial")) + guides)) + (mapcar (lambda (man) + (pcase-let ((`(,name . ,url) man)) + (cons (concat name " (App)") url))) + mans) + (erldoc-parse-eeps-index)) + (current-buffer))) + (write-region nil nil file nil nil nil 'ask))) + (setq erldoc-user-guides (with-temp-buffer (insert-file-contents file) + (read (current-buffer))))))) + +;;;###autoload +(defun erldoc-browse-topic (topic) + (interactive + (list (completing-read "User guide: " (erldoc-user-guides) nil t))) + (browse-url (cdr (assoc topic (erldoc-user-guides))))) + +(provide 'erldoc) +;;; erldoc.el ends here diff --git a/lib/tools/emacs/test.erl.indented b/lib/tools/emacs/test.erl.indented index 7a1ff6a954..14a4eca7c3 100644 --- a/lib/tools/emacs/test.erl.indented +++ b/lib/tools/emacs/test.erl.indented @@ -1,4 +1,4 @@ -%% -*- erlang -*- +%% -*- Mode: erlang; indent-tabs-mode: nil -*- %% %% %CopyrightBegin% %% @@ -27,7 +27,7 @@ %%% Created : 6 Oct 2009 by Dan Gudmundsson <[email protected]> %%%------------------------------------------------------------------- -%% Start off with syntax highlighting you have to verify this by looking here +%% Start off with syntax highlighting you have to verify this by looking here %% and see that the code looks alright -module(test). @@ -44,175 +44,175 @@ foo() -> %% Module attributes should be highlighted -export([t/1]). --record(record1, {a, - b, - c - }). +-record(record1, {a, + b, + c + }). -record(record2, { - a, - b - }). + a, + b + }). -record(record3, {a = 8#42423 bor - 8#4234, - b = 8#5432 - bor 2#1010101 - c = 123 + - 234, + 8#4234, + b = 8#5432 + bor 2#1010101 + c = 123 + + 234, d}). -record(record4, { - a = 8#42423 bor - 8#4234, - b = 8#5432 - bor 2#1010101 - c = 123 + - 234, - d}). + a = 8#42423 bor + 8#4234, + b = 8#5432 + bor 2#1010101 + c = 123 + + 234, + d}). -record(record5, { a = 1 :: integer() - , b = foobar :: atom() - }). + , b = foobar :: atom() + }). -define(MACRO_1, macro). -define(MACRO_2(_), macro). -spec t(integer()) -> any(). --type ann() :: Var :: integer(). --type ann2() :: Var :: - 'return' - | 'return_white_spaces' - | 'return_comments' - | 'text' | ann(). --type paren() :: - (ann2()). --type t1() :: atom(). --type t2() :: [t1()]. --type t3(Atom) :: integer(Atom). --type t4() :: t3(foobar). --type t5() :: {t1(), t3(foo)}. --type t6() :: 1 | 2 | 3 | - 'foo' | 'bar'. --type t7() :: []. --type t71() :: [_]. +-type ann() :: Var :: integer(). +-type ann2() :: Var :: + 'return' + | 'return_white_spaces' + | 'return_comments' + | 'text' | ann(). +-type paren() :: + (ann2()). +-type t1() :: atom(). +-type t2() :: [t1()]. +-type t3(Atom) :: integer(Atom). +-type t4() :: t3(foobar). +-type t5() :: {t1(), t3(foo)}. +-type t6() :: 1 | 2 | 3 | + 'foo' | 'bar'. +-type t7() :: []. +-type t71() :: [_]. -type t8() :: {any(),none(),pid(),port(), - reference(),float()}. --type t9() :: [1|2|3|foo|bar] | - list(a | b | c) | t71(). --type t10() :: {1|2|3|foo|t9()} | {}. --type t11() :: 1..2. --type t13() :: maybe_improper_list(integer(), t11()). --type t14() :: [erl_scan:foo() | - %% Should be highlighted - term() | - bool() | - byte() | - char() | - non_neg_integer() | nonempty_list() | - pos_integer() | - neg_integer() | - number() | - list() | - nonempty_improper_list() | nonempty_maybe_improper_list() | - maybe_improper_list() | string() | iolist() | byte() | - module() | - mfa() | - node() | - timeout() | - no_return() | - %% Should not be highlighted - nonempty_() | nonlist() | - erl_scan:bar(34, 92) | t13() | m:f(integer() | <<_:_*16>>)]. + reference(),float()}. +-type t9() :: [1|2|3|foo|bar] | + list(a | b | c) | t71(). +-type t10() :: {1|2|3|foo|t9()} | {}. +-type t11() :: 1..2. +-type t13() :: maybe_improper_list(integer(), t11()). +-type t14() :: [erl_scan:foo() | + %% Should be highlighted + term() | + bool() | + byte() | + char() | + non_neg_integer() | nonempty_list() | + pos_integer() | + neg_integer() | + number() | + list() | + nonempty_improper_list() | nonempty_maybe_improper_list() | + maybe_improper_list() | string() | iolist() | byte() | + module() | + mfa() | + node() | + timeout() | + no_return() | + %% Should not be highlighted + nonempty_() | nonlist() | + erl_scan:bar(34, 92) | t13() | m:f(integer() | <<_:_*16>>)]. -type t15() :: {binary(),<<>>,<<_:34>>,<<_:_*42>>, <<_:3,_:_*14>>,<<>>} | [<<>>|<<_:34>>|<<_:16>>| - <<_:3,_:_*1472>>|<<_:19,_:_*14>>| <<_:34>>| - <<_:34>>|<<_:34>>|<<_:34>>]. --type t16() :: fun(). --type t17() :: fun((...) -> paren()). --type t18() :: fun(() -> t17() | t16()). + <<_:3,_:_*1472>>|<<_:19,_:_*14>>| <<_:34>>| + <<_:34>>|<<_:34>>|<<_:34>>]. +-type t16() :: fun(). +-type t17() :: fun((...) -> paren()). +-type t18() :: fun(() -> t17() | t16()). -type t19() :: fun((t18()) -> t16()) | - fun((nonempty_maybe_improper_list('integer', any())| - 1|2|3|a|b|<<_:3,_:_*14>>|integer()) -> - nonempty_maybe_improper_list('integer', any())| - 1|2|3|a|b|<<_:3,_:_*14>>|integer()). --type t20() :: [t19(), ...]. --type t21() :: tuple(). --type t21(A) :: A. --type t22() :: t21(integer()). --type t23() :: #rec1{}. --type t24() :: #rec2{a :: t23(), b :: [atom()]}. --type t25() :: #rec3{f123 :: [t24() | - 1|2|3|4|a|b|c|d| - nonempty_maybe_improper_list(integer, any())]}. + fun((nonempty_maybe_improper_list('integer', any())| + 1|2|3|a|b|<<_:3,_:_*14>>|integer()) -> + nonempty_maybe_improper_list('integer', any())| + 1|2|3|a|b|<<_:3,_:_*14>>|integer()). +-type t20() :: [t19(), ...]. +-type t21() :: tuple(). +-type t21(A) :: A. +-type t22() :: t21(integer()). +-type t23() :: #rec1{}. +-type t24() :: #rec2{a :: t23(), b :: [atom()]}. +-type t25() :: #rec3{f123 :: [t24() | + 1|2|3|4|a|b|c|d| + nonempty_maybe_improper_list(integer, any())]}. -type t26() :: #rec4{ a :: integer() - , b :: any() - }. + , b :: any() + }. -type t27() :: { integer() - , atom() - }. + , atom() + }. -type t99() :: - {t2(),t4(),t5(),t6(),t7(),t8(),t10(),t14(), - t15(),t20(),t21(), t22(),t25()}. + {t2(),t4(),t5(),t6(),t7(),t8(),t10(),t14(), + t15(),t20(),t21(), t22(),t25()}. -spec t1(FooBar :: t99()) -> t99(); - (t2()) -> t2(); + (t2()) -> t2(); (t4()) -> t4() when is_subtype(t4(), t24); - (t23()) -> t23() when is_subtype(t23(), atom()), - is_subtype(t23(), t14()); - (t24()) -> t24() when is_subtype(t24(), atom()), - is_subtype(t24(), t14()), - is_subtype(t24(), t4()). + (t23()) -> t23() when is_subtype(t23(), atom()), + is_subtype(t23(), t14()); + (t24()) -> t24() when is_subtype(t24(), atom()), + is_subtype(t24(), t14()), + is_subtype(t24(), t4()). -spec over(I :: integer()) -> R1 :: foo:typen(); - (A :: atom()) -> R2 :: foo:atomen(); - (T :: tuple()) -> R3 :: bar:typen(). + (A :: atom()) -> R2 :: foo:atomen(); + (T :: tuple()) -> R3 :: bar:typen(). --spec mod:t2() -> any(). +-spec mod:t2() -> any(). --spec handle_cast(Cast :: {'exchange', node(), [[name(),...]]} - | {'del_member', name(), pid()}, - #state{}) -> {'noreply', #state{}}. +-spec handle_cast(Cast :: {'exchange', node(), [[name(),...]]} + | {'del_member', name(), pid()}, + #state{}) -> {'noreply', #state{}}. --spec handle_cast(Cast :: - {'exchange', node(), [[name(),...]]} - | {'del_member', name(), pid()}, - #state{}) -> {'noreply', #state{}}. +-spec handle_cast(Cast :: + {'exchange', node(), [[name(),...]]} + | {'del_member', name(), pid()}, + #state{}) -> {'noreply', #state{}}. -spec all(fun((T) -> boolean()), List :: [T]) -> - boolean() when is_subtype(T, term()). % (*) + boolean() when is_subtype(T, term()). % (*) --spec get_closest_pid(term()) -> - Return :: pid() - | {'error', {'no_process', term()} - | {'no_such_group', term()}}. +-spec get_closest_pid(term()) -> + Return :: pid() + | {'error', {'no_process', term()} + | {'no_such_group', term()}}. -spec add( X :: integer() - , Y :: integer() - ) -> integer(). + , Y :: integer() + ) -> integer(). --opaque attributes_data() :: - [{'column', column()} | {'line', info_line()} | - {'text', string()}] | {line(),column()}. +-opaque attributes_data() :: + [{'column', column()} | {'line', info_line()} | + {'text', string()}] | {line(),column()}. -record(r,{ f1 :: attributes_data(), - f222 = foo:bar(34, #rec3{}, 234234234423, - aassdsfsdfsdf, 2234242323) :: - [t24() | 1|2|3|4|a|b|c|d| - nonempty_maybe_improper_list(integer, any())], - f333 :: [t24() | 1|2|3|4|a|b|c|d| - nonempty_maybe_improper_list(integer, any())], - f3 = x:y(), - f4 = x:z() :: t99(), - f17 :: 'undefined', - f18 :: 1 | 2 | 'undefined', - f19 = 3 :: integer()|undefined, - f5 = 3 :: undefined|integer()}). + f222 = foo:bar(34, #rec3{}, 234234234423, + aassdsfsdfsdf, 2234242323) :: + [t24() | 1|2|3|4|a|b|c|d| + nonempty_maybe_improper_list(integer, any())], + f333 :: [t24() | 1|2|3|4|a|b|c|d| + nonempty_maybe_improper_list(integer, any())], + f3 = x:y(), + f4 = x:z() :: t99(), + f17 :: 'undefined', + f18 :: 1 | 2 | 'undefined', + f19 = 3 :: integer()|undefined, + f5 = 3 :: undefined|integer()}). -record(state, { - sequence_number = 1 :: integer() - }). + sequence_number = 1 :: integer() + }). highlighting(X) % Function definitions should be highlighted @@ -230,12 +230,12 @@ highlighting(X) % Function definitions should be highlighted '#1',atom, $", atom, % atom should be ok - $', atom, + $', atom, "string$", atom, "string$", atom, % currently buggy I know... "string\$", atom, % workaround for bug above - "char $in string", atom, + "char $in string", atom, 'atom$', atom, 'atom$', atom, 'atom\$', atom, @@ -270,15 +270,15 @@ highlighting(X) % Function definitions should be highlighted erlang:anything(lists), %% Guards is_atom(foo), is_float(2.3), is_integer(32), is_number(4323.3), - is_function(Fun), is_pid(self()), + is_function(Fun), is_pid(self()), not_a_guard:is_list([]), %% Other Types atom, % not (currently) hightlighted - 234234, + 234234, 234.43, - [list, are, not, higlighted], + [list, are, not, higlighted], {nor, is, tuple}, ok. @@ -290,35 +290,35 @@ highlighting(X) % Function definitions should be highlighted %% Indented - % Right + % Right -indent_basics(X, Y, Z) +indent_basics(X, Y, Z) when X > 42, Z < 13; Y =:= 4711 -> %% comments - % right comments - case lists:filter(fun(_, AlongName, - B, - C) -> - true - end, - [a,v,b]) + % right comments + case lists:filter(fun(_, AlongName, + B, + C) -> + true + end, + [a,v,b]) of - [] -> - Y = 5 * 43, - ok; - [_|_] -> - Y = 5 * 43, - ok + [] -> + Y = 5 * 43, + ok; + [_|_] -> + Y = 5 * 43, + ok end, Y, %% List, tuples and binaries - [a, + [a, b, c ], - [ a, + [ a, b, c ], @@ -326,10 +326,10 @@ indent_basics(X, Y, Z) a, b ], - {a, + {a, b,c }, - { a, + { a, b,c }, @@ -366,16 +366,16 @@ indent_basics(X, Y, Z) c ), - call(2#42423 bor - #4234, - 2#5432, - other_arg), + call(2#42423 bor + #4234, + 2#5432, + other_arg), ok; -indent_basics(Xlongname, - #struct{a=Foo, - b=Bar}, - [X| - Y]) -> +indent_basics(Xlongname, + #struct{a=Foo, + b=Bar}, + [X| + Y]) -> testing_next_clause, ok; indent_basics( % AD added clause @@ -408,295 +408,295 @@ indent_nested() -> indent_icr(Z) -> % icr = if case receive %% If if Z >= 0 -> - X = 43 div 4, - foo(X); + X = 43 div 4, + foo(X); Z =< 10 -> - X = 43 div 4, - foo(X); + X = 43 div 4, + foo(X); Z == 5 orelse Z == 7 -> - X = 43 div 4, - foo(X); + X = 43 div 4, + foo(X); true -> - if_works + if_works end, %% Case case {Z, foo, bar} of - {Z,_,_} -> - X = 43 div 4, - foo(X); - {Z,_,_} when - Z =:= 42 -> % AD line should be indented as a when - X = 43 div 4, - foo(X); - {Z,_,_} - when Z < 10 -> % AD when should be indented - X = 43 div 4, - foo(X); - {Z,_,_} - when % AD when should be indented - Z < 10 % and the guards should follow when - andalso % unsure about how though - true -> - X = 43 div 4, - foo(X) + {Z,_,_} -> + X = 43 div 4, + foo(X); + {Z,_,_} when + Z =:= 42 -> % AD line should be indented as a when + X = 43 div 4, + foo(X); + {Z,_,_} + when Z < 10 -> % AD when should be indented + X = 43 div 4, + foo(X); + {Z,_,_} + when % AD when should be indented + Z < 10 % and the guards should follow when + andalso % unsure about how though + true -> + X = 43 div 4, + foo(X) end, %% begin begin - sune, - X = 74234 + foo(8456) + - 345 div 43, - ok + sune, + X = 74234 + foo(8456) + + 345 div 43, + ok end, %% receive - receive - {Z,_,_} -> - X = 43 div 4, - foo(X); - Z -> - X = 43 div 4, - foo(X) + receive + {Z,_,_} -> + X = 43 div 4, + foo(X); + Z -> + X = 43 div 4, + foo(X) end, receive - {Z,_,_} -> - X = 43 div 4, - foo(X); - Z % AD added clause - when Z =:= 1 -> % This line should be indented by 2 - X = 43 div 4, - foo(X); - Z when % AD added clause - Z =:= 2 -> % This line should be indented by 2 - X = 43 div 4, - foo(X); - Z -> - X = 43 div 4, - foo(X) + {Z,_,_} -> + X = 43 div 4, + foo(X); + Z % AD added clause + when Z =:= 1 -> % This line should be indented by 2 + X = 43 div 4, + foo(X); + Z when % AD added clause + Z =:= 2 -> % This line should be indented by 2 + X = 43 div 4, + foo(X); + Z -> + X = 43 div 4, + foo(X) after infinity -> - foo(X), - asd(X), - 5*43 + foo(X), + asd(X), + 5*43 end, receive - after 10 -> - foo(X), - asd(X), - 5*43 + after 10 -> + foo(X), + asd(X), + 5*43 end, ok. indent_fun() -> %% Changed fun to one indention level - Var = spawn(fun(X) - when X == 2; - X > 10 -> - hello, - case Hello() of - true when is_atom(X) -> - foo; - false -> - bar - end; - (Foo) when is_atom(Foo), - is_integer(X) -> - X = 6* 45, - Y = true andalso - kalle - end), + Var = spawn(fun(X) + when X == 2; + X > 10 -> + hello, + case Hello() of + true when is_atom(X) -> + foo; + false -> + bar + end; + (Foo) when is_atom(Foo), + is_integer(X) -> + X = 6* 45, + Y = true andalso + kalle + end), %% check EEP37 named funs Fn1 = fun Fact(N) when N > 0 -> - F = Fact(N-1), - N * F; - Fact(0) -> - 1 - end, + F = Fact(N-1), + N * F; + Fact(0) -> + 1 + end, %% check anonymous funs too Fn2 = fun(0) -> - 1; - (N) -> - N - end, + 1; + (N) -> + N + end, ok. indent_try_catch() -> try - io:format(stdout, "Parsing file ~s, ", - [St0#leex.xfile]), - {ok,Line3,REAs,Actions,St3} = - parse_rules(Xfile, Line2, Macs, St2) + io:format(stdout, "Parsing file ~s, ", + [St0#leex.xfile]), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2) catch - exit:{badarg,R} -> - foo(R), - io:format(stdout, - "ERROR reason ~p~n", - R); - error:R % AD added clause - when R =:= 42 -> % when should be indented - foo(R); - error:R % AD added clause - when % when should be indented - R =:= 42 -> % but unsure about this (maybe 2 more) - foo(R); - error:R when % AD added clause - R =:= foo -> % line should be 2 indented (works) - foo(R); - error:R -> - foo(R), - io:format(stdout, - "ERROR reason ~p~n", - R) + exit:{badarg,R} -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R); + error:R % AD added clause + when R =:= 42 -> % when should be indented + foo(R); + error:R % AD added clause + when % when should be indented + R =:= 42 -> % but unsure about this (maybe 2 more) + foo(R); + error:R when % AD added clause + R =:= foo -> % line should be 2 indented (works) + foo(R); + error:R -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R) after - foo('after'), - file:close(Xfile) + foo('after'), + file:close(Xfile) end; indent_try_catch() -> try - foo(bar) + foo(bar) of - X when true andalso - kalle -> - io:format(stdout, "Parsing file ~s, ", - [St0#leex.xfile]), - {ok,Line3,REAs,Actions,St3} = - parse_rules(Xfile, Line2, Macs, St2); - X % AD added clause - when false andalso % when should be 2 indented - bengt -> - gurka(); - X when % AD added clause - false andalso % line should be 2 indented - not bengt -> - gurka(); - X -> - io:format(stdout, "Parsing file ~s, ", - [St0#leex.xfile]), - {ok,Line3,REAs,Actions,St3} = - parse_rules(Xfile, Line2, Macs, St2) + X when true andalso + kalle -> + io:format(stdout, "Parsing file ~s, ", + [St0#leex.xfile]), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2); + X % AD added clause + when false andalso % when should be 2 indented + bengt -> + gurka(); + X when % AD added clause + false andalso % line should be 2 indented + not bengt -> + gurka(); + X -> + io:format(stdout, "Parsing file ~s, ", + [St0#leex.xfile]), + {ok,Line3,REAs,Actions,St3} = + parse_rules(Xfile, Line2, Macs, St2) catch - exit:{badarg,R} -> - foo(R), - io:format(stdout, - "ERROR reason ~p~n", - R); - error:R -> - foo(R), - io:format(stdout, - "ERROR reason ~p~n", - R) + exit:{badarg,R} -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R); + error:R -> + foo(R), + io:format(stdout, + "ERROR reason ~p~n", + R) after - foo('after'), - file:close(Xfile), - bar(with_long_arg, - with_second_arg) + foo('after'), + file:close(Xfile), + bar(with_long_arg, + with_second_arg) end; indent_try_catch() -> try foo() - after - foo(), - bar(with_long_arg, - with_second_arg) + after + foo(), + bar(with_long_arg, + with_second_arg) end. indent_catch() -> D = B + - float(43.1), + float(43.1), B = catch oskar(X), - A = catch (baz + - bax), + A = catch (baz + + bax), catch foo(), - C = catch B + - float(43.1), + C = catch B + + float(43.1), case catch foo(X) of - A -> - B + A -> + B end, case - catch foo(X) + catch foo(X) of - A -> - B + A -> + B end, case - foo(X) + foo(X) of - A -> - catch B, - X + A -> + catch B, + X end, try sune of - _ -> foo + _ -> foo catch _:_ -> baf end, try - sune + sune of - _ -> - X = 5, - (catch foo(X)), - X + 10 + _ -> + X = 5, + (catch foo(X)), + X + 10 catch _:_ -> baf end, try - (catch sune) + (catch sune) of - _ -> - catch foo() %% BUGBUG can't handle catch inside try without parentheses + _ -> + catch foo() %% BUGBUG can't handle catch inside try without parentheses catch _:_ -> - baf + baf end, try - (catch exit()) + (catch exit()) catch - _ -> - catch baf() + _ -> + catch baf() end, ok. indent_binary() -> X = lists:foldr(fun(M) -> - <<Ma/binary, " ">> - end, [], A), + <<Ma/binary, " ">> + end, [], A), A = <<X/binary, 0:8>>, B. indent_comprehensions() -> - %% I don't have a good idea how we want to handle this + %% I don't have a good idea how we want to handle this %% but they are here to show how they are indented today. - Result1 = [X || - #record{a=X} <- lists:seq(1, 10), - true = (X rem 2) - ], + Result1 = [X || + #record{a=X} <- lists:seq(1, 10), + true = (X rem 2) + ], Result2 = [X || <<X:32,_:32>> <= <<0:512>>, - true = (X rem 2) - ], + true = (X rem 2) + ], - Binary1 = << <<X:8>> || - #record{a=X} <- lists:seq(1, 10), - true = (X rem 2) - >>, + Binary1 = << <<X:8>> || + #record{a=X} <- lists:seq(1, 10), + true = (X rem 2) + >>, Binary2 = << <<X:8>> || <<X:32,_:32>> <= <<0:512>>, - true = (X rem 2) - >>, + true = (X rem 2) + >>, ok. %% This causes an error in earlier erlang-mode versions. foo() -> [#foo{ - foo = foo}]. + foo = foo}]. %% Record indentation some_function_with_a_very_long_name() -> @@ -704,20 +704,20 @@ some_function_with_a_very_long_name() -> field1=a, field2=b}, case dummy_function_with_a_very_very_long_name(x) of - #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{ - field1=a, - field2=b} -> - ok; - Var = #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{ - field1=a, - field2=b} -> - Var#'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{ - field1=a, - field2=b}; - #xyz{ - a=1, - b=2} -> - ok + #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{ + field1=a, + field2=b} -> + ok; + Var = #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{ + field1=a, + field2=b} -> + Var#'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{ + field1=a, + field2=b}; + #xyz{ + a=1, + b=2} -> + ok end. another_function_with_a_very_very_long_name() -> @@ -726,45 +726,45 @@ another_function_with_a_very_very_long_name() -> field2=1}. some_function_name_xyz(xyzzy, #some_record{ - field1=Field1, - field2=Field2}) -> + field1=Field1, + field2=Field2}) -> SomeVariable = f(#'Some-long-record-name'{ - field_a = 1, - 'inter-xyz-parameters' = - #'Some-other-very-long-record-name'{ - field2 = Field1, - field2 = Field2}}), + field_a = 1, + 'inter-xyz-parameters' = + #'Some-other-very-long-record-name'{ + field2 = Field1, + field2 = Field2}}), {ok, SomeVariable}. commas_first() -> {abc, [ {some_var, 1} - , {some_other_var, 2} - , {erlang_ftw, 9} - , {erlang_cookie, 'cookie'} - , {cmds, - [ {one, "sudo ls"} - , {one, "sudo ls"} - , {two, "sudo ls"} - , {three, "sudo ls"} - , {four, "sudo ls"} - , {three, "sudo ls"} - ] } - , {ssh_username, "yow"} - , {cluster, - [ {aaaa, [ {"10.198.55.12" , "" } - , {"10.198.55.13" , "" } - ] } - , {bbbb, [ {"10.198.55.151", "" } - , {"10.198.55.123", "" } - , {"10.198.55.34" , "" } - , {"10.198.55.85" , "" } - , {"10.198.55.67" , "" } - ] } - , {cccc, [ {"10.198.55.68" , "" } - , {"10.198.55.69" , "" } - ] } - ] } - ] + , {some_other_var, 2} + , {erlang_ftw, 9} + , {erlang_cookie, 'cookie'} + , {cmds, + [ {one, "sudo ls"} + , {one, "sudo ls"} + , {two, "sudo ls"} + , {three, "sudo ls"} + , {four, "sudo ls"} + , {three, "sudo ls"} + ] } + , {ssh_username, "yow"} + , {cluster, + [ {aaaa, [ {"10.198.55.12" , "" } + , {"10.198.55.13" , "" } + ] } + , {bbbb, [ {"10.198.55.151", "" } + , {"10.198.55.123", "" } + , {"10.198.55.34" , "" } + , {"10.198.55.85" , "" } + , {"10.198.55.67" , "" } + ] } + , {cccc, [ {"10.198.55.68" , "" } + , {"10.198.55.69" , "" } + ] } + ] } + ] }. @@ -776,9 +776,9 @@ commas_first() -> %% body, due to the function name being mistaken for a keyword catcher(N) -> try generate_exception(N) of - Val -> {N, normal, Val} + Val -> {N, normal, Val} catch - throw:X -> {N, caught, thrown, X}; - exit:X -> {N, caught, exited, X}; - error:X -> {N, caught, error, X} + throw:X -> {N, caught, thrown, X}; + exit:X -> {N, caught, exited, X}; + error:X -> {N, caught, error, X} end. diff --git a/lib/tools/emacs/test.erl.orig b/lib/tools/emacs/test.erl.orig index 2552c71baf..c0cf1749b6 100644 --- a/lib/tools/emacs/test.erl.orig +++ b/lib/tools/emacs/test.erl.orig @@ -1,4 +1,4 @@ -%% -*- erlang -*- +%% -*- Mode: erlang; indent-tabs-mode: nil -*- %% %% %CopyrightBegin% %% @@ -27,7 +27,7 @@ %%% Created : 6 Oct 2009 by Dan Gudmundsson <[email protected]> %%%------------------------------------------------------------------- -%% Start off with syntax highlighting you have to verify this by looking here +%% Start off with syntax highlighting you have to verify this by looking here %% and see that the code looks alright -module(test). @@ -44,18 +44,18 @@ foo() -> %% Module attributes should be highlighted -export([t/1]). --record(record1, {a, - b, +-record(record1, {a, + b, c }). -record(record2, { a, b }). - + -record(record3, {a = 8#42423 bor 8#4234, - b = 8#5432 + b = 8#5432 bor 2#1010101 c = 123 + 234, @@ -64,7 +64,7 @@ foo() -> -record(record4, { a = 8#42423 bor 8#4234, - b = 8#5432 + b = 8#5432 bor 2#1010101 c = 123 + 234, @@ -79,31 +79,31 @@ foo() -> -spec t(integer()) -> any(). --type ann() :: Var :: integer(). --type ann2() :: Var :: - 'return' - | 'return_white_spaces' +-type ann() :: Var :: integer(). +-type ann2() :: Var :: + 'return' + | 'return_white_spaces' | 'return_comments' - | 'text' | ann(). --type paren() :: - (ann2()). --type t1() :: atom(). --type t2() :: [t1()]. --type t3(Atom) :: integer(Atom). --type t4() :: t3(foobar). --type t5() :: {t1(), t3(foo)}. --type t6() :: 1 | 2 | 3 | - 'foo' | 'bar'. --type t7() :: []. --type t71() :: [_]. + | 'text' | ann(). +-type paren() :: + (ann2()). +-type t1() :: atom(). +-type t2() :: [t1()]. +-type t3(Atom) :: integer(Atom). +-type t4() :: t3(foobar). +-type t5() :: {t1(), t3(foo)}. +-type t6() :: 1 | 2 | 3 | + 'foo' | 'bar'. +-type t7() :: []. +-type t71() :: [_]. -type t8() :: {any(),none(),pid(),port(), - reference(),float()}. --type t9() :: [1|2|3|foo|bar] | - list(a | b | c) | t71(). --type t10() :: {1|2|3|foo|t9()} | {}. --type t11() :: 1..2. --type t13() :: maybe_improper_list(integer(), t11()). --type t14() :: [erl_scan:foo() | + reference(),float()}. +-type t9() :: [1|2|3|foo|bar] | + list(a | b | c) | t71(). +-type t10() :: {1|2|3|foo|t9()} | {}. +-type t11() :: 1..2. +-type t13() :: maybe_improper_list(integer(), t11()). +-type t14() :: [erl_scan:foo() | %% Should be highlighted term() | bool() | @@ -122,31 +122,31 @@ foo() -> timeout() | no_return() | %% Should not be highlighted - nonempty_() | nonlist() | + nonempty_() | nonlist() | erl_scan:bar(34, 92) | t13() | m:f(integer() | <<_:_*16>>)]. -type t15() :: {binary(),<<>>,<<_:34>>,<<_:_*42>>, <<_:3,_:_*14>>,<<>>} | [<<>>|<<_:34>>|<<_:16>>| <<_:3,_:_*1472>>|<<_:19,_:_*14>>| <<_:34>>| -<<_:34>>|<<_:34>>|<<_:34>>]. --type t16() :: fun(). --type t17() :: fun((...) -> paren()). --type t18() :: fun(() -> t17() | t16()). +<<_:34>>|<<_:34>>|<<_:34>>]. +-type t16() :: fun(). +-type t17() :: fun((...) -> paren()). +-type t18() :: fun(() -> t17() | t16()). -type t19() :: fun((t18()) -> t16()) | fun((nonempty_maybe_improper_list('integer', any())| 1|2|3|a|b|<<_:3,_:_*14>>|integer()) -> nonempty_maybe_improper_list('integer', any())| -1|2|3|a|b|<<_:3,_:_*14>>|integer()). --type t20() :: [t19(), ...]. --type t21() :: tuple(). --type t21(A) :: A. --type t22() :: t21(integer()). --type t23() :: #rec1{}. --type t24() :: #rec2{a :: t23(), b :: [atom()]}. --type t25() :: #rec3{f123 :: [t24() | -1|2|3|4|a|b|c|d| -nonempty_maybe_improper_list(integer, any())]}. +1|2|3|a|b|<<_:3,_:_*14>>|integer()). +-type t20() :: [t19(), ...]. +-type t21() :: tuple(). +-type t21(A) :: A. +-type t22() :: t21(integer()). +-type t23() :: #rec1{}. +-type t24() :: #rec2{a :: t23(), b :: [atom()]}. +-type t25() :: #rec3{f123 :: [t24() | +1|2|3|4|a|b|c|d| +nonempty_maybe_improper_list(integer, any())]}. -type t26() :: #rec4{ a :: integer() , b :: any() }. @@ -155,7 +155,7 @@ nonempty_maybe_improper_list(integer, any())]}. }. -type t99() :: {t2(),t4(),t5(),t6(),t7(),t8(),t10(),t14(), -t15(),t20(),t21(), t22(),t25()}. +t15(),t20(),t21(), t22(),t25()}. -spec t1(FooBar :: t99()) -> t99(); (t2()) -> t2(); (t4()) -> t4() when is_subtype(t4(), t24); @@ -169,21 +169,21 @@ t15(),t20(),t21(), t22(),t25()}. (A :: atom()) -> R2 :: foo:atomen(); (T :: tuple()) -> R3 :: bar:typen(). --spec mod:t2() -> any(). +-spec mod:t2() -> any(). --spec handle_cast(Cast :: {'exchange', node(), [[name(),...]]} +-spec handle_cast(Cast :: {'exchange', node(), [[name(),...]]} | {'del_member', name(), pid()}, #state{}) -> {'noreply', #state{}}. --spec handle_cast(Cast :: - {'exchange', node(), [[name(),...]]} +-spec handle_cast(Cast :: + {'exchange', node(), [[name(),...]]} | {'del_member', name(), pid()}, #state{}) -> {'noreply', #state{}}. -spec all(fun((T) -> boolean()), List :: [T]) -> boolean() when is_subtype(T, term()). % (*) --spec get_closest_pid(term()) -> +-spec get_closest_pid(term()) -> Return :: pid() | {'error', {'no_process', term()} | {'no_such_group', term()}}. @@ -192,23 +192,23 @@ t15(),t20(),t21(), t22(),t25()}. , Y :: integer() ) -> integer(). --opaque attributes_data() :: +-opaque attributes_data() :: [{'column', column()} | {'line', info_line()} | - {'text', string()}] | {line(),column()}. + {'text', string()}] | {line(),column()}. -record(r,{ f1 :: attributes_data(), -f222 = foo:bar(34, #rec3{}, 234234234423, - aassdsfsdfsdf, 2234242323) :: -[t24() | 1|2|3|4|a|b|c|d| +f222 = foo:bar(34, #rec3{}, 234234234423, + aassdsfsdfsdf, 2234242323) :: +[t24() | 1|2|3|4|a|b|c|d| nonempty_maybe_improper_list(integer, any())], -f333 :: [t24() | 1|2|3|4|a|b|c|d| +f333 :: [t24() | 1|2|3|4|a|b|c|d| nonempty_maybe_improper_list(integer, any())], f3 = x:y(), f4 = x:z() :: t99(), f17 :: 'undefined', f18 :: 1 | 2 | 'undefined', f19 = 3 :: integer()|undefined, -f5 = 3 :: undefined|integer()}). +f5 = 3 :: undefined|integer()}). -record(state, { sequence_number = 1 :: integer() @@ -230,12 +230,12 @@ highlighting(X) % Function definitions should be highlighted '#1',atom, $", atom, % atom should be ok - $', atom, - + $', atom, + "string$", atom, "string$", atom, % currently buggy I know... "string\$", atom, % workaround for bug above - - "char $in string", atom, + + "char $in string", atom, 'atom$', atom, 'atom$', atom, 'atom\$', atom, @@ -270,18 +270,18 @@ highlighting(X) % Function definitions should be highlighted erlang:anything(lists), %% Guards is_atom(foo), is_float(2.3), is_integer(32), is_number(4323.3), - is_function(Fun), is_pid(self()), + is_function(Fun), is_pid(self()), not_a_guard:is_list([]), %% Other Types atom, % not (currently) hightlighted - 234234, + 234234, 234.43, - [list, are, not, higlighted], + [list, are, not, higlighted], {nor, is, tuple}, ok. - + %%% %%% Indentation %%% @@ -293,32 +293,32 @@ highlighting(X) % Function definitions should be highlighted % Right -indent_basics(X, Y, Z) +indent_basics(X, Y, Z) when X > 42, Z < 13; Y =:= 4711 -> %% comments % right comments - case lists:filter(fun(_, AlongName, - B, + case lists:filter(fun(_, AlongName, + B, C) -> true - end, + end, [a,v,b]) of [] -> Y = 5 * 43, ok; - [_|_] -> + [_|_] -> Y = 5 * 43, ok end, Y, %% List, tuples and binaries - [a, + [a, b, c ], - [ a, + [ a, b, c ], @@ -326,10 +326,10 @@ Y =:= 4711 -> a, b ], - {a, + {a, b,c }, - { a, + { a, b,c }, @@ -337,7 +337,7 @@ Y =:= 4711 -> a, b }, - + <<1:8, 2:8 >>, @@ -359,21 +359,21 @@ Y =:= 4711 -> c ), - + ( a, b, c ), - call(2#42423 bor + call(2#42423 bor #4234, 2#5432, other_arg), ok; -indent_basics(Xlongname, +indent_basics(Xlongname, #struct{a=Foo, - b=Bar}, + b=Bar}, [X| Y]) -> testing_next_clause, @@ -451,13 +451,13 @@ indent_icr(Z) -> % icr = if case receive %% receive - receive + receive {Z,_,_} -> X = 43 div 4, foo(X); Z -> X = 43 div 4, - foo(X) + foo(X) end, receive {Z,_,_} -> @@ -473,33 +473,33 @@ indent_icr(Z) -> % icr = if case receive foo(X); Z -> X = 43 div 4, - foo(X) + foo(X) after infinity -> foo(X), asd(X), 5*43 end, receive - after 10 -> + after 10 -> foo(X), asd(X), 5*43 end, ok. - + indent_fun() -> %% Changed fun to one indention level -Var = spawn(fun(X) +Var = spawn(fun(X) when X == 2; - X > 10 -> + X > 10 -> hello, - case Hello() of - true when is_atom(X) -> + case Hello() of + true when is_atom(X) -> foo; false -> bar end; - (Foo) when is_atom(Foo), + (Foo) when is_atom(Foo), is_integer(X) -> X = 6* 45, Y = true andalso @@ -522,14 +522,14 @@ Fact(0) -> indent_try_catch() -> try - io:format(stdout, "Parsing file ~s, ", + io:format(stdout, "Parsing file ~s, ", [St0#leex.xfile]), - {ok,Line3,REAs,Actions,St3} = + {ok,Line3,REAs,Actions,St3} = parse_rules(Xfile, Line2, Macs, St2) catch exit:{badarg,R} -> foo(R), - io:format(stdout, + io:format(stdout, "ERROR reason ~p~n", R); error:R % AD added clause @@ -544,7 +544,7 @@ indent_try_catch() -> foo(R); error:R -> foo(R), - io:format(stdout, + io:format(stdout, "ERROR reason ~p~n", R) after @@ -577,12 +577,12 @@ indent_try_catch() -> catch exit:{badarg,R} -> foo(R), - io:format(stdout, + io:format(stdout, "ERROR reason ~p~n", R); error:R -> foo(R), - io:format(stdout, + io:format(stdout, "ERROR reason ~p~n", R) after @@ -593,7 +593,7 @@ indent_try_catch() -> end; indent_try_catch() -> try foo() - after + after foo(), bar(with_long_arg, with_second_arg) @@ -602,16 +602,16 @@ indent_try_catch() -> indent_catch() -> D = B + float(43.1), - + B = catch oskar(X), - - A = catch (baz + + + A = catch (baz + bax), catch foo(), - C = catch B + + C = catch B + float(43.1), - + case catch foo(X) of A -> B @@ -673,9 +673,9 @@ indent_binary() -> indent_comprehensions() -> -%% I don't have a good idea how we want to handle this +%% I don't have a good idea how we want to handle this %% but they are here to show how they are indented today. -Result1 = [X || +Result1 = [X || #record{a=X} <- lists:seq(1, 10), true = (X rem 2) ], @@ -683,7 +683,7 @@ Result2 = [X || <<X:32,_:32>> <= <<0:512>>, true = (X rem 2) ], -Binary1 = << <<X:8>> || +Binary1 = << <<X:8>> || #record{a=X} <- lists:seq(1, 10), true = (X rem 2) >>, diff --git a/lib/tools/src/fprof.erl b/lib/tools/src/fprof.erl index 1291a3e5ec..d1a4624419 100644 --- a/lib/tools/src/fprof.erl +++ b/lib/tools/src/fprof.erl @@ -1702,6 +1702,12 @@ trace_handler({trace_ts, Pid, send, _OtherPid, _Msg, TS} = Trace, dump_stack(Dump, get(Pid), Trace), TS; %% +%% send_to_non_existing_process +trace_handler({trace_ts, Pid, send_to_non_existing_process, _OtherPid, _Msg, TS} = Trace, + _Table, _, Dump) -> + dump_stack(Dump, get(Pid), Trace), + TS; +%% %% 'receive' trace_handler({trace_ts, Pid, 'receive', _Msg, TS} = Trace, _Table, _, Dump) -> diff --git a/lib/wx/api_gen/gl_gen_erl.erl b/lib/wx/api_gen/gl_gen_erl.erl index 1be8d775be..1f9407525d 100644 --- a/lib/wx/api_gen/gl_gen_erl.erl +++ b/lib/wx/api_gen/gl_gen_erl.erl @@ -116,7 +116,7 @@ gl_api(Fs) -> w("call(Op, Args) ->~n", []), w(" Port = get(opengl_port), ~n", []), w(" _ = erlang:port_control(Port,Op,Args),~n", []), - w(" rec().~n", []), + w(" rec(Op).~n", []), w(" ~n", []), w("%% @hidden~n", []), w("cast(Op, Args) ->~n", []), @@ -125,11 +125,15 @@ gl_api(Fs) -> w(" ok.~n", []), w(" ~n", []), w("%% @hidden~n", []), - w("rec() ->~n", []), - w(" receive ~n", []), + w("rec(Op) ->~n", []), + w(" receive~n", []), w(" {'_egl_result_', Res} -> Res;~n", []), - w(" {'_egl_error_', Op, Res} -> error({error,Res,Op})~n", []), - w(" end. ~n", []), + w(" {'_egl_error_', Op, Res} -> error({error,Res,Op});~n", []), + w(" {'_egl_error_', Other, Res} ->~n ", []), + w(" Err = io_lib:format(\"~~p in op: ~~p\", [Res, Other]),~n", []), + w(" error_logger:error_report([{gl, error}, {message, lists:flatten(Err)}]),~n", []), + w(" rec(Op)~n", []), + w(" end.~n", []), w("~n", []), w("%% @hidden~n", []), w("send_bin(Bin) when is_binary(Bin) ->~n", []), diff --git a/lib/wx/api_gen/wx_doxygen.conf b/lib/wx/api_gen/wx_doxygen.conf index f4d3c99ec0..a96db00254 100644 --- a/lib/wx/api_gen/wx_doxygen.conf +++ b/lib/wx/api_gen/wx_doxygen.conf @@ -252,7 +252,7 @@ PREDEFINED = \ wxUSE_POPUPWIN=1 \ wxUSE_SYSTEM_OPTIONS=1 \ wxUSE_INTL=1 \ - wxABI_VERSION=20809 \ + wxABI_VERSION=20812 \ __WXGTK24__=1 \ __WXGTK20__=1 \ __WXGTK__=1 \ diff --git a/lib/wx/api_gen/wx_extra/added_func.h b/lib/wx/api_gen/wx_extra/added_func.h index 417188cc8a..bffe391140 100644 --- a/lib/wx/api_gen/wx_extra/added_func.h +++ b/lib/wx/api_gen/wx_extra/added_func.h @@ -34,8 +34,13 @@ class wxToolBar { }; -class wxWindow { +/* class wxWindow { */ +/* public: */ +/* bool IsDoubleBuffered(); */ +/* void SetDoubleBuffered(bool on); */ +/* }; */ + +class wxWindowGTK { public: - bool IsDoubleBuffered(); - void SetDoubleBuffered(bool on); + double GetContentScaleFactor(); }; diff --git a/lib/wx/api_gen/wx_gen.erl b/lib/wx/api_gen/wx_gen.erl index cfae2197f8..6979a600f3 100644 --- a/lib/wx/api_gen/wx_gen.erl +++ b/lib/wx/api_gen/wx_gen.erl @@ -271,33 +271,31 @@ parse_attr1([{{attr,_}, #xmlElement{content=C, attributes=Attrs}}|R], AttrList0, #param{where=nowhere} -> parse_attr1(R,AttrList0,Opts,Res); _ -> - case keysearch(prot, #xmlAttribute.name, Attrs) of - {value, #xmlAttribute{value = "public"}} -> - {Acc,AttrList} = attr_acc(Param0, AttrList0), - parse_attr1(R,AttrList,Opts, - [Param0#param{in=false,prot=public,acc=Acc}|Res]); - {value, #xmlAttribute{value = "protected"}} -> - {Acc,AttrList} = attr_acc(Param0, AttrList0), - parse_attr1(R,AttrList,Opts, - [Param0#param{in=false,prot=protected,acc=Acc}|Res]); - {value, #xmlAttribute{value = "private"}} -> - {Acc,AttrList} = attr_acc(Param0, AttrList0), - parse_attr1(R,AttrList,Opts, - [Param0#param{in=false,prot=private,acc=Acc}|Res]) - end + {value, #xmlAttribute{value=Type}} = + keysearch(prot, #xmlAttribute.name, Attrs), + {Param,AttrList} = attr_acc(Param0, list_to_atom(Type), AttrList0), + parse_attr1(R,AttrList,Opts,[Param|Res]) end; parse_attr1([{_Id,_}|R],AttrList,Info, Res) -> parse_attr1(R,AttrList,Info, Res); parse_attr1([],Left,_, Res) -> {reverse(Res), Left}. -attr_acc(#param{name=N}, List) -> +attr_acc(#param{name=N}=P, Type, List) -> Name = list_to_atom(N), case get_value(Name, List, undefined) of - undefined -> {undefined, List}; - Val -> {Val, lists:keydelete(Name,1,List)} + undefined -> {P#param{in=false,prot=Type,acc=undefined}, List}; + Val when is_list(Val), is_integer(hd(Val)) -> + %% Function String + {P#param{in=false,prot=Type,acc=Val}, lists:keydelete(Name,1,List)}; + OptList when is_list(OptList) -> + Param = foldl(fun handle_param_opt/2,P,OptList), + {Param#param{in=false,prot=Type,acc=undefined}, + lists:keydelete(Name,1,List)}; + Val -> + {P#param{in=false,prot=Type,acc=Val}, lists:keydelete(Name,1,List)} end. - + load_members(FileName, Class, Defs, Tab, Type,Opts) -> File = filename:join(["wx_xml",FileName ++ ".xml"]), put({loaded, FileName}, true), diff --git a/lib/wx/api_gen/wx_gen_cpp.erl b/lib/wx/api_gen/wx_gen_cpp.erl index 84d3990786..0a0b1f9209 100644 --- a/lib/wx/api_gen/wx_gen_cpp.erl +++ b/lib/wx/api_gen/wx_gen_cpp.erl @@ -1079,6 +1079,13 @@ build_ret(Name,_,#type{base=string,single=true}) -> w(" rt.add(~s);~n",[Name]); build_ret(Name,_,#type{name="wxArrayString", single=array}) -> w(" rt.add(~s);~n", [Name]); +build_ret(Name,_,#type{name="wxString", single={list,Variable}}) -> + Obj = case Name of + "ev->" ++ _ -> "ev"; + _ -> "This" + end, + w(" wxArrayString tmpArrayStr(~s->~s, ~s);~n", [Obj,Variable,Name]), + w(" rt.add(tmpArrayStr);~n", []); build_ret(Name,In,T) -> ?error({nyi, Name,In, T}). diff --git a/lib/wx/api_gen/wx_gen_erl.erl b/lib/wx/api_gen/wx_gen_erl.erl index 794de25002..e272c08d90 100644 --- a/lib/wx/api_gen/wx_gen_erl.erl +++ b/lib/wx/api_gen/wx_gen_erl.erl @@ -649,7 +649,7 @@ guard_test(#param{def=Def}) when Def =/= none -> skip; guard_test(#param{where=c}) -> skip; guard_test(#param{in=In}) when In == false -> skip; guard_test(#param{name=N, type=#type{base=string}}) -> - "is_list(" ++ erl_arg_name(N) ++")"; + "?is_chardata(" ++ erl_arg_name(N) ++")"; guard_test(#param{name=N, type=#type{name="wxArtClient"}}) -> "is_list(" ++ erl_arg_name(N) ++")"; guard_test(#param{name=N, type=#type{name="wxArrayString"}}) -> @@ -801,8 +801,13 @@ doc_arg_type(_, _) -> skip. doc_arg_type2(T) -> doc_arg_type2(T, in). -doc_arg_type2(T=#type{single=Single}, Out) when Single =:= array; Single =:= list -> - "[" ++ doc_arg_type3(T, Out) ++ "]"; +doc_arg_type2(T=#type{single=Single}, Out) -> + case Single of + array -> "[" ++ doc_arg_type3(T, Out) ++ "]"; + list -> "[" ++ doc_arg_type3(T, Out) ++ "]"; + {list, _} -> "[" ++ doc_arg_type3(T, Out) ++ "]"; + true -> doc_arg_type3(T, Out) + end; doc_arg_type2(T, Out) -> doc_arg_type3(T, Out). @@ -1207,7 +1212,7 @@ gen_event_recs() -> w("-type wx() :: #wx{}. %% wx event record ~n",[]), w("%% Here comes the definitions of all event records.~n" "%% they contain the event type and possible some extra information.~n~n",[]), - Events = [build_event_rec(C) || {_,C=#class{event=Evs}} <- get(), Evs =/= false], + Events = [build_event_rec(C) || {_,C=#class{event=Evs}} <- lists:sort(get()), Evs =/= false], EventSubTypes = [Type || {_Rec, Type} <- Events], EventRecs = [Rec || {Rec, _Type} <- Events], w("-type event() :: ~s.~n", diff --git a/lib/wx/api_gen/wxapi.conf b/lib/wx/api_gen/wxapi.conf index 786e536f93..a0dfa61dd1 100644 --- a/lib/wx/api_gen/wxapi.conf +++ b/lib/wx/api_gen/wxapi.conf @@ -104,7 +104,8 @@ 'Center','CenterOnParent','Centre','CentreOnParent','ClearBackground', {'ClientToScreen',[{"x",both},{"y",both}]}, 'Close', 'ConvertDialogToPixels','ConvertPixelsToDialog','Destroy','DestroyChildren', - 'Disable',%%'DoGetBestSize','DoUpdateWindowUI', 'DragAcceptFiles', + 'Disable',%%'DoGetBestSize','DoUpdateWindowUI', + {'DragAcceptFiles', [{test_if, "wxCHECK_VERSION(2,8,10)"}]}, 'Enable', 'FindFocus','FindWindow','FindWindowById','FindWindowByName','FindWindowByLabel', 'Fit','FitInside','Freeze', 'GetAcceleratorTable', % 'GetAccessible', @@ -154,7 +155,8 @@ {'SetTransparent', [{test_if, "wxCHECK_VERSION(2,8,12)"}]}, {'CanSetTransparent', [{test_if, "wxCHECK_VERSION(2,8,12)"}]}, {'IsDoubleBuffered', [{test_if, "wxCHECK_VERSION(3,0,0)"}]}, - {'SetDoubleBuffered', [{test_if, "wxCHECK_VERSION(3,0,0) && !defined(__WXMAC__)"}]} + {'SetDoubleBuffered', [{test_if, "wxCHECK_VERSION(3,0,0) && !defined(__WXMAC__)"}]}, + {'GetContentScaleFactor', [{test_if, "wxCHECK_VERSION(2,9,5)"}]} ]}. {class, wxTopLevelWindowGTK, wxWindow, @@ -1490,8 +1492,6 @@ ['ButtonDown','ButtonIsDown','ButtonUp','GetButtonChange','GetButtonState', 'GetJoystick','GetPosition','GetZPosition','IsButton','IsMove','IsZMove']}. -%% {class, wxDropFilesEvent, wxEvent, [{event,[wxEVT_DROP_FILES]}],[]}. %FIXME - {enum, wxUpdateUIMode, "wxUPDATE_UI_"}. {class, wxUpdateUIEvent, wxCommandEvent, @@ -1988,3 +1988,10 @@ {class, wxDCOverlay, root, [], ['wxDCOverlay', '~wxDCOverlay', 'Clear']}. + +{class, wxDropFilesEvent, wxEvent, + [{acc, [{m_files, [{single, {list, 'm_noFiles'}}]}]}, + {event,[wxEVT_DROP_FILES]}], + ['GetPosition', 'GetNumberOfFiles', + {'GetFiles', [{return, [{single, {list, 'm_noFiles'}}]}]} + ]}. diff --git a/lib/wx/c_src/gen/wxe_events.cpp b/lib/wx/c_src/gen/wxe_events.cpp index 4affe2ba53..b6d3c2db18 100644 --- a/lib/wx/c_src/gen/wxe_events.cpp +++ b/lib/wx/c_src/gen/wxe_events.cpp @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2008-2015. All Rights Reserved. + * Copyright Ericsson AB 2008-2016. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -306,6 +306,7 @@ void initEventTable() {wxEVT_ACTIVATE_APP, 232, "activate_app"}, {wxEVT_HIBERNATE, 232, "hibernate"}, {wxEVT_MOUSE_CAPTURE_LOST, 235, "mouse_capture_lost"}, + {wxEVT_DROP_FILES, 238, "drop_files"}, {-1, 0, } }; for(int i=0; event_types[i].ev_type != -1; i++) { @@ -881,6 +882,18 @@ case 235: {// wxMouseCaptureLostEvent rt.addTupleCount(2); break; } +case 238: {// wxDropFilesEvent + wxDropFilesEvent * ev = (wxDropFilesEvent *) event; + evClass = (char*)"wxDropFilesEvent"; + rt.addAtom((char*)"wxDropFiles"); + rt.addAtom(Etype->eName); + rt.addInt(ev->m_noFiles); + rt.add(ev->m_pos); + wxArrayString tmpArrayStr(ev->m_noFiles, ev->m_files); + rt.add(tmpArrayStr); + rt.addTupleCount(5); + break; +} } rt.addTupleCount(5); diff --git a/lib/wx/c_src/gen/wxe_funcs.cpp b/lib/wx/c_src/gen/wxe_funcs.cpp index 4243d8a35a..5425e9f3cb 100644 --- a/lib/wx/c_src/gen/wxe_funcs.cpp +++ b/lib/wx/c_src/gen/wxe_funcs.cpp @@ -315,6 +315,15 @@ case wxWindow_Disable: { // wxWindow::Disable rt.addBool(Result); break; } +#if wxCHECK_VERSION(2,8,10) +case wxWindow_DragAcceptFiles: { // wxWindow::DragAcceptFiles + wxWindow *This = (wxWindow *) getPtr(bp,memenv); bp += 4; + bool * accept = (bool *) bp; bp += 4; + if(!This) throw wxe_badarg(0); + This->DragAcceptFiles(*accept); + break; +} +#endif case wxWindow_Enable: { // wxWindow::Enable bool enable=true; wxWindow *This = (wxWindow *) getPtr(bp,memenv); bp += 4; @@ -1707,6 +1716,15 @@ case wxWindow_SetDoubleBuffered: { // wxWindow::SetDoubleBuffered break; } #endif +#if wxCHECK_VERSION(2,9,5) +case wxWindow_GetContentScaleFactor: { // wxWindow::GetContentScaleFactor + wxWindow *This = (wxWindow *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + double Result = This->GetContentScaleFactor(); + rt.addFloat(Result); + break; +} +#endif case wxTopLevelWindow_GetIcon: { // wxTopLevelWindow::GetIcon wxTopLevelWindow *This = (wxTopLevelWindow *) getPtr(bp,memenv); bp += 4; if(!This) throw wxe_badarg(0); @@ -32049,6 +32067,28 @@ case wxDCOverlay_Clear: { // wxDCOverlay::Clear This->Clear(); break; } +case wxDropFilesEvent_GetPosition: { // wxDropFilesEvent::GetPosition + wxDropFilesEvent *This = (wxDropFilesEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxPoint Result = This->GetPosition(); + rt.add(Result); + break; +} +case wxDropFilesEvent_GetNumberOfFiles: { // wxDropFilesEvent::GetNumberOfFiles + wxDropFilesEvent *This = (wxDropFilesEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + int Result = This->GetNumberOfFiles(); + rt.addInt(Result); + break; +} +case wxDropFilesEvent_GetFiles: { // wxDropFilesEvent::GetFiles + wxDropFilesEvent *This = (wxDropFilesEvent *) getPtr(bp,memenv); bp += 4; + if(!This) throw wxe_badarg(0); + wxString * Result = (wxString*)This->GetFiles(); + wxArrayString tmpArrayStr(This->m_noFiles, Result); + rt.add(tmpArrayStr); + break; +} default: { wxeReturn error = wxeReturn(WXE_DRV_PORT, Ecmd.caller, false); error.addAtom("_wxe_error_"); error.addInt((int) op); diff --git a/lib/wx/c_src/gen/wxe_macros.h b/lib/wx/c_src/gen/wxe_macros.h index 82b39b49cd..f44fa57053 100644 --- a/lib/wx/c_src/gen/wxe_macros.h +++ b/lib/wx/c_src/gen/wxe_macros.h @@ -94,3332 +94,3337 @@ #define wxWindow_Destroy 123 #define wxWindow_DestroyChildren 124 #define wxWindow_Disable 125 -#define wxWindow_Enable 126 -#define wxWindow_FindFocus 127 -#define wxWindow_FindWindow_1_0 128 -#define wxWindow_FindWindow_1_1 129 -#define wxWindow_FindWindowById 130 -#define wxWindow_FindWindowByName 131 -#define wxWindow_FindWindowByLabel 132 -#define wxWindow_Fit 133 -#define wxWindow_FitInside 134 -#define wxWindow_Freeze 135 -#define wxWindow_GetAcceleratorTable 136 -#define wxWindow_GetBackgroundColour 137 -#define wxWindow_GetBackgroundStyle 138 -#define wxWindow_GetBestSize 139 -#define wxWindow_GetCaret 141 -#define wxWindow_GetCapture 142 -#define wxWindow_GetCharHeight 143 -#define wxWindow_GetCharWidth 144 -#define wxWindow_GetChildren 145 -#define wxWindow_GetClientSize 148 -#define wxWindow_GetContainingSizer 149 -#define wxWindow_GetCursor 150 -#define wxWindow_GetDropTarget 151 -#define wxWindow_GetEventHandler 152 -#define wxWindow_GetExtraStyle 153 -#define wxWindow_GetFont 154 -#define wxWindow_GetForegroundColour 155 -#define wxWindow_GetGrandParent 156 -#define wxWindow_GetHandle 157 -#define wxWindow_GetHelpText 158 -#define wxWindow_GetId 159 -#define wxWindow_GetLabel 160 -#define wxWindow_GetMaxSize 161 -#define wxWindow_GetMinSize 162 -#define wxWindow_GetName 163 -#define wxWindow_GetParent 164 -#define wxWindow_GetPosition 166 -#define wxWindow_GetRect 167 -#define wxWindow_GetScreenPosition 169 -#define wxWindow_GetScreenRect 170 -#define wxWindow_GetScrollPos 171 -#define wxWindow_GetScrollRange 172 -#define wxWindow_GetScrollThumb 173 -#define wxWindow_GetSize 175 -#define wxWindow_GetSizer 176 -#define wxWindow_GetTextExtent 177 -#define wxWindow_GetToolTip 178 -#define wxWindow_GetUpdateRegion 179 -#define wxWindow_GetVirtualSize 181 -#define wxWindow_GetWindowStyleFlag 183 -#define wxWindow_GetWindowVariant 184 -#define wxWindow_HasCapture 185 -#define wxWindow_HasScrollbar 186 -#define wxWindow_HasTransparentBackground 187 -#define wxWindow_Hide 188 -#define wxWindow_InheritAttributes 189 -#define wxWindow_InitDialog 190 -#define wxWindow_InvalidateBestSize 191 -#define wxWindow_IsEnabled 192 -#define wxWindow_IsExposed_2 193 -#define wxWindow_IsExposed_4 194 -#define wxWindow_IsExposed_1_0 195 -#define wxWindow_IsExposed_1_1 196 -#define wxWindow_IsRetained 197 -#define wxWindow_IsShown 198 -#define wxWindow_IsTopLevel 199 -#define wxWindow_Layout 200 -#define wxWindow_LineDown 201 -#define wxWindow_LineUp 202 -#define wxWindow_Lower 203 -#define wxWindow_MakeModal 204 -#define wxWindow_Move_3 205 -#define wxWindow_Move_2 206 -#define wxWindow_MoveAfterInTabOrder 207 -#define wxWindow_MoveBeforeInTabOrder 208 -#define wxWindow_Navigate 209 -#define wxWindow_PageDown 210 -#define wxWindow_PageUp 211 -#define wxWindow_PopEventHandler 212 -#define wxWindow_PopupMenu_2 213 -#define wxWindow_PopupMenu_3 214 -#define wxWindow_Raise 215 -#define wxWindow_Refresh 216 -#define wxWindow_RefreshRect 217 -#define wxWindow_ReleaseMouse 218 -#define wxWindow_RemoveChild 219 -#define wxWindow_Reparent 220 -#define wxWindow_ScreenToClient_2 221 -#define wxWindow_ScreenToClient_1 222 -#define wxWindow_ScrollLines 224 -#define wxWindow_ScrollPages 226 -#define wxWindow_ScrollWindow 227 -#define wxWindow_SetAcceleratorTable 228 -#define wxWindow_SetAutoLayout 229 -#define wxWindow_SetBackgroundColour 230 -#define wxWindow_SetBackgroundStyle 231 -#define wxWindow_SetCaret 232 -#define wxWindow_SetClientSize_2 233 -#define wxWindow_SetClientSize_1_0 234 -#define wxWindow_SetClientSize_1_1 235 -#define wxWindow_SetContainingSizer 236 -#define wxWindow_SetCursor 237 -#define wxWindow_SetMaxSize 238 -#define wxWindow_SetMinSize 239 -#define wxWindow_SetOwnBackgroundColour 240 -#define wxWindow_SetOwnFont 241 -#define wxWindow_SetOwnForegroundColour 242 -#define wxWindow_SetDropTarget 243 -#define wxWindow_SetExtraStyle 244 -#define wxWindow_SetFocus 245 -#define wxWindow_SetFocusFromKbd 246 -#define wxWindow_SetFont 247 -#define wxWindow_SetForegroundColour 248 -#define wxWindow_SetHelpText 249 -#define wxWindow_SetId 250 -#define wxWindow_SetLabel 252 -#define wxWindow_SetName 253 -#define wxWindow_SetPalette 254 -#define wxWindow_SetScrollbar 255 -#define wxWindow_SetScrollPos 256 -#define wxWindow_SetSize_5 257 -#define wxWindow_SetSize_2_0 258 -#define wxWindow_SetSize_1 259 -#define wxWindow_SetSize_2_1 260 -#define wxWindow_SetSizeHints_3 261 -#define wxWindow_SetSizeHints_2 262 -#define wxWindow_SetSizer 263 -#define wxWindow_SetSizerAndFit 264 -#define wxWindow_SetThemeEnabled 265 -#define wxWindow_SetToolTip_1_0 266 -#define wxWindow_SetToolTip_1_1 267 -#define wxWindow_SetVirtualSize_1 268 -#define wxWindow_SetVirtualSize_2 269 -#define wxWindow_SetVirtualSizeHints_3 270 -#define wxWindow_SetVirtualSizeHints_2 271 -#define wxWindow_SetWindowStyle 272 -#define wxWindow_SetWindowStyleFlag 273 -#define wxWindow_SetWindowVariant 274 -#define wxWindow_ShouldInheritColours 275 -#define wxWindow_Show 276 -#define wxWindow_Thaw 277 -#define wxWindow_TransferDataFromWindow 278 -#define wxWindow_TransferDataToWindow 279 -#define wxWindow_Update 280 -#define wxWindow_UpdateWindowUI 281 -#define wxWindow_Validate 282 -#define wxWindow_WarpPointer 283 -#define wxWindow_SetTransparent 284 -#define wxWindow_CanSetTransparent 285 -#define wxWindow_IsDoubleBuffered 286 -#define wxWindow_SetDoubleBuffered 287 -#define wxTopLevelWindow_GetIcon 288 -#define wxTopLevelWindow_GetIcons 289 -#define wxTopLevelWindow_GetTitle 290 -#define wxTopLevelWindow_IsActive 291 -#define wxTopLevelWindow_Iconize 292 -#define wxTopLevelWindow_IsFullScreen 293 -#define wxTopLevelWindow_IsIconized 294 -#define wxTopLevelWindow_IsMaximized 295 -#define wxTopLevelWindow_Maximize 296 -#define wxTopLevelWindow_RequestUserAttention 297 -#define wxTopLevelWindow_SetIcon 298 -#define wxTopLevelWindow_SetIcons 299 -#define wxTopLevelWindow_CenterOnScreen 300 -#define wxTopLevelWindow_CentreOnScreen 301 -#define wxTopLevelWindow_SetShape 303 -#define wxTopLevelWindow_SetTitle 304 -#define wxTopLevelWindow_ShowFullScreen 305 -#define wxFrame_new_4 307 -#define wxFrame_new_0 308 -#define wxFrame_destruct 310 -#define wxFrame_Create 311 -#define wxFrame_CreateStatusBar 312 -#define wxFrame_CreateToolBar 313 -#define wxFrame_GetClientAreaOrigin 314 -#define wxFrame_GetMenuBar 315 -#define wxFrame_GetStatusBar 316 -#define wxFrame_GetStatusBarPane 317 -#define wxFrame_GetToolBar 318 -#define wxFrame_ProcessCommand 319 -#define wxFrame_SendSizeEvent 320 -#define wxFrame_SetMenuBar 321 -#define wxFrame_SetStatusBar 322 -#define wxFrame_SetStatusBarPane 323 -#define wxFrame_SetStatusText 324 -#define wxFrame_SetStatusWidths 325 -#define wxFrame_SetToolBar 326 -#define wxMiniFrame_new_0 327 -#define wxMiniFrame_new_4 328 -#define wxMiniFrame_Create 329 -#define wxMiniFrame_destroy 330 -#define wxSplashScreen_new_0 331 -#define wxSplashScreen_new_6 332 -#define wxSplashScreen_destruct 333 -#define wxSplashScreen_GetSplashStyle 334 -#define wxSplashScreen_GetTimeout 335 -#define wxPanel_new_0 336 -#define wxPanel_new_6 337 -#define wxPanel_new_2 338 -#define wxPanel_destruct 339 -#define wxPanel_InitDialog 340 -#define wxPanel_SetFocusIgnoringChildren 341 -#define wxScrolledWindow_new_0 342 -#define wxScrolledWindow_new_2 343 -#define wxScrolledWindow_destruct 344 -#define wxScrolledWindow_CalcScrolledPosition_4 345 -#define wxScrolledWindow_CalcScrolledPosition_1 346 -#define wxScrolledWindow_CalcUnscrolledPosition_4 347 -#define wxScrolledWindow_CalcUnscrolledPosition_1 348 -#define wxScrolledWindow_EnableScrolling 349 -#define wxScrolledWindow_GetScrollPixelsPerUnit 350 -#define wxScrolledWindow_GetViewStart 351 -#define wxScrolledWindow_DoPrepareDC 352 -#define wxScrolledWindow_PrepareDC 353 -#define wxScrolledWindow_Scroll 354 -#define wxScrolledWindow_SetScrollbars 355 -#define wxScrolledWindow_SetScrollRate 356 -#define wxScrolledWindow_SetTargetWindow 357 -#define wxSashWindow_new_0 358 -#define wxSashWindow_new_2 359 -#define wxSashWindow_destruct 360 -#define wxSashWindow_GetSashVisible 361 -#define wxSashWindow_GetMaximumSizeX 362 -#define wxSashWindow_GetMaximumSizeY 363 -#define wxSashWindow_GetMinimumSizeX 364 -#define wxSashWindow_GetMinimumSizeY 365 -#define wxSashWindow_SetMaximumSizeX 366 -#define wxSashWindow_SetMaximumSizeY 367 -#define wxSashWindow_SetMinimumSizeX 368 -#define wxSashWindow_SetMinimumSizeY 369 -#define wxSashWindow_SetSashVisible 370 -#define wxSashLayoutWindow_new_0 371 -#define wxSashLayoutWindow_new_2 372 -#define wxSashLayoutWindow_Create 373 -#define wxSashLayoutWindow_GetAlignment 374 -#define wxSashLayoutWindow_GetOrientation 375 -#define wxSashLayoutWindow_SetAlignment 376 -#define wxSashLayoutWindow_SetDefaultSize 377 -#define wxSashLayoutWindow_SetOrientation 378 -#define wxSashLayoutWindow_destroy 379 -#define wxGrid_new_0 380 -#define wxGrid_new_3 381 -#define wxGrid_new_4 382 -#define wxGrid_destruct 383 -#define wxGrid_AppendCols 384 -#define wxGrid_AppendRows 385 -#define wxGrid_AutoSize 386 -#define wxGrid_AutoSizeColumn 387 -#define wxGrid_AutoSizeColumns 388 -#define wxGrid_AutoSizeRow 389 -#define wxGrid_AutoSizeRows 390 -#define wxGrid_BeginBatch 391 -#define wxGrid_BlockToDeviceRect 392 -#define wxGrid_CanDragColSize 393 -#define wxGrid_CanDragRowSize 394 -#define wxGrid_CanDragGridSize 395 -#define wxGrid_CanEnableCellControl 396 -#define wxGrid_CellToRect_2 397 -#define wxGrid_CellToRect_1 398 -#define wxGrid_ClearGrid 399 -#define wxGrid_ClearSelection 400 -#define wxGrid_CreateGrid 401 -#define wxGrid_DeleteCols 402 -#define wxGrid_DeleteRows 403 -#define wxGrid_DisableCellEditControl 404 -#define wxGrid_DisableDragColSize 405 -#define wxGrid_DisableDragGridSize 406 -#define wxGrid_DisableDragRowSize 407 -#define wxGrid_EnableCellEditControl 408 -#define wxGrid_EnableDragColSize 409 -#define wxGrid_EnableDragGridSize 410 -#define wxGrid_EnableDragRowSize 411 -#define wxGrid_EnableEditing 412 -#define wxGrid_EnableGridLines 413 -#define wxGrid_EndBatch 414 -#define wxGrid_Fit 415 -#define wxGrid_ForceRefresh 416 -#define wxGrid_GetBatchCount 417 -#define wxGrid_GetCellAlignment 418 -#define wxGrid_GetCellBackgroundColour 419 -#define wxGrid_GetCellEditor 420 -#define wxGrid_GetCellFont 421 -#define wxGrid_GetCellRenderer 422 -#define wxGrid_GetCellTextColour 423 -#define wxGrid_GetCellValue_2 424 -#define wxGrid_GetCellValue_1 425 -#define wxGrid_GetColLabelAlignment 426 -#define wxGrid_GetColLabelSize 427 -#define wxGrid_GetColLabelValue 428 -#define wxGrid_GetColMinimalAcceptableWidth 429 -#define wxGrid_GetDefaultCellAlignment 430 -#define wxGrid_GetDefaultCellBackgroundColour 431 -#define wxGrid_GetDefaultCellFont 432 -#define wxGrid_GetDefaultCellTextColour 433 -#define wxGrid_GetDefaultColLabelSize 434 -#define wxGrid_GetDefaultColSize 435 -#define wxGrid_GetDefaultEditor 436 -#define wxGrid_GetDefaultEditorForCell_2 437 -#define wxGrid_GetDefaultEditorForCell_1 438 -#define wxGrid_GetDefaultEditorForType 439 -#define wxGrid_GetDefaultRenderer 440 -#define wxGrid_GetDefaultRendererForCell 441 -#define wxGrid_GetDefaultRendererForType 442 -#define wxGrid_GetDefaultRowLabelSize 443 -#define wxGrid_GetDefaultRowSize 444 -#define wxGrid_GetGridCursorCol 445 -#define wxGrid_GetGridCursorRow 446 -#define wxGrid_GetGridLineColour 447 -#define wxGrid_GridLinesEnabled 448 -#define wxGrid_GetLabelBackgroundColour 449 -#define wxGrid_GetLabelFont 450 -#define wxGrid_GetLabelTextColour 451 -#define wxGrid_GetNumberCols 452 -#define wxGrid_GetNumberRows 453 -#define wxGrid_GetOrCreateCellAttr 454 -#define wxGrid_GetRowMinimalAcceptableHeight 455 -#define wxGrid_GetRowLabelAlignment 456 -#define wxGrid_GetRowLabelSize 457 -#define wxGrid_GetRowLabelValue 458 -#define wxGrid_GetRowSize 459 -#define wxGrid_GetScrollLineX 460 -#define wxGrid_GetScrollLineY 461 -#define wxGrid_GetSelectedCells 462 -#define wxGrid_GetSelectedCols 463 -#define wxGrid_GetSelectedRows 464 -#define wxGrid_GetSelectionBackground 465 -#define wxGrid_GetSelectionBlockTopLeft 466 -#define wxGrid_GetSelectionBlockBottomRight 467 -#define wxGrid_GetSelectionForeground 468 -#define wxGrid_GetViewWidth 469 -#define wxGrid_GetGridWindow 470 -#define wxGrid_GetGridRowLabelWindow 471 -#define wxGrid_GetGridColLabelWindow 472 -#define wxGrid_GetGridCornerLabelWindow 473 -#define wxGrid_HideCellEditControl 474 -#define wxGrid_InsertCols 475 -#define wxGrid_InsertRows 476 -#define wxGrid_IsCellEditControlEnabled 477 -#define wxGrid_IsCurrentCellReadOnly 478 -#define wxGrid_IsEditable 479 -#define wxGrid_IsInSelection_2 480 -#define wxGrid_IsInSelection_1 481 -#define wxGrid_IsReadOnly 482 -#define wxGrid_IsSelection 483 -#define wxGrid_IsVisible_3 484 -#define wxGrid_IsVisible_2 485 -#define wxGrid_MakeCellVisible_2 486 -#define wxGrid_MakeCellVisible_1 487 -#define wxGrid_MoveCursorDown 488 -#define wxGrid_MoveCursorLeft 489 -#define wxGrid_MoveCursorRight 490 -#define wxGrid_MoveCursorUp 491 -#define wxGrid_MoveCursorDownBlock 492 -#define wxGrid_MoveCursorLeftBlock 493 -#define wxGrid_MoveCursorRightBlock 494 -#define wxGrid_MoveCursorUpBlock 495 -#define wxGrid_MovePageDown 496 -#define wxGrid_MovePageUp 497 -#define wxGrid_RegisterDataType 498 -#define wxGrid_SaveEditControlValue 499 -#define wxGrid_SelectAll 500 -#define wxGrid_SelectBlock_5 501 -#define wxGrid_SelectBlock_3 502 -#define wxGrid_SelectCol 503 -#define wxGrid_SelectRow 504 -#define wxGrid_SetCellAlignment_4 505 -#define wxGrid_SetCellAlignment_3 506 -#define wxGrid_SetCellAlignment_1 507 -#define wxGrid_SetCellBackgroundColour_3_0 508 -#define wxGrid_SetCellBackgroundColour_1 509 -#define wxGrid_SetCellBackgroundColour_3_1 510 -#define wxGrid_SetCellEditor 511 -#define wxGrid_SetCellFont 512 -#define wxGrid_SetCellRenderer 513 -#define wxGrid_SetCellTextColour_3_0 514 -#define wxGrid_SetCellTextColour_3_1 515 -#define wxGrid_SetCellTextColour_1 516 -#define wxGrid_SetCellValue_3_0 517 -#define wxGrid_SetCellValue_2 518 -#define wxGrid_SetCellValue_3_1 519 -#define wxGrid_SetColAttr 520 -#define wxGrid_SetColFormatBool 521 -#define wxGrid_SetColFormatNumber 522 -#define wxGrid_SetColFormatFloat 523 -#define wxGrid_SetColFormatCustom 524 -#define wxGrid_SetColLabelAlignment 525 -#define wxGrid_SetColLabelSize 526 -#define wxGrid_SetColLabelValue 527 -#define wxGrid_SetColMinimalWidth 528 -#define wxGrid_SetColMinimalAcceptableWidth 529 -#define wxGrid_SetColSize 530 -#define wxGrid_SetDefaultCellAlignment 531 -#define wxGrid_SetDefaultCellBackgroundColour 532 -#define wxGrid_SetDefaultCellFont 533 -#define wxGrid_SetDefaultCellTextColour 534 -#define wxGrid_SetDefaultEditor 535 -#define wxGrid_SetDefaultRenderer 536 -#define wxGrid_SetDefaultColSize 537 -#define wxGrid_SetDefaultRowSize 538 -#define wxGrid_SetGridCursor 539 -#define wxGrid_SetGridLineColour 540 -#define wxGrid_SetLabelBackgroundColour 541 -#define wxGrid_SetLabelFont 542 -#define wxGrid_SetLabelTextColour 543 -#define wxGrid_SetMargins 544 -#define wxGrid_SetReadOnly 545 -#define wxGrid_SetRowAttr 546 -#define wxGrid_SetRowLabelAlignment 547 -#define wxGrid_SetRowLabelSize 548 -#define wxGrid_SetRowLabelValue 549 -#define wxGrid_SetRowMinimalHeight 550 -#define wxGrid_SetRowMinimalAcceptableHeight 551 -#define wxGrid_SetRowSize 552 -#define wxGrid_SetScrollLineX 553 -#define wxGrid_SetScrollLineY 554 -#define wxGrid_SetSelectionBackground 555 -#define wxGrid_SetSelectionForeground 556 -#define wxGrid_SetSelectionMode 557 -#define wxGrid_ShowCellEditControl 558 -#define wxGrid_XToCol 559 -#define wxGrid_XToEdgeOfCol 560 -#define wxGrid_YToEdgeOfRow 561 -#define wxGrid_YToRow 562 -#define wxGridCellRenderer_Draw 563 -#define wxGridCellRenderer_GetBestSize 564 -#define wxGridCellEditor_Create 565 -#define wxGridCellEditor_IsCreated 566 -#define wxGridCellEditor_SetSize 567 -#define wxGridCellEditor_Show 568 -#define wxGridCellEditor_PaintBackground 569 -#define wxGridCellEditor_BeginEdit 570 -#define wxGridCellEditor_EndEdit 571 -#define wxGridCellEditor_Reset 572 -#define wxGridCellEditor_StartingKey 573 -#define wxGridCellEditor_StartingClick 574 -#define wxGridCellEditor_HandleReturn 575 -#define wxGridCellBoolRenderer_new 576 -#define wxGridCellBoolRenderer_destroy 577 -#define wxGridCellBoolEditor_new 578 -#define wxGridCellBoolEditor_IsTrueValue 579 -#define wxGridCellBoolEditor_UseStringValues 580 -#define wxGridCellBoolEditor_destroy 581 -#define wxGridCellFloatRenderer_new 582 -#define wxGridCellFloatRenderer_GetPrecision 583 -#define wxGridCellFloatRenderer_GetWidth 584 -#define wxGridCellFloatRenderer_SetParameters 585 -#define wxGridCellFloatRenderer_SetPrecision 586 -#define wxGridCellFloatRenderer_SetWidth 587 -#define wxGridCellFloatRenderer_destroy 588 -#define wxGridCellFloatEditor_new 589 -#define wxGridCellFloatEditor_SetParameters 590 -#define wxGridCellFloatEditor_destroy 591 -#define wxGridCellStringRenderer_new 592 -#define wxGridCellStringRenderer_destroy 593 -#define wxGridCellTextEditor_new 594 -#define wxGridCellTextEditor_SetParameters 595 -#define wxGridCellTextEditor_destroy 596 -#define wxGridCellChoiceEditor_new 598 -#define wxGridCellChoiceEditor_SetParameters 599 -#define wxGridCellChoiceEditor_destroy 600 -#define wxGridCellNumberRenderer_new 601 -#define wxGridCellNumberRenderer_destroy 602 -#define wxGridCellNumberEditor_new 603 -#define wxGridCellNumberEditor_GetValue 604 -#define wxGridCellNumberEditor_SetParameters 605 -#define wxGridCellNumberEditor_destroy 606 -#define wxGridCellAttr_SetTextColour 607 -#define wxGridCellAttr_SetBackgroundColour 608 -#define wxGridCellAttr_SetFont 609 -#define wxGridCellAttr_SetAlignment 610 -#define wxGridCellAttr_SetReadOnly 611 -#define wxGridCellAttr_SetRenderer 612 -#define wxGridCellAttr_SetEditor 613 -#define wxGridCellAttr_HasTextColour 614 -#define wxGridCellAttr_HasBackgroundColour 615 -#define wxGridCellAttr_HasFont 616 -#define wxGridCellAttr_HasAlignment 617 -#define wxGridCellAttr_HasRenderer 618 -#define wxGridCellAttr_HasEditor 619 -#define wxGridCellAttr_GetTextColour 620 -#define wxGridCellAttr_GetBackgroundColour 621 -#define wxGridCellAttr_GetFont 622 -#define wxGridCellAttr_GetAlignment 623 -#define wxGridCellAttr_GetRenderer 624 -#define wxGridCellAttr_GetEditor 625 -#define wxGridCellAttr_IsReadOnly 626 -#define wxGridCellAttr_SetDefAttr 627 -#define wxDC_Blit 628 -#define wxDC_CalcBoundingBox 629 -#define wxDC_Clear 630 -#define wxDC_ComputeScaleAndOrigin 631 -#define wxDC_CrossHair 632 -#define wxDC_DestroyClippingRegion 633 -#define wxDC_DeviceToLogicalX 634 -#define wxDC_DeviceToLogicalXRel 635 -#define wxDC_DeviceToLogicalY 636 -#define wxDC_DeviceToLogicalYRel 637 -#define wxDC_DrawArc 638 -#define wxDC_DrawBitmap 639 -#define wxDC_DrawCheckMark 640 -#define wxDC_DrawCircle 641 -#define wxDC_DrawEllipse_2 643 -#define wxDC_DrawEllipse_1 644 -#define wxDC_DrawEllipticArc 645 -#define wxDC_DrawIcon 646 -#define wxDC_DrawLabel 647 -#define wxDC_DrawLine 648 -#define wxDC_DrawLines 649 -#define wxDC_DrawPolygon 651 -#define wxDC_DrawPoint 653 -#define wxDC_DrawRectangle_2 655 -#define wxDC_DrawRectangle_1 656 -#define wxDC_DrawRotatedText 657 -#define wxDC_DrawRoundedRectangle_3 659 -#define wxDC_DrawRoundedRectangle_2 660 -#define wxDC_DrawText 661 -#define wxDC_EndDoc 662 -#define wxDC_EndPage 663 -#define wxDC_FloodFill 664 -#define wxDC_GetBackground 665 -#define wxDC_GetBackgroundMode 666 -#define wxDC_GetBrush 667 -#define wxDC_GetCharHeight 668 -#define wxDC_GetCharWidth 669 -#define wxDC_GetClippingBox 670 -#define wxDC_GetFont 672 -#define wxDC_GetLayoutDirection 673 -#define wxDC_GetLogicalFunction 674 -#define wxDC_GetMapMode 675 -#define wxDC_GetMultiLineTextExtent_4 676 -#define wxDC_GetMultiLineTextExtent_1 677 -#define wxDC_GetPartialTextExtents 678 -#define wxDC_GetPen 679 -#define wxDC_GetPixel 680 -#define wxDC_GetPPI 681 -#define wxDC_GetSize 683 -#define wxDC_GetSizeMM 685 -#define wxDC_GetTextBackground 686 -#define wxDC_GetTextExtent_4 687 -#define wxDC_GetTextExtent_1 688 -#define wxDC_GetTextForeground 690 -#define wxDC_GetUserScale 691 -#define wxDC_GradientFillConcentric_3 692 -#define wxDC_GradientFillConcentric_4 693 -#define wxDC_GradientFillLinear 694 -#define wxDC_LogicalToDeviceX 695 -#define wxDC_LogicalToDeviceXRel 696 -#define wxDC_LogicalToDeviceY 697 -#define wxDC_LogicalToDeviceYRel 698 -#define wxDC_MaxX 699 -#define wxDC_MaxY 700 -#define wxDC_MinX 701 -#define wxDC_MinY 702 -#define wxDC_IsOk 703 -#define wxDC_ResetBoundingBox 704 -#define wxDC_SetAxisOrientation 705 -#define wxDC_SetBackground 706 -#define wxDC_SetBackgroundMode 707 -#define wxDC_SetBrush 708 -#define wxDC_SetClippingRegion_2 710 -#define wxDC_SetClippingRegion_1_1 711 -#define wxDC_SetClippingRegion_1_0 712 -#define wxDC_SetDeviceOrigin 713 -#define wxDC_SetFont 714 -#define wxDC_SetLayoutDirection 715 -#define wxDC_SetLogicalFunction 716 -#define wxDC_SetMapMode 717 -#define wxDC_SetPalette 718 -#define wxDC_SetPen 719 -#define wxDC_SetTextBackground 720 -#define wxDC_SetTextForeground 721 -#define wxDC_SetUserScale 722 -#define wxDC_StartDoc 723 -#define wxDC_StartPage 724 -#define wxMirrorDC_new 725 -#define wxMirrorDC_destroy 726 -#define wxScreenDC_new 727 -#define wxScreenDC_destruct 728 -#define wxPostScriptDC_new_0 729 -#define wxPostScriptDC_new_1 730 -#define wxPostScriptDC_destruct 731 -#define wxPostScriptDC_SetResolution 732 -#define wxPostScriptDC_GetResolution 733 -#define wxWindowDC_new_0 734 -#define wxWindowDC_new_1 735 -#define wxWindowDC_destruct 736 -#define wxClientDC_new_0 737 -#define wxClientDC_new_1 738 -#define wxClientDC_destroy 739 -#define wxPaintDC_new_0 740 -#define wxPaintDC_new_1 741 -#define wxPaintDC_destroy 742 -#define wxMemoryDC_new_1_0 744 -#define wxMemoryDC_new_1_1 745 -#define wxMemoryDC_new_0 746 -#define wxMemoryDC_destruct 748 -#define wxMemoryDC_SelectObject 749 -#define wxMemoryDC_SelectObjectAsSource 750 -#define wxBufferedDC_new_0 751 -#define wxBufferedDC_new_2 752 -#define wxBufferedDC_new_3 753 -#define wxBufferedDC_destruct 754 -#define wxBufferedDC_Init_2 755 -#define wxBufferedDC_Init_3 756 -#define wxBufferedPaintDC_new_3 757 -#define wxBufferedPaintDC_new_2 758 -#define wxBufferedPaintDC_destruct 759 -#define wxGraphicsObject_destruct 760 -#define wxGraphicsObject_GetRenderer 761 -#define wxGraphicsObject_IsNull 762 -#define wxGraphicsContext_destruct 763 -#define wxGraphicsContext_Create_1_1 764 -#define wxGraphicsContext_Create_1_0 765 -#define wxGraphicsContext_Create_0 766 -#define wxGraphicsContext_CreatePen 767 -#define wxGraphicsContext_CreateBrush 768 -#define wxGraphicsContext_CreateRadialGradientBrush 769 -#define wxGraphicsContext_CreateLinearGradientBrush 770 -#define wxGraphicsContext_CreateFont 771 -#define wxGraphicsContext_CreateMatrix 772 -#define wxGraphicsContext_CreatePath 773 -#define wxGraphicsContext_Clip_1 774 -#define wxGraphicsContext_Clip_4 775 -#define wxGraphicsContext_ResetClip 776 -#define wxGraphicsContext_DrawBitmap 777 -#define wxGraphicsContext_DrawEllipse 778 -#define wxGraphicsContext_DrawIcon 779 -#define wxGraphicsContext_DrawLines 780 -#define wxGraphicsContext_DrawPath 781 -#define wxGraphicsContext_DrawRectangle 782 -#define wxGraphicsContext_DrawRoundedRectangle 783 -#define wxGraphicsContext_DrawText_3 784 -#define wxGraphicsContext_DrawText_4_0 785 -#define wxGraphicsContext_DrawText_4_1 786 -#define wxGraphicsContext_DrawText_5 787 -#define wxGraphicsContext_FillPath 788 -#define wxGraphicsContext_StrokePath 789 -#define wxGraphicsContext_GetPartialTextExtents 790 -#define wxGraphicsContext_GetTextExtent 791 -#define wxGraphicsContext_Rotate 792 -#define wxGraphicsContext_Scale 793 -#define wxGraphicsContext_Translate 794 -#define wxGraphicsContext_GetTransform 795 -#define wxGraphicsContext_SetTransform 796 -#define wxGraphicsContext_ConcatTransform 797 -#define wxGraphicsContext_SetBrush_1_1 798 -#define wxGraphicsContext_SetBrush_1_0 799 -#define wxGraphicsContext_SetFont_1 800 -#define wxGraphicsContext_SetFont_2 801 -#define wxGraphicsContext_SetPen_1_0 802 -#define wxGraphicsContext_SetPen_1_1 803 -#define wxGraphicsContext_StrokeLine 804 -#define wxGraphicsContext_StrokeLines 805 -#define wxGraphicsMatrix_Concat 807 -#define wxGraphicsMatrix_Get 809 -#define wxGraphicsMatrix_Invert 810 -#define wxGraphicsMatrix_IsEqual 811 -#define wxGraphicsMatrix_IsIdentity 813 -#define wxGraphicsMatrix_Rotate 814 -#define wxGraphicsMatrix_Scale 815 -#define wxGraphicsMatrix_Translate 816 -#define wxGraphicsMatrix_Set 817 -#define wxGraphicsMatrix_TransformPoint 818 -#define wxGraphicsMatrix_TransformDistance 819 -#define wxGraphicsPath_MoveToPoint_2 820 -#define wxGraphicsPath_MoveToPoint_1 821 -#define wxGraphicsPath_AddArc_6 822 -#define wxGraphicsPath_AddArc_5 823 -#define wxGraphicsPath_AddArcToPoint 824 -#define wxGraphicsPath_AddCircle 825 -#define wxGraphicsPath_AddCurveToPoint_6 826 -#define wxGraphicsPath_AddCurveToPoint_3 827 -#define wxGraphicsPath_AddEllipse 828 -#define wxGraphicsPath_AddLineToPoint_2 829 -#define wxGraphicsPath_AddLineToPoint_1 830 -#define wxGraphicsPath_AddPath 831 -#define wxGraphicsPath_AddQuadCurveToPoint 832 -#define wxGraphicsPath_AddRectangle 833 -#define wxGraphicsPath_AddRoundedRectangle 834 -#define wxGraphicsPath_CloseSubpath 835 -#define wxGraphicsPath_Contains_3 836 -#define wxGraphicsPath_Contains_2 837 -#define wxGraphicsPath_GetBox 839 -#define wxGraphicsPath_GetCurrentPoint 841 -#define wxGraphicsPath_Transform 842 -#define wxGraphicsRenderer_GetDefaultRenderer 843 -#define wxGraphicsRenderer_CreateContext_1_1 844 -#define wxGraphicsRenderer_CreateContext_1_0 845 -#define wxGraphicsRenderer_CreatePen 846 -#define wxGraphicsRenderer_CreateBrush 847 -#define wxGraphicsRenderer_CreateLinearGradientBrush 848 -#define wxGraphicsRenderer_CreateRadialGradientBrush 849 -#define wxGraphicsRenderer_CreateFont 850 -#define wxGraphicsRenderer_CreateMatrix 851 -#define wxGraphicsRenderer_CreatePath 852 -#define wxMenuBar_new_1 854 -#define wxMenuBar_new_0 856 -#define wxMenuBar_destruct 858 -#define wxMenuBar_Append 859 -#define wxMenuBar_Check 860 -#define wxMenuBar_Enable_2 861 -#define wxMenuBar_Enable_1 862 -#define wxMenuBar_EnableTop 863 -#define wxMenuBar_FindMenu 864 -#define wxMenuBar_FindMenuItem 865 -#define wxMenuBar_FindItem 866 -#define wxMenuBar_GetHelpString 867 -#define wxMenuBar_GetLabel_1 868 -#define wxMenuBar_GetLabel_0 869 -#define wxMenuBar_GetLabelTop 870 -#define wxMenuBar_GetMenu 871 -#define wxMenuBar_GetMenuCount 872 -#define wxMenuBar_Insert 873 -#define wxMenuBar_IsChecked 874 -#define wxMenuBar_IsEnabled_1 875 -#define wxMenuBar_IsEnabled_0 876 -#define wxMenuBar_Remove 877 -#define wxMenuBar_Replace 878 -#define wxMenuBar_SetHelpString 879 -#define wxMenuBar_SetLabel_2 880 -#define wxMenuBar_SetLabel_1 881 -#define wxMenuBar_SetLabelTop 882 -#define wxControl_GetLabel 883 -#define wxControl_SetLabel 884 -#define wxControlWithItems_Append_1 885 -#define wxControlWithItems_Append_2 886 -#define wxControlWithItems_appendStrings_1 887 -#define wxControlWithItems_Clear 888 -#define wxControlWithItems_Delete 889 -#define wxControlWithItems_FindString 890 -#define wxControlWithItems_getClientData 891 -#define wxControlWithItems_setClientData 892 -#define wxControlWithItems_GetCount 893 -#define wxControlWithItems_GetSelection 894 -#define wxControlWithItems_GetString 895 -#define wxControlWithItems_GetStringSelection 896 -#define wxControlWithItems_Insert_2 897 -#define wxControlWithItems_Insert_3 898 -#define wxControlWithItems_IsEmpty 899 -#define wxControlWithItems_Select 900 -#define wxControlWithItems_SetSelection 901 -#define wxControlWithItems_SetString 902 -#define wxControlWithItems_SetStringSelection 903 -#define wxMenu_new_2 906 -#define wxMenu_new_1 907 -#define wxMenu_destruct 909 -#define wxMenu_Append_3 910 -#define wxMenu_Append_1 911 -#define wxMenu_Append_4_0 912 -#define wxMenu_Append_4_1 913 -#define wxMenu_AppendCheckItem 914 -#define wxMenu_AppendRadioItem 915 -#define wxMenu_AppendSeparator 916 -#define wxMenu_Break 917 -#define wxMenu_Check 918 -#define wxMenu_Delete_1_0 919 -#define wxMenu_Delete_1_1 920 -#define wxMenu_Destroy_1_0 921 -#define wxMenu_Destroy_1_1 922 -#define wxMenu_Enable 923 -#define wxMenu_FindItem_1 924 -#define wxMenu_FindItem_2 925 -#define wxMenu_FindItemByPosition 926 -#define wxMenu_GetHelpString 927 -#define wxMenu_GetLabel 928 -#define wxMenu_GetMenuItemCount 929 -#define wxMenu_GetMenuItems 930 -#define wxMenu_GetTitle 932 -#define wxMenu_Insert_2 933 -#define wxMenu_Insert_3 934 -#define wxMenu_Insert_5_1 935 -#define wxMenu_Insert_5_0 936 -#define wxMenu_InsertCheckItem 937 -#define wxMenu_InsertRadioItem 938 -#define wxMenu_InsertSeparator 939 -#define wxMenu_IsChecked 940 -#define wxMenu_IsEnabled 941 -#define wxMenu_Prepend_1 942 -#define wxMenu_Prepend_2 943 -#define wxMenu_Prepend_4_1 944 -#define wxMenu_Prepend_4_0 945 -#define wxMenu_PrependCheckItem 946 -#define wxMenu_PrependRadioItem 947 -#define wxMenu_PrependSeparator 948 -#define wxMenu_Remove_1_0 949 -#define wxMenu_Remove_1_1 950 -#define wxMenu_SetHelpString 951 -#define wxMenu_SetLabel 952 -#define wxMenu_SetTitle 953 -#define wxMenuItem_new 954 -#define wxMenuItem_destruct 956 -#define wxMenuItem_Check 957 -#define wxMenuItem_Enable 958 -#define wxMenuItem_GetBitmap 959 -#define wxMenuItem_GetHelp 960 -#define wxMenuItem_GetId 961 -#define wxMenuItem_GetKind 962 -#define wxMenuItem_GetLabel 963 -#define wxMenuItem_GetLabelFromText 964 -#define wxMenuItem_GetMenu 965 -#define wxMenuItem_GetText 966 -#define wxMenuItem_GetSubMenu 967 -#define wxMenuItem_IsCheckable 968 -#define wxMenuItem_IsChecked 969 -#define wxMenuItem_IsEnabled 970 -#define wxMenuItem_IsSeparator 971 -#define wxMenuItem_IsSubMenu 972 -#define wxMenuItem_SetBitmap 973 -#define wxMenuItem_SetHelp 974 -#define wxMenuItem_SetMenu 975 -#define wxMenuItem_SetSubMenu 976 -#define wxMenuItem_SetText 977 -#define wxToolBar_AddControl 978 -#define wxToolBar_AddSeparator 979 -#define wxToolBar_AddTool_5 980 -#define wxToolBar_AddTool_4_0 981 -#define wxToolBar_AddTool_1 982 -#define wxToolBar_AddTool_4_1 983 -#define wxToolBar_AddTool_3 984 -#define wxToolBar_AddTool_6 985 -#define wxToolBar_AddCheckTool 986 -#define wxToolBar_AddRadioTool 987 -#define wxToolBar_AddStretchableSpace 988 -#define wxToolBar_InsertStretchableSpace 989 -#define wxToolBar_DeleteTool 990 -#define wxToolBar_DeleteToolByPos 991 -#define wxToolBar_EnableTool 992 -#define wxToolBar_FindById 993 -#define wxToolBar_FindControl 994 -#define wxToolBar_FindToolForPosition 995 -#define wxToolBar_GetToolSize 996 -#define wxToolBar_GetToolBitmapSize 997 -#define wxToolBar_GetMargins 998 -#define wxToolBar_GetToolEnabled 999 -#define wxToolBar_GetToolLongHelp 1000 -#define wxToolBar_GetToolPacking 1001 -#define wxToolBar_GetToolPos 1002 -#define wxToolBar_GetToolSeparation 1003 -#define wxToolBar_GetToolShortHelp 1004 -#define wxToolBar_GetToolState 1005 -#define wxToolBar_InsertControl 1006 -#define wxToolBar_InsertSeparator 1007 -#define wxToolBar_InsertTool_5 1008 -#define wxToolBar_InsertTool_2 1009 -#define wxToolBar_InsertTool_4 1010 -#define wxToolBar_Realize 1011 -#define wxToolBar_RemoveTool 1012 -#define wxToolBar_SetMargins 1013 -#define wxToolBar_SetToolBitmapSize 1014 -#define wxToolBar_SetToolLongHelp 1015 -#define wxToolBar_SetToolPacking 1016 -#define wxToolBar_SetToolShortHelp 1017 -#define wxToolBar_SetToolSeparation 1018 -#define wxToolBar_ToggleTool 1019 -#define wxStatusBar_new_0 1021 -#define wxStatusBar_new_2 1022 -#define wxStatusBar_destruct 1024 -#define wxStatusBar_Create 1025 -#define wxStatusBar_GetFieldRect 1026 -#define wxStatusBar_GetFieldsCount 1027 -#define wxStatusBar_GetStatusText 1028 -#define wxStatusBar_PopStatusText 1029 -#define wxStatusBar_PushStatusText 1030 -#define wxStatusBar_SetFieldsCount 1031 -#define wxStatusBar_SetMinHeight 1032 -#define wxStatusBar_SetStatusText 1033 -#define wxStatusBar_SetStatusWidths 1034 -#define wxStatusBar_SetStatusStyles 1035 -#define wxBitmap_new_0 1036 -#define wxBitmap_new_3 1037 -#define wxBitmap_new_4 1038 -#define wxBitmap_new_2_0 1039 -#define wxBitmap_new_2_1 1040 -#define wxBitmap_destruct 1041 -#define wxBitmap_ConvertToImage 1042 -#define wxBitmap_CopyFromIcon 1043 -#define wxBitmap_Create 1044 -#define wxBitmap_GetDepth 1045 -#define wxBitmap_GetHeight 1046 -#define wxBitmap_GetPalette 1047 -#define wxBitmap_GetMask 1048 -#define wxBitmap_GetWidth 1049 -#define wxBitmap_GetSubBitmap 1050 -#define wxBitmap_LoadFile 1051 -#define wxBitmap_Ok 1052 -#define wxBitmap_SaveFile 1053 -#define wxBitmap_SetDepth 1054 -#define wxBitmap_SetHeight 1055 -#define wxBitmap_SetMask 1056 -#define wxBitmap_SetPalette 1057 -#define wxBitmap_SetWidth 1058 -#define wxIcon_new_0 1059 -#define wxIcon_new_2 1060 -#define wxIcon_new_1 1061 -#define wxIcon_CopyFromBitmap 1062 -#define wxIcon_destroy 1063 -#define wxIconBundle_new_0 1064 -#define wxIconBundle_new_2 1065 -#define wxIconBundle_new_1_0 1066 -#define wxIconBundle_new_1_1 1067 -#define wxIconBundle_destruct 1068 -#define wxIconBundle_AddIcon_2 1069 -#define wxIconBundle_AddIcon_1 1070 -#define wxIconBundle_GetIcon_1_1 1071 -#define wxIconBundle_GetIcon_1_0 1072 -#define wxCursor_new_0 1073 -#define wxCursor_new_1_0 1074 -#define wxCursor_new_1_1 1075 -#define wxCursor_new_4 1076 -#define wxCursor_destruct 1077 -#define wxCursor_Ok 1078 -#define wxMask_new_0 1079 -#define wxMask_new_2_1 1080 -#define wxMask_new_2_0 1081 -#define wxMask_new_1 1082 -#define wxMask_destruct 1083 -#define wxMask_Create_2_1 1084 -#define wxMask_Create_2_0 1085 -#define wxMask_Create_1 1086 -#define wxImage_new_0 1087 -#define wxImage_new_3_0 1088 -#define wxImage_new_4 1089 -#define wxImage_new_5 1090 -#define wxImage_new_2 1091 -#define wxImage_new_3_1 1092 -#define wxImage_Blur 1093 -#define wxImage_BlurHorizontal 1094 -#define wxImage_BlurVertical 1095 -#define wxImage_ConvertAlphaToMask 1096 -#define wxImage_ConvertToGreyscale 1097 -#define wxImage_ConvertToMono 1098 -#define wxImage_Copy 1099 -#define wxImage_Create_3 1100 -#define wxImage_Create_4 1101 -#define wxImage_Create_5 1102 -#define wxImage_Destroy 1103 -#define wxImage_FindFirstUnusedColour 1104 -#define wxImage_GetImageExtWildcard 1105 -#define wxImage_GetAlpha_2 1106 -#define wxImage_GetAlpha_0 1107 -#define wxImage_GetBlue 1108 -#define wxImage_GetData 1109 -#define wxImage_GetGreen 1110 -#define wxImage_GetImageCount 1111 -#define wxImage_GetHeight 1112 -#define wxImage_GetMaskBlue 1113 -#define wxImage_GetMaskGreen 1114 -#define wxImage_GetMaskRed 1115 -#define wxImage_GetOrFindMaskColour 1116 -#define wxImage_GetPalette 1117 -#define wxImage_GetRed 1118 -#define wxImage_GetSubImage 1119 -#define wxImage_GetWidth 1120 -#define wxImage_HasAlpha 1121 -#define wxImage_HasMask 1122 -#define wxImage_GetOption 1123 -#define wxImage_GetOptionInt 1124 -#define wxImage_HasOption 1125 -#define wxImage_InitAlpha 1126 -#define wxImage_InitStandardHandlers 1127 -#define wxImage_IsTransparent 1128 -#define wxImage_LoadFile_2 1129 -#define wxImage_LoadFile_3 1130 -#define wxImage_Ok 1131 -#define wxImage_RemoveHandler 1132 -#define wxImage_Mirror 1133 -#define wxImage_Replace 1134 -#define wxImage_Rescale 1135 -#define wxImage_Resize 1136 -#define wxImage_Rotate 1137 -#define wxImage_RotateHue 1138 -#define wxImage_Rotate90 1139 -#define wxImage_SaveFile_1 1140 -#define wxImage_SaveFile_2_0 1141 -#define wxImage_SaveFile_2_1 1142 -#define wxImage_Scale 1143 -#define wxImage_Size 1144 -#define wxImage_SetAlpha_3 1145 -#define wxImage_SetAlpha_2 1146 -#define wxImage_SetData_2 1147 -#define wxImage_SetData_4 1148 -#define wxImage_SetMask 1149 -#define wxImage_SetMaskColour 1150 -#define wxImage_SetMaskFromImage 1151 -#define wxImage_SetOption_2_1 1152 -#define wxImage_SetOption_2_0 1153 -#define wxImage_SetPalette 1154 -#define wxImage_SetRGB_5 1155 -#define wxImage_SetRGB_4 1156 -#define wxImage_destroy 1157 -#define wxBrush_new_0 1158 -#define wxBrush_new_2 1159 -#define wxBrush_new_1 1160 -#define wxBrush_destruct 1162 -#define wxBrush_GetColour 1163 -#define wxBrush_GetStipple 1164 -#define wxBrush_GetStyle 1165 -#define wxBrush_IsHatch 1166 -#define wxBrush_IsOk 1167 -#define wxBrush_SetColour_1 1168 -#define wxBrush_SetColour_3 1169 -#define wxBrush_SetStipple 1170 -#define wxBrush_SetStyle 1171 -#define wxPen_new_0 1172 -#define wxPen_new_2 1173 -#define wxPen_destruct 1174 -#define wxPen_GetCap 1175 -#define wxPen_GetColour 1176 -#define wxPen_GetJoin 1177 -#define wxPen_GetStyle 1178 -#define wxPen_GetWidth 1179 -#define wxPen_IsOk 1180 -#define wxPen_SetCap 1181 -#define wxPen_SetColour_1 1182 -#define wxPen_SetColour_3 1183 -#define wxPen_SetJoin 1184 -#define wxPen_SetStyle 1185 -#define wxPen_SetWidth 1186 -#define wxRegion_new_0 1187 -#define wxRegion_new_4 1188 -#define wxRegion_new_2 1189 -#define wxRegion_new_1_1 1190 -#define wxRegion_new_1_0 1192 -#define wxRegion_destruct 1194 -#define wxRegion_Clear 1195 -#define wxRegion_Contains_2 1196 -#define wxRegion_Contains_1_0 1197 -#define wxRegion_Contains_4 1198 -#define wxRegion_Contains_1_1 1199 -#define wxRegion_ConvertToBitmap 1200 -#define wxRegion_GetBox 1201 -#define wxRegion_Intersect_4 1202 -#define wxRegion_Intersect_1_1 1203 -#define wxRegion_Intersect_1_0 1204 -#define wxRegion_IsEmpty 1205 -#define wxRegion_Subtract_4 1206 -#define wxRegion_Subtract_1_1 1207 -#define wxRegion_Subtract_1_0 1208 -#define wxRegion_Offset_2 1209 -#define wxRegion_Offset_1 1210 -#define wxRegion_Union_4 1211 -#define wxRegion_Union_1_2 1212 -#define wxRegion_Union_1_1 1213 -#define wxRegion_Union_1_0 1214 -#define wxRegion_Union_3 1215 -#define wxRegion_Xor_4 1216 -#define wxRegion_Xor_1_1 1217 -#define wxRegion_Xor_1_0 1218 -#define wxAcceleratorTable_new_0 1219 -#define wxAcceleratorTable_new_2 1220 -#define wxAcceleratorTable_destruct 1221 -#define wxAcceleratorTable_Ok 1222 -#define wxAcceleratorEntry_new_1_0 1223 -#define wxAcceleratorEntry_new_1_1 1224 -#define wxAcceleratorEntry_GetCommand 1225 -#define wxAcceleratorEntry_GetFlags 1226 -#define wxAcceleratorEntry_GetKeyCode 1227 -#define wxAcceleratorEntry_Set 1228 -#define wxAcceleratorEntry_destroy 1229 -#define wxCaret_new_3 1234 -#define wxCaret_new_2 1235 -#define wxCaret_destruct 1237 -#define wxCaret_Create_3 1238 -#define wxCaret_Create_2 1239 -#define wxCaret_GetBlinkTime 1240 -#define wxCaret_GetPosition 1242 -#define wxCaret_GetSize 1244 -#define wxCaret_GetWindow 1245 -#define wxCaret_Hide 1246 -#define wxCaret_IsOk 1247 -#define wxCaret_IsVisible 1248 -#define wxCaret_Move_2 1249 -#define wxCaret_Move_1 1250 -#define wxCaret_SetBlinkTime 1251 -#define wxCaret_SetSize_2 1252 -#define wxCaret_SetSize_1 1253 -#define wxCaret_Show 1254 -#define wxSizer_Add_2_1 1255 -#define wxSizer_Add_2_0 1256 -#define wxSizer_Add_3 1257 -#define wxSizer_Add_2_3 1258 -#define wxSizer_Add_2_2 1259 -#define wxSizer_AddSpacer 1260 -#define wxSizer_AddStretchSpacer 1261 -#define wxSizer_CalcMin 1262 -#define wxSizer_Clear 1263 -#define wxSizer_Detach_1_2 1264 -#define wxSizer_Detach_1_1 1265 -#define wxSizer_Detach_1_0 1266 -#define wxSizer_Fit 1267 -#define wxSizer_FitInside 1268 -#define wxSizer_GetChildren 1269 -#define wxSizer_GetItem_2_1 1270 -#define wxSizer_GetItem_2_0 1271 -#define wxSizer_GetItem_1 1272 -#define wxSizer_GetSize 1273 -#define wxSizer_GetPosition 1274 -#define wxSizer_GetMinSize 1275 -#define wxSizer_Hide_2_0 1276 -#define wxSizer_Hide_2_1 1277 -#define wxSizer_Hide_1 1278 -#define wxSizer_Insert_3_1 1279 -#define wxSizer_Insert_3_0 1280 -#define wxSizer_Insert_4 1281 -#define wxSizer_Insert_3_3 1282 -#define wxSizer_Insert_3_2 1283 -#define wxSizer_Insert_2 1284 -#define wxSizer_InsertSpacer 1285 -#define wxSizer_InsertStretchSpacer 1286 -#define wxSizer_IsShown_1_2 1287 -#define wxSizer_IsShown_1_1 1288 -#define wxSizer_IsShown_1_0 1289 -#define wxSizer_Layout 1290 -#define wxSizer_Prepend_2_1 1291 -#define wxSizer_Prepend_2_0 1292 -#define wxSizer_Prepend_3 1293 -#define wxSizer_Prepend_2_3 1294 -#define wxSizer_Prepend_2_2 1295 -#define wxSizer_Prepend_1 1296 -#define wxSizer_PrependSpacer 1297 -#define wxSizer_PrependStretchSpacer 1298 -#define wxSizer_RecalcSizes 1299 -#define wxSizer_Remove_1_1 1300 -#define wxSizer_Remove_1_0 1301 -#define wxSizer_Replace_3_1 1302 -#define wxSizer_Replace_3_0 1303 -#define wxSizer_Replace_2 1304 -#define wxSizer_SetDimension 1305 -#define wxSizer_SetMinSize_2 1306 -#define wxSizer_SetMinSize_1 1307 -#define wxSizer_SetItemMinSize_3_2 1308 -#define wxSizer_SetItemMinSize_2_2 1309 -#define wxSizer_SetItemMinSize_3_1 1310 -#define wxSizer_SetItemMinSize_2_1 1311 -#define wxSizer_SetItemMinSize_3_0 1312 -#define wxSizer_SetItemMinSize_2_0 1313 -#define wxSizer_SetSizeHints 1314 -#define wxSizer_SetVirtualSizeHints 1315 -#define wxSizer_Show_2_2 1316 -#define wxSizer_Show_2_1 1317 -#define wxSizer_Show_2_0 1318 -#define wxSizer_Show_1 1319 -#define wxSizerFlags_new 1320 -#define wxSizerFlags_Align 1321 -#define wxSizerFlags_Border_2 1322 -#define wxSizerFlags_Border_1 1323 -#define wxSizerFlags_Center 1324 -#define wxSizerFlags_Centre 1325 -#define wxSizerFlags_Expand 1326 -#define wxSizerFlags_Left 1327 -#define wxSizerFlags_Proportion 1328 -#define wxSizerFlags_Right 1329 -#define wxSizerFlags_destroy 1330 -#define wxSizerItem_new_5_1 1331 -#define wxSizerItem_new_2_1 1332 -#define wxSizerItem_new_5_0 1333 -#define wxSizerItem_new_2_0 1334 -#define wxSizerItem_new_6 1335 -#define wxSizerItem_new_3 1336 -#define wxSizerItem_new_0 1337 -#define wxSizerItem_destruct 1338 -#define wxSizerItem_CalcMin 1339 -#define wxSizerItem_DeleteWindows 1340 -#define wxSizerItem_DetachSizer 1341 -#define wxSizerItem_GetBorder 1342 -#define wxSizerItem_GetFlag 1343 -#define wxSizerItem_GetMinSize 1344 -#define wxSizerItem_GetPosition 1345 -#define wxSizerItem_GetProportion 1346 -#define wxSizerItem_GetRatio 1347 -#define wxSizerItem_GetRect 1348 -#define wxSizerItem_GetSize 1349 -#define wxSizerItem_GetSizer 1350 -#define wxSizerItem_GetSpacer 1351 -#define wxSizerItem_GetUserData 1352 -#define wxSizerItem_GetWindow 1353 -#define wxSizerItem_IsSizer 1354 -#define wxSizerItem_IsShown 1355 -#define wxSizerItem_IsSpacer 1356 -#define wxSizerItem_IsWindow 1357 -#define wxSizerItem_SetBorder 1358 -#define wxSizerItem_SetDimension 1359 -#define wxSizerItem_SetFlag 1360 -#define wxSizerItem_SetInitSize 1361 -#define wxSizerItem_SetMinSize_1 1362 -#define wxSizerItem_SetMinSize_2 1363 -#define wxSizerItem_SetProportion 1364 -#define wxSizerItem_SetRatio_2 1365 -#define wxSizerItem_SetRatio_1_1 1366 -#define wxSizerItem_SetRatio_1_0 1367 -#define wxSizerItem_SetSizer 1368 -#define wxSizerItem_SetSpacer_1 1369 -#define wxSizerItem_SetSpacer_2 1370 -#define wxSizerItem_SetWindow 1371 -#define wxSizerItem_Show 1372 -#define wxBoxSizer_new 1373 -#define wxBoxSizer_GetOrientation 1374 -#define wxBoxSizer_destroy 1375 -#define wxStaticBoxSizer_new_2 1376 -#define wxStaticBoxSizer_new_3 1377 -#define wxStaticBoxSizer_GetStaticBox 1378 -#define wxStaticBoxSizer_destroy 1379 -#define wxGridSizer_new_4 1380 -#define wxGridSizer_new_2 1381 -#define wxGridSizer_GetCols 1382 -#define wxGridSizer_GetHGap 1383 -#define wxGridSizer_GetRows 1384 -#define wxGridSizer_GetVGap 1385 -#define wxGridSizer_SetCols 1386 -#define wxGridSizer_SetHGap 1387 -#define wxGridSizer_SetRows 1388 -#define wxGridSizer_SetVGap 1389 -#define wxGridSizer_destroy 1390 -#define wxFlexGridSizer_new_4 1391 -#define wxFlexGridSizer_new_2 1392 -#define wxFlexGridSizer_AddGrowableCol 1393 -#define wxFlexGridSizer_AddGrowableRow 1394 -#define wxFlexGridSizer_GetFlexibleDirection 1395 -#define wxFlexGridSizer_GetNonFlexibleGrowMode 1396 -#define wxFlexGridSizer_RemoveGrowableCol 1397 -#define wxFlexGridSizer_RemoveGrowableRow 1398 -#define wxFlexGridSizer_SetFlexibleDirection 1399 -#define wxFlexGridSizer_SetNonFlexibleGrowMode 1400 -#define wxFlexGridSizer_destroy 1401 -#define wxGridBagSizer_new 1402 -#define wxGridBagSizer_Add_3_2 1403 -#define wxGridBagSizer_Add_3_1 1404 -#define wxGridBagSizer_Add_4 1405 -#define wxGridBagSizer_Add_1_0 1406 -#define wxGridBagSizer_Add_2_1 1407 -#define wxGridBagSizer_Add_2_0 1408 -#define wxGridBagSizer_Add_3_0 1409 -#define wxGridBagSizer_Add_1_1 1410 -#define wxGridBagSizer_CalcMin 1411 -#define wxGridBagSizer_CheckForIntersection_2 1412 -#define wxGridBagSizer_CheckForIntersection_3 1413 -#define wxGridBagSizer_FindItem_1_1 1414 -#define wxGridBagSizer_FindItem_1_0 1415 -#define wxGridBagSizer_FindItemAtPoint 1416 -#define wxGridBagSizer_FindItemAtPosition 1417 -#define wxGridBagSizer_FindItemWithData 1418 -#define wxGridBagSizer_GetCellSize 1419 -#define wxGridBagSizer_GetEmptyCellSize 1420 -#define wxGridBagSizer_GetItemPosition_1_2 1421 -#define wxGridBagSizer_GetItemPosition_1_1 1422 -#define wxGridBagSizer_GetItemPosition_1_0 1423 -#define wxGridBagSizer_GetItemSpan_1_2 1424 -#define wxGridBagSizer_GetItemSpan_1_1 1425 -#define wxGridBagSizer_GetItemSpan_1_0 1426 -#define wxGridBagSizer_SetEmptyCellSize 1427 -#define wxGridBagSizer_SetItemPosition_2_2 1428 -#define wxGridBagSizer_SetItemPosition_2_1 1429 -#define wxGridBagSizer_SetItemPosition_2_0 1430 -#define wxGridBagSizer_SetItemSpan_2_2 1431 -#define wxGridBagSizer_SetItemSpan_2_1 1432 -#define wxGridBagSizer_SetItemSpan_2_0 1433 -#define wxGridBagSizer_destroy 1434 -#define wxStdDialogButtonSizer_new 1435 -#define wxStdDialogButtonSizer_AddButton 1436 -#define wxStdDialogButtonSizer_Realize 1437 -#define wxStdDialogButtonSizer_SetAffirmativeButton 1438 -#define wxStdDialogButtonSizer_SetCancelButton 1439 -#define wxStdDialogButtonSizer_SetNegativeButton 1440 -#define wxStdDialogButtonSizer_destroy 1441 -#define wxFont_new_0 1442 -#define wxFont_new_1 1443 -#define wxFont_new_5 1444 -#define wxFont_destruct 1446 -#define wxFont_IsFixedWidth 1447 -#define wxFont_GetDefaultEncoding 1448 -#define wxFont_GetFaceName 1449 -#define wxFont_GetFamily 1450 -#define wxFont_GetNativeFontInfoDesc 1451 -#define wxFont_GetNativeFontInfoUserDesc 1452 -#define wxFont_GetPointSize 1453 -#define wxFont_GetStyle 1454 -#define wxFont_GetUnderlined 1455 -#define wxFont_GetWeight 1456 -#define wxFont_Ok 1457 -#define wxFont_SetDefaultEncoding 1458 -#define wxFont_SetFaceName 1459 -#define wxFont_SetFamily 1460 -#define wxFont_SetPointSize 1461 -#define wxFont_SetStyle 1462 -#define wxFont_SetUnderlined 1463 -#define wxFont_SetWeight 1464 -#define wxToolTip_Enable 1465 -#define wxToolTip_SetDelay 1466 -#define wxToolTip_new 1467 -#define wxToolTip_SetTip 1468 -#define wxToolTip_GetTip 1469 -#define wxToolTip_GetWindow 1470 -#define wxToolTip_destroy 1471 -#define wxButton_new_3 1473 -#define wxButton_new_0 1474 -#define wxButton_destruct 1475 -#define wxButton_Create 1476 -#define wxButton_GetDefaultSize 1477 -#define wxButton_SetDefault 1478 -#define wxButton_SetLabel 1479 -#define wxBitmapButton_new_4 1481 -#define wxBitmapButton_new_0 1482 -#define wxBitmapButton_Create 1483 -#define wxBitmapButton_GetBitmapDisabled 1484 -#define wxBitmapButton_GetBitmapFocus 1486 -#define wxBitmapButton_GetBitmapLabel 1488 -#define wxBitmapButton_GetBitmapSelected 1490 -#define wxBitmapButton_SetBitmapDisabled 1492 -#define wxBitmapButton_SetBitmapFocus 1493 -#define wxBitmapButton_SetBitmapLabel 1494 -#define wxBitmapButton_SetBitmapSelected 1495 -#define wxBitmapButton_destroy 1496 -#define wxToggleButton_new_0 1497 -#define wxToggleButton_new_4 1498 -#define wxToggleButton_Create 1499 -#define wxToggleButton_GetValue 1500 -#define wxToggleButton_SetValue 1501 -#define wxToggleButton_destroy 1502 -#define wxCalendarCtrl_new_0 1503 -#define wxCalendarCtrl_new_3 1504 -#define wxCalendarCtrl_Create 1505 -#define wxCalendarCtrl_destruct 1506 -#define wxCalendarCtrl_SetDate 1507 -#define wxCalendarCtrl_GetDate 1508 -#define wxCalendarCtrl_EnableYearChange 1509 -#define wxCalendarCtrl_EnableMonthChange 1510 -#define wxCalendarCtrl_EnableHolidayDisplay 1511 -#define wxCalendarCtrl_SetHeaderColours 1512 -#define wxCalendarCtrl_GetHeaderColourFg 1513 -#define wxCalendarCtrl_GetHeaderColourBg 1514 -#define wxCalendarCtrl_SetHighlightColours 1515 -#define wxCalendarCtrl_GetHighlightColourFg 1516 -#define wxCalendarCtrl_GetHighlightColourBg 1517 -#define wxCalendarCtrl_SetHolidayColours 1518 -#define wxCalendarCtrl_GetHolidayColourFg 1519 -#define wxCalendarCtrl_GetHolidayColourBg 1520 -#define wxCalendarCtrl_GetAttr 1521 -#define wxCalendarCtrl_SetAttr 1522 -#define wxCalendarCtrl_SetHoliday 1523 -#define wxCalendarCtrl_ResetAttr 1524 -#define wxCalendarCtrl_HitTest 1525 -#define wxCalendarDateAttr_new_0 1526 -#define wxCalendarDateAttr_new_2_1 1527 -#define wxCalendarDateAttr_new_2_0 1528 -#define wxCalendarDateAttr_SetTextColour 1529 -#define wxCalendarDateAttr_SetBackgroundColour 1530 -#define wxCalendarDateAttr_SetBorderColour 1531 -#define wxCalendarDateAttr_SetFont 1532 -#define wxCalendarDateAttr_SetBorder 1533 -#define wxCalendarDateAttr_SetHoliday 1534 -#define wxCalendarDateAttr_HasTextColour 1535 -#define wxCalendarDateAttr_HasBackgroundColour 1536 -#define wxCalendarDateAttr_HasBorderColour 1537 -#define wxCalendarDateAttr_HasFont 1538 -#define wxCalendarDateAttr_HasBorder 1539 -#define wxCalendarDateAttr_IsHoliday 1540 -#define wxCalendarDateAttr_GetTextColour 1541 -#define wxCalendarDateAttr_GetBackgroundColour 1542 -#define wxCalendarDateAttr_GetBorderColour 1543 -#define wxCalendarDateAttr_GetFont 1544 -#define wxCalendarDateAttr_GetBorder 1545 -#define wxCalendarDateAttr_destroy 1546 -#define wxCheckBox_new_4 1548 -#define wxCheckBox_new_0 1549 -#define wxCheckBox_Create 1550 -#define wxCheckBox_GetValue 1551 -#define wxCheckBox_Get3StateValue 1552 -#define wxCheckBox_Is3rdStateAllowedForUser 1553 -#define wxCheckBox_Is3State 1554 -#define wxCheckBox_IsChecked 1555 -#define wxCheckBox_SetValue 1556 -#define wxCheckBox_Set3StateValue 1557 -#define wxCheckBox_destroy 1558 -#define wxCheckListBox_new_0 1559 -#define wxCheckListBox_new_3 1561 -#define wxCheckListBox_Check 1562 -#define wxCheckListBox_IsChecked 1563 -#define wxCheckListBox_destroy 1564 -#define wxChoice_new_3 1567 -#define wxChoice_new_0 1568 -#define wxChoice_destruct 1570 -#define wxChoice_Create 1572 -#define wxChoice_Delete 1573 -#define wxChoice_GetColumns 1574 -#define wxChoice_SetColumns 1575 -#define wxComboBox_new_0 1576 -#define wxComboBox_new_3 1578 -#define wxComboBox_destruct 1579 -#define wxComboBox_Create 1581 -#define wxComboBox_CanCopy 1582 -#define wxComboBox_CanCut 1583 -#define wxComboBox_CanPaste 1584 -#define wxComboBox_CanRedo 1585 -#define wxComboBox_CanUndo 1586 -#define wxComboBox_Copy 1587 -#define wxComboBox_Cut 1588 -#define wxComboBox_GetInsertionPoint 1589 -#define wxComboBox_GetLastPosition 1590 -#define wxComboBox_GetValue 1591 -#define wxComboBox_Paste 1592 -#define wxComboBox_Redo 1593 -#define wxComboBox_Replace 1594 -#define wxComboBox_Remove 1595 -#define wxComboBox_SetInsertionPoint 1596 -#define wxComboBox_SetInsertionPointEnd 1597 -#define wxComboBox_SetSelection_1 1598 -#define wxComboBox_SetSelection_2 1599 -#define wxComboBox_SetValue 1600 -#define wxComboBox_Undo 1601 -#define wxGauge_new_0 1602 -#define wxGauge_new_4 1603 -#define wxGauge_Create 1604 -#define wxGauge_GetRange 1605 -#define wxGauge_GetValue 1606 -#define wxGauge_IsVertical 1607 -#define wxGauge_SetRange 1608 -#define wxGauge_SetValue 1609 -#define wxGauge_Pulse 1610 -#define wxGauge_destroy 1611 -#define wxGenericDirCtrl_new_0 1612 -#define wxGenericDirCtrl_new_2 1613 -#define wxGenericDirCtrl_destruct 1614 -#define wxGenericDirCtrl_Create 1615 -#define wxGenericDirCtrl_Init 1616 -#define wxGenericDirCtrl_CollapseTree 1617 -#define wxGenericDirCtrl_ExpandPath 1618 -#define wxGenericDirCtrl_GetDefaultPath 1619 -#define wxGenericDirCtrl_GetPath 1620 -#define wxGenericDirCtrl_GetFilePath 1621 -#define wxGenericDirCtrl_GetFilter 1622 -#define wxGenericDirCtrl_GetFilterIndex 1623 -#define wxGenericDirCtrl_GetRootId 1624 -#define wxGenericDirCtrl_GetTreeCtrl 1625 -#define wxGenericDirCtrl_ReCreateTree 1626 -#define wxGenericDirCtrl_SetDefaultPath 1627 -#define wxGenericDirCtrl_SetFilter 1628 -#define wxGenericDirCtrl_SetFilterIndex 1629 -#define wxGenericDirCtrl_SetPath 1630 -#define wxStaticBox_new_4 1632 -#define wxStaticBox_new_0 1633 -#define wxStaticBox_Create 1634 -#define wxStaticBox_destroy 1635 -#define wxStaticLine_new_2 1637 -#define wxStaticLine_new_0 1638 -#define wxStaticLine_Create 1639 -#define wxStaticLine_IsVertical 1640 -#define wxStaticLine_GetDefaultSize 1641 -#define wxStaticLine_destroy 1642 -#define wxListBox_new_3 1645 -#define wxListBox_new_0 1646 -#define wxListBox_destruct 1648 -#define wxListBox_Create 1650 -#define wxListBox_Deselect 1651 -#define wxListBox_GetSelections 1652 -#define wxListBox_InsertItems 1653 -#define wxListBox_IsSelected 1654 -#define wxListBox_Set 1655 -#define wxListBox_HitTest 1656 -#define wxListBox_SetFirstItem_1_0 1657 -#define wxListBox_SetFirstItem_1_1 1658 -#define wxListCtrl_new_0 1659 -#define wxListCtrl_new_2 1660 -#define wxListCtrl_Arrange 1661 -#define wxListCtrl_AssignImageList 1662 -#define wxListCtrl_ClearAll 1663 -#define wxListCtrl_Create 1664 -#define wxListCtrl_DeleteAllItems 1665 -#define wxListCtrl_DeleteColumn 1666 -#define wxListCtrl_DeleteItem 1667 -#define wxListCtrl_EditLabel 1668 -#define wxListCtrl_EnsureVisible 1669 -#define wxListCtrl_FindItem_3_0 1670 -#define wxListCtrl_FindItem_3_1 1671 -#define wxListCtrl_GetColumn 1672 -#define wxListCtrl_GetColumnCount 1673 -#define wxListCtrl_GetColumnWidth 1674 -#define wxListCtrl_GetCountPerPage 1675 -#define wxListCtrl_GetEditControl 1676 -#define wxListCtrl_GetImageList 1677 -#define wxListCtrl_GetItem 1678 -#define wxListCtrl_GetItemBackgroundColour 1679 -#define wxListCtrl_GetItemCount 1680 -#define wxListCtrl_GetItemData 1681 -#define wxListCtrl_GetItemFont 1682 -#define wxListCtrl_GetItemPosition 1683 -#define wxListCtrl_GetItemRect 1684 -#define wxListCtrl_GetItemSpacing 1685 -#define wxListCtrl_GetItemState 1686 -#define wxListCtrl_GetItemText 1687 -#define wxListCtrl_GetItemTextColour 1688 -#define wxListCtrl_GetNextItem 1689 -#define wxListCtrl_GetSelectedItemCount 1690 -#define wxListCtrl_GetTextColour 1691 -#define wxListCtrl_GetTopItem 1692 -#define wxListCtrl_GetViewRect 1693 -#define wxListCtrl_HitTest 1694 -#define wxListCtrl_InsertColumn_2 1695 -#define wxListCtrl_InsertColumn_3 1696 -#define wxListCtrl_InsertItem_1 1697 -#define wxListCtrl_InsertItem_2_1 1698 -#define wxListCtrl_InsertItem_2_0 1699 -#define wxListCtrl_InsertItem_3 1700 -#define wxListCtrl_RefreshItem 1701 -#define wxListCtrl_RefreshItems 1702 -#define wxListCtrl_ScrollList 1703 -#define wxListCtrl_SetBackgroundColour 1704 -#define wxListCtrl_SetColumn 1705 -#define wxListCtrl_SetColumnWidth 1706 -#define wxListCtrl_SetImageList 1707 -#define wxListCtrl_SetItem_1 1708 -#define wxListCtrl_SetItem_4 1709 -#define wxListCtrl_SetItemBackgroundColour 1710 -#define wxListCtrl_SetItemCount 1711 -#define wxListCtrl_SetItemData 1712 -#define wxListCtrl_SetItemFont 1713 -#define wxListCtrl_SetItemImage 1714 -#define wxListCtrl_SetItemColumnImage 1715 -#define wxListCtrl_SetItemPosition 1716 -#define wxListCtrl_SetItemState 1717 -#define wxListCtrl_SetItemText 1718 -#define wxListCtrl_SetItemTextColour 1719 -#define wxListCtrl_SetSingleStyle 1720 -#define wxListCtrl_SetTextColour 1721 -#define wxListCtrl_SetWindowStyleFlag 1722 -#define wxListCtrl_SortItems 1723 -#define wxListCtrl_destroy 1724 -#define wxListView_ClearColumnImage 1725 -#define wxListView_Focus 1726 -#define wxListView_GetFirstSelected 1727 -#define wxListView_GetFocusedItem 1728 -#define wxListView_GetNextSelected 1729 -#define wxListView_IsSelected 1730 -#define wxListView_Select 1731 -#define wxListView_SetColumnImage 1732 -#define wxListItem_new_0 1733 -#define wxListItem_new_1 1734 -#define wxListItem_destruct 1735 -#define wxListItem_Clear 1736 -#define wxListItem_GetAlign 1737 -#define wxListItem_GetBackgroundColour 1738 -#define wxListItem_GetColumn 1739 -#define wxListItem_GetFont 1740 -#define wxListItem_GetId 1741 -#define wxListItem_GetImage 1742 -#define wxListItem_GetMask 1743 -#define wxListItem_GetState 1744 -#define wxListItem_GetText 1745 -#define wxListItem_GetTextColour 1746 -#define wxListItem_GetWidth 1747 -#define wxListItem_SetAlign 1748 -#define wxListItem_SetBackgroundColour 1749 -#define wxListItem_SetColumn 1750 -#define wxListItem_SetFont 1751 -#define wxListItem_SetId 1752 -#define wxListItem_SetImage 1753 -#define wxListItem_SetMask 1754 -#define wxListItem_SetState 1755 -#define wxListItem_SetStateMask 1756 -#define wxListItem_SetText 1757 -#define wxListItem_SetTextColour 1758 -#define wxListItem_SetWidth 1759 -#define wxListItemAttr_new_0 1760 -#define wxListItemAttr_new_3 1761 -#define wxListItemAttr_GetBackgroundColour 1762 -#define wxListItemAttr_GetFont 1763 -#define wxListItemAttr_GetTextColour 1764 -#define wxListItemAttr_HasBackgroundColour 1765 -#define wxListItemAttr_HasFont 1766 -#define wxListItemAttr_HasTextColour 1767 -#define wxListItemAttr_SetBackgroundColour 1768 -#define wxListItemAttr_SetFont 1769 -#define wxListItemAttr_SetTextColour 1770 -#define wxListItemAttr_destroy 1771 -#define wxImageList_new_0 1772 -#define wxImageList_new_3 1773 -#define wxImageList_Add_1 1774 -#define wxImageList_Add_2_0 1775 -#define wxImageList_Add_2_1 1776 -#define wxImageList_Create 1777 -#define wxImageList_Draw 1779 -#define wxImageList_GetBitmap 1780 -#define wxImageList_GetIcon 1781 -#define wxImageList_GetImageCount 1782 -#define wxImageList_GetSize 1783 -#define wxImageList_Remove 1784 -#define wxImageList_RemoveAll 1785 -#define wxImageList_Replace_2 1786 -#define wxImageList_Replace_3 1787 -#define wxImageList_destroy 1788 -#define wxTextAttr_new_0 1789 -#define wxTextAttr_new_2 1790 -#define wxTextAttr_GetAlignment 1791 -#define wxTextAttr_GetBackgroundColour 1792 -#define wxTextAttr_GetFont 1793 -#define wxTextAttr_GetLeftIndent 1794 -#define wxTextAttr_GetLeftSubIndent 1795 -#define wxTextAttr_GetRightIndent 1796 -#define wxTextAttr_GetTabs 1797 -#define wxTextAttr_GetTextColour 1798 -#define wxTextAttr_HasBackgroundColour 1799 -#define wxTextAttr_HasFont 1800 -#define wxTextAttr_HasTextColour 1801 -#define wxTextAttr_GetFlags 1802 -#define wxTextAttr_IsDefault 1803 -#define wxTextAttr_SetAlignment 1804 -#define wxTextAttr_SetBackgroundColour 1805 -#define wxTextAttr_SetFlags 1806 -#define wxTextAttr_SetFont 1807 -#define wxTextAttr_SetLeftIndent 1808 -#define wxTextAttr_SetRightIndent 1809 -#define wxTextAttr_SetTabs 1810 -#define wxTextAttr_SetTextColour 1811 -#define wxTextAttr_destroy 1812 -#define wxTextCtrl_new_3 1814 -#define wxTextCtrl_new_0 1815 -#define wxTextCtrl_destruct 1817 -#define wxTextCtrl_AppendText 1818 -#define wxTextCtrl_CanCopy 1819 -#define wxTextCtrl_CanCut 1820 -#define wxTextCtrl_CanPaste 1821 -#define wxTextCtrl_CanRedo 1822 -#define wxTextCtrl_CanUndo 1823 -#define wxTextCtrl_Clear 1824 -#define wxTextCtrl_Copy 1825 -#define wxTextCtrl_Create 1826 -#define wxTextCtrl_Cut 1827 -#define wxTextCtrl_DiscardEdits 1828 -#define wxTextCtrl_ChangeValue 1829 -#define wxTextCtrl_EmulateKeyPress 1830 -#define wxTextCtrl_GetDefaultStyle 1831 -#define wxTextCtrl_GetInsertionPoint 1832 -#define wxTextCtrl_GetLastPosition 1833 -#define wxTextCtrl_GetLineLength 1834 -#define wxTextCtrl_GetLineText 1835 -#define wxTextCtrl_GetNumberOfLines 1836 -#define wxTextCtrl_GetRange 1837 -#define wxTextCtrl_GetSelection 1838 -#define wxTextCtrl_GetStringSelection 1839 -#define wxTextCtrl_GetStyle 1840 -#define wxTextCtrl_GetValue 1841 -#define wxTextCtrl_IsEditable 1842 -#define wxTextCtrl_IsModified 1843 -#define wxTextCtrl_IsMultiLine 1844 -#define wxTextCtrl_IsSingleLine 1845 -#define wxTextCtrl_LoadFile 1846 -#define wxTextCtrl_MarkDirty 1847 -#define wxTextCtrl_Paste 1848 -#define wxTextCtrl_PositionToXY 1849 -#define wxTextCtrl_Redo 1850 -#define wxTextCtrl_Remove 1851 -#define wxTextCtrl_Replace 1852 -#define wxTextCtrl_SaveFile 1853 -#define wxTextCtrl_SetDefaultStyle 1854 -#define wxTextCtrl_SetEditable 1855 -#define wxTextCtrl_SetInsertionPoint 1856 -#define wxTextCtrl_SetInsertionPointEnd 1857 -#define wxTextCtrl_SetMaxLength 1859 -#define wxTextCtrl_SetSelection 1860 -#define wxTextCtrl_SetStyle 1861 -#define wxTextCtrl_SetValue 1862 -#define wxTextCtrl_ShowPosition 1863 -#define wxTextCtrl_Undo 1864 -#define wxTextCtrl_WriteText 1865 -#define wxTextCtrl_XYToPosition 1866 -#define wxNotebook_new_0 1869 -#define wxNotebook_new_3 1870 -#define wxNotebook_destruct 1871 -#define wxNotebook_AddPage 1872 -#define wxNotebook_AdvanceSelection 1873 -#define wxNotebook_AssignImageList 1874 -#define wxNotebook_Create 1875 -#define wxNotebook_DeleteAllPages 1876 -#define wxNotebook_DeletePage 1877 -#define wxNotebook_RemovePage 1878 -#define wxNotebook_GetCurrentPage 1879 -#define wxNotebook_GetImageList 1880 -#define wxNotebook_GetPage 1882 -#define wxNotebook_GetPageCount 1883 -#define wxNotebook_GetPageImage 1884 -#define wxNotebook_GetPageText 1885 -#define wxNotebook_GetRowCount 1886 -#define wxNotebook_GetSelection 1887 -#define wxNotebook_GetThemeBackgroundColour 1888 -#define wxNotebook_HitTest 1890 -#define wxNotebook_InsertPage 1892 -#define wxNotebook_SetImageList 1893 -#define wxNotebook_SetPadding 1894 -#define wxNotebook_SetPageSize 1895 -#define wxNotebook_SetPageImage 1896 -#define wxNotebook_SetPageText 1897 -#define wxNotebook_SetSelection 1898 -#define wxNotebook_ChangeSelection 1899 -#define wxChoicebook_new_0 1900 -#define wxChoicebook_new_3 1901 -#define wxChoicebook_AddPage 1902 -#define wxChoicebook_AdvanceSelection 1903 -#define wxChoicebook_AssignImageList 1904 -#define wxChoicebook_Create 1905 -#define wxChoicebook_DeleteAllPages 1906 -#define wxChoicebook_DeletePage 1907 -#define wxChoicebook_RemovePage 1908 -#define wxChoicebook_GetCurrentPage 1909 -#define wxChoicebook_GetImageList 1910 -#define wxChoicebook_GetPage 1912 -#define wxChoicebook_GetPageCount 1913 -#define wxChoicebook_GetPageImage 1914 -#define wxChoicebook_GetPageText 1915 -#define wxChoicebook_GetSelection 1916 -#define wxChoicebook_HitTest 1917 -#define wxChoicebook_InsertPage 1918 -#define wxChoicebook_SetImageList 1919 -#define wxChoicebook_SetPageSize 1920 -#define wxChoicebook_SetPageImage 1921 -#define wxChoicebook_SetPageText 1922 -#define wxChoicebook_SetSelection 1923 -#define wxChoicebook_ChangeSelection 1924 -#define wxChoicebook_destroy 1925 -#define wxToolbook_new_0 1926 -#define wxToolbook_new_3 1927 -#define wxToolbook_AddPage 1928 -#define wxToolbook_AdvanceSelection 1929 -#define wxToolbook_AssignImageList 1930 -#define wxToolbook_Create 1931 -#define wxToolbook_DeleteAllPages 1932 -#define wxToolbook_DeletePage 1933 -#define wxToolbook_RemovePage 1934 -#define wxToolbook_GetCurrentPage 1935 -#define wxToolbook_GetImageList 1936 -#define wxToolbook_GetPage 1938 -#define wxToolbook_GetPageCount 1939 -#define wxToolbook_GetPageImage 1940 -#define wxToolbook_GetPageText 1941 -#define wxToolbook_GetSelection 1942 -#define wxToolbook_HitTest 1944 -#define wxToolbook_InsertPage 1945 -#define wxToolbook_SetImageList 1946 -#define wxToolbook_SetPageSize 1947 -#define wxToolbook_SetPageImage 1948 -#define wxToolbook_SetPageText 1949 -#define wxToolbook_SetSelection 1950 -#define wxToolbook_ChangeSelection 1951 -#define wxToolbook_destroy 1952 -#define wxListbook_new_0 1953 -#define wxListbook_new_3 1954 -#define wxListbook_AddPage 1955 -#define wxListbook_AdvanceSelection 1956 -#define wxListbook_AssignImageList 1957 -#define wxListbook_Create 1958 -#define wxListbook_DeleteAllPages 1959 -#define wxListbook_DeletePage 1960 -#define wxListbook_RemovePage 1961 -#define wxListbook_GetCurrentPage 1962 -#define wxListbook_GetImageList 1963 -#define wxListbook_GetPage 1965 -#define wxListbook_GetPageCount 1966 -#define wxListbook_GetPageImage 1967 -#define wxListbook_GetPageText 1968 -#define wxListbook_GetSelection 1969 -#define wxListbook_HitTest 1971 -#define wxListbook_InsertPage 1972 -#define wxListbook_SetImageList 1973 -#define wxListbook_SetPageSize 1974 -#define wxListbook_SetPageImage 1975 -#define wxListbook_SetPageText 1976 -#define wxListbook_SetSelection 1977 -#define wxListbook_ChangeSelection 1978 -#define wxListbook_destroy 1979 -#define wxTreebook_new_0 1980 -#define wxTreebook_new_3 1981 -#define wxTreebook_AddPage 1982 -#define wxTreebook_AdvanceSelection 1983 -#define wxTreebook_AssignImageList 1984 -#define wxTreebook_Create 1985 -#define wxTreebook_DeleteAllPages 1986 -#define wxTreebook_DeletePage 1987 -#define wxTreebook_RemovePage 1988 -#define wxTreebook_GetCurrentPage 1989 -#define wxTreebook_GetImageList 1990 -#define wxTreebook_GetPage 1992 -#define wxTreebook_GetPageCount 1993 -#define wxTreebook_GetPageImage 1994 -#define wxTreebook_GetPageText 1995 -#define wxTreebook_GetSelection 1996 -#define wxTreebook_ExpandNode 1997 -#define wxTreebook_IsNodeExpanded 1998 -#define wxTreebook_HitTest 2000 -#define wxTreebook_InsertPage 2001 -#define wxTreebook_InsertSubPage 2002 -#define wxTreebook_SetImageList 2003 -#define wxTreebook_SetPageSize 2004 -#define wxTreebook_SetPageImage 2005 -#define wxTreebook_SetPageText 2006 -#define wxTreebook_SetSelection 2007 -#define wxTreebook_ChangeSelection 2008 -#define wxTreebook_destroy 2009 -#define wxTreeCtrl_new_2 2012 -#define wxTreeCtrl_new_0 2013 -#define wxTreeCtrl_destruct 2015 -#define wxTreeCtrl_AddRoot 2016 -#define wxTreeCtrl_AppendItem 2017 -#define wxTreeCtrl_AssignImageList 2018 -#define wxTreeCtrl_AssignStateImageList 2019 -#define wxTreeCtrl_Collapse 2020 -#define wxTreeCtrl_CollapseAndReset 2021 -#define wxTreeCtrl_Create 2022 -#define wxTreeCtrl_Delete 2023 -#define wxTreeCtrl_DeleteAllItems 2024 -#define wxTreeCtrl_DeleteChildren 2025 -#define wxTreeCtrl_EditLabel 2026 -#define wxTreeCtrl_EnsureVisible 2027 -#define wxTreeCtrl_Expand 2028 -#define wxTreeCtrl_GetBoundingRect 2029 -#define wxTreeCtrl_GetChildrenCount 2031 -#define wxTreeCtrl_GetCount 2032 -#define wxTreeCtrl_GetEditControl 2033 -#define wxTreeCtrl_GetFirstChild 2034 -#define wxTreeCtrl_GetNextChild 2035 -#define wxTreeCtrl_GetFirstVisibleItem 2036 -#define wxTreeCtrl_GetImageList 2037 -#define wxTreeCtrl_GetIndent 2038 -#define wxTreeCtrl_GetItemBackgroundColour 2039 -#define wxTreeCtrl_GetItemData 2040 -#define wxTreeCtrl_GetItemFont 2041 -#define wxTreeCtrl_GetItemImage_1 2042 -#define wxTreeCtrl_GetItemImage_2 2043 -#define wxTreeCtrl_GetItemText 2044 -#define wxTreeCtrl_GetItemTextColour 2045 -#define wxTreeCtrl_GetLastChild 2046 -#define wxTreeCtrl_GetNextSibling 2047 -#define wxTreeCtrl_GetNextVisible 2048 -#define wxTreeCtrl_GetItemParent 2049 -#define wxTreeCtrl_GetPrevSibling 2050 -#define wxTreeCtrl_GetPrevVisible 2051 -#define wxTreeCtrl_GetRootItem 2052 -#define wxTreeCtrl_GetSelection 2053 -#define wxTreeCtrl_GetSelections 2054 -#define wxTreeCtrl_GetStateImageList 2055 -#define wxTreeCtrl_HitTest 2056 -#define wxTreeCtrl_InsertItem 2058 -#define wxTreeCtrl_IsBold 2059 -#define wxTreeCtrl_IsExpanded 2060 -#define wxTreeCtrl_IsSelected 2061 -#define wxTreeCtrl_IsVisible 2062 -#define wxTreeCtrl_ItemHasChildren 2063 -#define wxTreeCtrl_IsTreeItemIdOk 2064 -#define wxTreeCtrl_PrependItem 2065 -#define wxTreeCtrl_ScrollTo 2066 -#define wxTreeCtrl_SelectItem_1 2067 -#define wxTreeCtrl_SelectItem_2 2068 -#define wxTreeCtrl_SetIndent 2069 -#define wxTreeCtrl_SetImageList 2070 -#define wxTreeCtrl_SetItemBackgroundColour 2071 -#define wxTreeCtrl_SetItemBold 2072 -#define wxTreeCtrl_SetItemData 2073 -#define wxTreeCtrl_SetItemDropHighlight 2074 -#define wxTreeCtrl_SetItemFont 2075 -#define wxTreeCtrl_SetItemHasChildren 2076 -#define wxTreeCtrl_SetItemImage_2 2077 -#define wxTreeCtrl_SetItemImage_3 2078 -#define wxTreeCtrl_SetItemText 2079 -#define wxTreeCtrl_SetItemTextColour 2080 -#define wxTreeCtrl_SetStateImageList 2081 -#define wxTreeCtrl_SetWindowStyle 2082 -#define wxTreeCtrl_SortChildren 2083 -#define wxTreeCtrl_Toggle 2084 -#define wxTreeCtrl_ToggleItemSelection 2085 -#define wxTreeCtrl_Unselect 2086 -#define wxTreeCtrl_UnselectAll 2087 -#define wxTreeCtrl_UnselectItem 2088 -#define wxScrollBar_new_0 2089 -#define wxScrollBar_new_3 2090 -#define wxScrollBar_destruct 2091 -#define wxScrollBar_Create 2092 -#define wxScrollBar_GetRange 2093 -#define wxScrollBar_GetPageSize 2094 -#define wxScrollBar_GetThumbPosition 2095 -#define wxScrollBar_GetThumbSize 2096 -#define wxScrollBar_SetThumbPosition 2097 -#define wxScrollBar_SetScrollbar 2098 -#define wxSpinButton_new_2 2100 -#define wxSpinButton_new_0 2101 -#define wxSpinButton_Create 2102 -#define wxSpinButton_GetMax 2103 -#define wxSpinButton_GetMin 2104 -#define wxSpinButton_GetValue 2105 -#define wxSpinButton_SetRange 2106 -#define wxSpinButton_SetValue 2107 -#define wxSpinButton_destroy 2108 -#define wxSpinCtrl_new_0 2109 -#define wxSpinCtrl_new_2 2110 -#define wxSpinCtrl_Create 2112 -#define wxSpinCtrl_SetValue_1_1 2115 -#define wxSpinCtrl_SetValue_1_0 2116 -#define wxSpinCtrl_GetValue 2118 -#define wxSpinCtrl_SetRange 2120 -#define wxSpinCtrl_SetSelection 2121 -#define wxSpinCtrl_GetMin 2123 -#define wxSpinCtrl_GetMax 2125 -#define wxSpinCtrl_destroy 2126 -#define wxStaticText_new_0 2127 -#define wxStaticText_new_4 2128 -#define wxStaticText_Create 2129 -#define wxStaticText_GetLabel 2130 -#define wxStaticText_SetLabel 2131 -#define wxStaticText_Wrap 2132 -#define wxStaticText_destroy 2133 -#define wxStaticBitmap_new_0 2134 -#define wxStaticBitmap_new_4 2135 -#define wxStaticBitmap_Create 2136 -#define wxStaticBitmap_GetBitmap 2137 -#define wxStaticBitmap_SetBitmap 2138 -#define wxStaticBitmap_destroy 2139 -#define wxRadioBox_new 2140 -#define wxRadioBox_destruct 2142 -#define wxRadioBox_Create 2143 -#define wxRadioBox_Enable_2 2144 -#define wxRadioBox_Enable_1 2145 -#define wxRadioBox_GetSelection 2146 -#define wxRadioBox_GetString 2147 -#define wxRadioBox_SetSelection 2148 -#define wxRadioBox_Show_2 2149 -#define wxRadioBox_Show_1 2150 -#define wxRadioBox_GetColumnCount 2151 -#define wxRadioBox_GetItemHelpText 2152 -#define wxRadioBox_GetItemToolTip 2153 -#define wxRadioBox_GetItemFromPoint 2155 -#define wxRadioBox_GetRowCount 2156 -#define wxRadioBox_IsItemEnabled 2157 -#define wxRadioBox_IsItemShown 2158 -#define wxRadioBox_SetItemHelpText 2159 -#define wxRadioBox_SetItemToolTip 2160 -#define wxRadioButton_new_0 2161 -#define wxRadioButton_new_4 2162 -#define wxRadioButton_Create 2163 -#define wxRadioButton_GetValue 2164 -#define wxRadioButton_SetValue 2165 -#define wxRadioButton_destroy 2166 -#define wxSlider_new_6 2168 -#define wxSlider_new_0 2169 -#define wxSlider_Create 2170 -#define wxSlider_GetLineSize 2171 -#define wxSlider_GetMax 2172 -#define wxSlider_GetMin 2173 -#define wxSlider_GetPageSize 2174 -#define wxSlider_GetThumbLength 2175 -#define wxSlider_GetValue 2176 -#define wxSlider_SetLineSize 2177 -#define wxSlider_SetPageSize 2178 -#define wxSlider_SetRange 2179 -#define wxSlider_SetThumbLength 2180 -#define wxSlider_SetValue 2181 -#define wxSlider_destroy 2182 -#define wxDialog_new_4 2184 -#define wxDialog_new_0 2185 -#define wxDialog_destruct 2187 -#define wxDialog_Create 2188 -#define wxDialog_CreateButtonSizer 2189 -#define wxDialog_CreateStdDialogButtonSizer 2190 -#define wxDialog_EndModal 2191 -#define wxDialog_GetAffirmativeId 2192 -#define wxDialog_GetReturnCode 2193 -#define wxDialog_IsModal 2194 -#define wxDialog_SetAffirmativeId 2195 -#define wxDialog_SetReturnCode 2196 -#define wxDialog_Show 2197 -#define wxDialog_ShowModal 2198 -#define wxColourDialog_new_0 2199 -#define wxColourDialog_new_2 2200 -#define wxColourDialog_destruct 2201 -#define wxColourDialog_Create 2202 -#define wxColourDialog_GetColourData 2203 -#define wxColourData_new_0 2204 -#define wxColourData_new_1 2205 -#define wxColourData_destruct 2206 -#define wxColourData_GetChooseFull 2207 -#define wxColourData_GetColour 2208 -#define wxColourData_GetCustomColour 2210 -#define wxColourData_SetChooseFull 2211 -#define wxColourData_SetColour 2212 -#define wxColourData_SetCustomColour 2213 -#define wxPalette_new_0 2214 -#define wxPalette_new_4 2215 -#define wxPalette_destruct 2217 -#define wxPalette_Create 2218 -#define wxPalette_GetColoursCount 2219 -#define wxPalette_GetPixel 2220 -#define wxPalette_GetRGB 2221 -#define wxPalette_IsOk 2222 -#define wxDirDialog_new 2226 -#define wxDirDialog_destruct 2227 -#define wxDirDialog_GetPath 2228 -#define wxDirDialog_GetMessage 2229 -#define wxDirDialog_SetMessage 2230 -#define wxDirDialog_SetPath 2231 -#define wxFileDialog_new 2235 -#define wxFileDialog_destruct 2236 -#define wxFileDialog_GetDirectory 2237 -#define wxFileDialog_GetFilename 2238 -#define wxFileDialog_GetFilenames 2239 -#define wxFileDialog_GetFilterIndex 2240 -#define wxFileDialog_GetMessage 2241 -#define wxFileDialog_GetPath 2242 -#define wxFileDialog_GetPaths 2243 -#define wxFileDialog_GetWildcard 2244 -#define wxFileDialog_SetDirectory 2245 -#define wxFileDialog_SetFilename 2246 -#define wxFileDialog_SetFilterIndex 2247 -#define wxFileDialog_SetMessage 2248 -#define wxFileDialog_SetPath 2249 -#define wxFileDialog_SetWildcard 2250 -#define wxPickerBase_SetInternalMargin 2251 -#define wxPickerBase_GetInternalMargin 2252 -#define wxPickerBase_SetTextCtrlProportion 2253 -#define wxPickerBase_SetPickerCtrlProportion 2254 -#define wxPickerBase_GetTextCtrlProportion 2255 -#define wxPickerBase_GetPickerCtrlProportion 2256 -#define wxPickerBase_HasTextCtrl 2257 -#define wxPickerBase_GetTextCtrl 2258 -#define wxPickerBase_IsTextCtrlGrowable 2259 -#define wxPickerBase_SetPickerCtrlGrowable 2260 -#define wxPickerBase_SetTextCtrlGrowable 2261 -#define wxPickerBase_IsPickerCtrlGrowable 2262 -#define wxFilePickerCtrl_new_0 2263 -#define wxFilePickerCtrl_new_3 2264 -#define wxFilePickerCtrl_Create 2265 -#define wxFilePickerCtrl_GetPath 2266 -#define wxFilePickerCtrl_SetPath 2267 -#define wxFilePickerCtrl_destroy 2268 -#define wxDirPickerCtrl_new_0 2269 -#define wxDirPickerCtrl_new_3 2270 -#define wxDirPickerCtrl_Create 2271 -#define wxDirPickerCtrl_GetPath 2272 -#define wxDirPickerCtrl_SetPath 2273 -#define wxDirPickerCtrl_destroy 2274 -#define wxColourPickerCtrl_new_0 2275 -#define wxColourPickerCtrl_new_3 2276 -#define wxColourPickerCtrl_Create 2277 -#define wxColourPickerCtrl_GetColour 2278 -#define wxColourPickerCtrl_SetColour_1_1 2279 -#define wxColourPickerCtrl_SetColour_1_0 2280 -#define wxColourPickerCtrl_destroy 2281 -#define wxDatePickerCtrl_new_0 2282 -#define wxDatePickerCtrl_new_3 2283 -#define wxDatePickerCtrl_GetRange 2284 -#define wxDatePickerCtrl_GetValue 2285 -#define wxDatePickerCtrl_SetRange 2286 -#define wxDatePickerCtrl_SetValue 2287 -#define wxDatePickerCtrl_destroy 2288 -#define wxFontPickerCtrl_new_0 2289 -#define wxFontPickerCtrl_new_3 2290 -#define wxFontPickerCtrl_Create 2291 -#define wxFontPickerCtrl_GetSelectedFont 2292 -#define wxFontPickerCtrl_SetSelectedFont 2293 -#define wxFontPickerCtrl_GetMaxPointSize 2294 -#define wxFontPickerCtrl_SetMaxPointSize 2295 -#define wxFontPickerCtrl_destroy 2296 -#define wxFindReplaceDialog_new_0 2299 -#define wxFindReplaceDialog_new_4 2300 -#define wxFindReplaceDialog_destruct 2301 -#define wxFindReplaceDialog_Create 2302 -#define wxFindReplaceDialog_GetData 2303 -#define wxFindReplaceData_new_0 2304 -#define wxFindReplaceData_new_1 2305 -#define wxFindReplaceData_GetFindString 2306 -#define wxFindReplaceData_GetReplaceString 2307 -#define wxFindReplaceData_GetFlags 2308 -#define wxFindReplaceData_SetFlags 2309 -#define wxFindReplaceData_SetFindString 2310 -#define wxFindReplaceData_SetReplaceString 2311 -#define wxFindReplaceData_destroy 2312 -#define wxMultiChoiceDialog_new_0 2313 -#define wxMultiChoiceDialog_new_5 2315 -#define wxMultiChoiceDialog_GetSelections 2316 -#define wxMultiChoiceDialog_SetSelections 2317 -#define wxMultiChoiceDialog_destroy 2318 -#define wxSingleChoiceDialog_new_0 2319 -#define wxSingleChoiceDialog_new_5 2321 -#define wxSingleChoiceDialog_GetSelection 2322 -#define wxSingleChoiceDialog_GetStringSelection 2323 -#define wxSingleChoiceDialog_SetSelection 2324 -#define wxSingleChoiceDialog_destroy 2325 -#define wxTextEntryDialog_new 2326 -#define wxTextEntryDialog_GetValue 2327 -#define wxTextEntryDialog_SetValue 2328 -#define wxTextEntryDialog_destroy 2329 -#define wxPasswordEntryDialog_new 2330 -#define wxPasswordEntryDialog_destroy 2331 -#define wxFontData_new_0 2332 -#define wxFontData_new_1 2333 -#define wxFontData_destruct 2334 -#define wxFontData_EnableEffects 2335 -#define wxFontData_GetAllowSymbols 2336 -#define wxFontData_GetColour 2337 -#define wxFontData_GetChosenFont 2338 -#define wxFontData_GetEnableEffects 2339 -#define wxFontData_GetInitialFont 2340 -#define wxFontData_GetShowHelp 2341 -#define wxFontData_SetAllowSymbols 2342 -#define wxFontData_SetChosenFont 2343 -#define wxFontData_SetColour 2344 -#define wxFontData_SetInitialFont 2345 -#define wxFontData_SetRange 2346 -#define wxFontData_SetShowHelp 2347 -#define wxFontDialog_new_0 2351 -#define wxFontDialog_new_2 2353 -#define wxFontDialog_Create 2355 -#define wxFontDialog_GetFontData 2356 -#define wxFontDialog_destroy 2358 -#define wxProgressDialog_new 2359 -#define wxProgressDialog_destruct 2360 -#define wxProgressDialog_Resume 2361 -#define wxProgressDialog_Update_2 2362 -#define wxProgressDialog_Update_0 2363 -#define wxMessageDialog_new 2364 -#define wxMessageDialog_destruct 2365 -#define wxPageSetupDialog_new 2366 -#define wxPageSetupDialog_destruct 2367 -#define wxPageSetupDialog_GetPageSetupData 2368 -#define wxPageSetupDialog_ShowModal 2369 -#define wxPageSetupDialogData_new_0 2370 -#define wxPageSetupDialogData_new_1_0 2371 -#define wxPageSetupDialogData_new_1_1 2372 -#define wxPageSetupDialogData_destruct 2373 -#define wxPageSetupDialogData_EnableHelp 2374 -#define wxPageSetupDialogData_EnableMargins 2375 -#define wxPageSetupDialogData_EnableOrientation 2376 -#define wxPageSetupDialogData_EnablePaper 2377 -#define wxPageSetupDialogData_EnablePrinter 2378 -#define wxPageSetupDialogData_GetDefaultMinMargins 2379 -#define wxPageSetupDialogData_GetEnableMargins 2380 -#define wxPageSetupDialogData_GetEnableOrientation 2381 -#define wxPageSetupDialogData_GetEnablePaper 2382 -#define wxPageSetupDialogData_GetEnablePrinter 2383 -#define wxPageSetupDialogData_GetEnableHelp 2384 -#define wxPageSetupDialogData_GetDefaultInfo 2385 -#define wxPageSetupDialogData_GetMarginTopLeft 2386 -#define wxPageSetupDialogData_GetMarginBottomRight 2387 -#define wxPageSetupDialogData_GetMinMarginTopLeft 2388 -#define wxPageSetupDialogData_GetMinMarginBottomRight 2389 -#define wxPageSetupDialogData_GetPaperId 2390 -#define wxPageSetupDialogData_GetPaperSize 2391 -#define wxPageSetupDialogData_GetPrintData 2393 -#define wxPageSetupDialogData_IsOk 2394 -#define wxPageSetupDialogData_SetDefaultInfo 2395 -#define wxPageSetupDialogData_SetDefaultMinMargins 2396 -#define wxPageSetupDialogData_SetMarginTopLeft 2397 -#define wxPageSetupDialogData_SetMarginBottomRight 2398 -#define wxPageSetupDialogData_SetMinMarginTopLeft 2399 -#define wxPageSetupDialogData_SetMinMarginBottomRight 2400 -#define wxPageSetupDialogData_SetPaperId 2401 -#define wxPageSetupDialogData_SetPaperSize_1_1 2402 -#define wxPageSetupDialogData_SetPaperSize_1_0 2403 -#define wxPageSetupDialogData_SetPrintData 2404 -#define wxPrintDialog_new_2_0 2405 -#define wxPrintDialog_new_2_1 2406 -#define wxPrintDialog_destruct 2407 -#define wxPrintDialog_GetPrintDialogData 2408 -#define wxPrintDialog_GetPrintDC 2409 -#define wxPrintDialogData_new_0 2410 -#define wxPrintDialogData_new_1_1 2411 -#define wxPrintDialogData_new_1_0 2412 -#define wxPrintDialogData_destruct 2413 -#define wxPrintDialogData_EnableHelp 2414 -#define wxPrintDialogData_EnablePageNumbers 2415 -#define wxPrintDialogData_EnablePrintToFile 2416 -#define wxPrintDialogData_EnableSelection 2417 -#define wxPrintDialogData_GetAllPages 2418 -#define wxPrintDialogData_GetCollate 2419 -#define wxPrintDialogData_GetFromPage 2420 -#define wxPrintDialogData_GetMaxPage 2421 -#define wxPrintDialogData_GetMinPage 2422 -#define wxPrintDialogData_GetNoCopies 2423 -#define wxPrintDialogData_GetPrintData 2424 -#define wxPrintDialogData_GetPrintToFile 2425 -#define wxPrintDialogData_GetSelection 2426 -#define wxPrintDialogData_GetToPage 2427 -#define wxPrintDialogData_IsOk 2428 -#define wxPrintDialogData_SetCollate 2429 -#define wxPrintDialogData_SetFromPage 2430 -#define wxPrintDialogData_SetMaxPage 2431 -#define wxPrintDialogData_SetMinPage 2432 -#define wxPrintDialogData_SetNoCopies 2433 -#define wxPrintDialogData_SetPrintData 2434 -#define wxPrintDialogData_SetPrintToFile 2435 -#define wxPrintDialogData_SetSelection 2436 -#define wxPrintDialogData_SetToPage 2437 -#define wxPrintData_new_0 2438 -#define wxPrintData_new_1 2439 -#define wxPrintData_destruct 2440 -#define wxPrintData_GetCollate 2441 -#define wxPrintData_GetBin 2442 -#define wxPrintData_GetColour 2443 -#define wxPrintData_GetDuplex 2444 -#define wxPrintData_GetNoCopies 2445 -#define wxPrintData_GetOrientation 2446 -#define wxPrintData_GetPaperId 2447 -#define wxPrintData_GetPrinterName 2448 -#define wxPrintData_GetQuality 2449 -#define wxPrintData_IsOk 2450 -#define wxPrintData_SetBin 2451 -#define wxPrintData_SetCollate 2452 -#define wxPrintData_SetColour 2453 -#define wxPrintData_SetDuplex 2454 -#define wxPrintData_SetNoCopies 2455 -#define wxPrintData_SetOrientation 2456 -#define wxPrintData_SetPaperId 2457 -#define wxPrintData_SetPrinterName 2458 -#define wxPrintData_SetQuality 2459 -#define wxPrintPreview_new_2 2462 -#define wxPrintPreview_new_3 2463 -#define wxPrintPreview_destruct 2465 -#define wxPrintPreview_GetCanvas 2466 -#define wxPrintPreview_GetCurrentPage 2467 -#define wxPrintPreview_GetFrame 2468 -#define wxPrintPreview_GetMaxPage 2469 -#define wxPrintPreview_GetMinPage 2470 -#define wxPrintPreview_GetPrintout 2471 -#define wxPrintPreview_GetPrintoutForPrinting 2472 -#define wxPrintPreview_IsOk 2473 -#define wxPrintPreview_PaintPage 2474 -#define wxPrintPreview_Print 2475 -#define wxPrintPreview_RenderPage 2476 -#define wxPrintPreview_SetCanvas 2477 -#define wxPrintPreview_SetCurrentPage 2478 -#define wxPrintPreview_SetFrame 2479 -#define wxPrintPreview_SetPrintout 2480 -#define wxPrintPreview_SetZoom 2481 -#define wxPreviewFrame_new 2482 -#define wxPreviewFrame_destruct 2483 -#define wxPreviewFrame_CreateControlBar 2484 -#define wxPreviewFrame_CreateCanvas 2485 -#define wxPreviewFrame_Initialize 2486 -#define wxPreviewFrame_OnCloseWindow 2487 -#define wxPreviewControlBar_new 2488 -#define wxPreviewControlBar_destruct 2489 -#define wxPreviewControlBar_CreateButtons 2490 -#define wxPreviewControlBar_GetPrintPreview 2491 -#define wxPreviewControlBar_GetZoomControl 2492 -#define wxPreviewControlBar_SetZoomControl 2493 -#define wxPrinter_new 2495 -#define wxPrinter_CreateAbortWindow 2496 -#define wxPrinter_GetAbort 2497 -#define wxPrinter_GetLastError 2498 -#define wxPrinter_GetPrintDialogData 2499 -#define wxPrinter_Print 2500 -#define wxPrinter_PrintDialog 2501 -#define wxPrinter_ReportError 2502 -#define wxPrinter_Setup 2503 -#define wxPrinter_destroy 2504 -#define wxXmlResource_new_1 2505 -#define wxXmlResource_new_2 2506 -#define wxXmlResource_destruct 2507 -#define wxXmlResource_AttachUnknownControl 2508 -#define wxXmlResource_ClearHandlers 2509 -#define wxXmlResource_CompareVersion 2510 -#define wxXmlResource_Get 2511 -#define wxXmlResource_GetFlags 2512 -#define wxXmlResource_GetVersion 2513 -#define wxXmlResource_GetXRCID 2514 -#define wxXmlResource_InitAllHandlers 2515 -#define wxXmlResource_Load 2516 -#define wxXmlResource_LoadBitmap 2517 -#define wxXmlResource_LoadDialog_2 2518 -#define wxXmlResource_LoadDialog_3 2519 -#define wxXmlResource_LoadFrame_2 2520 -#define wxXmlResource_LoadFrame_3 2521 -#define wxXmlResource_LoadIcon 2522 -#define wxXmlResource_LoadMenu 2523 -#define wxXmlResource_LoadMenuBar_2 2524 -#define wxXmlResource_LoadMenuBar_1 2525 -#define wxXmlResource_LoadPanel_2 2526 -#define wxXmlResource_LoadPanel_3 2527 -#define wxXmlResource_LoadToolBar 2528 -#define wxXmlResource_Set 2529 -#define wxXmlResource_SetFlags 2530 -#define wxXmlResource_Unload 2531 -#define wxXmlResource_xrcctrl 2532 -#define wxHtmlEasyPrinting_new 2533 -#define wxHtmlEasyPrinting_destruct 2534 -#define wxHtmlEasyPrinting_GetPrintData 2535 -#define wxHtmlEasyPrinting_GetPageSetupData 2536 -#define wxHtmlEasyPrinting_PreviewFile 2537 -#define wxHtmlEasyPrinting_PreviewText 2538 -#define wxHtmlEasyPrinting_PrintFile 2539 -#define wxHtmlEasyPrinting_PrintText 2540 -#define wxHtmlEasyPrinting_PageSetup 2541 -#define wxHtmlEasyPrinting_SetFonts 2542 -#define wxHtmlEasyPrinting_SetHeader 2543 -#define wxHtmlEasyPrinting_SetFooter 2544 -#define wxGLCanvas_new_2 2546 -#define wxGLCanvas_new_3_1 2547 -#define wxGLCanvas_new_3_0 2548 -#define wxGLCanvas_GetContext 2549 -#define wxGLCanvas_SetCurrent 2551 -#define wxGLCanvas_SwapBuffers 2552 -#define wxGLCanvas_destroy 2553 -#define wxAuiManager_new 2554 -#define wxAuiManager_destruct 2555 -#define wxAuiManager_AddPane_2_1 2556 -#define wxAuiManager_AddPane_3 2557 -#define wxAuiManager_AddPane_2_0 2558 -#define wxAuiManager_DetachPane 2559 -#define wxAuiManager_GetAllPanes 2560 -#define wxAuiManager_GetArtProvider 2561 -#define wxAuiManager_GetDockSizeConstraint 2562 -#define wxAuiManager_GetFlags 2563 -#define wxAuiManager_GetManagedWindow 2564 -#define wxAuiManager_GetManager 2565 -#define wxAuiManager_GetPane_1_1 2566 -#define wxAuiManager_GetPane_1_0 2567 -#define wxAuiManager_HideHint 2568 -#define wxAuiManager_InsertPane 2569 -#define wxAuiManager_LoadPaneInfo 2570 -#define wxAuiManager_LoadPerspective 2571 -#define wxAuiManager_SavePaneInfo 2572 -#define wxAuiManager_SavePerspective 2573 -#define wxAuiManager_SetArtProvider 2574 -#define wxAuiManager_SetDockSizeConstraint 2575 -#define wxAuiManager_SetFlags 2576 -#define wxAuiManager_SetManagedWindow 2577 -#define wxAuiManager_ShowHint 2578 -#define wxAuiManager_UnInit 2579 -#define wxAuiManager_Update 2580 -#define wxAuiPaneInfo_new_0 2581 -#define wxAuiPaneInfo_new_1 2582 -#define wxAuiPaneInfo_destruct 2583 -#define wxAuiPaneInfo_BestSize_1 2584 -#define wxAuiPaneInfo_BestSize_2 2585 -#define wxAuiPaneInfo_Bottom 2586 -#define wxAuiPaneInfo_BottomDockable 2587 -#define wxAuiPaneInfo_Caption 2588 -#define wxAuiPaneInfo_CaptionVisible 2589 -#define wxAuiPaneInfo_Centre 2590 -#define wxAuiPaneInfo_CentrePane 2591 -#define wxAuiPaneInfo_CloseButton 2592 -#define wxAuiPaneInfo_DefaultPane 2593 -#define wxAuiPaneInfo_DestroyOnClose 2594 -#define wxAuiPaneInfo_Direction 2595 -#define wxAuiPaneInfo_Dock 2596 -#define wxAuiPaneInfo_Dockable 2597 -#define wxAuiPaneInfo_Fixed 2598 -#define wxAuiPaneInfo_Float 2599 -#define wxAuiPaneInfo_Floatable 2600 -#define wxAuiPaneInfo_FloatingPosition_1 2601 -#define wxAuiPaneInfo_FloatingPosition_2 2602 -#define wxAuiPaneInfo_FloatingSize_1 2603 -#define wxAuiPaneInfo_FloatingSize_2 2604 -#define wxAuiPaneInfo_Gripper 2605 -#define wxAuiPaneInfo_GripperTop 2606 -#define wxAuiPaneInfo_HasBorder 2607 -#define wxAuiPaneInfo_HasCaption 2608 -#define wxAuiPaneInfo_HasCloseButton 2609 -#define wxAuiPaneInfo_HasFlag 2610 -#define wxAuiPaneInfo_HasGripper 2611 -#define wxAuiPaneInfo_HasGripperTop 2612 -#define wxAuiPaneInfo_HasMaximizeButton 2613 -#define wxAuiPaneInfo_HasMinimizeButton 2614 -#define wxAuiPaneInfo_HasPinButton 2615 -#define wxAuiPaneInfo_Hide 2616 -#define wxAuiPaneInfo_IsBottomDockable 2617 -#define wxAuiPaneInfo_IsDocked 2618 -#define wxAuiPaneInfo_IsFixed 2619 -#define wxAuiPaneInfo_IsFloatable 2620 -#define wxAuiPaneInfo_IsFloating 2621 -#define wxAuiPaneInfo_IsLeftDockable 2622 -#define wxAuiPaneInfo_IsMovable 2623 -#define wxAuiPaneInfo_IsOk 2624 -#define wxAuiPaneInfo_IsResizable 2625 -#define wxAuiPaneInfo_IsRightDockable 2626 -#define wxAuiPaneInfo_IsShown 2627 -#define wxAuiPaneInfo_IsToolbar 2628 -#define wxAuiPaneInfo_IsTopDockable 2629 -#define wxAuiPaneInfo_Layer 2630 -#define wxAuiPaneInfo_Left 2631 -#define wxAuiPaneInfo_LeftDockable 2632 -#define wxAuiPaneInfo_MaxSize_1 2633 -#define wxAuiPaneInfo_MaxSize_2 2634 -#define wxAuiPaneInfo_MaximizeButton 2635 -#define wxAuiPaneInfo_MinSize_1 2636 -#define wxAuiPaneInfo_MinSize_2 2637 -#define wxAuiPaneInfo_MinimizeButton 2638 -#define wxAuiPaneInfo_Movable 2639 -#define wxAuiPaneInfo_Name 2640 -#define wxAuiPaneInfo_PaneBorder 2641 -#define wxAuiPaneInfo_PinButton 2642 -#define wxAuiPaneInfo_Position 2643 -#define wxAuiPaneInfo_Resizable 2644 -#define wxAuiPaneInfo_Right 2645 -#define wxAuiPaneInfo_RightDockable 2646 -#define wxAuiPaneInfo_Row 2647 -#define wxAuiPaneInfo_SafeSet 2648 -#define wxAuiPaneInfo_SetFlag 2649 -#define wxAuiPaneInfo_Show 2650 -#define wxAuiPaneInfo_ToolbarPane 2651 -#define wxAuiPaneInfo_Top 2652 -#define wxAuiPaneInfo_TopDockable 2653 -#define wxAuiPaneInfo_Window 2654 -#define wxAuiPaneInfo_GetWindow 2655 -#define wxAuiPaneInfo_GetFrame 2656 -#define wxAuiPaneInfo_GetDirection 2657 -#define wxAuiPaneInfo_GetLayer 2658 -#define wxAuiPaneInfo_GetRow 2659 -#define wxAuiPaneInfo_GetPosition 2660 -#define wxAuiPaneInfo_GetFloatingPosition 2661 -#define wxAuiPaneInfo_GetFloatingSize 2662 -#define wxAuiNotebook_new_0 2663 -#define wxAuiNotebook_new_2 2664 -#define wxAuiNotebook_AddPage 2665 -#define wxAuiNotebook_Create 2666 -#define wxAuiNotebook_DeletePage 2667 -#define wxAuiNotebook_GetArtProvider 2668 -#define wxAuiNotebook_GetPage 2669 -#define wxAuiNotebook_GetPageBitmap 2670 -#define wxAuiNotebook_GetPageCount 2671 -#define wxAuiNotebook_GetPageIndex 2672 -#define wxAuiNotebook_GetPageText 2673 -#define wxAuiNotebook_GetSelection 2674 -#define wxAuiNotebook_InsertPage 2675 -#define wxAuiNotebook_RemovePage 2676 -#define wxAuiNotebook_SetArtProvider 2677 -#define wxAuiNotebook_SetFont 2678 -#define wxAuiNotebook_SetPageBitmap 2679 -#define wxAuiNotebook_SetPageText 2680 -#define wxAuiNotebook_SetSelection 2681 -#define wxAuiNotebook_SetTabCtrlHeight 2682 -#define wxAuiNotebook_SetUniformBitmapSize 2683 -#define wxAuiNotebook_destroy 2684 -#define wxAuiTabArt_SetFlags 2685 -#define wxAuiTabArt_SetMeasuringFont 2686 -#define wxAuiTabArt_SetNormalFont 2687 -#define wxAuiTabArt_SetSelectedFont 2688 -#define wxAuiTabArt_SetColour 2689 -#define wxAuiTabArt_SetActiveColour 2690 -#define wxAuiDockArt_GetColour 2691 -#define wxAuiDockArt_GetFont 2692 -#define wxAuiDockArt_GetMetric 2693 -#define wxAuiDockArt_SetColour 2694 -#define wxAuiDockArt_SetFont 2695 -#define wxAuiDockArt_SetMetric 2696 -#define wxAuiSimpleTabArt_new 2697 -#define wxAuiSimpleTabArt_destroy 2698 -#define wxMDIParentFrame_new_0 2699 -#define wxMDIParentFrame_new_4 2700 -#define wxMDIParentFrame_destruct 2701 -#define wxMDIParentFrame_ActivateNext 2702 -#define wxMDIParentFrame_ActivatePrevious 2703 -#define wxMDIParentFrame_ArrangeIcons 2704 -#define wxMDIParentFrame_Cascade 2705 -#define wxMDIParentFrame_Create 2706 -#define wxMDIParentFrame_GetActiveChild 2707 -#define wxMDIParentFrame_GetClientWindow 2708 -#define wxMDIParentFrame_Tile 2709 -#define wxMDIChildFrame_new_0 2710 -#define wxMDIChildFrame_new_4 2711 -#define wxMDIChildFrame_destruct 2712 -#define wxMDIChildFrame_Activate 2713 -#define wxMDIChildFrame_Create 2714 -#define wxMDIChildFrame_Maximize 2715 -#define wxMDIChildFrame_Restore 2716 -#define wxMDIClientWindow_new_0 2717 -#define wxMDIClientWindow_new_2 2718 -#define wxMDIClientWindow_destruct 2719 -#define wxMDIClientWindow_CreateClient 2720 -#define wxLayoutAlgorithm_new 2721 -#define wxLayoutAlgorithm_LayoutFrame 2722 -#define wxLayoutAlgorithm_LayoutMDIFrame 2723 -#define wxLayoutAlgorithm_LayoutWindow 2724 -#define wxLayoutAlgorithm_destroy 2725 -#define wxEvent_GetId 2726 -#define wxEvent_GetSkipped 2727 -#define wxEvent_GetTimestamp 2728 -#define wxEvent_IsCommandEvent 2729 -#define wxEvent_ResumePropagation 2730 -#define wxEvent_ShouldPropagate 2731 -#define wxEvent_Skip 2732 -#define wxEvent_StopPropagation 2733 -#define wxCommandEvent_getClientData 2734 -#define wxCommandEvent_GetExtraLong 2735 -#define wxCommandEvent_GetInt 2736 -#define wxCommandEvent_GetSelection 2737 -#define wxCommandEvent_GetString 2738 -#define wxCommandEvent_IsChecked 2739 -#define wxCommandEvent_IsSelection 2740 -#define wxCommandEvent_SetInt 2741 -#define wxCommandEvent_SetString 2742 -#define wxScrollEvent_GetOrientation 2743 -#define wxScrollEvent_GetPosition 2744 -#define wxScrollWinEvent_GetOrientation 2745 -#define wxScrollWinEvent_GetPosition 2746 -#define wxMouseEvent_AltDown 2747 -#define wxMouseEvent_Button 2748 -#define wxMouseEvent_ButtonDClick 2749 -#define wxMouseEvent_ButtonDown 2750 -#define wxMouseEvent_ButtonUp 2751 -#define wxMouseEvent_CmdDown 2752 -#define wxMouseEvent_ControlDown 2753 -#define wxMouseEvent_Dragging 2754 -#define wxMouseEvent_Entering 2755 -#define wxMouseEvent_GetButton 2756 -#define wxMouseEvent_GetPosition 2759 -#define wxMouseEvent_GetLogicalPosition 2760 -#define wxMouseEvent_GetLinesPerAction 2761 -#define wxMouseEvent_GetWheelRotation 2762 -#define wxMouseEvent_GetWheelDelta 2763 -#define wxMouseEvent_GetX 2764 -#define wxMouseEvent_GetY 2765 -#define wxMouseEvent_IsButton 2766 -#define wxMouseEvent_IsPageScroll 2767 -#define wxMouseEvent_Leaving 2768 -#define wxMouseEvent_LeftDClick 2769 -#define wxMouseEvent_LeftDown 2770 -#define wxMouseEvent_LeftIsDown 2771 -#define wxMouseEvent_LeftUp 2772 -#define wxMouseEvent_MetaDown 2773 -#define wxMouseEvent_MiddleDClick 2774 -#define wxMouseEvent_MiddleDown 2775 -#define wxMouseEvent_MiddleIsDown 2776 -#define wxMouseEvent_MiddleUp 2777 -#define wxMouseEvent_Moving 2778 -#define wxMouseEvent_RightDClick 2779 -#define wxMouseEvent_RightDown 2780 -#define wxMouseEvent_RightIsDown 2781 -#define wxMouseEvent_RightUp 2782 -#define wxMouseEvent_ShiftDown 2783 -#define wxSetCursorEvent_GetCursor 2784 -#define wxSetCursorEvent_GetX 2785 -#define wxSetCursorEvent_GetY 2786 -#define wxSetCursorEvent_HasCursor 2787 -#define wxSetCursorEvent_SetCursor 2788 -#define wxKeyEvent_AltDown 2789 -#define wxKeyEvent_CmdDown 2790 -#define wxKeyEvent_ControlDown 2791 -#define wxKeyEvent_GetKeyCode 2792 -#define wxKeyEvent_GetModifiers 2793 -#define wxKeyEvent_GetPosition 2796 -#define wxKeyEvent_GetRawKeyCode 2797 -#define wxKeyEvent_GetRawKeyFlags 2798 -#define wxKeyEvent_GetUnicodeKey 2799 -#define wxKeyEvent_GetX 2800 -#define wxKeyEvent_GetY 2801 -#define wxKeyEvent_HasModifiers 2802 -#define wxKeyEvent_MetaDown 2803 -#define wxKeyEvent_ShiftDown 2804 -#define wxSizeEvent_GetSize 2805 -#define wxMoveEvent_GetPosition 2806 -#define wxEraseEvent_GetDC 2807 -#define wxFocusEvent_GetWindow 2808 -#define wxChildFocusEvent_GetWindow 2809 -#define wxMenuEvent_GetMenu 2810 -#define wxMenuEvent_GetMenuId 2811 -#define wxMenuEvent_IsPopup 2812 -#define wxCloseEvent_CanVeto 2813 -#define wxCloseEvent_GetLoggingOff 2814 -#define wxCloseEvent_SetCanVeto 2815 -#define wxCloseEvent_SetLoggingOff 2816 -#define wxCloseEvent_Veto 2817 -#define wxShowEvent_SetShow 2818 -#define wxShowEvent_GetShow 2819 -#define wxIconizeEvent_Iconized 2820 -#define wxJoystickEvent_ButtonDown 2821 -#define wxJoystickEvent_ButtonIsDown 2822 -#define wxJoystickEvent_ButtonUp 2823 -#define wxJoystickEvent_GetButtonChange 2824 -#define wxJoystickEvent_GetButtonState 2825 -#define wxJoystickEvent_GetJoystick 2826 -#define wxJoystickEvent_GetPosition 2827 -#define wxJoystickEvent_GetZPosition 2828 -#define wxJoystickEvent_IsButton 2829 -#define wxJoystickEvent_IsMove 2830 -#define wxJoystickEvent_IsZMove 2831 -#define wxUpdateUIEvent_CanUpdate 2832 -#define wxUpdateUIEvent_Check 2833 -#define wxUpdateUIEvent_Enable 2834 -#define wxUpdateUIEvent_Show 2835 -#define wxUpdateUIEvent_GetChecked 2836 -#define wxUpdateUIEvent_GetEnabled 2837 -#define wxUpdateUIEvent_GetShown 2838 -#define wxUpdateUIEvent_GetSetChecked 2839 -#define wxUpdateUIEvent_GetSetEnabled 2840 -#define wxUpdateUIEvent_GetSetShown 2841 -#define wxUpdateUIEvent_GetSetText 2842 -#define wxUpdateUIEvent_GetText 2843 -#define wxUpdateUIEvent_GetMode 2844 -#define wxUpdateUIEvent_GetUpdateInterval 2845 -#define wxUpdateUIEvent_ResetUpdateTime 2846 -#define wxUpdateUIEvent_SetMode 2847 -#define wxUpdateUIEvent_SetText 2848 -#define wxUpdateUIEvent_SetUpdateInterval 2849 -#define wxMouseCaptureChangedEvent_GetCapturedWindow 2850 -#define wxPaletteChangedEvent_SetChangedWindow 2851 -#define wxPaletteChangedEvent_GetChangedWindow 2852 -#define wxQueryNewPaletteEvent_SetPaletteRealized 2853 -#define wxQueryNewPaletteEvent_GetPaletteRealized 2854 -#define wxNavigationKeyEvent_GetDirection 2855 -#define wxNavigationKeyEvent_SetDirection 2856 -#define wxNavigationKeyEvent_IsWindowChange 2857 -#define wxNavigationKeyEvent_SetWindowChange 2858 -#define wxNavigationKeyEvent_IsFromTab 2859 -#define wxNavigationKeyEvent_SetFromTab 2860 -#define wxNavigationKeyEvent_GetCurrentFocus 2861 -#define wxNavigationKeyEvent_SetCurrentFocus 2862 -#define wxHelpEvent_GetOrigin 2863 -#define wxHelpEvent_GetPosition 2864 -#define wxHelpEvent_SetOrigin 2865 -#define wxHelpEvent_SetPosition 2866 -#define wxContextMenuEvent_GetPosition 2867 -#define wxContextMenuEvent_SetPosition 2868 -#define wxIdleEvent_CanSend 2869 -#define wxIdleEvent_GetMode 2870 -#define wxIdleEvent_RequestMore 2871 -#define wxIdleEvent_MoreRequested 2872 -#define wxIdleEvent_SetMode 2873 -#define wxGridEvent_AltDown 2874 -#define wxGridEvent_ControlDown 2875 -#define wxGridEvent_GetCol 2876 -#define wxGridEvent_GetPosition 2877 -#define wxGridEvent_GetRow 2878 -#define wxGridEvent_MetaDown 2879 -#define wxGridEvent_Selecting 2880 -#define wxGridEvent_ShiftDown 2881 -#define wxNotifyEvent_Allow 2882 -#define wxNotifyEvent_IsAllowed 2883 -#define wxNotifyEvent_Veto 2884 -#define wxSashEvent_GetEdge 2885 -#define wxSashEvent_GetDragRect 2886 -#define wxSashEvent_GetDragStatus 2887 -#define wxListEvent_GetCacheFrom 2888 -#define wxListEvent_GetCacheTo 2889 -#define wxListEvent_GetKeyCode 2890 -#define wxListEvent_GetIndex 2891 -#define wxListEvent_GetColumn 2892 -#define wxListEvent_GetPoint 2893 -#define wxListEvent_GetLabel 2894 -#define wxListEvent_GetText 2895 -#define wxListEvent_GetImage 2896 -#define wxListEvent_GetData 2897 -#define wxListEvent_GetMask 2898 -#define wxListEvent_GetItem 2899 -#define wxListEvent_IsEditCancelled 2900 -#define wxDateEvent_GetDate 2901 -#define wxCalendarEvent_GetWeekDay 2902 -#define wxFileDirPickerEvent_GetPath 2903 -#define wxColourPickerEvent_GetColour 2904 -#define wxFontPickerEvent_GetFont 2905 -#define wxStyledTextEvent_GetPosition 2906 -#define wxStyledTextEvent_GetKey 2907 -#define wxStyledTextEvent_GetModifiers 2908 -#define wxStyledTextEvent_GetModificationType 2909 -#define wxStyledTextEvent_GetText 2910 -#define wxStyledTextEvent_GetLength 2911 -#define wxStyledTextEvent_GetLinesAdded 2912 -#define wxStyledTextEvent_GetLine 2913 -#define wxStyledTextEvent_GetFoldLevelNow 2914 -#define wxStyledTextEvent_GetFoldLevelPrev 2915 -#define wxStyledTextEvent_GetMargin 2916 -#define wxStyledTextEvent_GetMessage 2917 -#define wxStyledTextEvent_GetWParam 2918 -#define wxStyledTextEvent_GetLParam 2919 -#define wxStyledTextEvent_GetListType 2920 -#define wxStyledTextEvent_GetX 2921 -#define wxStyledTextEvent_GetY 2922 -#define wxStyledTextEvent_GetDragText 2923 -#define wxStyledTextEvent_GetDragAllowMove 2924 -#define wxStyledTextEvent_GetDragResult 2925 -#define wxStyledTextEvent_GetShift 2926 -#define wxStyledTextEvent_GetControl 2927 -#define wxStyledTextEvent_GetAlt 2928 -#define utils_wxGetKeyState 2929 -#define utils_wxGetMousePosition 2930 -#define utils_wxGetMouseState 2931 -#define utils_wxSetDetectableAutoRepeat 2932 -#define utils_wxBell 2933 -#define utils_wxFindMenuItemId 2934 -#define utils_wxGenericFindWindowAtPoint 2935 -#define utils_wxFindWindowAtPoint 2936 -#define utils_wxBeginBusyCursor 2937 -#define utils_wxEndBusyCursor 2938 -#define utils_wxIsBusy 2939 -#define utils_wxShutdown 2940 -#define utils_wxShell 2941 -#define utils_wxLaunchDefaultBrowser 2942 -#define utils_wxGetEmailAddress 2943 -#define utils_wxGetUserId 2944 -#define utils_wxGetHomeDir 2945 -#define utils_wxNewId 2946 -#define utils_wxRegisterId 2947 -#define utils_wxGetCurrentId 2948 -#define utils_wxGetOsDescription 2949 -#define utils_wxIsPlatformLittleEndian 2950 -#define utils_wxIsPlatform64Bit 2951 -#define gdicmn_wxDisplaySize 2952 -#define gdicmn_wxSetCursor 2953 -#define wxPrintout_new 2954 -#define wxPrintout_destruct 2955 -#define wxPrintout_GetDC 2956 -#define wxPrintout_GetPageSizeMM 2957 -#define wxPrintout_GetPageSizePixels 2958 -#define wxPrintout_GetPaperRectPixels 2959 -#define wxPrintout_GetPPIPrinter 2960 -#define wxPrintout_GetPPIScreen 2961 -#define wxPrintout_GetTitle 2962 -#define wxPrintout_IsPreview 2963 -#define wxPrintout_FitThisSizeToPaper 2964 -#define wxPrintout_FitThisSizeToPage 2965 -#define wxPrintout_FitThisSizeToPageMargins 2966 -#define wxPrintout_MapScreenSizeToPaper 2967 -#define wxPrintout_MapScreenSizeToPage 2968 -#define wxPrintout_MapScreenSizeToPageMargins 2969 -#define wxPrintout_MapScreenSizeToDevice 2970 -#define wxPrintout_GetLogicalPaperRect 2971 -#define wxPrintout_GetLogicalPageRect 2972 -#define wxPrintout_GetLogicalPageMarginsRect 2973 -#define wxPrintout_SetLogicalOrigin 2974 -#define wxPrintout_OffsetLogicalOrigin 2975 -#define wxStyledTextCtrl_new_2 2976 -#define wxStyledTextCtrl_new_0 2977 -#define wxStyledTextCtrl_destruct 2978 -#define wxStyledTextCtrl_Create 2979 -#define wxStyledTextCtrl_AddText 2980 -#define wxStyledTextCtrl_AddStyledText 2981 -#define wxStyledTextCtrl_InsertText 2982 -#define wxStyledTextCtrl_ClearAll 2983 -#define wxStyledTextCtrl_ClearDocumentStyle 2984 -#define wxStyledTextCtrl_GetLength 2985 -#define wxStyledTextCtrl_GetCharAt 2986 -#define wxStyledTextCtrl_GetCurrentPos 2987 -#define wxStyledTextCtrl_GetAnchor 2988 -#define wxStyledTextCtrl_GetStyleAt 2989 -#define wxStyledTextCtrl_Redo 2990 -#define wxStyledTextCtrl_SetUndoCollection 2991 -#define wxStyledTextCtrl_SelectAll 2992 -#define wxStyledTextCtrl_SetSavePoint 2993 -#define wxStyledTextCtrl_GetStyledText 2994 -#define wxStyledTextCtrl_CanRedo 2995 -#define wxStyledTextCtrl_MarkerLineFromHandle 2996 -#define wxStyledTextCtrl_MarkerDeleteHandle 2997 -#define wxStyledTextCtrl_GetUndoCollection 2998 -#define wxStyledTextCtrl_GetViewWhiteSpace 2999 -#define wxStyledTextCtrl_SetViewWhiteSpace 3000 -#define wxStyledTextCtrl_PositionFromPoint 3001 -#define wxStyledTextCtrl_PositionFromPointClose 3002 -#define wxStyledTextCtrl_GotoLine 3003 -#define wxStyledTextCtrl_GotoPos 3004 -#define wxStyledTextCtrl_SetAnchor 3005 -#define wxStyledTextCtrl_GetCurLine 3006 -#define wxStyledTextCtrl_GetEndStyled 3007 -#define wxStyledTextCtrl_ConvertEOLs 3008 -#define wxStyledTextCtrl_GetEOLMode 3009 -#define wxStyledTextCtrl_SetEOLMode 3010 -#define wxStyledTextCtrl_StartStyling 3011 -#define wxStyledTextCtrl_SetStyling 3012 -#define wxStyledTextCtrl_GetBufferedDraw 3013 -#define wxStyledTextCtrl_SetBufferedDraw 3014 -#define wxStyledTextCtrl_SetTabWidth 3015 -#define wxStyledTextCtrl_GetTabWidth 3016 -#define wxStyledTextCtrl_SetCodePage 3017 -#define wxStyledTextCtrl_MarkerDefine 3018 -#define wxStyledTextCtrl_MarkerSetForeground 3019 -#define wxStyledTextCtrl_MarkerSetBackground 3020 -#define wxStyledTextCtrl_MarkerAdd 3021 -#define wxStyledTextCtrl_MarkerDelete 3022 -#define wxStyledTextCtrl_MarkerDeleteAll 3023 -#define wxStyledTextCtrl_MarkerGet 3024 -#define wxStyledTextCtrl_MarkerNext 3025 -#define wxStyledTextCtrl_MarkerPrevious 3026 -#define wxStyledTextCtrl_MarkerDefineBitmap 3027 -#define wxStyledTextCtrl_MarkerAddSet 3028 -#define wxStyledTextCtrl_MarkerSetAlpha 3029 -#define wxStyledTextCtrl_SetMarginType 3030 -#define wxStyledTextCtrl_GetMarginType 3031 -#define wxStyledTextCtrl_SetMarginWidth 3032 -#define wxStyledTextCtrl_GetMarginWidth 3033 -#define wxStyledTextCtrl_SetMarginMask 3034 -#define wxStyledTextCtrl_GetMarginMask 3035 -#define wxStyledTextCtrl_SetMarginSensitive 3036 -#define wxStyledTextCtrl_GetMarginSensitive 3037 -#define wxStyledTextCtrl_StyleClearAll 3038 -#define wxStyledTextCtrl_StyleSetForeground 3039 -#define wxStyledTextCtrl_StyleSetBackground 3040 -#define wxStyledTextCtrl_StyleSetBold 3041 -#define wxStyledTextCtrl_StyleSetItalic 3042 -#define wxStyledTextCtrl_StyleSetSize 3043 -#define wxStyledTextCtrl_StyleSetFaceName 3044 -#define wxStyledTextCtrl_StyleSetEOLFilled 3045 -#define wxStyledTextCtrl_StyleResetDefault 3046 -#define wxStyledTextCtrl_StyleSetUnderline 3047 -#define wxStyledTextCtrl_StyleSetCase 3048 -#define wxStyledTextCtrl_StyleSetHotSpot 3049 -#define wxStyledTextCtrl_SetSelForeground 3050 -#define wxStyledTextCtrl_SetSelBackground 3051 -#define wxStyledTextCtrl_GetSelAlpha 3052 -#define wxStyledTextCtrl_SetSelAlpha 3053 -#define wxStyledTextCtrl_SetCaretForeground 3054 -#define wxStyledTextCtrl_CmdKeyAssign 3055 -#define wxStyledTextCtrl_CmdKeyClear 3056 -#define wxStyledTextCtrl_CmdKeyClearAll 3057 -#define wxStyledTextCtrl_SetStyleBytes 3058 -#define wxStyledTextCtrl_StyleSetVisible 3059 -#define wxStyledTextCtrl_GetCaretPeriod 3060 -#define wxStyledTextCtrl_SetCaretPeriod 3061 -#define wxStyledTextCtrl_SetWordChars 3062 -#define wxStyledTextCtrl_BeginUndoAction 3063 -#define wxStyledTextCtrl_EndUndoAction 3064 -#define wxStyledTextCtrl_IndicatorSetStyle 3065 -#define wxStyledTextCtrl_IndicatorGetStyle 3066 -#define wxStyledTextCtrl_IndicatorSetForeground 3067 -#define wxStyledTextCtrl_IndicatorGetForeground 3068 -#define wxStyledTextCtrl_SetWhitespaceForeground 3069 -#define wxStyledTextCtrl_SetWhitespaceBackground 3070 -#define wxStyledTextCtrl_GetStyleBits 3071 -#define wxStyledTextCtrl_SetLineState 3072 -#define wxStyledTextCtrl_GetLineState 3073 -#define wxStyledTextCtrl_GetMaxLineState 3074 -#define wxStyledTextCtrl_GetCaretLineVisible 3075 -#define wxStyledTextCtrl_SetCaretLineVisible 3076 -#define wxStyledTextCtrl_GetCaretLineBackground 3077 -#define wxStyledTextCtrl_SetCaretLineBackground 3078 -#define wxStyledTextCtrl_AutoCompShow 3079 -#define wxStyledTextCtrl_AutoCompCancel 3080 -#define wxStyledTextCtrl_AutoCompActive 3081 -#define wxStyledTextCtrl_AutoCompPosStart 3082 -#define wxStyledTextCtrl_AutoCompComplete 3083 -#define wxStyledTextCtrl_AutoCompStops 3084 -#define wxStyledTextCtrl_AutoCompSetSeparator 3085 -#define wxStyledTextCtrl_AutoCompGetSeparator 3086 -#define wxStyledTextCtrl_AutoCompSelect 3087 -#define wxStyledTextCtrl_AutoCompSetCancelAtStart 3088 -#define wxStyledTextCtrl_AutoCompGetCancelAtStart 3089 -#define wxStyledTextCtrl_AutoCompSetFillUps 3090 -#define wxStyledTextCtrl_AutoCompSetChooseSingle 3091 -#define wxStyledTextCtrl_AutoCompGetChooseSingle 3092 -#define wxStyledTextCtrl_AutoCompSetIgnoreCase 3093 -#define wxStyledTextCtrl_AutoCompGetIgnoreCase 3094 -#define wxStyledTextCtrl_UserListShow 3095 -#define wxStyledTextCtrl_AutoCompSetAutoHide 3096 -#define wxStyledTextCtrl_AutoCompGetAutoHide 3097 -#define wxStyledTextCtrl_AutoCompSetDropRestOfWord 3098 -#define wxStyledTextCtrl_AutoCompGetDropRestOfWord 3099 -#define wxStyledTextCtrl_RegisterImage 3100 -#define wxStyledTextCtrl_ClearRegisteredImages 3101 -#define wxStyledTextCtrl_AutoCompGetTypeSeparator 3102 -#define wxStyledTextCtrl_AutoCompSetTypeSeparator 3103 -#define wxStyledTextCtrl_AutoCompSetMaxWidth 3104 -#define wxStyledTextCtrl_AutoCompGetMaxWidth 3105 -#define wxStyledTextCtrl_AutoCompSetMaxHeight 3106 -#define wxStyledTextCtrl_AutoCompGetMaxHeight 3107 -#define wxStyledTextCtrl_SetIndent 3108 -#define wxStyledTextCtrl_GetIndent 3109 -#define wxStyledTextCtrl_SetUseTabs 3110 -#define wxStyledTextCtrl_GetUseTabs 3111 -#define wxStyledTextCtrl_SetLineIndentation 3112 -#define wxStyledTextCtrl_GetLineIndentation 3113 -#define wxStyledTextCtrl_GetLineIndentPosition 3114 -#define wxStyledTextCtrl_GetColumn 3115 -#define wxStyledTextCtrl_SetUseHorizontalScrollBar 3116 -#define wxStyledTextCtrl_GetUseHorizontalScrollBar 3117 -#define wxStyledTextCtrl_SetIndentationGuides 3118 -#define wxStyledTextCtrl_GetIndentationGuides 3119 -#define wxStyledTextCtrl_SetHighlightGuide 3120 -#define wxStyledTextCtrl_GetHighlightGuide 3121 -#define wxStyledTextCtrl_GetLineEndPosition 3122 -#define wxStyledTextCtrl_GetCodePage 3123 -#define wxStyledTextCtrl_GetCaretForeground 3124 -#define wxStyledTextCtrl_GetReadOnly 3125 -#define wxStyledTextCtrl_SetCurrentPos 3126 -#define wxStyledTextCtrl_SetSelectionStart 3127 -#define wxStyledTextCtrl_GetSelectionStart 3128 -#define wxStyledTextCtrl_SetSelectionEnd 3129 -#define wxStyledTextCtrl_GetSelectionEnd 3130 -#define wxStyledTextCtrl_SetPrintMagnification 3131 -#define wxStyledTextCtrl_GetPrintMagnification 3132 -#define wxStyledTextCtrl_SetPrintColourMode 3133 -#define wxStyledTextCtrl_GetPrintColourMode 3134 -#define wxStyledTextCtrl_FindText 3135 -#define wxStyledTextCtrl_FormatRange 3136 -#define wxStyledTextCtrl_GetFirstVisibleLine 3137 -#define wxStyledTextCtrl_GetLine 3138 -#define wxStyledTextCtrl_GetLineCount 3139 -#define wxStyledTextCtrl_SetMarginLeft 3140 -#define wxStyledTextCtrl_GetMarginLeft 3141 -#define wxStyledTextCtrl_SetMarginRight 3142 -#define wxStyledTextCtrl_GetMarginRight 3143 -#define wxStyledTextCtrl_GetModify 3144 -#define wxStyledTextCtrl_SetSelection 3145 -#define wxStyledTextCtrl_GetSelectedText 3146 -#define wxStyledTextCtrl_GetTextRange 3147 -#define wxStyledTextCtrl_HideSelection 3148 -#define wxStyledTextCtrl_LineFromPosition 3149 -#define wxStyledTextCtrl_PositionFromLine 3150 -#define wxStyledTextCtrl_LineScroll 3151 -#define wxStyledTextCtrl_EnsureCaretVisible 3152 -#define wxStyledTextCtrl_ReplaceSelection 3153 -#define wxStyledTextCtrl_SetReadOnly 3154 -#define wxStyledTextCtrl_CanPaste 3155 -#define wxStyledTextCtrl_CanUndo 3156 -#define wxStyledTextCtrl_EmptyUndoBuffer 3157 -#define wxStyledTextCtrl_Undo 3158 -#define wxStyledTextCtrl_Cut 3159 -#define wxStyledTextCtrl_Copy 3160 -#define wxStyledTextCtrl_Paste 3161 -#define wxStyledTextCtrl_Clear 3162 -#define wxStyledTextCtrl_SetText 3163 -#define wxStyledTextCtrl_GetText 3164 -#define wxStyledTextCtrl_GetTextLength 3165 -#define wxStyledTextCtrl_GetOvertype 3166 -#define wxStyledTextCtrl_SetCaretWidth 3167 -#define wxStyledTextCtrl_GetCaretWidth 3168 -#define wxStyledTextCtrl_SetTargetStart 3169 -#define wxStyledTextCtrl_GetTargetStart 3170 -#define wxStyledTextCtrl_SetTargetEnd 3171 -#define wxStyledTextCtrl_GetTargetEnd 3172 -#define wxStyledTextCtrl_ReplaceTarget 3173 -#define wxStyledTextCtrl_SearchInTarget 3174 -#define wxStyledTextCtrl_SetSearchFlags 3175 -#define wxStyledTextCtrl_GetSearchFlags 3176 -#define wxStyledTextCtrl_CallTipShow 3177 -#define wxStyledTextCtrl_CallTipCancel 3178 -#define wxStyledTextCtrl_CallTipActive 3179 -#define wxStyledTextCtrl_CallTipPosAtStart 3180 -#define wxStyledTextCtrl_CallTipSetHighlight 3181 -#define wxStyledTextCtrl_CallTipSetBackground 3182 -#define wxStyledTextCtrl_CallTipSetForeground 3183 -#define wxStyledTextCtrl_CallTipSetForegroundHighlight 3184 -#define wxStyledTextCtrl_CallTipUseStyle 3185 -#define wxStyledTextCtrl_VisibleFromDocLine 3186 -#define wxStyledTextCtrl_DocLineFromVisible 3187 -#define wxStyledTextCtrl_WrapCount 3188 -#define wxStyledTextCtrl_SetFoldLevel 3189 -#define wxStyledTextCtrl_GetFoldLevel 3190 -#define wxStyledTextCtrl_GetLastChild 3191 -#define wxStyledTextCtrl_GetFoldParent 3192 -#define wxStyledTextCtrl_ShowLines 3193 -#define wxStyledTextCtrl_HideLines 3194 -#define wxStyledTextCtrl_GetLineVisible 3195 -#define wxStyledTextCtrl_SetFoldExpanded 3196 -#define wxStyledTextCtrl_GetFoldExpanded 3197 -#define wxStyledTextCtrl_ToggleFold 3198 -#define wxStyledTextCtrl_EnsureVisible 3199 -#define wxStyledTextCtrl_SetFoldFlags 3200 -#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy 3201 -#define wxStyledTextCtrl_SetTabIndents 3202 -#define wxStyledTextCtrl_GetTabIndents 3203 -#define wxStyledTextCtrl_SetBackSpaceUnIndents 3204 -#define wxStyledTextCtrl_GetBackSpaceUnIndents 3205 -#define wxStyledTextCtrl_SetMouseDwellTime 3206 -#define wxStyledTextCtrl_GetMouseDwellTime 3207 -#define wxStyledTextCtrl_WordStartPosition 3208 -#define wxStyledTextCtrl_WordEndPosition 3209 -#define wxStyledTextCtrl_SetWrapMode 3210 -#define wxStyledTextCtrl_GetWrapMode 3211 -#define wxStyledTextCtrl_SetWrapVisualFlags 3212 -#define wxStyledTextCtrl_GetWrapVisualFlags 3213 -#define wxStyledTextCtrl_SetWrapVisualFlagsLocation 3214 -#define wxStyledTextCtrl_GetWrapVisualFlagsLocation 3215 -#define wxStyledTextCtrl_SetWrapStartIndent 3216 -#define wxStyledTextCtrl_GetWrapStartIndent 3217 -#define wxStyledTextCtrl_SetLayoutCache 3218 -#define wxStyledTextCtrl_GetLayoutCache 3219 -#define wxStyledTextCtrl_SetScrollWidth 3220 -#define wxStyledTextCtrl_GetScrollWidth 3221 -#define wxStyledTextCtrl_TextWidth 3222 -#define wxStyledTextCtrl_GetEndAtLastLine 3223 -#define wxStyledTextCtrl_TextHeight 3224 -#define wxStyledTextCtrl_SetUseVerticalScrollBar 3225 -#define wxStyledTextCtrl_GetUseVerticalScrollBar 3226 -#define wxStyledTextCtrl_AppendText 3227 -#define wxStyledTextCtrl_GetTwoPhaseDraw 3228 -#define wxStyledTextCtrl_SetTwoPhaseDraw 3229 -#define wxStyledTextCtrl_TargetFromSelection 3230 -#define wxStyledTextCtrl_LinesJoin 3231 -#define wxStyledTextCtrl_LinesSplit 3232 -#define wxStyledTextCtrl_SetFoldMarginColour 3233 -#define wxStyledTextCtrl_SetFoldMarginHiColour 3234 -#define wxStyledTextCtrl_LineDown 3235 -#define wxStyledTextCtrl_LineDownExtend 3236 -#define wxStyledTextCtrl_LineUp 3237 -#define wxStyledTextCtrl_LineUpExtend 3238 -#define wxStyledTextCtrl_CharLeft 3239 -#define wxStyledTextCtrl_CharLeftExtend 3240 -#define wxStyledTextCtrl_CharRight 3241 -#define wxStyledTextCtrl_CharRightExtend 3242 -#define wxStyledTextCtrl_WordLeft 3243 -#define wxStyledTextCtrl_WordLeftExtend 3244 -#define wxStyledTextCtrl_WordRight 3245 -#define wxStyledTextCtrl_WordRightExtend 3246 -#define wxStyledTextCtrl_Home 3247 -#define wxStyledTextCtrl_HomeExtend 3248 -#define wxStyledTextCtrl_LineEnd 3249 -#define wxStyledTextCtrl_LineEndExtend 3250 -#define wxStyledTextCtrl_DocumentStart 3251 -#define wxStyledTextCtrl_DocumentStartExtend 3252 -#define wxStyledTextCtrl_DocumentEnd 3253 -#define wxStyledTextCtrl_DocumentEndExtend 3254 -#define wxStyledTextCtrl_PageUp 3255 -#define wxStyledTextCtrl_PageUpExtend 3256 -#define wxStyledTextCtrl_PageDown 3257 -#define wxStyledTextCtrl_PageDownExtend 3258 -#define wxStyledTextCtrl_EditToggleOvertype 3259 -#define wxStyledTextCtrl_Cancel 3260 -#define wxStyledTextCtrl_DeleteBack 3261 -#define wxStyledTextCtrl_Tab 3262 -#define wxStyledTextCtrl_BackTab 3263 -#define wxStyledTextCtrl_NewLine 3264 -#define wxStyledTextCtrl_FormFeed 3265 -#define wxStyledTextCtrl_VCHome 3266 -#define wxStyledTextCtrl_VCHomeExtend 3267 -#define wxStyledTextCtrl_ZoomIn 3268 -#define wxStyledTextCtrl_ZoomOut 3269 -#define wxStyledTextCtrl_DelWordLeft 3270 -#define wxStyledTextCtrl_DelWordRight 3271 -#define wxStyledTextCtrl_LineCut 3272 -#define wxStyledTextCtrl_LineDelete 3273 -#define wxStyledTextCtrl_LineTranspose 3274 -#define wxStyledTextCtrl_LineDuplicate 3275 -#define wxStyledTextCtrl_LowerCase 3276 -#define wxStyledTextCtrl_UpperCase 3277 -#define wxStyledTextCtrl_LineScrollDown 3278 -#define wxStyledTextCtrl_LineScrollUp 3279 -#define wxStyledTextCtrl_DeleteBackNotLine 3280 -#define wxStyledTextCtrl_HomeDisplay 3281 -#define wxStyledTextCtrl_HomeDisplayExtend 3282 -#define wxStyledTextCtrl_LineEndDisplay 3283 -#define wxStyledTextCtrl_LineEndDisplayExtend 3284 -#define wxStyledTextCtrl_HomeWrapExtend 3285 -#define wxStyledTextCtrl_LineEndWrap 3286 -#define wxStyledTextCtrl_LineEndWrapExtend 3287 -#define wxStyledTextCtrl_VCHomeWrap 3288 -#define wxStyledTextCtrl_VCHomeWrapExtend 3289 -#define wxStyledTextCtrl_LineCopy 3290 -#define wxStyledTextCtrl_MoveCaretInsideView 3291 -#define wxStyledTextCtrl_LineLength 3292 -#define wxStyledTextCtrl_BraceHighlight 3293 -#define wxStyledTextCtrl_BraceBadLight 3294 -#define wxStyledTextCtrl_BraceMatch 3295 -#define wxStyledTextCtrl_GetViewEOL 3296 -#define wxStyledTextCtrl_SetViewEOL 3297 -#define wxStyledTextCtrl_SetModEventMask 3298 -#define wxStyledTextCtrl_GetEdgeColumn 3299 -#define wxStyledTextCtrl_SetEdgeColumn 3300 -#define wxStyledTextCtrl_SetEdgeMode 3301 -#define wxStyledTextCtrl_GetEdgeMode 3302 -#define wxStyledTextCtrl_GetEdgeColour 3303 -#define wxStyledTextCtrl_SetEdgeColour 3304 -#define wxStyledTextCtrl_SearchAnchor 3305 -#define wxStyledTextCtrl_SearchNext 3306 -#define wxStyledTextCtrl_SearchPrev 3307 -#define wxStyledTextCtrl_LinesOnScreen 3308 -#define wxStyledTextCtrl_UsePopUp 3309 -#define wxStyledTextCtrl_SelectionIsRectangle 3310 -#define wxStyledTextCtrl_SetZoom 3311 -#define wxStyledTextCtrl_GetZoom 3312 -#define wxStyledTextCtrl_GetModEventMask 3313 -#define wxStyledTextCtrl_SetSTCFocus 3314 -#define wxStyledTextCtrl_GetSTCFocus 3315 -#define wxStyledTextCtrl_SetStatus 3316 -#define wxStyledTextCtrl_GetStatus 3317 -#define wxStyledTextCtrl_SetMouseDownCaptures 3318 -#define wxStyledTextCtrl_GetMouseDownCaptures 3319 -#define wxStyledTextCtrl_SetSTCCursor 3320 -#define wxStyledTextCtrl_GetSTCCursor 3321 -#define wxStyledTextCtrl_SetControlCharSymbol 3322 -#define wxStyledTextCtrl_GetControlCharSymbol 3323 -#define wxStyledTextCtrl_WordPartLeft 3324 -#define wxStyledTextCtrl_WordPartLeftExtend 3325 -#define wxStyledTextCtrl_WordPartRight 3326 -#define wxStyledTextCtrl_WordPartRightExtend 3327 -#define wxStyledTextCtrl_SetVisiblePolicy 3328 -#define wxStyledTextCtrl_DelLineLeft 3329 -#define wxStyledTextCtrl_DelLineRight 3330 -#define wxStyledTextCtrl_GetXOffset 3331 -#define wxStyledTextCtrl_ChooseCaretX 3332 -#define wxStyledTextCtrl_SetXCaretPolicy 3333 -#define wxStyledTextCtrl_SetYCaretPolicy 3334 -#define wxStyledTextCtrl_GetPrintWrapMode 3335 -#define wxStyledTextCtrl_SetHotspotActiveForeground 3336 -#define wxStyledTextCtrl_SetHotspotActiveBackground 3337 -#define wxStyledTextCtrl_SetHotspotActiveUnderline 3338 -#define wxStyledTextCtrl_SetHotspotSingleLine 3339 -#define wxStyledTextCtrl_ParaDownExtend 3340 -#define wxStyledTextCtrl_ParaUp 3341 -#define wxStyledTextCtrl_ParaUpExtend 3342 -#define wxStyledTextCtrl_PositionBefore 3343 -#define wxStyledTextCtrl_PositionAfter 3344 -#define wxStyledTextCtrl_CopyRange 3345 -#define wxStyledTextCtrl_CopyText 3346 -#define wxStyledTextCtrl_SetSelectionMode 3347 -#define wxStyledTextCtrl_GetSelectionMode 3348 -#define wxStyledTextCtrl_LineDownRectExtend 3349 -#define wxStyledTextCtrl_LineUpRectExtend 3350 -#define wxStyledTextCtrl_CharLeftRectExtend 3351 -#define wxStyledTextCtrl_CharRightRectExtend 3352 -#define wxStyledTextCtrl_HomeRectExtend 3353 -#define wxStyledTextCtrl_VCHomeRectExtend 3354 -#define wxStyledTextCtrl_LineEndRectExtend 3355 -#define wxStyledTextCtrl_PageUpRectExtend 3356 -#define wxStyledTextCtrl_PageDownRectExtend 3357 -#define wxStyledTextCtrl_StutteredPageUp 3358 -#define wxStyledTextCtrl_StutteredPageUpExtend 3359 -#define wxStyledTextCtrl_StutteredPageDown 3360 -#define wxStyledTextCtrl_StutteredPageDownExtend 3361 -#define wxStyledTextCtrl_WordLeftEnd 3362 -#define wxStyledTextCtrl_WordLeftEndExtend 3363 -#define wxStyledTextCtrl_WordRightEnd 3364 -#define wxStyledTextCtrl_WordRightEndExtend 3365 -#define wxStyledTextCtrl_SetWhitespaceChars 3366 -#define wxStyledTextCtrl_SetCharsDefault 3367 -#define wxStyledTextCtrl_AutoCompGetCurrent 3368 -#define wxStyledTextCtrl_Allocate 3369 -#define wxStyledTextCtrl_FindColumn 3370 -#define wxStyledTextCtrl_GetCaretSticky 3371 -#define wxStyledTextCtrl_SetCaretSticky 3372 -#define wxStyledTextCtrl_ToggleCaretSticky 3373 -#define wxStyledTextCtrl_SetPasteConvertEndings 3374 -#define wxStyledTextCtrl_GetPasteConvertEndings 3375 -#define wxStyledTextCtrl_SelectionDuplicate 3376 -#define wxStyledTextCtrl_SetCaretLineBackAlpha 3377 -#define wxStyledTextCtrl_GetCaretLineBackAlpha 3378 -#define wxStyledTextCtrl_StartRecord 3379 -#define wxStyledTextCtrl_StopRecord 3380 -#define wxStyledTextCtrl_SetLexer 3381 -#define wxStyledTextCtrl_GetLexer 3382 -#define wxStyledTextCtrl_Colourise 3383 -#define wxStyledTextCtrl_SetProperty 3384 -#define wxStyledTextCtrl_SetKeyWords 3385 -#define wxStyledTextCtrl_SetLexerLanguage 3386 -#define wxStyledTextCtrl_GetProperty 3387 -#define wxStyledTextCtrl_GetStyleBitsNeeded 3388 -#define wxStyledTextCtrl_GetCurrentLine 3389 -#define wxStyledTextCtrl_StyleSetSpec 3390 -#define wxStyledTextCtrl_StyleSetFont 3391 -#define wxStyledTextCtrl_StyleSetFontAttr 3392 -#define wxStyledTextCtrl_StyleSetCharacterSet 3393 -#define wxStyledTextCtrl_StyleSetFontEncoding 3394 -#define wxStyledTextCtrl_CmdKeyExecute 3395 -#define wxStyledTextCtrl_SetMargins 3396 -#define wxStyledTextCtrl_GetSelection 3397 -#define wxStyledTextCtrl_PointFromPosition 3398 -#define wxStyledTextCtrl_ScrollToLine 3399 -#define wxStyledTextCtrl_ScrollToColumn 3400 -#define wxStyledTextCtrl_SetVScrollBar 3401 -#define wxStyledTextCtrl_SetHScrollBar 3402 -#define wxStyledTextCtrl_GetLastKeydownProcessed 3403 -#define wxStyledTextCtrl_SetLastKeydownProcessed 3404 -#define wxStyledTextCtrl_SaveFile 3405 -#define wxStyledTextCtrl_LoadFile 3406 -#define wxStyledTextCtrl_DoDragOver 3407 -#define wxStyledTextCtrl_DoDropText 3408 -#define wxStyledTextCtrl_GetUseAntiAliasing 3409 -#define wxStyledTextCtrl_AddTextRaw 3410 -#define wxStyledTextCtrl_InsertTextRaw 3411 -#define wxStyledTextCtrl_GetCurLineRaw 3412 -#define wxStyledTextCtrl_GetLineRaw 3413 -#define wxStyledTextCtrl_GetSelectedTextRaw 3414 -#define wxStyledTextCtrl_GetTextRangeRaw 3415 -#define wxStyledTextCtrl_SetTextRaw 3416 -#define wxStyledTextCtrl_GetTextRaw 3417 -#define wxStyledTextCtrl_AppendTextRaw 3418 -#define wxArtProvider_GetBitmap 3419 -#define wxArtProvider_GetIcon 3420 -#define wxTreeEvent_GetKeyCode 3421 -#define wxTreeEvent_GetItem 3422 -#define wxTreeEvent_GetKeyEvent 3423 -#define wxTreeEvent_GetLabel 3424 -#define wxTreeEvent_GetOldItem 3425 -#define wxTreeEvent_GetPoint 3426 -#define wxTreeEvent_IsEditCancelled 3427 -#define wxTreeEvent_SetToolTip 3428 -#define wxNotebookEvent_GetOldSelection 3429 -#define wxNotebookEvent_GetSelection 3430 -#define wxNotebookEvent_SetOldSelection 3431 -#define wxNotebookEvent_SetSelection 3432 -#define wxFileDataObject_new 3433 -#define wxFileDataObject_AddFile 3434 -#define wxFileDataObject_GetFilenames 3435 -#define wxFileDataObject_destroy 3436 -#define wxTextDataObject_new 3437 -#define wxTextDataObject_GetTextLength 3438 -#define wxTextDataObject_GetText 3439 -#define wxTextDataObject_SetText 3440 -#define wxTextDataObject_destroy 3441 -#define wxBitmapDataObject_new_1_1 3442 -#define wxBitmapDataObject_new_1_0 3443 -#define wxBitmapDataObject_GetBitmap 3444 -#define wxBitmapDataObject_SetBitmap 3445 -#define wxBitmapDataObject_destroy 3446 -#define wxClipboard_new 3448 -#define wxClipboard_destruct 3449 -#define wxClipboard_AddData 3450 -#define wxClipboard_Clear 3451 -#define wxClipboard_Close 3452 -#define wxClipboard_Flush 3453 -#define wxClipboard_GetData 3454 -#define wxClipboard_IsOpened 3455 -#define wxClipboard_Open 3456 -#define wxClipboard_SetData 3457 -#define wxClipboard_UsePrimarySelection 3459 -#define wxClipboard_IsSupported 3460 -#define wxClipboard_Get 3461 -#define wxSpinEvent_GetPosition 3462 -#define wxSpinEvent_SetPosition 3463 -#define wxSplitterWindow_new_0 3464 -#define wxSplitterWindow_new_2 3465 -#define wxSplitterWindow_destruct 3466 -#define wxSplitterWindow_Create 3467 -#define wxSplitterWindow_GetMinimumPaneSize 3468 -#define wxSplitterWindow_GetSashGravity 3469 -#define wxSplitterWindow_GetSashPosition 3470 -#define wxSplitterWindow_GetSplitMode 3471 -#define wxSplitterWindow_GetWindow1 3472 -#define wxSplitterWindow_GetWindow2 3473 -#define wxSplitterWindow_Initialize 3474 -#define wxSplitterWindow_IsSplit 3475 -#define wxSplitterWindow_ReplaceWindow 3476 -#define wxSplitterWindow_SetSashGravity 3477 -#define wxSplitterWindow_SetSashPosition 3478 -#define wxSplitterWindow_SetSashSize 3479 -#define wxSplitterWindow_SetMinimumPaneSize 3480 -#define wxSplitterWindow_SetSplitMode 3481 -#define wxSplitterWindow_SplitHorizontally 3482 -#define wxSplitterWindow_SplitVertically 3483 -#define wxSplitterWindow_Unsplit 3484 -#define wxSplitterWindow_UpdateSize 3485 -#define wxSplitterEvent_GetSashPosition 3486 -#define wxSplitterEvent_GetX 3487 -#define wxSplitterEvent_GetY 3488 -#define wxSplitterEvent_GetWindowBeingRemoved 3489 -#define wxSplitterEvent_SetSashPosition 3490 -#define wxHtmlWindow_new_0 3491 -#define wxHtmlWindow_new_2 3492 -#define wxHtmlWindow_AppendToPage 3493 -#define wxHtmlWindow_GetOpenedAnchor 3494 -#define wxHtmlWindow_GetOpenedPage 3495 -#define wxHtmlWindow_GetOpenedPageTitle 3496 -#define wxHtmlWindow_GetRelatedFrame 3497 -#define wxHtmlWindow_HistoryBack 3498 -#define wxHtmlWindow_HistoryCanBack 3499 -#define wxHtmlWindow_HistoryCanForward 3500 -#define wxHtmlWindow_HistoryClear 3501 -#define wxHtmlWindow_HistoryForward 3502 -#define wxHtmlWindow_LoadFile 3503 -#define wxHtmlWindow_LoadPage 3504 -#define wxHtmlWindow_SelectAll 3505 -#define wxHtmlWindow_SelectionToText 3506 -#define wxHtmlWindow_SelectLine 3507 -#define wxHtmlWindow_SelectWord 3508 -#define wxHtmlWindow_SetBorders 3509 -#define wxHtmlWindow_SetFonts 3510 -#define wxHtmlWindow_SetPage 3511 -#define wxHtmlWindow_SetRelatedFrame 3512 -#define wxHtmlWindow_SetRelatedStatusBar 3513 -#define wxHtmlWindow_ToText 3514 -#define wxHtmlWindow_destroy 3515 -#define wxHtmlLinkEvent_GetLinkInfo 3516 -#define wxSystemSettings_GetColour 3517 -#define wxSystemSettings_GetFont 3518 -#define wxSystemSettings_GetMetric 3519 -#define wxSystemSettings_GetScreenType 3520 -#define wxSystemOptions_GetOption 3521 -#define wxSystemOptions_GetOptionInt 3522 -#define wxSystemOptions_HasOption 3523 -#define wxSystemOptions_IsFalse 3524 -#define wxSystemOptions_SetOption_2_1 3525 -#define wxSystemOptions_SetOption_2_0 3526 -#define wxAuiNotebookEvent_SetSelection 3527 -#define wxAuiNotebookEvent_GetSelection 3528 -#define wxAuiNotebookEvent_SetOldSelection 3529 -#define wxAuiNotebookEvent_GetOldSelection 3530 -#define wxAuiNotebookEvent_SetDragSource 3531 -#define wxAuiNotebookEvent_GetDragSource 3532 -#define wxAuiManagerEvent_SetManager 3533 -#define wxAuiManagerEvent_GetManager 3534 -#define wxAuiManagerEvent_SetPane 3535 -#define wxAuiManagerEvent_GetPane 3536 -#define wxAuiManagerEvent_SetButton 3537 -#define wxAuiManagerEvent_GetButton 3538 -#define wxAuiManagerEvent_SetDC 3539 -#define wxAuiManagerEvent_GetDC 3540 -#define wxAuiManagerEvent_Veto 3541 -#define wxAuiManagerEvent_GetVeto 3542 -#define wxAuiManagerEvent_SetCanVeto 3543 -#define wxAuiManagerEvent_CanVeto 3544 -#define wxLogNull_new 3545 -#define wxLogNull_destroy 3546 -#define wxTaskBarIcon_new 3547 -#define wxTaskBarIcon_destruct 3548 -#define wxTaskBarIcon_PopupMenu 3549 -#define wxTaskBarIcon_RemoveIcon 3550 -#define wxTaskBarIcon_SetIcon 3551 -#define wxLocale_new_0 3552 -#define wxLocale_new_2 3554 -#define wxLocale_destruct 3555 -#define wxLocale_Init 3557 -#define wxLocale_AddCatalog_1 3558 -#define wxLocale_AddCatalog_3 3559 -#define wxLocale_AddCatalogLookupPathPrefix 3560 -#define wxLocale_GetCanonicalName 3561 -#define wxLocale_GetLanguage 3562 -#define wxLocale_GetLanguageName 3563 -#define wxLocale_GetLocale 3564 -#define wxLocale_GetName 3565 -#define wxLocale_GetString_2 3566 -#define wxLocale_GetString_4 3567 -#define wxLocale_GetHeaderValue 3568 -#define wxLocale_GetSysName 3569 -#define wxLocale_GetSystemEncoding 3570 -#define wxLocale_GetSystemEncodingName 3571 -#define wxLocale_GetSystemLanguage 3572 -#define wxLocale_IsLoaded 3573 -#define wxLocale_IsOk 3574 -#define wxActivateEvent_GetActive 3575 -#define wxPopupWindow_new_2 3577 -#define wxPopupWindow_new_0 3578 -#define wxPopupWindow_destruct 3580 -#define wxPopupWindow_Create 3581 -#define wxPopupWindow_Position 3582 -#define wxPopupTransientWindow_new_0 3583 -#define wxPopupTransientWindow_new_2 3584 -#define wxPopupTransientWindow_destruct 3585 -#define wxPopupTransientWindow_Popup 3586 -#define wxPopupTransientWindow_Dismiss 3587 -#define wxOverlay_new 3588 -#define wxOverlay_destruct 3589 -#define wxOverlay_Reset 3590 -#define wxDCOverlay_new_6 3591 -#define wxDCOverlay_new_2 3592 -#define wxDCOverlay_destruct 3593 -#define wxDCOverlay_Clear 3594 +#define wxWindow_DragAcceptFiles 126 +#define wxWindow_Enable 127 +#define wxWindow_FindFocus 128 +#define wxWindow_FindWindow_1_0 129 +#define wxWindow_FindWindow_1_1 130 +#define wxWindow_FindWindowById 131 +#define wxWindow_FindWindowByName 132 +#define wxWindow_FindWindowByLabel 133 +#define wxWindow_Fit 134 +#define wxWindow_FitInside 135 +#define wxWindow_Freeze 136 +#define wxWindow_GetAcceleratorTable 137 +#define wxWindow_GetBackgroundColour 138 +#define wxWindow_GetBackgroundStyle 139 +#define wxWindow_GetBestSize 140 +#define wxWindow_GetCaret 142 +#define wxWindow_GetCapture 143 +#define wxWindow_GetCharHeight 144 +#define wxWindow_GetCharWidth 145 +#define wxWindow_GetChildren 146 +#define wxWindow_GetClientSize 149 +#define wxWindow_GetContainingSizer 150 +#define wxWindow_GetCursor 151 +#define wxWindow_GetDropTarget 152 +#define wxWindow_GetEventHandler 153 +#define wxWindow_GetExtraStyle 154 +#define wxWindow_GetFont 155 +#define wxWindow_GetForegroundColour 156 +#define wxWindow_GetGrandParent 157 +#define wxWindow_GetHandle 158 +#define wxWindow_GetHelpText 159 +#define wxWindow_GetId 160 +#define wxWindow_GetLabel 161 +#define wxWindow_GetMaxSize 162 +#define wxWindow_GetMinSize 163 +#define wxWindow_GetName 164 +#define wxWindow_GetParent 165 +#define wxWindow_GetPosition 167 +#define wxWindow_GetRect 168 +#define wxWindow_GetScreenPosition 170 +#define wxWindow_GetScreenRect 171 +#define wxWindow_GetScrollPos 172 +#define wxWindow_GetScrollRange 173 +#define wxWindow_GetScrollThumb 174 +#define wxWindow_GetSize 176 +#define wxWindow_GetSizer 177 +#define wxWindow_GetTextExtent 178 +#define wxWindow_GetToolTip 179 +#define wxWindow_GetUpdateRegion 180 +#define wxWindow_GetVirtualSize 182 +#define wxWindow_GetWindowStyleFlag 184 +#define wxWindow_GetWindowVariant 185 +#define wxWindow_HasCapture 186 +#define wxWindow_HasScrollbar 187 +#define wxWindow_HasTransparentBackground 188 +#define wxWindow_Hide 189 +#define wxWindow_InheritAttributes 190 +#define wxWindow_InitDialog 191 +#define wxWindow_InvalidateBestSize 192 +#define wxWindow_IsEnabled 193 +#define wxWindow_IsExposed_2 194 +#define wxWindow_IsExposed_4 195 +#define wxWindow_IsExposed_1_0 196 +#define wxWindow_IsExposed_1_1 197 +#define wxWindow_IsRetained 198 +#define wxWindow_IsShown 199 +#define wxWindow_IsTopLevel 200 +#define wxWindow_Layout 201 +#define wxWindow_LineDown 202 +#define wxWindow_LineUp 203 +#define wxWindow_Lower 204 +#define wxWindow_MakeModal 205 +#define wxWindow_Move_3 206 +#define wxWindow_Move_2 207 +#define wxWindow_MoveAfterInTabOrder 208 +#define wxWindow_MoveBeforeInTabOrder 209 +#define wxWindow_Navigate 210 +#define wxWindow_PageDown 211 +#define wxWindow_PageUp 212 +#define wxWindow_PopEventHandler 213 +#define wxWindow_PopupMenu_2 214 +#define wxWindow_PopupMenu_3 215 +#define wxWindow_Raise 216 +#define wxWindow_Refresh 217 +#define wxWindow_RefreshRect 218 +#define wxWindow_ReleaseMouse 219 +#define wxWindow_RemoveChild 220 +#define wxWindow_Reparent 221 +#define wxWindow_ScreenToClient_2 222 +#define wxWindow_ScreenToClient_1 223 +#define wxWindow_ScrollLines 225 +#define wxWindow_ScrollPages 227 +#define wxWindow_ScrollWindow 228 +#define wxWindow_SetAcceleratorTable 229 +#define wxWindow_SetAutoLayout 230 +#define wxWindow_SetBackgroundColour 231 +#define wxWindow_SetBackgroundStyle 232 +#define wxWindow_SetCaret 233 +#define wxWindow_SetClientSize_2 234 +#define wxWindow_SetClientSize_1_0 235 +#define wxWindow_SetClientSize_1_1 236 +#define wxWindow_SetContainingSizer 237 +#define wxWindow_SetCursor 238 +#define wxWindow_SetMaxSize 239 +#define wxWindow_SetMinSize 240 +#define wxWindow_SetOwnBackgroundColour 241 +#define wxWindow_SetOwnFont 242 +#define wxWindow_SetOwnForegroundColour 243 +#define wxWindow_SetDropTarget 244 +#define wxWindow_SetExtraStyle 245 +#define wxWindow_SetFocus 246 +#define wxWindow_SetFocusFromKbd 247 +#define wxWindow_SetFont 248 +#define wxWindow_SetForegroundColour 249 +#define wxWindow_SetHelpText 250 +#define wxWindow_SetId 251 +#define wxWindow_SetLabel 253 +#define wxWindow_SetName 254 +#define wxWindow_SetPalette 255 +#define wxWindow_SetScrollbar 256 +#define wxWindow_SetScrollPos 257 +#define wxWindow_SetSize_5 258 +#define wxWindow_SetSize_2_0 259 +#define wxWindow_SetSize_1 260 +#define wxWindow_SetSize_2_1 261 +#define wxWindow_SetSizeHints_3 262 +#define wxWindow_SetSizeHints_2 263 +#define wxWindow_SetSizer 264 +#define wxWindow_SetSizerAndFit 265 +#define wxWindow_SetThemeEnabled 266 +#define wxWindow_SetToolTip_1_0 267 +#define wxWindow_SetToolTip_1_1 268 +#define wxWindow_SetVirtualSize_1 269 +#define wxWindow_SetVirtualSize_2 270 +#define wxWindow_SetVirtualSizeHints_3 271 +#define wxWindow_SetVirtualSizeHints_2 272 +#define wxWindow_SetWindowStyle 273 +#define wxWindow_SetWindowStyleFlag 274 +#define wxWindow_SetWindowVariant 275 +#define wxWindow_ShouldInheritColours 276 +#define wxWindow_Show 277 +#define wxWindow_Thaw 278 +#define wxWindow_TransferDataFromWindow 279 +#define wxWindow_TransferDataToWindow 280 +#define wxWindow_Update 281 +#define wxWindow_UpdateWindowUI 282 +#define wxWindow_Validate 283 +#define wxWindow_WarpPointer 284 +#define wxWindow_SetTransparent 285 +#define wxWindow_CanSetTransparent 286 +#define wxWindow_IsDoubleBuffered 287 +#define wxWindow_SetDoubleBuffered 288 +#define wxWindow_GetContentScaleFactor 289 +#define wxTopLevelWindow_GetIcon 290 +#define wxTopLevelWindow_GetIcons 291 +#define wxTopLevelWindow_GetTitle 292 +#define wxTopLevelWindow_IsActive 293 +#define wxTopLevelWindow_Iconize 294 +#define wxTopLevelWindow_IsFullScreen 295 +#define wxTopLevelWindow_IsIconized 296 +#define wxTopLevelWindow_IsMaximized 297 +#define wxTopLevelWindow_Maximize 298 +#define wxTopLevelWindow_RequestUserAttention 299 +#define wxTopLevelWindow_SetIcon 300 +#define wxTopLevelWindow_SetIcons 301 +#define wxTopLevelWindow_CenterOnScreen 302 +#define wxTopLevelWindow_CentreOnScreen 303 +#define wxTopLevelWindow_SetShape 305 +#define wxTopLevelWindow_SetTitle 306 +#define wxTopLevelWindow_ShowFullScreen 307 +#define wxFrame_new_4 309 +#define wxFrame_new_0 310 +#define wxFrame_destruct 312 +#define wxFrame_Create 313 +#define wxFrame_CreateStatusBar 314 +#define wxFrame_CreateToolBar 315 +#define wxFrame_GetClientAreaOrigin 316 +#define wxFrame_GetMenuBar 317 +#define wxFrame_GetStatusBar 318 +#define wxFrame_GetStatusBarPane 319 +#define wxFrame_GetToolBar 320 +#define wxFrame_ProcessCommand 321 +#define wxFrame_SendSizeEvent 322 +#define wxFrame_SetMenuBar 323 +#define wxFrame_SetStatusBar 324 +#define wxFrame_SetStatusBarPane 325 +#define wxFrame_SetStatusText 326 +#define wxFrame_SetStatusWidths 327 +#define wxFrame_SetToolBar 328 +#define wxMiniFrame_new_0 329 +#define wxMiniFrame_new_4 330 +#define wxMiniFrame_Create 331 +#define wxMiniFrame_destroy 332 +#define wxSplashScreen_new_0 333 +#define wxSplashScreen_new_6 334 +#define wxSplashScreen_destruct 335 +#define wxSplashScreen_GetSplashStyle 336 +#define wxSplashScreen_GetTimeout 337 +#define wxPanel_new_0 338 +#define wxPanel_new_6 339 +#define wxPanel_new_2 340 +#define wxPanel_destruct 341 +#define wxPanel_InitDialog 342 +#define wxPanel_SetFocusIgnoringChildren 343 +#define wxScrolledWindow_new_0 344 +#define wxScrolledWindow_new_2 345 +#define wxScrolledWindow_destruct 346 +#define wxScrolledWindow_CalcScrolledPosition_4 347 +#define wxScrolledWindow_CalcScrolledPosition_1 348 +#define wxScrolledWindow_CalcUnscrolledPosition_4 349 +#define wxScrolledWindow_CalcUnscrolledPosition_1 350 +#define wxScrolledWindow_EnableScrolling 351 +#define wxScrolledWindow_GetScrollPixelsPerUnit 352 +#define wxScrolledWindow_GetViewStart 353 +#define wxScrolledWindow_DoPrepareDC 354 +#define wxScrolledWindow_PrepareDC 355 +#define wxScrolledWindow_Scroll 356 +#define wxScrolledWindow_SetScrollbars 357 +#define wxScrolledWindow_SetScrollRate 358 +#define wxScrolledWindow_SetTargetWindow 359 +#define wxSashWindow_new_0 360 +#define wxSashWindow_new_2 361 +#define wxSashWindow_destruct 362 +#define wxSashWindow_GetSashVisible 363 +#define wxSashWindow_GetMaximumSizeX 364 +#define wxSashWindow_GetMaximumSizeY 365 +#define wxSashWindow_GetMinimumSizeX 366 +#define wxSashWindow_GetMinimumSizeY 367 +#define wxSashWindow_SetMaximumSizeX 368 +#define wxSashWindow_SetMaximumSizeY 369 +#define wxSashWindow_SetMinimumSizeX 370 +#define wxSashWindow_SetMinimumSizeY 371 +#define wxSashWindow_SetSashVisible 372 +#define wxSashLayoutWindow_new_0 373 +#define wxSashLayoutWindow_new_2 374 +#define wxSashLayoutWindow_Create 375 +#define wxSashLayoutWindow_GetAlignment 376 +#define wxSashLayoutWindow_GetOrientation 377 +#define wxSashLayoutWindow_SetAlignment 378 +#define wxSashLayoutWindow_SetDefaultSize 379 +#define wxSashLayoutWindow_SetOrientation 380 +#define wxSashLayoutWindow_destroy 381 +#define wxGrid_new_0 382 +#define wxGrid_new_3 383 +#define wxGrid_new_4 384 +#define wxGrid_destruct 385 +#define wxGrid_AppendCols 386 +#define wxGrid_AppendRows 387 +#define wxGrid_AutoSize 388 +#define wxGrid_AutoSizeColumn 389 +#define wxGrid_AutoSizeColumns 390 +#define wxGrid_AutoSizeRow 391 +#define wxGrid_AutoSizeRows 392 +#define wxGrid_BeginBatch 393 +#define wxGrid_BlockToDeviceRect 394 +#define wxGrid_CanDragColSize 395 +#define wxGrid_CanDragRowSize 396 +#define wxGrid_CanDragGridSize 397 +#define wxGrid_CanEnableCellControl 398 +#define wxGrid_CellToRect_2 399 +#define wxGrid_CellToRect_1 400 +#define wxGrid_ClearGrid 401 +#define wxGrid_ClearSelection 402 +#define wxGrid_CreateGrid 403 +#define wxGrid_DeleteCols 404 +#define wxGrid_DeleteRows 405 +#define wxGrid_DisableCellEditControl 406 +#define wxGrid_DisableDragColSize 407 +#define wxGrid_DisableDragGridSize 408 +#define wxGrid_DisableDragRowSize 409 +#define wxGrid_EnableCellEditControl 410 +#define wxGrid_EnableDragColSize 411 +#define wxGrid_EnableDragGridSize 412 +#define wxGrid_EnableDragRowSize 413 +#define wxGrid_EnableEditing 414 +#define wxGrid_EnableGridLines 415 +#define wxGrid_EndBatch 416 +#define wxGrid_Fit 417 +#define wxGrid_ForceRefresh 418 +#define wxGrid_GetBatchCount 419 +#define wxGrid_GetCellAlignment 420 +#define wxGrid_GetCellBackgroundColour 421 +#define wxGrid_GetCellEditor 422 +#define wxGrid_GetCellFont 423 +#define wxGrid_GetCellRenderer 424 +#define wxGrid_GetCellTextColour 425 +#define wxGrid_GetCellValue_2 426 +#define wxGrid_GetCellValue_1 427 +#define wxGrid_GetColLabelAlignment 428 +#define wxGrid_GetColLabelSize 429 +#define wxGrid_GetColLabelValue 430 +#define wxGrid_GetColMinimalAcceptableWidth 431 +#define wxGrid_GetDefaultCellAlignment 432 +#define wxGrid_GetDefaultCellBackgroundColour 433 +#define wxGrid_GetDefaultCellFont 434 +#define wxGrid_GetDefaultCellTextColour 435 +#define wxGrid_GetDefaultColLabelSize 436 +#define wxGrid_GetDefaultColSize 437 +#define wxGrid_GetDefaultEditor 438 +#define wxGrid_GetDefaultEditorForCell_2 439 +#define wxGrid_GetDefaultEditorForCell_1 440 +#define wxGrid_GetDefaultEditorForType 441 +#define wxGrid_GetDefaultRenderer 442 +#define wxGrid_GetDefaultRendererForCell 443 +#define wxGrid_GetDefaultRendererForType 444 +#define wxGrid_GetDefaultRowLabelSize 445 +#define wxGrid_GetDefaultRowSize 446 +#define wxGrid_GetGridCursorCol 447 +#define wxGrid_GetGridCursorRow 448 +#define wxGrid_GetGridLineColour 449 +#define wxGrid_GridLinesEnabled 450 +#define wxGrid_GetLabelBackgroundColour 451 +#define wxGrid_GetLabelFont 452 +#define wxGrid_GetLabelTextColour 453 +#define wxGrid_GetNumberCols 454 +#define wxGrid_GetNumberRows 455 +#define wxGrid_GetOrCreateCellAttr 456 +#define wxGrid_GetRowMinimalAcceptableHeight 457 +#define wxGrid_GetRowLabelAlignment 458 +#define wxGrid_GetRowLabelSize 459 +#define wxGrid_GetRowLabelValue 460 +#define wxGrid_GetRowSize 461 +#define wxGrid_GetScrollLineX 462 +#define wxGrid_GetScrollLineY 463 +#define wxGrid_GetSelectedCells 464 +#define wxGrid_GetSelectedCols 465 +#define wxGrid_GetSelectedRows 466 +#define wxGrid_GetSelectionBackground 467 +#define wxGrid_GetSelectionBlockTopLeft 468 +#define wxGrid_GetSelectionBlockBottomRight 469 +#define wxGrid_GetSelectionForeground 470 +#define wxGrid_GetViewWidth 471 +#define wxGrid_GetGridWindow 472 +#define wxGrid_GetGridRowLabelWindow 473 +#define wxGrid_GetGridColLabelWindow 474 +#define wxGrid_GetGridCornerLabelWindow 475 +#define wxGrid_HideCellEditControl 476 +#define wxGrid_InsertCols 477 +#define wxGrid_InsertRows 478 +#define wxGrid_IsCellEditControlEnabled 479 +#define wxGrid_IsCurrentCellReadOnly 480 +#define wxGrid_IsEditable 481 +#define wxGrid_IsInSelection_2 482 +#define wxGrid_IsInSelection_1 483 +#define wxGrid_IsReadOnly 484 +#define wxGrid_IsSelection 485 +#define wxGrid_IsVisible_3 486 +#define wxGrid_IsVisible_2 487 +#define wxGrid_MakeCellVisible_2 488 +#define wxGrid_MakeCellVisible_1 489 +#define wxGrid_MoveCursorDown 490 +#define wxGrid_MoveCursorLeft 491 +#define wxGrid_MoveCursorRight 492 +#define wxGrid_MoveCursorUp 493 +#define wxGrid_MoveCursorDownBlock 494 +#define wxGrid_MoveCursorLeftBlock 495 +#define wxGrid_MoveCursorRightBlock 496 +#define wxGrid_MoveCursorUpBlock 497 +#define wxGrid_MovePageDown 498 +#define wxGrid_MovePageUp 499 +#define wxGrid_RegisterDataType 500 +#define wxGrid_SaveEditControlValue 501 +#define wxGrid_SelectAll 502 +#define wxGrid_SelectBlock_5 503 +#define wxGrid_SelectBlock_3 504 +#define wxGrid_SelectCol 505 +#define wxGrid_SelectRow 506 +#define wxGrid_SetCellAlignment_4 507 +#define wxGrid_SetCellAlignment_3 508 +#define wxGrid_SetCellAlignment_1 509 +#define wxGrid_SetCellBackgroundColour_3_0 510 +#define wxGrid_SetCellBackgroundColour_1 511 +#define wxGrid_SetCellBackgroundColour_3_1 512 +#define wxGrid_SetCellEditor 513 +#define wxGrid_SetCellFont 514 +#define wxGrid_SetCellRenderer 515 +#define wxGrid_SetCellTextColour_3_0 516 +#define wxGrid_SetCellTextColour_3_1 517 +#define wxGrid_SetCellTextColour_1 518 +#define wxGrid_SetCellValue_3_0 519 +#define wxGrid_SetCellValue_2 520 +#define wxGrid_SetCellValue_3_1 521 +#define wxGrid_SetColAttr 522 +#define wxGrid_SetColFormatBool 523 +#define wxGrid_SetColFormatNumber 524 +#define wxGrid_SetColFormatFloat 525 +#define wxGrid_SetColFormatCustom 526 +#define wxGrid_SetColLabelAlignment 527 +#define wxGrid_SetColLabelSize 528 +#define wxGrid_SetColLabelValue 529 +#define wxGrid_SetColMinimalWidth 530 +#define wxGrid_SetColMinimalAcceptableWidth 531 +#define wxGrid_SetColSize 532 +#define wxGrid_SetDefaultCellAlignment 533 +#define wxGrid_SetDefaultCellBackgroundColour 534 +#define wxGrid_SetDefaultCellFont 535 +#define wxGrid_SetDefaultCellTextColour 536 +#define wxGrid_SetDefaultEditor 537 +#define wxGrid_SetDefaultRenderer 538 +#define wxGrid_SetDefaultColSize 539 +#define wxGrid_SetDefaultRowSize 540 +#define wxGrid_SetGridCursor 541 +#define wxGrid_SetGridLineColour 542 +#define wxGrid_SetLabelBackgroundColour 543 +#define wxGrid_SetLabelFont 544 +#define wxGrid_SetLabelTextColour 545 +#define wxGrid_SetMargins 546 +#define wxGrid_SetReadOnly 547 +#define wxGrid_SetRowAttr 548 +#define wxGrid_SetRowLabelAlignment 549 +#define wxGrid_SetRowLabelSize 550 +#define wxGrid_SetRowLabelValue 551 +#define wxGrid_SetRowMinimalHeight 552 +#define wxGrid_SetRowMinimalAcceptableHeight 553 +#define wxGrid_SetRowSize 554 +#define wxGrid_SetScrollLineX 555 +#define wxGrid_SetScrollLineY 556 +#define wxGrid_SetSelectionBackground 557 +#define wxGrid_SetSelectionForeground 558 +#define wxGrid_SetSelectionMode 559 +#define wxGrid_ShowCellEditControl 560 +#define wxGrid_XToCol 561 +#define wxGrid_XToEdgeOfCol 562 +#define wxGrid_YToEdgeOfRow 563 +#define wxGrid_YToRow 564 +#define wxGridCellRenderer_Draw 565 +#define wxGridCellRenderer_GetBestSize 566 +#define wxGridCellEditor_Create 567 +#define wxGridCellEditor_IsCreated 568 +#define wxGridCellEditor_SetSize 569 +#define wxGridCellEditor_Show 570 +#define wxGridCellEditor_PaintBackground 571 +#define wxGridCellEditor_BeginEdit 572 +#define wxGridCellEditor_EndEdit 573 +#define wxGridCellEditor_Reset 574 +#define wxGridCellEditor_StartingKey 575 +#define wxGridCellEditor_StartingClick 576 +#define wxGridCellEditor_HandleReturn 577 +#define wxGridCellBoolRenderer_new 578 +#define wxGridCellBoolRenderer_destroy 579 +#define wxGridCellBoolEditor_new 580 +#define wxGridCellBoolEditor_IsTrueValue 581 +#define wxGridCellBoolEditor_UseStringValues 582 +#define wxGridCellBoolEditor_destroy 583 +#define wxGridCellFloatRenderer_new 584 +#define wxGridCellFloatRenderer_GetPrecision 585 +#define wxGridCellFloatRenderer_GetWidth 586 +#define wxGridCellFloatRenderer_SetParameters 587 +#define wxGridCellFloatRenderer_SetPrecision 588 +#define wxGridCellFloatRenderer_SetWidth 589 +#define wxGridCellFloatRenderer_destroy 590 +#define wxGridCellFloatEditor_new 591 +#define wxGridCellFloatEditor_SetParameters 592 +#define wxGridCellFloatEditor_destroy 593 +#define wxGridCellStringRenderer_new 594 +#define wxGridCellStringRenderer_destroy 595 +#define wxGridCellTextEditor_new 596 +#define wxGridCellTextEditor_SetParameters 597 +#define wxGridCellTextEditor_destroy 598 +#define wxGridCellChoiceEditor_new 600 +#define wxGridCellChoiceEditor_SetParameters 601 +#define wxGridCellChoiceEditor_destroy 602 +#define wxGridCellNumberRenderer_new 603 +#define wxGridCellNumberRenderer_destroy 604 +#define wxGridCellNumberEditor_new 605 +#define wxGridCellNumberEditor_GetValue 606 +#define wxGridCellNumberEditor_SetParameters 607 +#define wxGridCellNumberEditor_destroy 608 +#define wxGridCellAttr_SetTextColour 609 +#define wxGridCellAttr_SetBackgroundColour 610 +#define wxGridCellAttr_SetFont 611 +#define wxGridCellAttr_SetAlignment 612 +#define wxGridCellAttr_SetReadOnly 613 +#define wxGridCellAttr_SetRenderer 614 +#define wxGridCellAttr_SetEditor 615 +#define wxGridCellAttr_HasTextColour 616 +#define wxGridCellAttr_HasBackgroundColour 617 +#define wxGridCellAttr_HasFont 618 +#define wxGridCellAttr_HasAlignment 619 +#define wxGridCellAttr_HasRenderer 620 +#define wxGridCellAttr_HasEditor 621 +#define wxGridCellAttr_GetTextColour 622 +#define wxGridCellAttr_GetBackgroundColour 623 +#define wxGridCellAttr_GetFont 624 +#define wxGridCellAttr_GetAlignment 625 +#define wxGridCellAttr_GetRenderer 626 +#define wxGridCellAttr_GetEditor 627 +#define wxGridCellAttr_IsReadOnly 628 +#define wxGridCellAttr_SetDefAttr 629 +#define wxDC_Blit 630 +#define wxDC_CalcBoundingBox 631 +#define wxDC_Clear 632 +#define wxDC_ComputeScaleAndOrigin 633 +#define wxDC_CrossHair 634 +#define wxDC_DestroyClippingRegion 635 +#define wxDC_DeviceToLogicalX 636 +#define wxDC_DeviceToLogicalXRel 637 +#define wxDC_DeviceToLogicalY 638 +#define wxDC_DeviceToLogicalYRel 639 +#define wxDC_DrawArc 640 +#define wxDC_DrawBitmap 641 +#define wxDC_DrawCheckMark 642 +#define wxDC_DrawCircle 643 +#define wxDC_DrawEllipse_2 645 +#define wxDC_DrawEllipse_1 646 +#define wxDC_DrawEllipticArc 647 +#define wxDC_DrawIcon 648 +#define wxDC_DrawLabel 649 +#define wxDC_DrawLine 650 +#define wxDC_DrawLines 651 +#define wxDC_DrawPolygon 653 +#define wxDC_DrawPoint 655 +#define wxDC_DrawRectangle_2 657 +#define wxDC_DrawRectangle_1 658 +#define wxDC_DrawRotatedText 659 +#define wxDC_DrawRoundedRectangle_3 661 +#define wxDC_DrawRoundedRectangle_2 662 +#define wxDC_DrawText 663 +#define wxDC_EndDoc 664 +#define wxDC_EndPage 665 +#define wxDC_FloodFill 666 +#define wxDC_GetBackground 667 +#define wxDC_GetBackgroundMode 668 +#define wxDC_GetBrush 669 +#define wxDC_GetCharHeight 670 +#define wxDC_GetCharWidth 671 +#define wxDC_GetClippingBox 672 +#define wxDC_GetFont 674 +#define wxDC_GetLayoutDirection 675 +#define wxDC_GetLogicalFunction 676 +#define wxDC_GetMapMode 677 +#define wxDC_GetMultiLineTextExtent_4 678 +#define wxDC_GetMultiLineTextExtent_1 679 +#define wxDC_GetPartialTextExtents 680 +#define wxDC_GetPen 681 +#define wxDC_GetPixel 682 +#define wxDC_GetPPI 683 +#define wxDC_GetSize 685 +#define wxDC_GetSizeMM 687 +#define wxDC_GetTextBackground 688 +#define wxDC_GetTextExtent_4 689 +#define wxDC_GetTextExtent_1 690 +#define wxDC_GetTextForeground 692 +#define wxDC_GetUserScale 693 +#define wxDC_GradientFillConcentric_3 694 +#define wxDC_GradientFillConcentric_4 695 +#define wxDC_GradientFillLinear 696 +#define wxDC_LogicalToDeviceX 697 +#define wxDC_LogicalToDeviceXRel 698 +#define wxDC_LogicalToDeviceY 699 +#define wxDC_LogicalToDeviceYRel 700 +#define wxDC_MaxX 701 +#define wxDC_MaxY 702 +#define wxDC_MinX 703 +#define wxDC_MinY 704 +#define wxDC_IsOk 705 +#define wxDC_ResetBoundingBox 706 +#define wxDC_SetAxisOrientation 707 +#define wxDC_SetBackground 708 +#define wxDC_SetBackgroundMode 709 +#define wxDC_SetBrush 710 +#define wxDC_SetClippingRegion_2 712 +#define wxDC_SetClippingRegion_1_1 713 +#define wxDC_SetClippingRegion_1_0 714 +#define wxDC_SetDeviceOrigin 715 +#define wxDC_SetFont 716 +#define wxDC_SetLayoutDirection 717 +#define wxDC_SetLogicalFunction 718 +#define wxDC_SetMapMode 719 +#define wxDC_SetPalette 720 +#define wxDC_SetPen 721 +#define wxDC_SetTextBackground 722 +#define wxDC_SetTextForeground 723 +#define wxDC_SetUserScale 724 +#define wxDC_StartDoc 725 +#define wxDC_StartPage 726 +#define wxMirrorDC_new 727 +#define wxMirrorDC_destroy 728 +#define wxScreenDC_new 729 +#define wxScreenDC_destruct 730 +#define wxPostScriptDC_new_0 731 +#define wxPostScriptDC_new_1 732 +#define wxPostScriptDC_destruct 733 +#define wxPostScriptDC_SetResolution 734 +#define wxPostScriptDC_GetResolution 735 +#define wxWindowDC_new_0 736 +#define wxWindowDC_new_1 737 +#define wxWindowDC_destruct 738 +#define wxClientDC_new_0 739 +#define wxClientDC_new_1 740 +#define wxClientDC_destroy 741 +#define wxPaintDC_new_0 742 +#define wxPaintDC_new_1 743 +#define wxPaintDC_destroy 744 +#define wxMemoryDC_new_1_0 746 +#define wxMemoryDC_new_1_1 747 +#define wxMemoryDC_new_0 748 +#define wxMemoryDC_destruct 750 +#define wxMemoryDC_SelectObject 751 +#define wxMemoryDC_SelectObjectAsSource 752 +#define wxBufferedDC_new_0 753 +#define wxBufferedDC_new_2 754 +#define wxBufferedDC_new_3 755 +#define wxBufferedDC_destruct 756 +#define wxBufferedDC_Init_2 757 +#define wxBufferedDC_Init_3 758 +#define wxBufferedPaintDC_new_3 759 +#define wxBufferedPaintDC_new_2 760 +#define wxBufferedPaintDC_destruct 761 +#define wxGraphicsObject_destruct 762 +#define wxGraphicsObject_GetRenderer 763 +#define wxGraphicsObject_IsNull 764 +#define wxGraphicsContext_destruct 765 +#define wxGraphicsContext_Create_1_1 766 +#define wxGraphicsContext_Create_1_0 767 +#define wxGraphicsContext_Create_0 768 +#define wxGraphicsContext_CreatePen 769 +#define wxGraphicsContext_CreateBrush 770 +#define wxGraphicsContext_CreateRadialGradientBrush 771 +#define wxGraphicsContext_CreateLinearGradientBrush 772 +#define wxGraphicsContext_CreateFont 773 +#define wxGraphicsContext_CreateMatrix 774 +#define wxGraphicsContext_CreatePath 775 +#define wxGraphicsContext_Clip_1 776 +#define wxGraphicsContext_Clip_4 777 +#define wxGraphicsContext_ResetClip 778 +#define wxGraphicsContext_DrawBitmap 779 +#define wxGraphicsContext_DrawEllipse 780 +#define wxGraphicsContext_DrawIcon 781 +#define wxGraphicsContext_DrawLines 782 +#define wxGraphicsContext_DrawPath 783 +#define wxGraphicsContext_DrawRectangle 784 +#define wxGraphicsContext_DrawRoundedRectangle 785 +#define wxGraphicsContext_DrawText_3 786 +#define wxGraphicsContext_DrawText_4_0 787 +#define wxGraphicsContext_DrawText_4_1 788 +#define wxGraphicsContext_DrawText_5 789 +#define wxGraphicsContext_FillPath 790 +#define wxGraphicsContext_StrokePath 791 +#define wxGraphicsContext_GetPartialTextExtents 792 +#define wxGraphicsContext_GetTextExtent 793 +#define wxGraphicsContext_Rotate 794 +#define wxGraphicsContext_Scale 795 +#define wxGraphicsContext_Translate 796 +#define wxGraphicsContext_GetTransform 797 +#define wxGraphicsContext_SetTransform 798 +#define wxGraphicsContext_ConcatTransform 799 +#define wxGraphicsContext_SetBrush_1_1 800 +#define wxGraphicsContext_SetBrush_1_0 801 +#define wxGraphicsContext_SetFont_1 802 +#define wxGraphicsContext_SetFont_2 803 +#define wxGraphicsContext_SetPen_1_0 804 +#define wxGraphicsContext_SetPen_1_1 805 +#define wxGraphicsContext_StrokeLine 806 +#define wxGraphicsContext_StrokeLines 807 +#define wxGraphicsMatrix_Concat 809 +#define wxGraphicsMatrix_Get 811 +#define wxGraphicsMatrix_Invert 812 +#define wxGraphicsMatrix_IsEqual 813 +#define wxGraphicsMatrix_IsIdentity 815 +#define wxGraphicsMatrix_Rotate 816 +#define wxGraphicsMatrix_Scale 817 +#define wxGraphicsMatrix_Translate 818 +#define wxGraphicsMatrix_Set 819 +#define wxGraphicsMatrix_TransformPoint 820 +#define wxGraphicsMatrix_TransformDistance 821 +#define wxGraphicsPath_MoveToPoint_2 822 +#define wxGraphicsPath_MoveToPoint_1 823 +#define wxGraphicsPath_AddArc_6 824 +#define wxGraphicsPath_AddArc_5 825 +#define wxGraphicsPath_AddArcToPoint 826 +#define wxGraphicsPath_AddCircle 827 +#define wxGraphicsPath_AddCurveToPoint_6 828 +#define wxGraphicsPath_AddCurveToPoint_3 829 +#define wxGraphicsPath_AddEllipse 830 +#define wxGraphicsPath_AddLineToPoint_2 831 +#define wxGraphicsPath_AddLineToPoint_1 832 +#define wxGraphicsPath_AddPath 833 +#define wxGraphicsPath_AddQuadCurveToPoint 834 +#define wxGraphicsPath_AddRectangle 835 +#define wxGraphicsPath_AddRoundedRectangle 836 +#define wxGraphicsPath_CloseSubpath 837 +#define wxGraphicsPath_Contains_3 838 +#define wxGraphicsPath_Contains_2 839 +#define wxGraphicsPath_GetBox 841 +#define wxGraphicsPath_GetCurrentPoint 843 +#define wxGraphicsPath_Transform 844 +#define wxGraphicsRenderer_GetDefaultRenderer 845 +#define wxGraphicsRenderer_CreateContext_1_1 846 +#define wxGraphicsRenderer_CreateContext_1_0 847 +#define wxGraphicsRenderer_CreatePen 848 +#define wxGraphicsRenderer_CreateBrush 849 +#define wxGraphicsRenderer_CreateLinearGradientBrush 850 +#define wxGraphicsRenderer_CreateRadialGradientBrush 851 +#define wxGraphicsRenderer_CreateFont 852 +#define wxGraphicsRenderer_CreateMatrix 853 +#define wxGraphicsRenderer_CreatePath 854 +#define wxMenuBar_new_1 856 +#define wxMenuBar_new_0 858 +#define wxMenuBar_destruct 860 +#define wxMenuBar_Append 861 +#define wxMenuBar_Check 862 +#define wxMenuBar_Enable_2 863 +#define wxMenuBar_Enable_1 864 +#define wxMenuBar_EnableTop 865 +#define wxMenuBar_FindMenu 866 +#define wxMenuBar_FindMenuItem 867 +#define wxMenuBar_FindItem 868 +#define wxMenuBar_GetHelpString 869 +#define wxMenuBar_GetLabel_1 870 +#define wxMenuBar_GetLabel_0 871 +#define wxMenuBar_GetLabelTop 872 +#define wxMenuBar_GetMenu 873 +#define wxMenuBar_GetMenuCount 874 +#define wxMenuBar_Insert 875 +#define wxMenuBar_IsChecked 876 +#define wxMenuBar_IsEnabled_1 877 +#define wxMenuBar_IsEnabled_0 878 +#define wxMenuBar_Remove 879 +#define wxMenuBar_Replace 880 +#define wxMenuBar_SetHelpString 881 +#define wxMenuBar_SetLabel_2 882 +#define wxMenuBar_SetLabel_1 883 +#define wxMenuBar_SetLabelTop 884 +#define wxControl_GetLabel 885 +#define wxControl_SetLabel 886 +#define wxControlWithItems_Append_1 887 +#define wxControlWithItems_Append_2 888 +#define wxControlWithItems_appendStrings_1 889 +#define wxControlWithItems_Clear 890 +#define wxControlWithItems_Delete 891 +#define wxControlWithItems_FindString 892 +#define wxControlWithItems_getClientData 893 +#define wxControlWithItems_setClientData 894 +#define wxControlWithItems_GetCount 895 +#define wxControlWithItems_GetSelection 896 +#define wxControlWithItems_GetString 897 +#define wxControlWithItems_GetStringSelection 898 +#define wxControlWithItems_Insert_2 899 +#define wxControlWithItems_Insert_3 900 +#define wxControlWithItems_IsEmpty 901 +#define wxControlWithItems_Select 902 +#define wxControlWithItems_SetSelection 903 +#define wxControlWithItems_SetString 904 +#define wxControlWithItems_SetStringSelection 905 +#define wxMenu_new_2 908 +#define wxMenu_new_1 909 +#define wxMenu_destruct 911 +#define wxMenu_Append_3 912 +#define wxMenu_Append_1 913 +#define wxMenu_Append_4_0 914 +#define wxMenu_Append_4_1 915 +#define wxMenu_AppendCheckItem 916 +#define wxMenu_AppendRadioItem 917 +#define wxMenu_AppendSeparator 918 +#define wxMenu_Break 919 +#define wxMenu_Check 920 +#define wxMenu_Delete_1_0 921 +#define wxMenu_Delete_1_1 922 +#define wxMenu_Destroy_1_0 923 +#define wxMenu_Destroy_1_1 924 +#define wxMenu_Enable 925 +#define wxMenu_FindItem_1 926 +#define wxMenu_FindItem_2 927 +#define wxMenu_FindItemByPosition 928 +#define wxMenu_GetHelpString 929 +#define wxMenu_GetLabel 930 +#define wxMenu_GetMenuItemCount 931 +#define wxMenu_GetMenuItems 932 +#define wxMenu_GetTitle 934 +#define wxMenu_Insert_2 935 +#define wxMenu_Insert_3 936 +#define wxMenu_Insert_5_1 937 +#define wxMenu_Insert_5_0 938 +#define wxMenu_InsertCheckItem 939 +#define wxMenu_InsertRadioItem 940 +#define wxMenu_InsertSeparator 941 +#define wxMenu_IsChecked 942 +#define wxMenu_IsEnabled 943 +#define wxMenu_Prepend_1 944 +#define wxMenu_Prepend_2 945 +#define wxMenu_Prepend_4_1 946 +#define wxMenu_Prepend_4_0 947 +#define wxMenu_PrependCheckItem 948 +#define wxMenu_PrependRadioItem 949 +#define wxMenu_PrependSeparator 950 +#define wxMenu_Remove_1_0 951 +#define wxMenu_Remove_1_1 952 +#define wxMenu_SetHelpString 953 +#define wxMenu_SetLabel 954 +#define wxMenu_SetTitle 955 +#define wxMenuItem_new 956 +#define wxMenuItem_destruct 958 +#define wxMenuItem_Check 959 +#define wxMenuItem_Enable 960 +#define wxMenuItem_GetBitmap 961 +#define wxMenuItem_GetHelp 962 +#define wxMenuItem_GetId 963 +#define wxMenuItem_GetKind 964 +#define wxMenuItem_GetLabel 965 +#define wxMenuItem_GetLabelFromText 966 +#define wxMenuItem_GetMenu 967 +#define wxMenuItem_GetText 968 +#define wxMenuItem_GetSubMenu 969 +#define wxMenuItem_IsCheckable 970 +#define wxMenuItem_IsChecked 971 +#define wxMenuItem_IsEnabled 972 +#define wxMenuItem_IsSeparator 973 +#define wxMenuItem_IsSubMenu 974 +#define wxMenuItem_SetBitmap 975 +#define wxMenuItem_SetHelp 976 +#define wxMenuItem_SetMenu 977 +#define wxMenuItem_SetSubMenu 978 +#define wxMenuItem_SetText 979 +#define wxToolBar_AddControl 980 +#define wxToolBar_AddSeparator 981 +#define wxToolBar_AddTool_5 982 +#define wxToolBar_AddTool_4_0 983 +#define wxToolBar_AddTool_1 984 +#define wxToolBar_AddTool_4_1 985 +#define wxToolBar_AddTool_3 986 +#define wxToolBar_AddTool_6 987 +#define wxToolBar_AddCheckTool 988 +#define wxToolBar_AddRadioTool 989 +#define wxToolBar_AddStretchableSpace 990 +#define wxToolBar_InsertStretchableSpace 991 +#define wxToolBar_DeleteTool 992 +#define wxToolBar_DeleteToolByPos 993 +#define wxToolBar_EnableTool 994 +#define wxToolBar_FindById 995 +#define wxToolBar_FindControl 996 +#define wxToolBar_FindToolForPosition 997 +#define wxToolBar_GetToolSize 998 +#define wxToolBar_GetToolBitmapSize 999 +#define wxToolBar_GetMargins 1000 +#define wxToolBar_GetToolEnabled 1001 +#define wxToolBar_GetToolLongHelp 1002 +#define wxToolBar_GetToolPacking 1003 +#define wxToolBar_GetToolPos 1004 +#define wxToolBar_GetToolSeparation 1005 +#define wxToolBar_GetToolShortHelp 1006 +#define wxToolBar_GetToolState 1007 +#define wxToolBar_InsertControl 1008 +#define wxToolBar_InsertSeparator 1009 +#define wxToolBar_InsertTool_5 1010 +#define wxToolBar_InsertTool_2 1011 +#define wxToolBar_InsertTool_4 1012 +#define wxToolBar_Realize 1013 +#define wxToolBar_RemoveTool 1014 +#define wxToolBar_SetMargins 1015 +#define wxToolBar_SetToolBitmapSize 1016 +#define wxToolBar_SetToolLongHelp 1017 +#define wxToolBar_SetToolPacking 1018 +#define wxToolBar_SetToolShortHelp 1019 +#define wxToolBar_SetToolSeparation 1020 +#define wxToolBar_ToggleTool 1021 +#define wxStatusBar_new_0 1023 +#define wxStatusBar_new_2 1024 +#define wxStatusBar_destruct 1026 +#define wxStatusBar_Create 1027 +#define wxStatusBar_GetFieldRect 1028 +#define wxStatusBar_GetFieldsCount 1029 +#define wxStatusBar_GetStatusText 1030 +#define wxStatusBar_PopStatusText 1031 +#define wxStatusBar_PushStatusText 1032 +#define wxStatusBar_SetFieldsCount 1033 +#define wxStatusBar_SetMinHeight 1034 +#define wxStatusBar_SetStatusText 1035 +#define wxStatusBar_SetStatusWidths 1036 +#define wxStatusBar_SetStatusStyles 1037 +#define wxBitmap_new_0 1038 +#define wxBitmap_new_3 1039 +#define wxBitmap_new_4 1040 +#define wxBitmap_new_2_0 1041 +#define wxBitmap_new_2_1 1042 +#define wxBitmap_destruct 1043 +#define wxBitmap_ConvertToImage 1044 +#define wxBitmap_CopyFromIcon 1045 +#define wxBitmap_Create 1046 +#define wxBitmap_GetDepth 1047 +#define wxBitmap_GetHeight 1048 +#define wxBitmap_GetPalette 1049 +#define wxBitmap_GetMask 1050 +#define wxBitmap_GetWidth 1051 +#define wxBitmap_GetSubBitmap 1052 +#define wxBitmap_LoadFile 1053 +#define wxBitmap_Ok 1054 +#define wxBitmap_SaveFile 1055 +#define wxBitmap_SetDepth 1056 +#define wxBitmap_SetHeight 1057 +#define wxBitmap_SetMask 1058 +#define wxBitmap_SetPalette 1059 +#define wxBitmap_SetWidth 1060 +#define wxIcon_new_0 1061 +#define wxIcon_new_2 1062 +#define wxIcon_new_1 1063 +#define wxIcon_CopyFromBitmap 1064 +#define wxIcon_destroy 1065 +#define wxIconBundle_new_0 1066 +#define wxIconBundle_new_2 1067 +#define wxIconBundle_new_1_0 1068 +#define wxIconBundle_new_1_1 1069 +#define wxIconBundle_destruct 1070 +#define wxIconBundle_AddIcon_2 1071 +#define wxIconBundle_AddIcon_1 1072 +#define wxIconBundle_GetIcon_1_1 1073 +#define wxIconBundle_GetIcon_1_0 1074 +#define wxCursor_new_0 1075 +#define wxCursor_new_1_0 1076 +#define wxCursor_new_1_1 1077 +#define wxCursor_new_4 1078 +#define wxCursor_destruct 1079 +#define wxCursor_Ok 1080 +#define wxMask_new_0 1081 +#define wxMask_new_2_1 1082 +#define wxMask_new_2_0 1083 +#define wxMask_new_1 1084 +#define wxMask_destruct 1085 +#define wxMask_Create_2_1 1086 +#define wxMask_Create_2_0 1087 +#define wxMask_Create_1 1088 +#define wxImage_new_0 1089 +#define wxImage_new_3_0 1090 +#define wxImage_new_4 1091 +#define wxImage_new_5 1092 +#define wxImage_new_2 1093 +#define wxImage_new_3_1 1094 +#define wxImage_Blur 1095 +#define wxImage_BlurHorizontal 1096 +#define wxImage_BlurVertical 1097 +#define wxImage_ConvertAlphaToMask 1098 +#define wxImage_ConvertToGreyscale 1099 +#define wxImage_ConvertToMono 1100 +#define wxImage_Copy 1101 +#define wxImage_Create_3 1102 +#define wxImage_Create_4 1103 +#define wxImage_Create_5 1104 +#define wxImage_Destroy 1105 +#define wxImage_FindFirstUnusedColour 1106 +#define wxImage_GetImageExtWildcard 1107 +#define wxImage_GetAlpha_2 1108 +#define wxImage_GetAlpha_0 1109 +#define wxImage_GetBlue 1110 +#define wxImage_GetData 1111 +#define wxImage_GetGreen 1112 +#define wxImage_GetImageCount 1113 +#define wxImage_GetHeight 1114 +#define wxImage_GetMaskBlue 1115 +#define wxImage_GetMaskGreen 1116 +#define wxImage_GetMaskRed 1117 +#define wxImage_GetOrFindMaskColour 1118 +#define wxImage_GetPalette 1119 +#define wxImage_GetRed 1120 +#define wxImage_GetSubImage 1121 +#define wxImage_GetWidth 1122 +#define wxImage_HasAlpha 1123 +#define wxImage_HasMask 1124 +#define wxImage_GetOption 1125 +#define wxImage_GetOptionInt 1126 +#define wxImage_HasOption 1127 +#define wxImage_InitAlpha 1128 +#define wxImage_InitStandardHandlers 1129 +#define wxImage_IsTransparent 1130 +#define wxImage_LoadFile_2 1131 +#define wxImage_LoadFile_3 1132 +#define wxImage_Ok 1133 +#define wxImage_RemoveHandler 1134 +#define wxImage_Mirror 1135 +#define wxImage_Replace 1136 +#define wxImage_Rescale 1137 +#define wxImage_Resize 1138 +#define wxImage_Rotate 1139 +#define wxImage_RotateHue 1140 +#define wxImage_Rotate90 1141 +#define wxImage_SaveFile_1 1142 +#define wxImage_SaveFile_2_0 1143 +#define wxImage_SaveFile_2_1 1144 +#define wxImage_Scale 1145 +#define wxImage_Size 1146 +#define wxImage_SetAlpha_3 1147 +#define wxImage_SetAlpha_2 1148 +#define wxImage_SetData_2 1149 +#define wxImage_SetData_4 1150 +#define wxImage_SetMask 1151 +#define wxImage_SetMaskColour 1152 +#define wxImage_SetMaskFromImage 1153 +#define wxImage_SetOption_2_1 1154 +#define wxImage_SetOption_2_0 1155 +#define wxImage_SetPalette 1156 +#define wxImage_SetRGB_5 1157 +#define wxImage_SetRGB_4 1158 +#define wxImage_destroy 1159 +#define wxBrush_new_0 1160 +#define wxBrush_new_2 1161 +#define wxBrush_new_1 1162 +#define wxBrush_destruct 1164 +#define wxBrush_GetColour 1165 +#define wxBrush_GetStipple 1166 +#define wxBrush_GetStyle 1167 +#define wxBrush_IsHatch 1168 +#define wxBrush_IsOk 1169 +#define wxBrush_SetColour_1 1170 +#define wxBrush_SetColour_3 1171 +#define wxBrush_SetStipple 1172 +#define wxBrush_SetStyle 1173 +#define wxPen_new_0 1174 +#define wxPen_new_2 1175 +#define wxPen_destruct 1176 +#define wxPen_GetCap 1177 +#define wxPen_GetColour 1178 +#define wxPen_GetJoin 1179 +#define wxPen_GetStyle 1180 +#define wxPen_GetWidth 1181 +#define wxPen_IsOk 1182 +#define wxPen_SetCap 1183 +#define wxPen_SetColour_1 1184 +#define wxPen_SetColour_3 1185 +#define wxPen_SetJoin 1186 +#define wxPen_SetStyle 1187 +#define wxPen_SetWidth 1188 +#define wxRegion_new_0 1189 +#define wxRegion_new_4 1190 +#define wxRegion_new_2 1191 +#define wxRegion_new_1_1 1192 +#define wxRegion_new_1_0 1194 +#define wxRegion_destruct 1196 +#define wxRegion_Clear 1197 +#define wxRegion_Contains_2 1198 +#define wxRegion_Contains_1_0 1199 +#define wxRegion_Contains_4 1200 +#define wxRegion_Contains_1_1 1201 +#define wxRegion_ConvertToBitmap 1202 +#define wxRegion_GetBox 1203 +#define wxRegion_Intersect_4 1204 +#define wxRegion_Intersect_1_1 1205 +#define wxRegion_Intersect_1_0 1206 +#define wxRegion_IsEmpty 1207 +#define wxRegion_Subtract_4 1208 +#define wxRegion_Subtract_1_1 1209 +#define wxRegion_Subtract_1_0 1210 +#define wxRegion_Offset_2 1211 +#define wxRegion_Offset_1 1212 +#define wxRegion_Union_4 1213 +#define wxRegion_Union_1_2 1214 +#define wxRegion_Union_1_1 1215 +#define wxRegion_Union_1_0 1216 +#define wxRegion_Union_3 1217 +#define wxRegion_Xor_4 1218 +#define wxRegion_Xor_1_1 1219 +#define wxRegion_Xor_1_0 1220 +#define wxAcceleratorTable_new_0 1221 +#define wxAcceleratorTable_new_2 1222 +#define wxAcceleratorTable_destruct 1223 +#define wxAcceleratorTable_Ok 1224 +#define wxAcceleratorEntry_new_1_0 1225 +#define wxAcceleratorEntry_new_1_1 1226 +#define wxAcceleratorEntry_GetCommand 1227 +#define wxAcceleratorEntry_GetFlags 1228 +#define wxAcceleratorEntry_GetKeyCode 1229 +#define wxAcceleratorEntry_Set 1230 +#define wxAcceleratorEntry_destroy 1231 +#define wxCaret_new_3 1236 +#define wxCaret_new_2 1237 +#define wxCaret_destruct 1239 +#define wxCaret_Create_3 1240 +#define wxCaret_Create_2 1241 +#define wxCaret_GetBlinkTime 1242 +#define wxCaret_GetPosition 1244 +#define wxCaret_GetSize 1246 +#define wxCaret_GetWindow 1247 +#define wxCaret_Hide 1248 +#define wxCaret_IsOk 1249 +#define wxCaret_IsVisible 1250 +#define wxCaret_Move_2 1251 +#define wxCaret_Move_1 1252 +#define wxCaret_SetBlinkTime 1253 +#define wxCaret_SetSize_2 1254 +#define wxCaret_SetSize_1 1255 +#define wxCaret_Show 1256 +#define wxSizer_Add_2_1 1257 +#define wxSizer_Add_2_0 1258 +#define wxSizer_Add_3 1259 +#define wxSizer_Add_2_3 1260 +#define wxSizer_Add_2_2 1261 +#define wxSizer_AddSpacer 1262 +#define wxSizer_AddStretchSpacer 1263 +#define wxSizer_CalcMin 1264 +#define wxSizer_Clear 1265 +#define wxSizer_Detach_1_2 1266 +#define wxSizer_Detach_1_1 1267 +#define wxSizer_Detach_1_0 1268 +#define wxSizer_Fit 1269 +#define wxSizer_FitInside 1270 +#define wxSizer_GetChildren 1271 +#define wxSizer_GetItem_2_1 1272 +#define wxSizer_GetItem_2_0 1273 +#define wxSizer_GetItem_1 1274 +#define wxSizer_GetSize 1275 +#define wxSizer_GetPosition 1276 +#define wxSizer_GetMinSize 1277 +#define wxSizer_Hide_2_0 1278 +#define wxSizer_Hide_2_1 1279 +#define wxSizer_Hide_1 1280 +#define wxSizer_Insert_3_1 1281 +#define wxSizer_Insert_3_0 1282 +#define wxSizer_Insert_4 1283 +#define wxSizer_Insert_3_3 1284 +#define wxSizer_Insert_3_2 1285 +#define wxSizer_Insert_2 1286 +#define wxSizer_InsertSpacer 1287 +#define wxSizer_InsertStretchSpacer 1288 +#define wxSizer_IsShown_1_2 1289 +#define wxSizer_IsShown_1_1 1290 +#define wxSizer_IsShown_1_0 1291 +#define wxSizer_Layout 1292 +#define wxSizer_Prepend_2_1 1293 +#define wxSizer_Prepend_2_0 1294 +#define wxSizer_Prepend_3 1295 +#define wxSizer_Prepend_2_3 1296 +#define wxSizer_Prepend_2_2 1297 +#define wxSizer_Prepend_1 1298 +#define wxSizer_PrependSpacer 1299 +#define wxSizer_PrependStretchSpacer 1300 +#define wxSizer_RecalcSizes 1301 +#define wxSizer_Remove_1_1 1302 +#define wxSizer_Remove_1_0 1303 +#define wxSizer_Replace_3_1 1304 +#define wxSizer_Replace_3_0 1305 +#define wxSizer_Replace_2 1306 +#define wxSizer_SetDimension 1307 +#define wxSizer_SetMinSize_2 1308 +#define wxSizer_SetMinSize_1 1309 +#define wxSizer_SetItemMinSize_3_2 1310 +#define wxSizer_SetItemMinSize_2_2 1311 +#define wxSizer_SetItemMinSize_3_1 1312 +#define wxSizer_SetItemMinSize_2_1 1313 +#define wxSizer_SetItemMinSize_3_0 1314 +#define wxSizer_SetItemMinSize_2_0 1315 +#define wxSizer_SetSizeHints 1316 +#define wxSizer_SetVirtualSizeHints 1317 +#define wxSizer_Show_2_2 1318 +#define wxSizer_Show_2_1 1319 +#define wxSizer_Show_2_0 1320 +#define wxSizer_Show_1 1321 +#define wxSizerFlags_new 1322 +#define wxSizerFlags_Align 1323 +#define wxSizerFlags_Border_2 1324 +#define wxSizerFlags_Border_1 1325 +#define wxSizerFlags_Center 1326 +#define wxSizerFlags_Centre 1327 +#define wxSizerFlags_Expand 1328 +#define wxSizerFlags_Left 1329 +#define wxSizerFlags_Proportion 1330 +#define wxSizerFlags_Right 1331 +#define wxSizerFlags_destroy 1332 +#define wxSizerItem_new_5_1 1333 +#define wxSizerItem_new_2_1 1334 +#define wxSizerItem_new_5_0 1335 +#define wxSizerItem_new_2_0 1336 +#define wxSizerItem_new_6 1337 +#define wxSizerItem_new_3 1338 +#define wxSizerItem_new_0 1339 +#define wxSizerItem_destruct 1340 +#define wxSizerItem_CalcMin 1341 +#define wxSizerItem_DeleteWindows 1342 +#define wxSizerItem_DetachSizer 1343 +#define wxSizerItem_GetBorder 1344 +#define wxSizerItem_GetFlag 1345 +#define wxSizerItem_GetMinSize 1346 +#define wxSizerItem_GetPosition 1347 +#define wxSizerItem_GetProportion 1348 +#define wxSizerItem_GetRatio 1349 +#define wxSizerItem_GetRect 1350 +#define wxSizerItem_GetSize 1351 +#define wxSizerItem_GetSizer 1352 +#define wxSizerItem_GetSpacer 1353 +#define wxSizerItem_GetUserData 1354 +#define wxSizerItem_GetWindow 1355 +#define wxSizerItem_IsSizer 1356 +#define wxSizerItem_IsShown 1357 +#define wxSizerItem_IsSpacer 1358 +#define wxSizerItem_IsWindow 1359 +#define wxSizerItem_SetBorder 1360 +#define wxSizerItem_SetDimension 1361 +#define wxSizerItem_SetFlag 1362 +#define wxSizerItem_SetInitSize 1363 +#define wxSizerItem_SetMinSize_1 1364 +#define wxSizerItem_SetMinSize_2 1365 +#define wxSizerItem_SetProportion 1366 +#define wxSizerItem_SetRatio_2 1367 +#define wxSizerItem_SetRatio_1_1 1368 +#define wxSizerItem_SetRatio_1_0 1369 +#define wxSizerItem_SetSizer 1370 +#define wxSizerItem_SetSpacer_1 1371 +#define wxSizerItem_SetSpacer_2 1372 +#define wxSizerItem_SetWindow 1373 +#define wxSizerItem_Show 1374 +#define wxBoxSizer_new 1375 +#define wxBoxSizer_GetOrientation 1376 +#define wxBoxSizer_destroy 1377 +#define wxStaticBoxSizer_new_2 1378 +#define wxStaticBoxSizer_new_3 1379 +#define wxStaticBoxSizer_GetStaticBox 1380 +#define wxStaticBoxSizer_destroy 1381 +#define wxGridSizer_new_4 1382 +#define wxGridSizer_new_2 1383 +#define wxGridSizer_GetCols 1384 +#define wxGridSizer_GetHGap 1385 +#define wxGridSizer_GetRows 1386 +#define wxGridSizer_GetVGap 1387 +#define wxGridSizer_SetCols 1388 +#define wxGridSizer_SetHGap 1389 +#define wxGridSizer_SetRows 1390 +#define wxGridSizer_SetVGap 1391 +#define wxGridSizer_destroy 1392 +#define wxFlexGridSizer_new_4 1393 +#define wxFlexGridSizer_new_2 1394 +#define wxFlexGridSizer_AddGrowableCol 1395 +#define wxFlexGridSizer_AddGrowableRow 1396 +#define wxFlexGridSizer_GetFlexibleDirection 1397 +#define wxFlexGridSizer_GetNonFlexibleGrowMode 1398 +#define wxFlexGridSizer_RemoveGrowableCol 1399 +#define wxFlexGridSizer_RemoveGrowableRow 1400 +#define wxFlexGridSizer_SetFlexibleDirection 1401 +#define wxFlexGridSizer_SetNonFlexibleGrowMode 1402 +#define wxFlexGridSizer_destroy 1403 +#define wxGridBagSizer_new 1404 +#define wxGridBagSizer_Add_3_2 1405 +#define wxGridBagSizer_Add_3_1 1406 +#define wxGridBagSizer_Add_4 1407 +#define wxGridBagSizer_Add_1_0 1408 +#define wxGridBagSizer_Add_2_1 1409 +#define wxGridBagSizer_Add_2_0 1410 +#define wxGridBagSizer_Add_3_0 1411 +#define wxGridBagSizer_Add_1_1 1412 +#define wxGridBagSizer_CalcMin 1413 +#define wxGridBagSizer_CheckForIntersection_2 1414 +#define wxGridBagSizer_CheckForIntersection_3 1415 +#define wxGridBagSizer_FindItem_1_1 1416 +#define wxGridBagSizer_FindItem_1_0 1417 +#define wxGridBagSizer_FindItemAtPoint 1418 +#define wxGridBagSizer_FindItemAtPosition 1419 +#define wxGridBagSizer_FindItemWithData 1420 +#define wxGridBagSizer_GetCellSize 1421 +#define wxGridBagSizer_GetEmptyCellSize 1422 +#define wxGridBagSizer_GetItemPosition_1_2 1423 +#define wxGridBagSizer_GetItemPosition_1_1 1424 +#define wxGridBagSizer_GetItemPosition_1_0 1425 +#define wxGridBagSizer_GetItemSpan_1_2 1426 +#define wxGridBagSizer_GetItemSpan_1_1 1427 +#define wxGridBagSizer_GetItemSpan_1_0 1428 +#define wxGridBagSizer_SetEmptyCellSize 1429 +#define wxGridBagSizer_SetItemPosition_2_2 1430 +#define wxGridBagSizer_SetItemPosition_2_1 1431 +#define wxGridBagSizer_SetItemPosition_2_0 1432 +#define wxGridBagSizer_SetItemSpan_2_2 1433 +#define wxGridBagSizer_SetItemSpan_2_1 1434 +#define wxGridBagSizer_SetItemSpan_2_0 1435 +#define wxGridBagSizer_destroy 1436 +#define wxStdDialogButtonSizer_new 1437 +#define wxStdDialogButtonSizer_AddButton 1438 +#define wxStdDialogButtonSizer_Realize 1439 +#define wxStdDialogButtonSizer_SetAffirmativeButton 1440 +#define wxStdDialogButtonSizer_SetCancelButton 1441 +#define wxStdDialogButtonSizer_SetNegativeButton 1442 +#define wxStdDialogButtonSizer_destroy 1443 +#define wxFont_new_0 1444 +#define wxFont_new_1 1445 +#define wxFont_new_5 1446 +#define wxFont_destruct 1448 +#define wxFont_IsFixedWidth 1449 +#define wxFont_GetDefaultEncoding 1450 +#define wxFont_GetFaceName 1451 +#define wxFont_GetFamily 1452 +#define wxFont_GetNativeFontInfoDesc 1453 +#define wxFont_GetNativeFontInfoUserDesc 1454 +#define wxFont_GetPointSize 1455 +#define wxFont_GetStyle 1456 +#define wxFont_GetUnderlined 1457 +#define wxFont_GetWeight 1458 +#define wxFont_Ok 1459 +#define wxFont_SetDefaultEncoding 1460 +#define wxFont_SetFaceName 1461 +#define wxFont_SetFamily 1462 +#define wxFont_SetPointSize 1463 +#define wxFont_SetStyle 1464 +#define wxFont_SetUnderlined 1465 +#define wxFont_SetWeight 1466 +#define wxToolTip_Enable 1467 +#define wxToolTip_SetDelay 1468 +#define wxToolTip_new 1469 +#define wxToolTip_SetTip 1470 +#define wxToolTip_GetTip 1471 +#define wxToolTip_GetWindow 1472 +#define wxToolTip_destroy 1473 +#define wxButton_new_3 1475 +#define wxButton_new_0 1476 +#define wxButton_destruct 1477 +#define wxButton_Create 1478 +#define wxButton_GetDefaultSize 1479 +#define wxButton_SetDefault 1480 +#define wxButton_SetLabel 1481 +#define wxBitmapButton_new_4 1483 +#define wxBitmapButton_new_0 1484 +#define wxBitmapButton_Create 1485 +#define wxBitmapButton_GetBitmapDisabled 1486 +#define wxBitmapButton_GetBitmapFocus 1488 +#define wxBitmapButton_GetBitmapLabel 1490 +#define wxBitmapButton_GetBitmapSelected 1492 +#define wxBitmapButton_SetBitmapDisabled 1494 +#define wxBitmapButton_SetBitmapFocus 1495 +#define wxBitmapButton_SetBitmapLabel 1496 +#define wxBitmapButton_SetBitmapSelected 1497 +#define wxBitmapButton_destroy 1498 +#define wxToggleButton_new_0 1499 +#define wxToggleButton_new_4 1500 +#define wxToggleButton_Create 1501 +#define wxToggleButton_GetValue 1502 +#define wxToggleButton_SetValue 1503 +#define wxToggleButton_destroy 1504 +#define wxCalendarCtrl_new_0 1505 +#define wxCalendarCtrl_new_3 1506 +#define wxCalendarCtrl_Create 1507 +#define wxCalendarCtrl_destruct 1508 +#define wxCalendarCtrl_SetDate 1509 +#define wxCalendarCtrl_GetDate 1510 +#define wxCalendarCtrl_EnableYearChange 1511 +#define wxCalendarCtrl_EnableMonthChange 1512 +#define wxCalendarCtrl_EnableHolidayDisplay 1513 +#define wxCalendarCtrl_SetHeaderColours 1514 +#define wxCalendarCtrl_GetHeaderColourFg 1515 +#define wxCalendarCtrl_GetHeaderColourBg 1516 +#define wxCalendarCtrl_SetHighlightColours 1517 +#define wxCalendarCtrl_GetHighlightColourFg 1518 +#define wxCalendarCtrl_GetHighlightColourBg 1519 +#define wxCalendarCtrl_SetHolidayColours 1520 +#define wxCalendarCtrl_GetHolidayColourFg 1521 +#define wxCalendarCtrl_GetHolidayColourBg 1522 +#define wxCalendarCtrl_GetAttr 1523 +#define wxCalendarCtrl_SetAttr 1524 +#define wxCalendarCtrl_SetHoliday 1525 +#define wxCalendarCtrl_ResetAttr 1526 +#define wxCalendarCtrl_HitTest 1527 +#define wxCalendarDateAttr_new_0 1528 +#define wxCalendarDateAttr_new_2_1 1529 +#define wxCalendarDateAttr_new_2_0 1530 +#define wxCalendarDateAttr_SetTextColour 1531 +#define wxCalendarDateAttr_SetBackgroundColour 1532 +#define wxCalendarDateAttr_SetBorderColour 1533 +#define wxCalendarDateAttr_SetFont 1534 +#define wxCalendarDateAttr_SetBorder 1535 +#define wxCalendarDateAttr_SetHoliday 1536 +#define wxCalendarDateAttr_HasTextColour 1537 +#define wxCalendarDateAttr_HasBackgroundColour 1538 +#define wxCalendarDateAttr_HasBorderColour 1539 +#define wxCalendarDateAttr_HasFont 1540 +#define wxCalendarDateAttr_HasBorder 1541 +#define wxCalendarDateAttr_IsHoliday 1542 +#define wxCalendarDateAttr_GetTextColour 1543 +#define wxCalendarDateAttr_GetBackgroundColour 1544 +#define wxCalendarDateAttr_GetBorderColour 1545 +#define wxCalendarDateAttr_GetFont 1546 +#define wxCalendarDateAttr_GetBorder 1547 +#define wxCalendarDateAttr_destroy 1548 +#define wxCheckBox_new_4 1550 +#define wxCheckBox_new_0 1551 +#define wxCheckBox_Create 1552 +#define wxCheckBox_GetValue 1553 +#define wxCheckBox_Get3StateValue 1554 +#define wxCheckBox_Is3rdStateAllowedForUser 1555 +#define wxCheckBox_Is3State 1556 +#define wxCheckBox_IsChecked 1557 +#define wxCheckBox_SetValue 1558 +#define wxCheckBox_Set3StateValue 1559 +#define wxCheckBox_destroy 1560 +#define wxCheckListBox_new_0 1561 +#define wxCheckListBox_new_3 1563 +#define wxCheckListBox_Check 1564 +#define wxCheckListBox_IsChecked 1565 +#define wxCheckListBox_destroy 1566 +#define wxChoice_new_3 1569 +#define wxChoice_new_0 1570 +#define wxChoice_destruct 1572 +#define wxChoice_Create 1574 +#define wxChoice_Delete 1575 +#define wxChoice_GetColumns 1576 +#define wxChoice_SetColumns 1577 +#define wxComboBox_new_0 1578 +#define wxComboBox_new_3 1580 +#define wxComboBox_destruct 1581 +#define wxComboBox_Create 1583 +#define wxComboBox_CanCopy 1584 +#define wxComboBox_CanCut 1585 +#define wxComboBox_CanPaste 1586 +#define wxComboBox_CanRedo 1587 +#define wxComboBox_CanUndo 1588 +#define wxComboBox_Copy 1589 +#define wxComboBox_Cut 1590 +#define wxComboBox_GetInsertionPoint 1591 +#define wxComboBox_GetLastPosition 1592 +#define wxComboBox_GetValue 1593 +#define wxComboBox_Paste 1594 +#define wxComboBox_Redo 1595 +#define wxComboBox_Replace 1596 +#define wxComboBox_Remove 1597 +#define wxComboBox_SetInsertionPoint 1598 +#define wxComboBox_SetInsertionPointEnd 1599 +#define wxComboBox_SetSelection_1 1600 +#define wxComboBox_SetSelection_2 1601 +#define wxComboBox_SetValue 1602 +#define wxComboBox_Undo 1603 +#define wxGauge_new_0 1604 +#define wxGauge_new_4 1605 +#define wxGauge_Create 1606 +#define wxGauge_GetRange 1607 +#define wxGauge_GetValue 1608 +#define wxGauge_IsVertical 1609 +#define wxGauge_SetRange 1610 +#define wxGauge_SetValue 1611 +#define wxGauge_Pulse 1612 +#define wxGauge_destroy 1613 +#define wxGenericDirCtrl_new_0 1614 +#define wxGenericDirCtrl_new_2 1615 +#define wxGenericDirCtrl_destruct 1616 +#define wxGenericDirCtrl_Create 1617 +#define wxGenericDirCtrl_Init 1618 +#define wxGenericDirCtrl_CollapseTree 1619 +#define wxGenericDirCtrl_ExpandPath 1620 +#define wxGenericDirCtrl_GetDefaultPath 1621 +#define wxGenericDirCtrl_GetPath 1622 +#define wxGenericDirCtrl_GetFilePath 1623 +#define wxGenericDirCtrl_GetFilter 1624 +#define wxGenericDirCtrl_GetFilterIndex 1625 +#define wxGenericDirCtrl_GetRootId 1626 +#define wxGenericDirCtrl_GetTreeCtrl 1627 +#define wxGenericDirCtrl_ReCreateTree 1628 +#define wxGenericDirCtrl_SetDefaultPath 1629 +#define wxGenericDirCtrl_SetFilter 1630 +#define wxGenericDirCtrl_SetFilterIndex 1631 +#define wxGenericDirCtrl_SetPath 1632 +#define wxStaticBox_new_4 1634 +#define wxStaticBox_new_0 1635 +#define wxStaticBox_Create 1636 +#define wxStaticBox_destroy 1637 +#define wxStaticLine_new_2 1639 +#define wxStaticLine_new_0 1640 +#define wxStaticLine_Create 1641 +#define wxStaticLine_IsVertical 1642 +#define wxStaticLine_GetDefaultSize 1643 +#define wxStaticLine_destroy 1644 +#define wxListBox_new_3 1647 +#define wxListBox_new_0 1648 +#define wxListBox_destruct 1650 +#define wxListBox_Create 1652 +#define wxListBox_Deselect 1653 +#define wxListBox_GetSelections 1654 +#define wxListBox_InsertItems 1655 +#define wxListBox_IsSelected 1656 +#define wxListBox_Set 1657 +#define wxListBox_HitTest 1658 +#define wxListBox_SetFirstItem_1_0 1659 +#define wxListBox_SetFirstItem_1_1 1660 +#define wxListCtrl_new_0 1661 +#define wxListCtrl_new_2 1662 +#define wxListCtrl_Arrange 1663 +#define wxListCtrl_AssignImageList 1664 +#define wxListCtrl_ClearAll 1665 +#define wxListCtrl_Create 1666 +#define wxListCtrl_DeleteAllItems 1667 +#define wxListCtrl_DeleteColumn 1668 +#define wxListCtrl_DeleteItem 1669 +#define wxListCtrl_EditLabel 1670 +#define wxListCtrl_EnsureVisible 1671 +#define wxListCtrl_FindItem_3_0 1672 +#define wxListCtrl_FindItem_3_1 1673 +#define wxListCtrl_GetColumn 1674 +#define wxListCtrl_GetColumnCount 1675 +#define wxListCtrl_GetColumnWidth 1676 +#define wxListCtrl_GetCountPerPage 1677 +#define wxListCtrl_GetEditControl 1678 +#define wxListCtrl_GetImageList 1679 +#define wxListCtrl_GetItem 1680 +#define wxListCtrl_GetItemBackgroundColour 1681 +#define wxListCtrl_GetItemCount 1682 +#define wxListCtrl_GetItemData 1683 +#define wxListCtrl_GetItemFont 1684 +#define wxListCtrl_GetItemPosition 1685 +#define wxListCtrl_GetItemRect 1686 +#define wxListCtrl_GetItemSpacing 1687 +#define wxListCtrl_GetItemState 1688 +#define wxListCtrl_GetItemText 1689 +#define wxListCtrl_GetItemTextColour 1690 +#define wxListCtrl_GetNextItem 1691 +#define wxListCtrl_GetSelectedItemCount 1692 +#define wxListCtrl_GetTextColour 1693 +#define wxListCtrl_GetTopItem 1694 +#define wxListCtrl_GetViewRect 1695 +#define wxListCtrl_HitTest 1696 +#define wxListCtrl_InsertColumn_2 1697 +#define wxListCtrl_InsertColumn_3 1698 +#define wxListCtrl_InsertItem_1 1699 +#define wxListCtrl_InsertItem_2_1 1700 +#define wxListCtrl_InsertItem_2_0 1701 +#define wxListCtrl_InsertItem_3 1702 +#define wxListCtrl_RefreshItem 1703 +#define wxListCtrl_RefreshItems 1704 +#define wxListCtrl_ScrollList 1705 +#define wxListCtrl_SetBackgroundColour 1706 +#define wxListCtrl_SetColumn 1707 +#define wxListCtrl_SetColumnWidth 1708 +#define wxListCtrl_SetImageList 1709 +#define wxListCtrl_SetItem_1 1710 +#define wxListCtrl_SetItem_4 1711 +#define wxListCtrl_SetItemBackgroundColour 1712 +#define wxListCtrl_SetItemCount 1713 +#define wxListCtrl_SetItemData 1714 +#define wxListCtrl_SetItemFont 1715 +#define wxListCtrl_SetItemImage 1716 +#define wxListCtrl_SetItemColumnImage 1717 +#define wxListCtrl_SetItemPosition 1718 +#define wxListCtrl_SetItemState 1719 +#define wxListCtrl_SetItemText 1720 +#define wxListCtrl_SetItemTextColour 1721 +#define wxListCtrl_SetSingleStyle 1722 +#define wxListCtrl_SetTextColour 1723 +#define wxListCtrl_SetWindowStyleFlag 1724 +#define wxListCtrl_SortItems 1725 +#define wxListCtrl_destroy 1726 +#define wxListView_ClearColumnImage 1727 +#define wxListView_Focus 1728 +#define wxListView_GetFirstSelected 1729 +#define wxListView_GetFocusedItem 1730 +#define wxListView_GetNextSelected 1731 +#define wxListView_IsSelected 1732 +#define wxListView_Select 1733 +#define wxListView_SetColumnImage 1734 +#define wxListItem_new_0 1735 +#define wxListItem_new_1 1736 +#define wxListItem_destruct 1737 +#define wxListItem_Clear 1738 +#define wxListItem_GetAlign 1739 +#define wxListItem_GetBackgroundColour 1740 +#define wxListItem_GetColumn 1741 +#define wxListItem_GetFont 1742 +#define wxListItem_GetId 1743 +#define wxListItem_GetImage 1744 +#define wxListItem_GetMask 1745 +#define wxListItem_GetState 1746 +#define wxListItem_GetText 1747 +#define wxListItem_GetTextColour 1748 +#define wxListItem_GetWidth 1749 +#define wxListItem_SetAlign 1750 +#define wxListItem_SetBackgroundColour 1751 +#define wxListItem_SetColumn 1752 +#define wxListItem_SetFont 1753 +#define wxListItem_SetId 1754 +#define wxListItem_SetImage 1755 +#define wxListItem_SetMask 1756 +#define wxListItem_SetState 1757 +#define wxListItem_SetStateMask 1758 +#define wxListItem_SetText 1759 +#define wxListItem_SetTextColour 1760 +#define wxListItem_SetWidth 1761 +#define wxListItemAttr_new_0 1762 +#define wxListItemAttr_new_3 1763 +#define wxListItemAttr_GetBackgroundColour 1764 +#define wxListItemAttr_GetFont 1765 +#define wxListItemAttr_GetTextColour 1766 +#define wxListItemAttr_HasBackgroundColour 1767 +#define wxListItemAttr_HasFont 1768 +#define wxListItemAttr_HasTextColour 1769 +#define wxListItemAttr_SetBackgroundColour 1770 +#define wxListItemAttr_SetFont 1771 +#define wxListItemAttr_SetTextColour 1772 +#define wxListItemAttr_destroy 1773 +#define wxImageList_new_0 1774 +#define wxImageList_new_3 1775 +#define wxImageList_Add_1 1776 +#define wxImageList_Add_2_0 1777 +#define wxImageList_Add_2_1 1778 +#define wxImageList_Create 1779 +#define wxImageList_Draw 1781 +#define wxImageList_GetBitmap 1782 +#define wxImageList_GetIcon 1783 +#define wxImageList_GetImageCount 1784 +#define wxImageList_GetSize 1785 +#define wxImageList_Remove 1786 +#define wxImageList_RemoveAll 1787 +#define wxImageList_Replace_2 1788 +#define wxImageList_Replace_3 1789 +#define wxImageList_destroy 1790 +#define wxTextAttr_new_0 1791 +#define wxTextAttr_new_2 1792 +#define wxTextAttr_GetAlignment 1793 +#define wxTextAttr_GetBackgroundColour 1794 +#define wxTextAttr_GetFont 1795 +#define wxTextAttr_GetLeftIndent 1796 +#define wxTextAttr_GetLeftSubIndent 1797 +#define wxTextAttr_GetRightIndent 1798 +#define wxTextAttr_GetTabs 1799 +#define wxTextAttr_GetTextColour 1800 +#define wxTextAttr_HasBackgroundColour 1801 +#define wxTextAttr_HasFont 1802 +#define wxTextAttr_HasTextColour 1803 +#define wxTextAttr_GetFlags 1804 +#define wxTextAttr_IsDefault 1805 +#define wxTextAttr_SetAlignment 1806 +#define wxTextAttr_SetBackgroundColour 1807 +#define wxTextAttr_SetFlags 1808 +#define wxTextAttr_SetFont 1809 +#define wxTextAttr_SetLeftIndent 1810 +#define wxTextAttr_SetRightIndent 1811 +#define wxTextAttr_SetTabs 1812 +#define wxTextAttr_SetTextColour 1813 +#define wxTextAttr_destroy 1814 +#define wxTextCtrl_new_3 1816 +#define wxTextCtrl_new_0 1817 +#define wxTextCtrl_destruct 1819 +#define wxTextCtrl_AppendText 1820 +#define wxTextCtrl_CanCopy 1821 +#define wxTextCtrl_CanCut 1822 +#define wxTextCtrl_CanPaste 1823 +#define wxTextCtrl_CanRedo 1824 +#define wxTextCtrl_CanUndo 1825 +#define wxTextCtrl_Clear 1826 +#define wxTextCtrl_Copy 1827 +#define wxTextCtrl_Create 1828 +#define wxTextCtrl_Cut 1829 +#define wxTextCtrl_DiscardEdits 1830 +#define wxTextCtrl_ChangeValue 1831 +#define wxTextCtrl_EmulateKeyPress 1832 +#define wxTextCtrl_GetDefaultStyle 1833 +#define wxTextCtrl_GetInsertionPoint 1834 +#define wxTextCtrl_GetLastPosition 1835 +#define wxTextCtrl_GetLineLength 1836 +#define wxTextCtrl_GetLineText 1837 +#define wxTextCtrl_GetNumberOfLines 1838 +#define wxTextCtrl_GetRange 1839 +#define wxTextCtrl_GetSelection 1840 +#define wxTextCtrl_GetStringSelection 1841 +#define wxTextCtrl_GetStyle 1842 +#define wxTextCtrl_GetValue 1843 +#define wxTextCtrl_IsEditable 1844 +#define wxTextCtrl_IsModified 1845 +#define wxTextCtrl_IsMultiLine 1846 +#define wxTextCtrl_IsSingleLine 1847 +#define wxTextCtrl_LoadFile 1848 +#define wxTextCtrl_MarkDirty 1849 +#define wxTextCtrl_Paste 1850 +#define wxTextCtrl_PositionToXY 1851 +#define wxTextCtrl_Redo 1852 +#define wxTextCtrl_Remove 1853 +#define wxTextCtrl_Replace 1854 +#define wxTextCtrl_SaveFile 1855 +#define wxTextCtrl_SetDefaultStyle 1856 +#define wxTextCtrl_SetEditable 1857 +#define wxTextCtrl_SetInsertionPoint 1858 +#define wxTextCtrl_SetInsertionPointEnd 1859 +#define wxTextCtrl_SetMaxLength 1861 +#define wxTextCtrl_SetSelection 1862 +#define wxTextCtrl_SetStyle 1863 +#define wxTextCtrl_SetValue 1864 +#define wxTextCtrl_ShowPosition 1865 +#define wxTextCtrl_Undo 1866 +#define wxTextCtrl_WriteText 1867 +#define wxTextCtrl_XYToPosition 1868 +#define wxNotebook_new_0 1871 +#define wxNotebook_new_3 1872 +#define wxNotebook_destruct 1873 +#define wxNotebook_AddPage 1874 +#define wxNotebook_AdvanceSelection 1875 +#define wxNotebook_AssignImageList 1876 +#define wxNotebook_Create 1877 +#define wxNotebook_DeleteAllPages 1878 +#define wxNotebook_DeletePage 1879 +#define wxNotebook_RemovePage 1880 +#define wxNotebook_GetCurrentPage 1881 +#define wxNotebook_GetImageList 1882 +#define wxNotebook_GetPage 1884 +#define wxNotebook_GetPageCount 1885 +#define wxNotebook_GetPageImage 1886 +#define wxNotebook_GetPageText 1887 +#define wxNotebook_GetRowCount 1888 +#define wxNotebook_GetSelection 1889 +#define wxNotebook_GetThemeBackgroundColour 1890 +#define wxNotebook_HitTest 1892 +#define wxNotebook_InsertPage 1894 +#define wxNotebook_SetImageList 1895 +#define wxNotebook_SetPadding 1896 +#define wxNotebook_SetPageSize 1897 +#define wxNotebook_SetPageImage 1898 +#define wxNotebook_SetPageText 1899 +#define wxNotebook_SetSelection 1900 +#define wxNotebook_ChangeSelection 1901 +#define wxChoicebook_new_0 1902 +#define wxChoicebook_new_3 1903 +#define wxChoicebook_AddPage 1904 +#define wxChoicebook_AdvanceSelection 1905 +#define wxChoicebook_AssignImageList 1906 +#define wxChoicebook_Create 1907 +#define wxChoicebook_DeleteAllPages 1908 +#define wxChoicebook_DeletePage 1909 +#define wxChoicebook_RemovePage 1910 +#define wxChoicebook_GetCurrentPage 1911 +#define wxChoicebook_GetImageList 1912 +#define wxChoicebook_GetPage 1914 +#define wxChoicebook_GetPageCount 1915 +#define wxChoicebook_GetPageImage 1916 +#define wxChoicebook_GetPageText 1917 +#define wxChoicebook_GetSelection 1918 +#define wxChoicebook_HitTest 1919 +#define wxChoicebook_InsertPage 1920 +#define wxChoicebook_SetImageList 1921 +#define wxChoicebook_SetPageSize 1922 +#define wxChoicebook_SetPageImage 1923 +#define wxChoicebook_SetPageText 1924 +#define wxChoicebook_SetSelection 1925 +#define wxChoicebook_ChangeSelection 1926 +#define wxChoicebook_destroy 1927 +#define wxToolbook_new_0 1928 +#define wxToolbook_new_3 1929 +#define wxToolbook_AddPage 1930 +#define wxToolbook_AdvanceSelection 1931 +#define wxToolbook_AssignImageList 1932 +#define wxToolbook_Create 1933 +#define wxToolbook_DeleteAllPages 1934 +#define wxToolbook_DeletePage 1935 +#define wxToolbook_RemovePage 1936 +#define wxToolbook_GetCurrentPage 1937 +#define wxToolbook_GetImageList 1938 +#define wxToolbook_GetPage 1940 +#define wxToolbook_GetPageCount 1941 +#define wxToolbook_GetPageImage 1942 +#define wxToolbook_GetPageText 1943 +#define wxToolbook_GetSelection 1944 +#define wxToolbook_HitTest 1946 +#define wxToolbook_InsertPage 1947 +#define wxToolbook_SetImageList 1948 +#define wxToolbook_SetPageSize 1949 +#define wxToolbook_SetPageImage 1950 +#define wxToolbook_SetPageText 1951 +#define wxToolbook_SetSelection 1952 +#define wxToolbook_ChangeSelection 1953 +#define wxToolbook_destroy 1954 +#define wxListbook_new_0 1955 +#define wxListbook_new_3 1956 +#define wxListbook_AddPage 1957 +#define wxListbook_AdvanceSelection 1958 +#define wxListbook_AssignImageList 1959 +#define wxListbook_Create 1960 +#define wxListbook_DeleteAllPages 1961 +#define wxListbook_DeletePage 1962 +#define wxListbook_RemovePage 1963 +#define wxListbook_GetCurrentPage 1964 +#define wxListbook_GetImageList 1965 +#define wxListbook_GetPage 1967 +#define wxListbook_GetPageCount 1968 +#define wxListbook_GetPageImage 1969 +#define wxListbook_GetPageText 1970 +#define wxListbook_GetSelection 1971 +#define wxListbook_HitTest 1973 +#define wxListbook_InsertPage 1974 +#define wxListbook_SetImageList 1975 +#define wxListbook_SetPageSize 1976 +#define wxListbook_SetPageImage 1977 +#define wxListbook_SetPageText 1978 +#define wxListbook_SetSelection 1979 +#define wxListbook_ChangeSelection 1980 +#define wxListbook_destroy 1981 +#define wxTreebook_new_0 1982 +#define wxTreebook_new_3 1983 +#define wxTreebook_AddPage 1984 +#define wxTreebook_AdvanceSelection 1985 +#define wxTreebook_AssignImageList 1986 +#define wxTreebook_Create 1987 +#define wxTreebook_DeleteAllPages 1988 +#define wxTreebook_DeletePage 1989 +#define wxTreebook_RemovePage 1990 +#define wxTreebook_GetCurrentPage 1991 +#define wxTreebook_GetImageList 1992 +#define wxTreebook_GetPage 1994 +#define wxTreebook_GetPageCount 1995 +#define wxTreebook_GetPageImage 1996 +#define wxTreebook_GetPageText 1997 +#define wxTreebook_GetSelection 1998 +#define wxTreebook_ExpandNode 1999 +#define wxTreebook_IsNodeExpanded 2000 +#define wxTreebook_HitTest 2002 +#define wxTreebook_InsertPage 2003 +#define wxTreebook_InsertSubPage 2004 +#define wxTreebook_SetImageList 2005 +#define wxTreebook_SetPageSize 2006 +#define wxTreebook_SetPageImage 2007 +#define wxTreebook_SetPageText 2008 +#define wxTreebook_SetSelection 2009 +#define wxTreebook_ChangeSelection 2010 +#define wxTreebook_destroy 2011 +#define wxTreeCtrl_new_2 2014 +#define wxTreeCtrl_new_0 2015 +#define wxTreeCtrl_destruct 2017 +#define wxTreeCtrl_AddRoot 2018 +#define wxTreeCtrl_AppendItem 2019 +#define wxTreeCtrl_AssignImageList 2020 +#define wxTreeCtrl_AssignStateImageList 2021 +#define wxTreeCtrl_Collapse 2022 +#define wxTreeCtrl_CollapseAndReset 2023 +#define wxTreeCtrl_Create 2024 +#define wxTreeCtrl_Delete 2025 +#define wxTreeCtrl_DeleteAllItems 2026 +#define wxTreeCtrl_DeleteChildren 2027 +#define wxTreeCtrl_EditLabel 2028 +#define wxTreeCtrl_EnsureVisible 2029 +#define wxTreeCtrl_Expand 2030 +#define wxTreeCtrl_GetBoundingRect 2031 +#define wxTreeCtrl_GetChildrenCount 2033 +#define wxTreeCtrl_GetCount 2034 +#define wxTreeCtrl_GetEditControl 2035 +#define wxTreeCtrl_GetFirstChild 2036 +#define wxTreeCtrl_GetNextChild 2037 +#define wxTreeCtrl_GetFirstVisibleItem 2038 +#define wxTreeCtrl_GetImageList 2039 +#define wxTreeCtrl_GetIndent 2040 +#define wxTreeCtrl_GetItemBackgroundColour 2041 +#define wxTreeCtrl_GetItemData 2042 +#define wxTreeCtrl_GetItemFont 2043 +#define wxTreeCtrl_GetItemImage_1 2044 +#define wxTreeCtrl_GetItemImage_2 2045 +#define wxTreeCtrl_GetItemText 2046 +#define wxTreeCtrl_GetItemTextColour 2047 +#define wxTreeCtrl_GetLastChild 2048 +#define wxTreeCtrl_GetNextSibling 2049 +#define wxTreeCtrl_GetNextVisible 2050 +#define wxTreeCtrl_GetItemParent 2051 +#define wxTreeCtrl_GetPrevSibling 2052 +#define wxTreeCtrl_GetPrevVisible 2053 +#define wxTreeCtrl_GetRootItem 2054 +#define wxTreeCtrl_GetSelection 2055 +#define wxTreeCtrl_GetSelections 2056 +#define wxTreeCtrl_GetStateImageList 2057 +#define wxTreeCtrl_HitTest 2058 +#define wxTreeCtrl_InsertItem 2060 +#define wxTreeCtrl_IsBold 2061 +#define wxTreeCtrl_IsExpanded 2062 +#define wxTreeCtrl_IsSelected 2063 +#define wxTreeCtrl_IsVisible 2064 +#define wxTreeCtrl_ItemHasChildren 2065 +#define wxTreeCtrl_IsTreeItemIdOk 2066 +#define wxTreeCtrl_PrependItem 2067 +#define wxTreeCtrl_ScrollTo 2068 +#define wxTreeCtrl_SelectItem_1 2069 +#define wxTreeCtrl_SelectItem_2 2070 +#define wxTreeCtrl_SetIndent 2071 +#define wxTreeCtrl_SetImageList 2072 +#define wxTreeCtrl_SetItemBackgroundColour 2073 +#define wxTreeCtrl_SetItemBold 2074 +#define wxTreeCtrl_SetItemData 2075 +#define wxTreeCtrl_SetItemDropHighlight 2076 +#define wxTreeCtrl_SetItemFont 2077 +#define wxTreeCtrl_SetItemHasChildren 2078 +#define wxTreeCtrl_SetItemImage_2 2079 +#define wxTreeCtrl_SetItemImage_3 2080 +#define wxTreeCtrl_SetItemText 2081 +#define wxTreeCtrl_SetItemTextColour 2082 +#define wxTreeCtrl_SetStateImageList 2083 +#define wxTreeCtrl_SetWindowStyle 2084 +#define wxTreeCtrl_SortChildren 2085 +#define wxTreeCtrl_Toggle 2086 +#define wxTreeCtrl_ToggleItemSelection 2087 +#define wxTreeCtrl_Unselect 2088 +#define wxTreeCtrl_UnselectAll 2089 +#define wxTreeCtrl_UnselectItem 2090 +#define wxScrollBar_new_0 2091 +#define wxScrollBar_new_3 2092 +#define wxScrollBar_destruct 2093 +#define wxScrollBar_Create 2094 +#define wxScrollBar_GetRange 2095 +#define wxScrollBar_GetPageSize 2096 +#define wxScrollBar_GetThumbPosition 2097 +#define wxScrollBar_GetThumbSize 2098 +#define wxScrollBar_SetThumbPosition 2099 +#define wxScrollBar_SetScrollbar 2100 +#define wxSpinButton_new_2 2102 +#define wxSpinButton_new_0 2103 +#define wxSpinButton_Create 2104 +#define wxSpinButton_GetMax 2105 +#define wxSpinButton_GetMin 2106 +#define wxSpinButton_GetValue 2107 +#define wxSpinButton_SetRange 2108 +#define wxSpinButton_SetValue 2109 +#define wxSpinButton_destroy 2110 +#define wxSpinCtrl_new_0 2111 +#define wxSpinCtrl_new_2 2112 +#define wxSpinCtrl_Create 2114 +#define wxSpinCtrl_SetValue_1_1 2117 +#define wxSpinCtrl_SetValue_1_0 2118 +#define wxSpinCtrl_GetValue 2120 +#define wxSpinCtrl_SetRange 2122 +#define wxSpinCtrl_SetSelection 2123 +#define wxSpinCtrl_GetMin 2125 +#define wxSpinCtrl_GetMax 2127 +#define wxSpinCtrl_destroy 2128 +#define wxStaticText_new_0 2129 +#define wxStaticText_new_4 2130 +#define wxStaticText_Create 2131 +#define wxStaticText_GetLabel 2132 +#define wxStaticText_SetLabel 2133 +#define wxStaticText_Wrap 2134 +#define wxStaticText_destroy 2135 +#define wxStaticBitmap_new_0 2136 +#define wxStaticBitmap_new_4 2137 +#define wxStaticBitmap_Create 2138 +#define wxStaticBitmap_GetBitmap 2139 +#define wxStaticBitmap_SetBitmap 2140 +#define wxStaticBitmap_destroy 2141 +#define wxRadioBox_new 2142 +#define wxRadioBox_destruct 2144 +#define wxRadioBox_Create 2145 +#define wxRadioBox_Enable_2 2146 +#define wxRadioBox_Enable_1 2147 +#define wxRadioBox_GetSelection 2148 +#define wxRadioBox_GetString 2149 +#define wxRadioBox_SetSelection 2150 +#define wxRadioBox_Show_2 2151 +#define wxRadioBox_Show_1 2152 +#define wxRadioBox_GetColumnCount 2153 +#define wxRadioBox_GetItemHelpText 2154 +#define wxRadioBox_GetItemToolTip 2155 +#define wxRadioBox_GetItemFromPoint 2157 +#define wxRadioBox_GetRowCount 2158 +#define wxRadioBox_IsItemEnabled 2159 +#define wxRadioBox_IsItemShown 2160 +#define wxRadioBox_SetItemHelpText 2161 +#define wxRadioBox_SetItemToolTip 2162 +#define wxRadioButton_new_0 2163 +#define wxRadioButton_new_4 2164 +#define wxRadioButton_Create 2165 +#define wxRadioButton_GetValue 2166 +#define wxRadioButton_SetValue 2167 +#define wxRadioButton_destroy 2168 +#define wxSlider_new_6 2170 +#define wxSlider_new_0 2171 +#define wxSlider_Create 2172 +#define wxSlider_GetLineSize 2173 +#define wxSlider_GetMax 2174 +#define wxSlider_GetMin 2175 +#define wxSlider_GetPageSize 2176 +#define wxSlider_GetThumbLength 2177 +#define wxSlider_GetValue 2178 +#define wxSlider_SetLineSize 2179 +#define wxSlider_SetPageSize 2180 +#define wxSlider_SetRange 2181 +#define wxSlider_SetThumbLength 2182 +#define wxSlider_SetValue 2183 +#define wxSlider_destroy 2184 +#define wxDialog_new_4 2186 +#define wxDialog_new_0 2187 +#define wxDialog_destruct 2189 +#define wxDialog_Create 2190 +#define wxDialog_CreateButtonSizer 2191 +#define wxDialog_CreateStdDialogButtonSizer 2192 +#define wxDialog_EndModal 2193 +#define wxDialog_GetAffirmativeId 2194 +#define wxDialog_GetReturnCode 2195 +#define wxDialog_IsModal 2196 +#define wxDialog_SetAffirmativeId 2197 +#define wxDialog_SetReturnCode 2198 +#define wxDialog_Show 2199 +#define wxDialog_ShowModal 2200 +#define wxColourDialog_new_0 2201 +#define wxColourDialog_new_2 2202 +#define wxColourDialog_destruct 2203 +#define wxColourDialog_Create 2204 +#define wxColourDialog_GetColourData 2205 +#define wxColourData_new_0 2206 +#define wxColourData_new_1 2207 +#define wxColourData_destruct 2208 +#define wxColourData_GetChooseFull 2209 +#define wxColourData_GetColour 2210 +#define wxColourData_GetCustomColour 2212 +#define wxColourData_SetChooseFull 2213 +#define wxColourData_SetColour 2214 +#define wxColourData_SetCustomColour 2215 +#define wxPalette_new_0 2216 +#define wxPalette_new_4 2217 +#define wxPalette_destruct 2219 +#define wxPalette_Create 2220 +#define wxPalette_GetColoursCount 2221 +#define wxPalette_GetPixel 2222 +#define wxPalette_GetRGB 2223 +#define wxPalette_IsOk 2224 +#define wxDirDialog_new 2228 +#define wxDirDialog_destruct 2229 +#define wxDirDialog_GetPath 2230 +#define wxDirDialog_GetMessage 2231 +#define wxDirDialog_SetMessage 2232 +#define wxDirDialog_SetPath 2233 +#define wxFileDialog_new 2237 +#define wxFileDialog_destruct 2238 +#define wxFileDialog_GetDirectory 2239 +#define wxFileDialog_GetFilename 2240 +#define wxFileDialog_GetFilenames 2241 +#define wxFileDialog_GetFilterIndex 2242 +#define wxFileDialog_GetMessage 2243 +#define wxFileDialog_GetPath 2244 +#define wxFileDialog_GetPaths 2245 +#define wxFileDialog_GetWildcard 2246 +#define wxFileDialog_SetDirectory 2247 +#define wxFileDialog_SetFilename 2248 +#define wxFileDialog_SetFilterIndex 2249 +#define wxFileDialog_SetMessage 2250 +#define wxFileDialog_SetPath 2251 +#define wxFileDialog_SetWildcard 2252 +#define wxPickerBase_SetInternalMargin 2253 +#define wxPickerBase_GetInternalMargin 2254 +#define wxPickerBase_SetTextCtrlProportion 2255 +#define wxPickerBase_SetPickerCtrlProportion 2256 +#define wxPickerBase_GetTextCtrlProportion 2257 +#define wxPickerBase_GetPickerCtrlProportion 2258 +#define wxPickerBase_HasTextCtrl 2259 +#define wxPickerBase_GetTextCtrl 2260 +#define wxPickerBase_IsTextCtrlGrowable 2261 +#define wxPickerBase_SetPickerCtrlGrowable 2262 +#define wxPickerBase_SetTextCtrlGrowable 2263 +#define wxPickerBase_IsPickerCtrlGrowable 2264 +#define wxFilePickerCtrl_new_0 2265 +#define wxFilePickerCtrl_new_3 2266 +#define wxFilePickerCtrl_Create 2267 +#define wxFilePickerCtrl_GetPath 2268 +#define wxFilePickerCtrl_SetPath 2269 +#define wxFilePickerCtrl_destroy 2270 +#define wxDirPickerCtrl_new_0 2271 +#define wxDirPickerCtrl_new_3 2272 +#define wxDirPickerCtrl_Create 2273 +#define wxDirPickerCtrl_GetPath 2274 +#define wxDirPickerCtrl_SetPath 2275 +#define wxDirPickerCtrl_destroy 2276 +#define wxColourPickerCtrl_new_0 2277 +#define wxColourPickerCtrl_new_3 2278 +#define wxColourPickerCtrl_Create 2279 +#define wxColourPickerCtrl_GetColour 2280 +#define wxColourPickerCtrl_SetColour_1_1 2281 +#define wxColourPickerCtrl_SetColour_1_0 2282 +#define wxColourPickerCtrl_destroy 2283 +#define wxDatePickerCtrl_new_0 2284 +#define wxDatePickerCtrl_new_3 2285 +#define wxDatePickerCtrl_GetRange 2286 +#define wxDatePickerCtrl_GetValue 2287 +#define wxDatePickerCtrl_SetRange 2288 +#define wxDatePickerCtrl_SetValue 2289 +#define wxDatePickerCtrl_destroy 2290 +#define wxFontPickerCtrl_new_0 2291 +#define wxFontPickerCtrl_new_3 2292 +#define wxFontPickerCtrl_Create 2293 +#define wxFontPickerCtrl_GetSelectedFont 2294 +#define wxFontPickerCtrl_SetSelectedFont 2295 +#define wxFontPickerCtrl_GetMaxPointSize 2296 +#define wxFontPickerCtrl_SetMaxPointSize 2297 +#define wxFontPickerCtrl_destroy 2298 +#define wxFindReplaceDialog_new_0 2301 +#define wxFindReplaceDialog_new_4 2302 +#define wxFindReplaceDialog_destruct 2303 +#define wxFindReplaceDialog_Create 2304 +#define wxFindReplaceDialog_GetData 2305 +#define wxFindReplaceData_new_0 2306 +#define wxFindReplaceData_new_1 2307 +#define wxFindReplaceData_GetFindString 2308 +#define wxFindReplaceData_GetReplaceString 2309 +#define wxFindReplaceData_GetFlags 2310 +#define wxFindReplaceData_SetFlags 2311 +#define wxFindReplaceData_SetFindString 2312 +#define wxFindReplaceData_SetReplaceString 2313 +#define wxFindReplaceData_destroy 2314 +#define wxMultiChoiceDialog_new_0 2315 +#define wxMultiChoiceDialog_new_5 2317 +#define wxMultiChoiceDialog_GetSelections 2318 +#define wxMultiChoiceDialog_SetSelections 2319 +#define wxMultiChoiceDialog_destroy 2320 +#define wxSingleChoiceDialog_new_0 2321 +#define wxSingleChoiceDialog_new_5 2323 +#define wxSingleChoiceDialog_GetSelection 2324 +#define wxSingleChoiceDialog_GetStringSelection 2325 +#define wxSingleChoiceDialog_SetSelection 2326 +#define wxSingleChoiceDialog_destroy 2327 +#define wxTextEntryDialog_new 2328 +#define wxTextEntryDialog_GetValue 2329 +#define wxTextEntryDialog_SetValue 2330 +#define wxTextEntryDialog_destroy 2331 +#define wxPasswordEntryDialog_new 2332 +#define wxPasswordEntryDialog_destroy 2333 +#define wxFontData_new_0 2334 +#define wxFontData_new_1 2335 +#define wxFontData_destruct 2336 +#define wxFontData_EnableEffects 2337 +#define wxFontData_GetAllowSymbols 2338 +#define wxFontData_GetColour 2339 +#define wxFontData_GetChosenFont 2340 +#define wxFontData_GetEnableEffects 2341 +#define wxFontData_GetInitialFont 2342 +#define wxFontData_GetShowHelp 2343 +#define wxFontData_SetAllowSymbols 2344 +#define wxFontData_SetChosenFont 2345 +#define wxFontData_SetColour 2346 +#define wxFontData_SetInitialFont 2347 +#define wxFontData_SetRange 2348 +#define wxFontData_SetShowHelp 2349 +#define wxFontDialog_new_0 2353 +#define wxFontDialog_new_2 2355 +#define wxFontDialog_Create 2357 +#define wxFontDialog_GetFontData 2358 +#define wxFontDialog_destroy 2360 +#define wxProgressDialog_new 2361 +#define wxProgressDialog_destruct 2362 +#define wxProgressDialog_Resume 2363 +#define wxProgressDialog_Update_2 2364 +#define wxProgressDialog_Update_0 2365 +#define wxMessageDialog_new 2366 +#define wxMessageDialog_destruct 2367 +#define wxPageSetupDialog_new 2368 +#define wxPageSetupDialog_destruct 2369 +#define wxPageSetupDialog_GetPageSetupData 2370 +#define wxPageSetupDialog_ShowModal 2371 +#define wxPageSetupDialogData_new_0 2372 +#define wxPageSetupDialogData_new_1_0 2373 +#define wxPageSetupDialogData_new_1_1 2374 +#define wxPageSetupDialogData_destruct 2375 +#define wxPageSetupDialogData_EnableHelp 2376 +#define wxPageSetupDialogData_EnableMargins 2377 +#define wxPageSetupDialogData_EnableOrientation 2378 +#define wxPageSetupDialogData_EnablePaper 2379 +#define wxPageSetupDialogData_EnablePrinter 2380 +#define wxPageSetupDialogData_GetDefaultMinMargins 2381 +#define wxPageSetupDialogData_GetEnableMargins 2382 +#define wxPageSetupDialogData_GetEnableOrientation 2383 +#define wxPageSetupDialogData_GetEnablePaper 2384 +#define wxPageSetupDialogData_GetEnablePrinter 2385 +#define wxPageSetupDialogData_GetEnableHelp 2386 +#define wxPageSetupDialogData_GetDefaultInfo 2387 +#define wxPageSetupDialogData_GetMarginTopLeft 2388 +#define wxPageSetupDialogData_GetMarginBottomRight 2389 +#define wxPageSetupDialogData_GetMinMarginTopLeft 2390 +#define wxPageSetupDialogData_GetMinMarginBottomRight 2391 +#define wxPageSetupDialogData_GetPaperId 2392 +#define wxPageSetupDialogData_GetPaperSize 2393 +#define wxPageSetupDialogData_GetPrintData 2395 +#define wxPageSetupDialogData_IsOk 2396 +#define wxPageSetupDialogData_SetDefaultInfo 2397 +#define wxPageSetupDialogData_SetDefaultMinMargins 2398 +#define wxPageSetupDialogData_SetMarginTopLeft 2399 +#define wxPageSetupDialogData_SetMarginBottomRight 2400 +#define wxPageSetupDialogData_SetMinMarginTopLeft 2401 +#define wxPageSetupDialogData_SetMinMarginBottomRight 2402 +#define wxPageSetupDialogData_SetPaperId 2403 +#define wxPageSetupDialogData_SetPaperSize_1_1 2404 +#define wxPageSetupDialogData_SetPaperSize_1_0 2405 +#define wxPageSetupDialogData_SetPrintData 2406 +#define wxPrintDialog_new_2_0 2407 +#define wxPrintDialog_new_2_1 2408 +#define wxPrintDialog_destruct 2409 +#define wxPrintDialog_GetPrintDialogData 2410 +#define wxPrintDialog_GetPrintDC 2411 +#define wxPrintDialogData_new_0 2412 +#define wxPrintDialogData_new_1_1 2413 +#define wxPrintDialogData_new_1_0 2414 +#define wxPrintDialogData_destruct 2415 +#define wxPrintDialogData_EnableHelp 2416 +#define wxPrintDialogData_EnablePageNumbers 2417 +#define wxPrintDialogData_EnablePrintToFile 2418 +#define wxPrintDialogData_EnableSelection 2419 +#define wxPrintDialogData_GetAllPages 2420 +#define wxPrintDialogData_GetCollate 2421 +#define wxPrintDialogData_GetFromPage 2422 +#define wxPrintDialogData_GetMaxPage 2423 +#define wxPrintDialogData_GetMinPage 2424 +#define wxPrintDialogData_GetNoCopies 2425 +#define wxPrintDialogData_GetPrintData 2426 +#define wxPrintDialogData_GetPrintToFile 2427 +#define wxPrintDialogData_GetSelection 2428 +#define wxPrintDialogData_GetToPage 2429 +#define wxPrintDialogData_IsOk 2430 +#define wxPrintDialogData_SetCollate 2431 +#define wxPrintDialogData_SetFromPage 2432 +#define wxPrintDialogData_SetMaxPage 2433 +#define wxPrintDialogData_SetMinPage 2434 +#define wxPrintDialogData_SetNoCopies 2435 +#define wxPrintDialogData_SetPrintData 2436 +#define wxPrintDialogData_SetPrintToFile 2437 +#define wxPrintDialogData_SetSelection 2438 +#define wxPrintDialogData_SetToPage 2439 +#define wxPrintData_new_0 2440 +#define wxPrintData_new_1 2441 +#define wxPrintData_destruct 2442 +#define wxPrintData_GetCollate 2443 +#define wxPrintData_GetBin 2444 +#define wxPrintData_GetColour 2445 +#define wxPrintData_GetDuplex 2446 +#define wxPrintData_GetNoCopies 2447 +#define wxPrintData_GetOrientation 2448 +#define wxPrintData_GetPaperId 2449 +#define wxPrintData_GetPrinterName 2450 +#define wxPrintData_GetQuality 2451 +#define wxPrintData_IsOk 2452 +#define wxPrintData_SetBin 2453 +#define wxPrintData_SetCollate 2454 +#define wxPrintData_SetColour 2455 +#define wxPrintData_SetDuplex 2456 +#define wxPrintData_SetNoCopies 2457 +#define wxPrintData_SetOrientation 2458 +#define wxPrintData_SetPaperId 2459 +#define wxPrintData_SetPrinterName 2460 +#define wxPrintData_SetQuality 2461 +#define wxPrintPreview_new_2 2464 +#define wxPrintPreview_new_3 2465 +#define wxPrintPreview_destruct 2467 +#define wxPrintPreview_GetCanvas 2468 +#define wxPrintPreview_GetCurrentPage 2469 +#define wxPrintPreview_GetFrame 2470 +#define wxPrintPreview_GetMaxPage 2471 +#define wxPrintPreview_GetMinPage 2472 +#define wxPrintPreview_GetPrintout 2473 +#define wxPrintPreview_GetPrintoutForPrinting 2474 +#define wxPrintPreview_IsOk 2475 +#define wxPrintPreview_PaintPage 2476 +#define wxPrintPreview_Print 2477 +#define wxPrintPreview_RenderPage 2478 +#define wxPrintPreview_SetCanvas 2479 +#define wxPrintPreview_SetCurrentPage 2480 +#define wxPrintPreview_SetFrame 2481 +#define wxPrintPreview_SetPrintout 2482 +#define wxPrintPreview_SetZoom 2483 +#define wxPreviewFrame_new 2484 +#define wxPreviewFrame_destruct 2485 +#define wxPreviewFrame_CreateControlBar 2486 +#define wxPreviewFrame_CreateCanvas 2487 +#define wxPreviewFrame_Initialize 2488 +#define wxPreviewFrame_OnCloseWindow 2489 +#define wxPreviewControlBar_new 2490 +#define wxPreviewControlBar_destruct 2491 +#define wxPreviewControlBar_CreateButtons 2492 +#define wxPreviewControlBar_GetPrintPreview 2493 +#define wxPreviewControlBar_GetZoomControl 2494 +#define wxPreviewControlBar_SetZoomControl 2495 +#define wxPrinter_new 2497 +#define wxPrinter_CreateAbortWindow 2498 +#define wxPrinter_GetAbort 2499 +#define wxPrinter_GetLastError 2500 +#define wxPrinter_GetPrintDialogData 2501 +#define wxPrinter_Print 2502 +#define wxPrinter_PrintDialog 2503 +#define wxPrinter_ReportError 2504 +#define wxPrinter_Setup 2505 +#define wxPrinter_destroy 2506 +#define wxXmlResource_new_1 2507 +#define wxXmlResource_new_2 2508 +#define wxXmlResource_destruct 2509 +#define wxXmlResource_AttachUnknownControl 2510 +#define wxXmlResource_ClearHandlers 2511 +#define wxXmlResource_CompareVersion 2512 +#define wxXmlResource_Get 2513 +#define wxXmlResource_GetFlags 2514 +#define wxXmlResource_GetVersion 2515 +#define wxXmlResource_GetXRCID 2516 +#define wxXmlResource_InitAllHandlers 2517 +#define wxXmlResource_Load 2518 +#define wxXmlResource_LoadBitmap 2519 +#define wxXmlResource_LoadDialog_2 2520 +#define wxXmlResource_LoadDialog_3 2521 +#define wxXmlResource_LoadFrame_2 2522 +#define wxXmlResource_LoadFrame_3 2523 +#define wxXmlResource_LoadIcon 2524 +#define wxXmlResource_LoadMenu 2525 +#define wxXmlResource_LoadMenuBar_2 2526 +#define wxXmlResource_LoadMenuBar_1 2527 +#define wxXmlResource_LoadPanel_2 2528 +#define wxXmlResource_LoadPanel_3 2529 +#define wxXmlResource_LoadToolBar 2530 +#define wxXmlResource_Set 2531 +#define wxXmlResource_SetFlags 2532 +#define wxXmlResource_Unload 2533 +#define wxXmlResource_xrcctrl 2534 +#define wxHtmlEasyPrinting_new 2535 +#define wxHtmlEasyPrinting_destruct 2536 +#define wxHtmlEasyPrinting_GetPrintData 2537 +#define wxHtmlEasyPrinting_GetPageSetupData 2538 +#define wxHtmlEasyPrinting_PreviewFile 2539 +#define wxHtmlEasyPrinting_PreviewText 2540 +#define wxHtmlEasyPrinting_PrintFile 2541 +#define wxHtmlEasyPrinting_PrintText 2542 +#define wxHtmlEasyPrinting_PageSetup 2543 +#define wxHtmlEasyPrinting_SetFonts 2544 +#define wxHtmlEasyPrinting_SetHeader 2545 +#define wxHtmlEasyPrinting_SetFooter 2546 +#define wxGLCanvas_new_2 2548 +#define wxGLCanvas_new_3_1 2549 +#define wxGLCanvas_new_3_0 2550 +#define wxGLCanvas_GetContext 2551 +#define wxGLCanvas_SetCurrent 2553 +#define wxGLCanvas_SwapBuffers 2554 +#define wxGLCanvas_destroy 2555 +#define wxAuiManager_new 2556 +#define wxAuiManager_destruct 2557 +#define wxAuiManager_AddPane_2_1 2558 +#define wxAuiManager_AddPane_3 2559 +#define wxAuiManager_AddPane_2_0 2560 +#define wxAuiManager_DetachPane 2561 +#define wxAuiManager_GetAllPanes 2562 +#define wxAuiManager_GetArtProvider 2563 +#define wxAuiManager_GetDockSizeConstraint 2564 +#define wxAuiManager_GetFlags 2565 +#define wxAuiManager_GetManagedWindow 2566 +#define wxAuiManager_GetManager 2567 +#define wxAuiManager_GetPane_1_1 2568 +#define wxAuiManager_GetPane_1_0 2569 +#define wxAuiManager_HideHint 2570 +#define wxAuiManager_InsertPane 2571 +#define wxAuiManager_LoadPaneInfo 2572 +#define wxAuiManager_LoadPerspective 2573 +#define wxAuiManager_SavePaneInfo 2574 +#define wxAuiManager_SavePerspective 2575 +#define wxAuiManager_SetArtProvider 2576 +#define wxAuiManager_SetDockSizeConstraint 2577 +#define wxAuiManager_SetFlags 2578 +#define wxAuiManager_SetManagedWindow 2579 +#define wxAuiManager_ShowHint 2580 +#define wxAuiManager_UnInit 2581 +#define wxAuiManager_Update 2582 +#define wxAuiPaneInfo_new_0 2583 +#define wxAuiPaneInfo_new_1 2584 +#define wxAuiPaneInfo_destruct 2585 +#define wxAuiPaneInfo_BestSize_1 2586 +#define wxAuiPaneInfo_BestSize_2 2587 +#define wxAuiPaneInfo_Bottom 2588 +#define wxAuiPaneInfo_BottomDockable 2589 +#define wxAuiPaneInfo_Caption 2590 +#define wxAuiPaneInfo_CaptionVisible 2591 +#define wxAuiPaneInfo_Centre 2592 +#define wxAuiPaneInfo_CentrePane 2593 +#define wxAuiPaneInfo_CloseButton 2594 +#define wxAuiPaneInfo_DefaultPane 2595 +#define wxAuiPaneInfo_DestroyOnClose 2596 +#define wxAuiPaneInfo_Direction 2597 +#define wxAuiPaneInfo_Dock 2598 +#define wxAuiPaneInfo_Dockable 2599 +#define wxAuiPaneInfo_Fixed 2600 +#define wxAuiPaneInfo_Float 2601 +#define wxAuiPaneInfo_Floatable 2602 +#define wxAuiPaneInfo_FloatingPosition_1 2603 +#define wxAuiPaneInfo_FloatingPosition_2 2604 +#define wxAuiPaneInfo_FloatingSize_1 2605 +#define wxAuiPaneInfo_FloatingSize_2 2606 +#define wxAuiPaneInfo_Gripper 2607 +#define wxAuiPaneInfo_GripperTop 2608 +#define wxAuiPaneInfo_HasBorder 2609 +#define wxAuiPaneInfo_HasCaption 2610 +#define wxAuiPaneInfo_HasCloseButton 2611 +#define wxAuiPaneInfo_HasFlag 2612 +#define wxAuiPaneInfo_HasGripper 2613 +#define wxAuiPaneInfo_HasGripperTop 2614 +#define wxAuiPaneInfo_HasMaximizeButton 2615 +#define wxAuiPaneInfo_HasMinimizeButton 2616 +#define wxAuiPaneInfo_HasPinButton 2617 +#define wxAuiPaneInfo_Hide 2618 +#define wxAuiPaneInfo_IsBottomDockable 2619 +#define wxAuiPaneInfo_IsDocked 2620 +#define wxAuiPaneInfo_IsFixed 2621 +#define wxAuiPaneInfo_IsFloatable 2622 +#define wxAuiPaneInfo_IsFloating 2623 +#define wxAuiPaneInfo_IsLeftDockable 2624 +#define wxAuiPaneInfo_IsMovable 2625 +#define wxAuiPaneInfo_IsOk 2626 +#define wxAuiPaneInfo_IsResizable 2627 +#define wxAuiPaneInfo_IsRightDockable 2628 +#define wxAuiPaneInfo_IsShown 2629 +#define wxAuiPaneInfo_IsToolbar 2630 +#define wxAuiPaneInfo_IsTopDockable 2631 +#define wxAuiPaneInfo_Layer 2632 +#define wxAuiPaneInfo_Left 2633 +#define wxAuiPaneInfo_LeftDockable 2634 +#define wxAuiPaneInfo_MaxSize_1 2635 +#define wxAuiPaneInfo_MaxSize_2 2636 +#define wxAuiPaneInfo_MaximizeButton 2637 +#define wxAuiPaneInfo_MinSize_1 2638 +#define wxAuiPaneInfo_MinSize_2 2639 +#define wxAuiPaneInfo_MinimizeButton 2640 +#define wxAuiPaneInfo_Movable 2641 +#define wxAuiPaneInfo_Name 2642 +#define wxAuiPaneInfo_PaneBorder 2643 +#define wxAuiPaneInfo_PinButton 2644 +#define wxAuiPaneInfo_Position 2645 +#define wxAuiPaneInfo_Resizable 2646 +#define wxAuiPaneInfo_Right 2647 +#define wxAuiPaneInfo_RightDockable 2648 +#define wxAuiPaneInfo_Row 2649 +#define wxAuiPaneInfo_SafeSet 2650 +#define wxAuiPaneInfo_SetFlag 2651 +#define wxAuiPaneInfo_Show 2652 +#define wxAuiPaneInfo_ToolbarPane 2653 +#define wxAuiPaneInfo_Top 2654 +#define wxAuiPaneInfo_TopDockable 2655 +#define wxAuiPaneInfo_Window 2656 +#define wxAuiPaneInfo_GetWindow 2657 +#define wxAuiPaneInfo_GetFrame 2658 +#define wxAuiPaneInfo_GetDirection 2659 +#define wxAuiPaneInfo_GetLayer 2660 +#define wxAuiPaneInfo_GetRow 2661 +#define wxAuiPaneInfo_GetPosition 2662 +#define wxAuiPaneInfo_GetFloatingPosition 2663 +#define wxAuiPaneInfo_GetFloatingSize 2664 +#define wxAuiNotebook_new_0 2665 +#define wxAuiNotebook_new_2 2666 +#define wxAuiNotebook_AddPage 2667 +#define wxAuiNotebook_Create 2668 +#define wxAuiNotebook_DeletePage 2669 +#define wxAuiNotebook_GetArtProvider 2670 +#define wxAuiNotebook_GetPage 2671 +#define wxAuiNotebook_GetPageBitmap 2672 +#define wxAuiNotebook_GetPageCount 2673 +#define wxAuiNotebook_GetPageIndex 2674 +#define wxAuiNotebook_GetPageText 2675 +#define wxAuiNotebook_GetSelection 2676 +#define wxAuiNotebook_InsertPage 2677 +#define wxAuiNotebook_RemovePage 2678 +#define wxAuiNotebook_SetArtProvider 2679 +#define wxAuiNotebook_SetFont 2680 +#define wxAuiNotebook_SetPageBitmap 2681 +#define wxAuiNotebook_SetPageText 2682 +#define wxAuiNotebook_SetSelection 2683 +#define wxAuiNotebook_SetTabCtrlHeight 2684 +#define wxAuiNotebook_SetUniformBitmapSize 2685 +#define wxAuiNotebook_destroy 2686 +#define wxAuiTabArt_SetFlags 2687 +#define wxAuiTabArt_SetMeasuringFont 2688 +#define wxAuiTabArt_SetNormalFont 2689 +#define wxAuiTabArt_SetSelectedFont 2690 +#define wxAuiTabArt_SetColour 2691 +#define wxAuiTabArt_SetActiveColour 2692 +#define wxAuiDockArt_GetColour 2693 +#define wxAuiDockArt_GetFont 2694 +#define wxAuiDockArt_GetMetric 2695 +#define wxAuiDockArt_SetColour 2696 +#define wxAuiDockArt_SetFont 2697 +#define wxAuiDockArt_SetMetric 2698 +#define wxAuiSimpleTabArt_new 2699 +#define wxAuiSimpleTabArt_destroy 2700 +#define wxMDIParentFrame_new_0 2701 +#define wxMDIParentFrame_new_4 2702 +#define wxMDIParentFrame_destruct 2703 +#define wxMDIParentFrame_ActivateNext 2704 +#define wxMDIParentFrame_ActivatePrevious 2705 +#define wxMDIParentFrame_ArrangeIcons 2706 +#define wxMDIParentFrame_Cascade 2707 +#define wxMDIParentFrame_Create 2708 +#define wxMDIParentFrame_GetActiveChild 2709 +#define wxMDIParentFrame_GetClientWindow 2710 +#define wxMDIParentFrame_Tile 2711 +#define wxMDIChildFrame_new_0 2712 +#define wxMDIChildFrame_new_4 2713 +#define wxMDIChildFrame_destruct 2714 +#define wxMDIChildFrame_Activate 2715 +#define wxMDIChildFrame_Create 2716 +#define wxMDIChildFrame_Maximize 2717 +#define wxMDIChildFrame_Restore 2718 +#define wxMDIClientWindow_new_0 2719 +#define wxMDIClientWindow_new_2 2720 +#define wxMDIClientWindow_destruct 2721 +#define wxMDIClientWindow_CreateClient 2722 +#define wxLayoutAlgorithm_new 2723 +#define wxLayoutAlgorithm_LayoutFrame 2724 +#define wxLayoutAlgorithm_LayoutMDIFrame 2725 +#define wxLayoutAlgorithm_LayoutWindow 2726 +#define wxLayoutAlgorithm_destroy 2727 +#define wxEvent_GetId 2728 +#define wxEvent_GetSkipped 2729 +#define wxEvent_GetTimestamp 2730 +#define wxEvent_IsCommandEvent 2731 +#define wxEvent_ResumePropagation 2732 +#define wxEvent_ShouldPropagate 2733 +#define wxEvent_Skip 2734 +#define wxEvent_StopPropagation 2735 +#define wxCommandEvent_getClientData 2736 +#define wxCommandEvent_GetExtraLong 2737 +#define wxCommandEvent_GetInt 2738 +#define wxCommandEvent_GetSelection 2739 +#define wxCommandEvent_GetString 2740 +#define wxCommandEvent_IsChecked 2741 +#define wxCommandEvent_IsSelection 2742 +#define wxCommandEvent_SetInt 2743 +#define wxCommandEvent_SetString 2744 +#define wxScrollEvent_GetOrientation 2745 +#define wxScrollEvent_GetPosition 2746 +#define wxScrollWinEvent_GetOrientation 2747 +#define wxScrollWinEvent_GetPosition 2748 +#define wxMouseEvent_AltDown 2749 +#define wxMouseEvent_Button 2750 +#define wxMouseEvent_ButtonDClick 2751 +#define wxMouseEvent_ButtonDown 2752 +#define wxMouseEvent_ButtonUp 2753 +#define wxMouseEvent_CmdDown 2754 +#define wxMouseEvent_ControlDown 2755 +#define wxMouseEvent_Dragging 2756 +#define wxMouseEvent_Entering 2757 +#define wxMouseEvent_GetButton 2758 +#define wxMouseEvent_GetPosition 2761 +#define wxMouseEvent_GetLogicalPosition 2762 +#define wxMouseEvent_GetLinesPerAction 2763 +#define wxMouseEvent_GetWheelRotation 2764 +#define wxMouseEvent_GetWheelDelta 2765 +#define wxMouseEvent_GetX 2766 +#define wxMouseEvent_GetY 2767 +#define wxMouseEvent_IsButton 2768 +#define wxMouseEvent_IsPageScroll 2769 +#define wxMouseEvent_Leaving 2770 +#define wxMouseEvent_LeftDClick 2771 +#define wxMouseEvent_LeftDown 2772 +#define wxMouseEvent_LeftIsDown 2773 +#define wxMouseEvent_LeftUp 2774 +#define wxMouseEvent_MetaDown 2775 +#define wxMouseEvent_MiddleDClick 2776 +#define wxMouseEvent_MiddleDown 2777 +#define wxMouseEvent_MiddleIsDown 2778 +#define wxMouseEvent_MiddleUp 2779 +#define wxMouseEvent_Moving 2780 +#define wxMouseEvent_RightDClick 2781 +#define wxMouseEvent_RightDown 2782 +#define wxMouseEvent_RightIsDown 2783 +#define wxMouseEvent_RightUp 2784 +#define wxMouseEvent_ShiftDown 2785 +#define wxSetCursorEvent_GetCursor 2786 +#define wxSetCursorEvent_GetX 2787 +#define wxSetCursorEvent_GetY 2788 +#define wxSetCursorEvent_HasCursor 2789 +#define wxSetCursorEvent_SetCursor 2790 +#define wxKeyEvent_AltDown 2791 +#define wxKeyEvent_CmdDown 2792 +#define wxKeyEvent_ControlDown 2793 +#define wxKeyEvent_GetKeyCode 2794 +#define wxKeyEvent_GetModifiers 2795 +#define wxKeyEvent_GetPosition 2798 +#define wxKeyEvent_GetRawKeyCode 2799 +#define wxKeyEvent_GetRawKeyFlags 2800 +#define wxKeyEvent_GetUnicodeKey 2801 +#define wxKeyEvent_GetX 2802 +#define wxKeyEvent_GetY 2803 +#define wxKeyEvent_HasModifiers 2804 +#define wxKeyEvent_MetaDown 2805 +#define wxKeyEvent_ShiftDown 2806 +#define wxSizeEvent_GetSize 2807 +#define wxMoveEvent_GetPosition 2808 +#define wxEraseEvent_GetDC 2809 +#define wxFocusEvent_GetWindow 2810 +#define wxChildFocusEvent_GetWindow 2811 +#define wxMenuEvent_GetMenu 2812 +#define wxMenuEvent_GetMenuId 2813 +#define wxMenuEvent_IsPopup 2814 +#define wxCloseEvent_CanVeto 2815 +#define wxCloseEvent_GetLoggingOff 2816 +#define wxCloseEvent_SetCanVeto 2817 +#define wxCloseEvent_SetLoggingOff 2818 +#define wxCloseEvent_Veto 2819 +#define wxShowEvent_SetShow 2820 +#define wxShowEvent_GetShow 2821 +#define wxIconizeEvent_Iconized 2822 +#define wxJoystickEvent_ButtonDown 2823 +#define wxJoystickEvent_ButtonIsDown 2824 +#define wxJoystickEvent_ButtonUp 2825 +#define wxJoystickEvent_GetButtonChange 2826 +#define wxJoystickEvent_GetButtonState 2827 +#define wxJoystickEvent_GetJoystick 2828 +#define wxJoystickEvent_GetPosition 2829 +#define wxJoystickEvent_GetZPosition 2830 +#define wxJoystickEvent_IsButton 2831 +#define wxJoystickEvent_IsMove 2832 +#define wxJoystickEvent_IsZMove 2833 +#define wxUpdateUIEvent_CanUpdate 2834 +#define wxUpdateUIEvent_Check 2835 +#define wxUpdateUIEvent_Enable 2836 +#define wxUpdateUIEvent_Show 2837 +#define wxUpdateUIEvent_GetChecked 2838 +#define wxUpdateUIEvent_GetEnabled 2839 +#define wxUpdateUIEvent_GetShown 2840 +#define wxUpdateUIEvent_GetSetChecked 2841 +#define wxUpdateUIEvent_GetSetEnabled 2842 +#define wxUpdateUIEvent_GetSetShown 2843 +#define wxUpdateUIEvent_GetSetText 2844 +#define wxUpdateUIEvent_GetText 2845 +#define wxUpdateUIEvent_GetMode 2846 +#define wxUpdateUIEvent_GetUpdateInterval 2847 +#define wxUpdateUIEvent_ResetUpdateTime 2848 +#define wxUpdateUIEvent_SetMode 2849 +#define wxUpdateUIEvent_SetText 2850 +#define wxUpdateUIEvent_SetUpdateInterval 2851 +#define wxMouseCaptureChangedEvent_GetCapturedWindow 2852 +#define wxPaletteChangedEvent_SetChangedWindow 2853 +#define wxPaletteChangedEvent_GetChangedWindow 2854 +#define wxQueryNewPaletteEvent_SetPaletteRealized 2855 +#define wxQueryNewPaletteEvent_GetPaletteRealized 2856 +#define wxNavigationKeyEvent_GetDirection 2857 +#define wxNavigationKeyEvent_SetDirection 2858 +#define wxNavigationKeyEvent_IsWindowChange 2859 +#define wxNavigationKeyEvent_SetWindowChange 2860 +#define wxNavigationKeyEvent_IsFromTab 2861 +#define wxNavigationKeyEvent_SetFromTab 2862 +#define wxNavigationKeyEvent_GetCurrentFocus 2863 +#define wxNavigationKeyEvent_SetCurrentFocus 2864 +#define wxHelpEvent_GetOrigin 2865 +#define wxHelpEvent_GetPosition 2866 +#define wxHelpEvent_SetOrigin 2867 +#define wxHelpEvent_SetPosition 2868 +#define wxContextMenuEvent_GetPosition 2869 +#define wxContextMenuEvent_SetPosition 2870 +#define wxIdleEvent_CanSend 2871 +#define wxIdleEvent_GetMode 2872 +#define wxIdleEvent_RequestMore 2873 +#define wxIdleEvent_MoreRequested 2874 +#define wxIdleEvent_SetMode 2875 +#define wxGridEvent_AltDown 2876 +#define wxGridEvent_ControlDown 2877 +#define wxGridEvent_GetCol 2878 +#define wxGridEvent_GetPosition 2879 +#define wxGridEvent_GetRow 2880 +#define wxGridEvent_MetaDown 2881 +#define wxGridEvent_Selecting 2882 +#define wxGridEvent_ShiftDown 2883 +#define wxNotifyEvent_Allow 2884 +#define wxNotifyEvent_IsAllowed 2885 +#define wxNotifyEvent_Veto 2886 +#define wxSashEvent_GetEdge 2887 +#define wxSashEvent_GetDragRect 2888 +#define wxSashEvent_GetDragStatus 2889 +#define wxListEvent_GetCacheFrom 2890 +#define wxListEvent_GetCacheTo 2891 +#define wxListEvent_GetKeyCode 2892 +#define wxListEvent_GetIndex 2893 +#define wxListEvent_GetColumn 2894 +#define wxListEvent_GetPoint 2895 +#define wxListEvent_GetLabel 2896 +#define wxListEvent_GetText 2897 +#define wxListEvent_GetImage 2898 +#define wxListEvent_GetData 2899 +#define wxListEvent_GetMask 2900 +#define wxListEvent_GetItem 2901 +#define wxListEvent_IsEditCancelled 2902 +#define wxDateEvent_GetDate 2903 +#define wxCalendarEvent_GetWeekDay 2904 +#define wxFileDirPickerEvent_GetPath 2905 +#define wxColourPickerEvent_GetColour 2906 +#define wxFontPickerEvent_GetFont 2907 +#define wxStyledTextEvent_GetPosition 2908 +#define wxStyledTextEvent_GetKey 2909 +#define wxStyledTextEvent_GetModifiers 2910 +#define wxStyledTextEvent_GetModificationType 2911 +#define wxStyledTextEvent_GetText 2912 +#define wxStyledTextEvent_GetLength 2913 +#define wxStyledTextEvent_GetLinesAdded 2914 +#define wxStyledTextEvent_GetLine 2915 +#define wxStyledTextEvent_GetFoldLevelNow 2916 +#define wxStyledTextEvent_GetFoldLevelPrev 2917 +#define wxStyledTextEvent_GetMargin 2918 +#define wxStyledTextEvent_GetMessage 2919 +#define wxStyledTextEvent_GetWParam 2920 +#define wxStyledTextEvent_GetLParam 2921 +#define wxStyledTextEvent_GetListType 2922 +#define wxStyledTextEvent_GetX 2923 +#define wxStyledTextEvent_GetY 2924 +#define wxStyledTextEvent_GetDragText 2925 +#define wxStyledTextEvent_GetDragAllowMove 2926 +#define wxStyledTextEvent_GetDragResult 2927 +#define wxStyledTextEvent_GetShift 2928 +#define wxStyledTextEvent_GetControl 2929 +#define wxStyledTextEvent_GetAlt 2930 +#define utils_wxGetKeyState 2931 +#define utils_wxGetMousePosition 2932 +#define utils_wxGetMouseState 2933 +#define utils_wxSetDetectableAutoRepeat 2934 +#define utils_wxBell 2935 +#define utils_wxFindMenuItemId 2936 +#define utils_wxGenericFindWindowAtPoint 2937 +#define utils_wxFindWindowAtPoint 2938 +#define utils_wxBeginBusyCursor 2939 +#define utils_wxEndBusyCursor 2940 +#define utils_wxIsBusy 2941 +#define utils_wxShutdown 2942 +#define utils_wxShell 2943 +#define utils_wxLaunchDefaultBrowser 2944 +#define utils_wxGetEmailAddress 2945 +#define utils_wxGetUserId 2946 +#define utils_wxGetHomeDir 2947 +#define utils_wxNewId 2948 +#define utils_wxRegisterId 2949 +#define utils_wxGetCurrentId 2950 +#define utils_wxGetOsDescription 2951 +#define utils_wxIsPlatformLittleEndian 2952 +#define utils_wxIsPlatform64Bit 2953 +#define gdicmn_wxDisplaySize 2954 +#define gdicmn_wxSetCursor 2955 +#define wxPrintout_new 2956 +#define wxPrintout_destruct 2957 +#define wxPrintout_GetDC 2958 +#define wxPrintout_GetPageSizeMM 2959 +#define wxPrintout_GetPageSizePixels 2960 +#define wxPrintout_GetPaperRectPixels 2961 +#define wxPrintout_GetPPIPrinter 2962 +#define wxPrintout_GetPPIScreen 2963 +#define wxPrintout_GetTitle 2964 +#define wxPrintout_IsPreview 2965 +#define wxPrintout_FitThisSizeToPaper 2966 +#define wxPrintout_FitThisSizeToPage 2967 +#define wxPrintout_FitThisSizeToPageMargins 2968 +#define wxPrintout_MapScreenSizeToPaper 2969 +#define wxPrintout_MapScreenSizeToPage 2970 +#define wxPrintout_MapScreenSizeToPageMargins 2971 +#define wxPrintout_MapScreenSizeToDevice 2972 +#define wxPrintout_GetLogicalPaperRect 2973 +#define wxPrintout_GetLogicalPageRect 2974 +#define wxPrintout_GetLogicalPageMarginsRect 2975 +#define wxPrintout_SetLogicalOrigin 2976 +#define wxPrintout_OffsetLogicalOrigin 2977 +#define wxStyledTextCtrl_new_2 2978 +#define wxStyledTextCtrl_new_0 2979 +#define wxStyledTextCtrl_destruct 2980 +#define wxStyledTextCtrl_Create 2981 +#define wxStyledTextCtrl_AddText 2982 +#define wxStyledTextCtrl_AddStyledText 2983 +#define wxStyledTextCtrl_InsertText 2984 +#define wxStyledTextCtrl_ClearAll 2985 +#define wxStyledTextCtrl_ClearDocumentStyle 2986 +#define wxStyledTextCtrl_GetLength 2987 +#define wxStyledTextCtrl_GetCharAt 2988 +#define wxStyledTextCtrl_GetCurrentPos 2989 +#define wxStyledTextCtrl_GetAnchor 2990 +#define wxStyledTextCtrl_GetStyleAt 2991 +#define wxStyledTextCtrl_Redo 2992 +#define wxStyledTextCtrl_SetUndoCollection 2993 +#define wxStyledTextCtrl_SelectAll 2994 +#define wxStyledTextCtrl_SetSavePoint 2995 +#define wxStyledTextCtrl_GetStyledText 2996 +#define wxStyledTextCtrl_CanRedo 2997 +#define wxStyledTextCtrl_MarkerLineFromHandle 2998 +#define wxStyledTextCtrl_MarkerDeleteHandle 2999 +#define wxStyledTextCtrl_GetUndoCollection 3000 +#define wxStyledTextCtrl_GetViewWhiteSpace 3001 +#define wxStyledTextCtrl_SetViewWhiteSpace 3002 +#define wxStyledTextCtrl_PositionFromPoint 3003 +#define wxStyledTextCtrl_PositionFromPointClose 3004 +#define wxStyledTextCtrl_GotoLine 3005 +#define wxStyledTextCtrl_GotoPos 3006 +#define wxStyledTextCtrl_SetAnchor 3007 +#define wxStyledTextCtrl_GetCurLine 3008 +#define wxStyledTextCtrl_GetEndStyled 3009 +#define wxStyledTextCtrl_ConvertEOLs 3010 +#define wxStyledTextCtrl_GetEOLMode 3011 +#define wxStyledTextCtrl_SetEOLMode 3012 +#define wxStyledTextCtrl_StartStyling 3013 +#define wxStyledTextCtrl_SetStyling 3014 +#define wxStyledTextCtrl_GetBufferedDraw 3015 +#define wxStyledTextCtrl_SetBufferedDraw 3016 +#define wxStyledTextCtrl_SetTabWidth 3017 +#define wxStyledTextCtrl_GetTabWidth 3018 +#define wxStyledTextCtrl_SetCodePage 3019 +#define wxStyledTextCtrl_MarkerDefine 3020 +#define wxStyledTextCtrl_MarkerSetForeground 3021 +#define wxStyledTextCtrl_MarkerSetBackground 3022 +#define wxStyledTextCtrl_MarkerAdd 3023 +#define wxStyledTextCtrl_MarkerDelete 3024 +#define wxStyledTextCtrl_MarkerDeleteAll 3025 +#define wxStyledTextCtrl_MarkerGet 3026 +#define wxStyledTextCtrl_MarkerNext 3027 +#define wxStyledTextCtrl_MarkerPrevious 3028 +#define wxStyledTextCtrl_MarkerDefineBitmap 3029 +#define wxStyledTextCtrl_MarkerAddSet 3030 +#define wxStyledTextCtrl_MarkerSetAlpha 3031 +#define wxStyledTextCtrl_SetMarginType 3032 +#define wxStyledTextCtrl_GetMarginType 3033 +#define wxStyledTextCtrl_SetMarginWidth 3034 +#define wxStyledTextCtrl_GetMarginWidth 3035 +#define wxStyledTextCtrl_SetMarginMask 3036 +#define wxStyledTextCtrl_GetMarginMask 3037 +#define wxStyledTextCtrl_SetMarginSensitive 3038 +#define wxStyledTextCtrl_GetMarginSensitive 3039 +#define wxStyledTextCtrl_StyleClearAll 3040 +#define wxStyledTextCtrl_StyleSetForeground 3041 +#define wxStyledTextCtrl_StyleSetBackground 3042 +#define wxStyledTextCtrl_StyleSetBold 3043 +#define wxStyledTextCtrl_StyleSetItalic 3044 +#define wxStyledTextCtrl_StyleSetSize 3045 +#define wxStyledTextCtrl_StyleSetFaceName 3046 +#define wxStyledTextCtrl_StyleSetEOLFilled 3047 +#define wxStyledTextCtrl_StyleResetDefault 3048 +#define wxStyledTextCtrl_StyleSetUnderline 3049 +#define wxStyledTextCtrl_StyleSetCase 3050 +#define wxStyledTextCtrl_StyleSetHotSpot 3051 +#define wxStyledTextCtrl_SetSelForeground 3052 +#define wxStyledTextCtrl_SetSelBackground 3053 +#define wxStyledTextCtrl_GetSelAlpha 3054 +#define wxStyledTextCtrl_SetSelAlpha 3055 +#define wxStyledTextCtrl_SetCaretForeground 3056 +#define wxStyledTextCtrl_CmdKeyAssign 3057 +#define wxStyledTextCtrl_CmdKeyClear 3058 +#define wxStyledTextCtrl_CmdKeyClearAll 3059 +#define wxStyledTextCtrl_SetStyleBytes 3060 +#define wxStyledTextCtrl_StyleSetVisible 3061 +#define wxStyledTextCtrl_GetCaretPeriod 3062 +#define wxStyledTextCtrl_SetCaretPeriod 3063 +#define wxStyledTextCtrl_SetWordChars 3064 +#define wxStyledTextCtrl_BeginUndoAction 3065 +#define wxStyledTextCtrl_EndUndoAction 3066 +#define wxStyledTextCtrl_IndicatorSetStyle 3067 +#define wxStyledTextCtrl_IndicatorGetStyle 3068 +#define wxStyledTextCtrl_IndicatorSetForeground 3069 +#define wxStyledTextCtrl_IndicatorGetForeground 3070 +#define wxStyledTextCtrl_SetWhitespaceForeground 3071 +#define wxStyledTextCtrl_SetWhitespaceBackground 3072 +#define wxStyledTextCtrl_GetStyleBits 3073 +#define wxStyledTextCtrl_SetLineState 3074 +#define wxStyledTextCtrl_GetLineState 3075 +#define wxStyledTextCtrl_GetMaxLineState 3076 +#define wxStyledTextCtrl_GetCaretLineVisible 3077 +#define wxStyledTextCtrl_SetCaretLineVisible 3078 +#define wxStyledTextCtrl_GetCaretLineBackground 3079 +#define wxStyledTextCtrl_SetCaretLineBackground 3080 +#define wxStyledTextCtrl_AutoCompShow 3081 +#define wxStyledTextCtrl_AutoCompCancel 3082 +#define wxStyledTextCtrl_AutoCompActive 3083 +#define wxStyledTextCtrl_AutoCompPosStart 3084 +#define wxStyledTextCtrl_AutoCompComplete 3085 +#define wxStyledTextCtrl_AutoCompStops 3086 +#define wxStyledTextCtrl_AutoCompSetSeparator 3087 +#define wxStyledTextCtrl_AutoCompGetSeparator 3088 +#define wxStyledTextCtrl_AutoCompSelect 3089 +#define wxStyledTextCtrl_AutoCompSetCancelAtStart 3090 +#define wxStyledTextCtrl_AutoCompGetCancelAtStart 3091 +#define wxStyledTextCtrl_AutoCompSetFillUps 3092 +#define wxStyledTextCtrl_AutoCompSetChooseSingle 3093 +#define wxStyledTextCtrl_AutoCompGetChooseSingle 3094 +#define wxStyledTextCtrl_AutoCompSetIgnoreCase 3095 +#define wxStyledTextCtrl_AutoCompGetIgnoreCase 3096 +#define wxStyledTextCtrl_UserListShow 3097 +#define wxStyledTextCtrl_AutoCompSetAutoHide 3098 +#define wxStyledTextCtrl_AutoCompGetAutoHide 3099 +#define wxStyledTextCtrl_AutoCompSetDropRestOfWord 3100 +#define wxStyledTextCtrl_AutoCompGetDropRestOfWord 3101 +#define wxStyledTextCtrl_RegisterImage 3102 +#define wxStyledTextCtrl_ClearRegisteredImages 3103 +#define wxStyledTextCtrl_AutoCompGetTypeSeparator 3104 +#define wxStyledTextCtrl_AutoCompSetTypeSeparator 3105 +#define wxStyledTextCtrl_AutoCompSetMaxWidth 3106 +#define wxStyledTextCtrl_AutoCompGetMaxWidth 3107 +#define wxStyledTextCtrl_AutoCompSetMaxHeight 3108 +#define wxStyledTextCtrl_AutoCompGetMaxHeight 3109 +#define wxStyledTextCtrl_SetIndent 3110 +#define wxStyledTextCtrl_GetIndent 3111 +#define wxStyledTextCtrl_SetUseTabs 3112 +#define wxStyledTextCtrl_GetUseTabs 3113 +#define wxStyledTextCtrl_SetLineIndentation 3114 +#define wxStyledTextCtrl_GetLineIndentation 3115 +#define wxStyledTextCtrl_GetLineIndentPosition 3116 +#define wxStyledTextCtrl_GetColumn 3117 +#define wxStyledTextCtrl_SetUseHorizontalScrollBar 3118 +#define wxStyledTextCtrl_GetUseHorizontalScrollBar 3119 +#define wxStyledTextCtrl_SetIndentationGuides 3120 +#define wxStyledTextCtrl_GetIndentationGuides 3121 +#define wxStyledTextCtrl_SetHighlightGuide 3122 +#define wxStyledTextCtrl_GetHighlightGuide 3123 +#define wxStyledTextCtrl_GetLineEndPosition 3124 +#define wxStyledTextCtrl_GetCodePage 3125 +#define wxStyledTextCtrl_GetCaretForeground 3126 +#define wxStyledTextCtrl_GetReadOnly 3127 +#define wxStyledTextCtrl_SetCurrentPos 3128 +#define wxStyledTextCtrl_SetSelectionStart 3129 +#define wxStyledTextCtrl_GetSelectionStart 3130 +#define wxStyledTextCtrl_SetSelectionEnd 3131 +#define wxStyledTextCtrl_GetSelectionEnd 3132 +#define wxStyledTextCtrl_SetPrintMagnification 3133 +#define wxStyledTextCtrl_GetPrintMagnification 3134 +#define wxStyledTextCtrl_SetPrintColourMode 3135 +#define wxStyledTextCtrl_GetPrintColourMode 3136 +#define wxStyledTextCtrl_FindText 3137 +#define wxStyledTextCtrl_FormatRange 3138 +#define wxStyledTextCtrl_GetFirstVisibleLine 3139 +#define wxStyledTextCtrl_GetLine 3140 +#define wxStyledTextCtrl_GetLineCount 3141 +#define wxStyledTextCtrl_SetMarginLeft 3142 +#define wxStyledTextCtrl_GetMarginLeft 3143 +#define wxStyledTextCtrl_SetMarginRight 3144 +#define wxStyledTextCtrl_GetMarginRight 3145 +#define wxStyledTextCtrl_GetModify 3146 +#define wxStyledTextCtrl_SetSelection 3147 +#define wxStyledTextCtrl_GetSelectedText 3148 +#define wxStyledTextCtrl_GetTextRange 3149 +#define wxStyledTextCtrl_HideSelection 3150 +#define wxStyledTextCtrl_LineFromPosition 3151 +#define wxStyledTextCtrl_PositionFromLine 3152 +#define wxStyledTextCtrl_LineScroll 3153 +#define wxStyledTextCtrl_EnsureCaretVisible 3154 +#define wxStyledTextCtrl_ReplaceSelection 3155 +#define wxStyledTextCtrl_SetReadOnly 3156 +#define wxStyledTextCtrl_CanPaste 3157 +#define wxStyledTextCtrl_CanUndo 3158 +#define wxStyledTextCtrl_EmptyUndoBuffer 3159 +#define wxStyledTextCtrl_Undo 3160 +#define wxStyledTextCtrl_Cut 3161 +#define wxStyledTextCtrl_Copy 3162 +#define wxStyledTextCtrl_Paste 3163 +#define wxStyledTextCtrl_Clear 3164 +#define wxStyledTextCtrl_SetText 3165 +#define wxStyledTextCtrl_GetText 3166 +#define wxStyledTextCtrl_GetTextLength 3167 +#define wxStyledTextCtrl_GetOvertype 3168 +#define wxStyledTextCtrl_SetCaretWidth 3169 +#define wxStyledTextCtrl_GetCaretWidth 3170 +#define wxStyledTextCtrl_SetTargetStart 3171 +#define wxStyledTextCtrl_GetTargetStart 3172 +#define wxStyledTextCtrl_SetTargetEnd 3173 +#define wxStyledTextCtrl_GetTargetEnd 3174 +#define wxStyledTextCtrl_ReplaceTarget 3175 +#define wxStyledTextCtrl_SearchInTarget 3176 +#define wxStyledTextCtrl_SetSearchFlags 3177 +#define wxStyledTextCtrl_GetSearchFlags 3178 +#define wxStyledTextCtrl_CallTipShow 3179 +#define wxStyledTextCtrl_CallTipCancel 3180 +#define wxStyledTextCtrl_CallTipActive 3181 +#define wxStyledTextCtrl_CallTipPosAtStart 3182 +#define wxStyledTextCtrl_CallTipSetHighlight 3183 +#define wxStyledTextCtrl_CallTipSetBackground 3184 +#define wxStyledTextCtrl_CallTipSetForeground 3185 +#define wxStyledTextCtrl_CallTipSetForegroundHighlight 3186 +#define wxStyledTextCtrl_CallTipUseStyle 3187 +#define wxStyledTextCtrl_VisibleFromDocLine 3188 +#define wxStyledTextCtrl_DocLineFromVisible 3189 +#define wxStyledTextCtrl_WrapCount 3190 +#define wxStyledTextCtrl_SetFoldLevel 3191 +#define wxStyledTextCtrl_GetFoldLevel 3192 +#define wxStyledTextCtrl_GetLastChild 3193 +#define wxStyledTextCtrl_GetFoldParent 3194 +#define wxStyledTextCtrl_ShowLines 3195 +#define wxStyledTextCtrl_HideLines 3196 +#define wxStyledTextCtrl_GetLineVisible 3197 +#define wxStyledTextCtrl_SetFoldExpanded 3198 +#define wxStyledTextCtrl_GetFoldExpanded 3199 +#define wxStyledTextCtrl_ToggleFold 3200 +#define wxStyledTextCtrl_EnsureVisible 3201 +#define wxStyledTextCtrl_SetFoldFlags 3202 +#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy 3203 +#define wxStyledTextCtrl_SetTabIndents 3204 +#define wxStyledTextCtrl_GetTabIndents 3205 +#define wxStyledTextCtrl_SetBackSpaceUnIndents 3206 +#define wxStyledTextCtrl_GetBackSpaceUnIndents 3207 +#define wxStyledTextCtrl_SetMouseDwellTime 3208 +#define wxStyledTextCtrl_GetMouseDwellTime 3209 +#define wxStyledTextCtrl_WordStartPosition 3210 +#define wxStyledTextCtrl_WordEndPosition 3211 +#define wxStyledTextCtrl_SetWrapMode 3212 +#define wxStyledTextCtrl_GetWrapMode 3213 +#define wxStyledTextCtrl_SetWrapVisualFlags 3214 +#define wxStyledTextCtrl_GetWrapVisualFlags 3215 +#define wxStyledTextCtrl_SetWrapVisualFlagsLocation 3216 +#define wxStyledTextCtrl_GetWrapVisualFlagsLocation 3217 +#define wxStyledTextCtrl_SetWrapStartIndent 3218 +#define wxStyledTextCtrl_GetWrapStartIndent 3219 +#define wxStyledTextCtrl_SetLayoutCache 3220 +#define wxStyledTextCtrl_GetLayoutCache 3221 +#define wxStyledTextCtrl_SetScrollWidth 3222 +#define wxStyledTextCtrl_GetScrollWidth 3223 +#define wxStyledTextCtrl_TextWidth 3224 +#define wxStyledTextCtrl_GetEndAtLastLine 3225 +#define wxStyledTextCtrl_TextHeight 3226 +#define wxStyledTextCtrl_SetUseVerticalScrollBar 3227 +#define wxStyledTextCtrl_GetUseVerticalScrollBar 3228 +#define wxStyledTextCtrl_AppendText 3229 +#define wxStyledTextCtrl_GetTwoPhaseDraw 3230 +#define wxStyledTextCtrl_SetTwoPhaseDraw 3231 +#define wxStyledTextCtrl_TargetFromSelection 3232 +#define wxStyledTextCtrl_LinesJoin 3233 +#define wxStyledTextCtrl_LinesSplit 3234 +#define wxStyledTextCtrl_SetFoldMarginColour 3235 +#define wxStyledTextCtrl_SetFoldMarginHiColour 3236 +#define wxStyledTextCtrl_LineDown 3237 +#define wxStyledTextCtrl_LineDownExtend 3238 +#define wxStyledTextCtrl_LineUp 3239 +#define wxStyledTextCtrl_LineUpExtend 3240 +#define wxStyledTextCtrl_CharLeft 3241 +#define wxStyledTextCtrl_CharLeftExtend 3242 +#define wxStyledTextCtrl_CharRight 3243 +#define wxStyledTextCtrl_CharRightExtend 3244 +#define wxStyledTextCtrl_WordLeft 3245 +#define wxStyledTextCtrl_WordLeftExtend 3246 +#define wxStyledTextCtrl_WordRight 3247 +#define wxStyledTextCtrl_WordRightExtend 3248 +#define wxStyledTextCtrl_Home 3249 +#define wxStyledTextCtrl_HomeExtend 3250 +#define wxStyledTextCtrl_LineEnd 3251 +#define wxStyledTextCtrl_LineEndExtend 3252 +#define wxStyledTextCtrl_DocumentStart 3253 +#define wxStyledTextCtrl_DocumentStartExtend 3254 +#define wxStyledTextCtrl_DocumentEnd 3255 +#define wxStyledTextCtrl_DocumentEndExtend 3256 +#define wxStyledTextCtrl_PageUp 3257 +#define wxStyledTextCtrl_PageUpExtend 3258 +#define wxStyledTextCtrl_PageDown 3259 +#define wxStyledTextCtrl_PageDownExtend 3260 +#define wxStyledTextCtrl_EditToggleOvertype 3261 +#define wxStyledTextCtrl_Cancel 3262 +#define wxStyledTextCtrl_DeleteBack 3263 +#define wxStyledTextCtrl_Tab 3264 +#define wxStyledTextCtrl_BackTab 3265 +#define wxStyledTextCtrl_NewLine 3266 +#define wxStyledTextCtrl_FormFeed 3267 +#define wxStyledTextCtrl_VCHome 3268 +#define wxStyledTextCtrl_VCHomeExtend 3269 +#define wxStyledTextCtrl_ZoomIn 3270 +#define wxStyledTextCtrl_ZoomOut 3271 +#define wxStyledTextCtrl_DelWordLeft 3272 +#define wxStyledTextCtrl_DelWordRight 3273 +#define wxStyledTextCtrl_LineCut 3274 +#define wxStyledTextCtrl_LineDelete 3275 +#define wxStyledTextCtrl_LineTranspose 3276 +#define wxStyledTextCtrl_LineDuplicate 3277 +#define wxStyledTextCtrl_LowerCase 3278 +#define wxStyledTextCtrl_UpperCase 3279 +#define wxStyledTextCtrl_LineScrollDown 3280 +#define wxStyledTextCtrl_LineScrollUp 3281 +#define wxStyledTextCtrl_DeleteBackNotLine 3282 +#define wxStyledTextCtrl_HomeDisplay 3283 +#define wxStyledTextCtrl_HomeDisplayExtend 3284 +#define wxStyledTextCtrl_LineEndDisplay 3285 +#define wxStyledTextCtrl_LineEndDisplayExtend 3286 +#define wxStyledTextCtrl_HomeWrapExtend 3287 +#define wxStyledTextCtrl_LineEndWrap 3288 +#define wxStyledTextCtrl_LineEndWrapExtend 3289 +#define wxStyledTextCtrl_VCHomeWrap 3290 +#define wxStyledTextCtrl_VCHomeWrapExtend 3291 +#define wxStyledTextCtrl_LineCopy 3292 +#define wxStyledTextCtrl_MoveCaretInsideView 3293 +#define wxStyledTextCtrl_LineLength 3294 +#define wxStyledTextCtrl_BraceHighlight 3295 +#define wxStyledTextCtrl_BraceBadLight 3296 +#define wxStyledTextCtrl_BraceMatch 3297 +#define wxStyledTextCtrl_GetViewEOL 3298 +#define wxStyledTextCtrl_SetViewEOL 3299 +#define wxStyledTextCtrl_SetModEventMask 3300 +#define wxStyledTextCtrl_GetEdgeColumn 3301 +#define wxStyledTextCtrl_SetEdgeColumn 3302 +#define wxStyledTextCtrl_SetEdgeMode 3303 +#define wxStyledTextCtrl_GetEdgeMode 3304 +#define wxStyledTextCtrl_GetEdgeColour 3305 +#define wxStyledTextCtrl_SetEdgeColour 3306 +#define wxStyledTextCtrl_SearchAnchor 3307 +#define wxStyledTextCtrl_SearchNext 3308 +#define wxStyledTextCtrl_SearchPrev 3309 +#define wxStyledTextCtrl_LinesOnScreen 3310 +#define wxStyledTextCtrl_UsePopUp 3311 +#define wxStyledTextCtrl_SelectionIsRectangle 3312 +#define wxStyledTextCtrl_SetZoom 3313 +#define wxStyledTextCtrl_GetZoom 3314 +#define wxStyledTextCtrl_GetModEventMask 3315 +#define wxStyledTextCtrl_SetSTCFocus 3316 +#define wxStyledTextCtrl_GetSTCFocus 3317 +#define wxStyledTextCtrl_SetStatus 3318 +#define wxStyledTextCtrl_GetStatus 3319 +#define wxStyledTextCtrl_SetMouseDownCaptures 3320 +#define wxStyledTextCtrl_GetMouseDownCaptures 3321 +#define wxStyledTextCtrl_SetSTCCursor 3322 +#define wxStyledTextCtrl_GetSTCCursor 3323 +#define wxStyledTextCtrl_SetControlCharSymbol 3324 +#define wxStyledTextCtrl_GetControlCharSymbol 3325 +#define wxStyledTextCtrl_WordPartLeft 3326 +#define wxStyledTextCtrl_WordPartLeftExtend 3327 +#define wxStyledTextCtrl_WordPartRight 3328 +#define wxStyledTextCtrl_WordPartRightExtend 3329 +#define wxStyledTextCtrl_SetVisiblePolicy 3330 +#define wxStyledTextCtrl_DelLineLeft 3331 +#define wxStyledTextCtrl_DelLineRight 3332 +#define wxStyledTextCtrl_GetXOffset 3333 +#define wxStyledTextCtrl_ChooseCaretX 3334 +#define wxStyledTextCtrl_SetXCaretPolicy 3335 +#define wxStyledTextCtrl_SetYCaretPolicy 3336 +#define wxStyledTextCtrl_GetPrintWrapMode 3337 +#define wxStyledTextCtrl_SetHotspotActiveForeground 3338 +#define wxStyledTextCtrl_SetHotspotActiveBackground 3339 +#define wxStyledTextCtrl_SetHotspotActiveUnderline 3340 +#define wxStyledTextCtrl_SetHotspotSingleLine 3341 +#define wxStyledTextCtrl_ParaDownExtend 3342 +#define wxStyledTextCtrl_ParaUp 3343 +#define wxStyledTextCtrl_ParaUpExtend 3344 +#define wxStyledTextCtrl_PositionBefore 3345 +#define wxStyledTextCtrl_PositionAfter 3346 +#define wxStyledTextCtrl_CopyRange 3347 +#define wxStyledTextCtrl_CopyText 3348 +#define wxStyledTextCtrl_SetSelectionMode 3349 +#define wxStyledTextCtrl_GetSelectionMode 3350 +#define wxStyledTextCtrl_LineDownRectExtend 3351 +#define wxStyledTextCtrl_LineUpRectExtend 3352 +#define wxStyledTextCtrl_CharLeftRectExtend 3353 +#define wxStyledTextCtrl_CharRightRectExtend 3354 +#define wxStyledTextCtrl_HomeRectExtend 3355 +#define wxStyledTextCtrl_VCHomeRectExtend 3356 +#define wxStyledTextCtrl_LineEndRectExtend 3357 +#define wxStyledTextCtrl_PageUpRectExtend 3358 +#define wxStyledTextCtrl_PageDownRectExtend 3359 +#define wxStyledTextCtrl_StutteredPageUp 3360 +#define wxStyledTextCtrl_StutteredPageUpExtend 3361 +#define wxStyledTextCtrl_StutteredPageDown 3362 +#define wxStyledTextCtrl_StutteredPageDownExtend 3363 +#define wxStyledTextCtrl_WordLeftEnd 3364 +#define wxStyledTextCtrl_WordLeftEndExtend 3365 +#define wxStyledTextCtrl_WordRightEnd 3366 +#define wxStyledTextCtrl_WordRightEndExtend 3367 +#define wxStyledTextCtrl_SetWhitespaceChars 3368 +#define wxStyledTextCtrl_SetCharsDefault 3369 +#define wxStyledTextCtrl_AutoCompGetCurrent 3370 +#define wxStyledTextCtrl_Allocate 3371 +#define wxStyledTextCtrl_FindColumn 3372 +#define wxStyledTextCtrl_GetCaretSticky 3373 +#define wxStyledTextCtrl_SetCaretSticky 3374 +#define wxStyledTextCtrl_ToggleCaretSticky 3375 +#define wxStyledTextCtrl_SetPasteConvertEndings 3376 +#define wxStyledTextCtrl_GetPasteConvertEndings 3377 +#define wxStyledTextCtrl_SelectionDuplicate 3378 +#define wxStyledTextCtrl_SetCaretLineBackAlpha 3379 +#define wxStyledTextCtrl_GetCaretLineBackAlpha 3380 +#define wxStyledTextCtrl_StartRecord 3381 +#define wxStyledTextCtrl_StopRecord 3382 +#define wxStyledTextCtrl_SetLexer 3383 +#define wxStyledTextCtrl_GetLexer 3384 +#define wxStyledTextCtrl_Colourise 3385 +#define wxStyledTextCtrl_SetProperty 3386 +#define wxStyledTextCtrl_SetKeyWords 3387 +#define wxStyledTextCtrl_SetLexerLanguage 3388 +#define wxStyledTextCtrl_GetProperty 3389 +#define wxStyledTextCtrl_GetStyleBitsNeeded 3390 +#define wxStyledTextCtrl_GetCurrentLine 3391 +#define wxStyledTextCtrl_StyleSetSpec 3392 +#define wxStyledTextCtrl_StyleSetFont 3393 +#define wxStyledTextCtrl_StyleSetFontAttr 3394 +#define wxStyledTextCtrl_StyleSetCharacterSet 3395 +#define wxStyledTextCtrl_StyleSetFontEncoding 3396 +#define wxStyledTextCtrl_CmdKeyExecute 3397 +#define wxStyledTextCtrl_SetMargins 3398 +#define wxStyledTextCtrl_GetSelection 3399 +#define wxStyledTextCtrl_PointFromPosition 3400 +#define wxStyledTextCtrl_ScrollToLine 3401 +#define wxStyledTextCtrl_ScrollToColumn 3402 +#define wxStyledTextCtrl_SetVScrollBar 3403 +#define wxStyledTextCtrl_SetHScrollBar 3404 +#define wxStyledTextCtrl_GetLastKeydownProcessed 3405 +#define wxStyledTextCtrl_SetLastKeydownProcessed 3406 +#define wxStyledTextCtrl_SaveFile 3407 +#define wxStyledTextCtrl_LoadFile 3408 +#define wxStyledTextCtrl_DoDragOver 3409 +#define wxStyledTextCtrl_DoDropText 3410 +#define wxStyledTextCtrl_GetUseAntiAliasing 3411 +#define wxStyledTextCtrl_AddTextRaw 3412 +#define wxStyledTextCtrl_InsertTextRaw 3413 +#define wxStyledTextCtrl_GetCurLineRaw 3414 +#define wxStyledTextCtrl_GetLineRaw 3415 +#define wxStyledTextCtrl_GetSelectedTextRaw 3416 +#define wxStyledTextCtrl_GetTextRangeRaw 3417 +#define wxStyledTextCtrl_SetTextRaw 3418 +#define wxStyledTextCtrl_GetTextRaw 3419 +#define wxStyledTextCtrl_AppendTextRaw 3420 +#define wxArtProvider_GetBitmap 3421 +#define wxArtProvider_GetIcon 3422 +#define wxTreeEvent_GetKeyCode 3423 +#define wxTreeEvent_GetItem 3424 +#define wxTreeEvent_GetKeyEvent 3425 +#define wxTreeEvent_GetLabel 3426 +#define wxTreeEvent_GetOldItem 3427 +#define wxTreeEvent_GetPoint 3428 +#define wxTreeEvent_IsEditCancelled 3429 +#define wxTreeEvent_SetToolTip 3430 +#define wxNotebookEvent_GetOldSelection 3431 +#define wxNotebookEvent_GetSelection 3432 +#define wxNotebookEvent_SetOldSelection 3433 +#define wxNotebookEvent_SetSelection 3434 +#define wxFileDataObject_new 3435 +#define wxFileDataObject_AddFile 3436 +#define wxFileDataObject_GetFilenames 3437 +#define wxFileDataObject_destroy 3438 +#define wxTextDataObject_new 3439 +#define wxTextDataObject_GetTextLength 3440 +#define wxTextDataObject_GetText 3441 +#define wxTextDataObject_SetText 3442 +#define wxTextDataObject_destroy 3443 +#define wxBitmapDataObject_new_1_1 3444 +#define wxBitmapDataObject_new_1_0 3445 +#define wxBitmapDataObject_GetBitmap 3446 +#define wxBitmapDataObject_SetBitmap 3447 +#define wxBitmapDataObject_destroy 3448 +#define wxClipboard_new 3450 +#define wxClipboard_destruct 3451 +#define wxClipboard_AddData 3452 +#define wxClipboard_Clear 3453 +#define wxClipboard_Close 3454 +#define wxClipboard_Flush 3455 +#define wxClipboard_GetData 3456 +#define wxClipboard_IsOpened 3457 +#define wxClipboard_Open 3458 +#define wxClipboard_SetData 3459 +#define wxClipboard_UsePrimarySelection 3461 +#define wxClipboard_IsSupported 3462 +#define wxClipboard_Get 3463 +#define wxSpinEvent_GetPosition 3464 +#define wxSpinEvent_SetPosition 3465 +#define wxSplitterWindow_new_0 3466 +#define wxSplitterWindow_new_2 3467 +#define wxSplitterWindow_destruct 3468 +#define wxSplitterWindow_Create 3469 +#define wxSplitterWindow_GetMinimumPaneSize 3470 +#define wxSplitterWindow_GetSashGravity 3471 +#define wxSplitterWindow_GetSashPosition 3472 +#define wxSplitterWindow_GetSplitMode 3473 +#define wxSplitterWindow_GetWindow1 3474 +#define wxSplitterWindow_GetWindow2 3475 +#define wxSplitterWindow_Initialize 3476 +#define wxSplitterWindow_IsSplit 3477 +#define wxSplitterWindow_ReplaceWindow 3478 +#define wxSplitterWindow_SetSashGravity 3479 +#define wxSplitterWindow_SetSashPosition 3480 +#define wxSplitterWindow_SetSashSize 3481 +#define wxSplitterWindow_SetMinimumPaneSize 3482 +#define wxSplitterWindow_SetSplitMode 3483 +#define wxSplitterWindow_SplitHorizontally 3484 +#define wxSplitterWindow_SplitVertically 3485 +#define wxSplitterWindow_Unsplit 3486 +#define wxSplitterWindow_UpdateSize 3487 +#define wxSplitterEvent_GetSashPosition 3488 +#define wxSplitterEvent_GetX 3489 +#define wxSplitterEvent_GetY 3490 +#define wxSplitterEvent_GetWindowBeingRemoved 3491 +#define wxSplitterEvent_SetSashPosition 3492 +#define wxHtmlWindow_new_0 3493 +#define wxHtmlWindow_new_2 3494 +#define wxHtmlWindow_AppendToPage 3495 +#define wxHtmlWindow_GetOpenedAnchor 3496 +#define wxHtmlWindow_GetOpenedPage 3497 +#define wxHtmlWindow_GetOpenedPageTitle 3498 +#define wxHtmlWindow_GetRelatedFrame 3499 +#define wxHtmlWindow_HistoryBack 3500 +#define wxHtmlWindow_HistoryCanBack 3501 +#define wxHtmlWindow_HistoryCanForward 3502 +#define wxHtmlWindow_HistoryClear 3503 +#define wxHtmlWindow_HistoryForward 3504 +#define wxHtmlWindow_LoadFile 3505 +#define wxHtmlWindow_LoadPage 3506 +#define wxHtmlWindow_SelectAll 3507 +#define wxHtmlWindow_SelectionToText 3508 +#define wxHtmlWindow_SelectLine 3509 +#define wxHtmlWindow_SelectWord 3510 +#define wxHtmlWindow_SetBorders 3511 +#define wxHtmlWindow_SetFonts 3512 +#define wxHtmlWindow_SetPage 3513 +#define wxHtmlWindow_SetRelatedFrame 3514 +#define wxHtmlWindow_SetRelatedStatusBar 3515 +#define wxHtmlWindow_ToText 3516 +#define wxHtmlWindow_destroy 3517 +#define wxHtmlLinkEvent_GetLinkInfo 3518 +#define wxSystemSettings_GetColour 3519 +#define wxSystemSettings_GetFont 3520 +#define wxSystemSettings_GetMetric 3521 +#define wxSystemSettings_GetScreenType 3522 +#define wxSystemOptions_GetOption 3523 +#define wxSystemOptions_GetOptionInt 3524 +#define wxSystemOptions_HasOption 3525 +#define wxSystemOptions_IsFalse 3526 +#define wxSystemOptions_SetOption_2_1 3527 +#define wxSystemOptions_SetOption_2_0 3528 +#define wxAuiNotebookEvent_SetSelection 3529 +#define wxAuiNotebookEvent_GetSelection 3530 +#define wxAuiNotebookEvent_SetOldSelection 3531 +#define wxAuiNotebookEvent_GetOldSelection 3532 +#define wxAuiNotebookEvent_SetDragSource 3533 +#define wxAuiNotebookEvent_GetDragSource 3534 +#define wxAuiManagerEvent_SetManager 3535 +#define wxAuiManagerEvent_GetManager 3536 +#define wxAuiManagerEvent_SetPane 3537 +#define wxAuiManagerEvent_GetPane 3538 +#define wxAuiManagerEvent_SetButton 3539 +#define wxAuiManagerEvent_GetButton 3540 +#define wxAuiManagerEvent_SetDC 3541 +#define wxAuiManagerEvent_GetDC 3542 +#define wxAuiManagerEvent_Veto 3543 +#define wxAuiManagerEvent_GetVeto 3544 +#define wxAuiManagerEvent_SetCanVeto 3545 +#define wxAuiManagerEvent_CanVeto 3546 +#define wxLogNull_new 3547 +#define wxLogNull_destroy 3548 +#define wxTaskBarIcon_new 3549 +#define wxTaskBarIcon_destruct 3550 +#define wxTaskBarIcon_PopupMenu 3551 +#define wxTaskBarIcon_RemoveIcon 3552 +#define wxTaskBarIcon_SetIcon 3553 +#define wxLocale_new_0 3554 +#define wxLocale_new_2 3556 +#define wxLocale_destruct 3557 +#define wxLocale_Init 3559 +#define wxLocale_AddCatalog_1 3560 +#define wxLocale_AddCatalog_3 3561 +#define wxLocale_AddCatalogLookupPathPrefix 3562 +#define wxLocale_GetCanonicalName 3563 +#define wxLocale_GetLanguage 3564 +#define wxLocale_GetLanguageName 3565 +#define wxLocale_GetLocale 3566 +#define wxLocale_GetName 3567 +#define wxLocale_GetString_2 3568 +#define wxLocale_GetString_4 3569 +#define wxLocale_GetHeaderValue 3570 +#define wxLocale_GetSysName 3571 +#define wxLocale_GetSystemEncoding 3572 +#define wxLocale_GetSystemEncodingName 3573 +#define wxLocale_GetSystemLanguage 3574 +#define wxLocale_IsLoaded 3575 +#define wxLocale_IsOk 3576 +#define wxActivateEvent_GetActive 3577 +#define wxPopupWindow_new_2 3579 +#define wxPopupWindow_new_0 3580 +#define wxPopupWindow_destruct 3582 +#define wxPopupWindow_Create 3583 +#define wxPopupWindow_Position 3584 +#define wxPopupTransientWindow_new_0 3585 +#define wxPopupTransientWindow_new_2 3586 +#define wxPopupTransientWindow_destruct 3587 +#define wxPopupTransientWindow_Popup 3588 +#define wxPopupTransientWindow_Dismiss 3589 +#define wxOverlay_new 3590 +#define wxOverlay_destruct 3591 +#define wxOverlay_Reset 3592 +#define wxDCOverlay_new_6 3593 +#define wxDCOverlay_new_2 3594 +#define wxDCOverlay_destruct 3595 +#define wxDCOverlay_Clear 3596 +#define wxDropFilesEvent_GetPosition 3597 +#define wxDropFilesEvent_GetNumberOfFiles 3598 +#define wxDropFilesEvent_GetFiles 3599 diff --git a/lib/wx/examples/demo/demo.erl b/lib/wx/examples/demo/demo.erl index 99c28b3177..8b7412017a 100644 --- a/lib/wx/examples/demo/demo.erl +++ b/lib/wx/examples/demo/demo.erl @@ -60,11 +60,15 @@ start_link() -> start_link(Debug) -> wx_object:start_link(?MODULE, Debug, []). +format(#state{log=Log}, Str, Args) -> + wxTextCtrl:appendText(Log, io_lib:format(Str, Args)), + ok; format(Config,Str,Args) -> Log = proplists:get_value(log, Config), wxTextCtrl:appendText(Log, io_lib:format(Str, Args)), ok. + -define(DEBUG_NONE, 101). -define(DEBUG_VERBOSE, 102). -define(DEBUG_TRACE, 103). @@ -97,7 +101,11 @@ init(Options) -> wxFrame:connect(Frame, close_window), _SB = wxFrame:createStatusBar(Frame,[]), - + + %% Setup on toplevel because stc seems to steal this on linux + wxFrame:dragAcceptFiles(Frame, true), + wxFrame:connect(Frame, drop_files), + %% T Uppersplitter %% O Left | Right %% P Widgets|Code | Demo @@ -201,15 +209,15 @@ handle_info({'EXIT',_, shutdown}, State) -> handle_info({'EXIT',_, normal}, State) -> {noreply,State}; handle_info(Msg, State) -> - io:format("Got Info ~p~n",[Msg]), + format(State, "Got Info ~p~n",[Msg]), {noreply,State}. handle_call(Msg, _From, State) -> - io:format("Got Call ~p~n",[Msg]), + format(State, "Got Call ~p~n",[Msg]), {reply,ok,State}. handle_cast(Msg, State) -> - io:format("Got cast ~p~n",[Msg]), + format(State, "Got cast ~p~n",[Msg]), {noreply,State}. %% Async Events are handled in handle_event as in handle_info @@ -286,7 +294,7 @@ handle_event(#wx{event=#wxClose{}}, State = #state{win=Frame}) -> ok = wxFrame:setStatusText(Frame, "Closing...",[]), {stop, normal, State}; handle_event(Ev,State) -> - io:format("~p Got event ~p ~n",[?MODULE, Ev]), + format(State, "~p Got event ~p ~n",[?MODULE, Ev]), {noreply, State}. code_change(_, _, State) -> @@ -364,6 +372,7 @@ code_area(Parent) -> ?stc:setVisiblePolicy(Ed, Policy, 3), %% ?stc:connect(Ed, stc_doubleclick), + %% ?stc:connect(Ed, std_do_drop, fun(Ev, Obj) -> io:format("Ev ~p ~p~n",[Ev,Obj]) end), ?stc:setReadOnly(Ed, true), Ed. diff --git a/lib/wx/include/wx.hrl b/lib/wx/include/wx.hrl index 30baeebb18..a14cc89cee 100644 --- a/lib/wx/include/wx.hrl +++ b/lib/wx/include/wx.hrl @@ -33,31 +33,10 @@ %% Here comes the definitions of all event records. %% they contain the event type and possible some extra information. --record(wxFocus,{type :: wxFocusEventType(), %% Callback event: {@link wxFocusEvent} - win :: wxWindow:wxWindow()}). --type wxFocusEventType() :: 'set_focus' | 'kill_focus'. --type wxFocus() :: #wxFocus{}. %% Callback event: {@link wxFocusEvent} - --record(wxCommand,{type :: wxCommandEventType(), %% Callback event: {@link wxCommandEvent} - cmdString :: unicode:chardata(), - commandInt :: integer(), - extraLong :: integer()}). --type wxCommandEventType() :: 'command_button_clicked' | 'command_checkbox_clicked' | 'command_choice_selected' | 'command_listbox_selected' | 'command_listbox_doubleclicked' | 'command_text_updated' | 'command_text_enter' | 'command_menu_selected' | 'command_slider_updated' | 'command_radiobox_selected' | 'command_radiobutton_selected' | 'command_scrollbar_updated' | 'command_vlbox_selected' | 'command_combobox_selected' | 'command_tool_rclicked' | 'command_tool_enter' | 'command_checklistbox_toggled' | 'command_togglebutton_clicked' | 'command_left_click' | 'command_left_dclick' | 'command_right_click' | 'command_set_focus' | 'command_kill_focus' | 'command_enter'. --type wxCommand() :: #wxCommand{}. %% Callback event: {@link wxCommandEvent} - --record(wxColourPicker,{type :: wxColourPickerEventType(), %% Callback event: {@link wxColourPickerEvent} - colour :: wx:wx_colour()}). --type wxColourPickerEventType() :: 'command_colourpicker_changed'. --type wxColourPicker() :: #wxColourPicker{}. %% Callback event: {@link wxColourPickerEvent} - --record(wxHelp, {type :: wxHelpEventType()}). %% Callback event: {@link wxHelpEvent} --type wxHelpEventType() :: 'help' | 'detailed_help'. --type wxHelp() :: #wxHelp{}. %% Callback event: {@link wxHelpEvent} - --record(wxSpin,{type :: wxSpinEventType(), %% Callback event: {@link wxSpinEvent} - commandInt :: integer()}). --type wxSpinEventType() :: 'command_spinctrl_updated' | 'spin_up' | 'spin_down' | 'spin'. --type wxSpin() :: #wxSpin{}. %% Callback event: {@link wxSpinEvent} +-record(wxActivate,{type :: wxActivateEventType(), %% Callback event: {@link wxActivateEvent} + active :: boolean()}). +-type wxActivateEventType() :: 'activate' | 'activate_app' | 'hibernate'. +-type wxActivate() :: #wxActivate{}. %% Callback event: {@link wxActivateEvent} -record(wxAuiManager,{type :: wxAuiManagerEventType(), %% Callback event: {@link wxAuiManagerEvent} manager :: wxAuiManager:wxAuiManager(), @@ -69,68 +48,83 @@ -type wxAuiManagerEventType() :: 'aui_pane_button' | 'aui_pane_close' | 'aui_pane_maximize' | 'aui_pane_restore' | 'aui_pane_activated' | 'aui_render' | 'aui_find_manager'. -type wxAuiManager() :: #wxAuiManager{}. %% Callback event: {@link wxAuiManagerEvent} --record(wxDate,{type :: wxDateEventType(), %% Callback event: {@link wxDateEvent} +-record(wxAuiNotebook,{type :: wxAuiNotebookEventType(), %% Callback event: {@link wxAuiNotebookEvent} + old_selection :: integer(), + selection :: integer(), + drag_source :: wxAuiNotebook:wxAuiNotebook()}). +-type wxAuiNotebookEventType() :: 'command_auinotebook_page_close' | 'command_auinotebook_page_changed' | 'command_auinotebook_page_changing' | 'command_auinotebook_button' | 'command_auinotebook_begin_drag' | 'command_auinotebook_end_drag' | 'command_auinotebook_drag_motion' | 'command_auinotebook_allow_dnd' | 'command_auinotebook_tab_middle_down' | 'command_auinotebook_tab_middle_up' | 'command_auinotebook_tab_right_down' | 'command_auinotebook_tab_right_up' | 'command_auinotebook_page_closed' | 'command_auinotebook_drag_done' | 'command_auinotebook_bg_dclick'. +-type wxAuiNotebook() :: #wxAuiNotebook{}. %% Callback event: {@link wxAuiNotebookEvent} + +-record(wxCalendar,{type :: wxCalendarEventType(), %% Callback event: {@link wxCalendarEvent} + wday :: wx:wx_enum(), date :: wx:wx_datetime()}). --type wxDateEventType() :: 'date_changed'. --type wxDate() :: #wxDate{}. %% Callback event: {@link wxDateEvent} +-type wxCalendarEventType() :: 'calendar_sel_changed' | 'calendar_day_changed' | 'calendar_month_changed' | 'calendar_year_changed' | 'calendar_doubleclicked' | 'calendar_weekday_clicked'. +-type wxCalendar() :: #wxCalendar{}. %% Callback event: {@link wxCalendarEvent} --record(wxIconize,{type :: wxIconizeEventType(), %% Callback event: {@link wxIconizeEvent} - iconized :: boolean()}). --type wxIconizeEventType() :: 'iconize'. --type wxIconize() :: #wxIconize{}. %% Callback event: {@link wxIconizeEvent} +-record(wxChildFocus, {type :: wxChildFocusEventType()}). %% Callback event: {@link wxChildFocusEvent} +-type wxChildFocusEventType() :: 'child_focus'. +-type wxChildFocus() :: #wxChildFocus{}. %% Callback event: {@link wxChildFocusEvent} --record(wxScroll,{type :: wxScrollEventType(), %% Callback event: {@link wxScrollEvent} - commandInt :: integer(), - extraLong :: integer()}). --type wxScrollEventType() :: 'scroll_top' | 'scroll_bottom' | 'scroll_lineup' | 'scroll_linedown' | 'scroll_pageup' | 'scroll_pagedown' | 'scroll_thumbtrack' | 'scroll_thumbrelease' | 'scroll_changed'. --type wxScroll() :: #wxScroll{}. %% Callback event: {@link wxScrollEvent} +-record(wxClipboardText, {type :: wxClipboardTextEventType()}). %% Callback event: {@link wxClipboardTextEvent} +-type wxClipboardTextEventType() :: 'command_text_copy' | 'command_text_cut' | 'command_text_paste'. +-type wxClipboardText() :: #wxClipboardText{}. %% Callback event: {@link wxClipboardTextEvent} --record(wxSplitter, {type :: wxSplitterEventType()}). %% Callback event: {@link wxSplitterEvent} --type wxSplitterEventType() :: 'command_splitter_sash_pos_changed' | 'command_splitter_sash_pos_changing' | 'command_splitter_doubleclicked' | 'command_splitter_unsplit'. --type wxSplitter() :: #wxSplitter{}. %% Callback event: {@link wxSplitterEvent} +-record(wxClose, {type :: wxCloseEventType()}). %% Callback event: {@link wxCloseEvent} +-type wxCloseEventType() :: 'close_window' | 'end_session' | 'query_end_session'. +-type wxClose() :: #wxClose{}. %% Callback event: {@link wxCloseEvent} --record(wxPaletteChanged, {type :: wxPaletteChangedEventType()}). %% Callback event: {@link wxPaletteChangedEvent} --type wxPaletteChangedEventType() :: 'palette_changed'. --type wxPaletteChanged() :: #wxPaletteChanged{}. %% Callback event: {@link wxPaletteChangedEvent} +-record(wxColourPicker,{type :: wxColourPickerEventType(), %% Callback event: {@link wxColourPickerEvent} + colour :: wx:wx_colour()}). +-type wxColourPickerEventType() :: 'command_colourpicker_changed'. +-type wxColourPicker() :: #wxColourPicker{}. %% Callback event: {@link wxColourPickerEvent} --record(wxNotebook,{type :: wxNotebookEventType(), %% Callback event: {@link wxNotebookEvent} - nSel :: integer(), - nOldSel :: integer()}). --type wxNotebookEventType() :: 'command_notebook_page_changed' | 'command_notebook_page_changing'. --type wxNotebook() :: #wxNotebook{}. %% Callback event: {@link wxNotebookEvent} +-record(wxCommand,{type :: wxCommandEventType(), %% Callback event: {@link wxCommandEvent} + cmdString :: unicode:chardata(), + commandInt :: integer(), + extraLong :: integer()}). +-type wxCommandEventType() :: 'command_button_clicked' | 'command_checkbox_clicked' | 'command_choice_selected' | 'command_listbox_selected' | 'command_listbox_doubleclicked' | 'command_text_updated' | 'command_text_enter' | 'command_menu_selected' | 'command_slider_updated' | 'command_radiobox_selected' | 'command_radiobutton_selected' | 'command_scrollbar_updated' | 'command_vlbox_selected' | 'command_combobox_selected' | 'command_tool_rclicked' | 'command_tool_enter' | 'command_checklistbox_toggled' | 'command_togglebutton_clicked' | 'command_left_click' | 'command_left_dclick' | 'command_right_click' | 'command_set_focus' | 'command_kill_focus' | 'command_enter'. +-type wxCommand() :: #wxCommand{}. %% Callback event: {@link wxCommandEvent} -record(wxContextMenu,{type :: wxContextMenuEventType(), %% Callback event: {@link wxContextMenuEvent} pos :: {X::integer(), Y::integer()}}). -type wxContextMenuEventType() :: 'context_menu'. -type wxContextMenu() :: #wxContextMenu{}. %% Callback event: {@link wxContextMenuEvent} --record(wxFontPicker,{type :: wxFontPickerEventType(), %% Callback event: {@link wxFontPickerEvent} - font :: wxFont:wxFont()}). --type wxFontPickerEventType() :: 'command_fontpicker_changed'. --type wxFontPicker() :: #wxFontPicker{}. %% Callback event: {@link wxFontPickerEvent} +-record(wxDate,{type :: wxDateEventType(), %% Callback event: {@link wxDateEvent} + date :: wx:wx_datetime()}). +-type wxDateEventType() :: 'date_changed'. +-type wxDate() :: #wxDate{}. %% Callback event: {@link wxDateEvent} --record(wxChildFocus, {type :: wxChildFocusEventType()}). %% Callback event: {@link wxChildFocusEvent} --type wxChildFocusEventType() :: 'child_focus'. --type wxChildFocus() :: #wxChildFocus{}. %% Callback event: {@link wxChildFocusEvent} +-record(wxDisplayChanged, {type :: wxDisplayChangedEventType()}). %% Callback event: {@link wxDisplayChangedEvent} +-type wxDisplayChangedEventType() :: 'display_changed'. +-type wxDisplayChanged() :: #wxDisplayChanged{}. %% Callback event: {@link wxDisplayChangedEvent} --record(wxTaskBarIcon, {type :: wxTaskBarIconEventType()}). %% Callback event: {@link wxTaskBarIconEvent} --type wxTaskBarIconEventType() :: 'taskbar_move' | 'taskbar_left_down' | 'taskbar_left_up' | 'taskbar_right_down' | 'taskbar_right_up' | 'taskbar_left_dclick' | 'taskbar_right_dclick'. --type wxTaskBarIcon() :: #wxTaskBarIcon{}. %% Callback event: {@link wxTaskBarIconEvent} +-record(wxDropFiles,{type :: wxDropFilesEventType(), %% Callback event: {@link wxDropFilesEvent} + noFiles :: integer(), + pos :: {X::integer(), Y::integer()}, + files :: [unicode:chardata()]}). +-type wxDropFilesEventType() :: 'drop_files'. +-type wxDropFiles() :: #wxDropFiles{}. %% Callback event: {@link wxDropFilesEvent} --record(wxWindowDestroy, {type :: wxWindowDestroyEventType()}). %% Callback event: {@link wxWindowDestroyEvent} --type wxWindowDestroyEventType() :: 'destroy'. --type wxWindowDestroy() :: #wxWindowDestroy{}. %% Callback event: {@link wxWindowDestroyEvent} +-record(wxErase,{type :: wxEraseEventType(), %% Callback event: {@link wxEraseEvent} + dc :: wxDC:wxDC()}). +-type wxEraseEventType() :: 'erase_background'. +-type wxErase() :: #wxErase{}. %% Callback event: {@link wxEraseEvent} --record(wxMenu,{type :: wxMenuEventType(), %% Callback event: {@link wxMenuEvent} - menuId :: integer(), - menu :: wxMenu:wxMenu()}). --type wxMenuEventType() :: 'menu_open' | 'menu_close' | 'menu_highlight'. --type wxMenu() :: #wxMenu{}. %% Callback event: {@link wxMenuEvent} +-record(wxFileDirPicker,{type :: wxFileDirPickerEventType(), %% Callback event: {@link wxFileDirPickerEvent} + path :: unicode:chardata()}). +-type wxFileDirPickerEventType() :: 'command_filepicker_changed' | 'command_dirpicker_changed'. +-type wxFileDirPicker() :: #wxFileDirPicker{}. %% Callback event: {@link wxFileDirPickerEvent} --record(wxActivate,{type :: wxActivateEventType(), %% Callback event: {@link wxActivateEvent} - active :: boolean()}). --type wxActivateEventType() :: 'activate' | 'activate_app' | 'hibernate'. --type wxActivate() :: #wxActivate{}. %% Callback event: {@link wxActivateEvent} +-record(wxFocus,{type :: wxFocusEventType(), %% Callback event: {@link wxFocusEvent} + win :: wxWindow:wxWindow()}). +-type wxFocusEventType() :: 'set_focus' | 'kill_focus'. +-type wxFocus() :: #wxFocus{}. %% Callback event: {@link wxFocusEvent} + +-record(wxFontPicker,{type :: wxFontPickerEventType(), %% Callback event: {@link wxFontPickerEvent} + font :: wxFont:wxFont()}). +-type wxFontPickerEventType() :: 'command_fontpicker_changed'. +-type wxFontPicker() :: #wxFontPicker{}. %% Callback event: {@link wxFontPickerEvent} -record(wxGrid,{type :: wxGridEventType(), %% Callback event: {@link wxGridEvent} row :: integer(), @@ -145,64 +139,27 @@ -type wxGridEventType() :: 'grid_cell_left_click' | 'grid_cell_right_click' | 'grid_cell_left_dclick' | 'grid_cell_right_dclick' | 'grid_label_left_click' | 'grid_label_right_click' | 'grid_label_left_dclick' | 'grid_label_right_dclick' | 'grid_row_size' | 'grid_col_size' | 'grid_range_select' | 'grid_cell_change' | 'grid_select_cell' | 'grid_editor_shown' | 'grid_editor_hidden' | 'grid_editor_created' | 'grid_cell_begin_drag'. -type wxGrid() :: #wxGrid{}. %% Callback event: {@link wxGridEvent} --record(wxPaint, {type :: wxPaintEventType()}). %% Callback event: {@link wxPaintEvent} --type wxPaintEventType() :: 'paint'. --type wxPaint() :: #wxPaint{}. %% Callback event: {@link wxPaintEvent} - --record(wxShow,{type :: wxShowEventType(), %% Callback event: {@link wxShowEvent} - show :: boolean()}). --type wxShowEventType() :: 'show'. --type wxShow() :: #wxShow{}. %% Callback event: {@link wxShowEvent} - --record(wxStyledText,{type :: wxStyledTextEventType(), %% Callback event: {@link wxStyledTextEvent} - position :: integer(), - key :: integer(), - modifiers :: integer(), - modificationType :: integer(), - text :: unicode:chardata(), - length :: integer(), - linesAdded :: integer(), - line :: integer(), - foldLevelNow :: integer(), - foldLevelPrev :: integer(), - margin :: integer(), - message :: integer(), - wParam :: integer(), - lParam :: integer(), - listType :: integer(), - x :: integer(), - y :: integer(), - dragText :: unicode:chardata(), - dragAllowMove :: boolean(), - dragResult :: wx:wx_enum()}). --type wxStyledTextEventType() :: 'stc_change' | 'stc_styleneeded' | 'stc_charadded' | 'stc_savepointreached' | 'stc_savepointleft' | 'stc_romodifyattempt' | 'stc_key' | 'stc_doubleclick' | 'stc_updateui' | 'stc_modified' | 'stc_macrorecord' | 'stc_marginclick' | 'stc_needshown' | 'stc_painted' | 'stc_userlistselection' | 'stc_uridropped' | 'stc_dwellstart' | 'stc_dwellend' | 'stc_start_drag' | 'stc_drag_over' | 'stc_do_drop' | 'stc_zoom' | 'stc_hotspot_click' | 'stc_hotspot_dclick' | 'stc_calltip_click' | 'stc_autocomp_selection'. --type wxStyledText() :: #wxStyledText{}. %% Callback event: {@link wxStyledTextEvent} +-record(wxHelp, {type :: wxHelpEventType()}). %% Callback event: {@link wxHelpEvent} +-type wxHelpEventType() :: 'help' | 'detailed_help'. +-type wxHelp() :: #wxHelp{}. %% Callback event: {@link wxHelpEvent} --record(wxAuiNotebook,{type :: wxAuiNotebookEventType(), %% Callback event: {@link wxAuiNotebookEvent} - old_selection :: integer(), - selection :: integer(), - drag_source :: wxAuiNotebook:wxAuiNotebook()}). --type wxAuiNotebookEventType() :: 'command_auinotebook_page_close' | 'command_auinotebook_page_changed' | 'command_auinotebook_page_changing' | 'command_auinotebook_button' | 'command_auinotebook_begin_drag' | 'command_auinotebook_end_drag' | 'command_auinotebook_drag_motion' | 'command_auinotebook_allow_dnd' | 'command_auinotebook_tab_middle_down' | 'command_auinotebook_tab_middle_up' | 'command_auinotebook_tab_right_down' | 'command_auinotebook_tab_right_up' | 'command_auinotebook_page_closed' | 'command_auinotebook_drag_done' | 'command_auinotebook_bg_dclick'. --type wxAuiNotebook() :: #wxAuiNotebook{}. %% Callback event: {@link wxAuiNotebookEvent} +-record(wxHtmlLink,{type :: wxHtmlLinkEventType(), %% Callback event: {@link wxHtmlLinkEvent} + linkInfo :: wx:wx_wxHtmlLinkInfo()}). +-type wxHtmlLinkEventType() :: 'command_html_link_clicked'. +-type wxHtmlLink() :: #wxHtmlLink{}. %% Callback event: {@link wxHtmlLinkEvent} --record(wxList,{type :: wxListEventType(), %% Callback event: {@link wxListEvent} - code :: integer(), - oldItemIndex :: integer(), - itemIndex :: integer(), - col :: integer(), - pointDrag :: {X::integer(), Y::integer()}}). --type wxListEventType() :: 'command_list_begin_drag' | 'command_list_begin_rdrag' | 'command_list_begin_label_edit' | 'command_list_end_label_edit' | 'command_list_delete_item' | 'command_list_delete_all_items' | 'command_list_key_down' | 'command_list_insert_item' | 'command_list_col_click' | 'command_list_col_right_click' | 'command_list_col_begin_drag' | 'command_list_col_dragging' | 'command_list_col_end_drag' | 'command_list_item_selected' | 'command_list_item_deselected' | 'command_list_item_right_click' | 'command_list_item_middle_click' | 'command_list_item_activated' | 'command_list_item_focused' | 'command_list_cache_hint'. --type wxList() :: #wxList{}. %% Callback event: {@link wxListEvent} +-record(wxIconize,{type :: wxIconizeEventType(), %% Callback event: {@link wxIconizeEvent} + iconized :: boolean()}). +-type wxIconizeEventType() :: 'iconize'. +-type wxIconize() :: #wxIconize{}. %% Callback event: {@link wxIconizeEvent} --record(wxUpdateUI, {type :: wxUpdateUIEventType()}). %% Callback event: {@link wxUpdateUIEvent} --type wxUpdateUIEventType() :: 'update_ui'. --type wxUpdateUI() :: #wxUpdateUI{}. %% Callback event: {@link wxUpdateUIEvent} +-record(wxIdle, {type :: wxIdleEventType()}). %% Callback event: {@link wxIdleEvent} +-type wxIdleEventType() :: 'idle'. +-type wxIdle() :: #wxIdle{}. %% Callback event: {@link wxIdleEvent} --record(wxScrollWin,{type :: wxScrollWinEventType(), %% Callback event: {@link wxScrollWinEvent} - commandInt :: integer(), - extraLong :: integer()}). --type wxScrollWinEventType() :: 'scrollwin_top' | 'scrollwin_bottom' | 'scrollwin_lineup' | 'scrollwin_linedown' | 'scrollwin_pageup' | 'scrollwin_pagedown' | 'scrollwin_thumbtrack' | 'scrollwin_thumbrelease'. --type wxScrollWin() :: #wxScrollWin{}. %% Callback event: {@link wxScrollWinEvent} +-record(wxInitDialog, {type :: wxInitDialogEventType()}). %% Callback event: {@link wxInitDialogEvent} +-type wxInitDialogEventType() :: 'init_dialog'. +-type wxInitDialog() :: #wxInitDialog{}. %% Callback event: {@link wxInitDialogEvent} -record(wxJoystick,{type :: wxJoystickEventType(), %% Callback event: {@link wxJoystickEvent} pos :: {X::integer(), Y::integer()}, @@ -213,14 +170,6 @@ -type wxJoystickEventType() :: 'joy_button_down' | 'joy_button_up' | 'joy_move' | 'joy_zmove'. -type wxJoystick() :: #wxJoystick{}. %% Callback event: {@link wxJoystickEvent} --record(wxWindowCreate, {type :: wxWindowCreateEventType()}). %% Callback event: {@link wxWindowCreateEvent} --type wxWindowCreateEventType() :: 'create'. --type wxWindowCreate() :: #wxWindowCreate{}. %% Callback event: {@link wxWindowCreateEvent} - --record(wxClose, {type :: wxCloseEventType()}). %% Callback event: {@link wxCloseEvent} --type wxCloseEventType() :: 'close_window' | 'end_session' | 'query_end_session'. --type wxClose() :: #wxClose{}. %% Callback event: {@link wxCloseEvent} - -record(wxKey,{type :: wxKeyEventType(), %% Callback event: {@link wxKeyEvent} x :: integer(), y :: integer(), @@ -236,55 +185,32 @@ -type wxKeyEventType() :: 'char' | 'char_hook' | 'key_down' | 'key_up'. -type wxKey() :: #wxKey{}. %% Callback event: {@link wxKeyEvent} --record(wxIdle, {type :: wxIdleEventType()}). %% Callback event: {@link wxIdleEvent} --type wxIdleEventType() :: 'idle'. --type wxIdle() :: #wxIdle{}. %% Callback event: {@link wxIdleEvent} - --record(wxQueryNewPalette, {type :: wxQueryNewPaletteEventType()}). %% Callback event: {@link wxQueryNewPaletteEvent} --type wxQueryNewPaletteEventType() :: 'query_new_palette'. --type wxQueryNewPalette() :: #wxQueryNewPalette{}. %% Callback event: {@link wxQueryNewPaletteEvent} - --record(wxHtmlLink,{type :: wxHtmlLinkEventType(), %% Callback event: {@link wxHtmlLinkEvent} - linkInfo :: wx:wx_wxHtmlLinkInfo()}). --type wxHtmlLinkEventType() :: 'command_html_link_clicked'. --type wxHtmlLink() :: #wxHtmlLink{}. %% Callback event: {@link wxHtmlLinkEvent} - --record(wxInitDialog, {type :: wxInitDialogEventType()}). %% Callback event: {@link wxInitDialogEvent} --type wxInitDialogEventType() :: 'init_dialog'. --type wxInitDialog() :: #wxInitDialog{}. %% Callback event: {@link wxInitDialogEvent} +-record(wxList,{type :: wxListEventType(), %% Callback event: {@link wxListEvent} + code :: integer(), + oldItemIndex :: integer(), + itemIndex :: integer(), + col :: integer(), + pointDrag :: {X::integer(), Y::integer()}}). +-type wxListEventType() :: 'command_list_begin_drag' | 'command_list_begin_rdrag' | 'command_list_begin_label_edit' | 'command_list_end_label_edit' | 'command_list_delete_item' | 'command_list_delete_all_items' | 'command_list_key_down' | 'command_list_insert_item' | 'command_list_col_click' | 'command_list_col_right_click' | 'command_list_col_begin_drag' | 'command_list_col_dragging' | 'command_list_col_end_drag' | 'command_list_item_selected' | 'command_list_item_deselected' | 'command_list_item_right_click' | 'command_list_item_middle_click' | 'command_list_item_activated' | 'command_list_item_focused' | 'command_list_cache_hint'. +-type wxList() :: #wxList{}. %% Callback event: {@link wxListEvent} -record(wxMaximize, {type :: wxMaximizeEventType()}). %% Callback event: {@link wxMaximizeEvent} -type wxMaximizeEventType() :: 'maximize'. -type wxMaximize() :: #wxMaximize{}. %% Callback event: {@link wxMaximizeEvent} --record(wxClipboardText, {type :: wxClipboardTextEventType()}). %% Callback event: {@link wxClipboardTextEvent} --type wxClipboardTextEventType() :: 'command_text_copy' | 'command_text_cut' | 'command_text_paste'. --type wxClipboardText() :: #wxClipboardText{}. %% Callback event: {@link wxClipboardTextEvent} - --record(wxTree,{type :: wxTreeEventType(), %% Callback event: {@link wxTreeEvent} - item :: integer(), - itemOld :: integer(), - pointDrag :: {X::integer(), Y::integer()}}). --type wxTreeEventType() :: 'command_tree_begin_drag' | 'command_tree_begin_rdrag' | 'command_tree_begin_label_edit' | 'command_tree_end_label_edit' | 'command_tree_delete_item' | 'command_tree_get_info' | 'command_tree_set_info' | 'command_tree_item_expanded' | 'command_tree_item_expanding' | 'command_tree_item_collapsed' | 'command_tree_item_collapsing' | 'command_tree_sel_changed' | 'command_tree_sel_changing' | 'command_tree_key_down' | 'command_tree_item_activated' | 'command_tree_item_right_click' | 'command_tree_item_middle_click' | 'command_tree_end_drag' | 'command_tree_state_image_click' | 'command_tree_item_gettooltip' | 'command_tree_item_menu'. --type wxTree() :: #wxTree{}. %% Callback event: {@link wxTreeEvent} - --record(wxErase,{type :: wxEraseEventType(), %% Callback event: {@link wxEraseEvent} - dc :: wxDC:wxDC()}). --type wxEraseEventType() :: 'erase_background'. --type wxErase() :: #wxErase{}. %% Callback event: {@link wxEraseEvent} +-record(wxMenu,{type :: wxMenuEventType(), %% Callback event: {@link wxMenuEvent} + menuId :: integer(), + menu :: wxMenu:wxMenu()}). +-type wxMenuEventType() :: 'menu_open' | 'menu_close' | 'menu_highlight'. +-type wxMenu() :: #wxMenu{}. %% Callback event: {@link wxMenuEvent} --record(wxSash,{type :: wxSashEventType(), %% Callback event: {@link wxSashEvent} - edge :: wx:wx_enum(), - dragRect :: {X::integer(), Y::integer(), W::integer(), H::integer()}, - dragStatus :: wx:wx_enum()}). --type wxSashEventType() :: 'sash_dragged'. --type wxSash() :: #wxSash{}. %% Callback event: {@link wxSashEvent} +-record(wxMouseCaptureChanged, {type :: wxMouseCaptureChangedEventType()}). %% Callback event: {@link wxMouseCaptureChangedEvent} +-type wxMouseCaptureChangedEventType() :: 'mouse_capture_changed'. +-type wxMouseCaptureChanged() :: #wxMouseCaptureChanged{}. %% Callback event: {@link wxMouseCaptureChangedEvent} --record(wxCalendar,{type :: wxCalendarEventType(), %% Callback event: {@link wxCalendarEvent} - wday :: wx:wx_enum(), - date :: wx:wx_datetime()}). --type wxCalendarEventType() :: 'calendar_sel_changed' | 'calendar_day_changed' | 'calendar_month_changed' | 'calendar_year_changed' | 'calendar_doubleclicked' | 'calendar_weekday_clicked'. --type wxCalendar() :: #wxCalendar{}. %% Callback event: {@link wxCalendarEvent} +-record(wxMouseCaptureLost, {type :: wxMouseCaptureLostEventType()}). %% Callback event: {@link wxMouseCaptureLostEvent} +-type wxMouseCaptureLostEventType() :: 'mouse_capture_lost'. +-type wxMouseCaptureLost() :: #wxMouseCaptureLost{}. %% Callback event: {@link wxMouseCaptureLostEvent} -record(wxMouse,{type :: wxMouseEventType(), %% Callback event: {@link wxMouseEvent} x :: integer(), @@ -302,20 +228,6 @@ -type wxMouseEventType() :: 'left_down' | 'left_up' | 'middle_down' | 'middle_up' | 'right_down' | 'right_up' | 'motion' | 'enter_window' | 'leave_window' | 'left_dclick' | 'middle_dclick' | 'right_dclick' | 'mousewheel'. -type wxMouse() :: #wxMouse{}. %% Callback event: {@link wxMouseEvent} --record(wxSize,{type :: wxSizeEventType(), %% Callback event: {@link wxSizeEvent} - size :: {W::integer(), H::integer()}, - rect :: {X::integer(), Y::integer(), W::integer(), H::integer()}}). --type wxSizeEventType() :: 'size'. --type wxSize() :: #wxSize{}. %% Callback event: {@link wxSizeEvent} - --record(wxSysColourChanged, {type :: wxSysColourChangedEventType()}). %% Callback event: {@link wxSysColourChangedEvent} --type wxSysColourChangedEventType() :: 'sys_colour_changed'. --type wxSysColourChanged() :: #wxSysColourChanged{}. %% Callback event: {@link wxSysColourChangedEvent} - --record(wxDisplayChanged, {type :: wxDisplayChangedEventType()}). %% Callback event: {@link wxDisplayChangedEvent} --type wxDisplayChangedEventType() :: 'display_changed'. --type wxDisplayChanged() :: #wxDisplayChanged{}. %% Callback event: {@link wxDisplayChangedEvent} - -record(wxMove,{type :: wxMoveEventType(), %% Callback event: {@link wxMoveEvent} pos :: {X::integer(), Y::integer()}, rect :: {X::integer(), Y::integer(), W::integer(), H::integer()}}). @@ -328,10 +240,42 @@ -type wxNavigationKeyEventType() :: 'navigation_key'. -type wxNavigationKey() :: #wxNavigationKey{}. %% Callback event: {@link wxNavigationKeyEvent} --record(wxFileDirPicker,{type :: wxFileDirPickerEventType(), %% Callback event: {@link wxFileDirPickerEvent} - path :: unicode:chardata()}). --type wxFileDirPickerEventType() :: 'command_filepicker_changed' | 'command_dirpicker_changed'. --type wxFileDirPicker() :: #wxFileDirPicker{}. %% Callback event: {@link wxFileDirPickerEvent} +-record(wxNotebook,{type :: wxNotebookEventType(), %% Callback event: {@link wxNotebookEvent} + nSel :: integer(), + nOldSel :: integer()}). +-type wxNotebookEventType() :: 'command_notebook_page_changed' | 'command_notebook_page_changing'. +-type wxNotebook() :: #wxNotebook{}. %% Callback event: {@link wxNotebookEvent} + +-record(wxPaint, {type :: wxPaintEventType()}). %% Callback event: {@link wxPaintEvent} +-type wxPaintEventType() :: 'paint'. +-type wxPaint() :: #wxPaint{}. %% Callback event: {@link wxPaintEvent} + +-record(wxPaletteChanged, {type :: wxPaletteChangedEventType()}). %% Callback event: {@link wxPaletteChangedEvent} +-type wxPaletteChangedEventType() :: 'palette_changed'. +-type wxPaletteChanged() :: #wxPaletteChanged{}. %% Callback event: {@link wxPaletteChangedEvent} + +-record(wxQueryNewPalette, {type :: wxQueryNewPaletteEventType()}). %% Callback event: {@link wxQueryNewPaletteEvent} +-type wxQueryNewPaletteEventType() :: 'query_new_palette'. +-type wxQueryNewPalette() :: #wxQueryNewPalette{}. %% Callback event: {@link wxQueryNewPaletteEvent} + +-record(wxSash,{type :: wxSashEventType(), %% Callback event: {@link wxSashEvent} + edge :: wx:wx_enum(), + dragRect :: {X::integer(), Y::integer(), W::integer(), H::integer()}, + dragStatus :: wx:wx_enum()}). +-type wxSashEventType() :: 'sash_dragged'. +-type wxSash() :: #wxSash{}. %% Callback event: {@link wxSashEvent} + +-record(wxScroll,{type :: wxScrollEventType(), %% Callback event: {@link wxScrollEvent} + commandInt :: integer(), + extraLong :: integer()}). +-type wxScrollEventType() :: 'scroll_top' | 'scroll_bottom' | 'scroll_lineup' | 'scroll_linedown' | 'scroll_pageup' | 'scroll_pagedown' | 'scroll_thumbtrack' | 'scroll_thumbrelease' | 'scroll_changed'. +-type wxScroll() :: #wxScroll{}. %% Callback event: {@link wxScrollEvent} + +-record(wxScrollWin,{type :: wxScrollWinEventType(), %% Callback event: {@link wxScrollWinEvent} + commandInt :: integer(), + extraLong :: integer()}). +-type wxScrollWinEventType() :: 'scrollwin_top' | 'scrollwin_bottom' | 'scrollwin_lineup' | 'scrollwin_linedown' | 'scrollwin_pageup' | 'scrollwin_pagedown' | 'scrollwin_thumbtrack' | 'scrollwin_thumbrelease'. +-type wxScrollWin() :: #wxScrollWin{}. %% Callback event: {@link wxScrollWinEvent} -record(wxSetCursor,{type :: wxSetCursorEventType(), %% Callback event: {@link wxSetCursorEvent} x :: integer(), @@ -340,16 +284,79 @@ -type wxSetCursorEventType() :: 'set_cursor'. -type wxSetCursor() :: #wxSetCursor{}. %% Callback event: {@link wxSetCursorEvent} --record(wxMouseCaptureChanged, {type :: wxMouseCaptureChangedEventType()}). %% Callback event: {@link wxMouseCaptureChangedEvent} --type wxMouseCaptureChangedEventType() :: 'mouse_capture_changed'. --type wxMouseCaptureChanged() :: #wxMouseCaptureChanged{}. %% Callback event: {@link wxMouseCaptureChangedEvent} +-record(wxShow,{type :: wxShowEventType(), %% Callback event: {@link wxShowEvent} + show :: boolean()}). +-type wxShowEventType() :: 'show'. +-type wxShow() :: #wxShow{}. %% Callback event: {@link wxShowEvent} --record(wxMouseCaptureLost, {type :: wxMouseCaptureLostEventType()}). %% Callback event: {@link wxMouseCaptureLostEvent} --type wxMouseCaptureLostEventType() :: 'mouse_capture_lost'. --type wxMouseCaptureLost() :: #wxMouseCaptureLost{}. %% Callback event: {@link wxMouseCaptureLostEvent} +-record(wxSize,{type :: wxSizeEventType(), %% Callback event: {@link wxSizeEvent} + size :: {W::integer(), H::integer()}, + rect :: {X::integer(), Y::integer(), W::integer(), H::integer()}}). +-type wxSizeEventType() :: 'size'. +-type wxSize() :: #wxSize{}. %% Callback event: {@link wxSizeEvent} + +-record(wxSpin,{type :: wxSpinEventType(), %% Callback event: {@link wxSpinEvent} + commandInt :: integer()}). +-type wxSpinEventType() :: 'command_spinctrl_updated' | 'spin_up' | 'spin_down' | 'spin'. +-type wxSpin() :: #wxSpin{}. %% Callback event: {@link wxSpinEvent} + +-record(wxSplitter, {type :: wxSplitterEventType()}). %% Callback event: {@link wxSplitterEvent} +-type wxSplitterEventType() :: 'command_splitter_sash_pos_changed' | 'command_splitter_sash_pos_changing' | 'command_splitter_doubleclicked' | 'command_splitter_unsplit'. +-type wxSplitter() :: #wxSplitter{}. %% Callback event: {@link wxSplitterEvent} + +-record(wxStyledText,{type :: wxStyledTextEventType(), %% Callback event: {@link wxStyledTextEvent} + position :: integer(), + key :: integer(), + modifiers :: integer(), + modificationType :: integer(), + text :: unicode:chardata(), + length :: integer(), + linesAdded :: integer(), + line :: integer(), + foldLevelNow :: integer(), + foldLevelPrev :: integer(), + margin :: integer(), + message :: integer(), + wParam :: integer(), + lParam :: integer(), + listType :: integer(), + x :: integer(), + y :: integer(), + dragText :: unicode:chardata(), + dragAllowMove :: boolean(), + dragResult :: wx:wx_enum()}). +-type wxStyledTextEventType() :: 'stc_change' | 'stc_styleneeded' | 'stc_charadded' | 'stc_savepointreached' | 'stc_savepointleft' | 'stc_romodifyattempt' | 'stc_key' | 'stc_doubleclick' | 'stc_updateui' | 'stc_modified' | 'stc_macrorecord' | 'stc_marginclick' | 'stc_needshown' | 'stc_painted' | 'stc_userlistselection' | 'stc_uridropped' | 'stc_dwellstart' | 'stc_dwellend' | 'stc_start_drag' | 'stc_drag_over' | 'stc_do_drop' | 'stc_zoom' | 'stc_hotspot_click' | 'stc_hotspot_dclick' | 'stc_calltip_click' | 'stc_autocomp_selection'. +-type wxStyledText() :: #wxStyledText{}. %% Callback event: {@link wxStyledTextEvent} + +-record(wxSysColourChanged, {type :: wxSysColourChangedEventType()}). %% Callback event: {@link wxSysColourChangedEvent} +-type wxSysColourChangedEventType() :: 'sys_colour_changed'. +-type wxSysColourChanged() :: #wxSysColourChanged{}. %% Callback event: {@link wxSysColourChangedEvent} + +-record(wxTaskBarIcon, {type :: wxTaskBarIconEventType()}). %% Callback event: {@link wxTaskBarIconEvent} +-type wxTaskBarIconEventType() :: 'taskbar_move' | 'taskbar_left_down' | 'taskbar_left_up' | 'taskbar_right_down' | 'taskbar_right_up' | 'taskbar_left_dclick' | 'taskbar_right_dclick'. +-type wxTaskBarIcon() :: #wxTaskBarIcon{}. %% Callback event: {@link wxTaskBarIconEvent} + +-record(wxTree,{type :: wxTreeEventType(), %% Callback event: {@link wxTreeEvent} + item :: integer(), + itemOld :: integer(), + pointDrag :: {X::integer(), Y::integer()}}). +-type wxTreeEventType() :: 'command_tree_begin_drag' | 'command_tree_begin_rdrag' | 'command_tree_begin_label_edit' | 'command_tree_end_label_edit' | 'command_tree_delete_item' | 'command_tree_get_info' | 'command_tree_set_info' | 'command_tree_item_expanded' | 'command_tree_item_expanding' | 'command_tree_item_collapsed' | 'command_tree_item_collapsing' | 'command_tree_sel_changed' | 'command_tree_sel_changing' | 'command_tree_key_down' | 'command_tree_item_activated' | 'command_tree_item_right_click' | 'command_tree_item_middle_click' | 'command_tree_end_drag' | 'command_tree_state_image_click' | 'command_tree_item_gettooltip' | 'command_tree_item_menu'. +-type wxTree() :: #wxTree{}. %% Callback event: {@link wxTreeEvent} + +-record(wxUpdateUI, {type :: wxUpdateUIEventType()}). %% Callback event: {@link wxUpdateUIEvent} +-type wxUpdateUIEventType() :: 'update_ui'. +-type wxUpdateUI() :: #wxUpdateUI{}. %% Callback event: {@link wxUpdateUIEvent} + +-record(wxWindowCreate, {type :: wxWindowCreateEventType()}). %% Callback event: {@link wxWindowCreateEvent} +-type wxWindowCreateEventType() :: 'create'. +-type wxWindowCreate() :: #wxWindowCreate{}. %% Callback event: {@link wxWindowCreateEvent} + +-record(wxWindowDestroy, {type :: wxWindowDestroyEventType()}). %% Callback event: {@link wxWindowDestroyEvent} +-type wxWindowDestroyEventType() :: 'destroy'. +-type wxWindowDestroy() :: #wxWindowDestroy{}. %% Callback event: {@link wxWindowDestroyEvent} --type event() :: wxActivate() | wxAuiManager() | wxAuiNotebook() | wxCalendar() | wxChildFocus() | wxClipboardText() | wxClose() | wxColourPicker() | wxCommand() | wxContextMenu() | wxDate() | wxDisplayChanged() | wxErase() | wxFileDirPicker() | wxFocus() | wxFontPicker() | wxGrid() | wxHelp() | wxHtmlLink() | wxIconize() | wxIdle() | wxInitDialog() | wxJoystick() | wxKey() | wxList() | wxMaximize() | wxMenu() | wxMouse() | wxMouseCaptureChanged() | wxMouseCaptureLost() | wxMove() | wxNavigationKey() | wxNotebook() | wxPaint() | wxPaletteChanged() | wxQueryNewPalette() | wxSash() | wxScroll() | wxScrollWin() | wxSetCursor() | wxShow() | wxSize() | wxSpin() | wxSplitter() | wxStyledText() | wxSysColourChanged() | wxTaskBarIcon() | wxTree() | wxUpdateUI() | wxWindowCreate() | wxWindowDestroy(). --type wxEventType() :: wxActivateEventType() | wxAuiManagerEventType() | wxAuiNotebookEventType() | wxCalendarEventType() | wxChildFocusEventType() | wxClipboardTextEventType() | wxCloseEventType() | wxColourPickerEventType() | wxCommandEventType() | wxContextMenuEventType() | wxDateEventType() | wxDisplayChangedEventType() | wxEraseEventType() | wxFileDirPickerEventType() | wxFocusEventType() | wxFontPickerEventType() | wxGridEventType() | wxHelpEventType() | wxHtmlLinkEventType() | wxIconizeEventType() | wxIdleEventType() | wxInitDialogEventType() | wxJoystickEventType() | wxKeyEventType() | wxListEventType() | wxMaximizeEventType() | wxMenuEventType() | wxMouseCaptureChangedEventType() | wxMouseCaptureLostEventType() | wxMouseEventType() | wxMoveEventType() | wxNavigationKeyEventType() | wxNotebookEventType() | wxPaintEventType() | wxPaletteChangedEventType() | wxQueryNewPaletteEventType() | wxSashEventType() | wxScrollEventType() | wxScrollWinEventType() | wxSetCursorEventType() | wxShowEventType() | wxSizeEventType() | wxSpinEventType() | wxSplitterEventType() | wxStyledTextEventType() | wxSysColourChangedEventType() | wxTaskBarIconEventType() | wxTreeEventType() | wxUpdateUIEventType() | wxWindowCreateEventType() | wxWindowDestroyEventType(). +-type event() :: wxActivate() | wxAuiManager() | wxAuiNotebook() | wxCalendar() | wxChildFocus() | wxClipboardText() | wxClose() | wxColourPicker() | wxCommand() | wxContextMenu() | wxDate() | wxDisplayChanged() | wxDropFiles() | wxErase() | wxFileDirPicker() | wxFocus() | wxFontPicker() | wxGrid() | wxHelp() | wxHtmlLink() | wxIconize() | wxIdle() | wxInitDialog() | wxJoystick() | wxKey() | wxList() | wxMaximize() | wxMenu() | wxMouse() | wxMouseCaptureChanged() | wxMouseCaptureLost() | wxMove() | wxNavigationKey() | wxNotebook() | wxPaint() | wxPaletteChanged() | wxQueryNewPalette() | wxSash() | wxScroll() | wxScrollWin() | wxSetCursor() | wxShow() | wxSize() | wxSpin() | wxSplitter() | wxStyledText() | wxSysColourChanged() | wxTaskBarIcon() | wxTree() | wxUpdateUI() | wxWindowCreate() | wxWindowDestroy(). +-type wxEventType() :: wxActivateEventType() | wxAuiManagerEventType() | wxAuiNotebookEventType() | wxCalendarEventType() | wxChildFocusEventType() | wxClipboardTextEventType() | wxCloseEventType() | wxColourPickerEventType() | wxCommandEventType() | wxContextMenuEventType() | wxDateEventType() | wxDisplayChangedEventType() | wxDropFilesEventType() | wxEraseEventType() | wxFileDirPickerEventType() | wxFocusEventType() | wxFontPickerEventType() | wxGridEventType() | wxHelpEventType() | wxHtmlLinkEventType() | wxIconizeEventType() | wxIdleEventType() | wxInitDialogEventType() | wxJoystickEventType() | wxKeyEventType() | wxListEventType() | wxMaximizeEventType() | wxMenuEventType() | wxMouseCaptureChangedEventType() | wxMouseCaptureLostEventType() | wxMouseEventType() | wxMoveEventType() | wxNavigationKeyEventType() | wxNotebookEventType() | wxPaintEventType() | wxPaletteChangedEventType() | wxQueryNewPaletteEventType() | wxSashEventType() | wxScrollEventType() | wxScrollWinEventType() | wxSetCursorEventType() | wxShowEventType() | wxSizeEventType() | wxSpinEventType() | wxSplitterEventType() | wxStyledTextEventType() | wxSysColourChangedEventType() | wxTaskBarIconEventType() | wxTreeEventType() | wxUpdateUIEventType() | wxWindowCreateEventType() | wxWindowDestroyEventType(). %% Hardcoded Records -record(wxMouseState, {x :: integer(), y :: integer(), @@ -4085,3 +4092,7 @@ -define(wxWINDOW_VARIANT_MINI, 2). -define(wxWINDOW_VARIANT_LARGE, 3). -define(wxWINDOW_VARIANT_MAX, 4). +% From "xmlres.h": wxXmlResourceFlags +-define(wxXRC_USE_LOCALE, 1). +-define(wxXRC_NO_SUBCLASSING, 2). +-define(wxXRC_NO_RELOADING, 4). diff --git a/lib/wx/src/gen/gl.erl b/lib/wx/src/gen/gl.erl index e10b99b10a..3780cca651 100644 --- a/lib/wx/src/gen/gl.erl +++ b/lib/wx/src/gen/gl.erl @@ -283,7 +283,7 @@ call(Op, Args) -> Port = get(opengl_port), _ = erlang:port_control(Port,Op,Args), - rec(). + rec(Op). %% @hidden cast(Op, Args) -> @@ -292,11 +292,15 @@ cast(Op, Args) -> ok. %% @hidden -rec() -> - receive +rec(Op) -> + receive {'_egl_result_', Res} -> Res; - {'_egl_error_', Op, Res} -> error({error,Res,Op}) - end. + {'_egl_error_', Op, Res} -> error({error,Res,Op}); + {'_egl_error_', Other, Res} -> + Err = io_lib:format("~p in op: ~p", [Res, Other]), + error_logger:error_report([{gl, error}, {message, lists:flatten(Err)}]), + rec(Op) + end. %% @hidden send_bin(Bin) when is_binary(Bin) -> diff --git a/lib/wx/src/gen/wxArtProvider.erl b/lib/wx/src/gen/wxArtProvider.erl index da220a90c8..b52c141b1f 100644 --- a/lib/wx/src/gen/wxArtProvider.erl +++ b/lib/wx/src/gen/wxArtProvider.erl @@ -40,7 +40,7 @@ parent_class(_Class) -> erlang:error({badtype, ?MODULE}). Id::unicode:chardata(). getBitmap(Id) - when is_list(Id) -> + when ?is_chardata(Id) -> getBitmap(Id, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxartprovider.html#wxartprovidergetbitmap">external documentation</a>. @@ -49,7 +49,7 @@ getBitmap(Id) Option :: {'client', unicode:chardata()} | {'size', {W::integer(), H::integer()}}. getBitmap(Id, Options) - when is_list(Id),is_list(Options) -> + when ?is_chardata(Id),is_list(Options) -> Id_UC = unicode:characters_to_binary([Id,0]), MOpts = fun({client, Client}, Acc) -> Client_UC = unicode:characters_to_binary([Client, $_, $C,0]),[<<1:32/?UI,(byte_size(Client_UC)):32/?UI,(Client_UC)/binary, 0:(((8- ((0+byte_size(Client_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; ({size, {SizeW,SizeH}}, Acc) -> [<<2:32/?UI,SizeW:32/?UI,SizeH:32/?UI,0:32>>|Acc]; @@ -63,7 +63,7 @@ getBitmap(Id, Options) Id::unicode:chardata(). getIcon(Id) - when is_list(Id) -> + when ?is_chardata(Id) -> getIcon(Id, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxartprovider.html#wxartprovidergeticon">external documentation</a>. @@ -72,7 +72,7 @@ getIcon(Id) Option :: {'client', unicode:chardata()} | {'size', {W::integer(), H::integer()}}. getIcon(Id, Options) - when is_list(Id),is_list(Options) -> + when ?is_chardata(Id),is_list(Options) -> Id_UC = unicode:characters_to_binary([Id,0]), MOpts = fun({client, Client}, Acc) -> Client_UC = unicode:characters_to_binary([Client, $_, $C,0]),[<<1:32/?UI,(byte_size(Client_UC)):32/?UI,(Client_UC)/binary, 0:(((8- ((0+byte_size(Client_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; ({size, {SizeW,SizeH}}, Acc) -> [<<2:32/?UI,SizeW:32/?UI,SizeH:32/?UI,0:32>>|Acc]; diff --git a/lib/wx/src/gen/wxAuiManager.erl b/lib/wx/src/gen/wxAuiManager.erl index 37693060e1..a33e5e9a65 100644 --- a/lib/wx/src/gen/wxAuiManager.erl +++ b/lib/wx/src/gen/wxAuiManager.erl @@ -177,7 +177,7 @@ getManager(#wx_ref{type=WindowT,ref=WindowRef}) -> (This, Window) -> wxAuiPaneInfo:wxAuiPaneInfo() when This::wxAuiManager(), Window::wxWindow:wxWindow(). getPane(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxAuiManager), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxAuiManager_GetPane_1_0, @@ -223,7 +223,7 @@ insertPane(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=WindowT,ref=WindowRef},# -spec loadPaneInfo(This, Pane_part, Pane) -> 'ok' when This::wxAuiManager(), Pane_part::unicode:chardata(), Pane::wxAuiPaneInfo:wxAuiPaneInfo(). loadPaneInfo(#wx_ref{type=ThisT,ref=ThisRef},Pane_part,#wx_ref{type=PaneT,ref=PaneRef}) - when is_list(Pane_part) -> + when ?is_chardata(Pane_part) -> ?CLASS(ThisT,wxAuiManager), Pane_part_UC = unicode:characters_to_binary([Pane_part,0]), ?CLASS(PaneT,wxAuiPaneInfo), @@ -235,7 +235,7 @@ loadPaneInfo(#wx_ref{type=ThisT,ref=ThisRef},Pane_part,#wx_ref{type=PaneT,ref=Pa This::wxAuiManager(), Perspective::unicode:chardata(). loadPerspective(This,Perspective) - when is_record(This, wx_ref),is_list(Perspective) -> + when is_record(This, wx_ref),?is_chardata(Perspective) -> loadPerspective(This,Perspective, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxauimanager.html#wxauimanagerloadperspective">external documentation</a>. @@ -243,7 +243,7 @@ loadPerspective(This,Perspective) This::wxAuiManager(), Perspective::unicode:chardata(), Option :: {'update', boolean()}. loadPerspective(#wx_ref{type=ThisT,ref=ThisRef},Perspective, Options) - when is_list(Perspective),is_list(Options) -> + when ?is_chardata(Perspective),is_list(Options) -> ?CLASS(ThisT,wxAuiManager), Perspective_UC = unicode:characters_to_binary([Perspective,0]), MOpts = fun({update, Update}, Acc) -> [<<1:32/?UI,(wxe_util:from_bool(Update)):32/?UI>>|Acc]; diff --git a/lib/wx/src/gen/wxAuiNotebook.erl b/lib/wx/src/gen/wxAuiNotebook.erl index 42da35e16a..adb90c224f 100644 --- a/lib/wx/src/gen/wxAuiNotebook.erl +++ b/lib/wx/src/gen/wxAuiNotebook.erl @@ -42,38 +42,38 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setForegroundColour/2, - setHelpText/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2, - setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2,setPalette/2, - setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, - setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, - setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, - transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, - validate/1,warpPointer/3]). + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, + setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, + show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1, + update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]). -export_type([wxAuiNotebook/0]). %% @hidden @@ -121,7 +121,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef}, Options) This::wxAuiNotebook(), Page::wxWindow:wxWindow(), Caption::unicode:chardata(). addPage(This,Page,Caption) - when is_record(This, wx_ref),is_record(Page, wx_ref),is_list(Caption) -> + when is_record(This, wx_ref),is_record(Page, wx_ref),?is_chardata(Caption) -> addPage(This,Page,Caption, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxauinotebook.html#wxauinotebookaddpage">external documentation</a>. @@ -130,7 +130,7 @@ addPage(This,Page,Caption) Option :: {'select', boolean()} | {'bitmap', wxBitmap:wxBitmap()}. addPage(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PageT,ref=PageRef},Caption, Options) - when is_list(Caption),is_list(Options) -> + when ?is_chardata(Caption),is_list(Options) -> ?CLASS(ThisT,wxAuiNotebook), ?CLASS(PageT,wxWindow), Caption_UC = unicode:characters_to_binary([Caption,0]), @@ -243,7 +243,7 @@ getSelection(#wx_ref{type=ThisT,ref=ThisRef}) -> This::wxAuiNotebook(), Page_idx::integer(), Page::wxWindow:wxWindow(), Caption::unicode:chardata(). insertPage(This,Page_idx,Page,Caption) - when is_record(This, wx_ref),is_integer(Page_idx),is_record(Page, wx_ref),is_list(Caption) -> + when is_record(This, wx_ref),is_integer(Page_idx),is_record(Page, wx_ref),?is_chardata(Caption) -> insertPage(This,Page_idx,Page,Caption, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxauinotebook.html#wxauinotebookinsertpage">external documentation</a>. @@ -252,7 +252,7 @@ insertPage(This,Page_idx,Page,Caption) Option :: {'select', boolean()} | {'bitmap', wxBitmap:wxBitmap()}. insertPage(#wx_ref{type=ThisT,ref=ThisRef},Page_idx,#wx_ref{type=PageT,ref=PageRef},Caption, Options) - when is_integer(Page_idx),is_list(Caption),is_list(Options) -> + when is_integer(Page_idx),?is_chardata(Caption),is_list(Options) -> ?CLASS(ThisT,wxAuiNotebook), ?CLASS(PageT,wxWindow), Caption_UC = unicode:characters_to_binary([Caption,0]), @@ -304,7 +304,7 @@ setPageBitmap(#wx_ref{type=ThisT,ref=ThisRef},Page,#wx_ref{type=BitmapT,ref=Bitm -spec setPageText(This, Page, Text) -> boolean() when This::wxAuiNotebook(), Page::integer(), Text::unicode:chardata(). setPageText(#wx_ref{type=ThisT,ref=ThisRef},Page,Text) - when is_integer(Page),is_list(Text) -> + when is_integer(Page),?is_chardata(Text) -> ?CLASS(ThisT,wxAuiNotebook), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxAuiNotebook_SetPageText, @@ -350,6 +350,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -664,6 +666,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxAuiPaneInfo.erl b/lib/wx/src/gen/wxAuiPaneInfo.erl index 858da200be..c8273269ac 100644 --- a/lib/wx/src/gen/wxAuiPaneInfo.erl +++ b/lib/wx/src/gen/wxAuiPaneInfo.erl @@ -117,7 +117,7 @@ bottomDockable(#wx_ref{type=ThisT,ref=ThisRef}, Options) -spec caption(This, C) -> wxAuiPaneInfo() when This::wxAuiPaneInfo(), C::unicode:chardata(). caption(#wx_ref{type=ThisT,ref=ThisRef},C) - when is_list(C) -> + when ?is_chardata(C) -> ?CLASS(ThisT,wxAuiPaneInfo), C_UC = unicode:characters_to_binary([C,0]), wxe_util:call(?wxAuiPaneInfo_Caption, @@ -689,7 +689,7 @@ movable(#wx_ref{type=ThisT,ref=ThisRef}, Options) -spec name(This, N) -> wxAuiPaneInfo() when This::wxAuiPaneInfo(), N::unicode:chardata(). name(#wx_ref{type=ThisT,ref=ThisRef},N) - when is_list(N) -> + when ?is_chardata(N) -> ?CLASS(ThisT,wxAuiPaneInfo), N_UC = unicode:characters_to_binary([N,0]), wxe_util:call(?wxAuiPaneInfo_Name, diff --git a/lib/wx/src/gen/wxBitmap.erl b/lib/wx/src/gen/wxBitmap.erl index e7830dae9b..4a6e308d8d 100644 --- a/lib/wx/src/gen/wxBitmap.erl +++ b/lib/wx/src/gen/wxBitmap.erl @@ -56,7 +56,7 @@ new() -> Image::wxImage:wxImage(). new(Filename) - when is_list(Filename) -> + when ?is_chardata(Filename) -> new(Filename, []); new(Image) @@ -86,7 +86,7 @@ new(Width,Height) when is_integer(Width),is_integer(Height) -> new(Width,Height, []); new(Filename, Options) - when is_list(Filename),is_list(Options) -> + when ?is_chardata(Filename),is_list(Options) -> Filename_UC = unicode:characters_to_binary([Filename,0]), MOpts = fun({type, Type}, Acc) -> [<<1:32/?UI,Type:32/?UI>>|Acc]; (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, @@ -230,7 +230,7 @@ getSubBitmap(#wx_ref{type=ThisT,ref=ThisRef},{RectX,RectY,RectW,RectH}) This::wxBitmap(), Name::unicode:chardata(). loadFile(This,Name) - when is_record(This, wx_ref),is_list(Name) -> + when is_record(This, wx_ref),?is_chardata(Name) -> loadFile(This,Name, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxbitmap.html#wxbitmaploadfile">external documentation</a>. @@ -239,7 +239,7 @@ loadFile(This,Name) This::wxBitmap(), Name::unicode:chardata(), Option :: {'type', wx:wx_enum()}. loadFile(#wx_ref{type=ThisT,ref=ThisRef},Name, Options) - when is_list(Name),is_list(Options) -> + when ?is_chardata(Name),is_list(Options) -> ?CLASS(ThisT,wxBitmap), Name_UC = unicode:characters_to_binary([Name,0]), MOpts = fun({type, Type}, Acc) -> [<<1:32/?UI,Type:32/?UI>>|Acc]; @@ -261,7 +261,7 @@ ok(#wx_ref{type=ThisT,ref=ThisRef}) -> This::wxBitmap(), Name::unicode:chardata(), Type::wx:wx_enum(). saveFile(This,Name,Type) - when is_record(This, wx_ref),is_list(Name),is_integer(Type) -> + when is_record(This, wx_ref),?is_chardata(Name),is_integer(Type) -> saveFile(This,Name,Type, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxbitmap.html#wxbitmapsavefile">external documentation</a>. @@ -270,7 +270,7 @@ saveFile(This,Name,Type) This::wxBitmap(), Name::unicode:chardata(), Type::wx:wx_enum(), Option :: {'palette', wxPalette:wxPalette()}. saveFile(#wx_ref{type=ThisT,ref=ThisRef},Name,Type, Options) - when is_list(Name),is_integer(Type),is_list(Options) -> + when ?is_chardata(Name),is_integer(Type),is_list(Options) -> ?CLASS(ThisT,wxBitmap), Name_UC = unicode:characters_to_binary([Name,0]), MOpts = fun({palette, #wx_ref{type=PaletteT,ref=PaletteRef}}, Acc) -> ?CLASS(PaletteT,wxPalette),[<<1:32/?UI,PaletteRef:32/?UI>>|Acc]; diff --git a/lib/wx/src/gen/wxBitmapButton.erl b/lib/wx/src/gen/wxBitmapButton.erl index d1d2d037e8..d0a810bdb9 100644 --- a/lib/wx/src/gen/wxBitmapButton.erl +++ b/lib/wx/src/gen/wxBitmapButton.erl @@ -41,38 +41,39 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDefault/1,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, - setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, - setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, - setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, - setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, - setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2, - setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, - setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, - show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1, - update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]). + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDefault/1,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2, + setFocus/1,setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, + setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5, + setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, + setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2, + setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, + setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, + setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, + transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, + validate/1,warpPointer/3]). -export_type([wxBitmapButton/0]). %% @hidden @@ -230,6 +231,8 @@ setDefault(This) -> wxButton:setDefault(This). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -546,6 +549,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxButton.erl b/lib/wx/src/gen/wxButton.erl index 65d45caa13..f8e24beffa 100644 --- a/lib/wx/src/gen/wxButton.erl +++ b/lib/wx/src/gen/wxButton.erl @@ -39,30 +39,30 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2,setMinSize/2, - setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2, + setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, @@ -163,7 +163,7 @@ setDefault(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setLabel(This, Label) -> 'ok' when This::wxButton(), Label::unicode:chardata(). setLabel(#wx_ref{type=ThisT,ref=ThisRef},Label) - when is_list(Label) -> + when ?is_chardata(Label) -> ?CLASS(ThisT,wxButton), Label_UC = unicode:characters_to_binary([Label,0]), wxe_util:cast(?wxButton_SetLabel, @@ -180,6 +180,8 @@ destroy(Obj=#wx_ref{type=Type}) -> getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -496,6 +498,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxCalendarCtrl.erl b/lib/wx/src/gen/wxCalendarCtrl.erl index 93fcb61464..bf033e9bc0 100644 --- a/lib/wx/src/gen/wxCalendarCtrl.erl +++ b/lib/wx/src/gen/wxCalendarCtrl.erl @@ -43,29 +43,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -364,6 +364,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -680,6 +682,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxCheckBox.erl b/lib/wx/src/gen/wxCheckBox.erl index 3276add802..5ed49d91b6 100644 --- a/lib/wx/src/gen/wxCheckBox.erl +++ b/lib/wx/src/gen/wxCheckBox.erl @@ -40,29 +40,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -92,7 +92,7 @@ new() -> Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). new(Parent,Id,Label) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> new(Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxcheckbox.html#wxcheckboxwxcheckbox">external documentation</a>. @@ -103,7 +103,7 @@ new(Parent,Id,Label) | {'style', integer()} | {'validator', wx:wx_object()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -120,7 +120,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) This::wxCheckBox(), Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). create(This,Parent,Id,Label) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> create(This,Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxcheckbox.html#wxcheckboxcreate">external documentation</a>. @@ -131,7 +131,7 @@ create(This,Parent,Id,Label) | {'style', integer()} | {'validator', wx:wx_object()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxCheckBox), ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), @@ -217,6 +217,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -533,6 +535,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxCheckListBox.erl b/lib/wx/src/gen/wxCheckListBox.erl index 888f29518c..ddef6a29e2 100644 --- a/lib/wx/src/gen/wxCheckListBox.erl +++ b/lib/wx/src/gen/wxCheckListBox.erl @@ -41,13 +41,14 @@ clientToScreen/2,clientToScreen/3,close/1,close/2,connect/2,connect/3, convertDialogToPixels/2,convertPixelsToDialog/2,delete/2,deselect/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findString/2,findString/3,findWindow/2,fit/1,fitInside/1, - freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, - getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, - getClientData/2,getClientSize/1,getContainingSizer/1,getCount/1,getCursor/1, - getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + dragAcceptFiles/2,enable/1,enable/2,findString/2,findString/3,findWindow/2, + fit/1,fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, + getBackgroundStyle/1,getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1, + getChildren/1,getClientData/2,getClientSize/1,getContainingSizer/1, + getContentScaleFactor/1,getCount/1,getCursor/1,getDropTarget/1,getEventHandler/1, + getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, + getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1,getMinSize/1, + getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, getSelection/1,getSelections/1,getSize/1,getSizer/1,getString/2,getStringSelection/1, getTextExtent/2,getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, @@ -222,6 +223,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -538,6 +541,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxChoice.erl b/lib/wx/src/gen/wxChoice.erl index 1a90b275d1..266a257442 100644 --- a/lib/wx/src/gen/wxChoice.erl +++ b/lib/wx/src/gen/wxChoice.erl @@ -40,40 +40,41 @@ centre/1,centre/2,centreOnParent/1,centreOnParent/2,clear/1,clearBackground/1, clientToScreen/2,clientToScreen/3,close/1,close/2,connect/2,connect/3, convertDialogToPixels/2,convertPixelsToDialog/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - findString/2,findString/3,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientData/2,getClientSize/1, - getContainingSizer/1,getCount/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1,getMinSize/1, - getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSelection/1,getSize/1,getSizer/1,getString/2,getStringSelection/1, - getTextExtent/2,getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, - getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, - hasTransparentBackground/1,hide/1,inheritAttributes/1,initDialog/1, - insert/3,insert/4,invalidateBestSize/1,isDoubleBuffered/1,isEmpty/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,select/2,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientData/3, - setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, - setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, - setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, - setSelection/2,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2, - setSizeHints/3,setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2, - setSizerAndFit/3,setString/3,setStringSelection/2,setThemeEnabled/2, - setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, - setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, - setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,findString/2,findString/3,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientData/2,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCount/1,getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1, + getFont/1,getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSelection/1,getSize/1,getSizer/1, + getString/2,getStringSelection/1,getTextExtent/2,getTextExtent/3, + getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, + getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, + hide/1,inheritAttributes/1,initDialog/1,insert/3,insert/4,invalidateBestSize/1, + isDoubleBuffered/1,isEmpty/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, + isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1, + makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2, + moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, + popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,select/2,setAcceleratorTable/2, + setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, + setClientData/3,setClientSize/2,setClientSize/3,setContainingSizer/2, + setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1, + setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setId/2, + setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, + setScrollPos/4,setScrollbar/5,setScrollbar/6,setSelection/2,setSize/2, + setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, + setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setString/3, + setStringSelection/2,setThemeEnabled/2,setToolTip/2,setTransparent/2, + setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3, + setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2, + shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, validate/1,warpPointer/3]). @@ -237,6 +238,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -553,6 +556,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxChoicebook.erl b/lib/wx/src/gen/wxChoicebook.erl index 34b62ff75b..c6e0941978 100644 --- a/lib/wx/src/gen/wxChoicebook.erl +++ b/lib/wx/src/gen/wxChoicebook.erl @@ -43,29 +43,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -120,7 +120,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id, Options) This::wxChoicebook(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). addPage(This,Page,Text) - when is_record(This, wx_ref),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_record(Page, wx_ref),?is_chardata(Text) -> addPage(This,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxchoicebook.html#wxchoicebookaddpage">external documentation</a>. @@ -129,7 +129,7 @@ addPage(This,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. addPage(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_list(Text),is_list(Options) -> + when ?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxChoicebook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -296,7 +296,7 @@ hitTest(#wx_ref{type=ThisT,ref=ThisRef},{PtX,PtY}) This::wxChoicebook(), N::integer(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). insertPage(This,N,Page,Text) - when is_record(This, wx_ref),is_integer(N),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_integer(N),is_record(Page, wx_ref),?is_chardata(Text) -> insertPage(This,N,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxchoicebook.html#wxchoicebookinsertpage">external documentation</a>. @@ -305,7 +305,7 @@ insertPage(This,N,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. insertPage(#wx_ref{type=ThisT,ref=ThisRef},N,#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_integer(N),is_list(Text),is_list(Options) -> + when is_integer(N),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxChoicebook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -347,7 +347,7 @@ setPageImage(#wx_ref{type=ThisT,ref=ThisRef},N,ImageId) -spec setPageText(This, N, StrText) -> boolean() when This::wxChoicebook(), N::integer(), StrText::unicode:chardata(). setPageText(#wx_ref{type=ThisT,ref=ThisRef},N,StrText) - when is_integer(N),is_list(StrText) -> + when is_integer(N),?is_chardata(StrText) -> ?CLASS(ThisT,wxChoicebook), StrText_UC = unicode:characters_to_binary([StrText,0]), wxe_util:call(?wxChoicebook_SetPageText, @@ -384,6 +384,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -700,6 +702,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxColourDialog.erl b/lib/wx/src/gen/wxColourDialog.erl index 9c97434d9a..936c0e5099 100644 --- a/lib/wx/src/gen/wxColourDialog.erl +++ b/lib/wx/src/gen/wxColourDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -223,6 +223,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -539,6 +541,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxColourPickerCtrl.erl b/lib/wx/src/gen/wxColourPickerCtrl.erl index 9c987b4dde..c97b194bc8 100644 --- a/lib/wx/src/gen/wxColourPickerCtrl.erl +++ b/lib/wx/src/gen/wxColourPickerCtrl.erl @@ -39,17 +39,18 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getInternalMargin/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1, - getParent/1,getPickerCtrlProportion/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSize/1,getSizer/1,getTextCtrl/1,getTextCtrlProportion/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getInternalMargin/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPickerCtrlProportion/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextCtrl/1, + getTextCtrlProportion/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1, isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1, @@ -168,7 +169,7 @@ getColour(#wx_ref{type=ThisT,ref=ThisRef}) -> (This, Col) -> 'ok' when This::wxColourPickerCtrl(), Col::wx:wx_colour(). setColour(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxColourPickerCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxColourPickerCtrl_SetColour_1_0, @@ -221,6 +222,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -537,6 +540,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxComboBox.erl b/lib/wx/src/gen/wxComboBox.erl index bbdf768eba..9f8cf77445 100644 --- a/lib/wx/src/gen/wxComboBox.erl +++ b/lib/wx/src/gen/wxComboBox.erl @@ -42,42 +42,42 @@ centre/1,centre/2,centreOnParent/1,centreOnParent/2,clear/1,clearBackground/1, clientToScreen/2,clientToScreen/3,close/1,close/2,connect/2,connect/3, convertDialogToPixels/2,convertPixelsToDialog/2,delete/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - findString/2,findString/3,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientData/2,getClientSize/1, - getContainingSizer/1,getCount/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1,getMinSize/1, - getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSelection/1,getSize/1,getSizer/1,getString/2,getStringSelection/1, - getTextExtent/2,getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, - getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, - hasTransparentBackground/1,hide/1,inheritAttributes/1,initDialog/1, - insert/3,insert/4,invalidateBestSize/1,isDoubleBuffered/1,isEmpty/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,select/2,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientData/3, - setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, - setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, - setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, - setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, - setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, - setString/3,setStringSelection/2,setThemeEnabled/2,setToolTip/2,setTransparent/2, - setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3, - setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2, - shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, - transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, - validate/1,warpPointer/3]). + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,findString/2,findString/3,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientData/2,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCount/1,getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1, + getFont/1,getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSelection/1,getSize/1,getSizer/1, + getString/2,getStringSelection/1,getTextExtent/2,getTextExtent/3, + getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, + getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, + hide/1,inheritAttributes/1,initDialog/1,insert/3,insert/4,invalidateBestSize/1, + isDoubleBuffered/1,isEmpty/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, + isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1, + makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2, + moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, + popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,select/2,setAcceleratorTable/2, + setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, + setClientData/3,setClientSize/2,setClientSize/3,setContainingSizer/2, + setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1, + setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setId/2, + setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, + setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5, + setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, + setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setString/3,setStringSelection/2, + setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, + show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1, + update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]). -export_type([wxComboBox/0]). %% @hidden @@ -130,7 +130,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id, Options) This::wxComboBox(), Parent::wxWindow:wxWindow(), Id::integer(), Value::unicode:chardata(), Pos::{X::integer(), Y::integer()}, Size::{W::integer(), H::integer()}, Choices::[unicode:chardata()]. create(This,Parent,Id,Value,Pos={PosX,PosY},Size={SizeW,SizeH},Choices) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Value),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Value),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices) -> create(This,Parent,Id,Value,Pos,Size,Choices, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxcombobox.html#wxcomboboxcreate">external documentation</a>. @@ -139,7 +139,7 @@ create(This,Parent,Id,Value,Pos={PosX,PosY},Size={SizeW,SizeH},Choices) Option :: {'style', integer()} | {'validator', wx:wx_object()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Value,{PosX,PosY},{SizeW,SizeH},Choices, Options) - when is_integer(Id),is_list(Value),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices),is_list(Options) -> + when is_integer(Id),?is_chardata(Value),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices),is_list(Options) -> ?CLASS(ThisT,wxComboBox), ?CLASS(ParentT,wxWindow), Value_UC = unicode:characters_to_binary([Value,0]), @@ -252,7 +252,7 @@ redo(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec replace(This, From, To, Value) -> 'ok' when This::wxComboBox(), From::integer(), To::integer(), Value::unicode:chardata(). replace(#wx_ref{type=ThisT,ref=ThisRef},From,To,Value) - when is_integer(From),is_integer(To),is_list(Value) -> + when is_integer(From),is_integer(To),?is_chardata(Value) -> ?CLASS(ThisT,wxComboBox), Value_UC = unicode:characters_to_binary([Value,0]), wxe_util:cast(?wxComboBox_Replace, @@ -306,7 +306,7 @@ setSelection(#wx_ref{type=ThisT,ref=ThisRef},From,To) -spec setValue(This, Value) -> 'ok' when This::wxComboBox(), Value::unicode:chardata(). setValue(#wx_ref{type=ThisT,ref=ThisRef},Value) - when is_list(Value) -> + when ?is_chardata(Value) -> ?CLASS(ThisT,wxComboBox), Value_UC = unicode:characters_to_binary([Value,0]), wxe_util:cast(?wxComboBox_SetValue, @@ -372,6 +372,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -688,6 +690,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxCommandEvent.erl b/lib/wx/src/gen/wxCommandEvent.erl index 781482aebb..18ccbc65f0 100644 --- a/lib/wx/src/gen/wxCommandEvent.erl +++ b/lib/wx/src/gen/wxCommandEvent.erl @@ -114,7 +114,7 @@ setInt(#wx_ref{type=ThisT,ref=ThisRef},I) -spec setString(This, S) -> 'ok' when This::wxCommandEvent(), S::unicode:chardata(). setString(#wx_ref{type=ThisT,ref=ThisRef},S) - when is_list(S) -> + when ?is_chardata(S) -> ?CLASS(ThisT,wxCommandEvent), S_UC = unicode:characters_to_binary([S,0]), wxe_util:cast(?wxCommandEvent_SetString, diff --git a/lib/wx/src/gen/wxControl.erl b/lib/wx/src/gen/wxControl.erl index a84f88639b..6be7574d80 100644 --- a/lib/wx/src/gen/wxControl.erl +++ b/lib/wx/src/gen/wxControl.erl @@ -37,30 +37,30 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, - getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2,setMinSize/2, - setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getMaxSize/1,getMinSize/1, + getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2, + setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, @@ -89,7 +89,7 @@ getLabel(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setLabel(This, Label) -> 'ok' when This::wxControl(), Label::unicode:chardata(). setLabel(#wx_ref{type=ThisT,ref=ThisRef},Label) - when is_list(Label) -> + when ?is_chardata(Label) -> ?CLASS(ThisT,wxControl), Label_UC = unicode:characters_to_binary([Label,0]), wxe_util:cast(?wxControl_SetLabel, @@ -97,6 +97,8 @@ setLabel(#wx_ref{type=ThisT,ref=ThisRef},Label) %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -413,6 +415,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxControlWithItems.erl b/lib/wx/src/gen/wxControlWithItems.erl index c4d116d9e7..47ffa7dcba 100644 --- a/lib/wx/src/gen/wxControlWithItems.erl +++ b/lib/wx/src/gen/wxControlWithItems.erl @@ -41,29 +41,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -86,7 +86,7 @@ parent_class(_Class) -> erlang:error({badtype, ?MODULE}). -spec append(This, Item) -> integer() when This::wxControlWithItems(), Item::unicode:chardata(). append(#wx_ref{type=ThisT,ref=ThisRef},Item) - when is_list(Item) -> + when ?is_chardata(Item) -> ?CLASS(ThisT,wxControlWithItems), Item_UC = unicode:characters_to_binary([Item,0]), wxe_util:call(?wxControlWithItems_Append_1, @@ -96,7 +96,7 @@ append(#wx_ref{type=ThisT,ref=ThisRef},Item) -spec append(This, Item, ClientData) -> integer() when This::wxControlWithItems(), Item::unicode:chardata(), ClientData::term(). append(#wx_ref{type=ThisT,ref=ThisRef},Item,ClientData) - when is_list(Item) -> + when ?is_chardata(Item) -> ?CLASS(ThisT,wxControlWithItems), Item_UC = unicode:characters_to_binary([Item,0]), wxe_util:send_bin(term_to_binary(ClientData)), @@ -136,7 +136,7 @@ delete(#wx_ref{type=ThisT,ref=ThisRef},N) This::wxControlWithItems(), S::unicode:chardata(). findString(This,S) - when is_record(This, wx_ref),is_list(S) -> + when is_record(This, wx_ref),?is_chardata(S) -> findString(This,S, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxcontrolwithitems.html#wxcontrolwithitemsfindstring">external documentation</a>. @@ -144,7 +144,7 @@ findString(This,S) This::wxControlWithItems(), S::unicode:chardata(), Option :: {'bCase', boolean()}. findString(#wx_ref{type=ThisT,ref=ThisRef},S, Options) - when is_list(S),is_list(Options) -> + when ?is_chardata(S),is_list(Options) -> ?CLASS(ThisT,wxControlWithItems), S_UC = unicode:characters_to_binary([S,0]), MOpts = fun({bCase, BCase}, Acc) -> [<<1:32/?UI,(wxe_util:from_bool(BCase)):32/?UI>>|Acc]; @@ -209,7 +209,7 @@ getStringSelection(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec insert(This, Item, Pos) -> integer() when This::wxControlWithItems(), Item::unicode:chardata(), Pos::integer(). insert(#wx_ref{type=ThisT,ref=ThisRef},Item,Pos) - when is_list(Item),is_integer(Pos) -> + when ?is_chardata(Item),is_integer(Pos) -> ?CLASS(ThisT,wxControlWithItems), Item_UC = unicode:characters_to_binary([Item,0]), wxe_util:call(?wxControlWithItems_Insert_2, @@ -219,7 +219,7 @@ insert(#wx_ref{type=ThisT,ref=ThisRef},Item,Pos) -spec insert(This, Item, Pos, ClientData) -> integer() when This::wxControlWithItems(), Item::unicode:chardata(), Pos::integer(), ClientData::term(). insert(#wx_ref{type=ThisT,ref=ThisRef},Item,Pos,ClientData) - when is_list(Item),is_integer(Pos) -> + when ?is_chardata(Item),is_integer(Pos) -> ?CLASS(ThisT,wxControlWithItems), Item_UC = unicode:characters_to_binary([Item,0]), wxe_util:send_bin(term_to_binary(ClientData)), @@ -256,7 +256,7 @@ setSelection(#wx_ref{type=ThisT,ref=ThisRef},N) -spec setString(This, N, S) -> 'ok' when This::wxControlWithItems(), N::integer(), S::unicode:chardata(). setString(#wx_ref{type=ThisT,ref=ThisRef},N,S) - when is_integer(N),is_list(S) -> + when is_integer(N),?is_chardata(S) -> ?CLASS(ThisT,wxControlWithItems), S_UC = unicode:characters_to_binary([S,0]), wxe_util:cast(?wxControlWithItems_SetString, @@ -266,7 +266,7 @@ setString(#wx_ref{type=ThisT,ref=ThisRef},N,S) -spec setStringSelection(This, S) -> boolean() when This::wxControlWithItems(), S::unicode:chardata(). setStringSelection(#wx_ref{type=ThisT,ref=ThisRef},S) - when is_list(S) -> + when ?is_chardata(S) -> ?CLASS(ThisT,wxControlWithItems), S_UC = unicode:characters_to_binary([S,0]), wxe_util:call(?wxControlWithItems_SetStringSelection, @@ -279,6 +279,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -595,6 +597,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxDC.erl b/lib/wx/src/gen/wxDC.erl index ad7a4251ec..16bfcc3463 100644 --- a/lib/wx/src/gen/wxDC.erl +++ b/lib/wx/src/gen/wxDC.erl @@ -253,7 +253,7 @@ drawIcon(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=IconT,ref=IconRef},{PtX,Pt This::wxDC(), Text::unicode:chardata(), Rect::{X::integer(), Y::integer(), W::integer(), H::integer()}. drawLabel(This,Text,Rect={RectX,RectY,RectW,RectH}) - when is_record(This, wx_ref),is_list(Text),is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH) -> + when is_record(This, wx_ref),?is_chardata(Text),is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH) -> drawLabel(This,Text,Rect, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxdc.html#wxdcdrawlabel">external documentation</a>. @@ -262,7 +262,7 @@ drawLabel(This,Text,Rect={RectX,RectY,RectW,RectH}) Option :: {'alignment', integer()} | {'indexAccel', integer()}. drawLabel(#wx_ref{type=ThisT,ref=ThisRef},Text,{RectX,RectY,RectW,RectH}, Options) - when is_list(Text),is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),is_list(Options) -> + when ?is_chardata(Text),is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),is_list(Options) -> ?CLASS(ThisT,wxDC), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({alignment, Alignment}, Acc) -> [<<1:32/?UI,Alignment:32/?UI>>|Acc]; @@ -363,7 +363,7 @@ drawRectangle(#wx_ref{type=ThisT,ref=ThisRef},{PtX,PtY},{SzW,SzH}) -spec drawRotatedText(This, Text, Pt, Angle) -> 'ok' when This::wxDC(), Text::unicode:chardata(), Pt::{X::integer(), Y::integer()}, Angle::number(). drawRotatedText(#wx_ref{type=ThisT,ref=ThisRef},Text,{PtX,PtY},Angle) - when is_list(Text),is_integer(PtX),is_integer(PtY),is_number(Angle) -> + when ?is_chardata(Text),is_integer(PtX),is_integer(PtY),is_number(Angle) -> ?CLASS(ThisT,wxDC), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxDC_DrawRotatedText, @@ -391,7 +391,7 @@ drawRoundedRectangle(#wx_ref{type=ThisT,ref=ThisRef},{PtX,PtY},{SzW,SzH},Radius) -spec drawText(This, Text, Pt) -> 'ok' when This::wxDC(), Text::unicode:chardata(), Pt::{X::integer(), Y::integer()}. drawText(#wx_ref{type=ThisT,ref=ThisRef},Text,{PtX,PtY}) - when is_list(Text),is_integer(PtX),is_integer(PtY) -> + when ?is_chardata(Text),is_integer(PtX),is_integer(PtY) -> ?CLASS(ThisT,wxDC), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxDC_DrawText, @@ -521,7 +521,7 @@ getMapMode(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec getMultiLineTextExtent(This, String) -> {W::integer(), H::integer()} when This::wxDC(), String::unicode:chardata(). getMultiLineTextExtent(#wx_ref{type=ThisT,ref=ThisRef},String) - when is_list(String) -> + when ?is_chardata(String) -> ?CLASS(ThisT,wxDC), String_UC = unicode:characters_to_binary([String,0]), wxe_util:call(?wxDC_GetMultiLineTextExtent_1, @@ -532,7 +532,7 @@ getMultiLineTextExtent(#wx_ref{type=ThisT,ref=ThisRef},String) This::wxDC(), String::unicode:chardata(), Option :: {'font', wxFont:wxFont()}. getMultiLineTextExtent(#wx_ref{type=ThisT,ref=ThisRef},String, Options) - when is_list(String),is_list(Options) -> + when ?is_chardata(String),is_list(Options) -> ?CLASS(ThisT,wxDC), String_UC = unicode:characters_to_binary([String,0]), MOpts = fun({font, #wx_ref{type=FontT,ref=FontRef}}, Acc) -> ?CLASS(FontT,wxFont),[<<1:32/?UI,FontRef:32/?UI>>|Acc]; @@ -546,7 +546,7 @@ getMultiLineTextExtent(#wx_ref{type=ThisT,ref=ThisRef},String, Options) Result ::{Res ::boolean(), Widths::[integer()]}, This::wxDC(), Text::unicode:chardata(). getPartialTextExtents(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxDC), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxDC_GetPartialTextExtents, @@ -606,7 +606,7 @@ getTextBackground(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec getTextExtent(This, String) -> {W::integer(), H::integer()} when This::wxDC(), String::unicode:chardata(). getTextExtent(#wx_ref{type=ThisT,ref=ThisRef},String) - when is_list(String) -> + when ?is_chardata(String) -> ?CLASS(ThisT,wxDC), String_UC = unicode:characters_to_binary([String,0]), wxe_util:call(?wxDC_GetTextExtent_1, @@ -618,7 +618,7 @@ getTextExtent(#wx_ref{type=ThisT,ref=ThisRef},String) This::wxDC(), String::unicode:chardata(), Option :: {'theFont', wxFont:wxFont()}. getTextExtent(#wx_ref{type=ThisT,ref=ThisRef},String, Options) - when is_list(String),is_list(Options) -> + when ?is_chardata(String),is_list(Options) -> ?CLASS(ThisT,wxDC), String_UC = unicode:characters_to_binary([String,0]), MOpts = fun({theFont, #wx_ref{type=TheFontT,ref=TheFontRef}}, Acc) -> ?CLASS(TheFontT,wxFont),[<<1:32/?UI,TheFontRef:32/?UI>>|Acc]; @@ -929,7 +929,7 @@ setUserScale(#wx_ref{type=ThisT,ref=ThisRef},X,Y) -spec startDoc(This, Message) -> boolean() when This::wxDC(), Message::unicode:chardata(). startDoc(#wx_ref{type=ThisT,ref=ThisRef},Message) - when is_list(Message) -> + when ?is_chardata(Message) -> ?CLASS(ThisT,wxDC), Message_UC = unicode:characters_to_binary([Message,0]), wxe_util:call(?wxDC_StartDoc, diff --git a/lib/wx/src/gen/wxDatePickerCtrl.erl b/lib/wx/src/gen/wxDatePickerCtrl.erl index 1b306a498a..743169c58e 100644 --- a/lib/wx/src/gen/wxDatePickerCtrl.erl +++ b/lib/wx/src/gen/wxDatePickerCtrl.erl @@ -39,17 +39,18 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getInternalMargin/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1, - getParent/1,getPickerCtrlProportion/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSize/1,getSizer/1,getTextCtrl/1,getTextCtrlProportion/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getInternalMargin/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPickerCtrlProportion/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextCtrl/1, + getTextCtrlProportion/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1, isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1, @@ -197,6 +198,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -513,6 +516,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxDialog.erl b/lib/wx/src/gen/wxDialog.erl index 9f98644828..72f37df178 100644 --- a/lib/wx/src/gen/wxDialog.erl +++ b/lib/wx/src/gen/wxDialog.erl @@ -41,32 +41,32 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1, - getParent/1,getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1, - getScrollPos/2,getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1, - getTextExtent/2,getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1, - getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, - hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2, - inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1, - isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, - isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1, - layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1, - maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1, - screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, - setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, - setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, - setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, + getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, + getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, + getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, + hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, + isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, + isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1, + isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, + makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, + moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, + popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, + screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, + scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2, + setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2, + setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1, + setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2, + setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, @@ -97,7 +97,7 @@ new() -> Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(). new(Parent,Id,Title) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> new(Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxdialog.html#wxdialogwxdialog">external documentation</a>. @@ -107,7 +107,7 @@ new(Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -123,7 +123,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) This::wxDialog(), Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(). create(This,Parent,Id,Title) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> create(This,Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxdialog.html#wxdialogcreate">external documentation</a>. @@ -133,7 +133,7 @@ create(This,Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ThisT,wxDialog), ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), @@ -298,6 +298,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -614,6 +616,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxDirDialog.erl b/lib/wx/src/gen/wxDirDialog.erl index 1b6b9dba71..5a2df9821a 100644 --- a/lib/wx/src/gen/wxDirDialog.erl +++ b/lib/wx/src/gen/wxDirDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -137,7 +137,7 @@ getMessage(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setMessage(This, Message) -> 'ok' when This::wxDirDialog(), Message::unicode:chardata(). setMessage(#wx_ref{type=ThisT,ref=ThisRef},Message) - when is_list(Message) -> + when ?is_chardata(Message) -> ?CLASS(ThisT,wxDirDialog), Message_UC = unicode:characters_to_binary([Message,0]), wxe_util:cast(?wxDirDialog_SetMessage, @@ -147,7 +147,7 @@ setMessage(#wx_ref{type=ThisT,ref=ThisRef},Message) -spec setPath(This, Path) -> 'ok' when This::wxDirDialog(), Path::unicode:chardata(). setPath(#wx_ref{type=ThisT,ref=ThisRef},Path) - when is_list(Path) -> + when ?is_chardata(Path) -> ?CLASS(ThisT,wxDirDialog), Path_UC = unicode:characters_to_binary([Path,0]), wxe_util:cast(?wxDirDialog_SetPath, @@ -231,6 +231,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -547,6 +549,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxDirPickerCtrl.erl b/lib/wx/src/gen/wxDirPickerCtrl.erl index 3bedeb7f54..9bfff7d458 100644 --- a/lib/wx/src/gen/wxDirPickerCtrl.erl +++ b/lib/wx/src/gen/wxDirPickerCtrl.erl @@ -39,17 +39,18 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getInternalMargin/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1, - getParent/1,getPickerCtrlProportion/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSize/1,getSizer/1,getTextCtrl/1,getTextCtrlProportion/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getInternalMargin/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPickerCtrlProportion/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextCtrl/1, + getTextCtrlProportion/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1, isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1, @@ -166,7 +167,7 @@ getPath(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setPath(This, Str) -> 'ok' when This::wxDirPickerCtrl(), Str::unicode:chardata(). setPath(#wx_ref{type=ThisT,ref=ThisRef},Str) - when is_list(Str) -> + when ?is_chardata(Str) -> ?CLASS(ThisT,wxDirPickerCtrl), Str_UC = unicode:characters_to_binary([Str,0]), wxe_util:cast(?wxDirPickerCtrl_SetPath, @@ -214,6 +215,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -530,6 +533,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxDropFilesEvent.erl b/lib/wx/src/gen/wxDropFilesEvent.erl new file mode 100644 index 0000000000..d28dcd1f7a --- /dev/null +++ b/lib/wx/src/gen/wxDropFilesEvent.erl @@ -0,0 +1,89 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2016. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% This file is generated DO NOT EDIT + +%% @doc See external documentation: <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxdropfilesevent.html">wxDropFilesEvent</a>. +%% <dl><dt>Use {@link wxEvtHandler:connect/3.} with EventType:</dt> +%% <dd><em>drop_files</em></dd></dl> +%% See also the message variant {@link wxEvtHandler:wxDropFiles(). #wxDropFiles{}} event record type. +%% +%% <p>This class is derived (and can use functions) from: +%% <br />{@link wxEvent} +%% </p> +%% @type wxDropFilesEvent(). An object reference, The representation is internal +%% and can be changed without notice. It can't be used for comparsion +%% stored on disc or distributed for use on other nodes. + +-module(wxDropFilesEvent). +-include("wxe.hrl"). +-export([getFiles/1,getNumberOfFiles/1,getPosition/1]). + +%% inherited exports +-export([getId/1,getSkipped/1,getTimestamp/1,isCommandEvent/1,parent_class/1, + resumePropagation/2,shouldPropagate/1,skip/1,skip/2,stopPropagation/1]). + +-export_type([wxDropFilesEvent/0]). +%% @hidden +parent_class(wxEvent) -> true; +parent_class(_Class) -> erlang:error({badtype, ?MODULE}). + +-type wxDropFilesEvent() :: wx:wx_object(). +%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxdropfilesevent.html#wxdropfileseventgetposition">external documentation</a>. +-spec getPosition(This) -> {X::integer(), Y::integer()} when + This::wxDropFilesEvent(). +getPosition(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxDropFilesEvent), + wxe_util:call(?wxDropFilesEvent_GetPosition, + <<ThisRef:32/?UI>>). + +%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxdropfilesevent.html#wxdropfileseventgetnumberoffiles">external documentation</a>. +-spec getNumberOfFiles(This) -> integer() when + This::wxDropFilesEvent(). +getNumberOfFiles(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxDropFilesEvent), + wxe_util:call(?wxDropFilesEvent_GetNumberOfFiles, + <<ThisRef:32/?UI>>). + +%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxdropfilesevent.html#wxdropfileseventgetfiles">external documentation</a>. +-spec getFiles(This) -> [unicode:charlist()] when + This::wxDropFilesEvent(). +getFiles(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxDropFilesEvent), + wxe_util:call(?wxDropFilesEvent_GetFiles, + <<ThisRef:32/?UI>>). + + %% From wxEvent +%% @hidden +stopPropagation(This) -> wxEvent:stopPropagation(This). +%% @hidden +skip(This, Options) -> wxEvent:skip(This, Options). +%% @hidden +skip(This) -> wxEvent:skip(This). +%% @hidden +shouldPropagate(This) -> wxEvent:shouldPropagate(This). +%% @hidden +resumePropagation(This,PropagationLevel) -> wxEvent:resumePropagation(This,PropagationLevel). +%% @hidden +isCommandEvent(This) -> wxEvent:isCommandEvent(This). +%% @hidden +getTimestamp(This) -> wxEvent:getTimestamp(This). +%% @hidden +getSkipped(This) -> wxEvent:getSkipped(This). +%% @hidden +getId(This) -> wxEvent:getId(This). diff --git a/lib/wx/src/gen/wxFileDataObject.erl b/lib/wx/src/gen/wxFileDataObject.erl index 06d8ceb9cd..d4e9198225 100644 --- a/lib/wx/src/gen/wxFileDataObject.erl +++ b/lib/wx/src/gen/wxFileDataObject.erl @@ -49,7 +49,7 @@ new() -> -spec addFile(This, Filename) -> 'ok' when This::wxFileDataObject(), Filename::unicode:chardata(). addFile(#wx_ref{type=ThisT,ref=ThisRef},Filename) - when is_list(Filename) -> + when ?is_chardata(Filename) -> ?CLASS(ThisT,wxFileDataObject), Filename_UC = unicode:characters_to_binary([Filename,0]), wxe_util:cast(?wxFileDataObject_AddFile, diff --git a/lib/wx/src/gen/wxFileDialog.erl b/lib/wx/src/gen/wxFileDialog.erl index 070fce3a39..6032e38a16 100644 --- a/lib/wx/src/gen/wxFileDialog.erl +++ b/lib/wx/src/gen/wxFileDialog.erl @@ -42,40 +42,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -191,7 +191,7 @@ getWildcard(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setDirectory(This, Dir) -> 'ok' when This::wxFileDialog(), Dir::unicode:chardata(). setDirectory(#wx_ref{type=ThisT,ref=ThisRef},Dir) - when is_list(Dir) -> + when ?is_chardata(Dir) -> ?CLASS(ThisT,wxFileDialog), Dir_UC = unicode:characters_to_binary([Dir,0]), wxe_util:cast(?wxFileDialog_SetDirectory, @@ -201,7 +201,7 @@ setDirectory(#wx_ref{type=ThisT,ref=ThisRef},Dir) -spec setFilename(This, Name) -> 'ok' when This::wxFileDialog(), Name::unicode:chardata(). setFilename(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxFileDialog), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:cast(?wxFileDialog_SetFilename, @@ -220,7 +220,7 @@ setFilterIndex(#wx_ref{type=ThisT,ref=ThisRef},FilterIndex) -spec setMessage(This, Message) -> 'ok' when This::wxFileDialog(), Message::unicode:chardata(). setMessage(#wx_ref{type=ThisT,ref=ThisRef},Message) - when is_list(Message) -> + when ?is_chardata(Message) -> ?CLASS(ThisT,wxFileDialog), Message_UC = unicode:characters_to_binary([Message,0]), wxe_util:cast(?wxFileDialog_SetMessage, @@ -230,7 +230,7 @@ setMessage(#wx_ref{type=ThisT,ref=ThisRef},Message) -spec setPath(This, Path) -> 'ok' when This::wxFileDialog(), Path::unicode:chardata(). setPath(#wx_ref{type=ThisT,ref=ThisRef},Path) - when is_list(Path) -> + when ?is_chardata(Path) -> ?CLASS(ThisT,wxFileDialog), Path_UC = unicode:characters_to_binary([Path,0]), wxe_util:cast(?wxFileDialog_SetPath, @@ -240,7 +240,7 @@ setPath(#wx_ref{type=ThisT,ref=ThisRef},Path) -spec setWildcard(This, WildCard) -> 'ok' when This::wxFileDialog(), WildCard::unicode:chardata(). setWildcard(#wx_ref{type=ThisT,ref=ThisRef},WildCard) - when is_list(WildCard) -> + when ?is_chardata(WildCard) -> ?CLASS(ThisT,wxFileDialog), WildCard_UC = unicode:characters_to_binary([WildCard,0]), wxe_util:cast(?wxFileDialog_SetWildcard, @@ -324,6 +324,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -640,6 +642,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxFilePickerCtrl.erl b/lib/wx/src/gen/wxFilePickerCtrl.erl index 396403dc22..3b1943cbee 100644 --- a/lib/wx/src/gen/wxFilePickerCtrl.erl +++ b/lib/wx/src/gen/wxFilePickerCtrl.erl @@ -39,17 +39,18 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getInternalMargin/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1, - getParent/1,getPickerCtrlProportion/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSize/1,getSizer/1,getTextCtrl/1,getTextCtrlProportion/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getInternalMargin/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPickerCtrlProportion/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextCtrl/1, + getTextCtrlProportion/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1, isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1, @@ -170,7 +171,7 @@ getPath(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setPath(This, Str) -> 'ok' when This::wxFilePickerCtrl(), Str::unicode:chardata(). setPath(#wx_ref{type=ThisT,ref=ThisRef},Str) - when is_list(Str) -> + when ?is_chardata(Str) -> ?CLASS(ThisT,wxFilePickerCtrl), Str_UC = unicode:characters_to_binary([Str,0]), wxe_util:cast(?wxFilePickerCtrl_SetPath, @@ -218,6 +219,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -534,6 +537,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxFindReplaceData.erl b/lib/wx/src/gen/wxFindReplaceData.erl index 9b4b910f7e..388bf5f238 100644 --- a/lib/wx/src/gen/wxFindReplaceData.erl +++ b/lib/wx/src/gen/wxFindReplaceData.erl @@ -87,7 +87,7 @@ setFlags(#wx_ref{type=ThisT,ref=ThisRef},Flags) -spec setFindString(This, Str) -> 'ok' when This::wxFindReplaceData(), Str::unicode:chardata(). setFindString(#wx_ref{type=ThisT,ref=ThisRef},Str) - when is_list(Str) -> + when ?is_chardata(Str) -> ?CLASS(ThisT,wxFindReplaceData), Str_UC = unicode:characters_to_binary([Str,0]), wxe_util:cast(?wxFindReplaceData_SetFindString, @@ -97,7 +97,7 @@ setFindString(#wx_ref{type=ThisT,ref=ThisRef},Str) -spec setReplaceString(This, Str) -> 'ok' when This::wxFindReplaceData(), Str::unicode:chardata(). setReplaceString(#wx_ref{type=ThisT,ref=ThisRef},Str) - when is_list(Str) -> + when ?is_chardata(Str) -> ?CLASS(ThisT,wxFindReplaceData), Str_UC = unicode:characters_to_binary([Str,0]), wxe_util:cast(?wxFindReplaceData_SetReplaceString, diff --git a/lib/wx/src/gen/wxFindReplaceDialog.erl b/lib/wx/src/gen/wxFindReplaceDialog.erl index a34fc329ae..9250c2fa2f 100644 --- a/lib/wx/src/gen/wxFindReplaceDialog.erl +++ b/lib/wx/src/gen/wxFindReplaceDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -99,7 +99,7 @@ new() -> Parent::wxWindow:wxWindow(), Data::wxFindReplaceData:wxFindReplaceData(), Title::unicode:chardata(). new(Parent,Data,Title) - when is_record(Parent, wx_ref),is_record(Data, wx_ref),is_list(Title) -> + when is_record(Parent, wx_ref),is_record(Data, wx_ref),?is_chardata(Title) -> new(Parent,Data,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxfindreplacedialog.html#wxfindreplacedialogwxfindreplacedialog">external documentation</a>. @@ -107,7 +107,7 @@ new(Parent,Data,Title) Parent::wxWindow:wxWindow(), Data::wxFindReplaceData:wxFindReplaceData(), Title::unicode:chardata(), Option :: {'style', integer()}. new(#wx_ref{type=ParentT,ref=ParentRef},#wx_ref{type=DataT,ref=DataRef},Title, Options) - when is_list(Title),is_list(Options) -> + when ?is_chardata(Title),is_list(Options) -> ?CLASS(ParentT,wxWindow), ?CLASS(DataT,wxFindReplaceData), Title_UC = unicode:characters_to_binary([Title,0]), @@ -122,7 +122,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},#wx_ref{type=DataT,ref=DataRef},Title, O This::wxFindReplaceDialog(), Parent::wxWindow:wxWindow(), Data::wxFindReplaceData:wxFindReplaceData(), Title::unicode:chardata(). create(This,Parent,Data,Title) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_record(Data, wx_ref),is_list(Title) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_record(Data, wx_ref),?is_chardata(Title) -> create(This,Parent,Data,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxfindreplacedialog.html#wxfindreplacedialogcreate">external documentation</a>. @@ -130,7 +130,7 @@ create(This,Parent,Data,Title) This::wxFindReplaceDialog(), Parent::wxWindow:wxWindow(), Data::wxFindReplaceData:wxFindReplaceData(), Title::unicode:chardata(), Option :: {'style', integer()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},#wx_ref{type=DataT,ref=DataRef},Title, Options) - when is_list(Title),is_list(Options) -> + when ?is_chardata(Title),is_list(Options) -> ?CLASS(ThisT,wxFindReplaceDialog), ?CLASS(ParentT,wxWindow), ?CLASS(DataT,wxFindReplaceData), @@ -227,6 +227,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -543,6 +545,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxFont.erl b/lib/wx/src/gen/wxFont.erl index 56e6e96b6d..fb0ba8b505 100644 --- a/lib/wx/src/gen/wxFont.erl +++ b/lib/wx/src/gen/wxFont.erl @@ -49,7 +49,7 @@ new() -> -spec new(Fontname) -> wxFont() when Fontname::unicode:chardata(). new(Fontname) - when is_list(Fontname) -> + when ?is_chardata(Fontname) -> Fontname_UC = unicode:characters_to_binary([Fontname,0]), wxe_util:construct(?wxFont_new_1, <<(byte_size(Fontname_UC)):32/?UI,(Fontname_UC)/binary, 0:(((8- ((4+byte_size(Fontname_UC)) band 16#7)) band 16#7))/unit:8>>). @@ -183,7 +183,7 @@ setDefaultEncoding(Encoding) -spec setFaceName(This, FaceName) -> boolean() when This::wxFont(), FaceName::unicode:chardata(). setFaceName(#wx_ref{type=ThisT,ref=ThisRef},FaceName) - when is_list(FaceName) -> + when ?is_chardata(FaceName) -> ?CLASS(ThisT,wxFont), FaceName_UC = unicode:characters_to_binary([FaceName,0]), wxe_util:call(?wxFont_SetFaceName, diff --git a/lib/wx/src/gen/wxFontDialog.erl b/lib/wx/src/gen/wxFontDialog.erl index 3e6a913973..26010aa46b 100644 --- a/lib/wx/src/gen/wxFontDialog.erl +++ b/lib/wx/src/gen/wxFontDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -199,6 +199,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -515,6 +517,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxFontPickerCtrl.erl b/lib/wx/src/gen/wxFontPickerCtrl.erl index 0356f795eb..d1234c5589 100644 --- a/lib/wx/src/gen/wxFontPickerCtrl.erl +++ b/lib/wx/src/gen/wxFontPickerCtrl.erl @@ -40,17 +40,18 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getInternalMargin/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1, - getParent/1,getPickerCtrlProportion/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSize/1,getSizer/1,getTextCtrl/1,getTextCtrlProportion/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getInternalMargin/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPickerCtrlProportion/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextCtrl/1, + getTextCtrlProportion/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTextCtrl/1,hasTransparentBackground/1, hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isPickerCtrlGrowable/1, isRetained/1,isShown/1,isTextCtrlGrowable/1,isTopLevel/1,layout/1, @@ -227,6 +228,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -543,6 +546,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxFrame.erl b/lib/wx/src/gen/wxFrame.erl index 93aad5b235..1dc6106bfa 100644 --- a/lib/wx/src/gen/wxFrame.erl +++ b/lib/wx/src/gen/wxFrame.erl @@ -43,32 +43,32 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1, - getParent/1,getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1, - getScrollPos/2,getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1, - getTextExtent/2,getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1, - getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, - hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2, - inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1, - isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, - isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1, - layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1, - maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1, - screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, - setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, - setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, - setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, + getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, + getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, + getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, + hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, + isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, + isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1, + isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, + makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, + moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, + popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, + screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, + scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2, + setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2, + setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1, + setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2, + setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, @@ -99,7 +99,7 @@ new() -> Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(). new(Parent,Id,Title) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> new(Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxframe.html#wxframewxframe">external documentation</a>. @@ -109,7 +109,7 @@ new(Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -125,7 +125,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) This::wxFrame(), Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(). create(This,Parent,Id,Title) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> create(This,Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxframe.html#wxframecreate">external documentation</a>. @@ -135,7 +135,7 @@ create(This,Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ThisT,wxFrame), ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), @@ -284,7 +284,7 @@ setStatusBarPane(#wx_ref{type=ThisT,ref=ThisRef},N) This::wxFrame(), Text::unicode:chardata(). setStatusText(This,Text) - when is_record(This, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),?is_chardata(Text) -> setStatusText(This,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxframe.html#wxframesetstatustext">external documentation</a>. @@ -292,7 +292,7 @@ setStatusText(This,Text) This::wxFrame(), Text::unicode:chardata(), Option :: {'number', integer()}. setStatusText(#wx_ref{type=ThisT,ref=ThisRef},Text, Options) - when is_list(Text),is_list(Options) -> + when ?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxFrame), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({number, Number}, Acc) -> [<<1:32/?UI,Number:32/?UI>>|Acc]; @@ -375,6 +375,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -695,6 +697,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxGLCanvas.erl b/lib/wx/src/gen/wxGLCanvas.erl index 2007047bd3..8a94d1df26 100644 --- a/lib/wx/src/gen/wxGLCanvas.erl +++ b/lib/wx/src/gen/wxGLCanvas.erl @@ -37,29 +37,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -194,6 +194,8 @@ destroy(Obj=#wx_ref{type=Type}) -> ok. %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -514,6 +516,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxGauge.erl b/lib/wx/src/gen/wxGauge.erl index fa2e7618e8..40f7f120b0 100644 --- a/lib/wx/src/gen/wxGauge.erl +++ b/lib/wx/src/gen/wxGauge.erl @@ -39,29 +39,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -204,6 +204,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -520,6 +522,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxGenericDirCtrl.erl b/lib/wx/src/gen/wxGenericDirCtrl.erl index 3ea99c682d..383d592269 100644 --- a/lib/wx/src/gen/wxGenericDirCtrl.erl +++ b/lib/wx/src/gen/wxGenericDirCtrl.erl @@ -41,29 +41,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -175,7 +175,7 @@ collapseTree(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec expandPath(This, Path) -> boolean() when This::wxGenericDirCtrl(), Path::unicode:chardata(). expandPath(#wx_ref{type=ThisT,ref=ThisRef},Path) - when is_list(Path) -> + when ?is_chardata(Path) -> ?CLASS(ThisT,wxGenericDirCtrl), Path_UC = unicode:characters_to_binary([Path,0]), wxe_util:call(?wxGenericDirCtrl_ExpandPath, @@ -249,7 +249,7 @@ reCreateTree(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setDefaultPath(This, Path) -> 'ok' when This::wxGenericDirCtrl(), Path::unicode:chardata(). setDefaultPath(#wx_ref{type=ThisT,ref=ThisRef},Path) - when is_list(Path) -> + when ?is_chardata(Path) -> ?CLASS(ThisT,wxGenericDirCtrl), Path_UC = unicode:characters_to_binary([Path,0]), wxe_util:cast(?wxGenericDirCtrl_SetDefaultPath, @@ -259,7 +259,7 @@ setDefaultPath(#wx_ref{type=ThisT,ref=ThisRef},Path) -spec setFilter(This, Filter) -> 'ok' when This::wxGenericDirCtrl(), Filter::unicode:chardata(). setFilter(#wx_ref{type=ThisT,ref=ThisRef},Filter) - when is_list(Filter) -> + when ?is_chardata(Filter) -> ?CLASS(ThisT,wxGenericDirCtrl), Filter_UC = unicode:characters_to_binary([Filter,0]), wxe_util:cast(?wxGenericDirCtrl_SetFilter, @@ -278,7 +278,7 @@ setFilterIndex(#wx_ref{type=ThisT,ref=ThisRef},N) -spec setPath(This, Path) -> 'ok' when This::wxGenericDirCtrl(), Path::unicode:chardata(). setPath(#wx_ref{type=ThisT,ref=ThisRef},Path) - when is_list(Path) -> + when ?is_chardata(Path) -> ?CLASS(ThisT,wxGenericDirCtrl), Path_UC = unicode:characters_to_binary([Path,0]), wxe_util:cast(?wxGenericDirCtrl_SetPath, @@ -297,6 +297,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -613,6 +615,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxGraphicsContext.erl b/lib/wx/src/gen/wxGraphicsContext.erl index 0aa2119210..2d0271ac48 100644 --- a/lib/wx/src/gen/wxGraphicsContext.erl +++ b/lib/wx/src/gen/wxGraphicsContext.erl @@ -287,7 +287,7 @@ drawRoundedRectangle(#wx_ref{type=ThisT,ref=ThisRef},X,Y,W,H,Radius) -spec drawText(This, Str, X, Y) -> 'ok' when This::wxGraphicsContext(), Str::unicode:chardata(), X::number(), Y::number(). drawText(#wx_ref{type=ThisT,ref=ThisRef},Str,X,Y) - when is_list(Str),is_number(X),is_number(Y) -> + when ?is_chardata(Str),is_number(X),is_number(Y) -> ?CLASS(ThisT,wxGraphicsContext), Str_UC = unicode:characters_to_binary([Str,0]), wxe_util:cast(?wxGraphicsContext_DrawText_3, @@ -303,13 +303,13 @@ drawText(#wx_ref{type=ThisT,ref=ThisRef},Str,X,Y) (This, Str, X, Y, BackgroundBrush) -> 'ok' when This::wxGraphicsContext(), Str::unicode:chardata(), X::number(), Y::number(), BackgroundBrush::wxGraphicsBrush:wxGraphicsBrush(). drawText(#wx_ref{type=ThisT,ref=ThisRef},Str,X,Y,Angle) - when is_list(Str),is_number(X),is_number(Y),is_number(Angle) -> + when ?is_chardata(Str),is_number(X),is_number(Y),is_number(Angle) -> ?CLASS(ThisT,wxGraphicsContext), Str_UC = unicode:characters_to_binary([Str,0]), wxe_util:cast(?wxGraphicsContext_DrawText_4_0, <<ThisRef:32/?UI,(byte_size(Str_UC)):32/?UI,(Str_UC)/binary, 0:(((8- ((0+byte_size(Str_UC)) band 16#7)) band 16#7))/unit:8,X:64/?F,Y:64/?F,Angle:64/?F>>); drawText(#wx_ref{type=ThisT,ref=ThisRef},Str,X,Y,#wx_ref{type=BackgroundBrushT,ref=BackgroundBrushRef}) - when is_list(Str),is_number(X),is_number(Y) -> + when ?is_chardata(Str),is_number(X),is_number(Y) -> ?CLASS(ThisT,wxGraphicsContext), Str_UC = unicode:characters_to_binary([Str,0]), ?CLASS(BackgroundBrushT,wxGraphicsBrush), @@ -320,7 +320,7 @@ drawText(#wx_ref{type=ThisT,ref=ThisRef},Str,X,Y,#wx_ref{type=BackgroundBrushT,r -spec drawText(This, Str, X, Y, Angle, BackgroundBrush) -> 'ok' when This::wxGraphicsContext(), Str::unicode:chardata(), X::number(), Y::number(), Angle::number(), BackgroundBrush::wxGraphicsBrush:wxGraphicsBrush(). drawText(#wx_ref{type=ThisT,ref=ThisRef},Str,X,Y,Angle,#wx_ref{type=BackgroundBrushT,ref=BackgroundBrushRef}) - when is_list(Str),is_number(X),is_number(Y),is_number(Angle) -> + when ?is_chardata(Str),is_number(X),is_number(Y),is_number(Angle) -> ?CLASS(ThisT,wxGraphicsContext), Str_UC = unicode:characters_to_binary([Str,0]), ?CLASS(BackgroundBrushT,wxGraphicsBrush), @@ -363,7 +363,7 @@ strokePath(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PathT,ref=PathRef}) -> -spec getPartialTextExtents(This, Text) -> [number()] when This::wxGraphicsContext(), Text::unicode:chardata(). getPartialTextExtents(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxGraphicsContext), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxGraphicsContext_GetPartialTextExtents, @@ -374,7 +374,7 @@ getPartialTextExtents(#wx_ref{type=ThisT,ref=ThisRef},Text) Result ::{Width::number(), Height::number(), Descent::number(), ExternalLeading::number()}, This::wxGraphicsContext(), Text::unicode:chardata(). getTextExtent(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxGraphicsContext), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxGraphicsContext_GetTextExtent, diff --git a/lib/wx/src/gen/wxGrid.erl b/lib/wx/src/gen/wxGrid.erl index a1533cbd9f..b8c94ab555 100644 --- a/lib/wx/src/gen/wxGrid.erl +++ b/lib/wx/src/gen/wxGrid.erl @@ -91,37 +91,37 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - doPrepareDC/2,enable/1,enable/2,enableScrolling/3,findWindow/2,fitInside/1, - freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, - getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, - getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPixelsPerUnit/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getToolTip/1,getUpdateRegion/1,getViewStart/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scroll/3, - scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, - setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, - setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2, - setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, - setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, - setScrollPos/4,setScrollRate/3,setScrollbar/5,setScrollbar/6,setScrollbars/5, - setScrollbars/6,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2, - setSizeHints/3,setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2, - setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2,setToolTip/2, - setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, + doPrepareDC/2,dragAcceptFiles/2,enable/1,enable/2,enableScrolling/3, + findWindow/2,fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, + getBackgroundStyle/1,getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1, + getChildren/1,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, + getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPixelsPerUnit/1, + getScrollPos/2,getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1, + getTextExtent/2,getTextExtent/3,getToolTip/1,getUpdateRegion/1,getViewStart/1, + getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, + hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,raise/1,refresh/1,refresh/2, + refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,reparent/2, + screenToClient/1,screenToClient/2,scroll/3,scrollLines/2,scrollPages/2, + scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, + setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, + setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, + setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, + setPalette/2,setScrollPos/3,setScrollPos/4,setScrollRate/3,setScrollbar/5, + setScrollbar/6,setScrollbars/5,setScrollbars/6,setSize/2,setSize/3, + setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, + setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2, + setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, @@ -851,7 +851,7 @@ getDefaultEditorForCell(#wx_ref{type=ThisT,ref=ThisRef},Row,Col) -spec getDefaultEditorForType(This, TypeName) -> wxGridCellEditor:wxGridCellEditor() when This::wxGrid(), TypeName::unicode:chardata(). getDefaultEditorForType(#wx_ref{type=ThisT,ref=ThisRef},TypeName) - when is_list(TypeName) -> + when ?is_chardata(TypeName) -> ?CLASS(ThisT,wxGrid), TypeName_UC = unicode:characters_to_binary([TypeName,0]), wxe_util:call(?wxGrid_GetDefaultEditorForType, @@ -878,7 +878,7 @@ getDefaultRendererForCell(#wx_ref{type=ThisT,ref=ThisRef},Row,Col) -spec getDefaultRendererForType(This, TypeName) -> wxGridCellRenderer:wxGridCellRenderer() when This::wxGrid(), TypeName::unicode:chardata(). getDefaultRendererForType(#wx_ref{type=ThisT,ref=ThisRef},TypeName) - when is_list(TypeName) -> + when ?is_chardata(TypeName) -> ?CLASS(ThisT,wxGrid), TypeName_UC = unicode:characters_to_binary([TypeName,0]), wxe_util:call(?wxGrid_GetDefaultRendererForType, @@ -1407,7 +1407,7 @@ movePageUp(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec registerDataType(This, TypeName, Renderer, Editor) -> 'ok' when This::wxGrid(), TypeName::unicode:chardata(), Renderer::wxGridCellRenderer:wxGridCellRenderer(), Editor::wxGridCellEditor:wxGridCellEditor(). registerDataType(#wx_ref{type=ThisT,ref=ThisRef},TypeName,#wx_ref{type=RendererT,ref=RendererRef},#wx_ref{type=EditorT,ref=EditorRef}) - when is_list(TypeName) -> + when ?is_chardata(TypeName) -> ?CLASS(ThisT,wxGrid), TypeName_UC = unicode:characters_to_binary([TypeName,0]), ?CLASS(RendererT,wxGridCellRenderer), @@ -1634,7 +1634,7 @@ setCellTextColour(#wx_ref{type=ThisT,ref=ThisRef},Val,Row,Col) -spec setCellValue(This, Coords, S) -> 'ok' when This::wxGrid(), Coords::{R::integer(), C::integer()}, S::unicode:chardata(). setCellValue(#wx_ref{type=ThisT,ref=ThisRef},{CoordsR,CoordsC},S) - when is_integer(CoordsR),is_integer(CoordsC),is_list(S) -> + when is_integer(CoordsR),is_integer(CoordsC),?is_chardata(S) -> ?CLASS(ThisT,wxGrid), S_UC = unicode:characters_to_binary([S,0]), wxe_util:cast(?wxGrid_SetCellValue_2, @@ -1650,13 +1650,13 @@ setCellValue(#wx_ref{type=ThisT,ref=ThisRef},{CoordsR,CoordsC},S) (This, Val, Row, Col) -> 'ok' when This::wxGrid(), Val::unicode:chardata(), Row::integer(), Col::integer(). setCellValue(#wx_ref{type=ThisT,ref=ThisRef},Row,Col,S) - when is_integer(Row),is_integer(Col),is_list(S) -> + when is_integer(Row),is_integer(Col),?is_chardata(S) -> ?CLASS(ThisT,wxGrid), S_UC = unicode:characters_to_binary([S,0]), wxe_util:cast(?wxGrid_SetCellValue_3_0, <<ThisRef:32/?UI,Row:32/?UI,Col:32/?UI,(byte_size(S_UC)):32/?UI,(S_UC)/binary, 0:(((8- ((0+byte_size(S_UC)) band 16#7)) band 16#7))/unit:8>>); setCellValue(#wx_ref{type=ThisT,ref=ThisRef},Val,Row,Col) - when is_list(Val),is_integer(Row),is_integer(Col) -> + when ?is_chardata(Val),is_integer(Row),is_integer(Col) -> ?CLASS(ThisT,wxGrid), Val_UC = unicode:characters_to_binary([Val,0]), wxe_util:cast(?wxGrid_SetCellValue_3_1, @@ -1717,7 +1717,7 @@ setColFormatFloat(#wx_ref{type=ThisT,ref=ThisRef},Col, Options) -spec setColFormatCustom(This, Col, TypeName) -> 'ok' when This::wxGrid(), Col::integer(), TypeName::unicode:chardata(). setColFormatCustom(#wx_ref{type=ThisT,ref=ThisRef},Col,TypeName) - when is_integer(Col),is_list(TypeName) -> + when is_integer(Col),?is_chardata(TypeName) -> ?CLASS(ThisT,wxGrid), TypeName_UC = unicode:characters_to_binary([TypeName,0]), wxe_util:cast(?wxGrid_SetColFormatCustom, @@ -1745,7 +1745,7 @@ setColLabelSize(#wx_ref{type=ThisT,ref=ThisRef},Height) -spec setColLabelValue(This, Col, Val) -> 'ok' when This::wxGrid(), Col::integer(), Val::unicode:chardata(). setColLabelValue(#wx_ref{type=ThisT,ref=ThisRef},Col,Val) - when is_integer(Col),is_list(Val) -> + when is_integer(Col),?is_chardata(Val) -> ?CLASS(ThisT,wxGrid), Val_UC = unicode:characters_to_binary([Val,0]), wxe_util:cast(?wxGrid_SetColLabelValue, @@ -1981,7 +1981,7 @@ setRowLabelSize(#wx_ref{type=ThisT,ref=ThisRef},Width) -spec setRowLabelValue(This, Row, Val) -> 'ok' when This::wxGrid(), Row::integer(), Val::unicode:chardata(). setRowLabelValue(#wx_ref{type=ThisT,ref=ThisRef},Row,Val) - when is_integer(Row),is_list(Val) -> + when is_integer(Row),?is_chardata(Val) -> ?CLASS(ThisT,wxGrid), Val_UC = unicode:characters_to_binary([Val,0]), wxe_util:cast(?wxGrid_SetRowLabelValue, @@ -2158,6 +2158,8 @@ setFocusIgnoringChildren(This) -> wxPanel:setFocusIgnoringChildren(This). initDialog(This) -> wxPanel:initDialog(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -2474,6 +2476,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxGridCellBoolEditor.erl b/lib/wx/src/gen/wxGridCellBoolEditor.erl index 1d949d54ff..59348f94f8 100644 --- a/lib/wx/src/gen/wxGridCellBoolEditor.erl +++ b/lib/wx/src/gen/wxGridCellBoolEditor.erl @@ -52,7 +52,7 @@ new() -> -spec isTrueValue(Value) -> boolean() when Value::unicode:chardata(). isTrueValue(Value) - when is_list(Value) -> + when ?is_chardata(Value) -> Value_UC = unicode:characters_to_binary([Value,0]), wxe_util:call(?wxGridCellBoolEditor_IsTrueValue, <<(byte_size(Value_UC)):32/?UI,(Value_UC)/binary, 0:(((8- ((4+byte_size(Value_UC)) band 16#7)) band 16#7))/unit:8>>). diff --git a/lib/wx/src/gen/wxGridCellChoiceEditor.erl b/lib/wx/src/gen/wxGridCellChoiceEditor.erl index d5487c3618..8f4a07a0bb 100644 --- a/lib/wx/src/gen/wxGridCellChoiceEditor.erl +++ b/lib/wx/src/gen/wxGridCellChoiceEditor.erl @@ -68,7 +68,7 @@ new(Choices, Options) -spec setParameters(This, Params) -> 'ok' when This::wxGridCellChoiceEditor(), Params::unicode:chardata(). setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) - when is_list(Params) -> + when ?is_chardata(Params) -> ?CLASS(ThisT,wxGridCellChoiceEditor), Params_UC = unicode:characters_to_binary([Params,0]), wxe_util:cast(?wxGridCellChoiceEditor_SetParameters, diff --git a/lib/wx/src/gen/wxGridCellFloatEditor.erl b/lib/wx/src/gen/wxGridCellFloatEditor.erl index 6e85469ecf..90b9542afc 100644 --- a/lib/wx/src/gen/wxGridCellFloatEditor.erl +++ b/lib/wx/src/gen/wxGridCellFloatEditor.erl @@ -65,7 +65,7 @@ new(Options) -spec setParameters(This, Params) -> 'ok' when This::wxGridCellFloatEditor(), Params::unicode:chardata(). setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) - when is_list(Params) -> + when ?is_chardata(Params) -> ?CLASS(ThisT,wxGridCellFloatEditor), Params_UC = unicode:characters_to_binary([Params,0]), wxe_util:cast(?wxGridCellFloatEditor_SetParameters, diff --git a/lib/wx/src/gen/wxGridCellFloatRenderer.erl b/lib/wx/src/gen/wxGridCellFloatRenderer.erl index ccb29902b3..72bdc6fc29 100644 --- a/lib/wx/src/gen/wxGridCellFloatRenderer.erl +++ b/lib/wx/src/gen/wxGridCellFloatRenderer.erl @@ -81,7 +81,7 @@ getWidth(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setParameters(This, Params) -> 'ok' when This::wxGridCellFloatRenderer(), Params::unicode:chardata(). setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) - when is_list(Params) -> + when ?is_chardata(Params) -> ?CLASS(ThisT,wxGridCellFloatRenderer), Params_UC = unicode:characters_to_binary([Params,0]), wxe_util:cast(?wxGridCellFloatRenderer_SetParameters, diff --git a/lib/wx/src/gen/wxGridCellNumberEditor.erl b/lib/wx/src/gen/wxGridCellNumberEditor.erl index 7a47024b2f..22f9a1839c 100644 --- a/lib/wx/src/gen/wxGridCellNumberEditor.erl +++ b/lib/wx/src/gen/wxGridCellNumberEditor.erl @@ -75,7 +75,7 @@ getValue(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setParameters(This, Params) -> 'ok' when This::wxGridCellNumberEditor(), Params::unicode:chardata(). setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) - when is_list(Params) -> + when ?is_chardata(Params) -> ?CLASS(ThisT,wxGridCellNumberEditor), Params_UC = unicode:characters_to_binary([Params,0]), wxe_util:cast(?wxGridCellNumberEditor_SetParameters, diff --git a/lib/wx/src/gen/wxGridCellTextEditor.erl b/lib/wx/src/gen/wxGridCellTextEditor.erl index 4ddb4a7028..39adda5d8b 100644 --- a/lib/wx/src/gen/wxGridCellTextEditor.erl +++ b/lib/wx/src/gen/wxGridCellTextEditor.erl @@ -52,7 +52,7 @@ new() -> -spec setParameters(This, Params) -> 'ok' when This::wxGridCellTextEditor(), Params::unicode:chardata(). setParameters(#wx_ref{type=ThisT,ref=ThisRef},Params) - when is_list(Params) -> + when ?is_chardata(Params) -> ?CLASS(ThisT,wxGridCellTextEditor), Params_UC = unicode:characters_to_binary([Params,0]), wxe_util:cast(?wxGridCellTextEditor_SetParameters, diff --git a/lib/wx/src/gen/wxHtmlEasyPrinting.erl b/lib/wx/src/gen/wxHtmlEasyPrinting.erl index a2cf46ed8d..dfb9dcfa1c 100644 --- a/lib/wx/src/gen/wxHtmlEasyPrinting.erl +++ b/lib/wx/src/gen/wxHtmlEasyPrinting.erl @@ -77,7 +77,7 @@ getPageSetupData(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec previewFile(This, Htmlfile) -> boolean() when This::wxHtmlEasyPrinting(), Htmlfile::unicode:chardata(). previewFile(#wx_ref{type=ThisT,ref=ThisRef},Htmlfile) - when is_list(Htmlfile) -> + when ?is_chardata(Htmlfile) -> ?CLASS(ThisT,wxHtmlEasyPrinting), Htmlfile_UC = unicode:characters_to_binary([Htmlfile,0]), wxe_util:call(?wxHtmlEasyPrinting_PreviewFile, @@ -88,7 +88,7 @@ previewFile(#wx_ref{type=ThisT,ref=ThisRef},Htmlfile) This::wxHtmlEasyPrinting(), Htmltext::unicode:chardata(). previewText(This,Htmltext) - when is_record(This, wx_ref),is_list(Htmltext) -> + when is_record(This, wx_ref),?is_chardata(Htmltext) -> previewText(This,Htmltext, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxhtmleasyprinting.html#wxhtmleasyprintingpreviewtext">external documentation</a>. @@ -96,7 +96,7 @@ previewText(This,Htmltext) This::wxHtmlEasyPrinting(), Htmltext::unicode:chardata(), Option :: {'basepath', unicode:chardata()}. previewText(#wx_ref{type=ThisT,ref=ThisRef},Htmltext, Options) - when is_list(Htmltext),is_list(Options) -> + when ?is_chardata(Htmltext),is_list(Options) -> ?CLASS(ThisT,wxHtmlEasyPrinting), Htmltext_UC = unicode:characters_to_binary([Htmltext,0]), MOpts = fun({basepath, Basepath}, Acc) -> Basepath_UC = unicode:characters_to_binary([Basepath,0]),[<<1:32/?UI,(byte_size(Basepath_UC)):32/?UI,(Basepath_UC)/binary, 0:(((8- ((0+byte_size(Basepath_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -109,7 +109,7 @@ previewText(#wx_ref{type=ThisT,ref=ThisRef},Htmltext, Options) -spec printFile(This, Htmlfile) -> boolean() when This::wxHtmlEasyPrinting(), Htmlfile::unicode:chardata(). printFile(#wx_ref{type=ThisT,ref=ThisRef},Htmlfile) - when is_list(Htmlfile) -> + when ?is_chardata(Htmlfile) -> ?CLASS(ThisT,wxHtmlEasyPrinting), Htmlfile_UC = unicode:characters_to_binary([Htmlfile,0]), wxe_util:call(?wxHtmlEasyPrinting_PrintFile, @@ -120,7 +120,7 @@ printFile(#wx_ref{type=ThisT,ref=ThisRef},Htmlfile) This::wxHtmlEasyPrinting(), Htmltext::unicode:chardata(). printText(This,Htmltext) - when is_record(This, wx_ref),is_list(Htmltext) -> + when is_record(This, wx_ref),?is_chardata(Htmltext) -> printText(This,Htmltext, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxhtmleasyprinting.html#wxhtmleasyprintingprinttext">external documentation</a>. @@ -128,7 +128,7 @@ printText(This,Htmltext) This::wxHtmlEasyPrinting(), Htmltext::unicode:chardata(), Option :: {'basepath', unicode:chardata()}. printText(#wx_ref{type=ThisT,ref=ThisRef},Htmltext, Options) - when is_list(Htmltext),is_list(Options) -> + when ?is_chardata(Htmltext),is_list(Options) -> ?CLASS(ThisT,wxHtmlEasyPrinting), Htmltext_UC = unicode:characters_to_binary([Htmltext,0]), MOpts = fun({basepath, Basepath}, Acc) -> Basepath_UC = unicode:characters_to_binary([Basepath,0]),[<<1:32/?UI,(byte_size(Basepath_UC)):32/?UI,(Basepath_UC)/binary, 0:(((8- ((0+byte_size(Basepath_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -150,7 +150,7 @@ pageSetup(#wx_ref{type=ThisT,ref=ThisRef}) -> This::wxHtmlEasyPrinting(), Normal_face::unicode:chardata(), Fixed_face::unicode:chardata(). setFonts(This,Normal_face,Fixed_face) - when is_record(This, wx_ref),is_list(Normal_face),is_list(Fixed_face) -> + when is_record(This, wx_ref),?is_chardata(Normal_face),?is_chardata(Fixed_face) -> setFonts(This,Normal_face,Fixed_face, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxhtmleasyprinting.html#wxhtmleasyprintingsetfonts">external documentation</a>. @@ -158,7 +158,7 @@ setFonts(This,Normal_face,Fixed_face) This::wxHtmlEasyPrinting(), Normal_face::unicode:chardata(), Fixed_face::unicode:chardata(), Option :: {'sizes', [integer()]}. setFonts(#wx_ref{type=ThisT,ref=ThisRef},Normal_face,Fixed_face, Options) - when is_list(Normal_face),is_list(Fixed_face),is_list(Options) -> + when ?is_chardata(Normal_face),?is_chardata(Fixed_face),is_list(Options) -> ?CLASS(ThisT,wxHtmlEasyPrinting), Normal_face_UC = unicode:characters_to_binary([Normal_face,0]), Fixed_face_UC = unicode:characters_to_binary([Fixed_face,0]), @@ -174,7 +174,7 @@ setFonts(#wx_ref{type=ThisT,ref=ThisRef},Normal_face,Fixed_face, Options) This::wxHtmlEasyPrinting(), Header::unicode:chardata(). setHeader(This,Header) - when is_record(This, wx_ref),is_list(Header) -> + when is_record(This, wx_ref),?is_chardata(Header) -> setHeader(This,Header, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxhtmleasyprinting.html#wxhtmleasyprintingsetheader">external documentation</a>. @@ -182,7 +182,7 @@ setHeader(This,Header) This::wxHtmlEasyPrinting(), Header::unicode:chardata(), Option :: {'pg', integer()}. setHeader(#wx_ref{type=ThisT,ref=ThisRef},Header, Options) - when is_list(Header),is_list(Options) -> + when ?is_chardata(Header),is_list(Options) -> ?CLASS(ThisT,wxHtmlEasyPrinting), Header_UC = unicode:characters_to_binary([Header,0]), MOpts = fun({pg, Pg}, Acc) -> [<<1:32/?UI,Pg:32/?UI>>|Acc]; @@ -196,7 +196,7 @@ setHeader(#wx_ref{type=ThisT,ref=ThisRef},Header, Options) This::wxHtmlEasyPrinting(), Footer::unicode:chardata(). setFooter(This,Footer) - when is_record(This, wx_ref),is_list(Footer) -> + when is_record(This, wx_ref),?is_chardata(Footer) -> setFooter(This,Footer, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxhtmleasyprinting.html#wxhtmleasyprintingsetfooter">external documentation</a>. @@ -204,7 +204,7 @@ setFooter(This,Footer) This::wxHtmlEasyPrinting(), Footer::unicode:chardata(), Option :: {'pg', integer()}. setFooter(#wx_ref{type=ThisT,ref=ThisRef},Footer, Options) - when is_list(Footer),is_list(Options) -> + when ?is_chardata(Footer),is_list(Options) -> ?CLASS(ThisT,wxHtmlEasyPrinting), Footer_UC = unicode:characters_to_binary([Footer,0]), MOpts = fun({pg, Pg}, Acc) -> [<<1:32/?UI,Pg:32/?UI>>|Acc]; diff --git a/lib/wx/src/gen/wxHtmlWindow.erl b/lib/wx/src/gen/wxHtmlWindow.erl index f9bb135fcf..7e3906b9a9 100644 --- a/lib/wx/src/gen/wxHtmlWindow.erl +++ b/lib/wx/src/gen/wxHtmlWindow.erl @@ -45,37 +45,37 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - doPrepareDC/2,enable/1,enable/2,enableScrolling/3,findWindow/2,fit/1, - fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, + doPrepareDC/2,dragAcceptFiles/2,enable/1,enable/2,enableScrolling/3, + findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, getBackgroundStyle/1,getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1, - getChildren/1,getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPixelsPerUnit/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getToolTip/1,getUpdateRegion/1,getViewStart/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scroll/3, - scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, - setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, - setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2, - setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, - setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, - setScrollPos/4,setScrollRate/3,setScrollbar/5,setScrollbar/6,setScrollbars/5, - setScrollbars/6,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2, - setSizeHints/3,setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2, - setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2,setToolTip/2, - setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, + getChildren/1,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, + getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPixelsPerUnit/1, + getScrollPos/2,getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1, + getTextExtent/2,getTextExtent/3,getToolTip/1,getUpdateRegion/1,getViewStart/1, + getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, + hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,raise/1,refresh/1,refresh/2, + refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,reparent/2, + screenToClient/1,screenToClient/2,scroll/3,scrollLines/2,scrollPages/2, + scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, + setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, + setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, + setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, + setPalette/2,setScrollPos/3,setScrollPos/4,setScrollRate/3,setScrollbar/5, + setScrollbar/6,setScrollbars/5,setScrollbars/6,setSize/2,setSize/3, + setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, + setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2, + setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, @@ -127,7 +127,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef}, Options) -spec appendToPage(This, Source) -> boolean() when This::wxHtmlWindow(), Source::unicode:chardata(). appendToPage(#wx_ref{type=ThisT,ref=ThisRef},Source) - when is_list(Source) -> + when ?is_chardata(Source) -> ?CLASS(ThisT,wxHtmlWindow), Source_UC = unicode:characters_to_binary([Source,0]), wxe_util:call(?wxHtmlWindow_AppendToPage, @@ -209,7 +209,7 @@ historyForward(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec loadFile(This, Filename) -> boolean() when This::wxHtmlWindow(), Filename::unicode:chardata(). loadFile(#wx_ref{type=ThisT,ref=ThisRef},Filename) - when is_list(Filename) -> + when ?is_chardata(Filename) -> ?CLASS(ThisT,wxHtmlWindow), Filename_UC = unicode:characters_to_binary([Filename,0]), wxe_util:call(?wxHtmlWindow_LoadFile, @@ -219,7 +219,7 @@ loadFile(#wx_ref{type=ThisT,ref=ThisRef},Filename) -spec loadPage(This, Location) -> boolean() when This::wxHtmlWindow(), Location::unicode:chardata(). loadPage(#wx_ref{type=ThisT,ref=ThisRef},Location) - when is_list(Location) -> + when ?is_chardata(Location) -> ?CLASS(ThisT,wxHtmlWindow), Location_UC = unicode:characters_to_binary([Location,0]), wxe_util:call(?wxHtmlWindow_LoadPage, @@ -273,7 +273,7 @@ setBorders(#wx_ref{type=ThisT,ref=ThisRef},B) This::wxHtmlWindow(), Normal_face::unicode:chardata(), Fixed_face::unicode:chardata(). setFonts(This,Normal_face,Fixed_face) - when is_record(This, wx_ref),is_list(Normal_face),is_list(Fixed_face) -> + when is_record(This, wx_ref),?is_chardata(Normal_face),?is_chardata(Fixed_face) -> setFonts(This,Normal_face,Fixed_face, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxhtmlwindow.html#wxhtmlwindowsetfonts">external documentation</a>. @@ -281,7 +281,7 @@ setFonts(This,Normal_face,Fixed_face) This::wxHtmlWindow(), Normal_face::unicode:chardata(), Fixed_face::unicode:chardata(), Option :: {'sizes', integer()}. setFonts(#wx_ref{type=ThisT,ref=ThisRef},Normal_face,Fixed_face, Options) - when is_list(Normal_face),is_list(Fixed_face),is_list(Options) -> + when ?is_chardata(Normal_face),?is_chardata(Fixed_face),is_list(Options) -> ?CLASS(ThisT,wxHtmlWindow), Normal_face_UC = unicode:characters_to_binary([Normal_face,0]), Fixed_face_UC = unicode:characters_to_binary([Fixed_face,0]), @@ -295,7 +295,7 @@ setFonts(#wx_ref{type=ThisT,ref=ThisRef},Normal_face,Fixed_face, Options) -spec setPage(This, Source) -> boolean() when This::wxHtmlWindow(), Source::unicode:chardata(). setPage(#wx_ref{type=ThisT,ref=ThisRef},Source) - when is_list(Source) -> + when ?is_chardata(Source) -> ?CLASS(ThisT,wxHtmlWindow), Source_UC = unicode:characters_to_binary([Source,0]), wxe_util:call(?wxHtmlWindow_SetPage, @@ -305,7 +305,7 @@ setPage(#wx_ref{type=ThisT,ref=ThisRef},Source) -spec setRelatedFrame(This, Frame, Format) -> 'ok' when This::wxHtmlWindow(), Frame::wxFrame:wxFrame(), Format::unicode:chardata(). setRelatedFrame(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=FrameT,ref=FrameRef},Format) - when is_list(Format) -> + when ?is_chardata(Format) -> ?CLASS(ThisT,wxHtmlWindow), ?CLASS(FrameT,wxFrame), Format_UC = unicode:characters_to_binary([Format,0]), @@ -371,6 +371,8 @@ setFocusIgnoringChildren(This) -> wxPanel:setFocusIgnoringChildren(This). initDialog(This) -> wxPanel:initDialog(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -689,6 +691,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxIcon.erl b/lib/wx/src/gen/wxIcon.erl index c9ec32dffc..9739a403ff 100644 --- a/lib/wx/src/gen/wxIcon.erl +++ b/lib/wx/src/gen/wxIcon.erl @@ -60,7 +60,7 @@ new() -> Loc::wx:wx_object(). new(Filename) - when is_list(Filename) -> + when ?is_chardata(Filename) -> new(Filename, []); new(#wx_ref{type=LocT,ref=LocRef}) -> ?CLASS(LocT,wx), @@ -75,7 +75,7 @@ new(#wx_ref{type=LocT,ref=LocRef}) -> | {'desiredWidth', integer()} | {'desiredHeight', integer()}. new(Filename, Options) - when is_list(Filename),is_list(Options) -> + when ?is_chardata(Filename),is_list(Options) -> Filename_UC = unicode:characters_to_binary([Filename,0]), MOpts = fun({type, Type}, Acc) -> [<<1:32/?UI,Type:32/?UI>>|Acc]; ({desiredWidth, DesiredWidth}, Acc) -> [<<2:32/?UI,DesiredWidth:32/?UI>>|Acc]; diff --git a/lib/wx/src/gen/wxIconBundle.erl b/lib/wx/src/gen/wxIconBundle.erl index 47785963e3..aecf382a9f 100644 --- a/lib/wx/src/gen/wxIconBundle.erl +++ b/lib/wx/src/gen/wxIconBundle.erl @@ -58,7 +58,7 @@ new(#wx_ref{type=IcT,ref=IcRef}) -> -spec new(File, Type) -> wxIconBundle() when File::unicode:chardata(), Type::integer(). new(File,Type) - when is_list(File),is_integer(Type) -> + when ?is_chardata(File),is_integer(Type) -> File_UC = unicode:characters_to_binary([File,0]), wxe_util:construct(?wxIconBundle_new_2, <<(byte_size(File_UC)):32/?UI,(File_UC)/binary, 0:(((8- ((4+byte_size(File_UC)) band 16#7)) band 16#7))/unit:8,Type:32/?UI>>). @@ -76,7 +76,7 @@ addIcon(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=IconT,ref=IconRef}) -> -spec addIcon(This, File, Type) -> 'ok' when This::wxIconBundle(), File::unicode:chardata(), Type::integer(). addIcon(#wx_ref{type=ThisT,ref=ThisRef},File,Type) - when is_list(File),is_integer(Type) -> + when ?is_chardata(File),is_integer(Type) -> ?CLASS(ThisT,wxIconBundle), File_UC = unicode:characters_to_binary([File,0]), wxe_util:cast(?wxIconBundle_AddIcon_2, diff --git a/lib/wx/src/gen/wxImage.erl b/lib/wx/src/gen/wxImage.erl index e82f3d609e..f3b3d393d1 100644 --- a/lib/wx/src/gen/wxImage.erl +++ b/lib/wx/src/gen/wxImage.erl @@ -64,7 +64,7 @@ new() -> Name::unicode:chardata(). new(Name) - when is_list(Name) -> + when ?is_chardata(Name) -> new(Name, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wximage.html#wximagewximage">external documentation</a>. @@ -85,7 +85,7 @@ new(Width,Height) when is_integer(Width),is_integer(Height) -> new(Width,Height, []); new(Name, Options) - when is_list(Name),is_list(Options) -> + when ?is_chardata(Name),is_list(Options) -> Name_UC = unicode:characters_to_binary([Name,0]), MOpts = fun({type, Type}, Acc) -> [<<1:32/?UI,Type:32/?UI>>|Acc]; ({index, Index}, Acc) -> [<<2:32/?UI,Index:32/?UI>>|Acc]; @@ -123,7 +123,7 @@ new(Width,Height, Options) wxe_util:construct(?wxImage_new_3_0, <<Width:32/?UI,Height:32/?UI, BinOpt/binary>>); new(Name,Mimetype, Options) - when is_list(Name),is_list(Mimetype),is_list(Options) -> + when ?is_chardata(Name),?is_chardata(Mimetype),is_list(Options) -> Name_UC = unicode:characters_to_binary([Name,0]), Mimetype_UC = unicode:characters_to_binary([Mimetype,0]), MOpts = fun({index, Index}, Acc) -> [<<1:32/?UI,Index:32/?UI>>|Acc]; @@ -421,7 +421,7 @@ getGreen(#wx_ref{type=ThisT,ref=ThisRef},X,Y) Name::unicode:chardata(). getImageCount(Name) - when is_list(Name) -> + when ?is_chardata(Name) -> getImageCount(Name, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wximage.html#wximagegetimagecount">external documentation</a>. @@ -430,7 +430,7 @@ getImageCount(Name) Name::unicode:chardata(), Option :: {'type', wx:wx_enum()}. getImageCount(Name, Options) - when is_list(Name),is_list(Options) -> + when ?is_chardata(Name),is_list(Options) -> Name_UC = unicode:characters_to_binary([Name,0]), MOpts = fun({type, Type}, Acc) -> [<<1:32/?UI,Type:32/?UI>>|Acc]; (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, @@ -533,7 +533,7 @@ hasMask(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec getOption(This, Name) -> unicode:charlist() when This::wxImage(), Name::unicode:chardata(). getOption(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxImage_GetOption, @@ -543,7 +543,7 @@ getOption(#wx_ref{type=ThisT,ref=ThisRef},Name) -spec getOptionInt(This, Name) -> integer() when This::wxImage(), Name::unicode:chardata(). getOptionInt(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxImage_GetOptionInt, @@ -553,7 +553,7 @@ getOptionInt(#wx_ref{type=ThisT,ref=ThisRef},Name) -spec hasOption(This, Name) -> boolean() when This::wxImage(), Name::unicode:chardata(). hasOption(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxImage_HasOption, @@ -599,7 +599,7 @@ isTransparent(#wx_ref{type=ThisT,ref=ThisRef},X,Y, Options) This::wxImage(), Name::unicode:chardata(). loadFile(This,Name) - when is_record(This, wx_ref),is_list(Name) -> + when is_record(This, wx_ref),?is_chardata(Name) -> loadFile(This,Name, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wximage.html#wximageloadfile">external documentation</a>. @@ -608,7 +608,7 @@ loadFile(This,Name) Option :: {'type', integer()} | {'index', integer()}. loadFile(#wx_ref{type=ThisT,ref=ThisRef},Name, Options) - when is_list(Name),is_list(Options) -> + when ?is_chardata(Name),is_list(Options) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), MOpts = fun({type, Type}, Acc) -> [<<1:32/?UI,Type:32/?UI>>|Acc]; @@ -623,7 +623,7 @@ loadFile(#wx_ref{type=ThisT,ref=ThisRef},Name, Options) This::wxImage(), Name::unicode:chardata(), Mimetype::unicode:chardata(), Option :: {'index', integer()}. loadFile(#wx_ref{type=ThisT,ref=ThisRef},Name,Mimetype, Options) - when is_list(Name),is_list(Mimetype),is_list(Options) -> + when ?is_chardata(Name),?is_chardata(Mimetype),is_list(Options) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), Mimetype_UC = unicode:characters_to_binary([Mimetype,0]), @@ -645,7 +645,7 @@ ok(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec removeHandler(Name) -> boolean() when Name::unicode:chardata(). removeHandler(Name) - when is_list(Name) -> + when ?is_chardata(Name) -> Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxImage_RemoveHandler, <<(byte_size(Name_UC)):32/?UI,(Name_UC)/binary, 0:(((8- ((4+byte_size(Name_UC)) band 16#7)) band 16#7))/unit:8>>). @@ -784,7 +784,7 @@ rotate90(#wx_ref{type=ThisT,ref=ThisRef}, Options) -spec saveFile(This, Name) -> boolean() when This::wxImage(), Name::unicode:chardata(). saveFile(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxImage_SaveFile_1, @@ -800,13 +800,13 @@ saveFile(#wx_ref{type=ThisT,ref=ThisRef},Name) (This, Name, Mimetype) -> boolean() when This::wxImage(), Name::unicode:chardata(), Mimetype::unicode:chardata(). saveFile(#wx_ref{type=ThisT,ref=ThisRef},Name,Type) - when is_list(Name),is_integer(Type) -> + when ?is_chardata(Name),is_integer(Type) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxImage_SaveFile_2_0, <<ThisRef:32/?UI,(byte_size(Name_UC)):32/?UI,(Name_UC)/binary, 0:(((8- ((0+byte_size(Name_UC)) band 16#7)) band 16#7))/unit:8,Type:32/?UI>>); saveFile(#wx_ref{type=ThisT,ref=ThisRef},Name,Mimetype) - when is_list(Name),is_list(Mimetype) -> + when ?is_chardata(Name),?is_chardata(Mimetype) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), Mimetype_UC = unicode:characters_to_binary([Mimetype,0]), @@ -985,13 +985,13 @@ setMaskFromImage(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=MaskT,ref=MaskRef} (This, Name, Value) -> 'ok' when This::wxImage(), Name::unicode:chardata(), Value::unicode:chardata(). setOption(#wx_ref{type=ThisT,ref=ThisRef},Name,Value) - when is_list(Name),is_integer(Value) -> + when ?is_chardata(Name),is_integer(Value) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:cast(?wxImage_SetOption_2_0, <<ThisRef:32/?UI,(byte_size(Name_UC)):32/?UI,(Name_UC)/binary, 0:(((8- ((0+byte_size(Name_UC)) band 16#7)) band 16#7))/unit:8,Value:32/?UI>>); setOption(#wx_ref{type=ThisT,ref=ThisRef},Name,Value) - when is_list(Name),is_list(Value) -> + when ?is_chardata(Name),?is_chardata(Value) -> ?CLASS(ThisT,wxImage), Name_UC = unicode:characters_to_binary([Name,0]), Value_UC = unicode:characters_to_binary([Value,0]), diff --git a/lib/wx/src/gen/wxListBox.erl b/lib/wx/src/gen/wxListBox.erl index 9ab3616e9b..86d8d41f36 100644 --- a/lib/wx/src/gen/wxListBox.erl +++ b/lib/wx/src/gen/wxListBox.erl @@ -40,40 +40,41 @@ centre/1,centre/2,centreOnParent/1,centreOnParent/2,clear/1,clearBackground/1, clientToScreen/2,clientToScreen/3,close/1,close/2,connect/2,connect/3, convertDialogToPixels/2,convertPixelsToDialog/2,delete/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - findString/2,findString/3,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientData/2,getClientSize/1, - getContainingSizer/1,getCount/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1,getMinSize/1, - getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSelection/1,getSize/1,getSizer/1,getString/2,getStringSelection/1, - getTextExtent/2,getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, - getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, - hasTransparentBackground/1,hide/1,inheritAttributes/1,initDialog/1, - insert/3,insert/4,invalidateBestSize/1,isDoubleBuffered/1,isEmpty/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,select/2,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientData/3, - setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, - setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, - setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, - setSelection/2,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2, - setSizeHints/3,setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2, - setSizerAndFit/3,setString/3,setStringSelection/2,setThemeEnabled/2, - setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, - setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, - setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,findString/2,findString/3,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientData/2,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCount/1,getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1, + getFont/1,getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSelection/1,getSize/1,getSizer/1, + getString/2,getStringSelection/1,getTextExtent/2,getTextExtent/3, + getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, + getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, + hide/1,inheritAttributes/1,initDialog/1,insert/3,insert/4,invalidateBestSize/1, + isDoubleBuffered/1,isEmpty/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, + isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1, + makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2, + moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, + popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,select/2,setAcceleratorTable/2, + setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, + setClientData/3,setClientSize/2,setClientSize/3,setContainingSizer/2, + setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1, + setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setId/2, + setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, + setScrollPos/4,setScrollbar/5,setScrollbar/6,setSelection/2,setSize/2, + setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, + setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setString/3, + setStringSelection/2,setThemeEnabled/2,setToolTip/2,setTransparent/2, + setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3, + setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2, + shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, validate/1,warpPointer/3]). @@ -220,7 +221,7 @@ setFirstItem(#wx_ref{type=ThisT,ref=ThisRef},N) wxe_util:cast(?wxListBox_SetFirstItem_1_0, <<ThisRef:32/?UI,N:32/?UI>>); setFirstItem(#wx_ref{type=ThisT,ref=ThisRef},S) - when is_list(S) -> + when ?is_chardata(S) -> ?CLASS(ThisT,wxListBox), S_UC = unicode:characters_to_binary([S,0]), wxe_util:cast(?wxListBox_SetFirstItem_1_1, @@ -280,6 +281,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -596,6 +599,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxListCtrl.erl b/lib/wx/src/gen/wxListCtrl.erl index 851686062a..10dc76f276 100644 --- a/lib/wx/src/gen/wxListCtrl.erl +++ b/lib/wx/src/gen/wxListCtrl.erl @@ -52,38 +52,38 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2, - setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1, - setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setId/2, - setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, - setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5, - setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, - setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2, - setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, - setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowVariant/2, - shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, - transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, - validate/1,warpPointer/3]). + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundStyle/2,setCaret/2, + setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, + setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + setWindowStyle/2,setWindowVariant/2,shouldInheritColours/1,show/1, + show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1,update/1, + updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]). -export_type([wxListCtrl/0]). %% @hidden @@ -272,7 +272,7 @@ ensureVisible(#wx_ref{type=ThisT,ref=ThisRef},Item) This::wxListCtrl(), Start::integer(), Str::unicode:chardata(). findItem(This,Start,Str) - when is_record(This, wx_ref),is_integer(Start),is_list(Str) -> + when is_record(This, wx_ref),is_integer(Start),?is_chardata(Str) -> findItem(This,Start,Str, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxlistctrl.html#wxlistctrlfinditem">external documentation</a>. @@ -286,7 +286,7 @@ findItem(This,Start,Str) (This, Start, Pt, Direction) -> integer() when This::wxListCtrl(), Start::integer(), Pt::{X::integer(), Y::integer()}, Direction::integer(). findItem(#wx_ref{type=ThisT,ref=ThisRef},Start,Str, Options) - when is_integer(Start),is_list(Str),is_list(Options) -> + when is_integer(Start),?is_chardata(Str),is_list(Options) -> ?CLASS(ThisT,wxListCtrl), Str_UC = unicode:characters_to_binary([Str,0]), MOpts = fun({partial, Partial}, Acc) -> [<<1:32/?UI,(wxe_util:from_bool(Partial)):32/?UI>>|Acc]; @@ -540,7 +540,7 @@ hitTest(#wx_ref{type=ThisT,ref=ThisRef},{PointX,PointY}) This::wxListCtrl(), Col::integer(), Info::wxListItem:wxListItem(). insertColumn(This,Col,Heading) - when is_record(This, wx_ref),is_integer(Col),is_list(Heading) -> + when is_record(This, wx_ref),is_integer(Col),?is_chardata(Heading) -> insertColumn(This,Col,Heading, []); insertColumn(#wx_ref{type=ThisT,ref=ThisRef},Col,#wx_ref{type=InfoT,ref=InfoRef}) when is_integer(Col) -> @@ -555,7 +555,7 @@ insertColumn(#wx_ref{type=ThisT,ref=ThisRef},Col,#wx_ref{type=InfoT,ref=InfoRef} Option :: {'format', integer()} | {'width', integer()}. insertColumn(#wx_ref{type=ThisT,ref=ThisRef},Col,Heading, Options) - when is_integer(Col),is_list(Heading),is_list(Options) -> + when is_integer(Col),?is_chardata(Heading),is_list(Options) -> ?CLASS(ThisT,wxListCtrl), Heading_UC = unicode:characters_to_binary([Heading,0]), MOpts = fun({format, Format}, Acc) -> [<<1:32/?UI,Format:32/?UI>>|Acc]; @@ -589,7 +589,7 @@ insertItem(#wx_ref{type=ThisT,ref=ThisRef},Index,ImageIndex) wxe_util:call(?wxListCtrl_InsertItem_2_0, <<ThisRef:32/?UI,Index:32/?UI,ImageIndex:32/?UI>>); insertItem(#wx_ref{type=ThisT,ref=ThisRef},Index,Label) - when is_integer(Index),is_list(Label) -> + when is_integer(Index),?is_chardata(Label) -> ?CLASS(ThisT,wxListCtrl), Label_UC = unicode:characters_to_binary([Label,0]), wxe_util:call(?wxListCtrl_InsertItem_2_1, @@ -599,7 +599,7 @@ insertItem(#wx_ref{type=ThisT,ref=ThisRef},Index,Label) -spec insertItem(This, Index, Label, ImageIndex) -> integer() when This::wxListCtrl(), Index::integer(), Label::unicode:chardata(), ImageIndex::integer(). insertItem(#wx_ref{type=ThisT,ref=ThisRef},Index,Label,ImageIndex) - when is_integer(Index),is_list(Label),is_integer(ImageIndex) -> + when is_integer(Index),?is_chardata(Label),is_integer(ImageIndex) -> ?CLASS(ThisT,wxListCtrl), Label_UC = unicode:characters_to_binary([Label,0]), wxe_util:call(?wxListCtrl_InsertItem_3, @@ -684,7 +684,7 @@ setItem(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=InfoT,ref=InfoRef}) -> This::wxListCtrl(), Index::integer(), Col::integer(), Label::unicode:chardata(). setItem(This,Index,Col,Label) - when is_record(This, wx_ref),is_integer(Index),is_integer(Col),is_list(Label) -> + when is_record(This, wx_ref),is_integer(Index),is_integer(Col),?is_chardata(Label) -> setItem(This,Index,Col,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxlistctrl.html#wxlistctrlsetitem">external documentation</a>. @@ -692,7 +692,7 @@ setItem(This,Index,Col,Label) This::wxListCtrl(), Index::integer(), Col::integer(), Label::unicode:chardata(), Option :: {'imageId', integer()}. setItem(#wx_ref{type=ThisT,ref=ThisRef},Index,Col,Label, Options) - when is_integer(Index),is_integer(Col),is_list(Label),is_list(Options) -> + when is_integer(Index),is_integer(Col),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxListCtrl), Label_UC = unicode:characters_to_binary([Label,0]), MOpts = fun({imageId, ImageId}, Acc) -> [<<1:32/?UI,ImageId:32/?UI>>|Acc]; @@ -790,7 +790,7 @@ setItemState(#wx_ref{type=ThisT,ref=ThisRef},Item,State,StateMask) -spec setItemText(This, Item, Str) -> 'ok' when This::wxListCtrl(), Item::integer(), Str::unicode:chardata(). setItemText(#wx_ref{type=ThisT,ref=ThisRef},Item,Str) - when is_integer(Item),is_list(Str) -> + when is_integer(Item),?is_chardata(Str) -> ?CLASS(ThisT,wxListCtrl), Str_UC = unicode:characters_to_binary([Str,0]), wxe_util:cast(?wxListCtrl_SetItemText, @@ -875,6 +875,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -1187,6 +1189,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxListItem.erl b/lib/wx/src/gen/wxListItem.erl index 1530a8c514..56a1719c55 100644 --- a/lib/wx/src/gen/wxListItem.erl +++ b/lib/wx/src/gen/wxListItem.erl @@ -236,7 +236,7 @@ setStateMask(#wx_ref{type=ThisT,ref=ThisRef},StateMask) -spec setText(This, Text) -> 'ok' when This::wxListItem(), Text::unicode:chardata(). setText(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxListItem), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxListItem_SetText, diff --git a/lib/wx/src/gen/wxListView.erl b/lib/wx/src/gen/wxListView.erl index 908bf4c1c9..adba629d5a 100644 --- a/lib/wx/src/gen/wxListView.erl +++ b/lib/wx/src/gen/wxListView.erl @@ -39,29 +39,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -169,6 +169,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -485,6 +487,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxListbook.erl b/lib/wx/src/gen/wxListbook.erl index a7050e1db9..e2ea559587 100644 --- a/lib/wx/src/gen/wxListbook.erl +++ b/lib/wx/src/gen/wxListbook.erl @@ -43,29 +43,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -120,7 +120,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id, Options) This::wxListbook(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). addPage(This,Page,Text) - when is_record(This, wx_ref),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_record(Page, wx_ref),?is_chardata(Text) -> addPage(This,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxlistbook.html#wxlistbookaddpage">external documentation</a>. @@ -129,7 +129,7 @@ addPage(This,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. addPage(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_list(Text),is_list(Options) -> + when ?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxListbook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -296,7 +296,7 @@ hitTest(#wx_ref{type=ThisT,ref=ThisRef},{PtX,PtY}) This::wxListbook(), N::integer(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). insertPage(This,N,Page,Text) - when is_record(This, wx_ref),is_integer(N),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_integer(N),is_record(Page, wx_ref),?is_chardata(Text) -> insertPage(This,N,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxlistbook.html#wxlistbookinsertpage">external documentation</a>. @@ -305,7 +305,7 @@ insertPage(This,N,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. insertPage(#wx_ref{type=ThisT,ref=ThisRef},N,#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_integer(N),is_list(Text),is_list(Options) -> + when is_integer(N),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxListbook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -347,7 +347,7 @@ setPageImage(#wx_ref{type=ThisT,ref=ThisRef},N,ImageId) -spec setPageText(This, N, StrText) -> boolean() when This::wxListbook(), N::integer(), StrText::unicode:chardata(). setPageText(#wx_ref{type=ThisT,ref=ThisRef},N,StrText) - when is_integer(N),is_list(StrText) -> + when is_integer(N),?is_chardata(StrText) -> ?CLASS(ThisT,wxListbook), StrText_UC = unicode:characters_to_binary([StrText,0]), wxe_util:call(?wxListbook_SetPageText, @@ -384,6 +384,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -700,6 +702,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxLocale.erl b/lib/wx/src/gen/wxLocale.erl index d473731bf8..1ce7c3e3e8 100644 --- a/lib/wx/src/gen/wxLocale.erl +++ b/lib/wx/src/gen/wxLocale.erl @@ -92,7 +92,7 @@ init(#wx_ref{type=ThisT,ref=ThisRef}, Options) -spec addCatalog(This, SzDomain) -> boolean() when This::wxLocale(), SzDomain::unicode:chardata(). addCatalog(#wx_ref{type=ThisT,ref=ThisRef},SzDomain) - when is_list(SzDomain) -> + when ?is_chardata(SzDomain) -> ?CLASS(ThisT,wxLocale), SzDomain_UC = unicode:characters_to_binary([SzDomain,0]), wxe_util:call(?wxLocale_AddCatalog_1, @@ -103,7 +103,7 @@ addCatalog(#wx_ref{type=ThisT,ref=ThisRef},SzDomain) -spec addCatalog(This, SzDomain, MsgIdLanguage, MsgIdCharset) -> boolean() when This::wxLocale(), SzDomain::unicode:chardata(), MsgIdLanguage::wx:wx_enum(), MsgIdCharset::unicode:chardata(). addCatalog(#wx_ref{type=ThisT,ref=ThisRef},SzDomain,MsgIdLanguage,MsgIdCharset) - when is_list(SzDomain),is_integer(MsgIdLanguage),is_list(MsgIdCharset) -> + when ?is_chardata(SzDomain),is_integer(MsgIdLanguage),?is_chardata(MsgIdCharset) -> ?CLASS(ThisT,wxLocale), SzDomain_UC = unicode:characters_to_binary([SzDomain,0]), MsgIdCharset_UC = unicode:characters_to_binary([MsgIdCharset,0]), @@ -114,7 +114,7 @@ addCatalog(#wx_ref{type=ThisT,ref=ThisRef},SzDomain,MsgIdLanguage,MsgIdCharset) -spec addCatalogLookupPathPrefix(Prefix) -> 'ok' when Prefix::unicode:chardata(). addCatalogLookupPathPrefix(Prefix) - when is_list(Prefix) -> + when ?is_chardata(Prefix) -> Prefix_UC = unicode:characters_to_binary([Prefix,0]), wxe_util:cast(?wxLocale_AddCatalogLookupPathPrefix, <<(byte_size(Prefix_UC)):32/?UI,(Prefix_UC)/binary, 0:(((8- ((4+byte_size(Prefix_UC)) band 16#7)) band 16#7))/unit:8>>). @@ -164,7 +164,7 @@ getName(#wx_ref{type=ThisT,ref=ThisRef}) -> This::wxLocale(), SzOrigString::unicode:chardata(). getString(This,SzOrigString) - when is_record(This, wx_ref),is_list(SzOrigString) -> + when is_record(This, wx_ref),?is_chardata(SzOrigString) -> getString(This,SzOrigString, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxlocale.html#wxlocalegetstring">external documentation</a>. @@ -172,7 +172,7 @@ getString(This,SzOrigString) This::wxLocale(), SzOrigString::unicode:chardata(), Option :: {'szDomain', unicode:chardata()}. getString(#wx_ref{type=ThisT,ref=ThisRef},SzOrigString, Options) - when is_list(SzOrigString),is_list(Options) -> + when ?is_chardata(SzOrigString),is_list(Options) -> ?CLASS(ThisT,wxLocale), SzOrigString_UC = unicode:characters_to_binary([SzOrigString,0]), MOpts = fun({szDomain, SzDomain}, Acc) -> SzDomain_UC = unicode:characters_to_binary([SzDomain,0]),[<<1:32/?UI,(byte_size(SzDomain_UC)):32/?UI,(SzDomain_UC)/binary, 0:(((8- ((0+byte_size(SzDomain_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -186,7 +186,7 @@ getString(#wx_ref{type=ThisT,ref=ThisRef},SzOrigString, Options) This::wxLocale(), SzOrigString::unicode:chardata(), SzOrigString2::unicode:chardata(), N::integer(). getString(This,SzOrigString,SzOrigString2,N) - when is_record(This, wx_ref),is_list(SzOrigString),is_list(SzOrigString2),is_integer(N) -> + when is_record(This, wx_ref),?is_chardata(SzOrigString),?is_chardata(SzOrigString2),is_integer(N) -> getString(This,SzOrigString,SzOrigString2,N, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxlocale.html#wxlocalegetstring">external documentation</a>. @@ -194,7 +194,7 @@ getString(This,SzOrigString,SzOrigString2,N) This::wxLocale(), SzOrigString::unicode:chardata(), SzOrigString2::unicode:chardata(), N::integer(), Option :: {'szDomain', unicode:chardata()}. getString(#wx_ref{type=ThisT,ref=ThisRef},SzOrigString,SzOrigString2,N, Options) - when is_list(SzOrigString),is_list(SzOrigString2),is_integer(N),is_list(Options) -> + when ?is_chardata(SzOrigString),?is_chardata(SzOrigString2),is_integer(N),is_list(Options) -> ?CLASS(ThisT,wxLocale), SzOrigString_UC = unicode:characters_to_binary([SzOrigString,0]), SzOrigString2_UC = unicode:characters_to_binary([SzOrigString2,0]), @@ -209,7 +209,7 @@ getString(#wx_ref{type=ThisT,ref=ThisRef},SzOrigString,SzOrigString2,N, Options) This::wxLocale(), SzHeader::unicode:chardata(). getHeaderValue(This,SzHeader) - when is_record(This, wx_ref),is_list(SzHeader) -> + when is_record(This, wx_ref),?is_chardata(SzHeader) -> getHeaderValue(This,SzHeader, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxlocale.html#wxlocalegetheadervalue">external documentation</a>. @@ -217,7 +217,7 @@ getHeaderValue(This,SzHeader) This::wxLocale(), SzHeader::unicode:chardata(), Option :: {'szDomain', unicode:chardata()}. getHeaderValue(#wx_ref{type=ThisT,ref=ThisRef},SzHeader, Options) - when is_list(SzHeader),is_list(Options) -> + when ?is_chardata(SzHeader),is_list(Options) -> ?CLASS(ThisT,wxLocale), SzHeader_UC = unicode:characters_to_binary([SzHeader,0]), MOpts = fun({szDomain, SzDomain}, Acc) -> SzDomain_UC = unicode:characters_to_binary([SzDomain,0]),[<<1:32/?UI,(byte_size(SzDomain_UC)):32/?UI,(SzDomain_UC)/binary, 0:(((8- ((0+byte_size(SzDomain_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -257,7 +257,7 @@ getSystemLanguage() -> -spec isLoaded(This, SzDomain) -> boolean() when This::wxLocale(), SzDomain::unicode:chardata(). isLoaded(#wx_ref{type=ThisT,ref=ThisRef},SzDomain) - when is_list(SzDomain) -> + when ?is_chardata(SzDomain) -> ?CLASS(ThisT,wxLocale), SzDomain_UC = unicode:characters_to_binary([SzDomain,0]), wxe_util:call(?wxLocale_IsLoaded, diff --git a/lib/wx/src/gen/wxMDIChildFrame.erl b/lib/wx/src/gen/wxMDIChildFrame.erl index b294e4898d..0d388c016a 100644 --- a/lib/wx/src/gen/wxMDIChildFrame.erl +++ b/lib/wx/src/gen/wxMDIChildFrame.erl @@ -42,45 +42,45 @@ close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createStatusBar/1,createStatusBar/2,createToolBar/1,createToolBar/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientAreaOrigin/1, - getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, - getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getStatusBar/1, - getStatusBarPane/1,getTextExtent/2,getTextExtent/3,getTitle/1,getToolBar/1, - getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,sendSizeEvent/1,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMenuBar/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, - setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setStatusBar/2, - setStatusBarPane/2,setStatusText/2,setStatusText/3,setStatusWidths/2, - setThemeEnabled/2,setTitle/2,setToolBar/2,setToolTip/2,setTransparent/2, - setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3, - setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2, - shouldInheritColours/1,show/1,show/2,showFullScreen/2,showFullScreen/3, - thaw/1,transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, - updateWindowUI/2,validate/1,warpPointer/3]). + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientAreaOrigin/1,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, + getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1, + getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getStatusBar/1,getStatusBarPane/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolBar/1,getToolTip/1,getUpdateRegion/1, + getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, + hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2, + inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1, + isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, + isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2,raise/1,refresh/1, + refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, + reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + sendSizeEvent/1,setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2, + setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2, + setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1, + setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2, + setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMenuBar/2,setMinSize/2, + setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, + setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, + setShape/2,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setStatusBar/2,setStatusBarPane/2,setStatusText/2,setStatusText/3, + setStatusWidths/2,setThemeEnabled/2,setTitle/2,setToolBar/2,setToolTip/2, + setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, + setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, + setWindowVariant/2,shouldInheritColours/1,show/1,show/2,showFullScreen/2, + showFullScreen/3,thaw/1,transferDataFromWindow/1,transferDataToWindow/1, + update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]). -export_type([wxMDIChildFrame/0]). %% @hidden @@ -102,7 +102,7 @@ new() -> Parent::wxMDIParentFrame:wxMDIParentFrame(), Id::integer(), Title::unicode:chardata(). new(Parent,Id,Title) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> new(Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmdichildframe.html#wxmdichildframewxmdichildframe">external documentation</a>. @@ -112,7 +112,7 @@ new(Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ParentT,wxMDIParentFrame), Title_UC = unicode:characters_to_binary([Title,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -136,7 +136,7 @@ activate(#wx_ref{type=ThisT,ref=ThisRef}) -> This::wxMDIChildFrame(), Parent::wxMDIParentFrame:wxMDIParentFrame(), Id::integer(), Title::unicode:chardata(). create(This,Parent,Id,Title) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> create(This,Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmdichildframe.html#wxmdichildframecreate">external documentation</a>. @@ -146,7 +146,7 @@ create(This,Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ThisT,wxMDIChildFrame), ?CLASS(ParentT,wxMDIParentFrame), Title_UC = unicode:characters_to_binary([Title,0]), @@ -275,6 +275,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -595,6 +597,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxMDIClientWindow.erl b/lib/wx/src/gen/wxMDIClientWindow.erl index ddc31760f4..4fc080c64d 100644 --- a/lib/wx/src/gen/wxMDIClientWindow.erl +++ b/lib/wx/src/gen/wxMDIClientWindow.erl @@ -37,29 +37,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -136,6 +136,8 @@ destroy(Obj=#wx_ref{type=Type}) -> ok. %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -456,6 +458,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxMDIParentFrame.erl b/lib/wx/src/gen/wxMDIParentFrame.erl index 63b4ec8e23..59f24a1b40 100644 --- a/lib/wx/src/gen/wxMDIParentFrame.erl +++ b/lib/wx/src/gen/wxMDIParentFrame.erl @@ -43,27 +43,28 @@ close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createStatusBar/1,createStatusBar/2,createToolBar/1,createToolBar/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientAreaOrigin/1, - getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, - getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getStatusBar/1, - getStatusBarPane/1,getTextExtent/2,getTextExtent/3,getTitle/1,getToolBar/1, - getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - processCommand/2,raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3, - releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientAreaOrigin/1,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, + getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1, + getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getStatusBar/1,getStatusBarPane/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolBar/1,getToolTip/1,getUpdateRegion/1, + getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, + hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2, + inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1, + isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, + isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1, + maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, + navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, + popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, scrollWindow/4,sendSizeEvent/1,setAcceleratorTable/2,setAutoLayout/2, setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, @@ -103,7 +104,7 @@ new() -> Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(). new(Parent,Id,Title) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> new(Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmdiparentframe.html#wxmdiparentframewxmdiparentframe">external documentation</a>. @@ -113,7 +114,7 @@ new(Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -161,7 +162,7 @@ cascade(#wx_ref{type=ThisT,ref=ThisRef}) -> This::wxMDIParentFrame(), Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(). create(This,Parent,Id,Title) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> create(This,Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmdiparentframe.html#wxmdiparentframecreate">external documentation</a>. @@ -171,7 +172,7 @@ create(This,Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ThisT,wxMDIParentFrame), ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), @@ -313,6 +314,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -633,6 +636,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxMenu.erl b/lib/wx/src/gen/wxMenu.erl index 317ea38685..26fe23701d 100644 --- a/lib/wx/src/gen/wxMenu.erl +++ b/lib/wx/src/gen/wxMenu.erl @@ -69,7 +69,7 @@ new(Options) Title::unicode:chardata(), Option :: {'style', integer()}. new(Title, Options) - when is_list(Title),is_list(Options) -> + when ?is_chardata(Title),is_list(Options) -> Title_UC = unicode:characters_to_binary([Title,0]), MOpts = fun({style, Style}, Acc) -> [<<1:32/?UI,Style:32/?UI>>|Acc]; (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, @@ -91,7 +91,7 @@ append(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ItemT,ref=ItemRef}) -> This::wxMenu(), Itemid::integer(), Text::unicode:chardata(). append(This,Itemid,Text) - when is_record(This, wx_ref),is_integer(Itemid),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Itemid),?is_chardata(Text) -> append(This,Itemid,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenu.html#wxmenuappend">external documentation</a>. @@ -110,10 +110,10 @@ append(This,Itemid,Text) | {'kind', wx:wx_enum()}. append(This,Itemid,Text,Submenu) - when is_record(This, wx_ref),is_integer(Itemid),is_list(Text),is_record(Submenu, wx_ref) -> + when is_record(This, wx_ref),is_integer(Itemid),?is_chardata(Text),is_record(Submenu, wx_ref) -> append(This,Itemid,Text,Submenu, []); append(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text, Options) - when is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({help, Help}, Acc) -> Help_UC = unicode:characters_to_binary([Help,0]),[<<1:32/?UI,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((0+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -135,14 +135,14 @@ append(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text, Options) This::wxMenu(), Itemid::integer(), Text::unicode:chardata(), Submenu::wxMenu(), Option :: {'help', unicode:chardata()}. append(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text,Help,IsCheckable) - when is_integer(Itemid),is_list(Text),is_list(Help),is_boolean(IsCheckable) -> + when is_integer(Itemid),?is_chardata(Text),?is_chardata(Help),is_boolean(IsCheckable) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), Help_UC = unicode:characters_to_binary([Help,0]), wxe_util:cast(?wxMenu_Append_4_0, <<ThisRef:32/?UI,Itemid:32/?UI,(byte_size(Text_UC)):32/?UI,(Text_UC)/binary, 0:(((8- ((4+byte_size(Text_UC)) band 16#7)) band 16#7))/unit:8,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((4+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8,(wxe_util:from_bool(IsCheckable)):32/?UI>>); append(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text,#wx_ref{type=SubmenuT,ref=SubmenuRef}, Options) - when is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), ?CLASS(SubmenuT,wxMenu), @@ -157,7 +157,7 @@ append(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text,#wx_ref{type=SubmenuT,ref=Sub This::wxMenu(), Itemid::integer(), Text::unicode:chardata(). appendCheckItem(This,Itemid,Text) - when is_record(This, wx_ref),is_integer(Itemid),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Itemid),?is_chardata(Text) -> appendCheckItem(This,Itemid,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenu.html#wxmenuappendcheckitem">external documentation</a>. @@ -165,7 +165,7 @@ appendCheckItem(This,Itemid,Text) This::wxMenu(), Itemid::integer(), Text::unicode:chardata(), Option :: {'help', unicode:chardata()}. appendCheckItem(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text, Options) - when is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({help, Help}, Acc) -> Help_UC = unicode:characters_to_binary([Help,0]),[<<1:32/?UI,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((0+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -179,7 +179,7 @@ appendCheckItem(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text, Options) This::wxMenu(), Itemid::integer(), Text::unicode:chardata(). appendRadioItem(This,Itemid,Text) - when is_record(This, wx_ref),is_integer(Itemid),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Itemid),?is_chardata(Text) -> appendRadioItem(This,Itemid,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenu.html#wxmenuappendradioitem">external documentation</a>. @@ -187,7 +187,7 @@ appendRadioItem(This,Itemid,Text) This::wxMenu(), Itemid::integer(), Text::unicode:chardata(), Option :: {'help', unicode:chardata()}. appendRadioItem(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text, Options) - when is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({help, Help}, Acc) -> Help_UC = unicode:characters_to_binary([Help,0]),[<<1:32/?UI,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((0+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -285,7 +285,7 @@ findItem(#wx_ref{type=ThisT,ref=ThisRef},Itemid) wxe_util:call(?wxMenu_FindItem_2, <<ThisRef:32/?UI,Itemid:32/?UI>>); findItem(#wx_ref{type=ThisT,ref=ThisRef},Item) - when is_list(Item) -> + when ?is_chardata(Item) -> ?CLASS(ThisT,wxMenu), Item_UC = unicode:characters_to_binary([Item,0]), wxe_util:call(?wxMenu_FindItem_1, @@ -386,7 +386,7 @@ insert(#wx_ref{type=ThisT,ref=ThisRef},Pos,Itemid, Options) This::wxMenu(), Pos::integer(), Itemid::integer(), Text::unicode:chardata(), Submenu::wxMenu(). insert(This,Pos,Itemid,Text,Submenu) - when is_record(This, wx_ref),is_integer(Pos),is_integer(Itemid),is_list(Text),is_record(Submenu, wx_ref) -> + when is_record(This, wx_ref),is_integer(Pos),is_integer(Itemid),?is_chardata(Text),is_record(Submenu, wx_ref) -> insert(This,Pos,Itemid,Text,Submenu, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenu.html#wxmenuinsert">external documentation</a>. @@ -401,14 +401,14 @@ insert(This,Pos,Itemid,Text,Submenu) This::wxMenu(), Pos::integer(), Itemid::integer(), Text::unicode:chardata(), Submenu::wxMenu(), Option :: {'help', unicode:chardata()}. insert(#wx_ref{type=ThisT,ref=ThisRef},Pos,Itemid,Text,Help,IsCheckable) - when is_integer(Pos),is_integer(Itemid),is_list(Text),is_list(Help),is_boolean(IsCheckable) -> + when is_integer(Pos),is_integer(Itemid),?is_chardata(Text),?is_chardata(Help),is_boolean(IsCheckable) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), Help_UC = unicode:characters_to_binary([Help,0]), wxe_util:cast(?wxMenu_Insert_5_0, <<ThisRef:32/?UI,Pos:32/?UI,Itemid:32/?UI,(byte_size(Text_UC)):32/?UI,(Text_UC)/binary, 0:(((8- ((0+byte_size(Text_UC)) band 16#7)) band 16#7))/unit:8,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((4+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8,(wxe_util:from_bool(IsCheckable)):32/?UI>>); insert(#wx_ref{type=ThisT,ref=ThisRef},Pos,Itemid,Text,#wx_ref{type=SubmenuT,ref=SubmenuRef}, Options) - when is_integer(Pos),is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Pos),is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), ?CLASS(SubmenuT,wxMenu), @@ -423,7 +423,7 @@ insert(#wx_ref{type=ThisT,ref=ThisRef},Pos,Itemid,Text,#wx_ref{type=SubmenuT,ref This::wxMenu(), Pos::integer(), Itemid::integer(), Text::unicode:chardata(). insertCheckItem(This,Pos,Itemid,Text) - when is_record(This, wx_ref),is_integer(Pos),is_integer(Itemid),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Pos),is_integer(Itemid),?is_chardata(Text) -> insertCheckItem(This,Pos,Itemid,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenu.html#wxmenuinsertcheckitem">external documentation</a>. @@ -431,7 +431,7 @@ insertCheckItem(This,Pos,Itemid,Text) This::wxMenu(), Pos::integer(), Itemid::integer(), Text::unicode:chardata(), Option :: {'help', unicode:chardata()}. insertCheckItem(#wx_ref{type=ThisT,ref=ThisRef},Pos,Itemid,Text, Options) - when is_integer(Pos),is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Pos),is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({help, Help}, Acc) -> Help_UC = unicode:characters_to_binary([Help,0]),[<<1:32/?UI,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((0+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -445,7 +445,7 @@ insertCheckItem(#wx_ref{type=ThisT,ref=ThisRef},Pos,Itemid,Text, Options) This::wxMenu(), Pos::integer(), Itemid::integer(), Text::unicode:chardata(). insertRadioItem(This,Pos,Itemid,Text) - when is_record(This, wx_ref),is_integer(Pos),is_integer(Itemid),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Pos),is_integer(Itemid),?is_chardata(Text) -> insertRadioItem(This,Pos,Itemid,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenu.html#wxmenuinsertradioitem">external documentation</a>. @@ -453,7 +453,7 @@ insertRadioItem(This,Pos,Itemid,Text) This::wxMenu(), Pos::integer(), Itemid::integer(), Text::unicode:chardata(), Option :: {'help', unicode:chardata()}. insertRadioItem(#wx_ref{type=ThisT,ref=ThisRef},Pos,Itemid,Text, Options) - when is_integer(Pos),is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Pos),is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({help, Help}, Acc) -> Help_UC = unicode:characters_to_binary([Help,0]),[<<1:32/?UI,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((0+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -532,7 +532,7 @@ prepend(#wx_ref{type=ThisT,ref=ThisRef},Itemid, Options) This::wxMenu(), Itemid::integer(), Text::unicode:chardata(), Submenu::wxMenu(). prepend(This,Itemid,Text,Submenu) - when is_record(This, wx_ref),is_integer(Itemid),is_list(Text),is_record(Submenu, wx_ref) -> + when is_record(This, wx_ref),is_integer(Itemid),?is_chardata(Text),is_record(Submenu, wx_ref) -> prepend(This,Itemid,Text,Submenu, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenu.html#wxmenuprepend">external documentation</a>. @@ -547,14 +547,14 @@ prepend(This,Itemid,Text,Submenu) This::wxMenu(), Itemid::integer(), Text::unicode:chardata(), Submenu::wxMenu(), Option :: {'help', unicode:chardata()}. prepend(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text,Help,IsCheckable) - when is_integer(Itemid),is_list(Text),is_list(Help),is_boolean(IsCheckable) -> + when is_integer(Itemid),?is_chardata(Text),?is_chardata(Help),is_boolean(IsCheckable) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), Help_UC = unicode:characters_to_binary([Help,0]), wxe_util:cast(?wxMenu_Prepend_4_0, <<ThisRef:32/?UI,Itemid:32/?UI,(byte_size(Text_UC)):32/?UI,(Text_UC)/binary, 0:(((8- ((4+byte_size(Text_UC)) band 16#7)) band 16#7))/unit:8,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((4+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8,(wxe_util:from_bool(IsCheckable)):32/?UI>>); prepend(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text,#wx_ref{type=SubmenuT,ref=SubmenuRef}, Options) - when is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), ?CLASS(SubmenuT,wxMenu), @@ -569,7 +569,7 @@ prepend(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text,#wx_ref{type=SubmenuT,ref=Su This::wxMenu(), Itemid::integer(), Text::unicode:chardata(). prependCheckItem(This,Itemid,Text) - when is_record(This, wx_ref),is_integer(Itemid),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Itemid),?is_chardata(Text) -> prependCheckItem(This,Itemid,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenu.html#wxmenuprependcheckitem">external documentation</a>. @@ -577,7 +577,7 @@ prependCheckItem(This,Itemid,Text) This::wxMenu(), Itemid::integer(), Text::unicode:chardata(), Option :: {'help', unicode:chardata()}. prependCheckItem(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text, Options) - when is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({help, Help}, Acc) -> Help_UC = unicode:characters_to_binary([Help,0]),[<<1:32/?UI,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((0+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -591,7 +591,7 @@ prependCheckItem(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text, Options) This::wxMenu(), Itemid::integer(), Text::unicode:chardata(). prependRadioItem(This,Itemid,Text) - when is_record(This, wx_ref),is_integer(Itemid),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Itemid),?is_chardata(Text) -> prependRadioItem(This,Itemid,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmenu.html#wxmenuprependradioitem">external documentation</a>. @@ -599,7 +599,7 @@ prependRadioItem(This,Itemid,Text) This::wxMenu(), Itemid::integer(), Text::unicode:chardata(), Option :: {'help', unicode:chardata()}. prependRadioItem(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Text, Options) - when is_integer(Itemid),is_list(Text),is_list(Options) -> + when is_integer(Itemid),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxMenu), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({help, Help}, Acc) -> Help_UC = unicode:characters_to_binary([Help,0]),[<<1:32/?UI,(byte_size(Help_UC)):32/?UI,(Help_UC)/binary, 0:(((8- ((0+byte_size(Help_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -640,7 +640,7 @@ remove(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ItemT,ref=ItemRef}) -> -spec setHelpString(This, Itemid, HelpString) -> 'ok' when This::wxMenu(), Itemid::integer(), HelpString::unicode:chardata(). setHelpString(#wx_ref{type=ThisT,ref=ThisRef},Itemid,HelpString) - when is_integer(Itemid),is_list(HelpString) -> + when is_integer(Itemid),?is_chardata(HelpString) -> ?CLASS(ThisT,wxMenu), HelpString_UC = unicode:characters_to_binary([HelpString,0]), wxe_util:cast(?wxMenu_SetHelpString, @@ -650,7 +650,7 @@ setHelpString(#wx_ref{type=ThisT,ref=ThisRef},Itemid,HelpString) -spec setLabel(This, Itemid, Label) -> 'ok' when This::wxMenu(), Itemid::integer(), Label::unicode:chardata(). setLabel(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Label) - when is_integer(Itemid),is_list(Label) -> + when is_integer(Itemid),?is_chardata(Label) -> ?CLASS(ThisT,wxMenu), Label_UC = unicode:characters_to_binary([Label,0]), wxe_util:cast(?wxMenu_SetLabel, @@ -660,7 +660,7 @@ setLabel(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Label) -spec setTitle(This, Title) -> 'ok' when This::wxMenu(), Title::unicode:chardata(). setTitle(#wx_ref{type=ThisT,ref=ThisRef},Title) - when is_list(Title) -> + when ?is_chardata(Title) -> ?CLASS(ThisT,wxMenu), Title_UC = unicode:characters_to_binary([Title,0]), wxe_util:cast(?wxMenu_SetTitle, diff --git a/lib/wx/src/gen/wxMenuBar.erl b/lib/wx/src/gen/wxMenuBar.erl index 05f7a423d5..fa613c9f3b 100644 --- a/lib/wx/src/gen/wxMenuBar.erl +++ b/lib/wx/src/gen/wxMenuBar.erl @@ -41,26 +41,27 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, - getBackgroundStyle/1,getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1, - getChildren/1,getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getMaxSize/1,getMinSize/1, - getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, - getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, - hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, - initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isExposed/2, - isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1,layout/1, - lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4, - moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, - pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, - popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, - refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, - screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, - setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, - setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + dragAcceptFiles/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, + getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, + getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, + getContentScaleFactor/1,getCursor/1,getDropTarget/1,getEventHandler/1, + getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, + getHandle/1,getHelpText/1,getId/1,getMaxSize/1,getMinSize/1,getName/1, + getParent/1,getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1, + getScrollPos/2,getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1, + getTextExtent/2,getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,inheritAttributes/1,initDialog/1, + invalidateBestSize/1,isDoubleBuffered/1,isExposed/2,isExposed/3,isExposed/5, + isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1, + makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2, + moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, + popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, + setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, @@ -98,7 +99,7 @@ new(Style) -spec append(This, Menu, Title) -> boolean() when This::wxMenuBar(), Menu::wxMenu:wxMenu(), Title::unicode:chardata(). append(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=MenuT,ref=MenuRef},Title) - when is_list(Title) -> + when ?is_chardata(Title) -> ?CLASS(ThisT,wxMenuBar), ?CLASS(MenuT,wxMenu), Title_UC = unicode:characters_to_binary([Title,0]), @@ -157,7 +158,7 @@ enableTop(#wx_ref{type=ThisT,ref=ThisRef},Pos,Flag) -spec findMenu(This, Title) -> integer() when This::wxMenuBar(), Title::unicode:chardata(). findMenu(#wx_ref{type=ThisT,ref=ThisRef},Title) - when is_list(Title) -> + when ?is_chardata(Title) -> ?CLASS(ThisT,wxMenuBar), Title_UC = unicode:characters_to_binary([Title,0]), wxe_util:call(?wxMenuBar_FindMenu, @@ -167,7 +168,7 @@ findMenu(#wx_ref{type=ThisT,ref=ThisRef},Title) -spec findMenuItem(This, MenuString, ItemString) -> integer() when This::wxMenuBar(), MenuString::unicode:chardata(), ItemString::unicode:chardata(). findMenuItem(#wx_ref{type=ThisT,ref=ThisRef},MenuString,ItemString) - when is_list(MenuString),is_list(ItemString) -> + when ?is_chardata(MenuString),?is_chardata(ItemString) -> ?CLASS(ThisT,wxMenuBar), MenuString_UC = unicode:characters_to_binary([MenuString,0]), ItemString_UC = unicode:characters_to_binary([ItemString,0]), @@ -239,7 +240,7 @@ getMenuCount(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec insert(This, Pos, Menu, Title) -> boolean() when This::wxMenuBar(), Pos::integer(), Menu::wxMenu:wxMenu(), Title::unicode:chardata(). insert(#wx_ref{type=ThisT,ref=ThisRef},Pos,#wx_ref{type=MenuT,ref=MenuRef},Title) - when is_integer(Pos),is_list(Title) -> + when is_integer(Pos),?is_chardata(Title) -> ?CLASS(ThisT,wxMenuBar), ?CLASS(MenuT,wxMenu), Title_UC = unicode:characters_to_binary([Title,0]), @@ -285,7 +286,7 @@ remove(#wx_ref{type=ThisT,ref=ThisRef},Pos) -spec replace(This, Pos, Menu, Title) -> wxMenu:wxMenu() when This::wxMenuBar(), Pos::integer(), Menu::wxMenu:wxMenu(), Title::unicode:chardata(). replace(#wx_ref{type=ThisT,ref=ThisRef},Pos,#wx_ref{type=MenuT,ref=MenuRef},Title) - when is_integer(Pos),is_list(Title) -> + when is_integer(Pos),?is_chardata(Title) -> ?CLASS(ThisT,wxMenuBar), ?CLASS(MenuT,wxMenu), Title_UC = unicode:characters_to_binary([Title,0]), @@ -296,7 +297,7 @@ replace(#wx_ref{type=ThisT,ref=ThisRef},Pos,#wx_ref{type=MenuT,ref=MenuRef},Titl -spec setHelpString(This, Itemid, HelpString) -> 'ok' when This::wxMenuBar(), Itemid::integer(), HelpString::unicode:chardata(). setHelpString(#wx_ref{type=ThisT,ref=ThisRef},Itemid,HelpString) - when is_integer(Itemid),is_list(HelpString) -> + when is_integer(Itemid),?is_chardata(HelpString) -> ?CLASS(ThisT,wxMenuBar), HelpString_UC = unicode:characters_to_binary([HelpString,0]), wxe_util:cast(?wxMenuBar_SetHelpString, @@ -306,7 +307,7 @@ setHelpString(#wx_ref{type=ThisT,ref=ThisRef},Itemid,HelpString) -spec setLabel(This, S) -> 'ok' when This::wxMenuBar(), S::unicode:chardata(). setLabel(#wx_ref{type=ThisT,ref=ThisRef},S) - when is_list(S) -> + when ?is_chardata(S) -> ?CLASS(ThisT,wxMenuBar), S_UC = unicode:characters_to_binary([S,0]), wxe_util:cast(?wxMenuBar_SetLabel_1, @@ -316,7 +317,7 @@ setLabel(#wx_ref{type=ThisT,ref=ThisRef},S) -spec setLabel(This, Itemid, Label) -> 'ok' when This::wxMenuBar(), Itemid::integer(), Label::unicode:chardata(). setLabel(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Label) - when is_integer(Itemid),is_list(Label) -> + when is_integer(Itemid),?is_chardata(Label) -> ?CLASS(ThisT,wxMenuBar), Label_UC = unicode:characters_to_binary([Label,0]), wxe_util:cast(?wxMenuBar_SetLabel_2, @@ -326,7 +327,7 @@ setLabel(#wx_ref{type=ThisT,ref=ThisRef},Itemid,Label) -spec setLabelTop(This, Pos, Label) -> 'ok' when This::wxMenuBar(), Pos::integer(), Label::unicode:chardata(). setLabelTop(#wx_ref{type=ThisT,ref=ThisRef},Pos,Label) - when is_integer(Pos),is_list(Label) -> + when is_integer(Pos),?is_chardata(Label) -> ?CLASS(ThisT,wxMenuBar), Label_UC = unicode:characters_to_binary([Label,0]), wxe_util:cast(?wxMenuBar_SetLabelTop, @@ -340,6 +341,8 @@ destroy(Obj=#wx_ref{type=Type}) -> ok. %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -650,6 +653,8 @@ fit(This) -> wxWindow:fit(This). %% @hidden findWindow(This,Winid) -> wxWindow:findWindow(This,Winid). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxMenuItem.erl b/lib/wx/src/gen/wxMenuItem.erl index 324910d15d..2e0a1c756a 100644 --- a/lib/wx/src/gen/wxMenuItem.erl +++ b/lib/wx/src/gen/wxMenuItem.erl @@ -153,7 +153,7 @@ getLabel(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec getLabelFromText(Text) -> unicode:charlist() when Text::unicode:chardata(). getLabelFromText(Text) - when is_list(Text) -> + when ?is_chardata(Text) -> Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxMenuItem_GetLabelFromText, <<(byte_size(Text_UC)):32/?UI,(Text_UC)/binary, 0:(((8- ((4+byte_size(Text_UC)) band 16#7)) band 16#7))/unit:8>>). @@ -235,7 +235,7 @@ setBitmap(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=BitmapT,ref=BitmapRef}) - -spec setHelp(This, Str) -> 'ok' when This::wxMenuItem(), Str::unicode:chardata(). setHelp(#wx_ref{type=ThisT,ref=ThisRef},Str) - when is_list(Str) -> + when ?is_chardata(Str) -> ?CLASS(ThisT,wxMenuItem), Str_UC = unicode:characters_to_binary([Str,0]), wxe_util:cast(?wxMenuItem_SetHelp, @@ -263,7 +263,7 @@ setSubMenu(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=MenuT,ref=MenuRef}) -> -spec setText(This, Str) -> 'ok' when This::wxMenuItem(), Str::unicode:chardata(). setText(#wx_ref{type=ThisT,ref=ThisRef},Str) - when is_list(Str) -> + when ?is_chardata(Str) -> ?CLASS(ThisT,wxMenuItem), Str_UC = unicode:characters_to_binary([Str,0]), wxe_util:cast(?wxMenuItem_SetText, diff --git a/lib/wx/src/gen/wxMessageDialog.erl b/lib/wx/src/gen/wxMessageDialog.erl index 30e47529cc..a63f66741b 100644 --- a/lib/wx/src/gen/wxMessageDialog.erl +++ b/lib/wx/src/gen/wxMessageDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -93,7 +93,7 @@ parent_class(_Class) -> erlang:error({badtype, ?MODULE}). Parent::wxWindow:wxWindow(), Message::unicode:chardata(). new(Parent,Message) - when is_record(Parent, wx_ref),is_list(Message) -> + when is_record(Parent, wx_ref),?is_chardata(Message) -> new(Parent,Message, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmessagedialog.html#wxmessagedialogwxmessagedialog">external documentation</a>. @@ -103,7 +103,7 @@ new(Parent,Message) | {'style', integer()} | {'pos', {X::integer(), Y::integer()}}. new(#wx_ref{type=ParentT,ref=ParentRef},Message, Options) - when is_list(Message),is_list(Options) -> + when ?is_chardata(Message),is_list(Options) -> ?CLASS(ParentT,wxWindow), Message_UC = unicode:characters_to_binary([Message,0]), MOpts = fun({caption, Caption}, Acc) -> Caption_UC = unicode:characters_to_binary([Caption,0]),[<<1:32/?UI,(byte_size(Caption_UC)):32/?UI,(Caption_UC)/binary, 0:(((8- ((0+byte_size(Caption_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -192,6 +192,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -508,6 +510,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxMiniFrame.erl b/lib/wx/src/gen/wxMiniFrame.erl index 4ae9764819..37dc2f2e04 100644 --- a/lib/wx/src/gen/wxMiniFrame.erl +++ b/lib/wx/src/gen/wxMiniFrame.erl @@ -41,27 +41,28 @@ close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createStatusBar/1,createStatusBar/2,createToolBar/1,createToolBar/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientAreaOrigin/1, - getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, - getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getStatusBar/1, - getStatusBarPane/1,getTextExtent/2,getTextExtent/3,getTitle/1,getToolBar/1, - getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - processCommand/2,raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3, - releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientAreaOrigin/1,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, + getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1, + getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getStatusBar/1,getStatusBarPane/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolBar/1,getToolTip/1,getUpdateRegion/1, + getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, + hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2, + inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1, + isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, + isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1, + maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, + navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, + popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, scrollWindow/4,sendSizeEvent/1,setAcceleratorTable/2,setAutoLayout/2, setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, @@ -101,7 +102,7 @@ new() -> Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(). new(Parent,Id,Title) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> new(Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxminiframe.html#wxminiframewxminiframe">external documentation</a>. @@ -111,7 +112,7 @@ new(Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -127,7 +128,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) This::wxMiniFrame(), Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(). create(This,Parent,Id,Title) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Title) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title) -> create(This,Parent,Id,Title, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxminiframe.html#wxminiframecreate">external documentation</a>. @@ -137,7 +138,7 @@ create(This,Parent,Id,Title) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Title, Options) - when is_integer(Id),is_list(Title),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_list(Options) -> ?CLASS(ThisT,wxMiniFrame), ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), @@ -241,6 +242,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -561,6 +564,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxMultiChoiceDialog.erl b/lib/wx/src/gen/wxMultiChoiceDialog.erl index 0436515256..eef15d561e 100644 --- a/lib/wx/src/gen/wxMultiChoiceDialog.erl +++ b/lib/wx/src/gen/wxMultiChoiceDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -99,7 +99,7 @@ new() -> Parent::wxWindow:wxWindow(), Message::unicode:chardata(), Caption::unicode:chardata(), Choices::[unicode:chardata()]. new(Parent,Message,Caption,Choices) - when is_record(Parent, wx_ref),is_list(Message),is_list(Caption),is_list(Choices) -> + when is_record(Parent, wx_ref),?is_chardata(Message),?is_chardata(Caption),is_list(Choices) -> new(Parent,Message,Caption,Choices, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmultichoicedialog.html#wxmultichoicedialogwxmultichoicedialog">external documentation</a>. @@ -108,7 +108,7 @@ new(Parent,Message,Caption,Choices) Option :: {'style', integer()} | {'pos', {X::integer(), Y::integer()}}. new(#wx_ref{type=ParentT,ref=ParentRef},Message,Caption,Choices, Options) - when is_list(Message),is_list(Caption),is_list(Choices),is_list(Options) -> + when ?is_chardata(Message),?is_chardata(Caption),is_list(Choices),is_list(Options) -> ?CLASS(ParentT,wxWindow), Message_UC = unicode:characters_to_binary([Message,0]), Caption_UC = unicode:characters_to_binary([Caption,0]), @@ -217,6 +217,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -533,6 +535,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxNotebook.erl b/lib/wx/src/gen/wxNotebook.erl index 24f96ac88c..d7d1b0f87f 100644 --- a/lib/wx/src/gen/wxNotebook.erl +++ b/lib/wx/src/gen/wxNotebook.erl @@ -43,29 +43,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -120,7 +120,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Winid, Options) This::wxNotebook(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). addPage(This,Page,Text) - when is_record(This, wx_ref),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_record(Page, wx_ref),?is_chardata(Text) -> addPage(This,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxnotebook.html#wxnotebookaddpage">external documentation</a>. @@ -129,7 +129,7 @@ addPage(This,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. addPage(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_list(Text),is_list(Options) -> + when ?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxNotebook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -312,7 +312,7 @@ hitTest(#wx_ref{type=ThisT,ref=ThisRef},{PtX,PtY}) This::wxNotebook(), Position::integer(), Win::wxWindow:wxWindow(), StrText::unicode:chardata(). insertPage(This,Position,Win,StrText) - when is_record(This, wx_ref),is_integer(Position),is_record(Win, wx_ref),is_list(StrText) -> + when is_record(This, wx_ref),is_integer(Position),is_record(Win, wx_ref),?is_chardata(StrText) -> insertPage(This,Position,Win,StrText, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxnotebook.html#wxnotebookinsertpage">external documentation</a>. @@ -321,7 +321,7 @@ insertPage(This,Position,Win,StrText) Option :: {'bSelect', boolean()} | {'imageId', integer()}. insertPage(#wx_ref{type=ThisT,ref=ThisRef},Position,#wx_ref{type=WinT,ref=WinRef},StrText, Options) - when is_integer(Position),is_list(StrText),is_list(Options) -> + when is_integer(Position),?is_chardata(StrText),is_list(Options) -> ?CLASS(ThisT,wxNotebook), ?CLASS(WinT,wxWindow), StrText_UC = unicode:characters_to_binary([StrText,0]), @@ -372,7 +372,7 @@ setPageImage(#wx_ref{type=ThisT,ref=ThisRef},NPage,NImage) -spec setPageText(This, NPage, StrText) -> boolean() when This::wxNotebook(), NPage::integer(), StrText::unicode:chardata(). setPageText(#wx_ref{type=ThisT,ref=ThisRef},NPage,StrText) - when is_integer(NPage),is_list(StrText) -> + when is_integer(NPage),?is_chardata(StrText) -> ?CLASS(ThisT,wxNotebook), StrText_UC = unicode:characters_to_binary([StrText,0]), wxe_util:call(?wxNotebook_SetPageText, @@ -409,6 +409,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -725,6 +727,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPanel.erl b/lib/wx/src/gen/wxPanel.erl index 07898cf19e..fc48d569af 100644 --- a/lib/wx/src/gen/wxPanel.erl +++ b/lib/wx/src/gen/wxPanel.erl @@ -37,29 +37,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, + isExposed/5,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1, + lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2, + moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, + popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, + setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -155,6 +155,8 @@ destroy(Obj=#wx_ref{type=Type}) -> ok. %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -473,6 +475,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPasswordEntryDialog.erl b/lib/wx/src/gen/wxPasswordEntryDialog.erl index e8ee8c8f37..4667376783 100644 --- a/lib/wx/src/gen/wxPasswordEntryDialog.erl +++ b/lib/wx/src/gen/wxPasswordEntryDialog.erl @@ -41,34 +41,34 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getValue/1,getVirtualSize/1, - getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, - hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, - initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, - isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, - isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, - lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, - move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, - pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, - popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, - refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, - requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, - scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, - setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, - setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, - setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getValue/1, + getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, + hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2, + inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1, + isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, + isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1,isShown/1, + isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, + maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, + navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, + popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, + refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, + reparent/2,requestUserAttention/1,requestUserAttention/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2, + setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2, + setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1, + setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2, + setIcons/2,setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -95,7 +95,7 @@ parent_class(_Class) -> erlang:error({badtype, ?MODULE}). Parent::wxWindow:wxWindow(), Message::unicode:chardata(). new(Parent,Message) - when is_record(Parent, wx_ref),is_list(Message) -> + when is_record(Parent, wx_ref),?is_chardata(Message) -> new(Parent,Message, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxpasswordentrydialog.html#wxpasswordentrydialogwxpasswordentrydialog">external documentation</a>. @@ -106,7 +106,7 @@ new(Parent,Message) | {'style', integer()} | {'pos', {X::integer(), Y::integer()}}. new(#wx_ref{type=ParentT,ref=ParentRef},Message, Options) - when is_list(Message),is_list(Options) -> + when ?is_chardata(Message),is_list(Options) -> ?CLASS(ParentT,wxWindow), Message_UC = unicode:characters_to_binary([Message,0]), MOpts = fun({caption, Caption}, Acc) -> Caption_UC = unicode:characters_to_binary([Caption,0]),[<<1:32/?UI,(byte_size(Caption_UC)):32/?UI,(Caption_UC)/binary, 0:(((8- ((0+byte_size(Caption_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -201,6 +201,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -517,6 +519,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPickerBase.erl b/lib/wx/src/gen/wxPickerBase.erl index 33931f9119..0ea3a36d33 100644 --- a/lib/wx/src/gen/wxPickerBase.erl +++ b/lib/wx/src/gen/wxPickerBase.erl @@ -41,29 +41,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -214,6 +214,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -530,6 +532,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPopupTransientWindow.erl b/lib/wx/src/gen/wxPopupTransientWindow.erl index b1feef6dcb..6ec2fcae62 100644 --- a/lib/wx/src/gen/wxPopupTransientWindow.erl +++ b/lib/wx/src/gen/wxPopupTransientWindow.erl @@ -38,38 +38,39 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,position/3,raise/1, - refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, - setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, - setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, - setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, - setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, - setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2, - setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, - setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, - show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1, - update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]). + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,position/3,raise/1,refresh/1,refresh/2, + refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,reparent/2, + screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, + scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2, + setBackgroundStyle/2,setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2, + setCursor/2,setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1, + setFocusFromKbd/1,setFont/2,setForegroundColour/2,setHelpText/2,setId/2, + setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, + setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5, + setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, + setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2, + setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, + setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, + setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, + transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, + validate/1,warpPointer/3]). -export_type([wxPopupTransientWindow/0]). %% @hidden @@ -146,6 +147,8 @@ destroy(Obj=#wx_ref{type=Type}) -> position(This,PtOrigin,Size) -> wxPopupWindow:position(This,PtOrigin,Size). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -466,6 +469,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPopupWindow.erl b/lib/wx/src/gen/wxPopupWindow.erl index 962fd9903b..ddf1033841 100644 --- a/lib/wx/src/gen/wxPopupWindow.erl +++ b/lib/wx/src/gen/wxPopupWindow.erl @@ -37,29 +37,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -143,6 +143,8 @@ destroy(Obj=#wx_ref{type=Type}) -> ok. %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -463,6 +465,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPreviewCanvas.erl b/lib/wx/src/gen/wxPreviewCanvas.erl index 67357dbd65..4e869dd6f2 100644 --- a/lib/wx/src/gen/wxPreviewCanvas.erl +++ b/lib/wx/src/gen/wxPreviewCanvas.erl @@ -40,37 +40,37 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - doPrepareDC/2,enable/1,enable/2,enableScrolling/3,findWindow/2,fit/1, - fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, + doPrepareDC/2,dragAcceptFiles/2,enable/1,enable/2,enableScrolling/3, + findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, getBackgroundStyle/1,getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1, - getChildren/1,getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPixelsPerUnit/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getToolTip/1,getUpdateRegion/1,getViewStart/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scroll/3, - scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, - setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, - setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2, - setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, - setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, - setScrollPos/4,setScrollRate/3,setScrollbar/5,setScrollbar/6,setScrollbars/5, - setScrollbars/6,setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2, - setSizeHints/3,setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2, - setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2,setToolTip/2, - setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, + getChildren/1,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, + getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPixelsPerUnit/1, + getScrollPos/2,getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1, + getTextExtent/2,getTextExtent/3,getToolTip/1,getUpdateRegion/1,getViewStart/1, + getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, + hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,prepareDC/2,raise/1,refresh/1,refresh/2, + refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2,reparent/2, + screenToClient/1,screenToClient/2,scroll/3,scrollLines/2,scrollPages/2, + scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, + setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, + setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, + setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, + setPalette/2,setScrollPos/3,setScrollPos/4,setScrollRate/3,setScrollbar/5, + setScrollbar/6,setScrollbars/5,setScrollbars/6,setSize/2,setSize/3, + setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, + setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setTargetWindow/2,setThemeEnabled/2, + setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, @@ -121,6 +121,8 @@ setFocusIgnoringChildren(This) -> wxPanel:setFocusIgnoringChildren(This). initDialog(This) -> wxPanel:initDialog(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -439,6 +441,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPreviewControlBar.erl b/lib/wx/src/gen/wxPreviewControlBar.erl index 4dd224b26b..cf17f40527 100644 --- a/lib/wx/src/gen/wxPreviewControlBar.erl +++ b/lib/wx/src/gen/wxPreviewControlBar.erl @@ -39,38 +39,39 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1, - setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, - setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, - setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, - setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, - setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, - setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2, - setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, - setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, - show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1, - update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]). + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, + setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5, + setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, + setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2, + setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, + setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, + setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, + transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, + validate/1,warpPointer/3]). -export_type([wxPreviewControlBar/0]). %% @hidden @@ -152,6 +153,8 @@ setFocusIgnoringChildren(This) -> wxPanel:setFocusIgnoringChildren(This). initDialog(This) -> wxPanel:initDialog(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -470,6 +473,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPreviewFrame.erl b/lib/wx/src/gen/wxPreviewFrame.erl index 2f530b49ea..022b0cd46e 100644 --- a/lib/wx/src/gen/wxPreviewFrame.erl +++ b/lib/wx/src/gen/wxPreviewFrame.erl @@ -42,27 +42,28 @@ close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createStatusBar/1,createStatusBar/2,createToolBar/1,createToolBar/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientAreaOrigin/1, - getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, - getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getStatusBar/1, - getStatusBarPane/1,getTextExtent/2,getTextExtent/3,getTitle/1,getToolBar/1, - getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - processCommand/2,raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3, - releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientAreaOrigin/1,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, + getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1, + getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getStatusBar/1,getStatusBarPane/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolBar/1,getToolTip/1,getUpdateRegion/1, + getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, + hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2, + inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1, + isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, + isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1, + maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, + navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, + popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, scrollWindow/4,sendSizeEvent/1,setAcceleratorTable/2,setAutoLayout/2, setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, @@ -244,6 +245,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -564,6 +567,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPrintData.erl b/lib/wx/src/gen/wxPrintData.erl index 6b6b678adf..b6815da90b 100644 --- a/lib/wx/src/gen/wxPrintData.erl +++ b/lib/wx/src/gen/wxPrintData.erl @@ -205,7 +205,7 @@ setPaperId(#wx_ref{type=ThisT,ref=ThisRef},SizeId) -spec setPrinterName(This, Name) -> 'ok' when This::wxPrintData(), Name::unicode:chardata(). setPrinterName(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxPrintData), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:cast(?wxPrintData_SetPrinterName, diff --git a/lib/wx/src/gen/wxPrintDialog.erl b/lib/wx/src/gen/wxPrintDialog.erl index d4188e79c4..4024036166 100644 --- a/lib/wx/src/gen/wxPrintDialog.erl +++ b/lib/wx/src/gen/wxPrintDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -214,6 +214,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -530,6 +532,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxPrinter.erl b/lib/wx/src/gen/wxPrinter.erl index b9fb1c07bd..bdca37b4a8 100644 --- a/lib/wx/src/gen/wxPrinter.erl +++ b/lib/wx/src/gen/wxPrinter.erl @@ -122,7 +122,7 @@ printDialog(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef}) -spec reportError(This, Parent, Printout, Message) -> 'ok' when This::wxPrinter(), Parent::wxWindow:wxWindow(), Printout::wxPrintout:wxPrintout(), Message::unicode:chardata(). reportError(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},#wx_ref{type=PrintoutT,ref=PrintoutRef},Message) - when is_list(Message) -> + when ?is_chardata(Message) -> ?CLASS(ThisT,wxPrinter), ?CLASS(ParentT,wxWindow), ?CLASS(PrintoutT,wxPrintout), diff --git a/lib/wx/src/gen/wxProgressDialog.erl b/lib/wx/src/gen/wxProgressDialog.erl index 8e275f9dc8..a17cb0383a 100644 --- a/lib/wx/src/gen/wxProgressDialog.erl +++ b/lib/wx/src/gen/wxProgressDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,updateWindowUI/1, @@ -93,7 +93,7 @@ parent_class(_Class) -> erlang:error({badtype, ?MODULE}). Title::unicode:chardata(), Message::unicode:chardata(). new(Title,Message) - when is_list(Title),is_list(Message) -> + when ?is_chardata(Title),?is_chardata(Message) -> new(Title,Message, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxprogressdialog.html#wxprogressdialogwxprogressdialog">external documentation</a>. @@ -103,7 +103,7 @@ new(Title,Message) | {'parent', wxWindow:wxWindow()} | {'style', integer()}. new(Title,Message, Options) - when is_list(Title),is_list(Message),is_list(Options) -> + when ?is_chardata(Title),?is_chardata(Message),is_list(Options) -> Title_UC = unicode:characters_to_binary([Title,0]), Message_UC = unicode:characters_to_binary([Message,0]), MOpts = fun({maximum, Maximum}, Acc) -> [<<1:32/?UI,Maximum:32/?UI>>|Acc]; @@ -229,6 +229,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -543,6 +545,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxRadioBox.erl b/lib/wx/src/gen/wxRadioBox.erl index 348d75db2a..13d3a496ac 100644 --- a/lib/wx/src/gen/wxRadioBox.erl +++ b/lib/wx/src/gen/wxRadioBox.erl @@ -41,12 +41,13 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1,getBackgroundColour/1, - getBackgroundStyle/1,getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1, - getChildren/1,getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + dragAcceptFiles/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, + getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, + getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, + getContentScaleFactor/1,getCursor/1,getDropTarget/1,getEventHandler/1, + getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, + getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1,getMinSize/1, + getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, @@ -86,7 +87,7 @@ parent_class(_Class) -> erlang:error({badtype, ?MODULE}). Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(), Pos::{X::integer(), Y::integer()}, Size::{W::integer(), H::integer()}, Choices::[unicode:chardata()]. new(Parent,Id,Title,Pos={PosX,PosY},Size={SizeW,SizeH},Choices) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Title),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices) -> new(Parent,Id,Title,Pos,Size,Choices, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxradiobox.html#wxradioboxwxradiobox">external documentation</a>. @@ -96,7 +97,7 @@ new(Parent,Id,Title,Pos={PosX,PosY},Size={SizeW,SizeH},Choices) | {'style', integer()} | {'val', wx:wx_object()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title,{PosX,PosY},{SizeW,SizeH},Choices, Options) - when is_integer(Id),is_list(Title),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices),is_list(Options) -> ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), Choices_UCA = [unicode:characters_to_binary([ChoicesTemp,0]) || @@ -114,7 +115,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id,Title,{PosX,PosY},{SizeW,SizeH},Choic This::wxRadioBox(), Parent::wxWindow:wxWindow(), Id::integer(), Title::unicode:chardata(), Pos::{X::integer(), Y::integer()}, Size::{W::integer(), H::integer()}, Choices::[unicode:chardata()]. create(This,Parent,Id,Title,Pos={PosX,PosY},Size={SizeW,SizeH},Choices) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Title),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Title),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices) -> create(This,Parent,Id,Title,Pos,Size,Choices, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxradiobox.html#wxradioboxcreate">external documentation</a>. @@ -124,7 +125,7 @@ create(This,Parent,Id,Title,Pos={PosX,PosY},Size={SizeW,SizeH},Choices) | {'style', integer()} | {'val', wx:wx_object()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Title,{PosX,PosY},{SizeW,SizeH},Choices, Options) - when is_integer(Id),is_list(Title),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices),is_list(Options) -> + when is_integer(Id),?is_chardata(Title),is_integer(PosX),is_integer(PosY),is_integer(SizeW),is_integer(SizeH),is_list(Choices),is_list(Options) -> ?CLASS(ThisT,wxRadioBox), ?CLASS(ParentT,wxWindow), Title_UC = unicode:characters_to_binary([Title,0]), @@ -319,7 +320,7 @@ isItemShown(#wx_ref{type=ThisT,ref=ThisRef},N) -spec setItemHelpText(This, N, HelpText) -> 'ok' when This::wxRadioBox(), N::integer(), HelpText::unicode:chardata(). setItemHelpText(#wx_ref{type=ThisT,ref=ThisRef},N,HelpText) - when is_integer(N),is_list(HelpText) -> + when is_integer(N),?is_chardata(HelpText) -> ?CLASS(ThisT,wxRadioBox), HelpText_UC = unicode:characters_to_binary([HelpText,0]), wxe_util:cast(?wxRadioBox_SetItemHelpText, @@ -329,7 +330,7 @@ setItemHelpText(#wx_ref{type=ThisT,ref=ThisRef},N,HelpText) -spec setItemToolTip(This, Item, Text) -> 'ok' when This::wxRadioBox(), Item::integer(), Text::unicode:chardata(). setItemToolTip(#wx_ref{type=ThisT,ref=ThisRef},Item,Text) - when is_integer(Item),is_list(Text) -> + when is_integer(Item),?is_chardata(Text) -> ?CLASS(ThisT,wxRadioBox), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxRadioBox_SetItemToolTip, @@ -348,6 +349,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -656,6 +659,8 @@ fit(This) -> wxWindow:fit(This). %% @hidden findWindow(This,Winid) -> wxWindow:findWindow(This,Winid). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxRadioButton.erl b/lib/wx/src/gen/wxRadioButton.erl index 4487724be6..b5635e8afe 100644 --- a/lib/wx/src/gen/wxRadioButton.erl +++ b/lib/wx/src/gen/wxRadioButton.erl @@ -38,29 +38,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -90,7 +90,7 @@ new() -> Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). new(Parent,Id,Label) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> new(Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxradiobutton.html#wxradiobuttonwxradiobutton">external documentation</a>. @@ -101,7 +101,7 @@ new(Parent,Id,Label) | {'style', integer()} | {'validator', wx:wx_object()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -118,7 +118,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) This::wxRadioButton(), Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). create(This,Parent,Id,Label) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> create(This,Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxradiobutton.html#wxradiobuttoncreate">external documentation</a>. @@ -129,7 +129,7 @@ create(This,Parent,Id,Label) | {'style', integer()} | {'validator', wx:wx_object()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxRadioButton), ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), @@ -172,6 +172,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -488,6 +490,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxSashLayoutWindow.erl b/lib/wx/src/gen/wxSashLayoutWindow.erl index ae081ae800..a0e240b25d 100644 --- a/lib/wx/src/gen/wxSashLayoutWindow.erl +++ b/lib/wx/src/gen/wxSashLayoutWindow.erl @@ -39,30 +39,31 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMaximumSizeX/1,getMaximumSizeY/1, - getMinSize/1,getMinimumSizeX/1,getMinimumSizeY/1,getName/1,getParent/1, - getPosition/1,getRect/1,getSashVisible/2,getScreenPosition/1,getScreenRect/1, - getScrollPos/2,getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1, - getTextExtent/2,getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, - getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, - hasTransparentBackground/1,hide/1,inheritAttributes/1,initDialog/1, - invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1, - lineUp/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,screenToClient/1,screenToClient/2,scrollLines/2, - scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, - setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, - setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMaximumSizeX/1,getMaximumSizeY/1,getMinSize/1,getMinimumSizeX/1, + getMinimumSizeY/1,getName/1,getParent/1,getPosition/1,getRect/1,getSashVisible/2, + getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, + getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, + getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, + getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, + hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, + isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, + isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, + move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, + navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, + popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, + refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, + reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, + scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, + setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, + setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, + setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, + setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMaximumSizeX/2,setMaximumSizeY/2,setMinSize/2,setMinimumSizeX/2, setMinimumSizeY/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, setOwnForegroundColour/2,setPalette/2,setSashVisible/3,setScrollPos/3, @@ -220,6 +221,8 @@ getMaximumSizeX(This) -> wxSashWindow:getMaximumSizeX(This). getSashVisible(This,Edge) -> wxSashWindow:getSashVisible(This,Edge). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -540,6 +543,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxSashWindow.erl b/lib/wx/src/gen/wxSashWindow.erl index 773e0f1ab0..5e66d79b11 100644 --- a/lib/wx/src/gen/wxSashWindow.erl +++ b/lib/wx/src/gen/wxSashWindow.erl @@ -39,29 +39,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -208,6 +208,8 @@ destroy(Obj=#wx_ref{type=Type}) -> ok. %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -528,6 +530,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxScrollBar.erl b/lib/wx/src/gen/wxScrollBar.erl index 7f70d9d97b..a1138725cd 100644 --- a/lib/wx/src/gen/wxScrollBar.erl +++ b/lib/wx/src/gen/wxScrollBar.erl @@ -39,29 +39,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setSize/2,setSize/3,setSize/5, setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, @@ -216,6 +216,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -528,6 +530,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxScrolledWindow.erl b/lib/wx/src/gen/wxScrolledWindow.erl index 70bc5adbd9..e3f6122cfa 100644 --- a/lib/wx/src/gen/wxScrolledWindow.erl +++ b/lib/wx/src/gen/wxScrolledWindow.erl @@ -41,38 +41,39 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFocusIgnoringChildren/1, - setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, - setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, - setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, - setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, - setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, - setThemeEnabled/2,setToolTip/2,setTransparent/2,setVirtualSize/2, - setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, - setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, - show/1,show/2,thaw/1,transferDataFromWindow/1,transferDataToWindow/1, - update/1,updateWindowUI/1,updateWindowUI/2,validate/1,warpPointer/3]). + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFocusIgnoringChildren/1,setFont/2,setForegroundColour/2,setHelpText/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setScrollPos/3, + setScrollPos/4,setScrollbar/5,setScrollbar/6,setSize/2,setSize/3,setSize/5, + setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4,setSizer/2, + setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2,setToolTip/2, + setTransparent/2,setVirtualSize/2,setVirtualSize/3,setVirtualSizeHints/2, + setVirtualSizeHints/3,setVirtualSizeHints/4,setWindowStyle/2,setWindowStyleFlag/2, + setWindowVariant/2,shouldInheritColours/1,show/1,show/2,thaw/1,transferDataFromWindow/1, + transferDataToWindow/1,update/1,updateWindowUI/1,updateWindowUI/2, + validate/1,warpPointer/3]). -export_type([wxScrolledWindow/0]). %% @hidden @@ -259,6 +260,8 @@ setFocusIgnoringChildren(This) -> wxPanel:setFocusIgnoringChildren(This). initDialog(This) -> wxPanel:initDialog(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -577,6 +580,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxSingleChoiceDialog.erl b/lib/wx/src/gen/wxSingleChoiceDialog.erl index baff296d11..8b2991da4d 100644 --- a/lib/wx/src/gen/wxSingleChoiceDialog.erl +++ b/lib/wx/src/gen/wxSingleChoiceDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -99,7 +99,7 @@ new() -> Parent::wxWindow:wxWindow(), Message::unicode:chardata(), Caption::unicode:chardata(), Choices::[unicode:chardata()]. new(Parent,Message,Caption,Choices) - when is_record(Parent, wx_ref),is_list(Message),is_list(Caption),is_list(Choices) -> + when is_record(Parent, wx_ref),?is_chardata(Message),?is_chardata(Caption),is_list(Choices) -> new(Parent,Message,Caption,Choices, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxsinglechoicedialog.html#wxsinglechoicedialogwxsinglechoicedialog">external documentation</a>. @@ -108,7 +108,7 @@ new(Parent,Message,Caption,Choices) Option :: {'style', integer()} | {'pos', {X::integer(), Y::integer()}}. new(#wx_ref{type=ParentT,ref=ParentRef},Message,Caption,Choices, Options) - when is_list(Message),is_list(Caption),is_list(Choices),is_list(Options) -> + when ?is_chardata(Message),?is_chardata(Caption),is_list(Choices),is_list(Options) -> ?CLASS(ParentT,wxWindow), Message_UC = unicode:characters_to_binary([Message,0]), Caption_UC = unicode:characters_to_binary([Caption,0]), @@ -224,6 +224,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -540,6 +542,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxSlider.erl b/lib/wx/src/gen/wxSlider.erl index a215b3c1d5..7bdff00589 100644 --- a/lib/wx/src/gen/wxSlider.erl +++ b/lib/wx/src/gen/wxSlider.erl @@ -40,29 +40,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -248,6 +248,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -564,6 +566,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxSpinButton.erl b/lib/wx/src/gen/wxSpinButton.erl index 1c8d674d05..6c24176974 100644 --- a/lib/wx/src/gen/wxSpinButton.erl +++ b/lib/wx/src/gen/wxSpinButton.erl @@ -39,29 +39,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -196,6 +196,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -512,6 +514,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxSpinCtrl.erl b/lib/wx/src/gen/wxSpinCtrl.erl index f8a46dd146..c229b4caf1 100644 --- a/lib/wx/src/gen/wxSpinCtrl.erl +++ b/lib/wx/src/gen/wxSpinCtrl.erl @@ -39,29 +39,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -172,7 +172,7 @@ setValue(#wx_ref{type=ThisT,ref=ThisRef},Value) wxe_util:cast(?wxSpinCtrl_SetValue_1_0, <<ThisRef:32/?UI,Value:32/?UI>>); setValue(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxSpinCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxSpinCtrl_SetValue_1_1, @@ -233,6 +233,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -549,6 +551,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxSplashScreen.erl b/lib/wx/src/gen/wxSplashScreen.erl index 3b53e670c1..9729b3529b 100644 --- a/lib/wx/src/gen/wxSplashScreen.erl +++ b/lib/wx/src/gen/wxSplashScreen.erl @@ -41,27 +41,28 @@ close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createStatusBar/1,createStatusBar/2,createToolBar/1,createToolBar/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientAreaOrigin/1, - getClientSize/1,getContainingSizer/1,getCursor/1,getDropTarget/1, - getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, - getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, - getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getStatusBar/1, - getStatusBarPane/1,getTextExtent/2,getTextExtent/3,getTitle/1,getToolBar/1, - getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - processCommand/2,raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3, - releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientAreaOrigin/1,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, + getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1,getMenuBar/1,getMinSize/1, + getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getStatusBar/1,getStatusBarPane/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolBar/1,getToolTip/1,getUpdateRegion/1, + getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1, + hasScrollbar/2,hasTransparentBackground/1,hide/1,iconize/1,iconize/2, + inheritAttributes/1,initDialog/1,invalidateBestSize/1,isActive/1, + isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5, + isFullScreen/1,isIconized/1,isMaximized/1,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,maximize/1, + maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, + navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, + popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,processCommand/2, + raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, + removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, scrollWindow/4,sendSizeEvent/1,setAcceleratorTable/2,setAutoLayout/2, setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, @@ -230,6 +231,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -550,6 +553,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxSplitterWindow.erl b/lib/wx/src/gen/wxSplitterWindow.erl index f311d5011f..fb2f355f43 100644 --- a/lib/wx/src/gen/wxSplitterWindow.erl +++ b/lib/wx/src/gen/wxSplitterWindow.erl @@ -42,29 +42,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -359,6 +359,8 @@ destroy(Obj=#wx_ref{type=Type}) -> ok. %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -679,6 +681,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxStaticBitmap.erl b/lib/wx/src/gen/wxStaticBitmap.erl index 3ef1499a28..64d8cc4364 100644 --- a/lib/wx/src/gen/wxStaticBitmap.erl +++ b/lib/wx/src/gen/wxStaticBitmap.erl @@ -38,29 +38,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -168,6 +168,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -484,6 +486,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxStaticBox.erl b/lib/wx/src/gen/wxStaticBox.erl index 46cca3b6f3..728c02e9e4 100644 --- a/lib/wx/src/gen/wxStaticBox.erl +++ b/lib/wx/src/gen/wxStaticBox.erl @@ -38,29 +38,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -90,7 +90,7 @@ new() -> Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). new(Parent,Id,Label) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> new(Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxstaticbox.html#wxstaticboxwxstaticbox">external documentation</a>. @@ -100,7 +100,7 @@ new(Parent,Id,Label) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -116,7 +116,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) This::wxStaticBox(), Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). create(This,Parent,Id,Label) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> create(This,Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxstaticbox.html#wxstaticboxcreate">external documentation</a>. @@ -126,7 +126,7 @@ create(This,Parent,Id,Label) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxStaticBox), ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), @@ -151,6 +151,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -467,6 +469,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxStaticLine.erl b/lib/wx/src/gen/wxStaticLine.erl index 94dd339cfc..3c648b7746 100644 --- a/lib/wx/src/gen/wxStaticLine.erl +++ b/lib/wx/src/gen/wxStaticLine.erl @@ -39,29 +39,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -168,6 +168,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -484,6 +486,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxStaticText.erl b/lib/wx/src/gen/wxStaticText.erl index 37d0219bc6..34216f975f 100644 --- a/lib/wx/src/gen/wxStaticText.erl +++ b/lib/wx/src/gen/wxStaticText.erl @@ -38,30 +38,30 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, - getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2,setMinSize/2, - setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getMaxSize/1,getMinSize/1, + getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setMaxSize/2, + setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, @@ -90,7 +90,7 @@ new() -> Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). new(Parent,Id,Label) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> new(Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxstatictext.html#wxstatictextwxstatictext">external documentation</a>. @@ -100,7 +100,7 @@ new(Parent,Id,Label) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -116,7 +116,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) This::wxStaticText(), Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). create(This,Parent,Id,Label) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> create(This,Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxstatictext.html#wxstatictextcreate">external documentation</a>. @@ -126,7 +126,7 @@ create(This,Parent,Id,Label) | {'size', {W::integer(), H::integer()}} | {'style', integer()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxStaticText), ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), @@ -150,7 +150,7 @@ getLabel(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setLabel(This, Label) -> 'ok' when This::wxStaticText(), Label::unicode:chardata(). setLabel(#wx_ref{type=ThisT,ref=ThisRef},Label) - when is_list(Label) -> + when ?is_chardata(Label) -> ?CLASS(ThisT,wxStaticText), Label_UC = unicode:characters_to_binary([Label,0]), wxe_util:cast(?wxStaticText_SetLabel, @@ -174,6 +174,8 @@ destroy(Obj=#wx_ref{type=Type}) -> %% From wxControl %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -490,6 +492,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxStatusBar.erl b/lib/wx/src/gen/wxStatusBar.erl index d0ce65273b..8d9f77c209 100644 --- a/lib/wx/src/gen/wxStatusBar.erl +++ b/lib/wx/src/gen/wxStatusBar.erl @@ -40,29 +40,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -198,7 +198,7 @@ popStatusText(#wx_ref{type=ThisT,ref=ThisRef}, Options) This::wxStatusBar(), Text::unicode:chardata(). pushStatusText(This,Text) - when is_record(This, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),?is_chardata(Text) -> pushStatusText(This,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxstatusbar.html#wxstatusbarpushstatustext">external documentation</a>. @@ -206,7 +206,7 @@ pushStatusText(This,Text) This::wxStatusBar(), Text::unicode:chardata(), Option :: {'number', integer()}. pushStatusText(#wx_ref{type=ThisT,ref=ThisRef},Text, Options) - when is_list(Text),is_list(Options) -> + when ?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxStatusBar), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({number, Number}, Acc) -> [<<1:32/?UI,Number:32/?UI>>|Acc]; @@ -251,7 +251,7 @@ setMinHeight(#wx_ref{type=ThisT,ref=ThisRef},Height) This::wxStatusBar(), Text::unicode:chardata(). setStatusText(This,Text) - when is_record(This, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),?is_chardata(Text) -> setStatusText(This,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxstatusbar.html#wxstatusbarsetstatustext">external documentation</a>. @@ -259,7 +259,7 @@ setStatusText(This,Text) This::wxStatusBar(), Text::unicode:chardata(), Option :: {'number', integer()}. setStatusText(#wx_ref{type=ThisT,ref=ThisRef},Text, Options) - when is_list(Text),is_list(Options) -> + when ?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxStatusBar), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({number, Number}, Acc) -> [<<1:32/?UI,Number:32/?UI>>|Acc]; @@ -296,6 +296,8 @@ destroy(Obj=#wx_ref{type=Type}) -> ok. %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -616,6 +618,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxStyledTextCtrl.erl b/lib/wx/src/gen/wxStyledTextCtrl.erl index 15ef728659..7e45245a72 100644 --- a/lib/wx/src/gen/wxStyledTextCtrl.erl +++ b/lib/wx/src/gen/wxStyledTextCtrl.erl @@ -140,28 +140,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lower/1,makeModal/1,makeModal/2,move/2,move/3, - move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, - parent_class/1,popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3, - popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3, - releaseMouse/1,removeChild/2,reparent/2,screenToClient/1,screenToClient/2, - scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, - setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2,setCaret/2, - setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lower/1,makeModal/1,makeModal/2,move/2,move/3,move/4,moveAfterInTabOrder/2, + moveBeforeInTabOrder/2,navigate/1,navigate/2,parent_class/1,popEventHandler/1, + popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, + refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, + reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, + scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, + setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, + setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, + setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, + setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -245,7 +246,7 @@ create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef}, Opti -spec addText(This, Text) -> 'ok' when This::wxStyledTextCtrl(), Text::unicode:chardata(). addText(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxStyledTextCtrl_AddText, @@ -264,7 +265,7 @@ addStyledText(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=DataT,ref=DataRef}) - -spec insertText(This, Pos, Text) -> 'ok' when This::wxStyledTextCtrl(), Pos::integer(), Text::unicode:chardata(). insertText(#wx_ref{type=ThisT,ref=ThisRef},Pos,Text) - when is_integer(Pos),is_list(Text) -> + when is_integer(Pos),?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxStyledTextCtrl_InsertText, @@ -822,7 +823,7 @@ styleSetSize(#wx_ref{type=ThisT,ref=ThisRef},Style,SizePoints) -spec styleSetFaceName(This, Style, FontName) -> 'ok' when This::wxStyledTextCtrl(), Style::integer(), FontName::unicode:chardata(). styleSetFaceName(#wx_ref{type=ThisT,ref=ThisRef},Style,FontName) - when is_integer(Style),is_list(FontName) -> + when is_integer(Style),?is_chardata(FontName) -> ?CLASS(ThisT,wxStyledTextCtrl), FontName_UC = unicode:characters_to_binary([FontName,0]), wxe_util:cast(?wxStyledTextCtrl_StyleSetFaceName, @@ -981,7 +982,7 @@ setCaretPeriod(#wx_ref{type=ThisT,ref=ThisRef},PeriodMilliseconds) -spec setWordChars(This, Characters) -> 'ok' when This::wxStyledTextCtrl(), Characters::unicode:chardata(). setWordChars(#wx_ref{type=ThisT,ref=ThisRef},Characters) - when is_list(Characters) -> + when ?is_chardata(Characters) -> ?CLASS(ThisT,wxStyledTextCtrl), Characters_UC = unicode:characters_to_binary([Characters,0]), wxe_util:cast(?wxStyledTextCtrl_SetWordChars, @@ -1129,7 +1130,7 @@ setCaretLineBackground(#wx_ref{type=ThisT,ref=ThisRef},Back) -spec autoCompShow(This, LenEntered, ItemList) -> 'ok' when This::wxStyledTextCtrl(), LenEntered::integer(), ItemList::unicode:chardata(). autoCompShow(#wx_ref{type=ThisT,ref=ThisRef},LenEntered,ItemList) - when is_integer(LenEntered),is_list(ItemList) -> + when is_integer(LenEntered),?is_chardata(ItemList) -> ?CLASS(ThisT,wxStyledTextCtrl), ItemList_UC = unicode:characters_to_binary([ItemList,0]), wxe_util:cast(?wxStyledTextCtrl_AutoCompShow, @@ -1171,7 +1172,7 @@ autoCompComplete(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec autoCompStops(This, CharacterSet) -> 'ok' when This::wxStyledTextCtrl(), CharacterSet::unicode:chardata(). autoCompStops(#wx_ref{type=ThisT,ref=ThisRef},CharacterSet) - when is_list(CharacterSet) -> + when ?is_chardata(CharacterSet) -> ?CLASS(ThisT,wxStyledTextCtrl), CharacterSet_UC = unicode:characters_to_binary([CharacterSet,0]), wxe_util:cast(?wxStyledTextCtrl_AutoCompStops, @@ -1198,7 +1199,7 @@ autoCompGetSeparator(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec autoCompSelect(This, Text) -> 'ok' when This::wxStyledTextCtrl(), Text::unicode:chardata(). autoCompSelect(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxStyledTextCtrl_AutoCompSelect, @@ -1225,7 +1226,7 @@ autoCompGetCancelAtStart(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec autoCompSetFillUps(This, CharacterSet) -> 'ok' when This::wxStyledTextCtrl(), CharacterSet::unicode:chardata(). autoCompSetFillUps(#wx_ref{type=ThisT,ref=ThisRef},CharacterSet) - when is_list(CharacterSet) -> + when ?is_chardata(CharacterSet) -> ?CLASS(ThisT,wxStyledTextCtrl), CharacterSet_UC = unicode:characters_to_binary([CharacterSet,0]), wxe_util:cast(?wxStyledTextCtrl_AutoCompSetFillUps, @@ -1269,7 +1270,7 @@ autoCompGetIgnoreCase(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec userListShow(This, ListType, ItemList) -> 'ok' when This::wxStyledTextCtrl(), ListType::integer(), ItemList::unicode:chardata(). userListShow(#wx_ref{type=ThisT,ref=ThisRef},ListType,ItemList) - when is_integer(ListType),is_list(ItemList) -> + when is_integer(ListType),?is_chardata(ItemList) -> ?CLASS(ThisT,wxStyledTextCtrl), ItemList_UC = unicode:characters_to_binary([ItemList,0]), wxe_util:cast(?wxStyledTextCtrl_UserListShow, @@ -1614,7 +1615,7 @@ getPrintColourMode(#wx_ref{type=ThisT,ref=ThisRef}) -> This::wxStyledTextCtrl(), MinPos::integer(), MaxPos::integer(), Text::unicode:chardata(). findText(This,MinPos,MaxPos,Text) - when is_record(This, wx_ref),is_integer(MinPos),is_integer(MaxPos),is_list(Text) -> + when is_record(This, wx_ref),is_integer(MinPos),is_integer(MaxPos),?is_chardata(Text) -> findText(This,MinPos,MaxPos,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxstyledtextctrl.html#wxstyledtextctrlfindtext">external documentation</a>. @@ -1622,7 +1623,7 @@ findText(This,MinPos,MaxPos,Text) This::wxStyledTextCtrl(), MinPos::integer(), MaxPos::integer(), Text::unicode:chardata(), Option :: {'flags', integer()}. findText(#wx_ref{type=ThisT,ref=ThisRef},MinPos,MaxPos,Text, Options) - when is_integer(MinPos),is_integer(MaxPos),is_list(Text),is_list(Options) -> + when is_integer(MinPos),is_integer(MaxPos),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({flags, Flags}, Acc) -> [<<1:32/?UI,Flags:32/?UI>>|Acc]; @@ -1783,7 +1784,7 @@ ensureCaretVisible(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec replaceSelection(This, Text) -> 'ok' when This::wxStyledTextCtrl(), Text::unicode:chardata(). replaceSelection(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxStyledTextCtrl_ReplaceSelection, @@ -1866,7 +1867,7 @@ clear(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setText(This, Text) -> 'ok' when This::wxStyledTextCtrl(), Text::unicode:chardata(). setText(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxStyledTextCtrl_SetText, @@ -1951,7 +1952,7 @@ getTargetEnd(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec replaceTarget(This, Text) -> integer() when This::wxStyledTextCtrl(), Text::unicode:chardata(). replaceTarget(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxStyledTextCtrl_ReplaceTarget, @@ -1961,7 +1962,7 @@ replaceTarget(#wx_ref{type=ThisT,ref=ThisRef},Text) -spec searchInTarget(This, Text) -> integer() when This::wxStyledTextCtrl(), Text::unicode:chardata(). searchInTarget(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxStyledTextCtrl_SearchInTarget, @@ -1988,7 +1989,7 @@ getSearchFlags(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec callTipShow(This, Pos, Definition) -> 'ok' when This::wxStyledTextCtrl(), Pos::integer(), Definition::unicode:chardata(). callTipShow(#wx_ref{type=ThisT,ref=ThisRef},Pos,Definition) - when is_integer(Pos),is_list(Definition) -> + when is_integer(Pos),?is_chardata(Definition) -> ?CLASS(ThisT,wxStyledTextCtrl), Definition_UC = unicode:characters_to_binary([Definition,0]), wxe_util:cast(?wxStyledTextCtrl_CallTipShow, @@ -2382,7 +2383,7 @@ getScrollWidth(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec textWidth(This, Style, Text) -> integer() when This::wxStyledTextCtrl(), Style::integer(), Text::unicode:chardata(). textWidth(#wx_ref{type=ThisT,ref=ThisRef},Style,Text) - when is_integer(Style),is_list(Text) -> + when is_integer(Style),?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxStyledTextCtrl_TextWidth, @@ -2426,7 +2427,7 @@ getUseVerticalScrollBar(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec appendText(This, Text) -> 'ok' when This::wxStyledTextCtrl(), Text::unicode:chardata(). appendText(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxStyledTextCtrl_AppendText, @@ -3073,7 +3074,7 @@ searchAnchor(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec searchNext(This, Flags, Text) -> integer() when This::wxStyledTextCtrl(), Flags::integer(), Text::unicode:chardata(). searchNext(#wx_ref{type=ThisT,ref=ThisRef},Flags,Text) - when is_integer(Flags),is_list(Text) -> + when is_integer(Flags),?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxStyledTextCtrl_SearchNext, @@ -3083,7 +3084,7 @@ searchNext(#wx_ref{type=ThisT,ref=ThisRef},Flags,Text) -spec searchPrev(This, Flags, Text) -> integer() when This::wxStyledTextCtrl(), Flags::integer(), Text::unicode:chardata(). searchPrev(#wx_ref{type=ThisT,ref=ThisRef},Flags,Text) - when is_integer(Flags),is_list(Text) -> + when is_integer(Flags),?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:call(?wxStyledTextCtrl_SearchPrev, @@ -3414,7 +3415,7 @@ copyRange(#wx_ref{type=ThisT,ref=ThisRef},Start,End) -spec copyText(This, Length, Text) -> 'ok' when This::wxStyledTextCtrl(), Length::integer(), Text::unicode:chardata(). copyText(#wx_ref{type=ThisT,ref=ThisRef},Length,Text) - when is_integer(Length),is_list(Text) -> + when is_integer(Length),?is_chardata(Text) -> ?CLASS(ThisT,wxStyledTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxStyledTextCtrl_CopyText, @@ -3577,7 +3578,7 @@ wordRightEndExtend(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setWhitespaceChars(This, Characters) -> 'ok' when This::wxStyledTextCtrl(), Characters::unicode:chardata(). setWhitespaceChars(#wx_ref{type=ThisT,ref=ThisRef},Characters) - when is_list(Characters) -> + when ?is_chardata(Characters) -> ?CLASS(ThisT,wxStyledTextCtrl), Characters_UC = unicode:characters_to_binary([Characters,0]), wxe_util:cast(?wxStyledTextCtrl_SetWhitespaceChars, @@ -3730,7 +3731,7 @@ colourise(#wx_ref{type=ThisT,ref=ThisRef},Start,End) -spec setProperty(This, Key, Value) -> 'ok' when This::wxStyledTextCtrl(), Key::unicode:chardata(), Value::unicode:chardata(). setProperty(#wx_ref{type=ThisT,ref=ThisRef},Key,Value) - when is_list(Key),is_list(Value) -> + when ?is_chardata(Key),?is_chardata(Value) -> ?CLASS(ThisT,wxStyledTextCtrl), Key_UC = unicode:characters_to_binary([Key,0]), Value_UC = unicode:characters_to_binary([Value,0]), @@ -3741,7 +3742,7 @@ setProperty(#wx_ref{type=ThisT,ref=ThisRef},Key,Value) -spec setKeyWords(This, KeywordSet, KeyWords) -> 'ok' when This::wxStyledTextCtrl(), KeywordSet::integer(), KeyWords::unicode:chardata(). setKeyWords(#wx_ref{type=ThisT,ref=ThisRef},KeywordSet,KeyWords) - when is_integer(KeywordSet),is_list(KeyWords) -> + when is_integer(KeywordSet),?is_chardata(KeyWords) -> ?CLASS(ThisT,wxStyledTextCtrl), KeyWords_UC = unicode:characters_to_binary([KeyWords,0]), wxe_util:cast(?wxStyledTextCtrl_SetKeyWords, @@ -3751,7 +3752,7 @@ setKeyWords(#wx_ref{type=ThisT,ref=ThisRef},KeywordSet,KeyWords) -spec setLexerLanguage(This, Language) -> 'ok' when This::wxStyledTextCtrl(), Language::unicode:chardata(). setLexerLanguage(#wx_ref{type=ThisT,ref=ThisRef},Language) - when is_list(Language) -> + when ?is_chardata(Language) -> ?CLASS(ThisT,wxStyledTextCtrl), Language_UC = unicode:characters_to_binary([Language,0]), wxe_util:cast(?wxStyledTextCtrl_SetLexerLanguage, @@ -3761,7 +3762,7 @@ setLexerLanguage(#wx_ref{type=ThisT,ref=ThisRef},Language) -spec getProperty(This, Key) -> unicode:charlist() when This::wxStyledTextCtrl(), Key::unicode:chardata(). getProperty(#wx_ref{type=ThisT,ref=ThisRef},Key) - when is_list(Key) -> + when ?is_chardata(Key) -> ?CLASS(ThisT,wxStyledTextCtrl), Key_UC = unicode:characters_to_binary([Key,0]), wxe_util:call(?wxStyledTextCtrl_GetProperty, @@ -3787,7 +3788,7 @@ getCurrentLine(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec styleSetSpec(This, StyleNum, Spec) -> 'ok' when This::wxStyledTextCtrl(), StyleNum::integer(), Spec::unicode:chardata(). styleSetSpec(#wx_ref{type=ThisT,ref=ThisRef},StyleNum,Spec) - when is_integer(StyleNum),is_list(Spec) -> + when is_integer(StyleNum),?is_chardata(Spec) -> ?CLASS(ThisT,wxStyledTextCtrl), Spec_UC = unicode:characters_to_binary([Spec,0]), wxe_util:cast(?wxStyledTextCtrl_StyleSetSpec, @@ -3808,7 +3809,7 @@ styleSetFont(#wx_ref{type=ThisT,ref=ThisRef},StyleNum,#wx_ref{type=FontT,ref=Fon This::wxStyledTextCtrl(), StyleNum::integer(), Size::integer(), FaceName::unicode:chardata(), Bold::boolean(), Italic::boolean(), Underline::boolean(). styleSetFontAttr(This,StyleNum,Size,FaceName,Bold,Italic,Underline) - when is_record(This, wx_ref),is_integer(StyleNum),is_integer(Size),is_list(FaceName),is_boolean(Bold),is_boolean(Italic),is_boolean(Underline) -> + when is_record(This, wx_ref),is_integer(StyleNum),is_integer(Size),?is_chardata(FaceName),is_boolean(Bold),is_boolean(Italic),is_boolean(Underline) -> styleSetFontAttr(This,StyleNum,Size,FaceName,Bold,Italic,Underline, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxstyledtextctrl.html#wxstyledtextctrlstylesetfontattr">external documentation</a>. @@ -3817,7 +3818,7 @@ styleSetFontAttr(This,StyleNum,Size,FaceName,Bold,Italic,Underline) This::wxStyledTextCtrl(), StyleNum::integer(), Size::integer(), FaceName::unicode:chardata(), Bold::boolean(), Italic::boolean(), Underline::boolean(), Option :: {'encoding', wx:wx_enum()}. styleSetFontAttr(#wx_ref{type=ThisT,ref=ThisRef},StyleNum,Size,FaceName,Bold,Italic,Underline, Options) - when is_integer(StyleNum),is_integer(Size),is_list(FaceName),is_boolean(Bold),is_boolean(Italic),is_boolean(Underline),is_list(Options) -> + when is_integer(StyleNum),is_integer(Size),?is_chardata(FaceName),is_boolean(Bold),is_boolean(Italic),is_boolean(Underline),is_list(Options) -> ?CLASS(ThisT,wxStyledTextCtrl), FaceName_UC = unicode:characters_to_binary([FaceName,0]), MOpts = fun({encoding, Encoding}, Acc) -> [<<1:32/?UI,Encoding:32/?UI>>|Acc]; @@ -3937,7 +3938,7 @@ setLastKeydownProcessed(#wx_ref{type=ThisT,ref=ThisRef},Val) -spec saveFile(This, Filename) -> boolean() when This::wxStyledTextCtrl(), Filename::unicode:chardata(). saveFile(#wx_ref{type=ThisT,ref=ThisRef},Filename) - when is_list(Filename) -> + when ?is_chardata(Filename) -> ?CLASS(ThisT,wxStyledTextCtrl), Filename_UC = unicode:characters_to_binary([Filename,0]), wxe_util:call(?wxStyledTextCtrl_SaveFile, @@ -3947,7 +3948,7 @@ saveFile(#wx_ref{type=ThisT,ref=ThisRef},Filename) -spec loadFile(This, Filename) -> boolean() when This::wxStyledTextCtrl(), Filename::unicode:chardata(). loadFile(#wx_ref{type=ThisT,ref=ThisRef},Filename) - when is_list(Filename) -> + when ?is_chardata(Filename) -> ?CLASS(ThisT,wxStyledTextCtrl), Filename_UC = unicode:characters_to_binary([Filename,0]), wxe_util:call(?wxStyledTextCtrl_LoadFile, @@ -3968,7 +3969,7 @@ doDragOver(#wx_ref{type=ThisT,ref=ThisRef},X,Y,Def) -spec doDropText(This, X, Y, Data) -> boolean() when This::wxStyledTextCtrl(), X::integer(), Y::integer(), Data::unicode:chardata(). doDropText(#wx_ref{type=ThisT,ref=ThisRef},X,Y,Data) - when is_integer(X),is_integer(Y),is_list(Data) -> + when is_integer(X),is_integer(Y),?is_chardata(Data) -> ?CLASS(ThisT,wxStyledTextCtrl), Data_UC = unicode:characters_to_binary([Data,0]), wxe_util:call(?wxStyledTextCtrl_DoDropText, @@ -4078,6 +4079,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -4386,6 +4389,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxSystemOptions.erl b/lib/wx/src/gen/wxSystemOptions.erl index 28d77b1e26..c613d66c73 100644 --- a/lib/wx/src/gen/wxSystemOptions.erl +++ b/lib/wx/src/gen/wxSystemOptions.erl @@ -39,7 +39,7 @@ parent_class(_Class) -> erlang:error({badtype, ?MODULE}). -spec getOption(Name) -> unicode:charlist() when Name::unicode:chardata(). getOption(Name) - when is_list(Name) -> + when ?is_chardata(Name) -> Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxSystemOptions_GetOption, <<(byte_size(Name_UC)):32/?UI,(Name_UC)/binary, 0:(((8- ((4+byte_size(Name_UC)) band 16#7)) band 16#7))/unit:8>>). @@ -48,7 +48,7 @@ getOption(Name) -spec getOptionInt(Name) -> integer() when Name::unicode:chardata(). getOptionInt(Name) - when is_list(Name) -> + when ?is_chardata(Name) -> Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxSystemOptions_GetOptionInt, <<(byte_size(Name_UC)):32/?UI,(Name_UC)/binary, 0:(((8- ((4+byte_size(Name_UC)) band 16#7)) band 16#7))/unit:8>>). @@ -57,7 +57,7 @@ getOptionInt(Name) -spec hasOption(Name) -> boolean() when Name::unicode:chardata(). hasOption(Name) - when is_list(Name) -> + when ?is_chardata(Name) -> Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxSystemOptions_HasOption, <<(byte_size(Name_UC)):32/?UI,(Name_UC)/binary, 0:(((8- ((4+byte_size(Name_UC)) band 16#7)) band 16#7))/unit:8>>). @@ -66,7 +66,7 @@ hasOption(Name) -spec isFalse(Name) -> boolean() when Name::unicode:chardata(). isFalse(Name) - when is_list(Name) -> + when ?is_chardata(Name) -> Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxSystemOptions_IsFalse, <<(byte_size(Name_UC)):32/?UI,(Name_UC)/binary, 0:(((8- ((4+byte_size(Name_UC)) band 16#7)) band 16#7))/unit:8>>). @@ -81,12 +81,12 @@ isFalse(Name) (Name, Value) -> 'ok' when Name::unicode:chardata(), Value::unicode:chardata(). setOption(Name,Value) - when is_list(Name),is_integer(Value) -> + when ?is_chardata(Name),is_integer(Value) -> Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:cast(?wxSystemOptions_SetOption_2_0, <<(byte_size(Name_UC)):32/?UI,(Name_UC)/binary, 0:(((8- ((4+byte_size(Name_UC)) band 16#7)) band 16#7))/unit:8,Value:32/?UI>>); setOption(Name,Value) - when is_list(Name),is_list(Value) -> + when ?is_chardata(Name),?is_chardata(Value) -> Name_UC = unicode:characters_to_binary([Name,0]), Value_UC = unicode:characters_to_binary([Value,0]), wxe_util:cast(?wxSystemOptions_SetOption_2_1, diff --git a/lib/wx/src/gen/wxTextCtrl.erl b/lib/wx/src/gen/wxTextCtrl.erl index 5f03398959..3acc61ce02 100644 --- a/lib/wx/src/gen/wxTextCtrl.erl +++ b/lib/wx/src/gen/wxTextCtrl.erl @@ -46,29 +46,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -126,7 +126,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id, Options) -spec appendText(This, Text) -> 'ok' when This::wxTextCtrl(), Text::unicode:chardata(). appendText(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxTextCtrl_AppendText, @@ -238,7 +238,7 @@ discardEdits(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec changeValue(This, Value) -> 'ok' when This::wxTextCtrl(), Value::unicode:chardata(). changeValue(#wx_ref{type=ThisT,ref=ThisRef},Value) - when is_list(Value) -> + when ?is_chardata(Value) -> ?CLASS(ThisT,wxTextCtrl), Value_UC = unicode:characters_to_binary([Value,0]), wxe_util:cast(?wxTextCtrl_ChangeValue, @@ -383,7 +383,7 @@ isSingleLine(#wx_ref{type=ThisT,ref=ThisRef}) -> This::wxTextCtrl(), File::unicode:chardata(). loadFile(This,File) - when is_record(This, wx_ref),is_list(File) -> + when is_record(This, wx_ref),?is_chardata(File) -> loadFile(This,File, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextctrl.html#wxtextctrlloadfile">external documentation</a>. @@ -391,7 +391,7 @@ loadFile(This,File) This::wxTextCtrl(), File::unicode:chardata(), Option :: {'fileType', integer()}. loadFile(#wx_ref{type=ThisT,ref=ThisRef},File, Options) - when is_list(File),is_list(Options) -> + when ?is_chardata(File),is_list(Options) -> ?CLASS(ThisT,wxTextCtrl), File_UC = unicode:characters_to_binary([File,0]), MOpts = fun({fileType, FileType}, Acc) -> [<<1:32/?UI,FileType:32/?UI>>|Acc]; @@ -447,7 +447,7 @@ remove(#wx_ref{type=ThisT,ref=ThisRef},From,To) -spec replace(This, From, To, Value) -> 'ok' when This::wxTextCtrl(), From::integer(), To::integer(), Value::unicode:chardata(). replace(#wx_ref{type=ThisT,ref=ThisRef},From,To,Value) - when is_integer(From),is_integer(To),is_list(Value) -> + when is_integer(From),is_integer(To),?is_chardata(Value) -> ?CLASS(ThisT,wxTextCtrl), Value_UC = unicode:characters_to_binary([Value,0]), wxe_util:cast(?wxTextCtrl_Replace, @@ -543,7 +543,7 @@ setStyle(#wx_ref{type=ThisT,ref=ThisRef},Start,End,#wx_ref{type=StyleT,ref=Style -spec setValue(This, Value) -> 'ok' when This::wxTextCtrl(), Value::unicode:chardata(). setValue(#wx_ref{type=ThisT,ref=ThisRef},Value) - when is_list(Value) -> + when ?is_chardata(Value) -> ?CLASS(ThisT,wxTextCtrl), Value_UC = unicode:characters_to_binary([Value,0]), wxe_util:cast(?wxTextCtrl_SetValue, @@ -570,7 +570,7 @@ undo(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec writeText(This, Text) -> 'ok' when This::wxTextCtrl(), Text::unicode:chardata(). writeText(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxTextCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxTextCtrl_WriteText, @@ -598,6 +598,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -914,6 +916,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxTextDataObject.erl b/lib/wx/src/gen/wxTextDataObject.erl index eb3e1f4bff..5c8a44a879 100644 --- a/lib/wx/src/gen/wxTextDataObject.erl +++ b/lib/wx/src/gen/wxTextDataObject.erl @@ -76,7 +76,7 @@ getText(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setText(This, Text) -> 'ok' when This::wxTextDataObject(), Text::unicode:chardata(). setText(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxTextDataObject), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxTextDataObject_SetText, diff --git a/lib/wx/src/gen/wxTextEntryDialog.erl b/lib/wx/src/gen/wxTextEntryDialog.erl index eaf6dc3926..c43a2d12b8 100644 --- a/lib/wx/src/gen/wxTextEntryDialog.erl +++ b/lib/wx/src/gen/wxTextEntryDialog.erl @@ -40,40 +40,40 @@ centreOnScreen/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, createButtonSizer/2,createStdDialogButtonSizer/2,destroyChildren/1, - disable/1,disconnect/1,disconnect/2,disconnect/3,enable/1,enable/2, - endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1,getLabel/1,getMaxSize/1, - getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getReturnCode/1, - getScreenPosition/1,getScreenRect/1,getScrollPos/2,getScrollRange/2, - getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3, - getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,iconize/1,iconize/2,inheritAttributes/1,initDialog/1,invalidateBestSize/1, - isActive/1,isDoubleBuffered/1,isEnabled/1,isExposed/2,isExposed/3, - isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1,isModal/1,isRetained/1, - isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1, - makeModal/2,maximize/1,maximize/2,move/2,move/3,move/4,moveAfterInTabOrder/2, - moveBeforeInTabOrder/2,navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1, - popEventHandler/1,popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4, - raise/1,refresh/1,refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1, - removeChild/2,reparent/2,requestUserAttention/1,requestUserAttention/2, - screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3, - scrollWindow/4,setAcceleratorTable/2,setAffirmativeId/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2,setId/2,setLabel/2, - setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2, - setOwnForegroundColour/2,setPalette/2,setReturnCode/2,setScrollPos/3, - setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2,setSize/2, - setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3,setSizeHints/4, - setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3,setThemeEnabled/2, - setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2,setVirtualSize/3, - setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, + disable/1,disconnect/1,disconnect/2,disconnect/3,dragAcceptFiles/2, + enable/1,enable/2,endModal/2,findWindow/2,fit/1,fitInside/1,freeze/1, + getAcceleratorTable/1,getAffirmativeId/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getIcon/1,getIcons/1,getId/1, + getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1,getPosition/1, + getRect/1,getReturnCode/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getTitle/1,getToolTip/1,getUpdateRegion/1,getVirtualSize/1, + getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2, + hasTransparentBackground/1,hide/1,iconize/1,iconize/2,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isActive/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isFullScreen/1,isIconized/1,isMaximized/1, + isModal/1,isRetained/1,isShown/1,isTopLevel/1,layout/1,lineDown/1,lineUp/1, + lower/1,makeModal/1,makeModal/2,maximize/1,maximize/2,move/2,move/3, + move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1,navigate/2, + pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,requestUserAttention/1, + requestUserAttention/2,screenToClient/1,screenToClient/2,scrollLines/2, + scrollPages/2,scrollWindow/3,scrollWindow/4,setAcceleratorTable/2, + setAffirmativeId/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setIcon/2,setIcons/2, + setId/2,setLabel/2,setMaxSize/2,setMinSize/2,setName/2,setOwnBackgroundColour/2, + setOwnFont/2,setOwnForegroundColour/2,setPalette/2,setReturnCode/2, + setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6,setShape/2, + setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, + setSizeHints/4,setSizer/2,setSizer/3,setSizerAndFit/2,setSizerAndFit/3, + setThemeEnabled/2,setTitle/2,setToolTip/2,setTransparent/2,setVirtualSize/2, + setVirtualSize/3,setVirtualSizeHints/2,setVirtualSizeHints/3,setVirtualSizeHints/4, setWindowStyle/2,setWindowStyleFlag/2,setWindowVariant/2,shouldInheritColours/1, show/1,show/2,showFullScreen/2,showFullScreen/3,showModal/1,thaw/1, transferDataFromWindow/1,transferDataToWindow/1,update/1,updateWindowUI/1, @@ -93,7 +93,7 @@ parent_class(_Class) -> erlang:error({badtype, ?MODULE}). Parent::wxWindow:wxWindow(), Message::unicode:chardata(). new(Parent,Message) - when is_record(Parent, wx_ref),is_list(Message) -> + when is_record(Parent, wx_ref),?is_chardata(Message) -> new(Parent,Message, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextentrydialog.html#wxtextentrydialogwxtextentrydialog">external documentation</a>. @@ -104,7 +104,7 @@ new(Parent,Message) | {'style', integer()} | {'pos', {X::integer(), Y::integer()}}. new(#wx_ref{type=ParentT,ref=ParentRef},Message, Options) - when is_list(Message),is_list(Options) -> + when ?is_chardata(Message),is_list(Options) -> ?CLASS(ParentT,wxWindow), Message_UC = unicode:characters_to_binary([Message,0]), MOpts = fun({caption, Caption}, Acc) -> Caption_UC = unicode:characters_to_binary([Caption,0]),[<<1:32/?UI,(byte_size(Caption_UC)):32/?UI,(Caption_UC)/binary, 0:(((8- ((0+byte_size(Caption_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -128,7 +128,7 @@ getValue(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setValue(This, Val) -> 'ok' when This::wxTextEntryDialog(), Val::unicode:chardata(). setValue(#wx_ref{type=ThisT,ref=ThisRef},Val) - when is_list(Val) -> + when ?is_chardata(Val) -> ?CLASS(ThisT,wxTextEntryDialog), Val_UC = unicode:characters_to_binary([Val,0]), wxe_util:cast(?wxTextEntryDialog_SetValue, @@ -212,6 +212,8 @@ getIcons(This) -> wxTopLevelWindow:getIcons(This). getIcon(This) -> wxTopLevelWindow:getIcon(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -528,6 +530,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxToggleButton.erl b/lib/wx/src/gen/wxToggleButton.erl index 9e8dab1c32..b82ff4fe68 100644 --- a/lib/wx/src/gen/wxToggleButton.erl +++ b/lib/wx/src/gen/wxToggleButton.erl @@ -38,29 +38,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -90,7 +90,7 @@ new() -> Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). new(Parent,Id,Label) - when is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> new(Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtogglebutton.html#wxtogglebuttonwxtogglebutton">external documentation</a>. @@ -101,7 +101,7 @@ new(Parent,Id,Label) | {'style', integer()} | {'validator', wx:wx_object()}. new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), MOpts = fun({pos, {PosX,PosY}}, Acc) -> [<<1:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; @@ -118,7 +118,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) This::wxToggleButton(), Parent::wxWindow:wxWindow(), Id::integer(), Label::unicode:chardata(). create(This,Parent,Id,Label) - when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),is_list(Label) -> + when is_record(This, wx_ref),is_record(Parent, wx_ref),is_integer(Id),?is_chardata(Label) -> create(This,Parent,Id,Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtogglebutton.html#wxtogglebuttoncreate">external documentation</a>. @@ -129,7 +129,7 @@ create(This,Parent,Id,Label) | {'style', integer()} | {'validator', wx:wx_object()}. create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Id,Label, Options) - when is_integer(Id),is_list(Label),is_list(Options) -> + when is_integer(Id),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxToggleButton), ?CLASS(ParentT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), @@ -172,6 +172,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -488,6 +490,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxToolBar.erl b/lib/wx/src/gen/wxToolBar.erl index 9be37f943c..e2835bf7c4 100644 --- a/lib/wx/src/gen/wxToolBar.erl +++ b/lib/wx/src/gen/wxToolBar.erl @@ -47,29 +47,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -142,7 +142,7 @@ addTool(This,Toolid,Bitmap) | {'longHelpString', unicode:chardata()}. addTool(This,Toolid,Label,Bitmap) - when is_record(This, wx_ref),is_integer(Toolid),is_list(Label),is_record(Bitmap, wx_ref) -> + when is_record(This, wx_ref),is_integer(Toolid),?is_chardata(Label),is_record(Bitmap, wx_ref) -> addTool(This,Toolid,Label,Bitmap, []); addTool(This,Toolid,Bitmap,BmpDisabled) @@ -187,10 +187,10 @@ addTool(#wx_ref{type=ThisT,ref=ThisRef},Toolid,#wx_ref{type=BitmapT,ref=BitmapRe | {'longHelpString', unicode:chardata()}. addTool(This,Toolid,Label,Bitmap,BmpDisabled) - when is_record(This, wx_ref),is_integer(Toolid),is_list(Label),is_record(Bitmap, wx_ref),is_record(BmpDisabled, wx_ref) -> + when is_record(This, wx_ref),is_integer(Toolid),?is_chardata(Label),is_record(Bitmap, wx_ref),is_record(BmpDisabled, wx_ref) -> addTool(This,Toolid,Label,Bitmap,BmpDisabled, []); addTool(#wx_ref{type=ThisT,ref=ThisRef},Toolid,Label,#wx_ref{type=BitmapT,ref=BitmapRef}, Options) - when is_integer(Toolid),is_list(Label),is_list(Options) -> + when is_integer(Toolid),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxToolBar), Label_UC = unicode:characters_to_binary([Label,0]), ?CLASS(BitmapT,wxBitmap), @@ -237,7 +237,7 @@ addTool(This,Toolid,Bitmap,BmpDisabled,Toggle,XPos) when is_record(This, wx_ref),is_integer(Toolid),is_record(Bitmap, wx_ref),is_record(BmpDisabled, wx_ref),is_boolean(Toggle),is_integer(XPos) -> addTool(This,Toolid,Bitmap,BmpDisabled,Toggle,XPos, []); addTool(#wx_ref{type=ThisT,ref=ThisRef},Toolid,Label,#wx_ref{type=BitmapT,ref=BitmapRef},#wx_ref{type=BmpDisabledT,ref=BmpDisabledRef}, Options) - when is_integer(Toolid),is_list(Label),is_list(Options) -> + when is_integer(Toolid),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxToolBar), Label_UC = unicode:characters_to_binary([Label,0]), ?CLASS(BitmapT,wxBitmap), @@ -277,7 +277,7 @@ addTool(#wx_ref{type=ThisT,ref=ThisRef},Toolid,#wx_ref{type=BitmapT,ref=BitmapRe This::wxToolBar(), Toolid::integer(), Label::unicode:chardata(), Bitmap::wxBitmap:wxBitmap(). addCheckTool(This,Toolid,Label,Bitmap) - when is_record(This, wx_ref),is_integer(Toolid),is_list(Label),is_record(Bitmap, wx_ref) -> + when is_record(This, wx_ref),is_integer(Toolid),?is_chardata(Label),is_record(Bitmap, wx_ref) -> addCheckTool(This,Toolid,Label,Bitmap, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtoolbar.html#wxtoolbaraddchecktool">external documentation</a>. @@ -288,7 +288,7 @@ addCheckTool(This,Toolid,Label,Bitmap) | {'longHelp', unicode:chardata()} | {'data', wx:wx_object()}. addCheckTool(#wx_ref{type=ThisT,ref=ThisRef},Toolid,Label,#wx_ref{type=BitmapT,ref=BitmapRef}, Options) - when is_integer(Toolid),is_list(Label),is_list(Options) -> + when is_integer(Toolid),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxToolBar), Label_UC = unicode:characters_to_binary([Label,0]), ?CLASS(BitmapT,wxBitmap), @@ -306,7 +306,7 @@ addCheckTool(#wx_ref{type=ThisT,ref=ThisRef},Toolid,Label,#wx_ref{type=BitmapT,r This::wxToolBar(), Toolid::integer(), Label::unicode:chardata(), Bitmap::wxBitmap:wxBitmap(). addRadioTool(This,Toolid,Label,Bitmap) - when is_record(This, wx_ref),is_integer(Toolid),is_list(Label),is_record(Bitmap, wx_ref) -> + when is_record(This, wx_ref),is_integer(Toolid),?is_chardata(Label),is_record(Bitmap, wx_ref) -> addRadioTool(This,Toolid,Label,Bitmap, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtoolbar.html#wxtoolbaraddradiotool">external documentation</a>. @@ -317,7 +317,7 @@ addRadioTool(This,Toolid,Label,Bitmap) | {'longHelp', unicode:chardata()} | {'data', wx:wx_object()}. addRadioTool(#wx_ref{type=ThisT,ref=ThisRef},Toolid,Label,#wx_ref{type=BitmapT,ref=BitmapRef}, Options) - when is_integer(Toolid),is_list(Label),is_list(Options) -> + when is_integer(Toolid),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxToolBar), Label_UC = unicode:characters_to_binary([Label,0]), ?CLASS(BitmapT,wxBitmap), @@ -545,7 +545,7 @@ insertTool(This,Pos,Toolid,Bitmap) | {'longHelp', unicode:chardata()}. insertTool(This,Pos,Toolid,Label,Bitmap) - when is_record(This, wx_ref),is_integer(Pos),is_integer(Toolid),is_list(Label),is_record(Bitmap, wx_ref) -> + when is_record(This, wx_ref),is_integer(Pos),is_integer(Toolid),?is_chardata(Label),is_record(Bitmap, wx_ref) -> insertTool(This,Pos,Toolid,Label,Bitmap, []); insertTool(#wx_ref{type=ThisT,ref=ThisRef},Pos,Toolid,#wx_ref{type=BitmapT,ref=BitmapRef}, Options) when is_integer(Pos),is_integer(Toolid),is_list(Options) -> @@ -571,7 +571,7 @@ insertTool(#wx_ref{type=ThisT,ref=ThisRef},Pos,Toolid,#wx_ref{type=BitmapT,ref=B | {'longHelp', unicode:chardata()} | {'clientData', wx:wx_object()}. insertTool(#wx_ref{type=ThisT,ref=ThisRef},Pos,Toolid,Label,#wx_ref{type=BitmapT,ref=BitmapRef}, Options) - when is_integer(Pos),is_integer(Toolid),is_list(Label),is_list(Options) -> + when is_integer(Pos),is_integer(Toolid),?is_chardata(Label),is_list(Options) -> ?CLASS(ThisT,wxToolBar), Label_UC = unicode:characters_to_binary([Label,0]), ?CLASS(BitmapT,wxBitmap), @@ -624,7 +624,7 @@ setToolBitmapSize(#wx_ref{type=ThisT,ref=ThisRef},{SizeW,SizeH}) -spec setToolLongHelp(This, Toolid, HelpString) -> 'ok' when This::wxToolBar(), Toolid::integer(), HelpString::unicode:chardata(). setToolLongHelp(#wx_ref{type=ThisT,ref=ThisRef},Toolid,HelpString) - when is_integer(Toolid),is_list(HelpString) -> + when is_integer(Toolid),?is_chardata(HelpString) -> ?CLASS(ThisT,wxToolBar), HelpString_UC = unicode:characters_to_binary([HelpString,0]), wxe_util:cast(?wxToolBar_SetToolLongHelp, @@ -643,7 +643,7 @@ setToolPacking(#wx_ref{type=ThisT,ref=ThisRef},Packing) -spec setToolShortHelp(This, Id, HelpString) -> 'ok' when This::wxToolBar(), Id::integer(), HelpString::unicode:chardata(). setToolShortHelp(#wx_ref{type=ThisT,ref=ThisRef},Id,HelpString) - when is_integer(Id),is_list(HelpString) -> + when is_integer(Id),?is_chardata(HelpString) -> ?CLASS(ThisT,wxToolBar), HelpString_UC = unicode:characters_to_binary([HelpString,0]), wxe_util:cast(?wxToolBar_SetToolShortHelp, @@ -674,6 +674,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -990,6 +992,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxToolTip.erl b/lib/wx/src/gen/wxToolTip.erl index 163e764d8c..0596173ebe 100644 --- a/lib/wx/src/gen/wxToolTip.erl +++ b/lib/wx/src/gen/wxToolTip.erl @@ -55,7 +55,7 @@ setDelay(Msecs) -spec new(Tip) -> wxToolTip() when Tip::unicode:chardata(). new(Tip) - when is_list(Tip) -> + when ?is_chardata(Tip) -> Tip_UC = unicode:characters_to_binary([Tip,0]), wxe_util:construct(?wxToolTip_new, <<(byte_size(Tip_UC)):32/?UI,(Tip_UC)/binary, 0:(((8- ((4+byte_size(Tip_UC)) band 16#7)) band 16#7))/unit:8>>). @@ -64,7 +64,7 @@ new(Tip) -spec setTip(This, Tip) -> 'ok' when This::wxToolTip(), Tip::unicode:chardata(). setTip(#wx_ref{type=ThisT,ref=ThisRef},Tip) - when is_list(Tip) -> + when ?is_chardata(Tip) -> ?CLASS(ThisT,wxToolTip), Tip_UC = unicode:characters_to_binary([Tip,0]), wxe_util:cast(?wxToolTip_SetTip, diff --git a/lib/wx/src/gen/wxToolbook.erl b/lib/wx/src/gen/wxToolbook.erl index 92dcbc726b..c22719680c 100644 --- a/lib/wx/src/gen/wxToolbook.erl +++ b/lib/wx/src/gen/wxToolbook.erl @@ -43,29 +43,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -120,7 +120,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id, Options) This::wxToolbook(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). addPage(This,Page,Text) - when is_record(This, wx_ref),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_record(Page, wx_ref),?is_chardata(Text) -> addPage(This,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtoolbook.html#wxtoolbookaddpage">external documentation</a>. @@ -129,7 +129,7 @@ addPage(This,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. addPage(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_list(Text),is_list(Options) -> + when ?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxToolbook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -296,7 +296,7 @@ hitTest(#wx_ref{type=ThisT,ref=ThisRef},{PtX,PtY}) This::wxToolbook(), N::integer(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). insertPage(This,N,Page,Text) - when is_record(This, wx_ref),is_integer(N),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_integer(N),is_record(Page, wx_ref),?is_chardata(Text) -> insertPage(This,N,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtoolbook.html#wxtoolbookinsertpage">external documentation</a>. @@ -305,7 +305,7 @@ insertPage(This,N,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. insertPage(#wx_ref{type=ThisT,ref=ThisRef},N,#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_integer(N),is_list(Text),is_list(Options) -> + when is_integer(N),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxToolbook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -347,7 +347,7 @@ setPageImage(#wx_ref{type=ThisT,ref=ThisRef},N,ImageId) -spec setPageText(This, N, StrText) -> boolean() when This::wxToolbook(), N::integer(), StrText::unicode:chardata(). setPageText(#wx_ref{type=ThisT,ref=ThisRef},N,StrText) - when is_integer(N),is_list(StrText) -> + when is_integer(N),?is_chardata(StrText) -> ?CLASS(ThisT,wxToolbook), StrText_UC = unicode:characters_to_binary([StrText,0]), wxe_util:call(?wxToolbook_SetPageText, @@ -384,6 +384,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -700,6 +702,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxTopLevelWindow.erl b/lib/wx/src/gen/wxTopLevelWindow.erl index 6ba81691c7..64713099f6 100644 --- a/lib/wx/src/gen/wxTopLevelWindow.erl +++ b/lib/wx/src/gen/wxTopLevelWindow.erl @@ -41,29 +41,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -273,7 +273,7 @@ setShape(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=RegionT,ref=RegionRef}) -> -spec setTitle(This, Title) -> 'ok' when This::wxTopLevelWindow(), Title::unicode:chardata(). setTitle(#wx_ref{type=ThisT,ref=ThisRef},Title) - when is_list(Title) -> + when ?is_chardata(Title) -> ?CLASS(ThisT,wxTopLevelWindow), Title_UC = unicode:characters_to_binary([Title,0]), wxe_util:cast(?wxTopLevelWindow_SetTitle, @@ -302,6 +302,8 @@ showFullScreen(#wx_ref{type=ThisT,ref=ThisRef},Show, Options) %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -622,6 +624,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxTreeCtrl.erl b/lib/wx/src/gen/wxTreeCtrl.erl index 97b43309ad..373cb4c77f 100644 --- a/lib/wx/src/gen/wxTreeCtrl.erl +++ b/lib/wx/src/gen/wxTreeCtrl.erl @@ -59,29 +59,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -140,7 +140,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef}, Options) This::wxTreeCtrl(), Text::unicode:chardata(). addRoot(This,Text) - when is_record(This, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),?is_chardata(Text) -> addRoot(This,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtreectrl.html#wxtreectrladdroot">external documentation</a>. @@ -150,7 +150,7 @@ addRoot(This,Text) | {'selectedImage', integer()} | {'data', term()}. addRoot(#wx_ref{type=ThisT,ref=ThisRef},Text, Options) - when is_list(Text),is_list(Options) -> + when ?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxTreeCtrl), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({image, Image}, Acc) -> [<<1:32/?UI,Image:32/?UI>>|Acc]; @@ -166,7 +166,7 @@ addRoot(#wx_ref{type=ThisT,ref=ThisRef},Text, Options) This::wxTreeCtrl(), Parent::integer(), Text::unicode:chardata(). appendItem(This,Parent,Text) - when is_record(This, wx_ref),is_integer(Parent),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Parent),?is_chardata(Text) -> appendItem(This,Parent,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtreectrl.html#wxtreectrlappenditem">external documentation</a>. @@ -176,7 +176,7 @@ appendItem(This,Parent,Text) | {'selectedImage', integer()} | {'data', term()}. appendItem(#wx_ref{type=ThisT,ref=ThisRef},Parent,Text, Options) - when is_integer(Parent),is_list(Text),is_list(Options) -> + when is_integer(Parent),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxTreeCtrl), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({image, Image}, Acc) -> [<<1:32/?UI,Image:32/?UI>>|Acc]; @@ -580,7 +580,7 @@ hitTest(#wx_ref{type=ThisT,ref=ThisRef},{PointX,PointY}) This::wxTreeCtrl(), Parent::integer(), Pos::integer(), Text::unicode:chardata(). insertItem(This,Parent,Pos,Text) - when is_record(This, wx_ref),is_integer(Parent),is_integer(Pos),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Parent),is_integer(Pos),?is_chardata(Text) -> insertItem(This,Parent,Pos,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtreectrl.html#wxtreectrlinsertitem">external documentation</a>. @@ -590,7 +590,7 @@ insertItem(This,Parent,Pos,Text) | {'selImage', integer()} | {'data', term()}. insertItem(#wx_ref{type=ThisT,ref=ThisRef},Parent,Pos,Text, Options) - when is_integer(Parent),is_integer(Pos),is_list(Text),is_list(Options) -> + when is_integer(Parent),is_integer(Pos),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxTreeCtrl), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({image, Image}, Acc) -> [<<1:32/?UI,Image:32/?UI>>|Acc]; @@ -659,7 +659,7 @@ isTreeItemIdOk(Id) This::wxTreeCtrl(), Parent::integer(), Text::unicode:chardata(). prependItem(This,Parent,Text) - when is_record(This, wx_ref),is_integer(Parent),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Parent),?is_chardata(Text) -> prependItem(This,Parent,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtreectrl.html#wxtreectrlprependitem">external documentation</a>. @@ -669,7 +669,7 @@ prependItem(This,Parent,Text) | {'selectedImage', integer()} | {'data', term()}. prependItem(#wx_ref{type=ThisT,ref=ThisRef},Parent,Text, Options) - when is_integer(Parent),is_list(Text),is_list(Options) -> + when is_integer(Parent),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxTreeCtrl), Text_UC = unicode:characters_to_binary([Text,0]), MOpts = fun({image, Image}, Acc) -> [<<1:32/?UI,Image:32/?UI>>|Acc]; @@ -848,7 +848,7 @@ setItemImage(#wx_ref{type=ThisT,ref=ThisRef},Item,Image, Options) -spec setItemText(This, Item, Text) -> 'ok' when This::wxTreeCtrl(), Item::integer(), Text::unicode:chardata(). setItemText(#wx_ref{type=ThisT,ref=ThisRef},Item,Text) - when is_integer(Item),is_list(Text) -> + when is_integer(Item),?is_chardata(Text) -> ?CLASS(ThisT,wxTreeCtrl), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxTreeCtrl_SetItemText, @@ -946,6 +946,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -1260,6 +1262,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxTreeEvent.erl b/lib/wx/src/gen/wxTreeEvent.erl index 41e86fe41f..368f32a386 100644 --- a/lib/wx/src/gen/wxTreeEvent.erl +++ b/lib/wx/src/gen/wxTreeEvent.erl @@ -111,7 +111,7 @@ isEditCancelled(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec setToolTip(This, ToolTip) -> 'ok' when This::wxTreeEvent(), ToolTip::unicode:chardata(). setToolTip(#wx_ref{type=ThisT,ref=ThisRef},ToolTip) - when is_list(ToolTip) -> + when ?is_chardata(ToolTip) -> ?CLASS(ThisT,wxTreeEvent), ToolTip_UC = unicode:characters_to_binary([ToolTip,0]), wxe_util:cast(?wxTreeEvent_SetToolTip, diff --git a/lib/wx/src/gen/wxTreebook.erl b/lib/wx/src/gen/wxTreebook.erl index 5d3c177f7e..dc95730224 100644 --- a/lib/wx/src/gen/wxTreebook.erl +++ b/lib/wx/src/gen/wxTreebook.erl @@ -44,29 +44,29 @@ centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,connect/2,connect/3,convertDialogToPixels/2,convertPixelsToDialog/2, destroyChildren/1,disable/1,disconnect/1,disconnect/2,disconnect/3, - enable/1,enable/2,findWindow/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCaret/1, - getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1,getContainingSizer/1, - getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, - getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, - getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, - getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, - getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, - getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, - getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, - hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, - isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, - isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, - move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, - navigate/1,navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1, - popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, - refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, - reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, - scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, - setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, - setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, - setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, - setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + dragAcceptFiles/2,enable/1,enable/2,findWindow/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1, + getClientSize/1,getContainingSizer/1,getContentScaleFactor/1,getCursor/1, + getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/1, + getGrandParent/1,getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1, + getMinSize/1,getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, + getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, + getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, + getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, + hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, + initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, + isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, + layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, + move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, + navigate/2,pageDown/1,pageUp/1,parent_class/1,popEventHandler/1,popEventHandler/2, + popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, + refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, + screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, + setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, + setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, + setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, + setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -121,7 +121,7 @@ new(#wx_ref{type=ParentT,ref=ParentRef},Id, Options) This::wxTreebook(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). addPage(This,Page,Text) - when is_record(This, wx_ref),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_record(Page, wx_ref),?is_chardata(Text) -> addPage(This,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtreebook.html#wxtreebookaddpage">external documentation</a>. @@ -130,7 +130,7 @@ addPage(This,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. addPage(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_list(Text),is_list(Options) -> + when ?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxTreebook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -327,7 +327,7 @@ hitTest(#wx_ref{type=ThisT,ref=ThisRef},{PtX,PtY}) This::wxTreebook(), Pos::integer(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). insertPage(This,Pos,Page,Text) - when is_record(This, wx_ref),is_integer(Pos),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Pos),is_record(Page, wx_ref),?is_chardata(Text) -> insertPage(This,Pos,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtreebook.html#wxtreebookinsertpage">external documentation</a>. @@ -336,7 +336,7 @@ insertPage(This,Pos,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. insertPage(#wx_ref{type=ThisT,ref=ThisRef},Pos,#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_integer(Pos),is_list(Text),is_list(Options) -> + when is_integer(Pos),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxTreebook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -352,7 +352,7 @@ insertPage(#wx_ref{type=ThisT,ref=ThisRef},Pos,#wx_ref{type=PageT,ref=PageRef},T This::wxTreebook(), Pos::integer(), Page::wxWindow:wxWindow(), Text::unicode:chardata(). insertSubPage(This,Pos,Page,Text) - when is_record(This, wx_ref),is_integer(Pos),is_record(Page, wx_ref),is_list(Text) -> + when is_record(This, wx_ref),is_integer(Pos),is_record(Page, wx_ref),?is_chardata(Text) -> insertSubPage(This,Pos,Page,Text, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtreebook.html#wxtreebookinsertsubpage">external documentation</a>. @@ -361,7 +361,7 @@ insertSubPage(This,Pos,Page,Text) Option :: {'bSelect', boolean()} | {'imageId', integer()}. insertSubPage(#wx_ref{type=ThisT,ref=ThisRef},Pos,#wx_ref{type=PageT,ref=PageRef},Text, Options) - when is_integer(Pos),is_list(Text),is_list(Options) -> + when is_integer(Pos),?is_chardata(Text),is_list(Options) -> ?CLASS(ThisT,wxTreebook), ?CLASS(PageT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), @@ -403,7 +403,7 @@ setPageImage(#wx_ref{type=ThisT,ref=ThisRef},N,ImageId) -spec setPageText(This, N, StrText) -> boolean() when This::wxTreebook(), N::integer(), StrText::unicode:chardata(). setPageText(#wx_ref{type=ThisT,ref=ThisRef},N,StrText) - when is_integer(N),is_list(StrText) -> + when is_integer(N),?is_chardata(StrText) -> ?CLASS(ThisT,wxTreebook), StrText_UC = unicode:characters_to_binary([StrText,0]), wxe_util:call(?wxTreebook_SetPageText, @@ -440,6 +440,8 @@ setLabel(This,Label) -> wxControl:setLabel(This,Label). getLabel(This) -> wxControl:getLabel(This). %% From wxWindow %% @hidden +getContentScaleFactor(This) -> wxWindow:getContentScaleFactor(This). +%% @hidden setDoubleBuffered(This,On) -> wxWindow:setDoubleBuffered(This,On). %% @hidden isDoubleBuffered(This) -> wxWindow:isDoubleBuffered(This). @@ -756,6 +758,8 @@ enable(This, Options) -> wxWindow:enable(This, Options). %% @hidden enable(This) -> wxWindow:enable(This). %% @hidden +dragAcceptFiles(This,Accept) -> wxWindow:dragAcceptFiles(This,Accept). +%% @hidden disable(This) -> wxWindow:disable(This). %% @hidden destroyChildren(This) -> wxWindow:destroyChildren(This). diff --git a/lib/wx/src/gen/wxUpdateUIEvent.erl b/lib/wx/src/gen/wxUpdateUIEvent.erl index fec42ed8eb..e7bda40a7a 100644 --- a/lib/wx/src/gen/wxUpdateUIEvent.erl +++ b/lib/wx/src/gen/wxUpdateUIEvent.erl @@ -181,7 +181,7 @@ setMode(Mode) -spec setText(This, Text) -> 'ok' when This::wxUpdateUIEvent(), Text::unicode:chardata(). setText(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxUpdateUIEvent), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxUpdateUIEvent_SetText, diff --git a/lib/wx/src/gen/wxWindow.erl b/lib/wx/src/gen/wxWindow.erl index 4ac7cc5d75..9ace4533c8 100644 --- a/lib/wx/src/gen/wxWindow.erl +++ b/lib/wx/src/gen/wxWindow.erl @@ -32,31 +32,32 @@ center/2,centerOnParent/1,centerOnParent/2,centre/1,centre/2,centreOnParent/1, centreOnParent/2,clearBackground/1,clientToScreen/2,clientToScreen/3, close/1,close/2,convertDialogToPixels/2,convertPixelsToDialog/2,destroy/1, - destroyChildren/1,disable/1,enable/1,enable/2,findFocus/0,findWindow/2, - findWindowById/1,findWindowById/2,findWindowByLabel/1,findWindowByLabel/2, - findWindowByName/1,findWindowByName/2,fit/1,fitInside/1,freeze/1,getAcceleratorTable/1, - getBackgroundColour/1,getBackgroundStyle/1,getBestSize/1,getCapture/0, - getCaret/1,getCharHeight/1,getCharWidth/1,getChildren/1,getClientSize/1, - getContainingSizer/1,getCursor/1,getDropTarget/1,getEventHandler/1, - getExtraStyle/1,getFont/1,getForegroundColour/1,getGrandParent/1, - getHandle/1,getHelpText/1,getId/1,getLabel/1,getMaxSize/1,getMinSize/1, - getName/1,getParent/1,getPosition/1,getRect/1,getScreenPosition/1, - getScreenRect/1,getScrollPos/2,getScrollRange/2,getScrollThumb/2, - getSize/1,getSizer/1,getTextExtent/2,getTextExtent/3,getToolTip/1, - getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1,getWindowVariant/1, - hasCapture/1,hasScrollbar/2,hasTransparentBackground/1,hide/1,inheritAttributes/1, - initDialog/1,invalidateBestSize/1,isDoubleBuffered/1,isEnabled/1, - isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1,isTopLevel/1, - layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2,move/2, - move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2,navigate/1, - navigate/2,new/0,new/2,new/3,pageDown/1,pageUp/1,popEventHandler/1,popEventHandler/2, - popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1,refresh/2,refreshRect/2, - refreshRect/3,releaseMouse/1,removeChild/2,reparent/2,screenToClient/1, - screenToClient/2,scrollLines/2,scrollPages/2,scrollWindow/3,scrollWindow/4, - setAcceleratorTable/2,setAutoLayout/2,setBackgroundColour/2,setBackgroundStyle/2, - setCaret/2,setClientSize/2,setClientSize/3,setContainingSizer/2,setCursor/2, - setDoubleBuffered/2,setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1, - setFont/2,setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, + destroyChildren/1,disable/1,dragAcceptFiles/2,enable/1,enable/2,findFocus/0, + findWindow/2,findWindowById/1,findWindowById/2,findWindowByLabel/1, + findWindowByLabel/2,findWindowByName/1,findWindowByName/2,fit/1,fitInside/1, + freeze/1,getAcceleratorTable/1,getBackgroundColour/1,getBackgroundStyle/1, + getBestSize/1,getCapture/0,getCaret/1,getCharHeight/1,getCharWidth/1, + getChildren/1,getClientSize/1,getContainingSizer/1,getContentScaleFactor/1, + getCursor/1,getDropTarget/1,getEventHandler/1,getExtraStyle/1,getFont/1, + getForegroundColour/1,getGrandParent/1,getHandle/1,getHelpText/1, + getId/1,getLabel/1,getMaxSize/1,getMinSize/1,getName/1,getParent/1, + getPosition/1,getRect/1,getScreenPosition/1,getScreenRect/1,getScrollPos/2, + getScrollRange/2,getScrollThumb/2,getSize/1,getSizer/1,getTextExtent/2, + getTextExtent/3,getToolTip/1,getUpdateRegion/1,getVirtualSize/1,getWindowStyleFlag/1, + getWindowVariant/1,hasCapture/1,hasScrollbar/2,hasTransparentBackground/1, + hide/1,inheritAttributes/1,initDialog/1,invalidateBestSize/1,isDoubleBuffered/1, + isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,isShown/1, + isTopLevel/1,layout/1,lineDown/1,lineUp/1,lower/1,makeModal/1,makeModal/2, + move/2,move/3,move/4,moveAfterInTabOrder/2,moveBeforeInTabOrder/2, + navigate/1,navigate/2,new/0,new/2,new/3,pageDown/1,pageUp/1,popEventHandler/1, + popEventHandler/2,popupMenu/2,popupMenu/3,popupMenu/4,raise/1,refresh/1, + refresh/2,refreshRect/2,refreshRect/3,releaseMouse/1,removeChild/2, + reparent/2,screenToClient/1,screenToClient/2,scrollLines/2,scrollPages/2, + scrollWindow/3,scrollWindow/4,setAcceleratorTable/2,setAutoLayout/2, + setBackgroundColour/2,setBackgroundStyle/2,setCaret/2,setClientSize/2, + setClientSize/3,setContainingSizer/2,setCursor/2,setDoubleBuffered/2, + setDropTarget/2,setExtraStyle/2,setFocus/1,setFocusFromKbd/1,setFont/2, + setForegroundColour/2,setHelpText/2,setId/2,setLabel/2,setMaxSize/2, setMinSize/2,setName/2,setOwnBackgroundColour/2,setOwnFont/2,setOwnForegroundColour/2, setPalette/2,setScrollPos/3,setScrollPos/4,setScrollbar/5,setScrollbar/6, setSize/2,setSize/3,setSize/5,setSize/6,setSizeHints/2,setSizeHints/3, @@ -297,6 +298,15 @@ disable(#wx_ref{type=ThisT,ref=ThisRef}) -> wxe_util:call(?wxWindow_Disable, <<ThisRef:32/?UI>>). +%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxwindow.html#wxwindowdragacceptfiles">external documentation</a>. +-spec dragAcceptFiles(This, Accept) -> 'ok' when + This::wxWindow(), Accept::boolean(). +dragAcceptFiles(#wx_ref{type=ThisT,ref=ThisRef},Accept) + when is_boolean(Accept) -> + ?CLASS(ThisT,wxWindow), + wxe_util:cast(?wxWindow_DragAcceptFiles, + <<ThisRef:32/?UI,(wxe_util:from_bool(Accept)):32/?UI>>). + %% @equiv enable(This, []) -spec enable(This) -> boolean() when This::wxWindow(). @@ -339,7 +349,7 @@ findWindow(#wx_ref{type=ThisT,ref=ThisRef},Winid) wxe_util:call(?wxWindow_FindWindow_1_0, <<ThisRef:32/?UI,Winid:32/?UI>>); findWindow(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxWindow), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxWindow_FindWindow_1_1, @@ -370,7 +380,7 @@ findWindowById(Winid, Options) Name::unicode:chardata(). findWindowByName(Name) - when is_list(Name) -> + when ?is_chardata(Name) -> findWindowByName(Name, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxwindow.html#wxwindowfindwindowbyname">external documentation</a>. @@ -378,7 +388,7 @@ findWindowByName(Name) Name::unicode:chardata(), Option :: {'parent', wxWindow()}. findWindowByName(Name, Options) - when is_list(Name),is_list(Options) -> + when ?is_chardata(Name),is_list(Options) -> Name_UC = unicode:characters_to_binary([Name,0]), MOpts = fun({parent, #wx_ref{type=ParentT,ref=ParentRef}}, Acc) -> ?CLASS(ParentT,wxWindow),[<<1:32/?UI,ParentRef:32/?UI>>|Acc]; (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, @@ -391,7 +401,7 @@ findWindowByName(Name, Options) Label::unicode:chardata(). findWindowByLabel(Label) - when is_list(Label) -> + when ?is_chardata(Label) -> findWindowByLabel(Label, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxwindow.html#wxwindowfindwindowbylabel">external documentation</a>. @@ -399,7 +409,7 @@ findWindowByLabel(Label) Label::unicode:chardata(), Option :: {'parent', wxWindow()}. findWindowByLabel(Label, Options) - when is_list(Label),is_list(Options) -> + when ?is_chardata(Label),is_list(Options) -> Label_UC = unicode:characters_to_binary([Label,0]), MOpts = fun({parent, #wx_ref{type=ParentT,ref=ParentRef}}, Acc) -> ?CLASS(ParentT,wxWindow),[<<1:32/?UI,ParentRef:32/?UI>>|Acc]; (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, @@ -719,7 +729,7 @@ getSizer(#wx_ref{type=ThisT,ref=ThisRef}) -> This::wxWindow(), String::unicode:chardata(). getTextExtent(This,String) - when is_record(This, wx_ref),is_list(String) -> + when is_record(This, wx_ref),?is_chardata(String) -> getTextExtent(This,String, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxwindow.html#wxwindowgettextextent">external documentation</a>. @@ -728,7 +738,7 @@ getTextExtent(This,String) This::wxWindow(), String::unicode:chardata(), Option :: {'theFont', wxFont:wxFont()}. getTextExtent(#wx_ref{type=ThisT,ref=ThisRef},String, Options) - when is_list(String),is_list(Options) -> + when ?is_chardata(String),is_list(Options) -> ?CLASS(ThisT,wxWindow), String_UC = unicode:characters_to_binary([String,0]), MOpts = fun({theFont, #wx_ref{type=TheFontT,ref=TheFontRef}}, Acc) -> ?CLASS(TheFontT,wxFont),[<<1:32/?UI,TheFontRef:32/?UI>>|Acc]; @@ -1439,7 +1449,7 @@ setForegroundColour(#wx_ref{type=ThisT,ref=ThisRef},Colour) -spec setHelpText(This, Text) -> 'ok' when This::wxWindow(), Text::unicode:chardata(). setHelpText(#wx_ref{type=ThisT,ref=ThisRef},Text) - when is_list(Text) -> + when ?is_chardata(Text) -> ?CLASS(ThisT,wxWindow), Text_UC = unicode:characters_to_binary([Text,0]), wxe_util:cast(?wxWindow_SetHelpText, @@ -1458,7 +1468,7 @@ setId(#wx_ref{type=ThisT,ref=ThisRef},Winid) -spec setLabel(This, Label) -> 'ok' when This::wxWindow(), Label::unicode:chardata(). setLabel(#wx_ref{type=ThisT,ref=ThisRef},Label) - when is_list(Label) -> + when ?is_chardata(Label) -> ?CLASS(ThisT,wxWindow), Label_UC = unicode:characters_to_binary([Label,0]), wxe_util:cast(?wxWindow_SetLabel, @@ -1468,7 +1478,7 @@ setLabel(#wx_ref{type=ThisT,ref=ThisRef},Label) -spec setName(This, Name) -> 'ok' when This::wxWindow(), Name::unicode:chardata(). setName(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxWindow), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:cast(?wxWindow_SetName, @@ -1707,7 +1717,7 @@ setThemeEnabled(#wx_ref{type=ThisT,ref=ThisRef},EnableTheme) (This, Tip) -> 'ok' when This::wxWindow(), Tip::wxToolTip:wxToolTip(). setToolTip(#wx_ref{type=ThisT,ref=ThisRef},Tip) - when is_list(Tip) -> + when ?is_chardata(Tip) -> ?CLASS(ThisT,wxWindow), Tip_UC = unicode:characters_to_binary([Tip,0]), wxe_util:cast(?wxWindow_SetToolTip_1_0, @@ -1944,6 +1954,14 @@ setDoubleBuffered(#wx_ref{type=ThisT,ref=ThisRef},On) wxe_util:cast(?wxWindow_SetDoubleBuffered, <<ThisRef:32/?UI,(wxe_util:from_bool(On)):32/?UI>>). +%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxwindow.html#wxwindowgetcontentscalefactor">external documentation</a>. +-spec getContentScaleFactor(This) -> number() when + This::wxWindow(). +getContentScaleFactor(#wx_ref{type=ThisT,ref=ThisRef}) -> + ?CLASS(ThisT,wxWindow), + wxe_util:call(?wxWindow_GetContentScaleFactor, + <<ThisRef:32/?UI>>). + %% @doc Destroys this object, do not use object again -spec destroy(This::wxWindow()) -> 'ok'. destroy(Obj=#wx_ref{type=Type}) -> diff --git a/lib/wx/src/gen/wxXmlResource.erl b/lib/wx/src/gen/wxXmlResource.erl index aa65b8b04e..51f6231f48 100644 --- a/lib/wx/src/gen/wxXmlResource.erl +++ b/lib/wx/src/gen/wxXmlResource.erl @@ -65,7 +65,7 @@ new(Options) Option :: {'flags', integer()} | {'domain', unicode:chardata()}. new(Filemask, Options) - when is_list(Filemask),is_list(Options) -> + when ?is_chardata(Filemask),is_list(Options) -> Filemask_UC = unicode:characters_to_binary([Filemask,0]), MOpts = fun({flags, Flags}, Acc) -> [<<1:32/?UI,Flags:32/?UI>>|Acc]; ({domain, Domain}, Acc) -> Domain_UC = unicode:characters_to_binary([Domain,0]),[<<2:32/?UI,(byte_size(Domain_UC)):32/?UI,(Domain_UC)/binary, 0:(((8- ((0+byte_size(Domain_UC)) band 16#7)) band 16#7))/unit:8>>|Acc]; @@ -79,7 +79,7 @@ new(Filemask, Options) This::wxXmlResource(), Name::unicode:chardata(), Control::wxWindow:wxWindow(). attachUnknownControl(This,Name,Control) - when is_record(This, wx_ref),is_list(Name),is_record(Control, wx_ref) -> + when is_record(This, wx_ref),?is_chardata(Name),is_record(Control, wx_ref) -> attachUnknownControl(This,Name,Control, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxxmlresource.html#wxxmlresourceattachunknowncontrol">external documentation</a>. @@ -87,7 +87,7 @@ attachUnknownControl(This,Name,Control) This::wxXmlResource(), Name::unicode:chardata(), Control::wxWindow:wxWindow(), Option :: {'parent', wxWindow:wxWindow()}. attachUnknownControl(#wx_ref{type=ThisT,ref=ThisRef},Name,#wx_ref{type=ControlT,ref=ControlRef}, Options) - when is_list(Name),is_list(Options) -> + when ?is_chardata(Name),is_list(Options) -> ?CLASS(ThisT,wxXmlResource), Name_UC = unicode:characters_to_binary([Name,0]), ?CLASS(ControlT,wxWindow), @@ -169,7 +169,7 @@ initAllHandlers(#wx_ref{type=ThisT,ref=ThisRef}) -> -spec load(This, Filemask) -> boolean() when This::wxXmlResource(), Filemask::unicode:chardata(). load(#wx_ref{type=ThisT,ref=ThisRef},Filemask) - when is_list(Filemask) -> + when ?is_chardata(Filemask) -> ?CLASS(ThisT,wxXmlResource), Filemask_UC = unicode:characters_to_binary([Filemask,0]), wxe_util:call(?wxXmlResource_Load, @@ -179,7 +179,7 @@ load(#wx_ref{type=ThisT,ref=ThisRef},Filemask) -spec loadBitmap(This, Name) -> wxBitmap:wxBitmap() when This::wxXmlResource(), Name::unicode:chardata(). loadBitmap(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxXmlResource_LoadBitmap, @@ -189,7 +189,7 @@ loadBitmap(#wx_ref{type=ThisT,ref=ThisRef},Name) -spec loadDialog(This, Parent, Name) -> wxDialog:wxDialog() when This::wxXmlResource(), Parent::wxWindow:wxWindow(), Name::unicode:chardata(). loadDialog(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), ?CLASS(ParentT,wxWindow), Name_UC = unicode:characters_to_binary([Name,0]), @@ -200,7 +200,7 @@ loadDialog(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},N -spec loadDialog(This, Dlg, Parent, Name) -> boolean() when This::wxXmlResource(), Dlg::wxDialog:wxDialog(), Parent::wxWindow:wxWindow(), Name::unicode:chardata(). loadDialog(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=DlgT,ref=DlgRef},#wx_ref{type=ParentT,ref=ParentRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), ?CLASS(DlgT,wxDialog), ?CLASS(ParentT,wxWindow), @@ -212,7 +212,7 @@ loadDialog(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=DlgT,ref=DlgRef},#wx_ref -spec loadFrame(This, Parent, Name) -> wxFrame:wxFrame() when This::wxXmlResource(), Parent::wxWindow:wxWindow(), Name::unicode:chardata(). loadFrame(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), ?CLASS(ParentT,wxWindow), Name_UC = unicode:characters_to_binary([Name,0]), @@ -223,7 +223,7 @@ loadFrame(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Na -spec loadFrame(This, Frame, Parent, Name) -> boolean() when This::wxXmlResource(), Frame::wxFrame:wxFrame(), Parent::wxWindow:wxWindow(), Name::unicode:chardata(). loadFrame(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=FrameT,ref=FrameRef},#wx_ref{type=ParentT,ref=ParentRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), ?CLASS(FrameT,wxFrame), ?CLASS(ParentT,wxWindow), @@ -235,7 +235,7 @@ loadFrame(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=FrameT,ref=FrameRef},#wx_ -spec loadIcon(This, Name) -> wxIcon:wxIcon() when This::wxXmlResource(), Name::unicode:chardata(). loadIcon(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxXmlResource_LoadIcon, @@ -245,7 +245,7 @@ loadIcon(#wx_ref{type=ThisT,ref=ThisRef},Name) -spec loadMenu(This, Name) -> wxMenu:wxMenu() when This::wxXmlResource(), Name::unicode:chardata(). loadMenu(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxXmlResource_LoadMenu, @@ -255,7 +255,7 @@ loadMenu(#wx_ref{type=ThisT,ref=ThisRef},Name) -spec loadMenuBar(This, Name) -> wxMenuBar:wxMenuBar() when This::wxXmlResource(), Name::unicode:chardata(). loadMenuBar(#wx_ref{type=ThisT,ref=ThisRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), Name_UC = unicode:characters_to_binary([Name,0]), wxe_util:call(?wxXmlResource_LoadMenuBar_1, @@ -265,7 +265,7 @@ loadMenuBar(#wx_ref{type=ThisT,ref=ThisRef},Name) -spec loadMenuBar(This, Parent, Name) -> wxMenuBar:wxMenuBar() when This::wxXmlResource(), Parent::wxWindow:wxWindow(), Name::unicode:chardata(). loadMenuBar(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), ?CLASS(ParentT,wxWindow), Name_UC = unicode:characters_to_binary([Name,0]), @@ -276,7 +276,7 @@ loadMenuBar(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef}, -spec loadPanel(This, Parent, Name) -> wxPanel:wxPanel() when This::wxXmlResource(), Parent::wxWindow:wxWindow(), Name::unicode:chardata(). loadPanel(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), ?CLASS(ParentT,wxWindow), Name_UC = unicode:characters_to_binary([Name,0]), @@ -287,7 +287,7 @@ loadPanel(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Na -spec loadPanel(This, Panel, Parent, Name) -> boolean() when This::wxXmlResource(), Panel::wxPanel:wxPanel(), Parent::wxWindow:wxWindow(), Name::unicode:chardata(). loadPanel(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PanelT,ref=PanelRef},#wx_ref{type=ParentT,ref=ParentRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), ?CLASS(PanelT,wxPanel), ?CLASS(ParentT,wxWindow), @@ -299,7 +299,7 @@ loadPanel(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=PanelT,ref=PanelRef},#wx_ -spec loadToolBar(This, Parent, Name) -> wxToolBar:wxToolBar() when This::wxXmlResource(), Parent::wxWindow:wxWindow(), Name::unicode:chardata(). loadToolBar(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef},Name) - when is_list(Name) -> + when ?is_chardata(Name) -> ?CLASS(ThisT,wxXmlResource), ?CLASS(ParentT,wxWindow), Name_UC = unicode:characters_to_binary([Name,0]), @@ -327,7 +327,7 @@ setFlags(#wx_ref{type=ThisT,ref=ThisRef},Flags) -spec unload(This, Filename) -> boolean() when This::wxXmlResource(), Filename::unicode:chardata(). unload(#wx_ref{type=ThisT,ref=ThisRef},Filename) - when is_list(Filename) -> + when ?is_chardata(Filename) -> ?CLASS(ThisT,wxXmlResource), Filename_UC = unicode:characters_to_binary([Filename,0]), wxe_util:call(?wxXmlResource_Unload, diff --git a/lib/wx/src/gen/wx_misc.erl b/lib/wx/src/gen/wx_misc.erl index ce5d917136..66b1756a2f 100644 --- a/lib/wx/src/gen/wx_misc.erl +++ b/lib/wx/src/gen/wx_misc.erl @@ -72,7 +72,7 @@ bell() -> -spec findMenuItemId(Frame, MenuString, ItemString) -> integer() when Frame::wxFrame:wxFrame(), MenuString::unicode:chardata(), ItemString::unicode:chardata(). findMenuItemId(#wx_ref{type=FrameT,ref=FrameRef},MenuString,ItemString) - when is_list(MenuString),is_list(ItemString) -> + when ?is_chardata(MenuString),?is_chardata(ItemString) -> ?CLASS(FrameT,wxFrame), MenuString_UC = unicode:characters_to_binary([MenuString,0]), ItemString_UC = unicode:characters_to_binary([ItemString,0]), @@ -155,7 +155,7 @@ shell(Options) Url::unicode:chardata(). launchDefaultBrowser(Url) - when is_list(Url) -> + when ?is_chardata(Url) -> launchDefaultBrowser(Url, []). %% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_miscellany.html#wxlaunchdefaultbrowser">external documentation</a>. @@ -163,7 +163,7 @@ launchDefaultBrowser(Url) Url::unicode:chardata(), Option :: {'flags', integer()}. launchDefaultBrowser(Url, Options) - when is_list(Url),is_list(Options) -> + when ?is_chardata(Url),is_list(Options) -> Url_UC = unicode:characters_to_binary([Url,0]), MOpts = fun({flags, Flags}, Acc) -> [<<1:32/?UI,Flags:32/?UI>>|Acc]; (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, diff --git a/lib/wx/src/gen/wxe_debug.hrl b/lib/wx/src/gen/wxe_debug.hrl index 78c6577439..58cb5298e6 100644 --- a/lib/wx/src/gen/wxe_debug.hrl +++ b/lib/wx/src/gen/wxe_debug.hrl @@ -45,3333 +45,3338 @@ wxdebug_table() -> {123, {wxWindow, 'Destroy', 0}}, {124, {wxWindow, destroyChildren, 0}}, {125, {wxWindow, disable, 0}}, - {126, {wxWindow, enable, 1}}, - {127, {wxWindow, findFocus, 0}}, - {128, {wxWindow, findWindow_1_0, 1}}, - {129, {wxWindow, findWindow_1_1, 1}}, - {130, {wxWindow, findWindowById, 2}}, - {131, {wxWindow, findWindowByName, 2}}, - {132, {wxWindow, findWindowByLabel, 2}}, - {133, {wxWindow, fit, 0}}, - {134, {wxWindow, fitInside, 0}}, - {135, {wxWindow, freeze, 0}}, - {136, {wxWindow, getAcceleratorTable, 0}}, - {137, {wxWindow, getBackgroundColour, 0}}, - {138, {wxWindow, getBackgroundStyle, 0}}, - {139, {wxWindow, getBestSize, 0}}, - {141, {wxWindow, getCaret, 0}}, - {142, {wxWindow, getCapture, 0}}, - {143, {wxWindow, getCharHeight, 0}}, - {144, {wxWindow, getCharWidth, 0}}, - {145, {wxWindow, getChildren, 0}}, - {148, {wxWindow, getClientSize, 0}}, - {149, {wxWindow, getContainingSizer, 0}}, - {150, {wxWindow, getCursor, 0}}, - {151, {wxWindow, getDropTarget, 0}}, - {152, {wxWindow, getEventHandler, 0}}, - {153, {wxWindow, getExtraStyle, 0}}, - {154, {wxWindow, getFont, 0}}, - {155, {wxWindow, getForegroundColour, 0}}, - {156, {wxWindow, getGrandParent, 0}}, - {157, {wxWindow, getHandle, 0}}, - {158, {wxWindow, getHelpText, 0}}, - {159, {wxWindow, getId, 0}}, - {160, {wxWindow, getLabel, 0}}, - {161, {wxWindow, getMaxSize, 0}}, - {162, {wxWindow, getMinSize, 0}}, - {163, {wxWindow, getName, 0}}, - {164, {wxWindow, getParent, 0}}, - {166, {wxWindow, getPosition, 0}}, - {167, {wxWindow, getRect, 0}}, - {169, {wxWindow, getScreenPosition, 0}}, - {170, {wxWindow, getScreenRect, 0}}, - {171, {wxWindow, getScrollPos, 1}}, - {172, {wxWindow, getScrollRange, 1}}, - {173, {wxWindow, getScrollThumb, 1}}, - {175, {wxWindow, getSize, 0}}, - {176, {wxWindow, getSizer, 0}}, - {177, {wxWindow, getTextExtent, 4}}, - {178, {wxWindow, getToolTip, 0}}, - {179, {wxWindow, getUpdateRegion, 0}}, - {181, {wxWindow, getVirtualSize, 0}}, - {183, {wxWindow, getWindowStyleFlag, 0}}, - {184, {wxWindow, getWindowVariant, 0}}, - {185, {wxWindow, hasCapture, 0}}, - {186, {wxWindow, hasScrollbar, 1}}, - {187, {wxWindow, hasTransparentBackground, 0}}, - {188, {wxWindow, hide, 0}}, - {189, {wxWindow, inheritAttributes, 0}}, - {190, {wxWindow, initDialog, 0}}, - {191, {wxWindow, invalidateBestSize, 0}}, - {192, {wxWindow, isEnabled, 0}}, - {193, {wxWindow, isExposed_2, 2}}, - {194, {wxWindow, isExposed_4, 4}}, - {195, {wxWindow, isExposed_1_0, 1}}, - {196, {wxWindow, isExposed_1_1, 1}}, - {197, {wxWindow, isRetained, 0}}, - {198, {wxWindow, isShown, 0}}, - {199, {wxWindow, isTopLevel, 0}}, - {200, {wxWindow, layout, 0}}, - {201, {wxWindow, lineDown, 0}}, - {202, {wxWindow, lineUp, 0}}, - {203, {wxWindow, lower, 0}}, - {204, {wxWindow, makeModal, 1}}, - {205, {wxWindow, move_3, 3}}, - {206, {wxWindow, move_2, 2}}, - {207, {wxWindow, moveAfterInTabOrder, 1}}, - {208, {wxWindow, moveBeforeInTabOrder, 1}}, - {209, {wxWindow, navigate, 1}}, - {210, {wxWindow, pageDown, 0}}, - {211, {wxWindow, pageUp, 0}}, - {212, {wxWindow, popEventHandler, 1}}, - {213, {wxWindow, popupMenu_2, 2}}, - {214, {wxWindow, popupMenu_3, 3}}, - {215, {wxWindow, raise, 0}}, - {216, {wxWindow, refresh, 1}}, - {217, {wxWindow, refreshRect, 2}}, - {218, {wxWindow, releaseMouse, 0}}, - {219, {wxWindow, removeChild, 1}}, - {220, {wxWindow, reparent, 1}}, - {221, {wxWindow, screenToClient_2, 2}}, - {222, {wxWindow, screenToClient_1, 1}}, - {224, {wxWindow, scrollLines, 1}}, - {226, {wxWindow, scrollPages, 1}}, - {227, {wxWindow, scrollWindow, 3}}, - {228, {wxWindow, setAcceleratorTable, 1}}, - {229, {wxWindow, setAutoLayout, 1}}, - {230, {wxWindow, setBackgroundColour, 1}}, - {231, {wxWindow, setBackgroundStyle, 1}}, - {232, {wxWindow, setCaret, 1}}, - {233, {wxWindow, setClientSize_2, 2}}, - {234, {wxWindow, setClientSize_1_0, 1}}, - {235, {wxWindow, setClientSize_1_1, 1}}, - {236, {wxWindow, setContainingSizer, 1}}, - {237, {wxWindow, setCursor, 1}}, - {238, {wxWindow, setMaxSize, 1}}, - {239, {wxWindow, setMinSize, 1}}, - {240, {wxWindow, setOwnBackgroundColour, 1}}, - {241, {wxWindow, setOwnFont, 1}}, - {242, {wxWindow, setOwnForegroundColour, 1}}, - {243, {wxWindow, setDropTarget, 1}}, - {244, {wxWindow, setExtraStyle, 1}}, - {245, {wxWindow, setFocus, 0}}, - {246, {wxWindow, setFocusFromKbd, 0}}, - {247, {wxWindow, setFont, 1}}, - {248, {wxWindow, setForegroundColour, 1}}, - {249, {wxWindow, setHelpText, 1}}, - {250, {wxWindow, setId, 1}}, - {252, {wxWindow, setLabel, 1}}, - {253, {wxWindow, setName, 1}}, - {254, {wxWindow, setPalette, 1}}, - {255, {wxWindow, setScrollbar, 5}}, - {256, {wxWindow, setScrollPos, 3}}, - {257, {wxWindow, setSize_5, 5}}, - {258, {wxWindow, setSize_2_0, 2}}, - {259, {wxWindow, setSize_1, 1}}, - {260, {wxWindow, setSize_2_1, 2}}, - {261, {wxWindow, setSizeHints_3, 3}}, - {262, {wxWindow, setSizeHints_2, 2}}, - {263, {wxWindow, setSizer, 2}}, - {264, {wxWindow, setSizerAndFit, 2}}, - {265, {wxWindow, setThemeEnabled, 1}}, - {266, {wxWindow, setToolTip_1_0, 1}}, - {267, {wxWindow, setToolTip_1_1, 1}}, - {268, {wxWindow, setVirtualSize_1, 1}}, - {269, {wxWindow, setVirtualSize_2, 2}}, - {270, {wxWindow, setVirtualSizeHints_3, 3}}, - {271, {wxWindow, setVirtualSizeHints_2, 2}}, - {272, {wxWindow, setWindowStyle, 1}}, - {273, {wxWindow, setWindowStyleFlag, 1}}, - {274, {wxWindow, setWindowVariant, 1}}, - {275, {wxWindow, shouldInheritColours, 0}}, - {276, {wxWindow, show, 1}}, - {277, {wxWindow, thaw, 0}}, - {278, {wxWindow, transferDataFromWindow, 0}}, - {279, {wxWindow, transferDataToWindow, 0}}, - {280, {wxWindow, update, 0}}, - {281, {wxWindow, updateWindowUI, 1}}, - {282, {wxWindow, validate, 0}}, - {283, {wxWindow, warpPointer, 2}}, - {284, {wxWindow, setTransparent, 1}}, - {285, {wxWindow, canSetTransparent, 0}}, - {286, {wxWindow, isDoubleBuffered, 0}}, - {287, {wxWindow, setDoubleBuffered, 1}}, - {288, {wxTopLevelWindow, getIcon, 0}}, - {289, {wxTopLevelWindow, getIcons, 0}}, - {290, {wxTopLevelWindow, getTitle, 0}}, - {291, {wxTopLevelWindow, isActive, 0}}, - {292, {wxTopLevelWindow, iconize, 1}}, - {293, {wxTopLevelWindow, isFullScreen, 0}}, - {294, {wxTopLevelWindow, isIconized, 0}}, - {295, {wxTopLevelWindow, isMaximized, 0}}, - {296, {wxTopLevelWindow, maximize, 1}}, - {297, {wxTopLevelWindow, requestUserAttention, 1}}, - {298, {wxTopLevelWindow, setIcon, 1}}, - {299, {wxTopLevelWindow, setIcons, 1}}, - {300, {wxTopLevelWindow, centerOnScreen, 1}}, - {301, {wxTopLevelWindow, centreOnScreen, 1}}, - {303, {wxTopLevelWindow, setShape, 1}}, - {304, {wxTopLevelWindow, setTitle, 1}}, - {305, {wxTopLevelWindow, showFullScreen, 2}}, - {307, {wxFrame, new_4, 4}}, - {308, {wxFrame, new_0, 0}}, - {310, {wxFrame, destruct, 0}}, - {311, {wxFrame, create, 4}}, - {312, {wxFrame, createStatusBar, 1}}, - {313, {wxFrame, createToolBar, 1}}, - {314, {wxFrame, getClientAreaOrigin, 0}}, - {315, {wxFrame, getMenuBar, 0}}, - {316, {wxFrame, getStatusBar, 0}}, - {317, {wxFrame, getStatusBarPane, 0}}, - {318, {wxFrame, getToolBar, 0}}, - {319, {wxFrame, processCommand, 1}}, - {320, {wxFrame, sendSizeEvent, 0}}, - {321, {wxFrame, setMenuBar, 1}}, - {322, {wxFrame, setStatusBar, 1}}, - {323, {wxFrame, setStatusBarPane, 1}}, - {324, {wxFrame, setStatusText, 2}}, - {325, {wxFrame, setStatusWidths, 2}}, - {326, {wxFrame, setToolBar, 1}}, - {327, {wxMiniFrame, new_0, 0}}, - {328, {wxMiniFrame, new_4, 4}}, - {329, {wxMiniFrame, create, 4}}, - {330, {wxMiniFrame, 'Destroy', undefined}}, - {331, {wxSplashScreen, new_0, 0}}, - {332, {wxSplashScreen, new_6, 6}}, - {333, {wxSplashScreen, destruct, 0}}, - {334, {wxSplashScreen, getSplashStyle, 0}}, - {335, {wxSplashScreen, getTimeout, 0}}, - {336, {wxPanel, new_0, 0}}, - {337, {wxPanel, new_6, 6}}, - {338, {wxPanel, new_2, 2}}, - {339, {wxPanel, destruct, 0}}, - {340, {wxPanel, initDialog, 0}}, - {341, {wxPanel, setFocusIgnoringChildren, 0}}, - {342, {wxScrolledWindow, new_0, 0}}, - {343, {wxScrolledWindow, new_2, 2}}, - {344, {wxScrolledWindow, destruct, 0}}, - {345, {wxScrolledWindow, calcScrolledPosition_4, 4}}, - {346, {wxScrolledWindow, calcScrolledPosition_1, 1}}, - {347, {wxScrolledWindow, calcUnscrolledPosition_4, 4}}, - {348, {wxScrolledWindow, calcUnscrolledPosition_1, 1}}, - {349, {wxScrolledWindow, enableScrolling, 2}}, - {350, {wxScrolledWindow, getScrollPixelsPerUnit, 2}}, - {351, {wxScrolledWindow, getViewStart, 2}}, - {352, {wxScrolledWindow, doPrepareDC, 1}}, - {353, {wxScrolledWindow, prepareDC, 1}}, - {354, {wxScrolledWindow, scroll, 2}}, - {355, {wxScrolledWindow, setScrollbars, 5}}, - {356, {wxScrolledWindow, setScrollRate, 2}}, - {357, {wxScrolledWindow, setTargetWindow, 1}}, - {358, {wxSashWindow, new_0, 0}}, - {359, {wxSashWindow, new_2, 2}}, - {360, {wxSashWindow, destruct, 0}}, - {361, {wxSashWindow, getSashVisible, 1}}, - {362, {wxSashWindow, getMaximumSizeX, 0}}, - {363, {wxSashWindow, getMaximumSizeY, 0}}, - {364, {wxSashWindow, getMinimumSizeX, 0}}, - {365, {wxSashWindow, getMinimumSizeY, 0}}, - {366, {wxSashWindow, setMaximumSizeX, 1}}, - {367, {wxSashWindow, setMaximumSizeY, 1}}, - {368, {wxSashWindow, setMinimumSizeX, 1}}, - {369, {wxSashWindow, setMinimumSizeY, 1}}, - {370, {wxSashWindow, setSashVisible, 2}}, - {371, {wxSashLayoutWindow, new_0, 0}}, - {372, {wxSashLayoutWindow, new_2, 2}}, - {373, {wxSashLayoutWindow, create, 2}}, - {374, {wxSashLayoutWindow, getAlignment, 0}}, - {375, {wxSashLayoutWindow, getOrientation, 0}}, - {376, {wxSashLayoutWindow, setAlignment, 1}}, - {377, {wxSashLayoutWindow, setDefaultSize, 1}}, - {378, {wxSashLayoutWindow, setOrientation, 1}}, - {379, {wxSashLayoutWindow, 'Destroy', undefined}}, - {380, {wxGrid, new_0, 0}}, - {381, {wxGrid, new_3, 3}}, - {382, {wxGrid, new_4, 4}}, - {383, {wxGrid, destruct, 0}}, - {384, {wxGrid, appendCols, 1}}, - {385, {wxGrid, appendRows, 1}}, - {386, {wxGrid, autoSize, 0}}, - {387, {wxGrid, autoSizeColumn, 2}}, - {388, {wxGrid, autoSizeColumns, 1}}, - {389, {wxGrid, autoSizeRow, 2}}, - {390, {wxGrid, autoSizeRows, 1}}, - {391, {wxGrid, beginBatch, 0}}, - {392, {wxGrid, blockToDeviceRect, 2}}, - {393, {wxGrid, canDragColSize, 0}}, - {394, {wxGrid, canDragRowSize, 0}}, - {395, {wxGrid, canDragGridSize, 0}}, - {396, {wxGrid, canEnableCellControl, 0}}, - {397, {wxGrid, cellToRect_2, 2}}, - {398, {wxGrid, cellToRect_1, 1}}, - {399, {wxGrid, clearGrid, 0}}, - {400, {wxGrid, clearSelection, 0}}, - {401, {wxGrid, createGrid, 3}}, - {402, {wxGrid, deleteCols, 1}}, - {403, {wxGrid, deleteRows, 1}}, - {404, {wxGrid, disableCellEditControl, 0}}, - {405, {wxGrid, disableDragColSize, 0}}, - {406, {wxGrid, disableDragGridSize, 0}}, - {407, {wxGrid, disableDragRowSize, 0}}, - {408, {wxGrid, enableCellEditControl, 1}}, - {409, {wxGrid, enableDragColSize, 1}}, - {410, {wxGrid, enableDragGridSize, 1}}, - {411, {wxGrid, enableDragRowSize, 1}}, - {412, {wxGrid, enableEditing, 1}}, - {413, {wxGrid, enableGridLines, 1}}, - {414, {wxGrid, endBatch, 0}}, - {415, {wxGrid, fit, 0}}, - {416, {wxGrid, forceRefresh, 0}}, - {417, {wxGrid, getBatchCount, 0}}, - {418, {wxGrid, getCellAlignment, 4}}, - {419, {wxGrid, getCellBackgroundColour, 2}}, - {420, {wxGrid, getCellEditor, 2}}, - {421, {wxGrid, getCellFont, 2}}, - {422, {wxGrid, getCellRenderer, 2}}, - {423, {wxGrid, getCellTextColour, 2}}, - {424, {wxGrid, getCellValue_2, 2}}, - {425, {wxGrid, getCellValue_1, 1}}, - {426, {wxGrid, getColLabelAlignment, 2}}, - {427, {wxGrid, getColLabelSize, 0}}, - {428, {wxGrid, getColLabelValue, 1}}, - {429, {wxGrid, getColMinimalAcceptableWidth, 0}}, - {430, {wxGrid, getDefaultCellAlignment, 2}}, - {431, {wxGrid, getDefaultCellBackgroundColour, 0}}, - {432, {wxGrid, getDefaultCellFont, 0}}, - {433, {wxGrid, getDefaultCellTextColour, 0}}, - {434, {wxGrid, getDefaultColLabelSize, 0}}, - {435, {wxGrid, getDefaultColSize, 0}}, - {436, {wxGrid, getDefaultEditor, 0}}, - {437, {wxGrid, getDefaultEditorForCell_2, 2}}, - {438, {wxGrid, getDefaultEditorForCell_1, 1}}, - {439, {wxGrid, getDefaultEditorForType, 1}}, - {440, {wxGrid, getDefaultRenderer, 0}}, - {441, {wxGrid, getDefaultRendererForCell, 2}}, - {442, {wxGrid, getDefaultRendererForType, 1}}, - {443, {wxGrid, getDefaultRowLabelSize, 0}}, - {444, {wxGrid, getDefaultRowSize, 0}}, - {445, {wxGrid, getGridCursorCol, 0}}, - {446, {wxGrid, getGridCursorRow, 0}}, - {447, {wxGrid, getGridLineColour, 0}}, - {448, {wxGrid, gridLinesEnabled, 0}}, - {449, {wxGrid, getLabelBackgroundColour, 0}}, - {450, {wxGrid, getLabelFont, 0}}, - {451, {wxGrid, getLabelTextColour, 0}}, - {452, {wxGrid, getNumberCols, 0}}, - {453, {wxGrid, getNumberRows, 0}}, - {454, {wxGrid, getOrCreateCellAttr, 2}}, - {455, {wxGrid, getRowMinimalAcceptableHeight, 0}}, - {456, {wxGrid, getRowLabelAlignment, 2}}, - {457, {wxGrid, getRowLabelSize, 0}}, - {458, {wxGrid, getRowLabelValue, 1}}, - {459, {wxGrid, getRowSize, 1}}, - {460, {wxGrid, getScrollLineX, 0}}, - {461, {wxGrid, getScrollLineY, 0}}, - {462, {wxGrid, getSelectedCells, 0}}, - {463, {wxGrid, getSelectedCols, 0}}, - {464, {wxGrid, getSelectedRows, 0}}, - {465, {wxGrid, getSelectionBackground, 0}}, - {466, {wxGrid, getSelectionBlockTopLeft, 0}}, - {467, {wxGrid, getSelectionBlockBottomRight, 0}}, - {468, {wxGrid, getSelectionForeground, 0}}, - {469, {wxGrid, getViewWidth, 0}}, - {470, {wxGrid, getGridWindow, 0}}, - {471, {wxGrid, getGridRowLabelWindow, 0}}, - {472, {wxGrid, getGridColLabelWindow, 0}}, - {473, {wxGrid, getGridCornerLabelWindow, 0}}, - {474, {wxGrid, hideCellEditControl, 0}}, - {475, {wxGrid, insertCols, 1}}, - {476, {wxGrid, insertRows, 1}}, - {477, {wxGrid, isCellEditControlEnabled, 0}}, - {478, {wxGrid, isCurrentCellReadOnly, 0}}, - {479, {wxGrid, isEditable, 0}}, - {480, {wxGrid, isInSelection_2, 2}}, - {481, {wxGrid, isInSelection_1, 1}}, - {482, {wxGrid, isReadOnly, 2}}, - {483, {wxGrid, isSelection, 0}}, - {484, {wxGrid, isVisible_3, 3}}, - {485, {wxGrid, isVisible_2, 2}}, - {486, {wxGrid, makeCellVisible_2, 2}}, - {487, {wxGrid, makeCellVisible_1, 1}}, - {488, {wxGrid, moveCursorDown, 1}}, - {489, {wxGrid, moveCursorLeft, 1}}, - {490, {wxGrid, moveCursorRight, 1}}, - {491, {wxGrid, moveCursorUp, 1}}, - {492, {wxGrid, moveCursorDownBlock, 1}}, - {493, {wxGrid, moveCursorLeftBlock, 1}}, - {494, {wxGrid, moveCursorRightBlock, 1}}, - {495, {wxGrid, moveCursorUpBlock, 1}}, - {496, {wxGrid, movePageDown, 0}}, - {497, {wxGrid, movePageUp, 0}}, - {498, {wxGrid, registerDataType, 3}}, - {499, {wxGrid, saveEditControlValue, 0}}, - {500, {wxGrid, selectAll, 0}}, - {501, {wxGrid, selectBlock_5, 5}}, - {502, {wxGrid, selectBlock_3, 3}}, - {503, {wxGrid, selectCol, 2}}, - {504, {wxGrid, selectRow, 2}}, - {505, {wxGrid, setCellAlignment_4, 4}}, - {506, {wxGrid, setCellAlignment_3, 3}}, - {507, {wxGrid, setCellAlignment_1, 1}}, - {508, {wxGrid, setCellBackgroundColour_3_0, 3}}, - {509, {wxGrid, setCellBackgroundColour_1, 1}}, - {510, {wxGrid, setCellBackgroundColour_3_1, 3}}, - {511, {wxGrid, setCellEditor, 3}}, - {512, {wxGrid, setCellFont, 3}}, - {513, {wxGrid, setCellRenderer, 3}}, - {514, {wxGrid, setCellTextColour_3_0, 3}}, - {515, {wxGrid, setCellTextColour_3_1, 3}}, - {516, {wxGrid, setCellTextColour_1, 1}}, - {517, {wxGrid, setCellValue_3_0, 3}}, - {518, {wxGrid, setCellValue_2, 2}}, - {519, {wxGrid, setCellValue_3_1, 3}}, - {520, {wxGrid, setColAttr, 2}}, - {521, {wxGrid, setColFormatBool, 1}}, - {522, {wxGrid, setColFormatNumber, 1}}, - {523, {wxGrid, setColFormatFloat, 2}}, - {524, {wxGrid, setColFormatCustom, 2}}, - {525, {wxGrid, setColLabelAlignment, 2}}, - {526, {wxGrid, setColLabelSize, 1}}, - {527, {wxGrid, setColLabelValue, 2}}, - {528, {wxGrid, setColMinimalWidth, 2}}, - {529, {wxGrid, setColMinimalAcceptableWidth, 1}}, - {530, {wxGrid, setColSize, 2}}, - {531, {wxGrid, setDefaultCellAlignment, 2}}, - {532, {wxGrid, setDefaultCellBackgroundColour, 1}}, - {533, {wxGrid, setDefaultCellFont, 1}}, - {534, {wxGrid, setDefaultCellTextColour, 1}}, - {535, {wxGrid, setDefaultEditor, 1}}, - {536, {wxGrid, setDefaultRenderer, 1}}, - {537, {wxGrid, setDefaultColSize, 2}}, - {538, {wxGrid, setDefaultRowSize, 2}}, - {539, {wxGrid, setGridCursor, 2}}, - {540, {wxGrid, setGridLineColour, 1}}, - {541, {wxGrid, setLabelBackgroundColour, 1}}, - {542, {wxGrid, setLabelFont, 1}}, - {543, {wxGrid, setLabelTextColour, 1}}, - {544, {wxGrid, setMargins, 2}}, - {545, {wxGrid, setReadOnly, 3}}, - {546, {wxGrid, setRowAttr, 2}}, - {547, {wxGrid, setRowLabelAlignment, 2}}, - {548, {wxGrid, setRowLabelSize, 1}}, - {549, {wxGrid, setRowLabelValue, 2}}, - {550, {wxGrid, setRowMinimalHeight, 2}}, - {551, {wxGrid, setRowMinimalAcceptableHeight, 1}}, - {552, {wxGrid, setRowSize, 2}}, - {553, {wxGrid, setScrollLineX, 1}}, - {554, {wxGrid, setScrollLineY, 1}}, - {555, {wxGrid, setSelectionBackground, 1}}, - {556, {wxGrid, setSelectionForeground, 1}}, - {557, {wxGrid, setSelectionMode, 1}}, - {558, {wxGrid, showCellEditControl, 0}}, - {559, {wxGrid, xToCol, 2}}, - {560, {wxGrid, xToEdgeOfCol, 1}}, - {561, {wxGrid, yToEdgeOfRow, 1}}, - {562, {wxGrid, yToRow, 1}}, - {563, {wxGridCellRenderer, draw, 7}}, - {564, {wxGridCellRenderer, getBestSize, 5}}, - {565, {wxGridCellEditor, create, 3}}, - {566, {wxGridCellEditor, isCreated, 0}}, - {567, {wxGridCellEditor, setSize, 1}}, - {568, {wxGridCellEditor, show, 2}}, - {569, {wxGridCellEditor, paintBackground, 2}}, - {570, {wxGridCellEditor, beginEdit, 3}}, - {571, {wxGridCellEditor, endEdit, 3}}, - {572, {wxGridCellEditor, reset, 0}}, - {573, {wxGridCellEditor, startingKey, 1}}, - {574, {wxGridCellEditor, startingClick, 0}}, - {575, {wxGridCellEditor, handleReturn, 1}}, - {576, {wxGridCellBoolRenderer, new, 0}}, - {577, {wxGridCellBoolRenderer, 'Destroy', undefined}}, - {578, {wxGridCellBoolEditor, new, 0}}, - {579, {wxGridCellBoolEditor, isTrueValue, 1}}, - {580, {wxGridCellBoolEditor, useStringValues, 1}}, - {581, {wxGridCellBoolEditor, 'Destroy', undefined}}, - {582, {wxGridCellFloatRenderer, new, 1}}, - {583, {wxGridCellFloatRenderer, getPrecision, 0}}, - {584, {wxGridCellFloatRenderer, getWidth, 0}}, - {585, {wxGridCellFloatRenderer, setParameters, 1}}, - {586, {wxGridCellFloatRenderer, setPrecision, 1}}, - {587, {wxGridCellFloatRenderer, setWidth, 1}}, - {588, {wxGridCellFloatRenderer, 'Destroy', undefined}}, - {589, {wxGridCellFloatEditor, new, 1}}, - {590, {wxGridCellFloatEditor, setParameters, 1}}, - {591, {wxGridCellFloatEditor, 'Destroy', undefined}}, - {592, {wxGridCellStringRenderer, new, 0}}, - {593, {wxGridCellStringRenderer, 'Destroy', undefined}}, - {594, {wxGridCellTextEditor, new, 0}}, - {595, {wxGridCellTextEditor, setParameters, 1}}, - {596, {wxGridCellTextEditor, 'Destroy', undefined}}, - {598, {wxGridCellChoiceEditor, new, 2}}, - {599, {wxGridCellChoiceEditor, setParameters, 1}}, - {600, {wxGridCellChoiceEditor, 'Destroy', undefined}}, - {601, {wxGridCellNumberRenderer, new, 0}}, - {602, {wxGridCellNumberRenderer, 'Destroy', undefined}}, - {603, {wxGridCellNumberEditor, new, 1}}, - {604, {wxGridCellNumberEditor, getValue, 0}}, - {605, {wxGridCellNumberEditor, setParameters, 1}}, - {606, {wxGridCellNumberEditor, 'Destroy', undefined}}, - {607, {wxGridCellAttr, setTextColour, 1}}, - {608, {wxGridCellAttr, setBackgroundColour, 1}}, - {609, {wxGridCellAttr, setFont, 1}}, - {610, {wxGridCellAttr, setAlignment, 2}}, - {611, {wxGridCellAttr, setReadOnly, 1}}, - {612, {wxGridCellAttr, setRenderer, 1}}, - {613, {wxGridCellAttr, setEditor, 1}}, - {614, {wxGridCellAttr, hasTextColour, 0}}, - {615, {wxGridCellAttr, hasBackgroundColour, 0}}, - {616, {wxGridCellAttr, hasFont, 0}}, - {617, {wxGridCellAttr, hasAlignment, 0}}, - {618, {wxGridCellAttr, hasRenderer, 0}}, - {619, {wxGridCellAttr, hasEditor, 0}}, - {620, {wxGridCellAttr, getTextColour, 0}}, - {621, {wxGridCellAttr, getBackgroundColour, 0}}, - {622, {wxGridCellAttr, getFont, 0}}, - {623, {wxGridCellAttr, getAlignment, 2}}, - {624, {wxGridCellAttr, getRenderer, 3}}, - {625, {wxGridCellAttr, getEditor, 3}}, - {626, {wxGridCellAttr, isReadOnly, 0}}, - {627, {wxGridCellAttr, setDefAttr, 1}}, - {628, {wxDC, blit, 5}}, - {629, {wxDC, calcBoundingBox, 2}}, - {630, {wxDC, clear, 0}}, - {631, {wxDC, computeScaleAndOrigin, 0}}, - {632, {wxDC, crossHair, 1}}, - {633, {wxDC, destroyClippingRegion, 0}}, - {634, {wxDC, deviceToLogicalX, 1}}, - {635, {wxDC, deviceToLogicalXRel, 1}}, - {636, {wxDC, deviceToLogicalY, 1}}, - {637, {wxDC, deviceToLogicalYRel, 1}}, - {638, {wxDC, drawArc, 3}}, - {639, {wxDC, drawBitmap, 3}}, - {640, {wxDC, drawCheckMark, 1}}, - {641, {wxDC, drawCircle, 2}}, - {643, {wxDC, drawEllipse_2, 2}}, - {644, {wxDC, drawEllipse_1, 1}}, - {645, {wxDC, drawEllipticArc, 4}}, - {646, {wxDC, drawIcon, 2}}, - {647, {wxDC, drawLabel, 3}}, - {648, {wxDC, drawLine, 2}}, - {649, {wxDC, drawLines, 3}}, - {651, {wxDC, drawPolygon, 3}}, - {653, {wxDC, drawPoint, 1}}, - {655, {wxDC, drawRectangle_2, 2}}, - {656, {wxDC, drawRectangle_1, 1}}, - {657, {wxDC, drawRotatedText, 3}}, - {659, {wxDC, drawRoundedRectangle_3, 3}}, - {660, {wxDC, drawRoundedRectangle_2, 2}}, - {661, {wxDC, drawText, 2}}, - {662, {wxDC, endDoc, 0}}, - {663, {wxDC, endPage, 0}}, - {664, {wxDC, floodFill, 3}}, - {665, {wxDC, getBackground, 0}}, - {666, {wxDC, getBackgroundMode, 0}}, - {667, {wxDC, getBrush, 0}}, - {668, {wxDC, getCharHeight, 0}}, - {669, {wxDC, getCharWidth, 0}}, - {670, {wxDC, getClippingBox, 4}}, - {672, {wxDC, getFont, 0}}, - {673, {wxDC, getLayoutDirection, 0}}, - {674, {wxDC, getLogicalFunction, 0}}, - {675, {wxDC, getMapMode, 0}}, - {676, {wxDC, getMultiLineTextExtent_4, 4}}, - {677, {wxDC, getMultiLineTextExtent_1, 1}}, - {678, {wxDC, getPartialTextExtents, 2}}, - {679, {wxDC, getPen, 0}}, - {680, {wxDC, getPixel, 2}}, - {681, {wxDC, getPPI, 0}}, - {683, {wxDC, getSize, 0}}, - {685, {wxDC, getSizeMM, 0}}, - {686, {wxDC, getTextBackground, 0}}, - {687, {wxDC, getTextExtent_4, 4}}, - {688, {wxDC, getTextExtent_1, 1}}, - {690, {wxDC, getTextForeground, 0}}, - {691, {wxDC, getUserScale, 2}}, - {692, {wxDC, gradientFillConcentric_3, 3}}, - {693, {wxDC, gradientFillConcentric_4, 4}}, - {694, {wxDC, gradientFillLinear, 4}}, - {695, {wxDC, logicalToDeviceX, 1}}, - {696, {wxDC, logicalToDeviceXRel, 1}}, - {697, {wxDC, logicalToDeviceY, 1}}, - {698, {wxDC, logicalToDeviceYRel, 1}}, - {699, {wxDC, maxX, 0}}, - {700, {wxDC, maxY, 0}}, - {701, {wxDC, minX, 0}}, - {702, {wxDC, minY, 0}}, - {703, {wxDC, isOk, 0}}, - {704, {wxDC, resetBoundingBox, 0}}, - {705, {wxDC, setAxisOrientation, 2}}, - {706, {wxDC, setBackground, 1}}, - {707, {wxDC, setBackgroundMode, 1}}, - {708, {wxDC, setBrush, 1}}, - {710, {wxDC, setClippingRegion_2, 2}}, - {711, {wxDC, setClippingRegion_1_1, 1}}, - {712, {wxDC, setClippingRegion_1_0, 1}}, - {713, {wxDC, setDeviceOrigin, 2}}, - {714, {wxDC, setFont, 1}}, - {715, {wxDC, setLayoutDirection, 1}}, - {716, {wxDC, setLogicalFunction, 1}}, - {717, {wxDC, setMapMode, 1}}, - {718, {wxDC, setPalette, 1}}, - {719, {wxDC, setPen, 1}}, - {720, {wxDC, setTextBackground, 1}}, - {721, {wxDC, setTextForeground, 1}}, - {722, {wxDC, setUserScale, 2}}, - {723, {wxDC, startDoc, 1}}, - {724, {wxDC, startPage, 0}}, - {725, {wxMirrorDC, new, 2}}, - {726, {wxMirrorDC, 'Destroy', undefined}}, - {727, {wxScreenDC, new, 0}}, - {728, {wxScreenDC, destruct, 0}}, - {729, {wxPostScriptDC, new_0, 0}}, - {730, {wxPostScriptDC, new_1, 1}}, - {731, {wxPostScriptDC, destruct, 0}}, - {732, {wxPostScriptDC, setResolution, 1}}, - {733, {wxPostScriptDC, getResolution, 0}}, - {734, {wxWindowDC, new_0, 0}}, - {735, {wxWindowDC, new_1, 1}}, - {736, {wxWindowDC, destruct, 0}}, - {737, {wxClientDC, new_0, 0}}, - {738, {wxClientDC, new_1, 1}}, - {739, {wxClientDC, 'Destroy', undefined}}, - {740, {wxPaintDC, new_0, 0}}, - {741, {wxPaintDC, new_1, 1}}, - {742, {wxPaintDC, 'Destroy', undefined}}, - {744, {wxMemoryDC, new_1_0, 1}}, - {745, {wxMemoryDC, new_1_1, 1}}, - {746, {wxMemoryDC, new_0, 0}}, - {748, {wxMemoryDC, destruct, 0}}, - {749, {wxMemoryDC, selectObject, 1}}, - {750, {wxMemoryDC, selectObjectAsSource, 1}}, - {751, {wxBufferedDC, new_0, 0}}, - {752, {wxBufferedDC, new_2, 2}}, - {753, {wxBufferedDC, new_3, 3}}, - {754, {wxBufferedDC, destruct, 0}}, - {755, {wxBufferedDC, init_2, 2}}, - {756, {wxBufferedDC, init_3, 3}}, - {757, {wxBufferedPaintDC, new_3, 3}}, - {758, {wxBufferedPaintDC, new_2, 2}}, - {759, {wxBufferedPaintDC, destruct, 0}}, - {760, {wxGraphicsObject, destruct, 0}}, - {761, {wxGraphicsObject, getRenderer, 0}}, - {762, {wxGraphicsObject, isNull, 0}}, - {763, {wxGraphicsContext, destruct, 0}}, - {764, {wxGraphicsContext, create_1_1, 1}}, - {765, {wxGraphicsContext, create_1_0, 1}}, - {766, {wxGraphicsContext, create_0, 0}}, - {767, {wxGraphicsContext, createPen, 1}}, - {768, {wxGraphicsContext, createBrush, 1}}, - {769, {wxGraphicsContext, createRadialGradientBrush, 7}}, - {770, {wxGraphicsContext, createLinearGradientBrush, 6}}, - {771, {wxGraphicsContext, createFont, 2}}, - {772, {wxGraphicsContext, createMatrix, 1}}, - {773, {wxGraphicsContext, createPath, 0}}, - {774, {wxGraphicsContext, clip_1, 1}}, - {775, {wxGraphicsContext, clip_4, 4}}, - {776, {wxGraphicsContext, resetClip, 0}}, - {777, {wxGraphicsContext, drawBitmap, 5}}, - {778, {wxGraphicsContext, drawEllipse, 4}}, - {779, {wxGraphicsContext, drawIcon, 5}}, - {780, {wxGraphicsContext, drawLines, 3}}, - {781, {wxGraphicsContext, drawPath, 2}}, - {782, {wxGraphicsContext, drawRectangle, 4}}, - {783, {wxGraphicsContext, drawRoundedRectangle, 5}}, - {784, {wxGraphicsContext, drawText_3, 3}}, - {785, {wxGraphicsContext, drawText_4_0, 4}}, - {786, {wxGraphicsContext, drawText_4_1, 4}}, - {787, {wxGraphicsContext, drawText_5, 5}}, - {788, {wxGraphicsContext, fillPath, 2}}, - {789, {wxGraphicsContext, strokePath, 1}}, - {790, {wxGraphicsContext, getPartialTextExtents, 2}}, - {791, {wxGraphicsContext, getTextExtent, 5}}, - {792, {wxGraphicsContext, rotate, 1}}, - {793, {wxGraphicsContext, scale, 2}}, - {794, {wxGraphicsContext, translate, 2}}, - {795, {wxGraphicsContext, getTransform, 0}}, - {796, {wxGraphicsContext, setTransform, 1}}, - {797, {wxGraphicsContext, concatTransform, 1}}, - {798, {wxGraphicsContext, setBrush_1_1, 1}}, - {799, {wxGraphicsContext, setBrush_1_0, 1}}, - {800, {wxGraphicsContext, setFont_1, 1}}, - {801, {wxGraphicsContext, setFont_2, 2}}, - {802, {wxGraphicsContext, setPen_1_0, 1}}, - {803, {wxGraphicsContext, setPen_1_1, 1}}, - {804, {wxGraphicsContext, strokeLine, 4}}, - {805, {wxGraphicsContext, strokeLines, 2}}, - {807, {wxGraphicsMatrix, concat, 1}}, - {809, {wxGraphicsMatrix, get, 1}}, - {810, {wxGraphicsMatrix, invert, 0}}, - {811, {wxGraphicsMatrix, isEqual, 1}}, - {813, {wxGraphicsMatrix, isIdentity, 0}}, - {814, {wxGraphicsMatrix, rotate, 1}}, - {815, {wxGraphicsMatrix, scale, 2}}, - {816, {wxGraphicsMatrix, translate, 2}}, - {817, {wxGraphicsMatrix, set, 1}}, - {818, {wxGraphicsMatrix, transformPoint, 2}}, - {819, {wxGraphicsMatrix, transformDistance, 2}}, - {820, {wxGraphicsPath, moveToPoint_2, 2}}, - {821, {wxGraphicsPath, moveToPoint_1, 1}}, - {822, {wxGraphicsPath, addArc_6, 6}}, - {823, {wxGraphicsPath, addArc_5, 5}}, - {824, {wxGraphicsPath, addArcToPoint, 5}}, - {825, {wxGraphicsPath, addCircle, 3}}, - {826, {wxGraphicsPath, addCurveToPoint_6, 6}}, - {827, {wxGraphicsPath, addCurveToPoint_3, 3}}, - {828, {wxGraphicsPath, addEllipse, 4}}, - {829, {wxGraphicsPath, addLineToPoint_2, 2}}, - {830, {wxGraphicsPath, addLineToPoint_1, 1}}, - {831, {wxGraphicsPath, addPath, 1}}, - {832, {wxGraphicsPath, addQuadCurveToPoint, 4}}, - {833, {wxGraphicsPath, addRectangle, 4}}, - {834, {wxGraphicsPath, addRoundedRectangle, 5}}, - {835, {wxGraphicsPath, closeSubpath, 0}}, - {836, {wxGraphicsPath, contains_3, 3}}, - {837, {wxGraphicsPath, contains_2, 2}}, - {839, {wxGraphicsPath, getBox, 0}}, - {841, {wxGraphicsPath, getCurrentPoint, 0}}, - {842, {wxGraphicsPath, transform, 1}}, - {843, {wxGraphicsRenderer, getDefaultRenderer, 0}}, - {844, {wxGraphicsRenderer, createContext_1_1, 1}}, - {845, {wxGraphicsRenderer, createContext_1_0, 1}}, - {846, {wxGraphicsRenderer, createPen, 1}}, - {847, {wxGraphicsRenderer, createBrush, 1}}, - {848, {wxGraphicsRenderer, createLinearGradientBrush, 6}}, - {849, {wxGraphicsRenderer, createRadialGradientBrush, 7}}, - {850, {wxGraphicsRenderer, createFont, 2}}, - {851, {wxGraphicsRenderer, createMatrix, 1}}, - {852, {wxGraphicsRenderer, createPath, 0}}, - {854, {wxMenuBar, new_1, 1}}, - {856, {wxMenuBar, new_0, 0}}, - {858, {wxMenuBar, destruct, 0}}, - {859, {wxMenuBar, append, 2}}, - {860, {wxMenuBar, check, 2}}, - {861, {wxMenuBar, enable_2, 2}}, - {862, {wxMenuBar, enable_1, 1}}, - {863, {wxMenuBar, enableTop, 2}}, - {864, {wxMenuBar, findMenu, 1}}, - {865, {wxMenuBar, findMenuItem, 2}}, - {866, {wxMenuBar, findItem, 2}}, - {867, {wxMenuBar, getHelpString, 1}}, - {868, {wxMenuBar, getLabel_1, 1}}, - {869, {wxMenuBar, getLabel_0, 0}}, - {870, {wxMenuBar, getLabelTop, 1}}, - {871, {wxMenuBar, getMenu, 1}}, - {872, {wxMenuBar, getMenuCount, 0}}, - {873, {wxMenuBar, insert, 3}}, - {874, {wxMenuBar, isChecked, 1}}, - {875, {wxMenuBar, isEnabled_1, 1}}, - {876, {wxMenuBar, isEnabled_0, 0}}, - {877, {wxMenuBar, remove, 1}}, - {878, {wxMenuBar, replace, 3}}, - {879, {wxMenuBar, setHelpString, 2}}, - {880, {wxMenuBar, setLabel_2, 2}}, - {881, {wxMenuBar, setLabel_1, 1}}, - {882, {wxMenuBar, setLabelTop, 2}}, - {883, {wxControl, getLabel, 0}}, - {884, {wxControl, setLabel, 1}}, - {885, {wxControlWithItems, append_1, 1}}, - {886, {wxControlWithItems, append_2, 2}}, - {887, {wxControlWithItems, appendStrings_1, 1}}, - {888, {wxControlWithItems, clear, 0}}, - {889, {wxControlWithItems, delete, 1}}, - {890, {wxControlWithItems, findString, 2}}, - {891, {wxControlWithItems, getClientData, 1}}, - {892, {wxControlWithItems, setClientData, 2}}, - {893, {wxControlWithItems, getCount, 0}}, - {894, {wxControlWithItems, getSelection, 0}}, - {895, {wxControlWithItems, getString, 1}}, - {896, {wxControlWithItems, getStringSelection, 0}}, - {897, {wxControlWithItems, insert_2, 2}}, - {898, {wxControlWithItems, insert_3, 3}}, - {899, {wxControlWithItems, isEmpty, 0}}, - {900, {wxControlWithItems, select, 1}}, - {901, {wxControlWithItems, setSelection, 1}}, - {902, {wxControlWithItems, setString, 2}}, - {903, {wxControlWithItems, setStringSelection, 1}}, - {906, {wxMenu, new_2, 2}}, - {907, {wxMenu, new_1, 1}}, - {909, {wxMenu, destruct, 0}}, - {910, {wxMenu, append_3, 3}}, - {911, {wxMenu, append_1, 1}}, - {912, {wxMenu, append_4_0, 4}}, - {913, {wxMenu, append_4_1, 4}}, - {914, {wxMenu, appendCheckItem, 3}}, - {915, {wxMenu, appendRadioItem, 3}}, - {916, {wxMenu, appendSeparator, 0}}, - {917, {wxMenu, break, 0}}, - {918, {wxMenu, check, 2}}, - {919, {wxMenu, delete_1_0, 1}}, - {920, {wxMenu, delete_1_1, 1}}, - {921, {wxMenu, destroy_1_0, 1}}, - {922, {wxMenu, destroy_1_1, 1}}, - {923, {wxMenu, enable, 2}}, - {924, {wxMenu, findItem_1, 1}}, - {925, {wxMenu, findItem_2, 2}}, - {926, {wxMenu, findItemByPosition, 1}}, - {927, {wxMenu, getHelpString, 1}}, - {928, {wxMenu, getLabel, 1}}, - {929, {wxMenu, getMenuItemCount, 0}}, - {930, {wxMenu, getMenuItems, 0}}, - {932, {wxMenu, getTitle, 0}}, - {933, {wxMenu, insert_2, 2}}, - {934, {wxMenu, insert_3, 3}}, - {935, {wxMenu, insert_5_1, 5}}, - {936, {wxMenu, insert_5_0, 5}}, - {937, {wxMenu, insertCheckItem, 4}}, - {938, {wxMenu, insertRadioItem, 4}}, - {939, {wxMenu, insertSeparator, 1}}, - {940, {wxMenu, isChecked, 1}}, - {941, {wxMenu, isEnabled, 1}}, - {942, {wxMenu, prepend_1, 1}}, - {943, {wxMenu, prepend_2, 2}}, - {944, {wxMenu, prepend_4_1, 4}}, - {945, {wxMenu, prepend_4_0, 4}}, - {946, {wxMenu, prependCheckItem, 3}}, - {947, {wxMenu, prependRadioItem, 3}}, - {948, {wxMenu, prependSeparator, 0}}, - {949, {wxMenu, remove_1_0, 1}}, - {950, {wxMenu, remove_1_1, 1}}, - {951, {wxMenu, setHelpString, 2}}, - {952, {wxMenu, setLabel, 2}}, - {953, {wxMenu, setTitle, 1}}, - {954, {wxMenuItem, new, 1}}, - {956, {wxMenuItem, destruct, 0}}, - {957, {wxMenuItem, check, 1}}, - {958, {wxMenuItem, enable, 1}}, - {959, {wxMenuItem, getBitmap, 0}}, - {960, {wxMenuItem, getHelp, 0}}, - {961, {wxMenuItem, getId, 0}}, - {962, {wxMenuItem, getKind, 0}}, - {963, {wxMenuItem, getLabel, 0}}, - {964, {wxMenuItem, getLabelFromText, 1}}, - {965, {wxMenuItem, getMenu, 0}}, - {966, {wxMenuItem, getText, 0}}, - {967, {wxMenuItem, getSubMenu, 0}}, - {968, {wxMenuItem, isCheckable, 0}}, - {969, {wxMenuItem, isChecked, 0}}, - {970, {wxMenuItem, isEnabled, 0}}, - {971, {wxMenuItem, isSeparator, 0}}, - {972, {wxMenuItem, isSubMenu, 0}}, - {973, {wxMenuItem, setBitmap, 1}}, - {974, {wxMenuItem, setHelp, 1}}, - {975, {wxMenuItem, setMenu, 1}}, - {976, {wxMenuItem, setSubMenu, 1}}, - {977, {wxMenuItem, setText, 1}}, - {978, {wxToolBar, addControl, 1}}, - {979, {wxToolBar, addSeparator, 0}}, - {980, {wxToolBar, addTool_5, 5}}, - {981, {wxToolBar, addTool_4_0, 4}}, - {982, {wxToolBar, addTool_1, 1}}, - {983, {wxToolBar, addTool_4_1, 4}}, - {984, {wxToolBar, addTool_3, 3}}, - {985, {wxToolBar, addTool_6, 6}}, - {986, {wxToolBar, addCheckTool, 4}}, - {987, {wxToolBar, addRadioTool, 4}}, - {988, {wxToolBar, addStretchableSpace, 0}}, - {989, {wxToolBar, insertStretchableSpace, 1}}, - {990, {wxToolBar, deleteTool, 1}}, - {991, {wxToolBar, deleteToolByPos, 1}}, - {992, {wxToolBar, enableTool, 2}}, - {993, {wxToolBar, findById, 1}}, - {994, {wxToolBar, findControl, 1}}, - {995, {wxToolBar, findToolForPosition, 2}}, - {996, {wxToolBar, getToolSize, 0}}, - {997, {wxToolBar, getToolBitmapSize, 0}}, - {998, {wxToolBar, getMargins, 0}}, - {999, {wxToolBar, getToolEnabled, 1}}, - {1000, {wxToolBar, getToolLongHelp, 1}}, - {1001, {wxToolBar, getToolPacking, 0}}, - {1002, {wxToolBar, getToolPos, 1}}, - {1003, {wxToolBar, getToolSeparation, 0}}, - {1004, {wxToolBar, getToolShortHelp, 1}}, - {1005, {wxToolBar, getToolState, 1}}, - {1006, {wxToolBar, insertControl, 2}}, - {1007, {wxToolBar, insertSeparator, 1}}, - {1008, {wxToolBar, insertTool_5, 5}}, - {1009, {wxToolBar, insertTool_2, 2}}, - {1010, {wxToolBar, insertTool_4, 4}}, - {1011, {wxToolBar, realize, 0}}, - {1012, {wxToolBar, removeTool, 1}}, - {1013, {wxToolBar, setMargins, 2}}, - {1014, {wxToolBar, setToolBitmapSize, 1}}, - {1015, {wxToolBar, setToolLongHelp, 2}}, - {1016, {wxToolBar, setToolPacking, 1}}, - {1017, {wxToolBar, setToolShortHelp, 2}}, - {1018, {wxToolBar, setToolSeparation, 1}}, - {1019, {wxToolBar, toggleTool, 2}}, - {1021, {wxStatusBar, new_0, 0}}, - {1022, {wxStatusBar, new_2, 2}}, - {1024, {wxStatusBar, destruct, 0}}, - {1025, {wxStatusBar, create, 2}}, - {1026, {wxStatusBar, getFieldRect, 2}}, - {1027, {wxStatusBar, getFieldsCount, 0}}, - {1028, {wxStatusBar, getStatusText, 1}}, - {1029, {wxStatusBar, popStatusText, 1}}, - {1030, {wxStatusBar, pushStatusText, 2}}, - {1031, {wxStatusBar, setFieldsCount, 2}}, - {1032, {wxStatusBar, setMinHeight, 1}}, - {1033, {wxStatusBar, setStatusText, 2}}, - {1034, {wxStatusBar, setStatusWidths, 2}}, - {1035, {wxStatusBar, setStatusStyles, 2}}, - {1036, {wxBitmap, new_0, 0}}, - {1037, {wxBitmap, new_3, 3}}, - {1038, {wxBitmap, new_4, 4}}, - {1039, {wxBitmap, new_2_0, 2}}, - {1040, {wxBitmap, new_2_1, 2}}, - {1041, {wxBitmap, destruct, 0}}, - {1042, {wxBitmap, convertToImage, 0}}, - {1043, {wxBitmap, copyFromIcon, 1}}, - {1044, {wxBitmap, create, 3}}, - {1045, {wxBitmap, getDepth, 0}}, - {1046, {wxBitmap, getHeight, 0}}, - {1047, {wxBitmap, getPalette, 0}}, - {1048, {wxBitmap, getMask, 0}}, - {1049, {wxBitmap, getWidth, 0}}, - {1050, {wxBitmap, getSubBitmap, 1}}, - {1051, {wxBitmap, loadFile, 2}}, - {1052, {wxBitmap, ok, 0}}, - {1053, {wxBitmap, saveFile, 3}}, - {1054, {wxBitmap, setDepth, 1}}, - {1055, {wxBitmap, setHeight, 1}}, - {1056, {wxBitmap, setMask, 1}}, - {1057, {wxBitmap, setPalette, 1}}, - {1058, {wxBitmap, setWidth, 1}}, - {1059, {wxIcon, new_0, 0}}, - {1060, {wxIcon, new_2, 2}}, - {1061, {wxIcon, new_1, 1}}, - {1062, {wxIcon, copyFromBitmap, 1}}, - {1063, {wxIcon, 'Destroy', undefined}}, - {1064, {wxIconBundle, new_0, 0}}, - {1065, {wxIconBundle, new_2, 2}}, - {1066, {wxIconBundle, new_1_0, 1}}, - {1067, {wxIconBundle, new_1_1, 1}}, - {1068, {wxIconBundle, destruct, 0}}, - {1069, {wxIconBundle, addIcon_2, 2}}, - {1070, {wxIconBundle, addIcon_1, 1}}, - {1071, {wxIconBundle, getIcon_1_1, 1}}, - {1072, {wxIconBundle, getIcon_1_0, 1}}, - {1073, {wxCursor, new_0, 0}}, - {1074, {wxCursor, new_1_0, 1}}, - {1075, {wxCursor, new_1_1, 1}}, - {1076, {wxCursor, new_4, 4}}, - {1077, {wxCursor, destruct, 0}}, - {1078, {wxCursor, ok, 0}}, - {1079, {wxMask, new_0, 0}}, - {1080, {wxMask, new_2_1, 2}}, - {1081, {wxMask, new_2_0, 2}}, - {1082, {wxMask, new_1, 1}}, - {1083, {wxMask, destruct, 0}}, - {1084, {wxMask, create_2_1, 2}}, - {1085, {wxMask, create_2_0, 2}}, - {1086, {wxMask, create_1, 1}}, - {1087, {wxImage, new_0, 0}}, - {1088, {wxImage, new_3_0, 3}}, - {1089, {wxImage, new_4, 4}}, - {1090, {wxImage, new_5, 5}}, - {1091, {wxImage, new_2, 2}}, - {1092, {wxImage, new_3_1, 3}}, - {1093, {wxImage, blur, 1}}, - {1094, {wxImage, blurHorizontal, 1}}, - {1095, {wxImage, blurVertical, 1}}, - {1096, {wxImage, convertAlphaToMask, 1}}, - {1097, {wxImage, convertToGreyscale, 1}}, - {1098, {wxImage, convertToMono, 3}}, - {1099, {wxImage, copy, 0}}, - {1100, {wxImage, create_3, 3}}, - {1101, {wxImage, create_4, 4}}, - {1102, {wxImage, create_5, 5}}, - {1103, {wxImage, 'Destroy', 0}}, - {1104, {wxImage, findFirstUnusedColour, 4}}, - {1105, {wxImage, getImageExtWildcard, 0}}, - {1106, {wxImage, getAlpha_2, 2}}, - {1107, {wxImage, getAlpha_0, 0}}, - {1108, {wxImage, getBlue, 2}}, - {1109, {wxImage, getData, 0}}, - {1110, {wxImage, getGreen, 2}}, - {1111, {wxImage, getImageCount, 2}}, - {1112, {wxImage, getHeight, 0}}, - {1113, {wxImage, getMaskBlue, 0}}, - {1114, {wxImage, getMaskGreen, 0}}, - {1115, {wxImage, getMaskRed, 0}}, - {1116, {wxImage, getOrFindMaskColour, 3}}, - {1117, {wxImage, getPalette, 0}}, - {1118, {wxImage, getRed, 2}}, - {1119, {wxImage, getSubImage, 1}}, - {1120, {wxImage, getWidth, 0}}, - {1121, {wxImage, hasAlpha, 0}}, - {1122, {wxImage, hasMask, 0}}, - {1123, {wxImage, getOption, 1}}, - {1124, {wxImage, getOptionInt, 1}}, - {1125, {wxImage, hasOption, 1}}, - {1126, {wxImage, initAlpha, 0}}, - {1127, {wxImage, initStandardHandlers, 0}}, - {1128, {wxImage, isTransparent, 3}}, - {1129, {wxImage, loadFile_2, 2}}, - {1130, {wxImage, loadFile_3, 3}}, - {1131, {wxImage, ok, 0}}, - {1132, {wxImage, removeHandler, 1}}, - {1133, {wxImage, mirror, 1}}, - {1134, {wxImage, replace, 6}}, - {1135, {wxImage, rescale, 3}}, - {1136, {wxImage, resize, 3}}, - {1137, {wxImage, rotate, 3}}, - {1138, {wxImage, rotateHue, 1}}, - {1139, {wxImage, rotate90, 1}}, - {1140, {wxImage, saveFile_1, 1}}, - {1141, {wxImage, saveFile_2_0, 2}}, - {1142, {wxImage, saveFile_2_1, 2}}, - {1143, {wxImage, scale, 3}}, - {1144, {wxImage, size, 3}}, - {1145, {wxImage, setAlpha_3, 3}}, - {1146, {wxImage, setAlpha_2, 2}}, - {1147, {wxImage, setData_2, 2}}, - {1148, {wxImage, setData_4, 4}}, - {1149, {wxImage, setMask, 1}}, - {1150, {wxImage, setMaskColour, 3}}, - {1151, {wxImage, setMaskFromImage, 4}}, - {1152, {wxImage, setOption_2_1, 2}}, - {1153, {wxImage, setOption_2_0, 2}}, - {1154, {wxImage, setPalette, 1}}, - {1155, {wxImage, setRGB_5, 5}}, - {1156, {wxImage, setRGB_4, 4}}, - {1157, {wxImage, 'Destroy', undefined}}, - {1158, {wxBrush, new_0, 0}}, - {1159, {wxBrush, new_2, 2}}, - {1160, {wxBrush, new_1, 1}}, - {1162, {wxBrush, destruct, 0}}, - {1163, {wxBrush, getColour, 0}}, - {1164, {wxBrush, getStipple, 0}}, - {1165, {wxBrush, getStyle, 0}}, - {1166, {wxBrush, isHatch, 0}}, - {1167, {wxBrush, isOk, 0}}, - {1168, {wxBrush, setColour_1, 1}}, - {1169, {wxBrush, setColour_3, 3}}, - {1170, {wxBrush, setStipple, 1}}, - {1171, {wxBrush, setStyle, 1}}, - {1172, {wxPen, new_0, 0}}, - {1173, {wxPen, new_2, 2}}, - {1174, {wxPen, destruct, 0}}, - {1175, {wxPen, getCap, 0}}, - {1176, {wxPen, getColour, 0}}, - {1177, {wxPen, getJoin, 0}}, - {1178, {wxPen, getStyle, 0}}, - {1179, {wxPen, getWidth, 0}}, - {1180, {wxPen, isOk, 0}}, - {1181, {wxPen, setCap, 1}}, - {1182, {wxPen, setColour_1, 1}}, - {1183, {wxPen, setColour_3, 3}}, - {1184, {wxPen, setJoin, 1}}, - {1185, {wxPen, setStyle, 1}}, - {1186, {wxPen, setWidth, 1}}, - {1187, {wxRegion, new_0, 0}}, - {1188, {wxRegion, new_4, 4}}, - {1189, {wxRegion, new_2, 2}}, - {1190, {wxRegion, new_1_1, 1}}, - {1192, {wxRegion, new_1_0, 1}}, - {1194, {wxRegion, destruct, 0}}, - {1195, {wxRegion, clear, 0}}, - {1196, {wxRegion, contains_2, 2}}, - {1197, {wxRegion, contains_1_0, 1}}, - {1198, {wxRegion, contains_4, 4}}, - {1199, {wxRegion, contains_1_1, 1}}, - {1200, {wxRegion, convertToBitmap, 0}}, - {1201, {wxRegion, getBox, 0}}, - {1202, {wxRegion, intersect_4, 4}}, - {1203, {wxRegion, intersect_1_1, 1}}, - {1204, {wxRegion, intersect_1_0, 1}}, - {1205, {wxRegion, isEmpty, 0}}, - {1206, {wxRegion, subtract_4, 4}}, - {1207, {wxRegion, subtract_1_1, 1}}, - {1208, {wxRegion, subtract_1_0, 1}}, - {1209, {wxRegion, offset_2, 2}}, - {1210, {wxRegion, offset_1, 1}}, - {1211, {wxRegion, union_4, 4}}, - {1212, {wxRegion, union_1_2, 1}}, - {1213, {wxRegion, union_1_1, 1}}, - {1214, {wxRegion, union_1_0, 1}}, - {1215, {wxRegion, union_3, 3}}, - {1216, {wxRegion, xor_4, 4}}, - {1217, {wxRegion, xor_1_1, 1}}, - {1218, {wxRegion, xor_1_0, 1}}, - {1219, {wxAcceleratorTable, new_0, 0}}, - {1220, {wxAcceleratorTable, new_2, 2}}, - {1221, {wxAcceleratorTable, destruct, 0}}, - {1222, {wxAcceleratorTable, ok, 0}}, - {1223, {wxAcceleratorEntry, new_1_0, 1}}, - {1224, {wxAcceleratorEntry, new_1_1, 1}}, - {1225, {wxAcceleratorEntry, getCommand, 0}}, - {1226, {wxAcceleratorEntry, getFlags, 0}}, - {1227, {wxAcceleratorEntry, getKeyCode, 0}}, - {1228, {wxAcceleratorEntry, set, 4}}, - {1229, {wxAcceleratorEntry, 'Destroy', undefined}}, - {1234, {wxCaret, new_3, 3}}, - {1235, {wxCaret, new_2, 2}}, - {1237, {wxCaret, destruct, 0}}, - {1238, {wxCaret, create_3, 3}}, - {1239, {wxCaret, create_2, 2}}, - {1240, {wxCaret, getBlinkTime, 0}}, - {1242, {wxCaret, getPosition, 0}}, - {1244, {wxCaret, getSize, 0}}, - {1245, {wxCaret, getWindow, 0}}, - {1246, {wxCaret, hide, 0}}, - {1247, {wxCaret, isOk, 0}}, - {1248, {wxCaret, isVisible, 0}}, - {1249, {wxCaret, move_2, 2}}, - {1250, {wxCaret, move_1, 1}}, - {1251, {wxCaret, setBlinkTime, 1}}, - {1252, {wxCaret, setSize_2, 2}}, - {1253, {wxCaret, setSize_1, 1}}, - {1254, {wxCaret, show, 1}}, - {1255, {wxSizer, add_2_1, 2}}, - {1256, {wxSizer, add_2_0, 2}}, - {1257, {wxSizer, add_3, 3}}, - {1258, {wxSizer, add_2_3, 2}}, - {1259, {wxSizer, add_2_2, 2}}, - {1260, {wxSizer, addSpacer, 1}}, - {1261, {wxSizer, addStretchSpacer, 1}}, - {1262, {wxSizer, calcMin, 0}}, - {1263, {wxSizer, clear, 1}}, - {1264, {wxSizer, detach_1_2, 1}}, - {1265, {wxSizer, detach_1_1, 1}}, - {1266, {wxSizer, detach_1_0, 1}}, - {1267, {wxSizer, fit, 1}}, - {1268, {wxSizer, fitInside, 1}}, - {1269, {wxSizer, getChildren, 0}}, - {1270, {wxSizer, getItem_2_1, 2}}, - {1271, {wxSizer, getItem_2_0, 2}}, - {1272, {wxSizer, getItem_1, 1}}, - {1273, {wxSizer, getSize, 0}}, - {1274, {wxSizer, getPosition, 0}}, - {1275, {wxSizer, getMinSize, 0}}, - {1276, {wxSizer, hide_2_0, 2}}, - {1277, {wxSizer, hide_2_1, 2}}, - {1278, {wxSizer, hide_1, 1}}, - {1279, {wxSizer, insert_3_1, 3}}, - {1280, {wxSizer, insert_3_0, 3}}, - {1281, {wxSizer, insert_4, 4}}, - {1282, {wxSizer, insert_3_3, 3}}, - {1283, {wxSizer, insert_3_2, 3}}, - {1284, {wxSizer, insert_2, 2}}, - {1285, {wxSizer, insertSpacer, 2}}, - {1286, {wxSizer, insertStretchSpacer, 2}}, - {1287, {wxSizer, isShown_1_2, 1}}, - {1288, {wxSizer, isShown_1_1, 1}}, - {1289, {wxSizer, isShown_1_0, 1}}, - {1290, {wxSizer, layout, 0}}, - {1291, {wxSizer, prepend_2_1, 2}}, - {1292, {wxSizer, prepend_2_0, 2}}, - {1293, {wxSizer, prepend_3, 3}}, - {1294, {wxSizer, prepend_2_3, 2}}, - {1295, {wxSizer, prepend_2_2, 2}}, - {1296, {wxSizer, prepend_1, 1}}, - {1297, {wxSizer, prependSpacer, 1}}, - {1298, {wxSizer, prependStretchSpacer, 1}}, - {1299, {wxSizer, recalcSizes, 0}}, - {1300, {wxSizer, remove_1_1, 1}}, - {1301, {wxSizer, remove_1_0, 1}}, - {1302, {wxSizer, replace_3_1, 3}}, - {1303, {wxSizer, replace_3_0, 3}}, - {1304, {wxSizer, replace_2, 2}}, - {1305, {wxSizer, setDimension, 4}}, - {1306, {wxSizer, setMinSize_2, 2}}, - {1307, {wxSizer, setMinSize_1, 1}}, - {1308, {wxSizer, setItemMinSize_3_2, 3}}, - {1309, {wxSizer, setItemMinSize_2_2, 2}}, - {1310, {wxSizer, setItemMinSize_3_1, 3}}, - {1311, {wxSizer, setItemMinSize_2_1, 2}}, - {1312, {wxSizer, setItemMinSize_3_0, 3}}, - {1313, {wxSizer, setItemMinSize_2_0, 2}}, - {1314, {wxSizer, setSizeHints, 1}}, - {1315, {wxSizer, setVirtualSizeHints, 1}}, - {1316, {wxSizer, show_2_2, 2}}, - {1317, {wxSizer, show_2_1, 2}}, - {1318, {wxSizer, show_2_0, 2}}, - {1319, {wxSizer, show_1, 1}}, - {1320, {wxSizerFlags, new, 1}}, - {1321, {wxSizerFlags, align, 1}}, - {1322, {wxSizerFlags, border_2, 2}}, - {1323, {wxSizerFlags, border_1, 1}}, - {1324, {wxSizerFlags, center, 0}}, - {1325, {wxSizerFlags, centre, 0}}, - {1326, {wxSizerFlags, expand, 0}}, - {1327, {wxSizerFlags, left, 0}}, - {1328, {wxSizerFlags, proportion, 1}}, - {1329, {wxSizerFlags, right, 0}}, - {1330, {wxSizerFlags, 'Destroy', undefined}}, - {1331, {wxSizerItem, new_5_1, 5}}, - {1332, {wxSizerItem, new_2_1, 2}}, - {1333, {wxSizerItem, new_5_0, 5}}, - {1334, {wxSizerItem, new_2_0, 2}}, - {1335, {wxSizerItem, new_6, 6}}, - {1336, {wxSizerItem, new_3, 3}}, - {1337, {wxSizerItem, new_0, 0}}, - {1338, {wxSizerItem, destruct, 0}}, - {1339, {wxSizerItem, calcMin, 0}}, - {1340, {wxSizerItem, deleteWindows, 0}}, - {1341, {wxSizerItem, detachSizer, 0}}, - {1342, {wxSizerItem, getBorder, 0}}, - {1343, {wxSizerItem, getFlag, 0}}, - {1344, {wxSizerItem, getMinSize, 0}}, - {1345, {wxSizerItem, getPosition, 0}}, - {1346, {wxSizerItem, getProportion, 0}}, - {1347, {wxSizerItem, getRatio, 0}}, - {1348, {wxSizerItem, getRect, 0}}, - {1349, {wxSizerItem, getSize, 0}}, - {1350, {wxSizerItem, getSizer, 0}}, - {1351, {wxSizerItem, getSpacer, 0}}, - {1352, {wxSizerItem, getUserData, 0}}, - {1353, {wxSizerItem, getWindow, 0}}, - {1354, {wxSizerItem, isSizer, 0}}, - {1355, {wxSizerItem, isShown, 0}}, - {1356, {wxSizerItem, isSpacer, 0}}, - {1357, {wxSizerItem, isWindow, 0}}, - {1358, {wxSizerItem, setBorder, 1}}, - {1359, {wxSizerItem, setDimension, 2}}, - {1360, {wxSizerItem, setFlag, 1}}, - {1361, {wxSizerItem, setInitSize, 2}}, - {1362, {wxSizerItem, setMinSize_1, 1}}, - {1363, {wxSizerItem, setMinSize_2, 2}}, - {1364, {wxSizerItem, setProportion, 1}}, - {1365, {wxSizerItem, setRatio_2, 2}}, - {1366, {wxSizerItem, setRatio_1_1, 1}}, - {1367, {wxSizerItem, setRatio_1_0, 1}}, - {1368, {wxSizerItem, setSizer, 1}}, - {1369, {wxSizerItem, setSpacer_1, 1}}, - {1370, {wxSizerItem, setSpacer_2, 2}}, - {1371, {wxSizerItem, setWindow, 1}}, - {1372, {wxSizerItem, show, 1}}, - {1373, {wxBoxSizer, new, 1}}, - {1374, {wxBoxSizer, getOrientation, 0}}, - {1375, {wxBoxSizer, 'Destroy', undefined}}, - {1376, {wxStaticBoxSizer, new_2, 2}}, - {1377, {wxStaticBoxSizer, new_3, 3}}, - {1378, {wxStaticBoxSizer, getStaticBox, 0}}, - {1379, {wxStaticBoxSizer, 'Destroy', undefined}}, - {1380, {wxGridSizer, new_4, 4}}, - {1381, {wxGridSizer, new_2, 2}}, - {1382, {wxGridSizer, getCols, 0}}, - {1383, {wxGridSizer, getHGap, 0}}, - {1384, {wxGridSizer, getRows, 0}}, - {1385, {wxGridSizer, getVGap, 0}}, - {1386, {wxGridSizer, setCols, 1}}, - {1387, {wxGridSizer, setHGap, 1}}, - {1388, {wxGridSizer, setRows, 1}}, - {1389, {wxGridSizer, setVGap, 1}}, - {1390, {wxGridSizer, 'Destroy', undefined}}, - {1391, {wxFlexGridSizer, new_4, 4}}, - {1392, {wxFlexGridSizer, new_2, 2}}, - {1393, {wxFlexGridSizer, addGrowableCol, 2}}, - {1394, {wxFlexGridSizer, addGrowableRow, 2}}, - {1395, {wxFlexGridSizer, getFlexibleDirection, 0}}, - {1396, {wxFlexGridSizer, getNonFlexibleGrowMode, 0}}, - {1397, {wxFlexGridSizer, removeGrowableCol, 1}}, - {1398, {wxFlexGridSizer, removeGrowableRow, 1}}, - {1399, {wxFlexGridSizer, setFlexibleDirection, 1}}, - {1400, {wxFlexGridSizer, setNonFlexibleGrowMode, 1}}, - {1401, {wxFlexGridSizer, 'Destroy', undefined}}, - {1402, {wxGridBagSizer, new, 1}}, - {1403, {wxGridBagSizer, add_3_2, 3}}, - {1404, {wxGridBagSizer, add_3_1, 3}}, - {1405, {wxGridBagSizer, add_4, 4}}, - {1406, {wxGridBagSizer, add_1_0, 1}}, - {1407, {wxGridBagSizer, add_2_1, 2}}, - {1408, {wxGridBagSizer, add_2_0, 2}}, - {1409, {wxGridBagSizer, add_3_0, 3}}, - {1410, {wxGridBagSizer, add_1_1, 1}}, - {1411, {wxGridBagSizer, calcMin, 0}}, - {1412, {wxGridBagSizer, checkForIntersection_2, 2}}, - {1413, {wxGridBagSizer, checkForIntersection_3, 3}}, - {1414, {wxGridBagSizer, findItem_1_1, 1}}, - {1415, {wxGridBagSizer, findItem_1_0, 1}}, - {1416, {wxGridBagSizer, findItemAtPoint, 1}}, - {1417, {wxGridBagSizer, findItemAtPosition, 1}}, - {1418, {wxGridBagSizer, findItemWithData, 1}}, - {1419, {wxGridBagSizer, getCellSize, 2}}, - {1420, {wxGridBagSizer, getEmptyCellSize, 0}}, - {1421, {wxGridBagSizer, getItemPosition_1_2, 1}}, - {1422, {wxGridBagSizer, getItemPosition_1_1, 1}}, - {1423, {wxGridBagSizer, getItemPosition_1_0, 1}}, - {1424, {wxGridBagSizer, getItemSpan_1_2, 1}}, - {1425, {wxGridBagSizer, getItemSpan_1_1, 1}}, - {1426, {wxGridBagSizer, getItemSpan_1_0, 1}}, - {1427, {wxGridBagSizer, setEmptyCellSize, 1}}, - {1428, {wxGridBagSizer, setItemPosition_2_2, 2}}, - {1429, {wxGridBagSizer, setItemPosition_2_1, 2}}, - {1430, {wxGridBagSizer, setItemPosition_2_0, 2}}, - {1431, {wxGridBagSizer, setItemSpan_2_2, 2}}, - {1432, {wxGridBagSizer, setItemSpan_2_1, 2}}, - {1433, {wxGridBagSizer, setItemSpan_2_0, 2}}, - {1434, {wxGridBagSizer, 'Destroy', undefined}}, - {1435, {wxStdDialogButtonSizer, new, 0}}, - {1436, {wxStdDialogButtonSizer, addButton, 1}}, - {1437, {wxStdDialogButtonSizer, realize, 0}}, - {1438, {wxStdDialogButtonSizer, setAffirmativeButton, 1}}, - {1439, {wxStdDialogButtonSizer, setCancelButton, 1}}, - {1440, {wxStdDialogButtonSizer, setNegativeButton, 1}}, - {1441, {wxStdDialogButtonSizer, 'Destroy', undefined}}, - {1442, {wxFont, new_0, 0}}, - {1443, {wxFont, new_1, 1}}, - {1444, {wxFont, new_5, 5}}, - {1446, {wxFont, destruct, 0}}, - {1447, {wxFont, isFixedWidth, 0}}, - {1448, {wxFont, getDefaultEncoding, 0}}, - {1449, {wxFont, getFaceName, 0}}, - {1450, {wxFont, getFamily, 0}}, - {1451, {wxFont, getNativeFontInfoDesc, 0}}, - {1452, {wxFont, getNativeFontInfoUserDesc, 0}}, - {1453, {wxFont, getPointSize, 0}}, - {1454, {wxFont, getStyle, 0}}, - {1455, {wxFont, getUnderlined, 0}}, - {1456, {wxFont, getWeight, 0}}, - {1457, {wxFont, ok, 0}}, - {1458, {wxFont, setDefaultEncoding, 1}}, - {1459, {wxFont, setFaceName, 1}}, - {1460, {wxFont, setFamily, 1}}, - {1461, {wxFont, setPointSize, 1}}, - {1462, {wxFont, setStyle, 1}}, - {1463, {wxFont, setUnderlined, 1}}, - {1464, {wxFont, setWeight, 1}}, - {1465, {wxToolTip, enable, 1}}, - {1466, {wxToolTip, setDelay, 1}}, - {1467, {wxToolTip, new, 1}}, - {1468, {wxToolTip, setTip, 1}}, - {1469, {wxToolTip, getTip, 0}}, - {1470, {wxToolTip, getWindow, 0}}, - {1471, {wxToolTip, 'Destroy', undefined}}, - {1473, {wxButton, new_3, 3}}, - {1474, {wxButton, new_0, 0}}, - {1475, {wxButton, destruct, 0}}, - {1476, {wxButton, create, 3}}, - {1477, {wxButton, getDefaultSize, 0}}, - {1478, {wxButton, setDefault, 0}}, - {1479, {wxButton, setLabel, 1}}, - {1481, {wxBitmapButton, new_4, 4}}, - {1482, {wxBitmapButton, new_0, 0}}, - {1483, {wxBitmapButton, create, 4}}, - {1484, {wxBitmapButton, getBitmapDisabled, 0}}, - {1486, {wxBitmapButton, getBitmapFocus, 0}}, - {1488, {wxBitmapButton, getBitmapLabel, 0}}, - {1490, {wxBitmapButton, getBitmapSelected, 0}}, - {1492, {wxBitmapButton, setBitmapDisabled, 1}}, - {1493, {wxBitmapButton, setBitmapFocus, 1}}, - {1494, {wxBitmapButton, setBitmapLabel, 1}}, - {1495, {wxBitmapButton, setBitmapSelected, 1}}, - {1496, {wxBitmapButton, 'Destroy', undefined}}, - {1497, {wxToggleButton, new_0, 0}}, - {1498, {wxToggleButton, new_4, 4}}, - {1499, {wxToggleButton, create, 4}}, - {1500, {wxToggleButton, getValue, 0}}, - {1501, {wxToggleButton, setValue, 1}}, - {1502, {wxToggleButton, 'Destroy', undefined}}, - {1503, {wxCalendarCtrl, new_0, 0}}, - {1504, {wxCalendarCtrl, new_3, 3}}, - {1505, {wxCalendarCtrl, create, 3}}, - {1506, {wxCalendarCtrl, destruct, 0}}, - {1507, {wxCalendarCtrl, setDate, 1}}, - {1508, {wxCalendarCtrl, getDate, 0}}, - {1509, {wxCalendarCtrl, enableYearChange, 1}}, - {1510, {wxCalendarCtrl, enableMonthChange, 1}}, - {1511, {wxCalendarCtrl, enableHolidayDisplay, 1}}, - {1512, {wxCalendarCtrl, setHeaderColours, 2}}, - {1513, {wxCalendarCtrl, getHeaderColourFg, 0}}, - {1514, {wxCalendarCtrl, getHeaderColourBg, 0}}, - {1515, {wxCalendarCtrl, setHighlightColours, 2}}, - {1516, {wxCalendarCtrl, getHighlightColourFg, 0}}, - {1517, {wxCalendarCtrl, getHighlightColourBg, 0}}, - {1518, {wxCalendarCtrl, setHolidayColours, 2}}, - {1519, {wxCalendarCtrl, getHolidayColourFg, 0}}, - {1520, {wxCalendarCtrl, getHolidayColourBg, 0}}, - {1521, {wxCalendarCtrl, getAttr, 1}}, - {1522, {wxCalendarCtrl, setAttr, 2}}, - {1523, {wxCalendarCtrl, setHoliday, 1}}, - {1524, {wxCalendarCtrl, resetAttr, 1}}, - {1525, {wxCalendarCtrl, hitTest, 2}}, - {1526, {wxCalendarDateAttr, new_0, 0}}, - {1527, {wxCalendarDateAttr, new_2_1, 2}}, - {1528, {wxCalendarDateAttr, new_2_0, 2}}, - {1529, {wxCalendarDateAttr, setTextColour, 1}}, - {1530, {wxCalendarDateAttr, setBackgroundColour, 1}}, - {1531, {wxCalendarDateAttr, setBorderColour, 1}}, - {1532, {wxCalendarDateAttr, setFont, 1}}, - {1533, {wxCalendarDateAttr, setBorder, 1}}, - {1534, {wxCalendarDateAttr, setHoliday, 1}}, - {1535, {wxCalendarDateAttr, hasTextColour, 0}}, - {1536, {wxCalendarDateAttr, hasBackgroundColour, 0}}, - {1537, {wxCalendarDateAttr, hasBorderColour, 0}}, - {1538, {wxCalendarDateAttr, hasFont, 0}}, - {1539, {wxCalendarDateAttr, hasBorder, 0}}, - {1540, {wxCalendarDateAttr, isHoliday, 0}}, - {1541, {wxCalendarDateAttr, getTextColour, 0}}, - {1542, {wxCalendarDateAttr, getBackgroundColour, 0}}, - {1543, {wxCalendarDateAttr, getBorderColour, 0}}, - {1544, {wxCalendarDateAttr, getFont, 0}}, - {1545, {wxCalendarDateAttr, getBorder, 0}}, - {1546, {wxCalendarDateAttr, 'Destroy', undefined}}, - {1548, {wxCheckBox, new_4, 4}}, - {1549, {wxCheckBox, new_0, 0}}, - {1550, {wxCheckBox, create, 4}}, - {1551, {wxCheckBox, getValue, 0}}, - {1552, {wxCheckBox, get3StateValue, 0}}, - {1553, {wxCheckBox, is3rdStateAllowedForUser, 0}}, - {1554, {wxCheckBox, is3State, 0}}, - {1555, {wxCheckBox, isChecked, 0}}, - {1556, {wxCheckBox, setValue, 1}}, - {1557, {wxCheckBox, set3StateValue, 1}}, - {1558, {wxCheckBox, 'Destroy', undefined}}, - {1559, {wxCheckListBox, new_0, 0}}, - {1561, {wxCheckListBox, new_3, 3}}, - {1562, {wxCheckListBox, check, 2}}, - {1563, {wxCheckListBox, isChecked, 1}}, - {1564, {wxCheckListBox, 'Destroy', undefined}}, - {1567, {wxChoice, new_3, 3}}, - {1568, {wxChoice, new_0, 0}}, - {1570, {wxChoice, destruct, 0}}, - {1572, {wxChoice, create, 6}}, - {1573, {wxChoice, delete, 1}}, - {1574, {wxChoice, getColumns, 0}}, - {1575, {wxChoice, setColumns, 1}}, - {1576, {wxComboBox, new_0, 0}}, - {1578, {wxComboBox, new_3, 3}}, - {1579, {wxComboBox, destruct, 0}}, - {1581, {wxComboBox, create, 7}}, - {1582, {wxComboBox, canCopy, 0}}, - {1583, {wxComboBox, canCut, 0}}, - {1584, {wxComboBox, canPaste, 0}}, - {1585, {wxComboBox, canRedo, 0}}, - {1586, {wxComboBox, canUndo, 0}}, - {1587, {wxComboBox, copy, 0}}, - {1588, {wxComboBox, cut, 0}}, - {1589, {wxComboBox, getInsertionPoint, 0}}, - {1590, {wxComboBox, getLastPosition, 0}}, - {1591, {wxComboBox, getValue, 0}}, - {1592, {wxComboBox, paste, 0}}, - {1593, {wxComboBox, redo, 0}}, - {1594, {wxComboBox, replace, 3}}, - {1595, {wxComboBox, remove, 2}}, - {1596, {wxComboBox, setInsertionPoint, 1}}, - {1597, {wxComboBox, setInsertionPointEnd, 0}}, - {1598, {wxComboBox, setSelection_1, 1}}, - {1599, {wxComboBox, setSelection_2, 2}}, - {1600, {wxComboBox, setValue, 1}}, - {1601, {wxComboBox, undo, 0}}, - {1602, {wxGauge, new_0, 0}}, - {1603, {wxGauge, new_4, 4}}, - {1604, {wxGauge, create, 4}}, - {1605, {wxGauge, getRange, 0}}, - {1606, {wxGauge, getValue, 0}}, - {1607, {wxGauge, isVertical, 0}}, - {1608, {wxGauge, setRange, 1}}, - {1609, {wxGauge, setValue, 1}}, - {1610, {wxGauge, pulse, 0}}, - {1611, {wxGauge, 'Destroy', undefined}}, - {1612, {wxGenericDirCtrl, new_0, 0}}, - {1613, {wxGenericDirCtrl, new_2, 2}}, - {1614, {wxGenericDirCtrl, destruct, 0}}, - {1615, {wxGenericDirCtrl, create, 2}}, - {1616, {wxGenericDirCtrl, init, 0}}, - {1617, {wxGenericDirCtrl, collapseTree, 0}}, - {1618, {wxGenericDirCtrl, expandPath, 1}}, - {1619, {wxGenericDirCtrl, getDefaultPath, 0}}, - {1620, {wxGenericDirCtrl, getPath, 0}}, - {1621, {wxGenericDirCtrl, getFilePath, 0}}, - {1622, {wxGenericDirCtrl, getFilter, 0}}, - {1623, {wxGenericDirCtrl, getFilterIndex, 0}}, - {1624, {wxGenericDirCtrl, getRootId, 0}}, - {1625, {wxGenericDirCtrl, getTreeCtrl, 0}}, - {1626, {wxGenericDirCtrl, reCreateTree, 0}}, - {1627, {wxGenericDirCtrl, setDefaultPath, 1}}, - {1628, {wxGenericDirCtrl, setFilter, 1}}, - {1629, {wxGenericDirCtrl, setFilterIndex, 1}}, - {1630, {wxGenericDirCtrl, setPath, 1}}, - {1632, {wxStaticBox, new_4, 4}}, - {1633, {wxStaticBox, new_0, 0}}, - {1634, {wxStaticBox, create, 4}}, - {1635, {wxStaticBox, 'Destroy', undefined}}, - {1637, {wxStaticLine, new_2, 2}}, - {1638, {wxStaticLine, new_0, 0}}, - {1639, {wxStaticLine, create, 2}}, - {1640, {wxStaticLine, isVertical, 0}}, - {1641, {wxStaticLine, getDefaultSize, 0}}, - {1642, {wxStaticLine, 'Destroy', undefined}}, - {1645, {wxListBox, new_3, 3}}, - {1646, {wxListBox, new_0, 0}}, - {1648, {wxListBox, destruct, 0}}, - {1650, {wxListBox, create, 6}}, - {1651, {wxListBox, deselect, 1}}, - {1652, {wxListBox, getSelections, 1}}, - {1653, {wxListBox, insertItems, 2}}, - {1654, {wxListBox, isSelected, 1}}, - {1655, {wxListBox, set, 1}}, - {1656, {wxListBox, hitTest, 1}}, - {1657, {wxListBox, setFirstItem_1_0, 1}}, - {1658, {wxListBox, setFirstItem_1_1, 1}}, - {1659, {wxListCtrl, new_0, 0}}, - {1660, {wxListCtrl, new_2, 2}}, - {1661, {wxListCtrl, arrange, 1}}, - {1662, {wxListCtrl, assignImageList, 2}}, - {1663, {wxListCtrl, clearAll, 0}}, - {1664, {wxListCtrl, create, 2}}, - {1665, {wxListCtrl, deleteAllItems, 0}}, - {1666, {wxListCtrl, deleteColumn, 1}}, - {1667, {wxListCtrl, deleteItem, 1}}, - {1668, {wxListCtrl, editLabel, 1}}, - {1669, {wxListCtrl, ensureVisible, 1}}, - {1670, {wxListCtrl, findItem_3_0, 3}}, - {1671, {wxListCtrl, findItem_3_1, 3}}, - {1672, {wxListCtrl, getColumn, 2}}, - {1673, {wxListCtrl, getColumnCount, 0}}, - {1674, {wxListCtrl, getColumnWidth, 1}}, - {1675, {wxListCtrl, getCountPerPage, 0}}, - {1676, {wxListCtrl, getEditControl, 0}}, - {1677, {wxListCtrl, getImageList, 1}}, - {1678, {wxListCtrl, getItem, 1}}, - {1679, {wxListCtrl, getItemBackgroundColour, 1}}, - {1680, {wxListCtrl, getItemCount, 0}}, - {1681, {wxListCtrl, getItemData, 1}}, - {1682, {wxListCtrl, getItemFont, 1}}, - {1683, {wxListCtrl, getItemPosition, 2}}, - {1684, {wxListCtrl, getItemRect, 3}}, - {1685, {wxListCtrl, getItemSpacing, 0}}, - {1686, {wxListCtrl, getItemState, 2}}, - {1687, {wxListCtrl, getItemText, 1}}, - {1688, {wxListCtrl, getItemTextColour, 1}}, - {1689, {wxListCtrl, getNextItem, 2}}, - {1690, {wxListCtrl, getSelectedItemCount, 0}}, - {1691, {wxListCtrl, getTextColour, 0}}, - {1692, {wxListCtrl, getTopItem, 0}}, - {1693, {wxListCtrl, getViewRect, 0}}, - {1694, {wxListCtrl, hitTest, 3}}, - {1695, {wxListCtrl, insertColumn_2, 2}}, - {1696, {wxListCtrl, insertColumn_3, 3}}, - {1697, {wxListCtrl, insertItem_1, 1}}, - {1698, {wxListCtrl, insertItem_2_1, 2}}, - {1699, {wxListCtrl, insertItem_2_0, 2}}, - {1700, {wxListCtrl, insertItem_3, 3}}, - {1701, {wxListCtrl, refreshItem, 1}}, - {1702, {wxListCtrl, refreshItems, 2}}, - {1703, {wxListCtrl, scrollList, 2}}, - {1704, {wxListCtrl, setBackgroundColour, 1}}, - {1705, {wxListCtrl, setColumn, 2}}, - {1706, {wxListCtrl, setColumnWidth, 2}}, - {1707, {wxListCtrl, setImageList, 2}}, - {1708, {wxListCtrl, setItem_1, 1}}, - {1709, {wxListCtrl, setItem_4, 4}}, - {1710, {wxListCtrl, setItemBackgroundColour, 2}}, - {1711, {wxListCtrl, setItemCount, 1}}, - {1712, {wxListCtrl, setItemData, 2}}, - {1713, {wxListCtrl, setItemFont, 2}}, - {1714, {wxListCtrl, setItemImage, 3}}, - {1715, {wxListCtrl, setItemColumnImage, 3}}, - {1716, {wxListCtrl, setItemPosition, 2}}, - {1717, {wxListCtrl, setItemState, 3}}, - {1718, {wxListCtrl, setItemText, 2}}, - {1719, {wxListCtrl, setItemTextColour, 2}}, - {1720, {wxListCtrl, setSingleStyle, 2}}, - {1721, {wxListCtrl, setTextColour, 1}}, - {1722, {wxListCtrl, setWindowStyleFlag, 1}}, - {1723, {wxListCtrl, sortItems, 2}}, - {1724, {wxListCtrl, 'Destroy', undefined}}, - {1725, {wxListView, clearColumnImage, 1}}, - {1726, {wxListView, focus, 1}}, - {1727, {wxListView, getFirstSelected, 0}}, - {1728, {wxListView, getFocusedItem, 0}}, - {1729, {wxListView, getNextSelected, 1}}, - {1730, {wxListView, isSelected, 1}}, - {1731, {wxListView, select, 2}}, - {1732, {wxListView, setColumnImage, 2}}, - {1733, {wxListItem, new_0, 0}}, - {1734, {wxListItem, new_1, 1}}, - {1735, {wxListItem, destruct, 0}}, - {1736, {wxListItem, clear, 0}}, - {1737, {wxListItem, getAlign, 0}}, - {1738, {wxListItem, getBackgroundColour, 0}}, - {1739, {wxListItem, getColumn, 0}}, - {1740, {wxListItem, getFont, 0}}, - {1741, {wxListItem, getId, 0}}, - {1742, {wxListItem, getImage, 0}}, - {1743, {wxListItem, getMask, 0}}, - {1744, {wxListItem, getState, 0}}, - {1745, {wxListItem, getText, 0}}, - {1746, {wxListItem, getTextColour, 0}}, - {1747, {wxListItem, getWidth, 0}}, - {1748, {wxListItem, setAlign, 1}}, - {1749, {wxListItem, setBackgroundColour, 1}}, - {1750, {wxListItem, setColumn, 1}}, - {1751, {wxListItem, setFont, 1}}, - {1752, {wxListItem, setId, 1}}, - {1753, {wxListItem, setImage, 1}}, - {1754, {wxListItem, setMask, 1}}, - {1755, {wxListItem, setState, 1}}, - {1756, {wxListItem, setStateMask, 1}}, - {1757, {wxListItem, setText, 1}}, - {1758, {wxListItem, setTextColour, 1}}, - {1759, {wxListItem, setWidth, 1}}, - {1760, {wxListItemAttr, new_0, 0}}, - {1761, {wxListItemAttr, new_3, 3}}, - {1762, {wxListItemAttr, getBackgroundColour, 0}}, - {1763, {wxListItemAttr, getFont, 0}}, - {1764, {wxListItemAttr, getTextColour, 0}}, - {1765, {wxListItemAttr, hasBackgroundColour, 0}}, - {1766, {wxListItemAttr, hasFont, 0}}, - {1767, {wxListItemAttr, hasTextColour, 0}}, - {1768, {wxListItemAttr, setBackgroundColour, 1}}, - {1769, {wxListItemAttr, setFont, 1}}, - {1770, {wxListItemAttr, setTextColour, 1}}, - {1771, {wxListItemAttr, 'Destroy', undefined}}, - {1772, {wxImageList, new_0, 0}}, - {1773, {wxImageList, new_3, 3}}, - {1774, {wxImageList, add_1, 1}}, - {1775, {wxImageList, add_2_0, 2}}, - {1776, {wxImageList, add_2_1, 2}}, - {1777, {wxImageList, create, 3}}, - {1779, {wxImageList, draw, 5}}, - {1780, {wxImageList, getBitmap, 1}}, - {1781, {wxImageList, getIcon, 1}}, - {1782, {wxImageList, getImageCount, 0}}, - {1783, {wxImageList, getSize, 3}}, - {1784, {wxImageList, remove, 1}}, - {1785, {wxImageList, removeAll, 0}}, - {1786, {wxImageList, replace_2, 2}}, - {1787, {wxImageList, replace_3, 3}}, - {1788, {wxImageList, 'Destroy', undefined}}, - {1789, {wxTextAttr, new_0, 0}}, - {1790, {wxTextAttr, new_2, 2}}, - {1791, {wxTextAttr, getAlignment, 0}}, - {1792, {wxTextAttr, getBackgroundColour, 0}}, - {1793, {wxTextAttr, getFont, 0}}, - {1794, {wxTextAttr, getLeftIndent, 0}}, - {1795, {wxTextAttr, getLeftSubIndent, 0}}, - {1796, {wxTextAttr, getRightIndent, 0}}, - {1797, {wxTextAttr, getTabs, 0}}, - {1798, {wxTextAttr, getTextColour, 0}}, - {1799, {wxTextAttr, hasBackgroundColour, 0}}, - {1800, {wxTextAttr, hasFont, 0}}, - {1801, {wxTextAttr, hasTextColour, 0}}, - {1802, {wxTextAttr, getFlags, 0}}, - {1803, {wxTextAttr, isDefault, 0}}, - {1804, {wxTextAttr, setAlignment, 1}}, - {1805, {wxTextAttr, setBackgroundColour, 1}}, - {1806, {wxTextAttr, setFlags, 1}}, - {1807, {wxTextAttr, setFont, 2}}, - {1808, {wxTextAttr, setLeftIndent, 2}}, - {1809, {wxTextAttr, setRightIndent, 1}}, - {1810, {wxTextAttr, setTabs, 1}}, - {1811, {wxTextAttr, setTextColour, 1}}, - {1812, {wxTextAttr, 'Destroy', undefined}}, - {1814, {wxTextCtrl, new_3, 3}}, - {1815, {wxTextCtrl, new_0, 0}}, - {1817, {wxTextCtrl, destruct, 0}}, - {1818, {wxTextCtrl, appendText, 1}}, - {1819, {wxTextCtrl, canCopy, 0}}, - {1820, {wxTextCtrl, canCut, 0}}, - {1821, {wxTextCtrl, canPaste, 0}}, - {1822, {wxTextCtrl, canRedo, 0}}, - {1823, {wxTextCtrl, canUndo, 0}}, - {1824, {wxTextCtrl, clear, 0}}, - {1825, {wxTextCtrl, copy, 0}}, - {1826, {wxTextCtrl, create, 3}}, - {1827, {wxTextCtrl, cut, 0}}, - {1828, {wxTextCtrl, discardEdits, 0}}, - {1829, {wxTextCtrl, changeValue, 1}}, - {1830, {wxTextCtrl, emulateKeyPress, 1}}, - {1831, {wxTextCtrl, getDefaultStyle, 0}}, - {1832, {wxTextCtrl, getInsertionPoint, 0}}, - {1833, {wxTextCtrl, getLastPosition, 0}}, - {1834, {wxTextCtrl, getLineLength, 1}}, - {1835, {wxTextCtrl, getLineText, 1}}, - {1836, {wxTextCtrl, getNumberOfLines, 0}}, - {1837, {wxTextCtrl, getRange, 2}}, - {1838, {wxTextCtrl, getSelection, 2}}, - {1839, {wxTextCtrl, getStringSelection, 0}}, - {1840, {wxTextCtrl, getStyle, 2}}, - {1841, {wxTextCtrl, getValue, 0}}, - {1842, {wxTextCtrl, isEditable, 0}}, - {1843, {wxTextCtrl, isModified, 0}}, - {1844, {wxTextCtrl, isMultiLine, 0}}, - {1845, {wxTextCtrl, isSingleLine, 0}}, - {1846, {wxTextCtrl, loadFile, 2}}, - {1847, {wxTextCtrl, markDirty, 0}}, - {1848, {wxTextCtrl, paste, 0}}, - {1849, {wxTextCtrl, positionToXY, 3}}, - {1850, {wxTextCtrl, redo, 0}}, - {1851, {wxTextCtrl, remove, 2}}, - {1852, {wxTextCtrl, replace, 3}}, - {1853, {wxTextCtrl, saveFile, 1}}, - {1854, {wxTextCtrl, setDefaultStyle, 1}}, - {1855, {wxTextCtrl, setEditable, 1}}, - {1856, {wxTextCtrl, setInsertionPoint, 1}}, - {1857, {wxTextCtrl, setInsertionPointEnd, 0}}, - {1859, {wxTextCtrl, setMaxLength, 1}}, - {1860, {wxTextCtrl, setSelection, 2}}, - {1861, {wxTextCtrl, setStyle, 3}}, - {1862, {wxTextCtrl, setValue, 1}}, - {1863, {wxTextCtrl, showPosition, 1}}, - {1864, {wxTextCtrl, undo, 0}}, - {1865, {wxTextCtrl, writeText, 1}}, - {1866, {wxTextCtrl, xYToPosition, 2}}, - {1869, {wxNotebook, new_0, 0}}, - {1870, {wxNotebook, new_3, 3}}, - {1871, {wxNotebook, destruct, 0}}, - {1872, {wxNotebook, addPage, 3}}, - {1873, {wxNotebook, advanceSelection, 1}}, - {1874, {wxNotebook, assignImageList, 1}}, - {1875, {wxNotebook, create, 3}}, - {1876, {wxNotebook, deleteAllPages, 0}}, - {1877, {wxNotebook, deletePage, 1}}, - {1878, {wxNotebook, removePage, 1}}, - {1879, {wxNotebook, getCurrentPage, 0}}, - {1880, {wxNotebook, getImageList, 0}}, - {1882, {wxNotebook, getPage, 1}}, - {1883, {wxNotebook, getPageCount, 0}}, - {1884, {wxNotebook, getPageImage, 1}}, - {1885, {wxNotebook, getPageText, 1}}, - {1886, {wxNotebook, getRowCount, 0}}, - {1887, {wxNotebook, getSelection, 0}}, - {1888, {wxNotebook, getThemeBackgroundColour, 0}}, - {1890, {wxNotebook, hitTest, 2}}, - {1892, {wxNotebook, insertPage, 4}}, - {1893, {wxNotebook, setImageList, 1}}, - {1894, {wxNotebook, setPadding, 1}}, - {1895, {wxNotebook, setPageSize, 1}}, - {1896, {wxNotebook, setPageImage, 2}}, - {1897, {wxNotebook, setPageText, 2}}, - {1898, {wxNotebook, setSelection, 1}}, - {1899, {wxNotebook, changeSelection, 1}}, - {1900, {wxChoicebook, new_0, 0}}, - {1901, {wxChoicebook, new_3, 3}}, - {1902, {wxChoicebook, addPage, 3}}, - {1903, {wxChoicebook, advanceSelection, 1}}, - {1904, {wxChoicebook, assignImageList, 1}}, - {1905, {wxChoicebook, create, 3}}, - {1906, {wxChoicebook, deleteAllPages, 0}}, - {1907, {wxChoicebook, deletePage, 1}}, - {1908, {wxChoicebook, removePage, 1}}, - {1909, {wxChoicebook, getCurrentPage, 0}}, - {1910, {wxChoicebook, getImageList, 0}}, - {1912, {wxChoicebook, getPage, 1}}, - {1913, {wxChoicebook, getPageCount, 0}}, - {1914, {wxChoicebook, getPageImage, 1}}, - {1915, {wxChoicebook, getPageText, 1}}, - {1916, {wxChoicebook, getSelection, 0}}, - {1917, {wxChoicebook, hitTest, 2}}, - {1918, {wxChoicebook, insertPage, 4}}, - {1919, {wxChoicebook, setImageList, 1}}, - {1920, {wxChoicebook, setPageSize, 1}}, - {1921, {wxChoicebook, setPageImage, 2}}, - {1922, {wxChoicebook, setPageText, 2}}, - {1923, {wxChoicebook, setSelection, 1}}, - {1924, {wxChoicebook, changeSelection, 1}}, - {1925, {wxChoicebook, 'Destroy', undefined}}, - {1926, {wxToolbook, new_0, 0}}, - {1927, {wxToolbook, new_3, 3}}, - {1928, {wxToolbook, addPage, 3}}, - {1929, {wxToolbook, advanceSelection, 1}}, - {1930, {wxToolbook, assignImageList, 1}}, - {1931, {wxToolbook, create, 3}}, - {1932, {wxToolbook, deleteAllPages, 0}}, - {1933, {wxToolbook, deletePage, 1}}, - {1934, {wxToolbook, removePage, 1}}, - {1935, {wxToolbook, getCurrentPage, 0}}, - {1936, {wxToolbook, getImageList, 0}}, - {1938, {wxToolbook, getPage, 1}}, - {1939, {wxToolbook, getPageCount, 0}}, - {1940, {wxToolbook, getPageImage, 1}}, - {1941, {wxToolbook, getPageText, 1}}, - {1942, {wxToolbook, getSelection, 0}}, - {1944, {wxToolbook, hitTest, 2}}, - {1945, {wxToolbook, insertPage, 4}}, - {1946, {wxToolbook, setImageList, 1}}, - {1947, {wxToolbook, setPageSize, 1}}, - {1948, {wxToolbook, setPageImage, 2}}, - {1949, {wxToolbook, setPageText, 2}}, - {1950, {wxToolbook, setSelection, 1}}, - {1951, {wxToolbook, changeSelection, 1}}, - {1952, {wxToolbook, 'Destroy', undefined}}, - {1953, {wxListbook, new_0, 0}}, - {1954, {wxListbook, new_3, 3}}, - {1955, {wxListbook, addPage, 3}}, - {1956, {wxListbook, advanceSelection, 1}}, - {1957, {wxListbook, assignImageList, 1}}, - {1958, {wxListbook, create, 3}}, - {1959, {wxListbook, deleteAllPages, 0}}, - {1960, {wxListbook, deletePage, 1}}, - {1961, {wxListbook, removePage, 1}}, - {1962, {wxListbook, getCurrentPage, 0}}, - {1963, {wxListbook, getImageList, 0}}, - {1965, {wxListbook, getPage, 1}}, - {1966, {wxListbook, getPageCount, 0}}, - {1967, {wxListbook, getPageImage, 1}}, - {1968, {wxListbook, getPageText, 1}}, - {1969, {wxListbook, getSelection, 0}}, - {1971, {wxListbook, hitTest, 2}}, - {1972, {wxListbook, insertPage, 4}}, - {1973, {wxListbook, setImageList, 1}}, - {1974, {wxListbook, setPageSize, 1}}, - {1975, {wxListbook, setPageImage, 2}}, - {1976, {wxListbook, setPageText, 2}}, - {1977, {wxListbook, setSelection, 1}}, - {1978, {wxListbook, changeSelection, 1}}, - {1979, {wxListbook, 'Destroy', undefined}}, - {1980, {wxTreebook, new_0, 0}}, - {1981, {wxTreebook, new_3, 3}}, - {1982, {wxTreebook, addPage, 3}}, - {1983, {wxTreebook, advanceSelection, 1}}, - {1984, {wxTreebook, assignImageList, 1}}, - {1985, {wxTreebook, create, 3}}, - {1986, {wxTreebook, deleteAllPages, 0}}, - {1987, {wxTreebook, deletePage, 1}}, - {1988, {wxTreebook, removePage, 1}}, - {1989, {wxTreebook, getCurrentPage, 0}}, - {1990, {wxTreebook, getImageList, 0}}, - {1992, {wxTreebook, getPage, 1}}, - {1993, {wxTreebook, getPageCount, 0}}, - {1994, {wxTreebook, getPageImage, 1}}, - {1995, {wxTreebook, getPageText, 1}}, - {1996, {wxTreebook, getSelection, 0}}, - {1997, {wxTreebook, expandNode, 2}}, - {1998, {wxTreebook, isNodeExpanded, 1}}, - {2000, {wxTreebook, hitTest, 2}}, - {2001, {wxTreebook, insertPage, 4}}, - {2002, {wxTreebook, insertSubPage, 4}}, - {2003, {wxTreebook, setImageList, 1}}, - {2004, {wxTreebook, setPageSize, 1}}, - {2005, {wxTreebook, setPageImage, 2}}, - {2006, {wxTreebook, setPageText, 2}}, - {2007, {wxTreebook, setSelection, 1}}, - {2008, {wxTreebook, changeSelection, 1}}, - {2009, {wxTreebook, 'Destroy', undefined}}, - {2012, {wxTreeCtrl, new_2, 2}}, - {2013, {wxTreeCtrl, new_0, 0}}, - {2015, {wxTreeCtrl, destruct, 0}}, - {2016, {wxTreeCtrl, addRoot, 2}}, - {2017, {wxTreeCtrl, appendItem, 3}}, - {2018, {wxTreeCtrl, assignImageList, 1}}, - {2019, {wxTreeCtrl, assignStateImageList, 1}}, - {2020, {wxTreeCtrl, collapse, 1}}, - {2021, {wxTreeCtrl, collapseAndReset, 1}}, - {2022, {wxTreeCtrl, create, 2}}, - {2023, {wxTreeCtrl, delete, 1}}, - {2024, {wxTreeCtrl, deleteAllItems, 0}}, - {2025, {wxTreeCtrl, deleteChildren, 1}}, - {2026, {wxTreeCtrl, editLabel, 1}}, - {2027, {wxTreeCtrl, ensureVisible, 1}}, - {2028, {wxTreeCtrl, expand, 1}}, - {2029, {wxTreeCtrl, getBoundingRect, 3}}, - {2031, {wxTreeCtrl, getChildrenCount, 2}}, - {2032, {wxTreeCtrl, getCount, 0}}, - {2033, {wxTreeCtrl, getEditControl, 0}}, - {2034, {wxTreeCtrl, getFirstChild, 2}}, - {2035, {wxTreeCtrl, getNextChild, 2}}, - {2036, {wxTreeCtrl, getFirstVisibleItem, 0}}, - {2037, {wxTreeCtrl, getImageList, 0}}, - {2038, {wxTreeCtrl, getIndent, 0}}, - {2039, {wxTreeCtrl, getItemBackgroundColour, 1}}, - {2040, {wxTreeCtrl, getItemData, 1}}, - {2041, {wxTreeCtrl, getItemFont, 1}}, - {2042, {wxTreeCtrl, getItemImage_1, 1}}, - {2043, {wxTreeCtrl, getItemImage_2, 2}}, - {2044, {wxTreeCtrl, getItemText, 1}}, - {2045, {wxTreeCtrl, getItemTextColour, 1}}, - {2046, {wxTreeCtrl, getLastChild, 1}}, - {2047, {wxTreeCtrl, getNextSibling, 1}}, - {2048, {wxTreeCtrl, getNextVisible, 1}}, - {2049, {wxTreeCtrl, getItemParent, 1}}, - {2050, {wxTreeCtrl, getPrevSibling, 1}}, - {2051, {wxTreeCtrl, getPrevVisible, 1}}, - {2052, {wxTreeCtrl, getRootItem, 0}}, - {2053, {wxTreeCtrl, getSelection, 0}}, - {2054, {wxTreeCtrl, getSelections, 1}}, - {2055, {wxTreeCtrl, getStateImageList, 0}}, - {2056, {wxTreeCtrl, hitTest, 2}}, - {2058, {wxTreeCtrl, insertItem, 4}}, - {2059, {wxTreeCtrl, isBold, 1}}, - {2060, {wxTreeCtrl, isExpanded, 1}}, - {2061, {wxTreeCtrl, isSelected, 1}}, - {2062, {wxTreeCtrl, isVisible, 1}}, - {2063, {wxTreeCtrl, itemHasChildren, 1}}, - {2064, {wxTreeCtrl, isTreeItemIdOk, 1}}, - {2065, {wxTreeCtrl, prependItem, 3}}, - {2066, {wxTreeCtrl, scrollTo, 1}}, - {2067, {wxTreeCtrl, selectItem_1, 1}}, - {2068, {wxTreeCtrl, selectItem_2, 2}}, - {2069, {wxTreeCtrl, setIndent, 1}}, - {2070, {wxTreeCtrl, setImageList, 1}}, - {2071, {wxTreeCtrl, setItemBackgroundColour, 2}}, - {2072, {wxTreeCtrl, setItemBold, 2}}, - {2073, {wxTreeCtrl, setItemData, 2}}, - {2074, {wxTreeCtrl, setItemDropHighlight, 2}}, - {2075, {wxTreeCtrl, setItemFont, 2}}, - {2076, {wxTreeCtrl, setItemHasChildren, 2}}, - {2077, {wxTreeCtrl, setItemImage_2, 2}}, - {2078, {wxTreeCtrl, setItemImage_3, 3}}, - {2079, {wxTreeCtrl, setItemText, 2}}, - {2080, {wxTreeCtrl, setItemTextColour, 2}}, - {2081, {wxTreeCtrl, setStateImageList, 1}}, - {2082, {wxTreeCtrl, setWindowStyle, 1}}, - {2083, {wxTreeCtrl, sortChildren, 1}}, - {2084, {wxTreeCtrl, toggle, 1}}, - {2085, {wxTreeCtrl, toggleItemSelection, 1}}, - {2086, {wxTreeCtrl, unselect, 0}}, - {2087, {wxTreeCtrl, unselectAll, 0}}, - {2088, {wxTreeCtrl, unselectItem, 1}}, - {2089, {wxScrollBar, new_0, 0}}, - {2090, {wxScrollBar, new_3, 3}}, - {2091, {wxScrollBar, destruct, 0}}, - {2092, {wxScrollBar, create, 3}}, - {2093, {wxScrollBar, getRange, 0}}, - {2094, {wxScrollBar, getPageSize, 0}}, - {2095, {wxScrollBar, getThumbPosition, 0}}, - {2096, {wxScrollBar, getThumbSize, 0}}, - {2097, {wxScrollBar, setThumbPosition, 1}}, - {2098, {wxScrollBar, setScrollbar, 5}}, - {2100, {wxSpinButton, new_2, 2}}, - {2101, {wxSpinButton, new_0, 0}}, - {2102, {wxSpinButton, create, 2}}, - {2103, {wxSpinButton, getMax, 0}}, - {2104, {wxSpinButton, getMin, 0}}, - {2105, {wxSpinButton, getValue, 0}}, - {2106, {wxSpinButton, setRange, 2}}, - {2107, {wxSpinButton, setValue, 1}}, - {2108, {wxSpinButton, 'Destroy', undefined}}, - {2109, {wxSpinCtrl, new_0, 0}}, - {2110, {wxSpinCtrl, new_2, 2}}, - {2112, {wxSpinCtrl, create, 2}}, - {2115, {wxSpinCtrl, setValue_1_1, 1}}, - {2116, {wxSpinCtrl, setValue_1_0, 1}}, - {2118, {wxSpinCtrl, getValue, 0}}, - {2120, {wxSpinCtrl, setRange, 2}}, - {2121, {wxSpinCtrl, setSelection, 2}}, - {2123, {wxSpinCtrl, getMin, 0}}, - {2125, {wxSpinCtrl, getMax, 0}}, - {2126, {wxSpinCtrl, 'Destroy', undefined}}, - {2127, {wxStaticText, new_0, 0}}, - {2128, {wxStaticText, new_4, 4}}, - {2129, {wxStaticText, create, 4}}, - {2130, {wxStaticText, getLabel, 0}}, - {2131, {wxStaticText, setLabel, 1}}, - {2132, {wxStaticText, wrap, 1}}, - {2133, {wxStaticText, 'Destroy', undefined}}, - {2134, {wxStaticBitmap, new_0, 0}}, - {2135, {wxStaticBitmap, new_4, 4}}, - {2136, {wxStaticBitmap, create, 4}}, - {2137, {wxStaticBitmap, getBitmap, 0}}, - {2138, {wxStaticBitmap, setBitmap, 1}}, - {2139, {wxStaticBitmap, 'Destroy', undefined}}, - {2140, {wxRadioBox, new, 7}}, - {2142, {wxRadioBox, destruct, 0}}, - {2143, {wxRadioBox, create, 7}}, - {2144, {wxRadioBox, enable_2, 2}}, - {2145, {wxRadioBox, enable_1, 1}}, - {2146, {wxRadioBox, getSelection, 0}}, - {2147, {wxRadioBox, getString, 1}}, - {2148, {wxRadioBox, setSelection, 1}}, - {2149, {wxRadioBox, show_2, 2}}, - {2150, {wxRadioBox, show_1, 1}}, - {2151, {wxRadioBox, getColumnCount, 0}}, - {2152, {wxRadioBox, getItemHelpText, 1}}, - {2153, {wxRadioBox, getItemToolTip, 1}}, - {2155, {wxRadioBox, getItemFromPoint, 1}}, - {2156, {wxRadioBox, getRowCount, 0}}, - {2157, {wxRadioBox, isItemEnabled, 1}}, - {2158, {wxRadioBox, isItemShown, 1}}, - {2159, {wxRadioBox, setItemHelpText, 2}}, - {2160, {wxRadioBox, setItemToolTip, 2}}, - {2161, {wxRadioButton, new_0, 0}}, - {2162, {wxRadioButton, new_4, 4}}, - {2163, {wxRadioButton, create, 4}}, - {2164, {wxRadioButton, getValue, 0}}, - {2165, {wxRadioButton, setValue, 1}}, - {2166, {wxRadioButton, 'Destroy', undefined}}, - {2168, {wxSlider, new_6, 6}}, - {2169, {wxSlider, new_0, 0}}, - {2170, {wxSlider, create, 6}}, - {2171, {wxSlider, getLineSize, 0}}, - {2172, {wxSlider, getMax, 0}}, - {2173, {wxSlider, getMin, 0}}, - {2174, {wxSlider, getPageSize, 0}}, - {2175, {wxSlider, getThumbLength, 0}}, - {2176, {wxSlider, getValue, 0}}, - {2177, {wxSlider, setLineSize, 1}}, - {2178, {wxSlider, setPageSize, 1}}, - {2179, {wxSlider, setRange, 2}}, - {2180, {wxSlider, setThumbLength, 1}}, - {2181, {wxSlider, setValue, 1}}, - {2182, {wxSlider, 'Destroy', undefined}}, - {2184, {wxDialog, new_4, 4}}, - {2185, {wxDialog, new_0, 0}}, - {2187, {wxDialog, destruct, 0}}, - {2188, {wxDialog, create, 4}}, - {2189, {wxDialog, createButtonSizer, 1}}, - {2190, {wxDialog, createStdDialogButtonSizer, 1}}, - {2191, {wxDialog, endModal, 1}}, - {2192, {wxDialog, getAffirmativeId, 0}}, - {2193, {wxDialog, getReturnCode, 0}}, - {2194, {wxDialog, isModal, 0}}, - {2195, {wxDialog, setAffirmativeId, 1}}, - {2196, {wxDialog, setReturnCode, 1}}, - {2197, {wxDialog, show, 1}}, - {2198, {wxDialog, showModal, 0}}, - {2199, {wxColourDialog, new_0, 0}}, - {2200, {wxColourDialog, new_2, 2}}, - {2201, {wxColourDialog, destruct, 0}}, - {2202, {wxColourDialog, create, 2}}, - {2203, {wxColourDialog, getColourData, 0}}, - {2204, {wxColourData, new_0, 0}}, - {2205, {wxColourData, new_1, 1}}, - {2206, {wxColourData, destruct, 0}}, - {2207, {wxColourData, getChooseFull, 0}}, - {2208, {wxColourData, getColour, 0}}, - {2210, {wxColourData, getCustomColour, 1}}, - {2211, {wxColourData, setChooseFull, 1}}, - {2212, {wxColourData, setColour, 1}}, - {2213, {wxColourData, setCustomColour, 2}}, - {2214, {wxPalette, new_0, 0}}, - {2215, {wxPalette, new_4, 4}}, - {2217, {wxPalette, destruct, 0}}, - {2218, {wxPalette, create, 4}}, - {2219, {wxPalette, getColoursCount, 0}}, - {2220, {wxPalette, getPixel, 3}}, - {2221, {wxPalette, getRGB, 4}}, - {2222, {wxPalette, isOk, 0}}, - {2226, {wxDirDialog, new, 2}}, - {2227, {wxDirDialog, destruct, 0}}, - {2228, {wxDirDialog, getPath, 0}}, - {2229, {wxDirDialog, getMessage, 0}}, - {2230, {wxDirDialog, setMessage, 1}}, - {2231, {wxDirDialog, setPath, 1}}, - {2235, {wxFileDialog, new, 2}}, - {2236, {wxFileDialog, destruct, 0}}, - {2237, {wxFileDialog, getDirectory, 0}}, - {2238, {wxFileDialog, getFilename, 0}}, - {2239, {wxFileDialog, getFilenames, 1}}, - {2240, {wxFileDialog, getFilterIndex, 0}}, - {2241, {wxFileDialog, getMessage, 0}}, - {2242, {wxFileDialog, getPath, 0}}, - {2243, {wxFileDialog, getPaths, 1}}, - {2244, {wxFileDialog, getWildcard, 0}}, - {2245, {wxFileDialog, setDirectory, 1}}, - {2246, {wxFileDialog, setFilename, 1}}, - {2247, {wxFileDialog, setFilterIndex, 1}}, - {2248, {wxFileDialog, setMessage, 1}}, - {2249, {wxFileDialog, setPath, 1}}, - {2250, {wxFileDialog, setWildcard, 1}}, - {2251, {wxPickerBase, setInternalMargin, 1}}, - {2252, {wxPickerBase, getInternalMargin, 0}}, - {2253, {wxPickerBase, setTextCtrlProportion, 1}}, - {2254, {wxPickerBase, setPickerCtrlProportion, 1}}, - {2255, {wxPickerBase, getTextCtrlProportion, 0}}, - {2256, {wxPickerBase, getPickerCtrlProportion, 0}}, - {2257, {wxPickerBase, hasTextCtrl, 0}}, - {2258, {wxPickerBase, getTextCtrl, 0}}, - {2259, {wxPickerBase, isTextCtrlGrowable, 0}}, - {2260, {wxPickerBase, setPickerCtrlGrowable, 1}}, - {2261, {wxPickerBase, setTextCtrlGrowable, 1}}, - {2262, {wxPickerBase, isPickerCtrlGrowable, 0}}, - {2263, {wxFilePickerCtrl, new_0, 0}}, - {2264, {wxFilePickerCtrl, new_3, 3}}, - {2265, {wxFilePickerCtrl, create, 3}}, - {2266, {wxFilePickerCtrl, getPath, 0}}, - {2267, {wxFilePickerCtrl, setPath, 1}}, - {2268, {wxFilePickerCtrl, 'Destroy', undefined}}, - {2269, {wxDirPickerCtrl, new_0, 0}}, - {2270, {wxDirPickerCtrl, new_3, 3}}, - {2271, {wxDirPickerCtrl, create, 3}}, - {2272, {wxDirPickerCtrl, getPath, 0}}, - {2273, {wxDirPickerCtrl, setPath, 1}}, - {2274, {wxDirPickerCtrl, 'Destroy', undefined}}, - {2275, {wxColourPickerCtrl, new_0, 0}}, - {2276, {wxColourPickerCtrl, new_3, 3}}, - {2277, {wxColourPickerCtrl, create, 3}}, - {2278, {wxColourPickerCtrl, getColour, 0}}, - {2279, {wxColourPickerCtrl, setColour_1_1, 1}}, - {2280, {wxColourPickerCtrl, setColour_1_0, 1}}, - {2281, {wxColourPickerCtrl, 'Destroy', undefined}}, - {2282, {wxDatePickerCtrl, new_0, 0}}, - {2283, {wxDatePickerCtrl, new_3, 3}}, - {2284, {wxDatePickerCtrl, getRange, 2}}, - {2285, {wxDatePickerCtrl, getValue, 0}}, - {2286, {wxDatePickerCtrl, setRange, 2}}, - {2287, {wxDatePickerCtrl, setValue, 1}}, - {2288, {wxDatePickerCtrl, 'Destroy', undefined}}, - {2289, {wxFontPickerCtrl, new_0, 0}}, - {2290, {wxFontPickerCtrl, new_3, 3}}, - {2291, {wxFontPickerCtrl, create, 3}}, - {2292, {wxFontPickerCtrl, getSelectedFont, 0}}, - {2293, {wxFontPickerCtrl, setSelectedFont, 1}}, - {2294, {wxFontPickerCtrl, getMaxPointSize, 0}}, - {2295, {wxFontPickerCtrl, setMaxPointSize, 1}}, - {2296, {wxFontPickerCtrl, 'Destroy', undefined}}, - {2299, {wxFindReplaceDialog, new_0, 0}}, - {2300, {wxFindReplaceDialog, new_4, 4}}, - {2301, {wxFindReplaceDialog, destruct, 0}}, - {2302, {wxFindReplaceDialog, create, 4}}, - {2303, {wxFindReplaceDialog, getData, 0}}, - {2304, {wxFindReplaceData, new_0, 0}}, - {2305, {wxFindReplaceData, new_1, 1}}, - {2306, {wxFindReplaceData, getFindString, 0}}, - {2307, {wxFindReplaceData, getReplaceString, 0}}, - {2308, {wxFindReplaceData, getFlags, 0}}, - {2309, {wxFindReplaceData, setFlags, 1}}, - {2310, {wxFindReplaceData, setFindString, 1}}, - {2311, {wxFindReplaceData, setReplaceString, 1}}, - {2312, {wxFindReplaceData, 'Destroy', undefined}}, - {2313, {wxMultiChoiceDialog, new_0, 0}}, - {2315, {wxMultiChoiceDialog, new_5, 5}}, - {2316, {wxMultiChoiceDialog, getSelections, 0}}, - {2317, {wxMultiChoiceDialog, setSelections, 1}}, - {2318, {wxMultiChoiceDialog, 'Destroy', undefined}}, - {2319, {wxSingleChoiceDialog, new_0, 0}}, - {2321, {wxSingleChoiceDialog, new_5, 5}}, - {2322, {wxSingleChoiceDialog, getSelection, 0}}, - {2323, {wxSingleChoiceDialog, getStringSelection, 0}}, - {2324, {wxSingleChoiceDialog, setSelection, 1}}, - {2325, {wxSingleChoiceDialog, 'Destroy', undefined}}, - {2326, {wxTextEntryDialog, new, 3}}, - {2327, {wxTextEntryDialog, getValue, 0}}, - {2328, {wxTextEntryDialog, setValue, 1}}, - {2329, {wxTextEntryDialog, 'Destroy', undefined}}, - {2330, {wxPasswordEntryDialog, new, 3}}, - {2331, {wxPasswordEntryDialog, 'Destroy', undefined}}, - {2332, {wxFontData, new_0, 0}}, - {2333, {wxFontData, new_1, 1}}, - {2334, {wxFontData, destruct, 0}}, - {2335, {wxFontData, enableEffects, 1}}, - {2336, {wxFontData, getAllowSymbols, 0}}, - {2337, {wxFontData, getColour, 0}}, - {2338, {wxFontData, getChosenFont, 0}}, - {2339, {wxFontData, getEnableEffects, 0}}, - {2340, {wxFontData, getInitialFont, 0}}, - {2341, {wxFontData, getShowHelp, 0}}, - {2342, {wxFontData, setAllowSymbols, 1}}, - {2343, {wxFontData, setChosenFont, 1}}, - {2344, {wxFontData, setColour, 1}}, - {2345, {wxFontData, setInitialFont, 1}}, - {2346, {wxFontData, setRange, 2}}, - {2347, {wxFontData, setShowHelp, 1}}, - {2351, {wxFontDialog, new_0, 0}}, - {2353, {wxFontDialog, new_2, 2}}, - {2355, {wxFontDialog, create, 2}}, - {2356, {wxFontDialog, getFontData, 0}}, - {2358, {wxFontDialog, 'Destroy', undefined}}, - {2359, {wxProgressDialog, new, 3}}, - {2360, {wxProgressDialog, destruct, 0}}, - {2361, {wxProgressDialog, resume, 0}}, - {2362, {wxProgressDialog, update_2, 2}}, - {2363, {wxProgressDialog, update_0, 0}}, - {2364, {wxMessageDialog, new, 3}}, - {2365, {wxMessageDialog, destruct, 0}}, - {2366, {wxPageSetupDialog, new, 2}}, - {2367, {wxPageSetupDialog, destruct, 0}}, - {2368, {wxPageSetupDialog, getPageSetupData, 0}}, - {2369, {wxPageSetupDialog, showModal, 0}}, - {2370, {wxPageSetupDialogData, new_0, 0}}, - {2371, {wxPageSetupDialogData, new_1_0, 1}}, - {2372, {wxPageSetupDialogData, new_1_1, 1}}, - {2373, {wxPageSetupDialogData, destruct, 0}}, - {2374, {wxPageSetupDialogData, enableHelp, 1}}, - {2375, {wxPageSetupDialogData, enableMargins, 1}}, - {2376, {wxPageSetupDialogData, enableOrientation, 1}}, - {2377, {wxPageSetupDialogData, enablePaper, 1}}, - {2378, {wxPageSetupDialogData, enablePrinter, 1}}, - {2379, {wxPageSetupDialogData, getDefaultMinMargins, 0}}, - {2380, {wxPageSetupDialogData, getEnableMargins, 0}}, - {2381, {wxPageSetupDialogData, getEnableOrientation, 0}}, - {2382, {wxPageSetupDialogData, getEnablePaper, 0}}, - {2383, {wxPageSetupDialogData, getEnablePrinter, 0}}, - {2384, {wxPageSetupDialogData, getEnableHelp, 0}}, - {2385, {wxPageSetupDialogData, getDefaultInfo, 0}}, - {2386, {wxPageSetupDialogData, getMarginTopLeft, 0}}, - {2387, {wxPageSetupDialogData, getMarginBottomRight, 0}}, - {2388, {wxPageSetupDialogData, getMinMarginTopLeft, 0}}, - {2389, {wxPageSetupDialogData, getMinMarginBottomRight, 0}}, - {2390, {wxPageSetupDialogData, getPaperId, 0}}, - {2391, {wxPageSetupDialogData, getPaperSize, 0}}, - {2393, {wxPageSetupDialogData, getPrintData, 0}}, - {2394, {wxPageSetupDialogData, isOk, 0}}, - {2395, {wxPageSetupDialogData, setDefaultInfo, 1}}, - {2396, {wxPageSetupDialogData, setDefaultMinMargins, 1}}, - {2397, {wxPageSetupDialogData, setMarginTopLeft, 1}}, - {2398, {wxPageSetupDialogData, setMarginBottomRight, 1}}, - {2399, {wxPageSetupDialogData, setMinMarginTopLeft, 1}}, - {2400, {wxPageSetupDialogData, setMinMarginBottomRight, 1}}, - {2401, {wxPageSetupDialogData, setPaperId, 1}}, - {2402, {wxPageSetupDialogData, setPaperSize_1_1, 1}}, - {2403, {wxPageSetupDialogData, setPaperSize_1_0, 1}}, - {2404, {wxPageSetupDialogData, setPrintData, 1}}, - {2405, {wxPrintDialog, new_2_0, 2}}, - {2406, {wxPrintDialog, new_2_1, 2}}, - {2407, {wxPrintDialog, destruct, 0}}, - {2408, {wxPrintDialog, getPrintDialogData, 0}}, - {2409, {wxPrintDialog, getPrintDC, 0}}, - {2410, {wxPrintDialogData, new_0, 0}}, - {2411, {wxPrintDialogData, new_1_1, 1}}, - {2412, {wxPrintDialogData, new_1_0, 1}}, - {2413, {wxPrintDialogData, destruct, 0}}, - {2414, {wxPrintDialogData, enableHelp, 1}}, - {2415, {wxPrintDialogData, enablePageNumbers, 1}}, - {2416, {wxPrintDialogData, enablePrintToFile, 1}}, - {2417, {wxPrintDialogData, enableSelection, 1}}, - {2418, {wxPrintDialogData, getAllPages, 0}}, - {2419, {wxPrintDialogData, getCollate, 0}}, - {2420, {wxPrintDialogData, getFromPage, 0}}, - {2421, {wxPrintDialogData, getMaxPage, 0}}, - {2422, {wxPrintDialogData, getMinPage, 0}}, - {2423, {wxPrintDialogData, getNoCopies, 0}}, - {2424, {wxPrintDialogData, getPrintData, 0}}, - {2425, {wxPrintDialogData, getPrintToFile, 0}}, - {2426, {wxPrintDialogData, getSelection, 0}}, - {2427, {wxPrintDialogData, getToPage, 0}}, - {2428, {wxPrintDialogData, isOk, 0}}, - {2429, {wxPrintDialogData, setCollate, 1}}, - {2430, {wxPrintDialogData, setFromPage, 1}}, - {2431, {wxPrintDialogData, setMaxPage, 1}}, - {2432, {wxPrintDialogData, setMinPage, 1}}, - {2433, {wxPrintDialogData, setNoCopies, 1}}, - {2434, {wxPrintDialogData, setPrintData, 1}}, - {2435, {wxPrintDialogData, setPrintToFile, 1}}, - {2436, {wxPrintDialogData, setSelection, 1}}, - {2437, {wxPrintDialogData, setToPage, 1}}, - {2438, {wxPrintData, new_0, 0}}, - {2439, {wxPrintData, new_1, 1}}, - {2440, {wxPrintData, destruct, 0}}, - {2441, {wxPrintData, getCollate, 0}}, - {2442, {wxPrintData, getBin, 0}}, - {2443, {wxPrintData, getColour, 0}}, - {2444, {wxPrintData, getDuplex, 0}}, - {2445, {wxPrintData, getNoCopies, 0}}, - {2446, {wxPrintData, getOrientation, 0}}, - {2447, {wxPrintData, getPaperId, 0}}, - {2448, {wxPrintData, getPrinterName, 0}}, - {2449, {wxPrintData, getQuality, 0}}, - {2450, {wxPrintData, isOk, 0}}, - {2451, {wxPrintData, setBin, 1}}, - {2452, {wxPrintData, setCollate, 1}}, - {2453, {wxPrintData, setColour, 1}}, - {2454, {wxPrintData, setDuplex, 1}}, - {2455, {wxPrintData, setNoCopies, 1}}, - {2456, {wxPrintData, setOrientation, 1}}, - {2457, {wxPrintData, setPaperId, 1}}, - {2458, {wxPrintData, setPrinterName, 1}}, - {2459, {wxPrintData, setQuality, 1}}, - {2462, {wxPrintPreview, new_2, 2}}, - {2463, {wxPrintPreview, new_3, 3}}, - {2465, {wxPrintPreview, destruct, 0}}, - {2466, {wxPrintPreview, getCanvas, 0}}, - {2467, {wxPrintPreview, getCurrentPage, 0}}, - {2468, {wxPrintPreview, getFrame, 0}}, - {2469, {wxPrintPreview, getMaxPage, 0}}, - {2470, {wxPrintPreview, getMinPage, 0}}, - {2471, {wxPrintPreview, getPrintout, 0}}, - {2472, {wxPrintPreview, getPrintoutForPrinting, 0}}, - {2473, {wxPrintPreview, isOk, 0}}, - {2474, {wxPrintPreview, paintPage, 2}}, - {2475, {wxPrintPreview, print, 1}}, - {2476, {wxPrintPreview, renderPage, 1}}, - {2477, {wxPrintPreview, setCanvas, 1}}, - {2478, {wxPrintPreview, setCurrentPage, 1}}, - {2479, {wxPrintPreview, setFrame, 1}}, - {2480, {wxPrintPreview, setPrintout, 1}}, - {2481, {wxPrintPreview, setZoom, 1}}, - {2482, {wxPreviewFrame, new, 3}}, - {2483, {wxPreviewFrame, destruct, 0}}, - {2484, {wxPreviewFrame, createControlBar, 0}}, - {2485, {wxPreviewFrame, createCanvas, 0}}, - {2486, {wxPreviewFrame, initialize, 0}}, - {2487, {wxPreviewFrame, onCloseWindow, 1}}, - {2488, {wxPreviewControlBar, new, 4}}, - {2489, {wxPreviewControlBar, destruct, 0}}, - {2490, {wxPreviewControlBar, createButtons, 0}}, - {2491, {wxPreviewControlBar, getPrintPreview, 0}}, - {2492, {wxPreviewControlBar, getZoomControl, 0}}, - {2493, {wxPreviewControlBar, setZoomControl, 1}}, - {2495, {wxPrinter, new, 1}}, - {2496, {wxPrinter, createAbortWindow, 2}}, - {2497, {wxPrinter, getAbort, 0}}, - {2498, {wxPrinter, getLastError, 0}}, - {2499, {wxPrinter, getPrintDialogData, 0}}, - {2500, {wxPrinter, print, 3}}, - {2501, {wxPrinter, printDialog, 1}}, - {2502, {wxPrinter, reportError, 3}}, - {2503, {wxPrinter, setup, 1}}, - {2504, {wxPrinter, 'Destroy', undefined}}, - {2505, {wxXmlResource, new_1, 1}}, - {2506, {wxXmlResource, new_2, 2}}, - {2507, {wxXmlResource, destruct, 0}}, - {2508, {wxXmlResource, attachUnknownControl, 3}}, - {2509, {wxXmlResource, clearHandlers, 0}}, - {2510, {wxXmlResource, compareVersion, 4}}, - {2511, {wxXmlResource, get, 0}}, - {2512, {wxXmlResource, getFlags, 0}}, - {2513, {wxXmlResource, getVersion, 0}}, - {2514, {wxXmlResource, getXRCID, 2}}, - {2515, {wxXmlResource, initAllHandlers, 0}}, - {2516, {wxXmlResource, load, 1}}, - {2517, {wxXmlResource, loadBitmap, 1}}, - {2518, {wxXmlResource, loadDialog_2, 2}}, - {2519, {wxXmlResource, loadDialog_3, 3}}, - {2520, {wxXmlResource, loadFrame_2, 2}}, - {2521, {wxXmlResource, loadFrame_3, 3}}, - {2522, {wxXmlResource, loadIcon, 1}}, - {2523, {wxXmlResource, loadMenu, 1}}, - {2524, {wxXmlResource, loadMenuBar_2, 2}}, - {2525, {wxXmlResource, loadMenuBar_1, 1}}, - {2526, {wxXmlResource, loadPanel_2, 2}}, - {2527, {wxXmlResource, loadPanel_3, 3}}, - {2528, {wxXmlResource, loadToolBar, 2}}, - {2529, {wxXmlResource, set, 1}}, - {2530, {wxXmlResource, setFlags, 1}}, - {2531, {wxXmlResource, unload, 1}}, - {2532, {wxXmlResource, xrcctrl, 3}}, - {2533, {wxHtmlEasyPrinting, new, 1}}, - {2534, {wxHtmlEasyPrinting, destruct, 0}}, - {2535, {wxHtmlEasyPrinting, getPrintData, 0}}, - {2536, {wxHtmlEasyPrinting, getPageSetupData, 0}}, - {2537, {wxHtmlEasyPrinting, previewFile, 1}}, - {2538, {wxHtmlEasyPrinting, previewText, 2}}, - {2539, {wxHtmlEasyPrinting, printFile, 1}}, - {2540, {wxHtmlEasyPrinting, printText, 2}}, - {2541, {wxHtmlEasyPrinting, pageSetup, 0}}, - {2542, {wxHtmlEasyPrinting, setFonts, 3}}, - {2543, {wxHtmlEasyPrinting, setHeader, 2}}, - {2544, {wxHtmlEasyPrinting, setFooter, 2}}, - {2546, {wxGLCanvas, new_2, 2}}, - {2547, {wxGLCanvas, new_3_1, 3}}, - {2548, {wxGLCanvas, new_3_0, 3}}, - {2549, {wxGLCanvas, getContext, 0}}, - {2551, {wxGLCanvas, setCurrent, 0}}, - {2552, {wxGLCanvas, swapBuffers, 0}}, - {2553, {wxGLCanvas, 'Destroy', undefined}}, - {2554, {wxAuiManager, new, 1}}, - {2555, {wxAuiManager, destruct, 0}}, - {2556, {wxAuiManager, addPane_2_1, 2}}, - {2557, {wxAuiManager, addPane_3, 3}}, - {2558, {wxAuiManager, addPane_2_0, 2}}, - {2559, {wxAuiManager, detachPane, 1}}, - {2560, {wxAuiManager, getAllPanes, 0}}, - {2561, {wxAuiManager, getArtProvider, 0}}, - {2562, {wxAuiManager, getDockSizeConstraint, 2}}, - {2563, {wxAuiManager, getFlags, 0}}, - {2564, {wxAuiManager, getManagedWindow, 0}}, - {2565, {wxAuiManager, getManager, 1}}, - {2566, {wxAuiManager, getPane_1_1, 1}}, - {2567, {wxAuiManager, getPane_1_0, 1}}, - {2568, {wxAuiManager, hideHint, 0}}, - {2569, {wxAuiManager, insertPane, 3}}, - {2570, {wxAuiManager, loadPaneInfo, 2}}, - {2571, {wxAuiManager, loadPerspective, 2}}, - {2572, {wxAuiManager, savePaneInfo, 1}}, - {2573, {wxAuiManager, savePerspective, 0}}, - {2574, {wxAuiManager, setArtProvider, 1}}, - {2575, {wxAuiManager, setDockSizeConstraint, 2}}, - {2576, {wxAuiManager, setFlags, 1}}, - {2577, {wxAuiManager, setManagedWindow, 1}}, - {2578, {wxAuiManager, showHint, 1}}, - {2579, {wxAuiManager, unInit, 0}}, - {2580, {wxAuiManager, update, 0}}, - {2581, {wxAuiPaneInfo, new_0, 0}}, - {2582, {wxAuiPaneInfo, new_1, 1}}, - {2583, {wxAuiPaneInfo, destruct, 0}}, - {2584, {wxAuiPaneInfo, bestSize_1, 1}}, - {2585, {wxAuiPaneInfo, bestSize_2, 2}}, - {2586, {wxAuiPaneInfo, bottom, 0}}, - {2587, {wxAuiPaneInfo, bottomDockable, 1}}, - {2588, {wxAuiPaneInfo, caption, 1}}, - {2589, {wxAuiPaneInfo, captionVisible, 1}}, - {2590, {wxAuiPaneInfo, centre, 0}}, - {2591, {wxAuiPaneInfo, centrePane, 0}}, - {2592, {wxAuiPaneInfo, closeButton, 1}}, - {2593, {wxAuiPaneInfo, defaultPane, 0}}, - {2594, {wxAuiPaneInfo, destroyOnClose, 1}}, - {2595, {wxAuiPaneInfo, direction, 1}}, - {2596, {wxAuiPaneInfo, dock, 0}}, - {2597, {wxAuiPaneInfo, dockable, 1}}, - {2598, {wxAuiPaneInfo, fixed, 0}}, - {2599, {wxAuiPaneInfo, float, 0}}, - {2600, {wxAuiPaneInfo, floatable, 1}}, - {2601, {wxAuiPaneInfo, floatingPosition_1, 1}}, - {2602, {wxAuiPaneInfo, floatingPosition_2, 2}}, - {2603, {wxAuiPaneInfo, floatingSize_1, 1}}, - {2604, {wxAuiPaneInfo, floatingSize_2, 2}}, - {2605, {wxAuiPaneInfo, gripper, 1}}, - {2606, {wxAuiPaneInfo, gripperTop, 1}}, - {2607, {wxAuiPaneInfo, hasBorder, 0}}, - {2608, {wxAuiPaneInfo, hasCaption, 0}}, - {2609, {wxAuiPaneInfo, hasCloseButton, 0}}, - {2610, {wxAuiPaneInfo, hasFlag, 1}}, - {2611, {wxAuiPaneInfo, hasGripper, 0}}, - {2612, {wxAuiPaneInfo, hasGripperTop, 0}}, - {2613, {wxAuiPaneInfo, hasMaximizeButton, 0}}, - {2614, {wxAuiPaneInfo, hasMinimizeButton, 0}}, - {2615, {wxAuiPaneInfo, hasPinButton, 0}}, - {2616, {wxAuiPaneInfo, hide, 0}}, - {2617, {wxAuiPaneInfo, isBottomDockable, 0}}, - {2618, {wxAuiPaneInfo, isDocked, 0}}, - {2619, {wxAuiPaneInfo, isFixed, 0}}, - {2620, {wxAuiPaneInfo, isFloatable, 0}}, - {2621, {wxAuiPaneInfo, isFloating, 0}}, - {2622, {wxAuiPaneInfo, isLeftDockable, 0}}, - {2623, {wxAuiPaneInfo, isMovable, 0}}, - {2624, {wxAuiPaneInfo, isOk, 0}}, - {2625, {wxAuiPaneInfo, isResizable, 0}}, - {2626, {wxAuiPaneInfo, isRightDockable, 0}}, - {2627, {wxAuiPaneInfo, isShown, 0}}, - {2628, {wxAuiPaneInfo, isToolbar, 0}}, - {2629, {wxAuiPaneInfo, isTopDockable, 0}}, - {2630, {wxAuiPaneInfo, layer, 1}}, - {2631, {wxAuiPaneInfo, left, 0}}, - {2632, {wxAuiPaneInfo, leftDockable, 1}}, - {2633, {wxAuiPaneInfo, maxSize_1, 1}}, - {2634, {wxAuiPaneInfo, maxSize_2, 2}}, - {2635, {wxAuiPaneInfo, maximizeButton, 1}}, - {2636, {wxAuiPaneInfo, minSize_1, 1}}, - {2637, {wxAuiPaneInfo, minSize_2, 2}}, - {2638, {wxAuiPaneInfo, minimizeButton, 1}}, - {2639, {wxAuiPaneInfo, movable, 1}}, - {2640, {wxAuiPaneInfo, name, 1}}, - {2641, {wxAuiPaneInfo, paneBorder, 1}}, - {2642, {wxAuiPaneInfo, pinButton, 1}}, - {2643, {wxAuiPaneInfo, position, 1}}, - {2644, {wxAuiPaneInfo, resizable, 1}}, - {2645, {wxAuiPaneInfo, right, 0}}, - {2646, {wxAuiPaneInfo, rightDockable, 1}}, - {2647, {wxAuiPaneInfo, row, 1}}, - {2648, {wxAuiPaneInfo, safeSet, 1}}, - {2649, {wxAuiPaneInfo, setFlag, 2}}, - {2650, {wxAuiPaneInfo, show, 1}}, - {2651, {wxAuiPaneInfo, toolbarPane, 0}}, - {2652, {wxAuiPaneInfo, top, 0}}, - {2653, {wxAuiPaneInfo, topDockable, 1}}, - {2654, {wxAuiPaneInfo, window, 1}}, - {2655, {wxAuiPaneInfo, getWindow, 0}}, - {2656, {wxAuiPaneInfo, getFrame, 0}}, - {2657, {wxAuiPaneInfo, getDirection, 0}}, - {2658, {wxAuiPaneInfo, getLayer, 0}}, - {2659, {wxAuiPaneInfo, getRow, 0}}, - {2660, {wxAuiPaneInfo, getPosition, 0}}, - {2661, {wxAuiPaneInfo, getFloatingPosition, 0}}, - {2662, {wxAuiPaneInfo, getFloatingSize, 0}}, - {2663, {wxAuiNotebook, new_0, 0}}, - {2664, {wxAuiNotebook, new_2, 2}}, - {2665, {wxAuiNotebook, addPage, 3}}, - {2666, {wxAuiNotebook, create, 2}}, - {2667, {wxAuiNotebook, deletePage, 1}}, - {2668, {wxAuiNotebook, getArtProvider, 0}}, - {2669, {wxAuiNotebook, getPage, 1}}, - {2670, {wxAuiNotebook, getPageBitmap, 1}}, - {2671, {wxAuiNotebook, getPageCount, 0}}, - {2672, {wxAuiNotebook, getPageIndex, 1}}, - {2673, {wxAuiNotebook, getPageText, 1}}, - {2674, {wxAuiNotebook, getSelection, 0}}, - {2675, {wxAuiNotebook, insertPage, 4}}, - {2676, {wxAuiNotebook, removePage, 1}}, - {2677, {wxAuiNotebook, setArtProvider, 1}}, - {2678, {wxAuiNotebook, setFont, 1}}, - {2679, {wxAuiNotebook, setPageBitmap, 2}}, - {2680, {wxAuiNotebook, setPageText, 2}}, - {2681, {wxAuiNotebook, setSelection, 1}}, - {2682, {wxAuiNotebook, setTabCtrlHeight, 1}}, - {2683, {wxAuiNotebook, setUniformBitmapSize, 1}}, - {2684, {wxAuiNotebook, 'Destroy', undefined}}, - {2685, {wxAuiTabArt, setFlags, 1}}, - {2686, {wxAuiTabArt, setMeasuringFont, 1}}, - {2687, {wxAuiTabArt, setNormalFont, 1}}, - {2688, {wxAuiTabArt, setSelectedFont, 1}}, - {2689, {wxAuiTabArt, setColour, 1}}, - {2690, {wxAuiTabArt, setActiveColour, 1}}, - {2691, {wxAuiDockArt, getColour, 1}}, - {2692, {wxAuiDockArt, getFont, 1}}, - {2693, {wxAuiDockArt, getMetric, 1}}, - {2694, {wxAuiDockArt, setColour, 2}}, - {2695, {wxAuiDockArt, setFont, 2}}, - {2696, {wxAuiDockArt, setMetric, 2}}, - {2697, {wxAuiSimpleTabArt, new, 0}}, - {2698, {wxAuiSimpleTabArt, 'Destroy', undefined}}, - {2699, {wxMDIParentFrame, new_0, 0}}, - {2700, {wxMDIParentFrame, new_4, 4}}, - {2701, {wxMDIParentFrame, destruct, 0}}, - {2702, {wxMDIParentFrame, activateNext, 0}}, - {2703, {wxMDIParentFrame, activatePrevious, 0}}, - {2704, {wxMDIParentFrame, arrangeIcons, 0}}, - {2705, {wxMDIParentFrame, cascade, 0}}, - {2706, {wxMDIParentFrame, create, 4}}, - {2707, {wxMDIParentFrame, getActiveChild, 0}}, - {2708, {wxMDIParentFrame, getClientWindow, 0}}, - {2709, {wxMDIParentFrame, tile, 1}}, - {2710, {wxMDIChildFrame, new_0, 0}}, - {2711, {wxMDIChildFrame, new_4, 4}}, - {2712, {wxMDIChildFrame, destruct, 0}}, - {2713, {wxMDIChildFrame, activate, 0}}, - {2714, {wxMDIChildFrame, create, 4}}, - {2715, {wxMDIChildFrame, maximize, 1}}, - {2716, {wxMDIChildFrame, restore, 0}}, - {2717, {wxMDIClientWindow, new_0, 0}}, - {2718, {wxMDIClientWindow, new_2, 2}}, - {2719, {wxMDIClientWindow, destruct, 0}}, - {2720, {wxMDIClientWindow, createClient, 2}}, - {2721, {wxLayoutAlgorithm, new, 0}}, - {2722, {wxLayoutAlgorithm, layoutFrame, 2}}, - {2723, {wxLayoutAlgorithm, layoutMDIFrame, 2}}, - {2724, {wxLayoutAlgorithm, layoutWindow, 2}}, - {2725, {wxLayoutAlgorithm, 'Destroy', undefined}}, - {2726, {wxEvent, getId, 0}}, - {2727, {wxEvent, getSkipped, 0}}, - {2728, {wxEvent, getTimestamp, 0}}, - {2729, {wxEvent, isCommandEvent, 0}}, - {2730, {wxEvent, resumePropagation, 1}}, - {2731, {wxEvent, shouldPropagate, 0}}, - {2732, {wxEvent, skip, 1}}, - {2733, {wxEvent, stopPropagation, 0}}, - {2734, {wxCommandEvent, getClientData, 0}}, - {2735, {wxCommandEvent, getExtraLong, 0}}, - {2736, {wxCommandEvent, getInt, 0}}, - {2737, {wxCommandEvent, getSelection, 0}}, - {2738, {wxCommandEvent, getString, 0}}, - {2739, {wxCommandEvent, isChecked, 0}}, - {2740, {wxCommandEvent, isSelection, 0}}, - {2741, {wxCommandEvent, setInt, 1}}, - {2742, {wxCommandEvent, setString, 1}}, - {2743, {wxScrollEvent, getOrientation, 0}}, - {2744, {wxScrollEvent, getPosition, 0}}, - {2745, {wxScrollWinEvent, getOrientation, 0}}, - {2746, {wxScrollWinEvent, getPosition, 0}}, - {2747, {wxMouseEvent, altDown, 0}}, - {2748, {wxMouseEvent, button, 1}}, - {2749, {wxMouseEvent, buttonDClick, 1}}, - {2750, {wxMouseEvent, buttonDown, 1}}, - {2751, {wxMouseEvent, buttonUp, 1}}, - {2752, {wxMouseEvent, cmdDown, 0}}, - {2753, {wxMouseEvent, controlDown, 0}}, - {2754, {wxMouseEvent, dragging, 0}}, - {2755, {wxMouseEvent, entering, 0}}, - {2756, {wxMouseEvent, getButton, 0}}, - {2759, {wxMouseEvent, getPosition, 0}}, - {2760, {wxMouseEvent, getLogicalPosition, 1}}, - {2761, {wxMouseEvent, getLinesPerAction, 0}}, - {2762, {wxMouseEvent, getWheelRotation, 0}}, - {2763, {wxMouseEvent, getWheelDelta, 0}}, - {2764, {wxMouseEvent, getX, 0}}, - {2765, {wxMouseEvent, getY, 0}}, - {2766, {wxMouseEvent, isButton, 0}}, - {2767, {wxMouseEvent, isPageScroll, 0}}, - {2768, {wxMouseEvent, leaving, 0}}, - {2769, {wxMouseEvent, leftDClick, 0}}, - {2770, {wxMouseEvent, leftDown, 0}}, - {2771, {wxMouseEvent, leftIsDown, 0}}, - {2772, {wxMouseEvent, leftUp, 0}}, - {2773, {wxMouseEvent, metaDown, 0}}, - {2774, {wxMouseEvent, middleDClick, 0}}, - {2775, {wxMouseEvent, middleDown, 0}}, - {2776, {wxMouseEvent, middleIsDown, 0}}, - {2777, {wxMouseEvent, middleUp, 0}}, - {2778, {wxMouseEvent, moving, 0}}, - {2779, {wxMouseEvent, rightDClick, 0}}, - {2780, {wxMouseEvent, rightDown, 0}}, - {2781, {wxMouseEvent, rightIsDown, 0}}, - {2782, {wxMouseEvent, rightUp, 0}}, - {2783, {wxMouseEvent, shiftDown, 0}}, - {2784, {wxSetCursorEvent, getCursor, 0}}, - {2785, {wxSetCursorEvent, getX, 0}}, - {2786, {wxSetCursorEvent, getY, 0}}, - {2787, {wxSetCursorEvent, hasCursor, 0}}, - {2788, {wxSetCursorEvent, setCursor, 1}}, - {2789, {wxKeyEvent, altDown, 0}}, - {2790, {wxKeyEvent, cmdDown, 0}}, - {2791, {wxKeyEvent, controlDown, 0}}, - {2792, {wxKeyEvent, getKeyCode, 0}}, - {2793, {wxKeyEvent, getModifiers, 0}}, - {2796, {wxKeyEvent, getPosition, 0}}, - {2797, {wxKeyEvent, getRawKeyCode, 0}}, - {2798, {wxKeyEvent, getRawKeyFlags, 0}}, - {2799, {wxKeyEvent, getUnicodeKey, 0}}, - {2800, {wxKeyEvent, getX, 0}}, - {2801, {wxKeyEvent, getY, 0}}, - {2802, {wxKeyEvent, hasModifiers, 0}}, - {2803, {wxKeyEvent, metaDown, 0}}, - {2804, {wxKeyEvent, shiftDown, 0}}, - {2805, {wxSizeEvent, getSize, 0}}, - {2806, {wxMoveEvent, getPosition, 0}}, - {2807, {wxEraseEvent, getDC, 0}}, - {2808, {wxFocusEvent, getWindow, 0}}, - {2809, {wxChildFocusEvent, getWindow, 0}}, - {2810, {wxMenuEvent, getMenu, 0}}, - {2811, {wxMenuEvent, getMenuId, 0}}, - {2812, {wxMenuEvent, isPopup, 0}}, - {2813, {wxCloseEvent, canVeto, 0}}, - {2814, {wxCloseEvent, getLoggingOff, 0}}, - {2815, {wxCloseEvent, setCanVeto, 1}}, - {2816, {wxCloseEvent, setLoggingOff, 1}}, - {2817, {wxCloseEvent, veto, 1}}, - {2818, {wxShowEvent, setShow, 1}}, - {2819, {wxShowEvent, getShow, 0}}, - {2820, {wxIconizeEvent, iconized, 0}}, - {2821, {wxJoystickEvent, buttonDown, 1}}, - {2822, {wxJoystickEvent, buttonIsDown, 1}}, - {2823, {wxJoystickEvent, buttonUp, 1}}, - {2824, {wxJoystickEvent, getButtonChange, 0}}, - {2825, {wxJoystickEvent, getButtonState, 0}}, - {2826, {wxJoystickEvent, getJoystick, 0}}, - {2827, {wxJoystickEvent, getPosition, 0}}, - {2828, {wxJoystickEvent, getZPosition, 0}}, - {2829, {wxJoystickEvent, isButton, 0}}, - {2830, {wxJoystickEvent, isMove, 0}}, - {2831, {wxJoystickEvent, isZMove, 0}}, - {2832, {wxUpdateUIEvent, canUpdate, 1}}, - {2833, {wxUpdateUIEvent, check, 1}}, - {2834, {wxUpdateUIEvent, enable, 1}}, - {2835, {wxUpdateUIEvent, show, 1}}, - {2836, {wxUpdateUIEvent, getChecked, 0}}, - {2837, {wxUpdateUIEvent, getEnabled, 0}}, - {2838, {wxUpdateUIEvent, getShown, 0}}, - {2839, {wxUpdateUIEvent, getSetChecked, 0}}, - {2840, {wxUpdateUIEvent, getSetEnabled, 0}}, - {2841, {wxUpdateUIEvent, getSetShown, 0}}, - {2842, {wxUpdateUIEvent, getSetText, 0}}, - {2843, {wxUpdateUIEvent, getText, 0}}, - {2844, {wxUpdateUIEvent, getMode, 0}}, - {2845, {wxUpdateUIEvent, getUpdateInterval, 0}}, - {2846, {wxUpdateUIEvent, resetUpdateTime, 0}}, - {2847, {wxUpdateUIEvent, setMode, 1}}, - {2848, {wxUpdateUIEvent, setText, 1}}, - {2849, {wxUpdateUIEvent, setUpdateInterval, 1}}, - {2850, {wxMouseCaptureChangedEvent, getCapturedWindow, 0}}, - {2851, {wxPaletteChangedEvent, setChangedWindow, 1}}, - {2852, {wxPaletteChangedEvent, getChangedWindow, 0}}, - {2853, {wxQueryNewPaletteEvent, setPaletteRealized, 1}}, - {2854, {wxQueryNewPaletteEvent, getPaletteRealized, 0}}, - {2855, {wxNavigationKeyEvent, getDirection, 0}}, - {2856, {wxNavigationKeyEvent, setDirection, 1}}, - {2857, {wxNavigationKeyEvent, isWindowChange, 0}}, - {2858, {wxNavigationKeyEvent, setWindowChange, 1}}, - {2859, {wxNavigationKeyEvent, isFromTab, 0}}, - {2860, {wxNavigationKeyEvent, setFromTab, 1}}, - {2861, {wxNavigationKeyEvent, getCurrentFocus, 0}}, - {2862, {wxNavigationKeyEvent, setCurrentFocus, 1}}, - {2863, {wxHelpEvent, getOrigin, 0}}, - {2864, {wxHelpEvent, getPosition, 0}}, - {2865, {wxHelpEvent, setOrigin, 1}}, - {2866, {wxHelpEvent, setPosition, 1}}, - {2867, {wxContextMenuEvent, getPosition, 0}}, - {2868, {wxContextMenuEvent, setPosition, 1}}, - {2869, {wxIdleEvent, canSend, 1}}, - {2870, {wxIdleEvent, getMode, 0}}, - {2871, {wxIdleEvent, requestMore, 1}}, - {2872, {wxIdleEvent, moreRequested, 0}}, - {2873, {wxIdleEvent, setMode, 1}}, - {2874, {wxGridEvent, altDown, 0}}, - {2875, {wxGridEvent, controlDown, 0}}, - {2876, {wxGridEvent, getCol, 0}}, - {2877, {wxGridEvent, getPosition, 0}}, - {2878, {wxGridEvent, getRow, 0}}, - {2879, {wxGridEvent, metaDown, 0}}, - {2880, {wxGridEvent, selecting, 0}}, - {2881, {wxGridEvent, shiftDown, 0}}, - {2882, {wxNotifyEvent, allow, 0}}, - {2883, {wxNotifyEvent, isAllowed, 0}}, - {2884, {wxNotifyEvent, veto, 0}}, - {2885, {wxSashEvent, getEdge, 0}}, - {2886, {wxSashEvent, getDragRect, 0}}, - {2887, {wxSashEvent, getDragStatus, 0}}, - {2888, {wxListEvent, getCacheFrom, 0}}, - {2889, {wxListEvent, getCacheTo, 0}}, - {2890, {wxListEvent, getKeyCode, 0}}, - {2891, {wxListEvent, getIndex, 0}}, - {2892, {wxListEvent, getColumn, 0}}, - {2893, {wxListEvent, getPoint, 0}}, - {2894, {wxListEvent, getLabel, 0}}, - {2895, {wxListEvent, getText, 0}}, - {2896, {wxListEvent, getImage, 0}}, - {2897, {wxListEvent, getData, 0}}, - {2898, {wxListEvent, getMask, 0}}, - {2899, {wxListEvent, getItem, 0}}, - {2900, {wxListEvent, isEditCancelled, 0}}, - {2901, {wxDateEvent, getDate, 0}}, - {2902, {wxCalendarEvent, getWeekDay, 0}}, - {2903, {wxFileDirPickerEvent, getPath, 0}}, - {2904, {wxColourPickerEvent, getColour, 0}}, - {2905, {wxFontPickerEvent, getFont, 0}}, - {2906, {wxStyledTextEvent, getPosition, 0}}, - {2907, {wxStyledTextEvent, getKey, 0}}, - {2908, {wxStyledTextEvent, getModifiers, 0}}, - {2909, {wxStyledTextEvent, getModificationType, 0}}, - {2910, {wxStyledTextEvent, getText, 0}}, - {2911, {wxStyledTextEvent, getLength, 0}}, - {2912, {wxStyledTextEvent, getLinesAdded, 0}}, - {2913, {wxStyledTextEvent, getLine, 0}}, - {2914, {wxStyledTextEvent, getFoldLevelNow, 0}}, - {2915, {wxStyledTextEvent, getFoldLevelPrev, 0}}, - {2916, {wxStyledTextEvent, getMargin, 0}}, - {2917, {wxStyledTextEvent, getMessage, 0}}, - {2918, {wxStyledTextEvent, getWParam, 0}}, - {2919, {wxStyledTextEvent, getLParam, 0}}, - {2920, {wxStyledTextEvent, getListType, 0}}, - {2921, {wxStyledTextEvent, getX, 0}}, - {2922, {wxStyledTextEvent, getY, 0}}, - {2923, {wxStyledTextEvent, getDragText, 0}}, - {2924, {wxStyledTextEvent, getDragAllowMove, 0}}, - {2925, {wxStyledTextEvent, getDragResult, 0}}, - {2926, {wxStyledTextEvent, getShift, 0}}, - {2927, {wxStyledTextEvent, getControl, 0}}, - {2928, {wxStyledTextEvent, getAlt, 0}}, - {2929, {utils, getKeyState, 1}}, - {2930, {utils, getMousePosition, 2}}, - {2931, {utils, getMouseState, 0}}, - {2932, {utils, setDetectableAutoRepeat, 1}}, - {2933, {utils, bell, 0}}, - {2934, {utils, findMenuItemId, 3}}, - {2935, {utils, genericFindWindowAtPoint, 1}}, - {2936, {utils, findWindowAtPoint, 1}}, - {2937, {utils, beginBusyCursor, 1}}, - {2938, {utils, endBusyCursor, 0}}, - {2939, {utils, isBusy, 0}}, - {2940, {utils, shutdown, 1}}, - {2941, {utils, shell, 1}}, - {2942, {utils, launchDefaultBrowser, 2}}, - {2943, {utils, getEmailAddress, 0}}, - {2944, {utils, getUserId, 0}}, - {2945, {utils, getHomeDir, 0}}, - {2946, {utils, newId, 0}}, - {2947, {utils, registerId, 1}}, - {2948, {utils, getCurrentId, 0}}, - {2949, {utils, getOsDescription, 0}}, - {2950, {utils, isPlatformLittleEndian, 0}}, - {2951, {utils, isPlatform64Bit, 0}}, - {2952, {gdicmn, displaySize, 2}}, - {2953, {gdicmn, setCursor, 1}}, - {2954, {wxPrintout, new, 1}}, - {2955, {wxPrintout, destruct, 0}}, - {2956, {wxPrintout, getDC, 0}}, - {2957, {wxPrintout, getPageSizeMM, 2}}, - {2958, {wxPrintout, getPageSizePixels, 2}}, - {2959, {wxPrintout, getPaperRectPixels, 0}}, - {2960, {wxPrintout, getPPIPrinter, 2}}, - {2961, {wxPrintout, getPPIScreen, 2}}, - {2962, {wxPrintout, getTitle, 0}}, - {2963, {wxPrintout, isPreview, 0}}, - {2964, {wxPrintout, fitThisSizeToPaper, 1}}, - {2965, {wxPrintout, fitThisSizeToPage, 1}}, - {2966, {wxPrintout, fitThisSizeToPageMargins, 2}}, - {2967, {wxPrintout, mapScreenSizeToPaper, 0}}, - {2968, {wxPrintout, mapScreenSizeToPage, 0}}, - {2969, {wxPrintout, mapScreenSizeToPageMargins, 1}}, - {2970, {wxPrintout, mapScreenSizeToDevice, 0}}, - {2971, {wxPrintout, getLogicalPaperRect, 0}}, - {2972, {wxPrintout, getLogicalPageRect, 0}}, - {2973, {wxPrintout, getLogicalPageMarginsRect, 1}}, - {2974, {wxPrintout, setLogicalOrigin, 2}}, - {2975, {wxPrintout, offsetLogicalOrigin, 2}}, - {2976, {wxStyledTextCtrl, new_2, 2}}, - {2977, {wxStyledTextCtrl, new_0, 0}}, - {2978, {wxStyledTextCtrl, destruct, 0}}, - {2979, {wxStyledTextCtrl, create, 2}}, - {2980, {wxStyledTextCtrl, addText, 1}}, - {2981, {wxStyledTextCtrl, addStyledText, 1}}, - {2982, {wxStyledTextCtrl, insertText, 2}}, - {2983, {wxStyledTextCtrl, clearAll, 0}}, - {2984, {wxStyledTextCtrl, clearDocumentStyle, 0}}, - {2985, {wxStyledTextCtrl, getLength, 0}}, - {2986, {wxStyledTextCtrl, getCharAt, 1}}, - {2987, {wxStyledTextCtrl, getCurrentPos, 0}}, - {2988, {wxStyledTextCtrl, getAnchor, 0}}, - {2989, {wxStyledTextCtrl, getStyleAt, 1}}, - {2990, {wxStyledTextCtrl, redo, 0}}, - {2991, {wxStyledTextCtrl, setUndoCollection, 1}}, - {2992, {wxStyledTextCtrl, selectAll, 0}}, - {2993, {wxStyledTextCtrl, setSavePoint, 0}}, - {2994, {wxStyledTextCtrl, getStyledText, 2}}, - {2995, {wxStyledTextCtrl, canRedo, 0}}, - {2996, {wxStyledTextCtrl, markerLineFromHandle, 1}}, - {2997, {wxStyledTextCtrl, markerDeleteHandle, 1}}, - {2998, {wxStyledTextCtrl, getUndoCollection, 0}}, - {2999, {wxStyledTextCtrl, getViewWhiteSpace, 0}}, - {3000, {wxStyledTextCtrl, setViewWhiteSpace, 1}}, - {3001, {wxStyledTextCtrl, positionFromPoint, 1}}, - {3002, {wxStyledTextCtrl, positionFromPointClose, 2}}, - {3003, {wxStyledTextCtrl, gotoLine, 1}}, - {3004, {wxStyledTextCtrl, gotoPos, 1}}, - {3005, {wxStyledTextCtrl, setAnchor, 1}}, - {3006, {wxStyledTextCtrl, getCurLine, 1}}, - {3007, {wxStyledTextCtrl, getEndStyled, 0}}, - {3008, {wxStyledTextCtrl, convertEOLs, 1}}, - {3009, {wxStyledTextCtrl, getEOLMode, 0}}, - {3010, {wxStyledTextCtrl, setEOLMode, 1}}, - {3011, {wxStyledTextCtrl, startStyling, 2}}, - {3012, {wxStyledTextCtrl, setStyling, 2}}, - {3013, {wxStyledTextCtrl, getBufferedDraw, 0}}, - {3014, {wxStyledTextCtrl, setBufferedDraw, 1}}, - {3015, {wxStyledTextCtrl, setTabWidth, 1}}, - {3016, {wxStyledTextCtrl, getTabWidth, 0}}, - {3017, {wxStyledTextCtrl, setCodePage, 1}}, - {3018, {wxStyledTextCtrl, markerDefine, 3}}, - {3019, {wxStyledTextCtrl, markerSetForeground, 2}}, - {3020, {wxStyledTextCtrl, markerSetBackground, 2}}, - {3021, {wxStyledTextCtrl, markerAdd, 2}}, - {3022, {wxStyledTextCtrl, markerDelete, 2}}, - {3023, {wxStyledTextCtrl, markerDeleteAll, 1}}, - {3024, {wxStyledTextCtrl, markerGet, 1}}, - {3025, {wxStyledTextCtrl, markerNext, 2}}, - {3026, {wxStyledTextCtrl, markerPrevious, 2}}, - {3027, {wxStyledTextCtrl, markerDefineBitmap, 2}}, - {3028, {wxStyledTextCtrl, markerAddSet, 2}}, - {3029, {wxStyledTextCtrl, markerSetAlpha, 2}}, - {3030, {wxStyledTextCtrl, setMarginType, 2}}, - {3031, {wxStyledTextCtrl, getMarginType, 1}}, - {3032, {wxStyledTextCtrl, setMarginWidth, 2}}, - {3033, {wxStyledTextCtrl, getMarginWidth, 1}}, - {3034, {wxStyledTextCtrl, setMarginMask, 2}}, - {3035, {wxStyledTextCtrl, getMarginMask, 1}}, - {3036, {wxStyledTextCtrl, setMarginSensitive, 2}}, - {3037, {wxStyledTextCtrl, getMarginSensitive, 1}}, - {3038, {wxStyledTextCtrl, styleClearAll, 0}}, - {3039, {wxStyledTextCtrl, styleSetForeground, 2}}, - {3040, {wxStyledTextCtrl, styleSetBackground, 2}}, - {3041, {wxStyledTextCtrl, styleSetBold, 2}}, - {3042, {wxStyledTextCtrl, styleSetItalic, 2}}, - {3043, {wxStyledTextCtrl, styleSetSize, 2}}, - {3044, {wxStyledTextCtrl, styleSetFaceName, 2}}, - {3045, {wxStyledTextCtrl, styleSetEOLFilled, 2}}, - {3046, {wxStyledTextCtrl, styleResetDefault, 0}}, - {3047, {wxStyledTextCtrl, styleSetUnderline, 2}}, - {3048, {wxStyledTextCtrl, styleSetCase, 2}}, - {3049, {wxStyledTextCtrl, styleSetHotSpot, 2}}, - {3050, {wxStyledTextCtrl, setSelForeground, 2}}, - {3051, {wxStyledTextCtrl, setSelBackground, 2}}, - {3052, {wxStyledTextCtrl, getSelAlpha, 0}}, - {3053, {wxStyledTextCtrl, setSelAlpha, 1}}, - {3054, {wxStyledTextCtrl, setCaretForeground, 1}}, - {3055, {wxStyledTextCtrl, cmdKeyAssign, 3}}, - {3056, {wxStyledTextCtrl, cmdKeyClear, 2}}, - {3057, {wxStyledTextCtrl, cmdKeyClearAll, 0}}, - {3058, {wxStyledTextCtrl, setStyleBytes, 2}}, - {3059, {wxStyledTextCtrl, styleSetVisible, 2}}, - {3060, {wxStyledTextCtrl, getCaretPeriod, 0}}, - {3061, {wxStyledTextCtrl, setCaretPeriod, 1}}, - {3062, {wxStyledTextCtrl, setWordChars, 1}}, - {3063, {wxStyledTextCtrl, beginUndoAction, 0}}, - {3064, {wxStyledTextCtrl, endUndoAction, 0}}, - {3065, {wxStyledTextCtrl, indicatorSetStyle, 2}}, - {3066, {wxStyledTextCtrl, indicatorGetStyle, 1}}, - {3067, {wxStyledTextCtrl, indicatorSetForeground, 2}}, - {3068, {wxStyledTextCtrl, indicatorGetForeground, 1}}, - {3069, {wxStyledTextCtrl, setWhitespaceForeground, 2}}, - {3070, {wxStyledTextCtrl, setWhitespaceBackground, 2}}, - {3071, {wxStyledTextCtrl, getStyleBits, 0}}, - {3072, {wxStyledTextCtrl, setLineState, 2}}, - {3073, {wxStyledTextCtrl, getLineState, 1}}, - {3074, {wxStyledTextCtrl, getMaxLineState, 0}}, - {3075, {wxStyledTextCtrl, getCaretLineVisible, 0}}, - {3076, {wxStyledTextCtrl, setCaretLineVisible, 1}}, - {3077, {wxStyledTextCtrl, getCaretLineBackground, 0}}, - {3078, {wxStyledTextCtrl, setCaretLineBackground, 1}}, - {3079, {wxStyledTextCtrl, autoCompShow, 2}}, - {3080, {wxStyledTextCtrl, autoCompCancel, 0}}, - {3081, {wxStyledTextCtrl, autoCompActive, 0}}, - {3082, {wxStyledTextCtrl, autoCompPosStart, 0}}, - {3083, {wxStyledTextCtrl, autoCompComplete, 0}}, - {3084, {wxStyledTextCtrl, autoCompStops, 1}}, - {3085, {wxStyledTextCtrl, autoCompSetSeparator, 1}}, - {3086, {wxStyledTextCtrl, autoCompGetSeparator, 0}}, - {3087, {wxStyledTextCtrl, autoCompSelect, 1}}, - {3088, {wxStyledTextCtrl, autoCompSetCancelAtStart, 1}}, - {3089, {wxStyledTextCtrl, autoCompGetCancelAtStart, 0}}, - {3090, {wxStyledTextCtrl, autoCompSetFillUps, 1}}, - {3091, {wxStyledTextCtrl, autoCompSetChooseSingle, 1}}, - {3092, {wxStyledTextCtrl, autoCompGetChooseSingle, 0}}, - {3093, {wxStyledTextCtrl, autoCompSetIgnoreCase, 1}}, - {3094, {wxStyledTextCtrl, autoCompGetIgnoreCase, 0}}, - {3095, {wxStyledTextCtrl, userListShow, 2}}, - {3096, {wxStyledTextCtrl, autoCompSetAutoHide, 1}}, - {3097, {wxStyledTextCtrl, autoCompGetAutoHide, 0}}, - {3098, {wxStyledTextCtrl, autoCompSetDropRestOfWord, 1}}, - {3099, {wxStyledTextCtrl, autoCompGetDropRestOfWord, 0}}, - {3100, {wxStyledTextCtrl, registerImage, 2}}, - {3101, {wxStyledTextCtrl, clearRegisteredImages, 0}}, - {3102, {wxStyledTextCtrl, autoCompGetTypeSeparator, 0}}, - {3103, {wxStyledTextCtrl, autoCompSetTypeSeparator, 1}}, - {3104, {wxStyledTextCtrl, autoCompSetMaxWidth, 1}}, - {3105, {wxStyledTextCtrl, autoCompGetMaxWidth, 0}}, - {3106, {wxStyledTextCtrl, autoCompSetMaxHeight, 1}}, - {3107, {wxStyledTextCtrl, autoCompGetMaxHeight, 0}}, - {3108, {wxStyledTextCtrl, setIndent, 1}}, - {3109, {wxStyledTextCtrl, getIndent, 0}}, - {3110, {wxStyledTextCtrl, setUseTabs, 1}}, - {3111, {wxStyledTextCtrl, getUseTabs, 0}}, - {3112, {wxStyledTextCtrl, setLineIndentation, 2}}, - {3113, {wxStyledTextCtrl, getLineIndentation, 1}}, - {3114, {wxStyledTextCtrl, getLineIndentPosition, 1}}, - {3115, {wxStyledTextCtrl, getColumn, 1}}, - {3116, {wxStyledTextCtrl, setUseHorizontalScrollBar, 1}}, - {3117, {wxStyledTextCtrl, getUseHorizontalScrollBar, 0}}, - {3118, {wxStyledTextCtrl, setIndentationGuides, 1}}, - {3119, {wxStyledTextCtrl, getIndentationGuides, 0}}, - {3120, {wxStyledTextCtrl, setHighlightGuide, 1}}, - {3121, {wxStyledTextCtrl, getHighlightGuide, 0}}, - {3122, {wxStyledTextCtrl, getLineEndPosition, 1}}, - {3123, {wxStyledTextCtrl, getCodePage, 0}}, - {3124, {wxStyledTextCtrl, getCaretForeground, 0}}, - {3125, {wxStyledTextCtrl, getReadOnly, 0}}, - {3126, {wxStyledTextCtrl, setCurrentPos, 1}}, - {3127, {wxStyledTextCtrl, setSelectionStart, 1}}, - {3128, {wxStyledTextCtrl, getSelectionStart, 0}}, - {3129, {wxStyledTextCtrl, setSelectionEnd, 1}}, - {3130, {wxStyledTextCtrl, getSelectionEnd, 0}}, - {3131, {wxStyledTextCtrl, setPrintMagnification, 1}}, - {3132, {wxStyledTextCtrl, getPrintMagnification, 0}}, - {3133, {wxStyledTextCtrl, setPrintColourMode, 1}}, - {3134, {wxStyledTextCtrl, getPrintColourMode, 0}}, - {3135, {wxStyledTextCtrl, findText, 4}}, - {3136, {wxStyledTextCtrl, formatRange, 7}}, - {3137, {wxStyledTextCtrl, getFirstVisibleLine, 0}}, - {3138, {wxStyledTextCtrl, getLine, 1}}, - {3139, {wxStyledTextCtrl, getLineCount, 0}}, - {3140, {wxStyledTextCtrl, setMarginLeft, 1}}, - {3141, {wxStyledTextCtrl, getMarginLeft, 0}}, - {3142, {wxStyledTextCtrl, setMarginRight, 1}}, - {3143, {wxStyledTextCtrl, getMarginRight, 0}}, - {3144, {wxStyledTextCtrl, getModify, 0}}, - {3145, {wxStyledTextCtrl, setSelection, 2}}, - {3146, {wxStyledTextCtrl, getSelectedText, 0}}, - {3147, {wxStyledTextCtrl, getTextRange, 2}}, - {3148, {wxStyledTextCtrl, hideSelection, 1}}, - {3149, {wxStyledTextCtrl, lineFromPosition, 1}}, - {3150, {wxStyledTextCtrl, positionFromLine, 1}}, - {3151, {wxStyledTextCtrl, lineScroll, 2}}, - {3152, {wxStyledTextCtrl, ensureCaretVisible, 0}}, - {3153, {wxStyledTextCtrl, replaceSelection, 1}}, - {3154, {wxStyledTextCtrl, setReadOnly, 1}}, - {3155, {wxStyledTextCtrl, canPaste, 0}}, - {3156, {wxStyledTextCtrl, canUndo, 0}}, - {3157, {wxStyledTextCtrl, emptyUndoBuffer, 0}}, - {3158, {wxStyledTextCtrl, undo, 0}}, - {3159, {wxStyledTextCtrl, cut, 0}}, - {3160, {wxStyledTextCtrl, copy, 0}}, - {3161, {wxStyledTextCtrl, paste, 0}}, - {3162, {wxStyledTextCtrl, clear, 0}}, - {3163, {wxStyledTextCtrl, setText, 1}}, - {3164, {wxStyledTextCtrl, getText, 0}}, - {3165, {wxStyledTextCtrl, getTextLength, 0}}, - {3166, {wxStyledTextCtrl, getOvertype, 0}}, - {3167, {wxStyledTextCtrl, setCaretWidth, 1}}, - {3168, {wxStyledTextCtrl, getCaretWidth, 0}}, - {3169, {wxStyledTextCtrl, setTargetStart, 1}}, - {3170, {wxStyledTextCtrl, getTargetStart, 0}}, - {3171, {wxStyledTextCtrl, setTargetEnd, 1}}, - {3172, {wxStyledTextCtrl, getTargetEnd, 0}}, - {3173, {wxStyledTextCtrl, replaceTarget, 1}}, - {3174, {wxStyledTextCtrl, searchInTarget, 1}}, - {3175, {wxStyledTextCtrl, setSearchFlags, 1}}, - {3176, {wxStyledTextCtrl, getSearchFlags, 0}}, - {3177, {wxStyledTextCtrl, callTipShow, 2}}, - {3178, {wxStyledTextCtrl, callTipCancel, 0}}, - {3179, {wxStyledTextCtrl, callTipActive, 0}}, - {3180, {wxStyledTextCtrl, callTipPosAtStart, 0}}, - {3181, {wxStyledTextCtrl, callTipSetHighlight, 2}}, - {3182, {wxStyledTextCtrl, callTipSetBackground, 1}}, - {3183, {wxStyledTextCtrl, callTipSetForeground, 1}}, - {3184, {wxStyledTextCtrl, callTipSetForegroundHighlight, 1}}, - {3185, {wxStyledTextCtrl, callTipUseStyle, 1}}, - {3186, {wxStyledTextCtrl, visibleFromDocLine, 1}}, - {3187, {wxStyledTextCtrl, docLineFromVisible, 1}}, - {3188, {wxStyledTextCtrl, wrapCount, 1}}, - {3189, {wxStyledTextCtrl, setFoldLevel, 2}}, - {3190, {wxStyledTextCtrl, getFoldLevel, 1}}, - {3191, {wxStyledTextCtrl, getLastChild, 2}}, - {3192, {wxStyledTextCtrl, getFoldParent, 1}}, - {3193, {wxStyledTextCtrl, showLines, 2}}, - {3194, {wxStyledTextCtrl, hideLines, 2}}, - {3195, {wxStyledTextCtrl, getLineVisible, 1}}, - {3196, {wxStyledTextCtrl, setFoldExpanded, 2}}, - {3197, {wxStyledTextCtrl, getFoldExpanded, 1}}, - {3198, {wxStyledTextCtrl, toggleFold, 1}}, - {3199, {wxStyledTextCtrl, ensureVisible, 1}}, - {3200, {wxStyledTextCtrl, setFoldFlags, 1}}, - {3201, {wxStyledTextCtrl, ensureVisibleEnforcePolicy, 1}}, - {3202, {wxStyledTextCtrl, setTabIndents, 1}}, - {3203, {wxStyledTextCtrl, getTabIndents, 0}}, - {3204, {wxStyledTextCtrl, setBackSpaceUnIndents, 1}}, - {3205, {wxStyledTextCtrl, getBackSpaceUnIndents, 0}}, - {3206, {wxStyledTextCtrl, setMouseDwellTime, 1}}, - {3207, {wxStyledTextCtrl, getMouseDwellTime, 0}}, - {3208, {wxStyledTextCtrl, wordStartPosition, 2}}, - {3209, {wxStyledTextCtrl, wordEndPosition, 2}}, - {3210, {wxStyledTextCtrl, setWrapMode, 1}}, - {3211, {wxStyledTextCtrl, getWrapMode, 0}}, - {3212, {wxStyledTextCtrl, setWrapVisualFlags, 1}}, - {3213, {wxStyledTextCtrl, getWrapVisualFlags, 0}}, - {3214, {wxStyledTextCtrl, setWrapVisualFlagsLocation, 1}}, - {3215, {wxStyledTextCtrl, getWrapVisualFlagsLocation, 0}}, - {3216, {wxStyledTextCtrl, setWrapStartIndent, 1}}, - {3217, {wxStyledTextCtrl, getWrapStartIndent, 0}}, - {3218, {wxStyledTextCtrl, setLayoutCache, 1}}, - {3219, {wxStyledTextCtrl, getLayoutCache, 0}}, - {3220, {wxStyledTextCtrl, setScrollWidth, 1}}, - {3221, {wxStyledTextCtrl, getScrollWidth, 0}}, - {3222, {wxStyledTextCtrl, textWidth, 2}}, - {3223, {wxStyledTextCtrl, getEndAtLastLine, 0}}, - {3224, {wxStyledTextCtrl, textHeight, 1}}, - {3225, {wxStyledTextCtrl, setUseVerticalScrollBar, 1}}, - {3226, {wxStyledTextCtrl, getUseVerticalScrollBar, 0}}, - {3227, {wxStyledTextCtrl, appendText, 1}}, - {3228, {wxStyledTextCtrl, getTwoPhaseDraw, 0}}, - {3229, {wxStyledTextCtrl, setTwoPhaseDraw, 1}}, - {3230, {wxStyledTextCtrl, targetFromSelection, 0}}, - {3231, {wxStyledTextCtrl, linesJoin, 0}}, - {3232, {wxStyledTextCtrl, linesSplit, 1}}, - {3233, {wxStyledTextCtrl, setFoldMarginColour, 2}}, - {3234, {wxStyledTextCtrl, setFoldMarginHiColour, 2}}, - {3235, {wxStyledTextCtrl, lineDown, 0}}, - {3236, {wxStyledTextCtrl, lineDownExtend, 0}}, - {3237, {wxStyledTextCtrl, lineUp, 0}}, - {3238, {wxStyledTextCtrl, lineUpExtend, 0}}, - {3239, {wxStyledTextCtrl, charLeft, 0}}, - {3240, {wxStyledTextCtrl, charLeftExtend, 0}}, - {3241, {wxStyledTextCtrl, charRight, 0}}, - {3242, {wxStyledTextCtrl, charRightExtend, 0}}, - {3243, {wxStyledTextCtrl, wordLeft, 0}}, - {3244, {wxStyledTextCtrl, wordLeftExtend, 0}}, - {3245, {wxStyledTextCtrl, wordRight, 0}}, - {3246, {wxStyledTextCtrl, wordRightExtend, 0}}, - {3247, {wxStyledTextCtrl, home, 0}}, - {3248, {wxStyledTextCtrl, homeExtend, 0}}, - {3249, {wxStyledTextCtrl, lineEnd, 0}}, - {3250, {wxStyledTextCtrl, lineEndExtend, 0}}, - {3251, {wxStyledTextCtrl, documentStart, 0}}, - {3252, {wxStyledTextCtrl, documentStartExtend, 0}}, - {3253, {wxStyledTextCtrl, documentEnd, 0}}, - {3254, {wxStyledTextCtrl, documentEndExtend, 0}}, - {3255, {wxStyledTextCtrl, pageUp, 0}}, - {3256, {wxStyledTextCtrl, pageUpExtend, 0}}, - {3257, {wxStyledTextCtrl, pageDown, 0}}, - {3258, {wxStyledTextCtrl, pageDownExtend, 0}}, - {3259, {wxStyledTextCtrl, editToggleOvertype, 0}}, - {3260, {wxStyledTextCtrl, cancel, 0}}, - {3261, {wxStyledTextCtrl, deleteBack, 0}}, - {3262, {wxStyledTextCtrl, tab, 0}}, - {3263, {wxStyledTextCtrl, backTab, 0}}, - {3264, {wxStyledTextCtrl, newLine, 0}}, - {3265, {wxStyledTextCtrl, formFeed, 0}}, - {3266, {wxStyledTextCtrl, vCHome, 0}}, - {3267, {wxStyledTextCtrl, vCHomeExtend, 0}}, - {3268, {wxStyledTextCtrl, zoomIn, 0}}, - {3269, {wxStyledTextCtrl, zoomOut, 0}}, - {3270, {wxStyledTextCtrl, delWordLeft, 0}}, - {3271, {wxStyledTextCtrl, delWordRight, 0}}, - {3272, {wxStyledTextCtrl, lineCut, 0}}, - {3273, {wxStyledTextCtrl, lineDelete, 0}}, - {3274, {wxStyledTextCtrl, lineTranspose, 0}}, - {3275, {wxStyledTextCtrl, lineDuplicate, 0}}, - {3276, {wxStyledTextCtrl, lowerCase, 0}}, - {3277, {wxStyledTextCtrl, upperCase, 0}}, - {3278, {wxStyledTextCtrl, lineScrollDown, 0}}, - {3279, {wxStyledTextCtrl, lineScrollUp, 0}}, - {3280, {wxStyledTextCtrl, deleteBackNotLine, 0}}, - {3281, {wxStyledTextCtrl, homeDisplay, 0}}, - {3282, {wxStyledTextCtrl, homeDisplayExtend, 0}}, - {3283, {wxStyledTextCtrl, lineEndDisplay, 0}}, - {3284, {wxStyledTextCtrl, lineEndDisplayExtend, 0}}, - {3285, {wxStyledTextCtrl, homeWrapExtend, 0}}, - {3286, {wxStyledTextCtrl, lineEndWrap, 0}}, - {3287, {wxStyledTextCtrl, lineEndWrapExtend, 0}}, - {3288, {wxStyledTextCtrl, vCHomeWrap, 0}}, - {3289, {wxStyledTextCtrl, vCHomeWrapExtend, 0}}, - {3290, {wxStyledTextCtrl, lineCopy, 0}}, - {3291, {wxStyledTextCtrl, moveCaretInsideView, 0}}, - {3292, {wxStyledTextCtrl, lineLength, 1}}, - {3293, {wxStyledTextCtrl, braceHighlight, 2}}, - {3294, {wxStyledTextCtrl, braceBadLight, 1}}, - {3295, {wxStyledTextCtrl, braceMatch, 1}}, - {3296, {wxStyledTextCtrl, getViewEOL, 0}}, - {3297, {wxStyledTextCtrl, setViewEOL, 1}}, - {3298, {wxStyledTextCtrl, setModEventMask, 1}}, - {3299, {wxStyledTextCtrl, getEdgeColumn, 0}}, - {3300, {wxStyledTextCtrl, setEdgeColumn, 1}}, - {3301, {wxStyledTextCtrl, setEdgeMode, 1}}, - {3302, {wxStyledTextCtrl, getEdgeMode, 0}}, - {3303, {wxStyledTextCtrl, getEdgeColour, 0}}, - {3304, {wxStyledTextCtrl, setEdgeColour, 1}}, - {3305, {wxStyledTextCtrl, searchAnchor, 0}}, - {3306, {wxStyledTextCtrl, searchNext, 2}}, - {3307, {wxStyledTextCtrl, searchPrev, 2}}, - {3308, {wxStyledTextCtrl, linesOnScreen, 0}}, - {3309, {wxStyledTextCtrl, usePopUp, 1}}, - {3310, {wxStyledTextCtrl, selectionIsRectangle, 0}}, - {3311, {wxStyledTextCtrl, setZoom, 1}}, - {3312, {wxStyledTextCtrl, getZoom, 0}}, - {3313, {wxStyledTextCtrl, getModEventMask, 0}}, - {3314, {wxStyledTextCtrl, setSTCFocus, 1}}, - {3315, {wxStyledTextCtrl, getSTCFocus, 0}}, - {3316, {wxStyledTextCtrl, setStatus, 1}}, - {3317, {wxStyledTextCtrl, getStatus, 0}}, - {3318, {wxStyledTextCtrl, setMouseDownCaptures, 1}}, - {3319, {wxStyledTextCtrl, getMouseDownCaptures, 0}}, - {3320, {wxStyledTextCtrl, setSTCCursor, 1}}, - {3321, {wxStyledTextCtrl, getSTCCursor, 0}}, - {3322, {wxStyledTextCtrl, setControlCharSymbol, 1}}, - {3323, {wxStyledTextCtrl, getControlCharSymbol, 0}}, - {3324, {wxStyledTextCtrl, wordPartLeft, 0}}, - {3325, {wxStyledTextCtrl, wordPartLeftExtend, 0}}, - {3326, {wxStyledTextCtrl, wordPartRight, 0}}, - {3327, {wxStyledTextCtrl, wordPartRightExtend, 0}}, - {3328, {wxStyledTextCtrl, setVisiblePolicy, 2}}, - {3329, {wxStyledTextCtrl, delLineLeft, 0}}, - {3330, {wxStyledTextCtrl, delLineRight, 0}}, - {3331, {wxStyledTextCtrl, getXOffset, 0}}, - {3332, {wxStyledTextCtrl, chooseCaretX, 0}}, - {3333, {wxStyledTextCtrl, setXCaretPolicy, 2}}, - {3334, {wxStyledTextCtrl, setYCaretPolicy, 2}}, - {3335, {wxStyledTextCtrl, getPrintWrapMode, 0}}, - {3336, {wxStyledTextCtrl, setHotspotActiveForeground, 2}}, - {3337, {wxStyledTextCtrl, setHotspotActiveBackground, 2}}, - {3338, {wxStyledTextCtrl, setHotspotActiveUnderline, 1}}, - {3339, {wxStyledTextCtrl, setHotspotSingleLine, 1}}, - {3340, {wxStyledTextCtrl, paraDownExtend, 0}}, - {3341, {wxStyledTextCtrl, paraUp, 0}}, - {3342, {wxStyledTextCtrl, paraUpExtend, 0}}, - {3343, {wxStyledTextCtrl, positionBefore, 1}}, - {3344, {wxStyledTextCtrl, positionAfter, 1}}, - {3345, {wxStyledTextCtrl, copyRange, 2}}, - {3346, {wxStyledTextCtrl, copyText, 2}}, - {3347, {wxStyledTextCtrl, setSelectionMode, 1}}, - {3348, {wxStyledTextCtrl, getSelectionMode, 0}}, - {3349, {wxStyledTextCtrl, lineDownRectExtend, 0}}, - {3350, {wxStyledTextCtrl, lineUpRectExtend, 0}}, - {3351, {wxStyledTextCtrl, charLeftRectExtend, 0}}, - {3352, {wxStyledTextCtrl, charRightRectExtend, 0}}, - {3353, {wxStyledTextCtrl, homeRectExtend, 0}}, - {3354, {wxStyledTextCtrl, vCHomeRectExtend, 0}}, - {3355, {wxStyledTextCtrl, lineEndRectExtend, 0}}, - {3356, {wxStyledTextCtrl, pageUpRectExtend, 0}}, - {3357, {wxStyledTextCtrl, pageDownRectExtend, 0}}, - {3358, {wxStyledTextCtrl, stutteredPageUp, 0}}, - {3359, {wxStyledTextCtrl, stutteredPageUpExtend, 0}}, - {3360, {wxStyledTextCtrl, stutteredPageDown, 0}}, - {3361, {wxStyledTextCtrl, stutteredPageDownExtend, 0}}, - {3362, {wxStyledTextCtrl, wordLeftEnd, 0}}, - {3363, {wxStyledTextCtrl, wordLeftEndExtend, 0}}, - {3364, {wxStyledTextCtrl, wordRightEnd, 0}}, - {3365, {wxStyledTextCtrl, wordRightEndExtend, 0}}, - {3366, {wxStyledTextCtrl, setWhitespaceChars, 1}}, - {3367, {wxStyledTextCtrl, setCharsDefault, 0}}, - {3368, {wxStyledTextCtrl, autoCompGetCurrent, 0}}, - {3369, {wxStyledTextCtrl, allocate, 1}}, - {3370, {wxStyledTextCtrl, findColumn, 2}}, - {3371, {wxStyledTextCtrl, getCaretSticky, 0}}, - {3372, {wxStyledTextCtrl, setCaretSticky, 1}}, - {3373, {wxStyledTextCtrl, toggleCaretSticky, 0}}, - {3374, {wxStyledTextCtrl, setPasteConvertEndings, 1}}, - {3375, {wxStyledTextCtrl, getPasteConvertEndings, 0}}, - {3376, {wxStyledTextCtrl, selectionDuplicate, 0}}, - {3377, {wxStyledTextCtrl, setCaretLineBackAlpha, 1}}, - {3378, {wxStyledTextCtrl, getCaretLineBackAlpha, 0}}, - {3379, {wxStyledTextCtrl, startRecord, 0}}, - {3380, {wxStyledTextCtrl, stopRecord, 0}}, - {3381, {wxStyledTextCtrl, setLexer, 1}}, - {3382, {wxStyledTextCtrl, getLexer, 0}}, - {3383, {wxStyledTextCtrl, colourise, 2}}, - {3384, {wxStyledTextCtrl, setProperty, 2}}, - {3385, {wxStyledTextCtrl, setKeyWords, 2}}, - {3386, {wxStyledTextCtrl, setLexerLanguage, 1}}, - {3387, {wxStyledTextCtrl, getProperty, 1}}, - {3388, {wxStyledTextCtrl, getStyleBitsNeeded, 0}}, - {3389, {wxStyledTextCtrl, getCurrentLine, 0}}, - {3390, {wxStyledTextCtrl, styleSetSpec, 2}}, - {3391, {wxStyledTextCtrl, styleSetFont, 2}}, - {3392, {wxStyledTextCtrl, styleSetFontAttr, 7}}, - {3393, {wxStyledTextCtrl, styleSetCharacterSet, 2}}, - {3394, {wxStyledTextCtrl, styleSetFontEncoding, 2}}, - {3395, {wxStyledTextCtrl, cmdKeyExecute, 1}}, - {3396, {wxStyledTextCtrl, setMargins, 2}}, - {3397, {wxStyledTextCtrl, getSelection, 2}}, - {3398, {wxStyledTextCtrl, pointFromPosition, 1}}, - {3399, {wxStyledTextCtrl, scrollToLine, 1}}, - {3400, {wxStyledTextCtrl, scrollToColumn, 1}}, - {3401, {wxStyledTextCtrl, setVScrollBar, 1}}, - {3402, {wxStyledTextCtrl, setHScrollBar, 1}}, - {3403, {wxStyledTextCtrl, getLastKeydownProcessed, 0}}, - {3404, {wxStyledTextCtrl, setLastKeydownProcessed, 1}}, - {3405, {wxStyledTextCtrl, saveFile, 1}}, - {3406, {wxStyledTextCtrl, loadFile, 1}}, - {3407, {wxStyledTextCtrl, doDragOver, 3}}, - {3408, {wxStyledTextCtrl, doDropText, 3}}, - {3409, {wxStyledTextCtrl, getUseAntiAliasing, 0}}, - {3410, {wxStyledTextCtrl, addTextRaw, 1}}, - {3411, {wxStyledTextCtrl, insertTextRaw, 2}}, - {3412, {wxStyledTextCtrl, getCurLineRaw, 1}}, - {3413, {wxStyledTextCtrl, getLineRaw, 1}}, - {3414, {wxStyledTextCtrl, getSelectedTextRaw, 0}}, - {3415, {wxStyledTextCtrl, getTextRangeRaw, 2}}, - {3416, {wxStyledTextCtrl, setTextRaw, 1}}, - {3417, {wxStyledTextCtrl, getTextRaw, 0}}, - {3418, {wxStyledTextCtrl, appendTextRaw, 1}}, - {3419, {wxArtProvider, getBitmap, 2}}, - {3420, {wxArtProvider, getIcon, 2}}, - {3421, {wxTreeEvent, getKeyCode, 0}}, - {3422, {wxTreeEvent, getItem, 0}}, - {3423, {wxTreeEvent, getKeyEvent, 0}}, - {3424, {wxTreeEvent, getLabel, 0}}, - {3425, {wxTreeEvent, getOldItem, 0}}, - {3426, {wxTreeEvent, getPoint, 0}}, - {3427, {wxTreeEvent, isEditCancelled, 0}}, - {3428, {wxTreeEvent, setToolTip, 1}}, - {3429, {wxNotebookEvent, getOldSelection, 0}}, - {3430, {wxNotebookEvent, getSelection, 0}}, - {3431, {wxNotebookEvent, setOldSelection, 1}}, - {3432, {wxNotebookEvent, setSelection, 1}}, - {3433, {wxFileDataObject, new, 0}}, - {3434, {wxFileDataObject, addFile, 1}}, - {3435, {wxFileDataObject, getFilenames, 0}}, - {3436, {wxFileDataObject, 'Destroy', undefined}}, - {3437, {wxTextDataObject, new, 1}}, - {3438, {wxTextDataObject, getTextLength, 0}}, - {3439, {wxTextDataObject, getText, 0}}, - {3440, {wxTextDataObject, setText, 1}}, - {3441, {wxTextDataObject, 'Destroy', undefined}}, - {3442, {wxBitmapDataObject, new_1_1, 1}}, - {3443, {wxBitmapDataObject, new_1_0, 1}}, - {3444, {wxBitmapDataObject, getBitmap, 0}}, - {3445, {wxBitmapDataObject, setBitmap, 1}}, - {3446, {wxBitmapDataObject, 'Destroy', undefined}}, - {3448, {wxClipboard, new, 0}}, - {3449, {wxClipboard, destruct, 0}}, - {3450, {wxClipboard, addData, 1}}, - {3451, {wxClipboard, clear, 0}}, - {3452, {wxClipboard, close, 0}}, - {3453, {wxClipboard, flush, 0}}, - {3454, {wxClipboard, getData, 1}}, - {3455, {wxClipboard, isOpened, 0}}, - {3456, {wxClipboard, open, 0}}, - {3457, {wxClipboard, setData, 1}}, - {3459, {wxClipboard, usePrimarySelection, 1}}, - {3460, {wxClipboard, isSupported, 1}}, - {3461, {wxClipboard, get, 0}}, - {3462, {wxSpinEvent, getPosition, 0}}, - {3463, {wxSpinEvent, setPosition, 1}}, - {3464, {wxSplitterWindow, new_0, 0}}, - {3465, {wxSplitterWindow, new_2, 2}}, - {3466, {wxSplitterWindow, destruct, 0}}, - {3467, {wxSplitterWindow, create, 2}}, - {3468, {wxSplitterWindow, getMinimumPaneSize, 0}}, - {3469, {wxSplitterWindow, getSashGravity, 0}}, - {3470, {wxSplitterWindow, getSashPosition, 0}}, - {3471, {wxSplitterWindow, getSplitMode, 0}}, - {3472, {wxSplitterWindow, getWindow1, 0}}, - {3473, {wxSplitterWindow, getWindow2, 0}}, - {3474, {wxSplitterWindow, initialize, 1}}, - {3475, {wxSplitterWindow, isSplit, 0}}, - {3476, {wxSplitterWindow, replaceWindow, 2}}, - {3477, {wxSplitterWindow, setSashGravity, 1}}, - {3478, {wxSplitterWindow, setSashPosition, 2}}, - {3479, {wxSplitterWindow, setSashSize, 1}}, - {3480, {wxSplitterWindow, setMinimumPaneSize, 1}}, - {3481, {wxSplitterWindow, setSplitMode, 1}}, - {3482, {wxSplitterWindow, splitHorizontally, 3}}, - {3483, {wxSplitterWindow, splitVertically, 3}}, - {3484, {wxSplitterWindow, unsplit, 1}}, - {3485, {wxSplitterWindow, updateSize, 0}}, - {3486, {wxSplitterEvent, getSashPosition, 0}}, - {3487, {wxSplitterEvent, getX, 0}}, - {3488, {wxSplitterEvent, getY, 0}}, - {3489, {wxSplitterEvent, getWindowBeingRemoved, 0}}, - {3490, {wxSplitterEvent, setSashPosition, 1}}, - {3491, {wxHtmlWindow, new_0, 0}}, - {3492, {wxHtmlWindow, new_2, 2}}, - {3493, {wxHtmlWindow, appendToPage, 1}}, - {3494, {wxHtmlWindow, getOpenedAnchor, 0}}, - {3495, {wxHtmlWindow, getOpenedPage, 0}}, - {3496, {wxHtmlWindow, getOpenedPageTitle, 0}}, - {3497, {wxHtmlWindow, getRelatedFrame, 0}}, - {3498, {wxHtmlWindow, historyBack, 0}}, - {3499, {wxHtmlWindow, historyCanBack, 0}}, - {3500, {wxHtmlWindow, historyCanForward, 0}}, - {3501, {wxHtmlWindow, historyClear, 0}}, - {3502, {wxHtmlWindow, historyForward, 0}}, - {3503, {wxHtmlWindow, loadFile, 1}}, - {3504, {wxHtmlWindow, loadPage, 1}}, - {3505, {wxHtmlWindow, selectAll, 0}}, - {3506, {wxHtmlWindow, selectionToText, 0}}, - {3507, {wxHtmlWindow, selectLine, 1}}, - {3508, {wxHtmlWindow, selectWord, 1}}, - {3509, {wxHtmlWindow, setBorders, 1}}, - {3510, {wxHtmlWindow, setFonts, 3}}, - {3511, {wxHtmlWindow, setPage, 1}}, - {3512, {wxHtmlWindow, setRelatedFrame, 2}}, - {3513, {wxHtmlWindow, setRelatedStatusBar, 1}}, - {3514, {wxHtmlWindow, toText, 0}}, - {3515, {wxHtmlWindow, 'Destroy', undefined}}, - {3516, {wxHtmlLinkEvent, getLinkInfo, 0}}, - {3517, {wxSystemSettings, getColour, 1}}, - {3518, {wxSystemSettings, getFont, 1}}, - {3519, {wxSystemSettings, getMetric, 2}}, - {3520, {wxSystemSettings, getScreenType, 0}}, - {3521, {wxSystemOptions, getOption, 1}}, - {3522, {wxSystemOptions, getOptionInt, 1}}, - {3523, {wxSystemOptions, hasOption, 1}}, - {3524, {wxSystemOptions, isFalse, 1}}, - {3525, {wxSystemOptions, setOption_2_1, 2}}, - {3526, {wxSystemOptions, setOption_2_0, 2}}, - {3527, {wxAuiNotebookEvent, setSelection, 1}}, - {3528, {wxAuiNotebookEvent, getSelection, 0}}, - {3529, {wxAuiNotebookEvent, setOldSelection, 1}}, - {3530, {wxAuiNotebookEvent, getOldSelection, 0}}, - {3531, {wxAuiNotebookEvent, setDragSource, 1}}, - {3532, {wxAuiNotebookEvent, getDragSource, 0}}, - {3533, {wxAuiManagerEvent, setManager, 1}}, - {3534, {wxAuiManagerEvent, getManager, 0}}, - {3535, {wxAuiManagerEvent, setPane, 1}}, - {3536, {wxAuiManagerEvent, getPane, 0}}, - {3537, {wxAuiManagerEvent, setButton, 1}}, - {3538, {wxAuiManagerEvent, getButton, 0}}, - {3539, {wxAuiManagerEvent, setDC, 1}}, - {3540, {wxAuiManagerEvent, getDC, 0}}, - {3541, {wxAuiManagerEvent, veto, 1}}, - {3542, {wxAuiManagerEvent, getVeto, 0}}, - {3543, {wxAuiManagerEvent, setCanVeto, 1}}, - {3544, {wxAuiManagerEvent, canVeto, 0}}, - {3545, {wxLogNull, new, 0}}, - {3546, {wxLogNull, 'Destroy', undefined}}, - {3547, {wxTaskBarIcon, new, 0}}, - {3548, {wxTaskBarIcon, destruct, 0}}, - {3549, {wxTaskBarIcon, popupMenu, 1}}, - {3550, {wxTaskBarIcon, removeIcon, 0}}, - {3551, {wxTaskBarIcon, setIcon, 2}}, - {3552, {wxLocale, new_0, 0}}, - {3554, {wxLocale, new_2, 2}}, - {3555, {wxLocale, destruct, 0}}, - {3557, {wxLocale, init, 1}}, - {3558, {wxLocale, addCatalog_1, 1}}, - {3559, {wxLocale, addCatalog_3, 3}}, - {3560, {wxLocale, addCatalogLookupPathPrefix, 1}}, - {3561, {wxLocale, getCanonicalName, 0}}, - {3562, {wxLocale, getLanguage, 0}}, - {3563, {wxLocale, getLanguageName, 1}}, - {3564, {wxLocale, getLocale, 0}}, - {3565, {wxLocale, getName, 0}}, - {3566, {wxLocale, getString_2, 2}}, - {3567, {wxLocale, getString_4, 4}}, - {3568, {wxLocale, getHeaderValue, 2}}, - {3569, {wxLocale, getSysName, 0}}, - {3570, {wxLocale, getSystemEncoding, 0}}, - {3571, {wxLocale, getSystemEncodingName, 0}}, - {3572, {wxLocale, getSystemLanguage, 0}}, - {3573, {wxLocale, isLoaded, 1}}, - {3574, {wxLocale, isOk, 0}}, - {3575, {wxActivateEvent, getActive, 0}}, - {3577, {wxPopupWindow, new_2, 2}}, - {3578, {wxPopupWindow, new_0, 0}}, - {3580, {wxPopupWindow, destruct, 0}}, - {3581, {wxPopupWindow, create, 2}}, - {3582, {wxPopupWindow, position, 2}}, - {3583, {wxPopupTransientWindow, new_0, 0}}, - {3584, {wxPopupTransientWindow, new_2, 2}}, - {3585, {wxPopupTransientWindow, destruct, 0}}, - {3586, {wxPopupTransientWindow, popup, 1}}, - {3587, {wxPopupTransientWindow, dismiss, 0}}, - {3588, {wxOverlay, new, 0}}, - {3589, {wxOverlay, destruct, 0}}, - {3590, {wxOverlay, reset, 0}}, - {3591, {wxDCOverlay, new_6, 6}}, - {3592, {wxDCOverlay, new_2, 2}}, - {3593, {wxDCOverlay, destruct, 0}}, - {3594, {wxDCOverlay, clear, 0}}, + {126, {wxWindow, dragAcceptFiles, 1}}, + {127, {wxWindow, enable, 1}}, + {128, {wxWindow, findFocus, 0}}, + {129, {wxWindow, findWindow_1_0, 1}}, + {130, {wxWindow, findWindow_1_1, 1}}, + {131, {wxWindow, findWindowById, 2}}, + {132, {wxWindow, findWindowByName, 2}}, + {133, {wxWindow, findWindowByLabel, 2}}, + {134, {wxWindow, fit, 0}}, + {135, {wxWindow, fitInside, 0}}, + {136, {wxWindow, freeze, 0}}, + {137, {wxWindow, getAcceleratorTable, 0}}, + {138, {wxWindow, getBackgroundColour, 0}}, + {139, {wxWindow, getBackgroundStyle, 0}}, + {140, {wxWindow, getBestSize, 0}}, + {142, {wxWindow, getCaret, 0}}, + {143, {wxWindow, getCapture, 0}}, + {144, {wxWindow, getCharHeight, 0}}, + {145, {wxWindow, getCharWidth, 0}}, + {146, {wxWindow, getChildren, 0}}, + {149, {wxWindow, getClientSize, 0}}, + {150, {wxWindow, getContainingSizer, 0}}, + {151, {wxWindow, getCursor, 0}}, + {152, {wxWindow, getDropTarget, 0}}, + {153, {wxWindow, getEventHandler, 0}}, + {154, {wxWindow, getExtraStyle, 0}}, + {155, {wxWindow, getFont, 0}}, + {156, {wxWindow, getForegroundColour, 0}}, + {157, {wxWindow, getGrandParent, 0}}, + {158, {wxWindow, getHandle, 0}}, + {159, {wxWindow, getHelpText, 0}}, + {160, {wxWindow, getId, 0}}, + {161, {wxWindow, getLabel, 0}}, + {162, {wxWindow, getMaxSize, 0}}, + {163, {wxWindow, getMinSize, 0}}, + {164, {wxWindow, getName, 0}}, + {165, {wxWindow, getParent, 0}}, + {167, {wxWindow, getPosition, 0}}, + {168, {wxWindow, getRect, 0}}, + {170, {wxWindow, getScreenPosition, 0}}, + {171, {wxWindow, getScreenRect, 0}}, + {172, {wxWindow, getScrollPos, 1}}, + {173, {wxWindow, getScrollRange, 1}}, + {174, {wxWindow, getScrollThumb, 1}}, + {176, {wxWindow, getSize, 0}}, + {177, {wxWindow, getSizer, 0}}, + {178, {wxWindow, getTextExtent, 4}}, + {179, {wxWindow, getToolTip, 0}}, + {180, {wxWindow, getUpdateRegion, 0}}, + {182, {wxWindow, getVirtualSize, 0}}, + {184, {wxWindow, getWindowStyleFlag, 0}}, + {185, {wxWindow, getWindowVariant, 0}}, + {186, {wxWindow, hasCapture, 0}}, + {187, {wxWindow, hasScrollbar, 1}}, + {188, {wxWindow, hasTransparentBackground, 0}}, + {189, {wxWindow, hide, 0}}, + {190, {wxWindow, inheritAttributes, 0}}, + {191, {wxWindow, initDialog, 0}}, + {192, {wxWindow, invalidateBestSize, 0}}, + {193, {wxWindow, isEnabled, 0}}, + {194, {wxWindow, isExposed_2, 2}}, + {195, {wxWindow, isExposed_4, 4}}, + {196, {wxWindow, isExposed_1_0, 1}}, + {197, {wxWindow, isExposed_1_1, 1}}, + {198, {wxWindow, isRetained, 0}}, + {199, {wxWindow, isShown, 0}}, + {200, {wxWindow, isTopLevel, 0}}, + {201, {wxWindow, layout, 0}}, + {202, {wxWindow, lineDown, 0}}, + {203, {wxWindow, lineUp, 0}}, + {204, {wxWindow, lower, 0}}, + {205, {wxWindow, makeModal, 1}}, + {206, {wxWindow, move_3, 3}}, + {207, {wxWindow, move_2, 2}}, + {208, {wxWindow, moveAfterInTabOrder, 1}}, + {209, {wxWindow, moveBeforeInTabOrder, 1}}, + {210, {wxWindow, navigate, 1}}, + {211, {wxWindow, pageDown, 0}}, + {212, {wxWindow, pageUp, 0}}, + {213, {wxWindow, popEventHandler, 1}}, + {214, {wxWindow, popupMenu_2, 2}}, + {215, {wxWindow, popupMenu_3, 3}}, + {216, {wxWindow, raise, 0}}, + {217, {wxWindow, refresh, 1}}, + {218, {wxWindow, refreshRect, 2}}, + {219, {wxWindow, releaseMouse, 0}}, + {220, {wxWindow, removeChild, 1}}, + {221, {wxWindow, reparent, 1}}, + {222, {wxWindow, screenToClient_2, 2}}, + {223, {wxWindow, screenToClient_1, 1}}, + {225, {wxWindow, scrollLines, 1}}, + {227, {wxWindow, scrollPages, 1}}, + {228, {wxWindow, scrollWindow, 3}}, + {229, {wxWindow, setAcceleratorTable, 1}}, + {230, {wxWindow, setAutoLayout, 1}}, + {231, {wxWindow, setBackgroundColour, 1}}, + {232, {wxWindow, setBackgroundStyle, 1}}, + {233, {wxWindow, setCaret, 1}}, + {234, {wxWindow, setClientSize_2, 2}}, + {235, {wxWindow, setClientSize_1_0, 1}}, + {236, {wxWindow, setClientSize_1_1, 1}}, + {237, {wxWindow, setContainingSizer, 1}}, + {238, {wxWindow, setCursor, 1}}, + {239, {wxWindow, setMaxSize, 1}}, + {240, {wxWindow, setMinSize, 1}}, + {241, {wxWindow, setOwnBackgroundColour, 1}}, + {242, {wxWindow, setOwnFont, 1}}, + {243, {wxWindow, setOwnForegroundColour, 1}}, + {244, {wxWindow, setDropTarget, 1}}, + {245, {wxWindow, setExtraStyle, 1}}, + {246, {wxWindow, setFocus, 0}}, + {247, {wxWindow, setFocusFromKbd, 0}}, + {248, {wxWindow, setFont, 1}}, + {249, {wxWindow, setForegroundColour, 1}}, + {250, {wxWindow, setHelpText, 1}}, + {251, {wxWindow, setId, 1}}, + {253, {wxWindow, setLabel, 1}}, + {254, {wxWindow, setName, 1}}, + {255, {wxWindow, setPalette, 1}}, + {256, {wxWindow, setScrollbar, 5}}, + {257, {wxWindow, setScrollPos, 3}}, + {258, {wxWindow, setSize_5, 5}}, + {259, {wxWindow, setSize_2_0, 2}}, + {260, {wxWindow, setSize_1, 1}}, + {261, {wxWindow, setSize_2_1, 2}}, + {262, {wxWindow, setSizeHints_3, 3}}, + {263, {wxWindow, setSizeHints_2, 2}}, + {264, {wxWindow, setSizer, 2}}, + {265, {wxWindow, setSizerAndFit, 2}}, + {266, {wxWindow, setThemeEnabled, 1}}, + {267, {wxWindow, setToolTip_1_0, 1}}, + {268, {wxWindow, setToolTip_1_1, 1}}, + {269, {wxWindow, setVirtualSize_1, 1}}, + {270, {wxWindow, setVirtualSize_2, 2}}, + {271, {wxWindow, setVirtualSizeHints_3, 3}}, + {272, {wxWindow, setVirtualSizeHints_2, 2}}, + {273, {wxWindow, setWindowStyle, 1}}, + {274, {wxWindow, setWindowStyleFlag, 1}}, + {275, {wxWindow, setWindowVariant, 1}}, + {276, {wxWindow, shouldInheritColours, 0}}, + {277, {wxWindow, show, 1}}, + {278, {wxWindow, thaw, 0}}, + {279, {wxWindow, transferDataFromWindow, 0}}, + {280, {wxWindow, transferDataToWindow, 0}}, + {281, {wxWindow, update, 0}}, + {282, {wxWindow, updateWindowUI, 1}}, + {283, {wxWindow, validate, 0}}, + {284, {wxWindow, warpPointer, 2}}, + {285, {wxWindow, setTransparent, 1}}, + {286, {wxWindow, canSetTransparent, 0}}, + {287, {wxWindow, isDoubleBuffered, 0}}, + {288, {wxWindow, setDoubleBuffered, 1}}, + {289, {wxWindow, getContentScaleFactor, 0}}, + {290, {wxTopLevelWindow, getIcon, 0}}, + {291, {wxTopLevelWindow, getIcons, 0}}, + {292, {wxTopLevelWindow, getTitle, 0}}, + {293, {wxTopLevelWindow, isActive, 0}}, + {294, {wxTopLevelWindow, iconize, 1}}, + {295, {wxTopLevelWindow, isFullScreen, 0}}, + {296, {wxTopLevelWindow, isIconized, 0}}, + {297, {wxTopLevelWindow, isMaximized, 0}}, + {298, {wxTopLevelWindow, maximize, 1}}, + {299, {wxTopLevelWindow, requestUserAttention, 1}}, + {300, {wxTopLevelWindow, setIcon, 1}}, + {301, {wxTopLevelWindow, setIcons, 1}}, + {302, {wxTopLevelWindow, centerOnScreen, 1}}, + {303, {wxTopLevelWindow, centreOnScreen, 1}}, + {305, {wxTopLevelWindow, setShape, 1}}, + {306, {wxTopLevelWindow, setTitle, 1}}, + {307, {wxTopLevelWindow, showFullScreen, 2}}, + {309, {wxFrame, new_4, 4}}, + {310, {wxFrame, new_0, 0}}, + {312, {wxFrame, destruct, 0}}, + {313, {wxFrame, create, 4}}, + {314, {wxFrame, createStatusBar, 1}}, + {315, {wxFrame, createToolBar, 1}}, + {316, {wxFrame, getClientAreaOrigin, 0}}, + {317, {wxFrame, getMenuBar, 0}}, + {318, {wxFrame, getStatusBar, 0}}, + {319, {wxFrame, getStatusBarPane, 0}}, + {320, {wxFrame, getToolBar, 0}}, + {321, {wxFrame, processCommand, 1}}, + {322, {wxFrame, sendSizeEvent, 0}}, + {323, {wxFrame, setMenuBar, 1}}, + {324, {wxFrame, setStatusBar, 1}}, + {325, {wxFrame, setStatusBarPane, 1}}, + {326, {wxFrame, setStatusText, 2}}, + {327, {wxFrame, setStatusWidths, 2}}, + {328, {wxFrame, setToolBar, 1}}, + {329, {wxMiniFrame, new_0, 0}}, + {330, {wxMiniFrame, new_4, 4}}, + {331, {wxMiniFrame, create, 4}}, + {332, {wxMiniFrame, 'Destroy', undefined}}, + {333, {wxSplashScreen, new_0, 0}}, + {334, {wxSplashScreen, new_6, 6}}, + {335, {wxSplashScreen, destruct, 0}}, + {336, {wxSplashScreen, getSplashStyle, 0}}, + {337, {wxSplashScreen, getTimeout, 0}}, + {338, {wxPanel, new_0, 0}}, + {339, {wxPanel, new_6, 6}}, + {340, {wxPanel, new_2, 2}}, + {341, {wxPanel, destruct, 0}}, + {342, {wxPanel, initDialog, 0}}, + {343, {wxPanel, setFocusIgnoringChildren, 0}}, + {344, {wxScrolledWindow, new_0, 0}}, + {345, {wxScrolledWindow, new_2, 2}}, + {346, {wxScrolledWindow, destruct, 0}}, + {347, {wxScrolledWindow, calcScrolledPosition_4, 4}}, + {348, {wxScrolledWindow, calcScrolledPosition_1, 1}}, + {349, {wxScrolledWindow, calcUnscrolledPosition_4, 4}}, + {350, {wxScrolledWindow, calcUnscrolledPosition_1, 1}}, + {351, {wxScrolledWindow, enableScrolling, 2}}, + {352, {wxScrolledWindow, getScrollPixelsPerUnit, 2}}, + {353, {wxScrolledWindow, getViewStart, 2}}, + {354, {wxScrolledWindow, doPrepareDC, 1}}, + {355, {wxScrolledWindow, prepareDC, 1}}, + {356, {wxScrolledWindow, scroll, 2}}, + {357, {wxScrolledWindow, setScrollbars, 5}}, + {358, {wxScrolledWindow, setScrollRate, 2}}, + {359, {wxScrolledWindow, setTargetWindow, 1}}, + {360, {wxSashWindow, new_0, 0}}, + {361, {wxSashWindow, new_2, 2}}, + {362, {wxSashWindow, destruct, 0}}, + {363, {wxSashWindow, getSashVisible, 1}}, + {364, {wxSashWindow, getMaximumSizeX, 0}}, + {365, {wxSashWindow, getMaximumSizeY, 0}}, + {366, {wxSashWindow, getMinimumSizeX, 0}}, + {367, {wxSashWindow, getMinimumSizeY, 0}}, + {368, {wxSashWindow, setMaximumSizeX, 1}}, + {369, {wxSashWindow, setMaximumSizeY, 1}}, + {370, {wxSashWindow, setMinimumSizeX, 1}}, + {371, {wxSashWindow, setMinimumSizeY, 1}}, + {372, {wxSashWindow, setSashVisible, 2}}, + {373, {wxSashLayoutWindow, new_0, 0}}, + {374, {wxSashLayoutWindow, new_2, 2}}, + {375, {wxSashLayoutWindow, create, 2}}, + {376, {wxSashLayoutWindow, getAlignment, 0}}, + {377, {wxSashLayoutWindow, getOrientation, 0}}, + {378, {wxSashLayoutWindow, setAlignment, 1}}, + {379, {wxSashLayoutWindow, setDefaultSize, 1}}, + {380, {wxSashLayoutWindow, setOrientation, 1}}, + {381, {wxSashLayoutWindow, 'Destroy', undefined}}, + {382, {wxGrid, new_0, 0}}, + {383, {wxGrid, new_3, 3}}, + {384, {wxGrid, new_4, 4}}, + {385, {wxGrid, destruct, 0}}, + {386, {wxGrid, appendCols, 1}}, + {387, {wxGrid, appendRows, 1}}, + {388, {wxGrid, autoSize, 0}}, + {389, {wxGrid, autoSizeColumn, 2}}, + {390, {wxGrid, autoSizeColumns, 1}}, + {391, {wxGrid, autoSizeRow, 2}}, + {392, {wxGrid, autoSizeRows, 1}}, + {393, {wxGrid, beginBatch, 0}}, + {394, {wxGrid, blockToDeviceRect, 2}}, + {395, {wxGrid, canDragColSize, 0}}, + {396, {wxGrid, canDragRowSize, 0}}, + {397, {wxGrid, canDragGridSize, 0}}, + {398, {wxGrid, canEnableCellControl, 0}}, + {399, {wxGrid, cellToRect_2, 2}}, + {400, {wxGrid, cellToRect_1, 1}}, + {401, {wxGrid, clearGrid, 0}}, + {402, {wxGrid, clearSelection, 0}}, + {403, {wxGrid, createGrid, 3}}, + {404, {wxGrid, deleteCols, 1}}, + {405, {wxGrid, deleteRows, 1}}, + {406, {wxGrid, disableCellEditControl, 0}}, + {407, {wxGrid, disableDragColSize, 0}}, + {408, {wxGrid, disableDragGridSize, 0}}, + {409, {wxGrid, disableDragRowSize, 0}}, + {410, {wxGrid, enableCellEditControl, 1}}, + {411, {wxGrid, enableDragColSize, 1}}, + {412, {wxGrid, enableDragGridSize, 1}}, + {413, {wxGrid, enableDragRowSize, 1}}, + {414, {wxGrid, enableEditing, 1}}, + {415, {wxGrid, enableGridLines, 1}}, + {416, {wxGrid, endBatch, 0}}, + {417, {wxGrid, fit, 0}}, + {418, {wxGrid, forceRefresh, 0}}, + {419, {wxGrid, getBatchCount, 0}}, + {420, {wxGrid, getCellAlignment, 4}}, + {421, {wxGrid, getCellBackgroundColour, 2}}, + {422, {wxGrid, getCellEditor, 2}}, + {423, {wxGrid, getCellFont, 2}}, + {424, {wxGrid, getCellRenderer, 2}}, + {425, {wxGrid, getCellTextColour, 2}}, + {426, {wxGrid, getCellValue_2, 2}}, + {427, {wxGrid, getCellValue_1, 1}}, + {428, {wxGrid, getColLabelAlignment, 2}}, + {429, {wxGrid, getColLabelSize, 0}}, + {430, {wxGrid, getColLabelValue, 1}}, + {431, {wxGrid, getColMinimalAcceptableWidth, 0}}, + {432, {wxGrid, getDefaultCellAlignment, 2}}, + {433, {wxGrid, getDefaultCellBackgroundColour, 0}}, + {434, {wxGrid, getDefaultCellFont, 0}}, + {435, {wxGrid, getDefaultCellTextColour, 0}}, + {436, {wxGrid, getDefaultColLabelSize, 0}}, + {437, {wxGrid, getDefaultColSize, 0}}, + {438, {wxGrid, getDefaultEditor, 0}}, + {439, {wxGrid, getDefaultEditorForCell_2, 2}}, + {440, {wxGrid, getDefaultEditorForCell_1, 1}}, + {441, {wxGrid, getDefaultEditorForType, 1}}, + {442, {wxGrid, getDefaultRenderer, 0}}, + {443, {wxGrid, getDefaultRendererForCell, 2}}, + {444, {wxGrid, getDefaultRendererForType, 1}}, + {445, {wxGrid, getDefaultRowLabelSize, 0}}, + {446, {wxGrid, getDefaultRowSize, 0}}, + {447, {wxGrid, getGridCursorCol, 0}}, + {448, {wxGrid, getGridCursorRow, 0}}, + {449, {wxGrid, getGridLineColour, 0}}, + {450, {wxGrid, gridLinesEnabled, 0}}, + {451, {wxGrid, getLabelBackgroundColour, 0}}, + {452, {wxGrid, getLabelFont, 0}}, + {453, {wxGrid, getLabelTextColour, 0}}, + {454, {wxGrid, getNumberCols, 0}}, + {455, {wxGrid, getNumberRows, 0}}, + {456, {wxGrid, getOrCreateCellAttr, 2}}, + {457, {wxGrid, getRowMinimalAcceptableHeight, 0}}, + {458, {wxGrid, getRowLabelAlignment, 2}}, + {459, {wxGrid, getRowLabelSize, 0}}, + {460, {wxGrid, getRowLabelValue, 1}}, + {461, {wxGrid, getRowSize, 1}}, + {462, {wxGrid, getScrollLineX, 0}}, + {463, {wxGrid, getScrollLineY, 0}}, + {464, {wxGrid, getSelectedCells, 0}}, + {465, {wxGrid, getSelectedCols, 0}}, + {466, {wxGrid, getSelectedRows, 0}}, + {467, {wxGrid, getSelectionBackground, 0}}, + {468, {wxGrid, getSelectionBlockTopLeft, 0}}, + {469, {wxGrid, getSelectionBlockBottomRight, 0}}, + {470, {wxGrid, getSelectionForeground, 0}}, + {471, {wxGrid, getViewWidth, 0}}, + {472, {wxGrid, getGridWindow, 0}}, + {473, {wxGrid, getGridRowLabelWindow, 0}}, + {474, {wxGrid, getGridColLabelWindow, 0}}, + {475, {wxGrid, getGridCornerLabelWindow, 0}}, + {476, {wxGrid, hideCellEditControl, 0}}, + {477, {wxGrid, insertCols, 1}}, + {478, {wxGrid, insertRows, 1}}, + {479, {wxGrid, isCellEditControlEnabled, 0}}, + {480, {wxGrid, isCurrentCellReadOnly, 0}}, + {481, {wxGrid, isEditable, 0}}, + {482, {wxGrid, isInSelection_2, 2}}, + {483, {wxGrid, isInSelection_1, 1}}, + {484, {wxGrid, isReadOnly, 2}}, + {485, {wxGrid, isSelection, 0}}, + {486, {wxGrid, isVisible_3, 3}}, + {487, {wxGrid, isVisible_2, 2}}, + {488, {wxGrid, makeCellVisible_2, 2}}, + {489, {wxGrid, makeCellVisible_1, 1}}, + {490, {wxGrid, moveCursorDown, 1}}, + {491, {wxGrid, moveCursorLeft, 1}}, + {492, {wxGrid, moveCursorRight, 1}}, + {493, {wxGrid, moveCursorUp, 1}}, + {494, {wxGrid, moveCursorDownBlock, 1}}, + {495, {wxGrid, moveCursorLeftBlock, 1}}, + {496, {wxGrid, moveCursorRightBlock, 1}}, + {497, {wxGrid, moveCursorUpBlock, 1}}, + {498, {wxGrid, movePageDown, 0}}, + {499, {wxGrid, movePageUp, 0}}, + {500, {wxGrid, registerDataType, 3}}, + {501, {wxGrid, saveEditControlValue, 0}}, + {502, {wxGrid, selectAll, 0}}, + {503, {wxGrid, selectBlock_5, 5}}, + {504, {wxGrid, selectBlock_3, 3}}, + {505, {wxGrid, selectCol, 2}}, + {506, {wxGrid, selectRow, 2}}, + {507, {wxGrid, setCellAlignment_4, 4}}, + {508, {wxGrid, setCellAlignment_3, 3}}, + {509, {wxGrid, setCellAlignment_1, 1}}, + {510, {wxGrid, setCellBackgroundColour_3_0, 3}}, + {511, {wxGrid, setCellBackgroundColour_1, 1}}, + {512, {wxGrid, setCellBackgroundColour_3_1, 3}}, + {513, {wxGrid, setCellEditor, 3}}, + {514, {wxGrid, setCellFont, 3}}, + {515, {wxGrid, setCellRenderer, 3}}, + {516, {wxGrid, setCellTextColour_3_0, 3}}, + {517, {wxGrid, setCellTextColour_3_1, 3}}, + {518, {wxGrid, setCellTextColour_1, 1}}, + {519, {wxGrid, setCellValue_3_0, 3}}, + {520, {wxGrid, setCellValue_2, 2}}, + {521, {wxGrid, setCellValue_3_1, 3}}, + {522, {wxGrid, setColAttr, 2}}, + {523, {wxGrid, setColFormatBool, 1}}, + {524, {wxGrid, setColFormatNumber, 1}}, + {525, {wxGrid, setColFormatFloat, 2}}, + {526, {wxGrid, setColFormatCustom, 2}}, + {527, {wxGrid, setColLabelAlignment, 2}}, + {528, {wxGrid, setColLabelSize, 1}}, + {529, {wxGrid, setColLabelValue, 2}}, + {530, {wxGrid, setColMinimalWidth, 2}}, + {531, {wxGrid, setColMinimalAcceptableWidth, 1}}, + {532, {wxGrid, setColSize, 2}}, + {533, {wxGrid, setDefaultCellAlignment, 2}}, + {534, {wxGrid, setDefaultCellBackgroundColour, 1}}, + {535, {wxGrid, setDefaultCellFont, 1}}, + {536, {wxGrid, setDefaultCellTextColour, 1}}, + {537, {wxGrid, setDefaultEditor, 1}}, + {538, {wxGrid, setDefaultRenderer, 1}}, + {539, {wxGrid, setDefaultColSize, 2}}, + {540, {wxGrid, setDefaultRowSize, 2}}, + {541, {wxGrid, setGridCursor, 2}}, + {542, {wxGrid, setGridLineColour, 1}}, + {543, {wxGrid, setLabelBackgroundColour, 1}}, + {544, {wxGrid, setLabelFont, 1}}, + {545, {wxGrid, setLabelTextColour, 1}}, + {546, {wxGrid, setMargins, 2}}, + {547, {wxGrid, setReadOnly, 3}}, + {548, {wxGrid, setRowAttr, 2}}, + {549, {wxGrid, setRowLabelAlignment, 2}}, + {550, {wxGrid, setRowLabelSize, 1}}, + {551, {wxGrid, setRowLabelValue, 2}}, + {552, {wxGrid, setRowMinimalHeight, 2}}, + {553, {wxGrid, setRowMinimalAcceptableHeight, 1}}, + {554, {wxGrid, setRowSize, 2}}, + {555, {wxGrid, setScrollLineX, 1}}, + {556, {wxGrid, setScrollLineY, 1}}, + {557, {wxGrid, setSelectionBackground, 1}}, + {558, {wxGrid, setSelectionForeground, 1}}, + {559, {wxGrid, setSelectionMode, 1}}, + {560, {wxGrid, showCellEditControl, 0}}, + {561, {wxGrid, xToCol, 2}}, + {562, {wxGrid, xToEdgeOfCol, 1}}, + {563, {wxGrid, yToEdgeOfRow, 1}}, + {564, {wxGrid, yToRow, 1}}, + {565, {wxGridCellRenderer, draw, 7}}, + {566, {wxGridCellRenderer, getBestSize, 5}}, + {567, {wxGridCellEditor, create, 3}}, + {568, {wxGridCellEditor, isCreated, 0}}, + {569, {wxGridCellEditor, setSize, 1}}, + {570, {wxGridCellEditor, show, 2}}, + {571, {wxGridCellEditor, paintBackground, 2}}, + {572, {wxGridCellEditor, beginEdit, 3}}, + {573, {wxGridCellEditor, endEdit, 3}}, + {574, {wxGridCellEditor, reset, 0}}, + {575, {wxGridCellEditor, startingKey, 1}}, + {576, {wxGridCellEditor, startingClick, 0}}, + {577, {wxGridCellEditor, handleReturn, 1}}, + {578, {wxGridCellBoolRenderer, new, 0}}, + {579, {wxGridCellBoolRenderer, 'Destroy', undefined}}, + {580, {wxGridCellBoolEditor, new, 0}}, + {581, {wxGridCellBoolEditor, isTrueValue, 1}}, + {582, {wxGridCellBoolEditor, useStringValues, 1}}, + {583, {wxGridCellBoolEditor, 'Destroy', undefined}}, + {584, {wxGridCellFloatRenderer, new, 1}}, + {585, {wxGridCellFloatRenderer, getPrecision, 0}}, + {586, {wxGridCellFloatRenderer, getWidth, 0}}, + {587, {wxGridCellFloatRenderer, setParameters, 1}}, + {588, {wxGridCellFloatRenderer, setPrecision, 1}}, + {589, {wxGridCellFloatRenderer, setWidth, 1}}, + {590, {wxGridCellFloatRenderer, 'Destroy', undefined}}, + {591, {wxGridCellFloatEditor, new, 1}}, + {592, {wxGridCellFloatEditor, setParameters, 1}}, + {593, {wxGridCellFloatEditor, 'Destroy', undefined}}, + {594, {wxGridCellStringRenderer, new, 0}}, + {595, {wxGridCellStringRenderer, 'Destroy', undefined}}, + {596, {wxGridCellTextEditor, new, 0}}, + {597, {wxGridCellTextEditor, setParameters, 1}}, + {598, {wxGridCellTextEditor, 'Destroy', undefined}}, + {600, {wxGridCellChoiceEditor, new, 2}}, + {601, {wxGridCellChoiceEditor, setParameters, 1}}, + {602, {wxGridCellChoiceEditor, 'Destroy', undefined}}, + {603, {wxGridCellNumberRenderer, new, 0}}, + {604, {wxGridCellNumberRenderer, 'Destroy', undefined}}, + {605, {wxGridCellNumberEditor, new, 1}}, + {606, {wxGridCellNumberEditor, getValue, 0}}, + {607, {wxGridCellNumberEditor, setParameters, 1}}, + {608, {wxGridCellNumberEditor, 'Destroy', undefined}}, + {609, {wxGridCellAttr, setTextColour, 1}}, + {610, {wxGridCellAttr, setBackgroundColour, 1}}, + {611, {wxGridCellAttr, setFont, 1}}, + {612, {wxGridCellAttr, setAlignment, 2}}, + {613, {wxGridCellAttr, setReadOnly, 1}}, + {614, {wxGridCellAttr, setRenderer, 1}}, + {615, {wxGridCellAttr, setEditor, 1}}, + {616, {wxGridCellAttr, hasTextColour, 0}}, + {617, {wxGridCellAttr, hasBackgroundColour, 0}}, + {618, {wxGridCellAttr, hasFont, 0}}, + {619, {wxGridCellAttr, hasAlignment, 0}}, + {620, {wxGridCellAttr, hasRenderer, 0}}, + {621, {wxGridCellAttr, hasEditor, 0}}, + {622, {wxGridCellAttr, getTextColour, 0}}, + {623, {wxGridCellAttr, getBackgroundColour, 0}}, + {624, {wxGridCellAttr, getFont, 0}}, + {625, {wxGridCellAttr, getAlignment, 2}}, + {626, {wxGridCellAttr, getRenderer, 3}}, + {627, {wxGridCellAttr, getEditor, 3}}, + {628, {wxGridCellAttr, isReadOnly, 0}}, + {629, {wxGridCellAttr, setDefAttr, 1}}, + {630, {wxDC, blit, 5}}, + {631, {wxDC, calcBoundingBox, 2}}, + {632, {wxDC, clear, 0}}, + {633, {wxDC, computeScaleAndOrigin, 0}}, + {634, {wxDC, crossHair, 1}}, + {635, {wxDC, destroyClippingRegion, 0}}, + {636, {wxDC, deviceToLogicalX, 1}}, + {637, {wxDC, deviceToLogicalXRel, 1}}, + {638, {wxDC, deviceToLogicalY, 1}}, + {639, {wxDC, deviceToLogicalYRel, 1}}, + {640, {wxDC, drawArc, 3}}, + {641, {wxDC, drawBitmap, 3}}, + {642, {wxDC, drawCheckMark, 1}}, + {643, {wxDC, drawCircle, 2}}, + {645, {wxDC, drawEllipse_2, 2}}, + {646, {wxDC, drawEllipse_1, 1}}, + {647, {wxDC, drawEllipticArc, 4}}, + {648, {wxDC, drawIcon, 2}}, + {649, {wxDC, drawLabel, 3}}, + {650, {wxDC, drawLine, 2}}, + {651, {wxDC, drawLines, 3}}, + {653, {wxDC, drawPolygon, 3}}, + {655, {wxDC, drawPoint, 1}}, + {657, {wxDC, drawRectangle_2, 2}}, + {658, {wxDC, drawRectangle_1, 1}}, + {659, {wxDC, drawRotatedText, 3}}, + {661, {wxDC, drawRoundedRectangle_3, 3}}, + {662, {wxDC, drawRoundedRectangle_2, 2}}, + {663, {wxDC, drawText, 2}}, + {664, {wxDC, endDoc, 0}}, + {665, {wxDC, endPage, 0}}, + {666, {wxDC, floodFill, 3}}, + {667, {wxDC, getBackground, 0}}, + {668, {wxDC, getBackgroundMode, 0}}, + {669, {wxDC, getBrush, 0}}, + {670, {wxDC, getCharHeight, 0}}, + {671, {wxDC, getCharWidth, 0}}, + {672, {wxDC, getClippingBox, 4}}, + {674, {wxDC, getFont, 0}}, + {675, {wxDC, getLayoutDirection, 0}}, + {676, {wxDC, getLogicalFunction, 0}}, + {677, {wxDC, getMapMode, 0}}, + {678, {wxDC, getMultiLineTextExtent_4, 4}}, + {679, {wxDC, getMultiLineTextExtent_1, 1}}, + {680, {wxDC, getPartialTextExtents, 2}}, + {681, {wxDC, getPen, 0}}, + {682, {wxDC, getPixel, 2}}, + {683, {wxDC, getPPI, 0}}, + {685, {wxDC, getSize, 0}}, + {687, {wxDC, getSizeMM, 0}}, + {688, {wxDC, getTextBackground, 0}}, + {689, {wxDC, getTextExtent_4, 4}}, + {690, {wxDC, getTextExtent_1, 1}}, + {692, {wxDC, getTextForeground, 0}}, + {693, {wxDC, getUserScale, 2}}, + {694, {wxDC, gradientFillConcentric_3, 3}}, + {695, {wxDC, gradientFillConcentric_4, 4}}, + {696, {wxDC, gradientFillLinear, 4}}, + {697, {wxDC, logicalToDeviceX, 1}}, + {698, {wxDC, logicalToDeviceXRel, 1}}, + {699, {wxDC, logicalToDeviceY, 1}}, + {700, {wxDC, logicalToDeviceYRel, 1}}, + {701, {wxDC, maxX, 0}}, + {702, {wxDC, maxY, 0}}, + {703, {wxDC, minX, 0}}, + {704, {wxDC, minY, 0}}, + {705, {wxDC, isOk, 0}}, + {706, {wxDC, resetBoundingBox, 0}}, + {707, {wxDC, setAxisOrientation, 2}}, + {708, {wxDC, setBackground, 1}}, + {709, {wxDC, setBackgroundMode, 1}}, + {710, {wxDC, setBrush, 1}}, + {712, {wxDC, setClippingRegion_2, 2}}, + {713, {wxDC, setClippingRegion_1_1, 1}}, + {714, {wxDC, setClippingRegion_1_0, 1}}, + {715, {wxDC, setDeviceOrigin, 2}}, + {716, {wxDC, setFont, 1}}, + {717, {wxDC, setLayoutDirection, 1}}, + {718, {wxDC, setLogicalFunction, 1}}, + {719, {wxDC, setMapMode, 1}}, + {720, {wxDC, setPalette, 1}}, + {721, {wxDC, setPen, 1}}, + {722, {wxDC, setTextBackground, 1}}, + {723, {wxDC, setTextForeground, 1}}, + {724, {wxDC, setUserScale, 2}}, + {725, {wxDC, startDoc, 1}}, + {726, {wxDC, startPage, 0}}, + {727, {wxMirrorDC, new, 2}}, + {728, {wxMirrorDC, 'Destroy', undefined}}, + {729, {wxScreenDC, new, 0}}, + {730, {wxScreenDC, destruct, 0}}, + {731, {wxPostScriptDC, new_0, 0}}, + {732, {wxPostScriptDC, new_1, 1}}, + {733, {wxPostScriptDC, destruct, 0}}, + {734, {wxPostScriptDC, setResolution, 1}}, + {735, {wxPostScriptDC, getResolution, 0}}, + {736, {wxWindowDC, new_0, 0}}, + {737, {wxWindowDC, new_1, 1}}, + {738, {wxWindowDC, destruct, 0}}, + {739, {wxClientDC, new_0, 0}}, + {740, {wxClientDC, new_1, 1}}, + {741, {wxClientDC, 'Destroy', undefined}}, + {742, {wxPaintDC, new_0, 0}}, + {743, {wxPaintDC, new_1, 1}}, + {744, {wxPaintDC, 'Destroy', undefined}}, + {746, {wxMemoryDC, new_1_0, 1}}, + {747, {wxMemoryDC, new_1_1, 1}}, + {748, {wxMemoryDC, new_0, 0}}, + {750, {wxMemoryDC, destruct, 0}}, + {751, {wxMemoryDC, selectObject, 1}}, + {752, {wxMemoryDC, selectObjectAsSource, 1}}, + {753, {wxBufferedDC, new_0, 0}}, + {754, {wxBufferedDC, new_2, 2}}, + {755, {wxBufferedDC, new_3, 3}}, + {756, {wxBufferedDC, destruct, 0}}, + {757, {wxBufferedDC, init_2, 2}}, + {758, {wxBufferedDC, init_3, 3}}, + {759, {wxBufferedPaintDC, new_3, 3}}, + {760, {wxBufferedPaintDC, new_2, 2}}, + {761, {wxBufferedPaintDC, destruct, 0}}, + {762, {wxGraphicsObject, destruct, 0}}, + {763, {wxGraphicsObject, getRenderer, 0}}, + {764, {wxGraphicsObject, isNull, 0}}, + {765, {wxGraphicsContext, destruct, 0}}, + {766, {wxGraphicsContext, create_1_1, 1}}, + {767, {wxGraphicsContext, create_1_0, 1}}, + {768, {wxGraphicsContext, create_0, 0}}, + {769, {wxGraphicsContext, createPen, 1}}, + {770, {wxGraphicsContext, createBrush, 1}}, + {771, {wxGraphicsContext, createRadialGradientBrush, 7}}, + {772, {wxGraphicsContext, createLinearGradientBrush, 6}}, + {773, {wxGraphicsContext, createFont, 2}}, + {774, {wxGraphicsContext, createMatrix, 1}}, + {775, {wxGraphicsContext, createPath, 0}}, + {776, {wxGraphicsContext, clip_1, 1}}, + {777, {wxGraphicsContext, clip_4, 4}}, + {778, {wxGraphicsContext, resetClip, 0}}, + {779, {wxGraphicsContext, drawBitmap, 5}}, + {780, {wxGraphicsContext, drawEllipse, 4}}, + {781, {wxGraphicsContext, drawIcon, 5}}, + {782, {wxGraphicsContext, drawLines, 3}}, + {783, {wxGraphicsContext, drawPath, 2}}, + {784, {wxGraphicsContext, drawRectangle, 4}}, + {785, {wxGraphicsContext, drawRoundedRectangle, 5}}, + {786, {wxGraphicsContext, drawText_3, 3}}, + {787, {wxGraphicsContext, drawText_4_0, 4}}, + {788, {wxGraphicsContext, drawText_4_1, 4}}, + {789, {wxGraphicsContext, drawText_5, 5}}, + {790, {wxGraphicsContext, fillPath, 2}}, + {791, {wxGraphicsContext, strokePath, 1}}, + {792, {wxGraphicsContext, getPartialTextExtents, 2}}, + {793, {wxGraphicsContext, getTextExtent, 5}}, + {794, {wxGraphicsContext, rotate, 1}}, + {795, {wxGraphicsContext, scale, 2}}, + {796, {wxGraphicsContext, translate, 2}}, + {797, {wxGraphicsContext, getTransform, 0}}, + {798, {wxGraphicsContext, setTransform, 1}}, + {799, {wxGraphicsContext, concatTransform, 1}}, + {800, {wxGraphicsContext, setBrush_1_1, 1}}, + {801, {wxGraphicsContext, setBrush_1_0, 1}}, + {802, {wxGraphicsContext, setFont_1, 1}}, + {803, {wxGraphicsContext, setFont_2, 2}}, + {804, {wxGraphicsContext, setPen_1_0, 1}}, + {805, {wxGraphicsContext, setPen_1_1, 1}}, + {806, {wxGraphicsContext, strokeLine, 4}}, + {807, {wxGraphicsContext, strokeLines, 2}}, + {809, {wxGraphicsMatrix, concat, 1}}, + {811, {wxGraphicsMatrix, get, 1}}, + {812, {wxGraphicsMatrix, invert, 0}}, + {813, {wxGraphicsMatrix, isEqual, 1}}, + {815, {wxGraphicsMatrix, isIdentity, 0}}, + {816, {wxGraphicsMatrix, rotate, 1}}, + {817, {wxGraphicsMatrix, scale, 2}}, + {818, {wxGraphicsMatrix, translate, 2}}, + {819, {wxGraphicsMatrix, set, 1}}, + {820, {wxGraphicsMatrix, transformPoint, 2}}, + {821, {wxGraphicsMatrix, transformDistance, 2}}, + {822, {wxGraphicsPath, moveToPoint_2, 2}}, + {823, {wxGraphicsPath, moveToPoint_1, 1}}, + {824, {wxGraphicsPath, addArc_6, 6}}, + {825, {wxGraphicsPath, addArc_5, 5}}, + {826, {wxGraphicsPath, addArcToPoint, 5}}, + {827, {wxGraphicsPath, addCircle, 3}}, + {828, {wxGraphicsPath, addCurveToPoint_6, 6}}, + {829, {wxGraphicsPath, addCurveToPoint_3, 3}}, + {830, {wxGraphicsPath, addEllipse, 4}}, + {831, {wxGraphicsPath, addLineToPoint_2, 2}}, + {832, {wxGraphicsPath, addLineToPoint_1, 1}}, + {833, {wxGraphicsPath, addPath, 1}}, + {834, {wxGraphicsPath, addQuadCurveToPoint, 4}}, + {835, {wxGraphicsPath, addRectangle, 4}}, + {836, {wxGraphicsPath, addRoundedRectangle, 5}}, + {837, {wxGraphicsPath, closeSubpath, 0}}, + {838, {wxGraphicsPath, contains_3, 3}}, + {839, {wxGraphicsPath, contains_2, 2}}, + {841, {wxGraphicsPath, getBox, 0}}, + {843, {wxGraphicsPath, getCurrentPoint, 0}}, + {844, {wxGraphicsPath, transform, 1}}, + {845, {wxGraphicsRenderer, getDefaultRenderer, 0}}, + {846, {wxGraphicsRenderer, createContext_1_1, 1}}, + {847, {wxGraphicsRenderer, createContext_1_0, 1}}, + {848, {wxGraphicsRenderer, createPen, 1}}, + {849, {wxGraphicsRenderer, createBrush, 1}}, + {850, {wxGraphicsRenderer, createLinearGradientBrush, 6}}, + {851, {wxGraphicsRenderer, createRadialGradientBrush, 7}}, + {852, {wxGraphicsRenderer, createFont, 2}}, + {853, {wxGraphicsRenderer, createMatrix, 1}}, + {854, {wxGraphicsRenderer, createPath, 0}}, + {856, {wxMenuBar, new_1, 1}}, + {858, {wxMenuBar, new_0, 0}}, + {860, {wxMenuBar, destruct, 0}}, + {861, {wxMenuBar, append, 2}}, + {862, {wxMenuBar, check, 2}}, + {863, {wxMenuBar, enable_2, 2}}, + {864, {wxMenuBar, enable_1, 1}}, + {865, {wxMenuBar, enableTop, 2}}, + {866, {wxMenuBar, findMenu, 1}}, + {867, {wxMenuBar, findMenuItem, 2}}, + {868, {wxMenuBar, findItem, 2}}, + {869, {wxMenuBar, getHelpString, 1}}, + {870, {wxMenuBar, getLabel_1, 1}}, + {871, {wxMenuBar, getLabel_0, 0}}, + {872, {wxMenuBar, getLabelTop, 1}}, + {873, {wxMenuBar, getMenu, 1}}, + {874, {wxMenuBar, getMenuCount, 0}}, + {875, {wxMenuBar, insert, 3}}, + {876, {wxMenuBar, isChecked, 1}}, + {877, {wxMenuBar, isEnabled_1, 1}}, + {878, {wxMenuBar, isEnabled_0, 0}}, + {879, {wxMenuBar, remove, 1}}, + {880, {wxMenuBar, replace, 3}}, + {881, {wxMenuBar, setHelpString, 2}}, + {882, {wxMenuBar, setLabel_2, 2}}, + {883, {wxMenuBar, setLabel_1, 1}}, + {884, {wxMenuBar, setLabelTop, 2}}, + {885, {wxControl, getLabel, 0}}, + {886, {wxControl, setLabel, 1}}, + {887, {wxControlWithItems, append_1, 1}}, + {888, {wxControlWithItems, append_2, 2}}, + {889, {wxControlWithItems, appendStrings_1, 1}}, + {890, {wxControlWithItems, clear, 0}}, + {891, {wxControlWithItems, delete, 1}}, + {892, {wxControlWithItems, findString, 2}}, + {893, {wxControlWithItems, getClientData, 1}}, + {894, {wxControlWithItems, setClientData, 2}}, + {895, {wxControlWithItems, getCount, 0}}, + {896, {wxControlWithItems, getSelection, 0}}, + {897, {wxControlWithItems, getString, 1}}, + {898, {wxControlWithItems, getStringSelection, 0}}, + {899, {wxControlWithItems, insert_2, 2}}, + {900, {wxControlWithItems, insert_3, 3}}, + {901, {wxControlWithItems, isEmpty, 0}}, + {902, {wxControlWithItems, select, 1}}, + {903, {wxControlWithItems, setSelection, 1}}, + {904, {wxControlWithItems, setString, 2}}, + {905, {wxControlWithItems, setStringSelection, 1}}, + {908, {wxMenu, new_2, 2}}, + {909, {wxMenu, new_1, 1}}, + {911, {wxMenu, destruct, 0}}, + {912, {wxMenu, append_3, 3}}, + {913, {wxMenu, append_1, 1}}, + {914, {wxMenu, append_4_0, 4}}, + {915, {wxMenu, append_4_1, 4}}, + {916, {wxMenu, appendCheckItem, 3}}, + {917, {wxMenu, appendRadioItem, 3}}, + {918, {wxMenu, appendSeparator, 0}}, + {919, {wxMenu, break, 0}}, + {920, {wxMenu, check, 2}}, + {921, {wxMenu, delete_1_0, 1}}, + {922, {wxMenu, delete_1_1, 1}}, + {923, {wxMenu, destroy_1_0, 1}}, + {924, {wxMenu, destroy_1_1, 1}}, + {925, {wxMenu, enable, 2}}, + {926, {wxMenu, findItem_1, 1}}, + {927, {wxMenu, findItem_2, 2}}, + {928, {wxMenu, findItemByPosition, 1}}, + {929, {wxMenu, getHelpString, 1}}, + {930, {wxMenu, getLabel, 1}}, + {931, {wxMenu, getMenuItemCount, 0}}, + {932, {wxMenu, getMenuItems, 0}}, + {934, {wxMenu, getTitle, 0}}, + {935, {wxMenu, insert_2, 2}}, + {936, {wxMenu, insert_3, 3}}, + {937, {wxMenu, insert_5_1, 5}}, + {938, {wxMenu, insert_5_0, 5}}, + {939, {wxMenu, insertCheckItem, 4}}, + {940, {wxMenu, insertRadioItem, 4}}, + {941, {wxMenu, insertSeparator, 1}}, + {942, {wxMenu, isChecked, 1}}, + {943, {wxMenu, isEnabled, 1}}, + {944, {wxMenu, prepend_1, 1}}, + {945, {wxMenu, prepend_2, 2}}, + {946, {wxMenu, prepend_4_1, 4}}, + {947, {wxMenu, prepend_4_0, 4}}, + {948, {wxMenu, prependCheckItem, 3}}, + {949, {wxMenu, prependRadioItem, 3}}, + {950, {wxMenu, prependSeparator, 0}}, + {951, {wxMenu, remove_1_0, 1}}, + {952, {wxMenu, remove_1_1, 1}}, + {953, {wxMenu, setHelpString, 2}}, + {954, {wxMenu, setLabel, 2}}, + {955, {wxMenu, setTitle, 1}}, + {956, {wxMenuItem, new, 1}}, + {958, {wxMenuItem, destruct, 0}}, + {959, {wxMenuItem, check, 1}}, + {960, {wxMenuItem, enable, 1}}, + {961, {wxMenuItem, getBitmap, 0}}, + {962, {wxMenuItem, getHelp, 0}}, + {963, {wxMenuItem, getId, 0}}, + {964, {wxMenuItem, getKind, 0}}, + {965, {wxMenuItem, getLabel, 0}}, + {966, {wxMenuItem, getLabelFromText, 1}}, + {967, {wxMenuItem, getMenu, 0}}, + {968, {wxMenuItem, getText, 0}}, + {969, {wxMenuItem, getSubMenu, 0}}, + {970, {wxMenuItem, isCheckable, 0}}, + {971, {wxMenuItem, isChecked, 0}}, + {972, {wxMenuItem, isEnabled, 0}}, + {973, {wxMenuItem, isSeparator, 0}}, + {974, {wxMenuItem, isSubMenu, 0}}, + {975, {wxMenuItem, setBitmap, 1}}, + {976, {wxMenuItem, setHelp, 1}}, + {977, {wxMenuItem, setMenu, 1}}, + {978, {wxMenuItem, setSubMenu, 1}}, + {979, {wxMenuItem, setText, 1}}, + {980, {wxToolBar, addControl, 1}}, + {981, {wxToolBar, addSeparator, 0}}, + {982, {wxToolBar, addTool_5, 5}}, + {983, {wxToolBar, addTool_4_0, 4}}, + {984, {wxToolBar, addTool_1, 1}}, + {985, {wxToolBar, addTool_4_1, 4}}, + {986, {wxToolBar, addTool_3, 3}}, + {987, {wxToolBar, addTool_6, 6}}, + {988, {wxToolBar, addCheckTool, 4}}, + {989, {wxToolBar, addRadioTool, 4}}, + {990, {wxToolBar, addStretchableSpace, 0}}, + {991, {wxToolBar, insertStretchableSpace, 1}}, + {992, {wxToolBar, deleteTool, 1}}, + {993, {wxToolBar, deleteToolByPos, 1}}, + {994, {wxToolBar, enableTool, 2}}, + {995, {wxToolBar, findById, 1}}, + {996, {wxToolBar, findControl, 1}}, + {997, {wxToolBar, findToolForPosition, 2}}, + {998, {wxToolBar, getToolSize, 0}}, + {999, {wxToolBar, getToolBitmapSize, 0}}, + {1000, {wxToolBar, getMargins, 0}}, + {1001, {wxToolBar, getToolEnabled, 1}}, + {1002, {wxToolBar, getToolLongHelp, 1}}, + {1003, {wxToolBar, getToolPacking, 0}}, + {1004, {wxToolBar, getToolPos, 1}}, + {1005, {wxToolBar, getToolSeparation, 0}}, + {1006, {wxToolBar, getToolShortHelp, 1}}, + {1007, {wxToolBar, getToolState, 1}}, + {1008, {wxToolBar, insertControl, 2}}, + {1009, {wxToolBar, insertSeparator, 1}}, + {1010, {wxToolBar, insertTool_5, 5}}, + {1011, {wxToolBar, insertTool_2, 2}}, + {1012, {wxToolBar, insertTool_4, 4}}, + {1013, {wxToolBar, realize, 0}}, + {1014, {wxToolBar, removeTool, 1}}, + {1015, {wxToolBar, setMargins, 2}}, + {1016, {wxToolBar, setToolBitmapSize, 1}}, + {1017, {wxToolBar, setToolLongHelp, 2}}, + {1018, {wxToolBar, setToolPacking, 1}}, + {1019, {wxToolBar, setToolShortHelp, 2}}, + {1020, {wxToolBar, setToolSeparation, 1}}, + {1021, {wxToolBar, toggleTool, 2}}, + {1023, {wxStatusBar, new_0, 0}}, + {1024, {wxStatusBar, new_2, 2}}, + {1026, {wxStatusBar, destruct, 0}}, + {1027, {wxStatusBar, create, 2}}, + {1028, {wxStatusBar, getFieldRect, 2}}, + {1029, {wxStatusBar, getFieldsCount, 0}}, + {1030, {wxStatusBar, getStatusText, 1}}, + {1031, {wxStatusBar, popStatusText, 1}}, + {1032, {wxStatusBar, pushStatusText, 2}}, + {1033, {wxStatusBar, setFieldsCount, 2}}, + {1034, {wxStatusBar, setMinHeight, 1}}, + {1035, {wxStatusBar, setStatusText, 2}}, + {1036, {wxStatusBar, setStatusWidths, 2}}, + {1037, {wxStatusBar, setStatusStyles, 2}}, + {1038, {wxBitmap, new_0, 0}}, + {1039, {wxBitmap, new_3, 3}}, + {1040, {wxBitmap, new_4, 4}}, + {1041, {wxBitmap, new_2_0, 2}}, + {1042, {wxBitmap, new_2_1, 2}}, + {1043, {wxBitmap, destruct, 0}}, + {1044, {wxBitmap, convertToImage, 0}}, + {1045, {wxBitmap, copyFromIcon, 1}}, + {1046, {wxBitmap, create, 3}}, + {1047, {wxBitmap, getDepth, 0}}, + {1048, {wxBitmap, getHeight, 0}}, + {1049, {wxBitmap, getPalette, 0}}, + {1050, {wxBitmap, getMask, 0}}, + {1051, {wxBitmap, getWidth, 0}}, + {1052, {wxBitmap, getSubBitmap, 1}}, + {1053, {wxBitmap, loadFile, 2}}, + {1054, {wxBitmap, ok, 0}}, + {1055, {wxBitmap, saveFile, 3}}, + {1056, {wxBitmap, setDepth, 1}}, + {1057, {wxBitmap, setHeight, 1}}, + {1058, {wxBitmap, setMask, 1}}, + {1059, {wxBitmap, setPalette, 1}}, + {1060, {wxBitmap, setWidth, 1}}, + {1061, {wxIcon, new_0, 0}}, + {1062, {wxIcon, new_2, 2}}, + {1063, {wxIcon, new_1, 1}}, + {1064, {wxIcon, copyFromBitmap, 1}}, + {1065, {wxIcon, 'Destroy', undefined}}, + {1066, {wxIconBundle, new_0, 0}}, + {1067, {wxIconBundle, new_2, 2}}, + {1068, {wxIconBundle, new_1_0, 1}}, + {1069, {wxIconBundle, new_1_1, 1}}, + {1070, {wxIconBundle, destruct, 0}}, + {1071, {wxIconBundle, addIcon_2, 2}}, + {1072, {wxIconBundle, addIcon_1, 1}}, + {1073, {wxIconBundle, getIcon_1_1, 1}}, + {1074, {wxIconBundle, getIcon_1_0, 1}}, + {1075, {wxCursor, new_0, 0}}, + {1076, {wxCursor, new_1_0, 1}}, + {1077, {wxCursor, new_1_1, 1}}, + {1078, {wxCursor, new_4, 4}}, + {1079, {wxCursor, destruct, 0}}, + {1080, {wxCursor, ok, 0}}, + {1081, {wxMask, new_0, 0}}, + {1082, {wxMask, new_2_1, 2}}, + {1083, {wxMask, new_2_0, 2}}, + {1084, {wxMask, new_1, 1}}, + {1085, {wxMask, destruct, 0}}, + {1086, {wxMask, create_2_1, 2}}, + {1087, {wxMask, create_2_0, 2}}, + {1088, {wxMask, create_1, 1}}, + {1089, {wxImage, new_0, 0}}, + {1090, {wxImage, new_3_0, 3}}, + {1091, {wxImage, new_4, 4}}, + {1092, {wxImage, new_5, 5}}, + {1093, {wxImage, new_2, 2}}, + {1094, {wxImage, new_3_1, 3}}, + {1095, {wxImage, blur, 1}}, + {1096, {wxImage, blurHorizontal, 1}}, + {1097, {wxImage, blurVertical, 1}}, + {1098, {wxImage, convertAlphaToMask, 1}}, + {1099, {wxImage, convertToGreyscale, 1}}, + {1100, {wxImage, convertToMono, 3}}, + {1101, {wxImage, copy, 0}}, + {1102, {wxImage, create_3, 3}}, + {1103, {wxImage, create_4, 4}}, + {1104, {wxImage, create_5, 5}}, + {1105, {wxImage, 'Destroy', 0}}, + {1106, {wxImage, findFirstUnusedColour, 4}}, + {1107, {wxImage, getImageExtWildcard, 0}}, + {1108, {wxImage, getAlpha_2, 2}}, + {1109, {wxImage, getAlpha_0, 0}}, + {1110, {wxImage, getBlue, 2}}, + {1111, {wxImage, getData, 0}}, + {1112, {wxImage, getGreen, 2}}, + {1113, {wxImage, getImageCount, 2}}, + {1114, {wxImage, getHeight, 0}}, + {1115, {wxImage, getMaskBlue, 0}}, + {1116, {wxImage, getMaskGreen, 0}}, + {1117, {wxImage, getMaskRed, 0}}, + {1118, {wxImage, getOrFindMaskColour, 3}}, + {1119, {wxImage, getPalette, 0}}, + {1120, {wxImage, getRed, 2}}, + {1121, {wxImage, getSubImage, 1}}, + {1122, {wxImage, getWidth, 0}}, + {1123, {wxImage, hasAlpha, 0}}, + {1124, {wxImage, hasMask, 0}}, + {1125, {wxImage, getOption, 1}}, + {1126, {wxImage, getOptionInt, 1}}, + {1127, {wxImage, hasOption, 1}}, + {1128, {wxImage, initAlpha, 0}}, + {1129, {wxImage, initStandardHandlers, 0}}, + {1130, {wxImage, isTransparent, 3}}, + {1131, {wxImage, loadFile_2, 2}}, + {1132, {wxImage, loadFile_3, 3}}, + {1133, {wxImage, ok, 0}}, + {1134, {wxImage, removeHandler, 1}}, + {1135, {wxImage, mirror, 1}}, + {1136, {wxImage, replace, 6}}, + {1137, {wxImage, rescale, 3}}, + {1138, {wxImage, resize, 3}}, + {1139, {wxImage, rotate, 3}}, + {1140, {wxImage, rotateHue, 1}}, + {1141, {wxImage, rotate90, 1}}, + {1142, {wxImage, saveFile_1, 1}}, + {1143, {wxImage, saveFile_2_0, 2}}, + {1144, {wxImage, saveFile_2_1, 2}}, + {1145, {wxImage, scale, 3}}, + {1146, {wxImage, size, 3}}, + {1147, {wxImage, setAlpha_3, 3}}, + {1148, {wxImage, setAlpha_2, 2}}, + {1149, {wxImage, setData_2, 2}}, + {1150, {wxImage, setData_4, 4}}, + {1151, {wxImage, setMask, 1}}, + {1152, {wxImage, setMaskColour, 3}}, + {1153, {wxImage, setMaskFromImage, 4}}, + {1154, {wxImage, setOption_2_1, 2}}, + {1155, {wxImage, setOption_2_0, 2}}, + {1156, {wxImage, setPalette, 1}}, + {1157, {wxImage, setRGB_5, 5}}, + {1158, {wxImage, setRGB_4, 4}}, + {1159, {wxImage, 'Destroy', undefined}}, + {1160, {wxBrush, new_0, 0}}, + {1161, {wxBrush, new_2, 2}}, + {1162, {wxBrush, new_1, 1}}, + {1164, {wxBrush, destruct, 0}}, + {1165, {wxBrush, getColour, 0}}, + {1166, {wxBrush, getStipple, 0}}, + {1167, {wxBrush, getStyle, 0}}, + {1168, {wxBrush, isHatch, 0}}, + {1169, {wxBrush, isOk, 0}}, + {1170, {wxBrush, setColour_1, 1}}, + {1171, {wxBrush, setColour_3, 3}}, + {1172, {wxBrush, setStipple, 1}}, + {1173, {wxBrush, setStyle, 1}}, + {1174, {wxPen, new_0, 0}}, + {1175, {wxPen, new_2, 2}}, + {1176, {wxPen, destruct, 0}}, + {1177, {wxPen, getCap, 0}}, + {1178, {wxPen, getColour, 0}}, + {1179, {wxPen, getJoin, 0}}, + {1180, {wxPen, getStyle, 0}}, + {1181, {wxPen, getWidth, 0}}, + {1182, {wxPen, isOk, 0}}, + {1183, {wxPen, setCap, 1}}, + {1184, {wxPen, setColour_1, 1}}, + {1185, {wxPen, setColour_3, 3}}, + {1186, {wxPen, setJoin, 1}}, + {1187, {wxPen, setStyle, 1}}, + {1188, {wxPen, setWidth, 1}}, + {1189, {wxRegion, new_0, 0}}, + {1190, {wxRegion, new_4, 4}}, + {1191, {wxRegion, new_2, 2}}, + {1192, {wxRegion, new_1_1, 1}}, + {1194, {wxRegion, new_1_0, 1}}, + {1196, {wxRegion, destruct, 0}}, + {1197, {wxRegion, clear, 0}}, + {1198, {wxRegion, contains_2, 2}}, + {1199, {wxRegion, contains_1_0, 1}}, + {1200, {wxRegion, contains_4, 4}}, + {1201, {wxRegion, contains_1_1, 1}}, + {1202, {wxRegion, convertToBitmap, 0}}, + {1203, {wxRegion, getBox, 0}}, + {1204, {wxRegion, intersect_4, 4}}, + {1205, {wxRegion, intersect_1_1, 1}}, + {1206, {wxRegion, intersect_1_0, 1}}, + {1207, {wxRegion, isEmpty, 0}}, + {1208, {wxRegion, subtract_4, 4}}, + {1209, {wxRegion, subtract_1_1, 1}}, + {1210, {wxRegion, subtract_1_0, 1}}, + {1211, {wxRegion, offset_2, 2}}, + {1212, {wxRegion, offset_1, 1}}, + {1213, {wxRegion, union_4, 4}}, + {1214, {wxRegion, union_1_2, 1}}, + {1215, {wxRegion, union_1_1, 1}}, + {1216, {wxRegion, union_1_0, 1}}, + {1217, {wxRegion, union_3, 3}}, + {1218, {wxRegion, xor_4, 4}}, + {1219, {wxRegion, xor_1_1, 1}}, + {1220, {wxRegion, xor_1_0, 1}}, + {1221, {wxAcceleratorTable, new_0, 0}}, + {1222, {wxAcceleratorTable, new_2, 2}}, + {1223, {wxAcceleratorTable, destruct, 0}}, + {1224, {wxAcceleratorTable, ok, 0}}, + {1225, {wxAcceleratorEntry, new_1_0, 1}}, + {1226, {wxAcceleratorEntry, new_1_1, 1}}, + {1227, {wxAcceleratorEntry, getCommand, 0}}, + {1228, {wxAcceleratorEntry, getFlags, 0}}, + {1229, {wxAcceleratorEntry, getKeyCode, 0}}, + {1230, {wxAcceleratorEntry, set, 4}}, + {1231, {wxAcceleratorEntry, 'Destroy', undefined}}, + {1236, {wxCaret, new_3, 3}}, + {1237, {wxCaret, new_2, 2}}, + {1239, {wxCaret, destruct, 0}}, + {1240, {wxCaret, create_3, 3}}, + {1241, {wxCaret, create_2, 2}}, + {1242, {wxCaret, getBlinkTime, 0}}, + {1244, {wxCaret, getPosition, 0}}, + {1246, {wxCaret, getSize, 0}}, + {1247, {wxCaret, getWindow, 0}}, + {1248, {wxCaret, hide, 0}}, + {1249, {wxCaret, isOk, 0}}, + {1250, {wxCaret, isVisible, 0}}, + {1251, {wxCaret, move_2, 2}}, + {1252, {wxCaret, move_1, 1}}, + {1253, {wxCaret, setBlinkTime, 1}}, + {1254, {wxCaret, setSize_2, 2}}, + {1255, {wxCaret, setSize_1, 1}}, + {1256, {wxCaret, show, 1}}, + {1257, {wxSizer, add_2_1, 2}}, + {1258, {wxSizer, add_2_0, 2}}, + {1259, {wxSizer, add_3, 3}}, + {1260, {wxSizer, add_2_3, 2}}, + {1261, {wxSizer, add_2_2, 2}}, + {1262, {wxSizer, addSpacer, 1}}, + {1263, {wxSizer, addStretchSpacer, 1}}, + {1264, {wxSizer, calcMin, 0}}, + {1265, {wxSizer, clear, 1}}, + {1266, {wxSizer, detach_1_2, 1}}, + {1267, {wxSizer, detach_1_1, 1}}, + {1268, {wxSizer, detach_1_0, 1}}, + {1269, {wxSizer, fit, 1}}, + {1270, {wxSizer, fitInside, 1}}, + {1271, {wxSizer, getChildren, 0}}, + {1272, {wxSizer, getItem_2_1, 2}}, + {1273, {wxSizer, getItem_2_0, 2}}, + {1274, {wxSizer, getItem_1, 1}}, + {1275, {wxSizer, getSize, 0}}, + {1276, {wxSizer, getPosition, 0}}, + {1277, {wxSizer, getMinSize, 0}}, + {1278, {wxSizer, hide_2_0, 2}}, + {1279, {wxSizer, hide_2_1, 2}}, + {1280, {wxSizer, hide_1, 1}}, + {1281, {wxSizer, insert_3_1, 3}}, + {1282, {wxSizer, insert_3_0, 3}}, + {1283, {wxSizer, insert_4, 4}}, + {1284, {wxSizer, insert_3_3, 3}}, + {1285, {wxSizer, insert_3_2, 3}}, + {1286, {wxSizer, insert_2, 2}}, + {1287, {wxSizer, insertSpacer, 2}}, + {1288, {wxSizer, insertStretchSpacer, 2}}, + {1289, {wxSizer, isShown_1_2, 1}}, + {1290, {wxSizer, isShown_1_1, 1}}, + {1291, {wxSizer, isShown_1_0, 1}}, + {1292, {wxSizer, layout, 0}}, + {1293, {wxSizer, prepend_2_1, 2}}, + {1294, {wxSizer, prepend_2_0, 2}}, + {1295, {wxSizer, prepend_3, 3}}, + {1296, {wxSizer, prepend_2_3, 2}}, + {1297, {wxSizer, prepend_2_2, 2}}, + {1298, {wxSizer, prepend_1, 1}}, + {1299, {wxSizer, prependSpacer, 1}}, + {1300, {wxSizer, prependStretchSpacer, 1}}, + {1301, {wxSizer, recalcSizes, 0}}, + {1302, {wxSizer, remove_1_1, 1}}, + {1303, {wxSizer, remove_1_0, 1}}, + {1304, {wxSizer, replace_3_1, 3}}, + {1305, {wxSizer, replace_3_0, 3}}, + {1306, {wxSizer, replace_2, 2}}, + {1307, {wxSizer, setDimension, 4}}, + {1308, {wxSizer, setMinSize_2, 2}}, + {1309, {wxSizer, setMinSize_1, 1}}, + {1310, {wxSizer, setItemMinSize_3_2, 3}}, + {1311, {wxSizer, setItemMinSize_2_2, 2}}, + {1312, {wxSizer, setItemMinSize_3_1, 3}}, + {1313, {wxSizer, setItemMinSize_2_1, 2}}, + {1314, {wxSizer, setItemMinSize_3_0, 3}}, + {1315, {wxSizer, setItemMinSize_2_0, 2}}, + {1316, {wxSizer, setSizeHints, 1}}, + {1317, {wxSizer, setVirtualSizeHints, 1}}, + {1318, {wxSizer, show_2_2, 2}}, + {1319, {wxSizer, show_2_1, 2}}, + {1320, {wxSizer, show_2_0, 2}}, + {1321, {wxSizer, show_1, 1}}, + {1322, {wxSizerFlags, new, 1}}, + {1323, {wxSizerFlags, align, 1}}, + {1324, {wxSizerFlags, border_2, 2}}, + {1325, {wxSizerFlags, border_1, 1}}, + {1326, {wxSizerFlags, center, 0}}, + {1327, {wxSizerFlags, centre, 0}}, + {1328, {wxSizerFlags, expand, 0}}, + {1329, {wxSizerFlags, left, 0}}, + {1330, {wxSizerFlags, proportion, 1}}, + {1331, {wxSizerFlags, right, 0}}, + {1332, {wxSizerFlags, 'Destroy', undefined}}, + {1333, {wxSizerItem, new_5_1, 5}}, + {1334, {wxSizerItem, new_2_1, 2}}, + {1335, {wxSizerItem, new_5_0, 5}}, + {1336, {wxSizerItem, new_2_0, 2}}, + {1337, {wxSizerItem, new_6, 6}}, + {1338, {wxSizerItem, new_3, 3}}, + {1339, {wxSizerItem, new_0, 0}}, + {1340, {wxSizerItem, destruct, 0}}, + {1341, {wxSizerItem, calcMin, 0}}, + {1342, {wxSizerItem, deleteWindows, 0}}, + {1343, {wxSizerItem, detachSizer, 0}}, + {1344, {wxSizerItem, getBorder, 0}}, + {1345, {wxSizerItem, getFlag, 0}}, + {1346, {wxSizerItem, getMinSize, 0}}, + {1347, {wxSizerItem, getPosition, 0}}, + {1348, {wxSizerItem, getProportion, 0}}, + {1349, {wxSizerItem, getRatio, 0}}, + {1350, {wxSizerItem, getRect, 0}}, + {1351, {wxSizerItem, getSize, 0}}, + {1352, {wxSizerItem, getSizer, 0}}, + {1353, {wxSizerItem, getSpacer, 0}}, + {1354, {wxSizerItem, getUserData, 0}}, + {1355, {wxSizerItem, getWindow, 0}}, + {1356, {wxSizerItem, isSizer, 0}}, + {1357, {wxSizerItem, isShown, 0}}, + {1358, {wxSizerItem, isSpacer, 0}}, + {1359, {wxSizerItem, isWindow, 0}}, + {1360, {wxSizerItem, setBorder, 1}}, + {1361, {wxSizerItem, setDimension, 2}}, + {1362, {wxSizerItem, setFlag, 1}}, + {1363, {wxSizerItem, setInitSize, 2}}, + {1364, {wxSizerItem, setMinSize_1, 1}}, + {1365, {wxSizerItem, setMinSize_2, 2}}, + {1366, {wxSizerItem, setProportion, 1}}, + {1367, {wxSizerItem, setRatio_2, 2}}, + {1368, {wxSizerItem, setRatio_1_1, 1}}, + {1369, {wxSizerItem, setRatio_1_0, 1}}, + {1370, {wxSizerItem, setSizer, 1}}, + {1371, {wxSizerItem, setSpacer_1, 1}}, + {1372, {wxSizerItem, setSpacer_2, 2}}, + {1373, {wxSizerItem, setWindow, 1}}, + {1374, {wxSizerItem, show, 1}}, + {1375, {wxBoxSizer, new, 1}}, + {1376, {wxBoxSizer, getOrientation, 0}}, + {1377, {wxBoxSizer, 'Destroy', undefined}}, + {1378, {wxStaticBoxSizer, new_2, 2}}, + {1379, {wxStaticBoxSizer, new_3, 3}}, + {1380, {wxStaticBoxSizer, getStaticBox, 0}}, + {1381, {wxStaticBoxSizer, 'Destroy', undefined}}, + {1382, {wxGridSizer, new_4, 4}}, + {1383, {wxGridSizer, new_2, 2}}, + {1384, {wxGridSizer, getCols, 0}}, + {1385, {wxGridSizer, getHGap, 0}}, + {1386, {wxGridSizer, getRows, 0}}, + {1387, {wxGridSizer, getVGap, 0}}, + {1388, {wxGridSizer, setCols, 1}}, + {1389, {wxGridSizer, setHGap, 1}}, + {1390, {wxGridSizer, setRows, 1}}, + {1391, {wxGridSizer, setVGap, 1}}, + {1392, {wxGridSizer, 'Destroy', undefined}}, + {1393, {wxFlexGridSizer, new_4, 4}}, + {1394, {wxFlexGridSizer, new_2, 2}}, + {1395, {wxFlexGridSizer, addGrowableCol, 2}}, + {1396, {wxFlexGridSizer, addGrowableRow, 2}}, + {1397, {wxFlexGridSizer, getFlexibleDirection, 0}}, + {1398, {wxFlexGridSizer, getNonFlexibleGrowMode, 0}}, + {1399, {wxFlexGridSizer, removeGrowableCol, 1}}, + {1400, {wxFlexGridSizer, removeGrowableRow, 1}}, + {1401, {wxFlexGridSizer, setFlexibleDirection, 1}}, + {1402, {wxFlexGridSizer, setNonFlexibleGrowMode, 1}}, + {1403, {wxFlexGridSizer, 'Destroy', undefined}}, + {1404, {wxGridBagSizer, new, 1}}, + {1405, {wxGridBagSizer, add_3_2, 3}}, + {1406, {wxGridBagSizer, add_3_1, 3}}, + {1407, {wxGridBagSizer, add_4, 4}}, + {1408, {wxGridBagSizer, add_1_0, 1}}, + {1409, {wxGridBagSizer, add_2_1, 2}}, + {1410, {wxGridBagSizer, add_2_0, 2}}, + {1411, {wxGridBagSizer, add_3_0, 3}}, + {1412, {wxGridBagSizer, add_1_1, 1}}, + {1413, {wxGridBagSizer, calcMin, 0}}, + {1414, {wxGridBagSizer, checkForIntersection_2, 2}}, + {1415, {wxGridBagSizer, checkForIntersection_3, 3}}, + {1416, {wxGridBagSizer, findItem_1_1, 1}}, + {1417, {wxGridBagSizer, findItem_1_0, 1}}, + {1418, {wxGridBagSizer, findItemAtPoint, 1}}, + {1419, {wxGridBagSizer, findItemAtPosition, 1}}, + {1420, {wxGridBagSizer, findItemWithData, 1}}, + {1421, {wxGridBagSizer, getCellSize, 2}}, + {1422, {wxGridBagSizer, getEmptyCellSize, 0}}, + {1423, {wxGridBagSizer, getItemPosition_1_2, 1}}, + {1424, {wxGridBagSizer, getItemPosition_1_1, 1}}, + {1425, {wxGridBagSizer, getItemPosition_1_0, 1}}, + {1426, {wxGridBagSizer, getItemSpan_1_2, 1}}, + {1427, {wxGridBagSizer, getItemSpan_1_1, 1}}, + {1428, {wxGridBagSizer, getItemSpan_1_0, 1}}, + {1429, {wxGridBagSizer, setEmptyCellSize, 1}}, + {1430, {wxGridBagSizer, setItemPosition_2_2, 2}}, + {1431, {wxGridBagSizer, setItemPosition_2_1, 2}}, + {1432, {wxGridBagSizer, setItemPosition_2_0, 2}}, + {1433, {wxGridBagSizer, setItemSpan_2_2, 2}}, + {1434, {wxGridBagSizer, setItemSpan_2_1, 2}}, + {1435, {wxGridBagSizer, setItemSpan_2_0, 2}}, + {1436, {wxGridBagSizer, 'Destroy', undefined}}, + {1437, {wxStdDialogButtonSizer, new, 0}}, + {1438, {wxStdDialogButtonSizer, addButton, 1}}, + {1439, {wxStdDialogButtonSizer, realize, 0}}, + {1440, {wxStdDialogButtonSizer, setAffirmativeButton, 1}}, + {1441, {wxStdDialogButtonSizer, setCancelButton, 1}}, + {1442, {wxStdDialogButtonSizer, setNegativeButton, 1}}, + {1443, {wxStdDialogButtonSizer, 'Destroy', undefined}}, + {1444, {wxFont, new_0, 0}}, + {1445, {wxFont, new_1, 1}}, + {1446, {wxFont, new_5, 5}}, + {1448, {wxFont, destruct, 0}}, + {1449, {wxFont, isFixedWidth, 0}}, + {1450, {wxFont, getDefaultEncoding, 0}}, + {1451, {wxFont, getFaceName, 0}}, + {1452, {wxFont, getFamily, 0}}, + {1453, {wxFont, getNativeFontInfoDesc, 0}}, + {1454, {wxFont, getNativeFontInfoUserDesc, 0}}, + {1455, {wxFont, getPointSize, 0}}, + {1456, {wxFont, getStyle, 0}}, + {1457, {wxFont, getUnderlined, 0}}, + {1458, {wxFont, getWeight, 0}}, + {1459, {wxFont, ok, 0}}, + {1460, {wxFont, setDefaultEncoding, 1}}, + {1461, {wxFont, setFaceName, 1}}, + {1462, {wxFont, setFamily, 1}}, + {1463, {wxFont, setPointSize, 1}}, + {1464, {wxFont, setStyle, 1}}, + {1465, {wxFont, setUnderlined, 1}}, + {1466, {wxFont, setWeight, 1}}, + {1467, {wxToolTip, enable, 1}}, + {1468, {wxToolTip, setDelay, 1}}, + {1469, {wxToolTip, new, 1}}, + {1470, {wxToolTip, setTip, 1}}, + {1471, {wxToolTip, getTip, 0}}, + {1472, {wxToolTip, getWindow, 0}}, + {1473, {wxToolTip, 'Destroy', undefined}}, + {1475, {wxButton, new_3, 3}}, + {1476, {wxButton, new_0, 0}}, + {1477, {wxButton, destruct, 0}}, + {1478, {wxButton, create, 3}}, + {1479, {wxButton, getDefaultSize, 0}}, + {1480, {wxButton, setDefault, 0}}, + {1481, {wxButton, setLabel, 1}}, + {1483, {wxBitmapButton, new_4, 4}}, + {1484, {wxBitmapButton, new_0, 0}}, + {1485, {wxBitmapButton, create, 4}}, + {1486, {wxBitmapButton, getBitmapDisabled, 0}}, + {1488, {wxBitmapButton, getBitmapFocus, 0}}, + {1490, {wxBitmapButton, getBitmapLabel, 0}}, + {1492, {wxBitmapButton, getBitmapSelected, 0}}, + {1494, {wxBitmapButton, setBitmapDisabled, 1}}, + {1495, {wxBitmapButton, setBitmapFocus, 1}}, + {1496, {wxBitmapButton, setBitmapLabel, 1}}, + {1497, {wxBitmapButton, setBitmapSelected, 1}}, + {1498, {wxBitmapButton, 'Destroy', undefined}}, + {1499, {wxToggleButton, new_0, 0}}, + {1500, {wxToggleButton, new_4, 4}}, + {1501, {wxToggleButton, create, 4}}, + {1502, {wxToggleButton, getValue, 0}}, + {1503, {wxToggleButton, setValue, 1}}, + {1504, {wxToggleButton, 'Destroy', undefined}}, + {1505, {wxCalendarCtrl, new_0, 0}}, + {1506, {wxCalendarCtrl, new_3, 3}}, + {1507, {wxCalendarCtrl, create, 3}}, + {1508, {wxCalendarCtrl, destruct, 0}}, + {1509, {wxCalendarCtrl, setDate, 1}}, + {1510, {wxCalendarCtrl, getDate, 0}}, + {1511, {wxCalendarCtrl, enableYearChange, 1}}, + {1512, {wxCalendarCtrl, enableMonthChange, 1}}, + {1513, {wxCalendarCtrl, enableHolidayDisplay, 1}}, + {1514, {wxCalendarCtrl, setHeaderColours, 2}}, + {1515, {wxCalendarCtrl, getHeaderColourFg, 0}}, + {1516, {wxCalendarCtrl, getHeaderColourBg, 0}}, + {1517, {wxCalendarCtrl, setHighlightColours, 2}}, + {1518, {wxCalendarCtrl, getHighlightColourFg, 0}}, + {1519, {wxCalendarCtrl, getHighlightColourBg, 0}}, + {1520, {wxCalendarCtrl, setHolidayColours, 2}}, + {1521, {wxCalendarCtrl, getHolidayColourFg, 0}}, + {1522, {wxCalendarCtrl, getHolidayColourBg, 0}}, + {1523, {wxCalendarCtrl, getAttr, 1}}, + {1524, {wxCalendarCtrl, setAttr, 2}}, + {1525, {wxCalendarCtrl, setHoliday, 1}}, + {1526, {wxCalendarCtrl, resetAttr, 1}}, + {1527, {wxCalendarCtrl, hitTest, 2}}, + {1528, {wxCalendarDateAttr, new_0, 0}}, + {1529, {wxCalendarDateAttr, new_2_1, 2}}, + {1530, {wxCalendarDateAttr, new_2_0, 2}}, + {1531, {wxCalendarDateAttr, setTextColour, 1}}, + {1532, {wxCalendarDateAttr, setBackgroundColour, 1}}, + {1533, {wxCalendarDateAttr, setBorderColour, 1}}, + {1534, {wxCalendarDateAttr, setFont, 1}}, + {1535, {wxCalendarDateAttr, setBorder, 1}}, + {1536, {wxCalendarDateAttr, setHoliday, 1}}, + {1537, {wxCalendarDateAttr, hasTextColour, 0}}, + {1538, {wxCalendarDateAttr, hasBackgroundColour, 0}}, + {1539, {wxCalendarDateAttr, hasBorderColour, 0}}, + {1540, {wxCalendarDateAttr, hasFont, 0}}, + {1541, {wxCalendarDateAttr, hasBorder, 0}}, + {1542, {wxCalendarDateAttr, isHoliday, 0}}, + {1543, {wxCalendarDateAttr, getTextColour, 0}}, + {1544, {wxCalendarDateAttr, getBackgroundColour, 0}}, + {1545, {wxCalendarDateAttr, getBorderColour, 0}}, + {1546, {wxCalendarDateAttr, getFont, 0}}, + {1547, {wxCalendarDateAttr, getBorder, 0}}, + {1548, {wxCalendarDateAttr, 'Destroy', undefined}}, + {1550, {wxCheckBox, new_4, 4}}, + {1551, {wxCheckBox, new_0, 0}}, + {1552, {wxCheckBox, create, 4}}, + {1553, {wxCheckBox, getValue, 0}}, + {1554, {wxCheckBox, get3StateValue, 0}}, + {1555, {wxCheckBox, is3rdStateAllowedForUser, 0}}, + {1556, {wxCheckBox, is3State, 0}}, + {1557, {wxCheckBox, isChecked, 0}}, + {1558, {wxCheckBox, setValue, 1}}, + {1559, {wxCheckBox, set3StateValue, 1}}, + {1560, {wxCheckBox, 'Destroy', undefined}}, + {1561, {wxCheckListBox, new_0, 0}}, + {1563, {wxCheckListBox, new_3, 3}}, + {1564, {wxCheckListBox, check, 2}}, + {1565, {wxCheckListBox, isChecked, 1}}, + {1566, {wxCheckListBox, 'Destroy', undefined}}, + {1569, {wxChoice, new_3, 3}}, + {1570, {wxChoice, new_0, 0}}, + {1572, {wxChoice, destruct, 0}}, + {1574, {wxChoice, create, 6}}, + {1575, {wxChoice, delete, 1}}, + {1576, {wxChoice, getColumns, 0}}, + {1577, {wxChoice, setColumns, 1}}, + {1578, {wxComboBox, new_0, 0}}, + {1580, {wxComboBox, new_3, 3}}, + {1581, {wxComboBox, destruct, 0}}, + {1583, {wxComboBox, create, 7}}, + {1584, {wxComboBox, canCopy, 0}}, + {1585, {wxComboBox, canCut, 0}}, + {1586, {wxComboBox, canPaste, 0}}, + {1587, {wxComboBox, canRedo, 0}}, + {1588, {wxComboBox, canUndo, 0}}, + {1589, {wxComboBox, copy, 0}}, + {1590, {wxComboBox, cut, 0}}, + {1591, {wxComboBox, getInsertionPoint, 0}}, + {1592, {wxComboBox, getLastPosition, 0}}, + {1593, {wxComboBox, getValue, 0}}, + {1594, {wxComboBox, paste, 0}}, + {1595, {wxComboBox, redo, 0}}, + {1596, {wxComboBox, replace, 3}}, + {1597, {wxComboBox, remove, 2}}, + {1598, {wxComboBox, setInsertionPoint, 1}}, + {1599, {wxComboBox, setInsertionPointEnd, 0}}, + {1600, {wxComboBox, setSelection_1, 1}}, + {1601, {wxComboBox, setSelection_2, 2}}, + {1602, {wxComboBox, setValue, 1}}, + {1603, {wxComboBox, undo, 0}}, + {1604, {wxGauge, new_0, 0}}, + {1605, {wxGauge, new_4, 4}}, + {1606, {wxGauge, create, 4}}, + {1607, {wxGauge, getRange, 0}}, + {1608, {wxGauge, getValue, 0}}, + {1609, {wxGauge, isVertical, 0}}, + {1610, {wxGauge, setRange, 1}}, + {1611, {wxGauge, setValue, 1}}, + {1612, {wxGauge, pulse, 0}}, + {1613, {wxGauge, 'Destroy', undefined}}, + {1614, {wxGenericDirCtrl, new_0, 0}}, + {1615, {wxGenericDirCtrl, new_2, 2}}, + {1616, {wxGenericDirCtrl, destruct, 0}}, + {1617, {wxGenericDirCtrl, create, 2}}, + {1618, {wxGenericDirCtrl, init, 0}}, + {1619, {wxGenericDirCtrl, collapseTree, 0}}, + {1620, {wxGenericDirCtrl, expandPath, 1}}, + {1621, {wxGenericDirCtrl, getDefaultPath, 0}}, + {1622, {wxGenericDirCtrl, getPath, 0}}, + {1623, {wxGenericDirCtrl, getFilePath, 0}}, + {1624, {wxGenericDirCtrl, getFilter, 0}}, + {1625, {wxGenericDirCtrl, getFilterIndex, 0}}, + {1626, {wxGenericDirCtrl, getRootId, 0}}, + {1627, {wxGenericDirCtrl, getTreeCtrl, 0}}, + {1628, {wxGenericDirCtrl, reCreateTree, 0}}, + {1629, {wxGenericDirCtrl, setDefaultPath, 1}}, + {1630, {wxGenericDirCtrl, setFilter, 1}}, + {1631, {wxGenericDirCtrl, setFilterIndex, 1}}, + {1632, {wxGenericDirCtrl, setPath, 1}}, + {1634, {wxStaticBox, new_4, 4}}, + {1635, {wxStaticBox, new_0, 0}}, + {1636, {wxStaticBox, create, 4}}, + {1637, {wxStaticBox, 'Destroy', undefined}}, + {1639, {wxStaticLine, new_2, 2}}, + {1640, {wxStaticLine, new_0, 0}}, + {1641, {wxStaticLine, create, 2}}, + {1642, {wxStaticLine, isVertical, 0}}, + {1643, {wxStaticLine, getDefaultSize, 0}}, + {1644, {wxStaticLine, 'Destroy', undefined}}, + {1647, {wxListBox, new_3, 3}}, + {1648, {wxListBox, new_0, 0}}, + {1650, {wxListBox, destruct, 0}}, + {1652, {wxListBox, create, 6}}, + {1653, {wxListBox, deselect, 1}}, + {1654, {wxListBox, getSelections, 1}}, + {1655, {wxListBox, insertItems, 2}}, + {1656, {wxListBox, isSelected, 1}}, + {1657, {wxListBox, set, 1}}, + {1658, {wxListBox, hitTest, 1}}, + {1659, {wxListBox, setFirstItem_1_0, 1}}, + {1660, {wxListBox, setFirstItem_1_1, 1}}, + {1661, {wxListCtrl, new_0, 0}}, + {1662, {wxListCtrl, new_2, 2}}, + {1663, {wxListCtrl, arrange, 1}}, + {1664, {wxListCtrl, assignImageList, 2}}, + {1665, {wxListCtrl, clearAll, 0}}, + {1666, {wxListCtrl, create, 2}}, + {1667, {wxListCtrl, deleteAllItems, 0}}, + {1668, {wxListCtrl, deleteColumn, 1}}, + {1669, {wxListCtrl, deleteItem, 1}}, + {1670, {wxListCtrl, editLabel, 1}}, + {1671, {wxListCtrl, ensureVisible, 1}}, + {1672, {wxListCtrl, findItem_3_0, 3}}, + {1673, {wxListCtrl, findItem_3_1, 3}}, + {1674, {wxListCtrl, getColumn, 2}}, + {1675, {wxListCtrl, getColumnCount, 0}}, + {1676, {wxListCtrl, getColumnWidth, 1}}, + {1677, {wxListCtrl, getCountPerPage, 0}}, + {1678, {wxListCtrl, getEditControl, 0}}, + {1679, {wxListCtrl, getImageList, 1}}, + {1680, {wxListCtrl, getItem, 1}}, + {1681, {wxListCtrl, getItemBackgroundColour, 1}}, + {1682, {wxListCtrl, getItemCount, 0}}, + {1683, {wxListCtrl, getItemData, 1}}, + {1684, {wxListCtrl, getItemFont, 1}}, + {1685, {wxListCtrl, getItemPosition, 2}}, + {1686, {wxListCtrl, getItemRect, 3}}, + {1687, {wxListCtrl, getItemSpacing, 0}}, + {1688, {wxListCtrl, getItemState, 2}}, + {1689, {wxListCtrl, getItemText, 1}}, + {1690, {wxListCtrl, getItemTextColour, 1}}, + {1691, {wxListCtrl, getNextItem, 2}}, + {1692, {wxListCtrl, getSelectedItemCount, 0}}, + {1693, {wxListCtrl, getTextColour, 0}}, + {1694, {wxListCtrl, getTopItem, 0}}, + {1695, {wxListCtrl, getViewRect, 0}}, + {1696, {wxListCtrl, hitTest, 3}}, + {1697, {wxListCtrl, insertColumn_2, 2}}, + {1698, {wxListCtrl, insertColumn_3, 3}}, + {1699, {wxListCtrl, insertItem_1, 1}}, + {1700, {wxListCtrl, insertItem_2_1, 2}}, + {1701, {wxListCtrl, insertItem_2_0, 2}}, + {1702, {wxListCtrl, insertItem_3, 3}}, + {1703, {wxListCtrl, refreshItem, 1}}, + {1704, {wxListCtrl, refreshItems, 2}}, + {1705, {wxListCtrl, scrollList, 2}}, + {1706, {wxListCtrl, setBackgroundColour, 1}}, + {1707, {wxListCtrl, setColumn, 2}}, + {1708, {wxListCtrl, setColumnWidth, 2}}, + {1709, {wxListCtrl, setImageList, 2}}, + {1710, {wxListCtrl, setItem_1, 1}}, + {1711, {wxListCtrl, setItem_4, 4}}, + {1712, {wxListCtrl, setItemBackgroundColour, 2}}, + {1713, {wxListCtrl, setItemCount, 1}}, + {1714, {wxListCtrl, setItemData, 2}}, + {1715, {wxListCtrl, setItemFont, 2}}, + {1716, {wxListCtrl, setItemImage, 3}}, + {1717, {wxListCtrl, setItemColumnImage, 3}}, + {1718, {wxListCtrl, setItemPosition, 2}}, + {1719, {wxListCtrl, setItemState, 3}}, + {1720, {wxListCtrl, setItemText, 2}}, + {1721, {wxListCtrl, setItemTextColour, 2}}, + {1722, {wxListCtrl, setSingleStyle, 2}}, + {1723, {wxListCtrl, setTextColour, 1}}, + {1724, {wxListCtrl, setWindowStyleFlag, 1}}, + {1725, {wxListCtrl, sortItems, 2}}, + {1726, {wxListCtrl, 'Destroy', undefined}}, + {1727, {wxListView, clearColumnImage, 1}}, + {1728, {wxListView, focus, 1}}, + {1729, {wxListView, getFirstSelected, 0}}, + {1730, {wxListView, getFocusedItem, 0}}, + {1731, {wxListView, getNextSelected, 1}}, + {1732, {wxListView, isSelected, 1}}, + {1733, {wxListView, select, 2}}, + {1734, {wxListView, setColumnImage, 2}}, + {1735, {wxListItem, new_0, 0}}, + {1736, {wxListItem, new_1, 1}}, + {1737, {wxListItem, destruct, 0}}, + {1738, {wxListItem, clear, 0}}, + {1739, {wxListItem, getAlign, 0}}, + {1740, {wxListItem, getBackgroundColour, 0}}, + {1741, {wxListItem, getColumn, 0}}, + {1742, {wxListItem, getFont, 0}}, + {1743, {wxListItem, getId, 0}}, + {1744, {wxListItem, getImage, 0}}, + {1745, {wxListItem, getMask, 0}}, + {1746, {wxListItem, getState, 0}}, + {1747, {wxListItem, getText, 0}}, + {1748, {wxListItem, getTextColour, 0}}, + {1749, {wxListItem, getWidth, 0}}, + {1750, {wxListItem, setAlign, 1}}, + {1751, {wxListItem, setBackgroundColour, 1}}, + {1752, {wxListItem, setColumn, 1}}, + {1753, {wxListItem, setFont, 1}}, + {1754, {wxListItem, setId, 1}}, + {1755, {wxListItem, setImage, 1}}, + {1756, {wxListItem, setMask, 1}}, + {1757, {wxListItem, setState, 1}}, + {1758, {wxListItem, setStateMask, 1}}, + {1759, {wxListItem, setText, 1}}, + {1760, {wxListItem, setTextColour, 1}}, + {1761, {wxListItem, setWidth, 1}}, + {1762, {wxListItemAttr, new_0, 0}}, + {1763, {wxListItemAttr, new_3, 3}}, + {1764, {wxListItemAttr, getBackgroundColour, 0}}, + {1765, {wxListItemAttr, getFont, 0}}, + {1766, {wxListItemAttr, getTextColour, 0}}, + {1767, {wxListItemAttr, hasBackgroundColour, 0}}, + {1768, {wxListItemAttr, hasFont, 0}}, + {1769, {wxListItemAttr, hasTextColour, 0}}, + {1770, {wxListItemAttr, setBackgroundColour, 1}}, + {1771, {wxListItemAttr, setFont, 1}}, + {1772, {wxListItemAttr, setTextColour, 1}}, + {1773, {wxListItemAttr, 'Destroy', undefined}}, + {1774, {wxImageList, new_0, 0}}, + {1775, {wxImageList, new_3, 3}}, + {1776, {wxImageList, add_1, 1}}, + {1777, {wxImageList, add_2_0, 2}}, + {1778, {wxImageList, add_2_1, 2}}, + {1779, {wxImageList, create, 3}}, + {1781, {wxImageList, draw, 5}}, + {1782, {wxImageList, getBitmap, 1}}, + {1783, {wxImageList, getIcon, 1}}, + {1784, {wxImageList, getImageCount, 0}}, + {1785, {wxImageList, getSize, 3}}, + {1786, {wxImageList, remove, 1}}, + {1787, {wxImageList, removeAll, 0}}, + {1788, {wxImageList, replace_2, 2}}, + {1789, {wxImageList, replace_3, 3}}, + {1790, {wxImageList, 'Destroy', undefined}}, + {1791, {wxTextAttr, new_0, 0}}, + {1792, {wxTextAttr, new_2, 2}}, + {1793, {wxTextAttr, getAlignment, 0}}, + {1794, {wxTextAttr, getBackgroundColour, 0}}, + {1795, {wxTextAttr, getFont, 0}}, + {1796, {wxTextAttr, getLeftIndent, 0}}, + {1797, {wxTextAttr, getLeftSubIndent, 0}}, + {1798, {wxTextAttr, getRightIndent, 0}}, + {1799, {wxTextAttr, getTabs, 0}}, + {1800, {wxTextAttr, getTextColour, 0}}, + {1801, {wxTextAttr, hasBackgroundColour, 0}}, + {1802, {wxTextAttr, hasFont, 0}}, + {1803, {wxTextAttr, hasTextColour, 0}}, + {1804, {wxTextAttr, getFlags, 0}}, + {1805, {wxTextAttr, isDefault, 0}}, + {1806, {wxTextAttr, setAlignment, 1}}, + {1807, {wxTextAttr, setBackgroundColour, 1}}, + {1808, {wxTextAttr, setFlags, 1}}, + {1809, {wxTextAttr, setFont, 2}}, + {1810, {wxTextAttr, setLeftIndent, 2}}, + {1811, {wxTextAttr, setRightIndent, 1}}, + {1812, {wxTextAttr, setTabs, 1}}, + {1813, {wxTextAttr, setTextColour, 1}}, + {1814, {wxTextAttr, 'Destroy', undefined}}, + {1816, {wxTextCtrl, new_3, 3}}, + {1817, {wxTextCtrl, new_0, 0}}, + {1819, {wxTextCtrl, destruct, 0}}, + {1820, {wxTextCtrl, appendText, 1}}, + {1821, {wxTextCtrl, canCopy, 0}}, + {1822, {wxTextCtrl, canCut, 0}}, + {1823, {wxTextCtrl, canPaste, 0}}, + {1824, {wxTextCtrl, canRedo, 0}}, + {1825, {wxTextCtrl, canUndo, 0}}, + {1826, {wxTextCtrl, clear, 0}}, + {1827, {wxTextCtrl, copy, 0}}, + {1828, {wxTextCtrl, create, 3}}, + {1829, {wxTextCtrl, cut, 0}}, + {1830, {wxTextCtrl, discardEdits, 0}}, + {1831, {wxTextCtrl, changeValue, 1}}, + {1832, {wxTextCtrl, emulateKeyPress, 1}}, + {1833, {wxTextCtrl, getDefaultStyle, 0}}, + {1834, {wxTextCtrl, getInsertionPoint, 0}}, + {1835, {wxTextCtrl, getLastPosition, 0}}, + {1836, {wxTextCtrl, getLineLength, 1}}, + {1837, {wxTextCtrl, getLineText, 1}}, + {1838, {wxTextCtrl, getNumberOfLines, 0}}, + {1839, {wxTextCtrl, getRange, 2}}, + {1840, {wxTextCtrl, getSelection, 2}}, + {1841, {wxTextCtrl, getStringSelection, 0}}, + {1842, {wxTextCtrl, getStyle, 2}}, + {1843, {wxTextCtrl, getValue, 0}}, + {1844, {wxTextCtrl, isEditable, 0}}, + {1845, {wxTextCtrl, isModified, 0}}, + {1846, {wxTextCtrl, isMultiLine, 0}}, + {1847, {wxTextCtrl, isSingleLine, 0}}, + {1848, {wxTextCtrl, loadFile, 2}}, + {1849, {wxTextCtrl, markDirty, 0}}, + {1850, {wxTextCtrl, paste, 0}}, + {1851, {wxTextCtrl, positionToXY, 3}}, + {1852, {wxTextCtrl, redo, 0}}, + {1853, {wxTextCtrl, remove, 2}}, + {1854, {wxTextCtrl, replace, 3}}, + {1855, {wxTextCtrl, saveFile, 1}}, + {1856, {wxTextCtrl, setDefaultStyle, 1}}, + {1857, {wxTextCtrl, setEditable, 1}}, + {1858, {wxTextCtrl, setInsertionPoint, 1}}, + {1859, {wxTextCtrl, setInsertionPointEnd, 0}}, + {1861, {wxTextCtrl, setMaxLength, 1}}, + {1862, {wxTextCtrl, setSelection, 2}}, + {1863, {wxTextCtrl, setStyle, 3}}, + {1864, {wxTextCtrl, setValue, 1}}, + {1865, {wxTextCtrl, showPosition, 1}}, + {1866, {wxTextCtrl, undo, 0}}, + {1867, {wxTextCtrl, writeText, 1}}, + {1868, {wxTextCtrl, xYToPosition, 2}}, + {1871, {wxNotebook, new_0, 0}}, + {1872, {wxNotebook, new_3, 3}}, + {1873, {wxNotebook, destruct, 0}}, + {1874, {wxNotebook, addPage, 3}}, + {1875, {wxNotebook, advanceSelection, 1}}, + {1876, {wxNotebook, assignImageList, 1}}, + {1877, {wxNotebook, create, 3}}, + {1878, {wxNotebook, deleteAllPages, 0}}, + {1879, {wxNotebook, deletePage, 1}}, + {1880, {wxNotebook, removePage, 1}}, + {1881, {wxNotebook, getCurrentPage, 0}}, + {1882, {wxNotebook, getImageList, 0}}, + {1884, {wxNotebook, getPage, 1}}, + {1885, {wxNotebook, getPageCount, 0}}, + {1886, {wxNotebook, getPageImage, 1}}, + {1887, {wxNotebook, getPageText, 1}}, + {1888, {wxNotebook, getRowCount, 0}}, + {1889, {wxNotebook, getSelection, 0}}, + {1890, {wxNotebook, getThemeBackgroundColour, 0}}, + {1892, {wxNotebook, hitTest, 2}}, + {1894, {wxNotebook, insertPage, 4}}, + {1895, {wxNotebook, setImageList, 1}}, + {1896, {wxNotebook, setPadding, 1}}, + {1897, {wxNotebook, setPageSize, 1}}, + {1898, {wxNotebook, setPageImage, 2}}, + {1899, {wxNotebook, setPageText, 2}}, + {1900, {wxNotebook, setSelection, 1}}, + {1901, {wxNotebook, changeSelection, 1}}, + {1902, {wxChoicebook, new_0, 0}}, + {1903, {wxChoicebook, new_3, 3}}, + {1904, {wxChoicebook, addPage, 3}}, + {1905, {wxChoicebook, advanceSelection, 1}}, + {1906, {wxChoicebook, assignImageList, 1}}, + {1907, {wxChoicebook, create, 3}}, + {1908, {wxChoicebook, deleteAllPages, 0}}, + {1909, {wxChoicebook, deletePage, 1}}, + {1910, {wxChoicebook, removePage, 1}}, + {1911, {wxChoicebook, getCurrentPage, 0}}, + {1912, {wxChoicebook, getImageList, 0}}, + {1914, {wxChoicebook, getPage, 1}}, + {1915, {wxChoicebook, getPageCount, 0}}, + {1916, {wxChoicebook, getPageImage, 1}}, + {1917, {wxChoicebook, getPageText, 1}}, + {1918, {wxChoicebook, getSelection, 0}}, + {1919, {wxChoicebook, hitTest, 2}}, + {1920, {wxChoicebook, insertPage, 4}}, + {1921, {wxChoicebook, setImageList, 1}}, + {1922, {wxChoicebook, setPageSize, 1}}, + {1923, {wxChoicebook, setPageImage, 2}}, + {1924, {wxChoicebook, setPageText, 2}}, + {1925, {wxChoicebook, setSelection, 1}}, + {1926, {wxChoicebook, changeSelection, 1}}, + {1927, {wxChoicebook, 'Destroy', undefined}}, + {1928, {wxToolbook, new_0, 0}}, + {1929, {wxToolbook, new_3, 3}}, + {1930, {wxToolbook, addPage, 3}}, + {1931, {wxToolbook, advanceSelection, 1}}, + {1932, {wxToolbook, assignImageList, 1}}, + {1933, {wxToolbook, create, 3}}, + {1934, {wxToolbook, deleteAllPages, 0}}, + {1935, {wxToolbook, deletePage, 1}}, + {1936, {wxToolbook, removePage, 1}}, + {1937, {wxToolbook, getCurrentPage, 0}}, + {1938, {wxToolbook, getImageList, 0}}, + {1940, {wxToolbook, getPage, 1}}, + {1941, {wxToolbook, getPageCount, 0}}, + {1942, {wxToolbook, getPageImage, 1}}, + {1943, {wxToolbook, getPageText, 1}}, + {1944, {wxToolbook, getSelection, 0}}, + {1946, {wxToolbook, hitTest, 2}}, + {1947, {wxToolbook, insertPage, 4}}, + {1948, {wxToolbook, setImageList, 1}}, + {1949, {wxToolbook, setPageSize, 1}}, + {1950, {wxToolbook, setPageImage, 2}}, + {1951, {wxToolbook, setPageText, 2}}, + {1952, {wxToolbook, setSelection, 1}}, + {1953, {wxToolbook, changeSelection, 1}}, + {1954, {wxToolbook, 'Destroy', undefined}}, + {1955, {wxListbook, new_0, 0}}, + {1956, {wxListbook, new_3, 3}}, + {1957, {wxListbook, addPage, 3}}, + {1958, {wxListbook, advanceSelection, 1}}, + {1959, {wxListbook, assignImageList, 1}}, + {1960, {wxListbook, create, 3}}, + {1961, {wxListbook, deleteAllPages, 0}}, + {1962, {wxListbook, deletePage, 1}}, + {1963, {wxListbook, removePage, 1}}, + {1964, {wxListbook, getCurrentPage, 0}}, + {1965, {wxListbook, getImageList, 0}}, + {1967, {wxListbook, getPage, 1}}, + {1968, {wxListbook, getPageCount, 0}}, + {1969, {wxListbook, getPageImage, 1}}, + {1970, {wxListbook, getPageText, 1}}, + {1971, {wxListbook, getSelection, 0}}, + {1973, {wxListbook, hitTest, 2}}, + {1974, {wxListbook, insertPage, 4}}, + {1975, {wxListbook, setImageList, 1}}, + {1976, {wxListbook, setPageSize, 1}}, + {1977, {wxListbook, setPageImage, 2}}, + {1978, {wxListbook, setPageText, 2}}, + {1979, {wxListbook, setSelection, 1}}, + {1980, {wxListbook, changeSelection, 1}}, + {1981, {wxListbook, 'Destroy', undefined}}, + {1982, {wxTreebook, new_0, 0}}, + {1983, {wxTreebook, new_3, 3}}, + {1984, {wxTreebook, addPage, 3}}, + {1985, {wxTreebook, advanceSelection, 1}}, + {1986, {wxTreebook, assignImageList, 1}}, + {1987, {wxTreebook, create, 3}}, + {1988, {wxTreebook, deleteAllPages, 0}}, + {1989, {wxTreebook, deletePage, 1}}, + {1990, {wxTreebook, removePage, 1}}, + {1991, {wxTreebook, getCurrentPage, 0}}, + {1992, {wxTreebook, getImageList, 0}}, + {1994, {wxTreebook, getPage, 1}}, + {1995, {wxTreebook, getPageCount, 0}}, + {1996, {wxTreebook, getPageImage, 1}}, + {1997, {wxTreebook, getPageText, 1}}, + {1998, {wxTreebook, getSelection, 0}}, + {1999, {wxTreebook, expandNode, 2}}, + {2000, {wxTreebook, isNodeExpanded, 1}}, + {2002, {wxTreebook, hitTest, 2}}, + {2003, {wxTreebook, insertPage, 4}}, + {2004, {wxTreebook, insertSubPage, 4}}, + {2005, {wxTreebook, setImageList, 1}}, + {2006, {wxTreebook, setPageSize, 1}}, + {2007, {wxTreebook, setPageImage, 2}}, + {2008, {wxTreebook, setPageText, 2}}, + {2009, {wxTreebook, setSelection, 1}}, + {2010, {wxTreebook, changeSelection, 1}}, + {2011, {wxTreebook, 'Destroy', undefined}}, + {2014, {wxTreeCtrl, new_2, 2}}, + {2015, {wxTreeCtrl, new_0, 0}}, + {2017, {wxTreeCtrl, destruct, 0}}, + {2018, {wxTreeCtrl, addRoot, 2}}, + {2019, {wxTreeCtrl, appendItem, 3}}, + {2020, {wxTreeCtrl, assignImageList, 1}}, + {2021, {wxTreeCtrl, assignStateImageList, 1}}, + {2022, {wxTreeCtrl, collapse, 1}}, + {2023, {wxTreeCtrl, collapseAndReset, 1}}, + {2024, {wxTreeCtrl, create, 2}}, + {2025, {wxTreeCtrl, delete, 1}}, + {2026, {wxTreeCtrl, deleteAllItems, 0}}, + {2027, {wxTreeCtrl, deleteChildren, 1}}, + {2028, {wxTreeCtrl, editLabel, 1}}, + {2029, {wxTreeCtrl, ensureVisible, 1}}, + {2030, {wxTreeCtrl, expand, 1}}, + {2031, {wxTreeCtrl, getBoundingRect, 3}}, + {2033, {wxTreeCtrl, getChildrenCount, 2}}, + {2034, {wxTreeCtrl, getCount, 0}}, + {2035, {wxTreeCtrl, getEditControl, 0}}, + {2036, {wxTreeCtrl, getFirstChild, 2}}, + {2037, {wxTreeCtrl, getNextChild, 2}}, + {2038, {wxTreeCtrl, getFirstVisibleItem, 0}}, + {2039, {wxTreeCtrl, getImageList, 0}}, + {2040, {wxTreeCtrl, getIndent, 0}}, + {2041, {wxTreeCtrl, getItemBackgroundColour, 1}}, + {2042, {wxTreeCtrl, getItemData, 1}}, + {2043, {wxTreeCtrl, getItemFont, 1}}, + {2044, {wxTreeCtrl, getItemImage_1, 1}}, + {2045, {wxTreeCtrl, getItemImage_2, 2}}, + {2046, {wxTreeCtrl, getItemText, 1}}, + {2047, {wxTreeCtrl, getItemTextColour, 1}}, + {2048, {wxTreeCtrl, getLastChild, 1}}, + {2049, {wxTreeCtrl, getNextSibling, 1}}, + {2050, {wxTreeCtrl, getNextVisible, 1}}, + {2051, {wxTreeCtrl, getItemParent, 1}}, + {2052, {wxTreeCtrl, getPrevSibling, 1}}, + {2053, {wxTreeCtrl, getPrevVisible, 1}}, + {2054, {wxTreeCtrl, getRootItem, 0}}, + {2055, {wxTreeCtrl, getSelection, 0}}, + {2056, {wxTreeCtrl, getSelections, 1}}, + {2057, {wxTreeCtrl, getStateImageList, 0}}, + {2058, {wxTreeCtrl, hitTest, 2}}, + {2060, {wxTreeCtrl, insertItem, 4}}, + {2061, {wxTreeCtrl, isBold, 1}}, + {2062, {wxTreeCtrl, isExpanded, 1}}, + {2063, {wxTreeCtrl, isSelected, 1}}, + {2064, {wxTreeCtrl, isVisible, 1}}, + {2065, {wxTreeCtrl, itemHasChildren, 1}}, + {2066, {wxTreeCtrl, isTreeItemIdOk, 1}}, + {2067, {wxTreeCtrl, prependItem, 3}}, + {2068, {wxTreeCtrl, scrollTo, 1}}, + {2069, {wxTreeCtrl, selectItem_1, 1}}, + {2070, {wxTreeCtrl, selectItem_2, 2}}, + {2071, {wxTreeCtrl, setIndent, 1}}, + {2072, {wxTreeCtrl, setImageList, 1}}, + {2073, {wxTreeCtrl, setItemBackgroundColour, 2}}, + {2074, {wxTreeCtrl, setItemBold, 2}}, + {2075, {wxTreeCtrl, setItemData, 2}}, + {2076, {wxTreeCtrl, setItemDropHighlight, 2}}, + {2077, {wxTreeCtrl, setItemFont, 2}}, + {2078, {wxTreeCtrl, setItemHasChildren, 2}}, + {2079, {wxTreeCtrl, setItemImage_2, 2}}, + {2080, {wxTreeCtrl, setItemImage_3, 3}}, + {2081, {wxTreeCtrl, setItemText, 2}}, + {2082, {wxTreeCtrl, setItemTextColour, 2}}, + {2083, {wxTreeCtrl, setStateImageList, 1}}, + {2084, {wxTreeCtrl, setWindowStyle, 1}}, + {2085, {wxTreeCtrl, sortChildren, 1}}, + {2086, {wxTreeCtrl, toggle, 1}}, + {2087, {wxTreeCtrl, toggleItemSelection, 1}}, + {2088, {wxTreeCtrl, unselect, 0}}, + {2089, {wxTreeCtrl, unselectAll, 0}}, + {2090, {wxTreeCtrl, unselectItem, 1}}, + {2091, {wxScrollBar, new_0, 0}}, + {2092, {wxScrollBar, new_3, 3}}, + {2093, {wxScrollBar, destruct, 0}}, + {2094, {wxScrollBar, create, 3}}, + {2095, {wxScrollBar, getRange, 0}}, + {2096, {wxScrollBar, getPageSize, 0}}, + {2097, {wxScrollBar, getThumbPosition, 0}}, + {2098, {wxScrollBar, getThumbSize, 0}}, + {2099, {wxScrollBar, setThumbPosition, 1}}, + {2100, {wxScrollBar, setScrollbar, 5}}, + {2102, {wxSpinButton, new_2, 2}}, + {2103, {wxSpinButton, new_0, 0}}, + {2104, {wxSpinButton, create, 2}}, + {2105, {wxSpinButton, getMax, 0}}, + {2106, {wxSpinButton, getMin, 0}}, + {2107, {wxSpinButton, getValue, 0}}, + {2108, {wxSpinButton, setRange, 2}}, + {2109, {wxSpinButton, setValue, 1}}, + {2110, {wxSpinButton, 'Destroy', undefined}}, + {2111, {wxSpinCtrl, new_0, 0}}, + {2112, {wxSpinCtrl, new_2, 2}}, + {2114, {wxSpinCtrl, create, 2}}, + {2117, {wxSpinCtrl, setValue_1_1, 1}}, + {2118, {wxSpinCtrl, setValue_1_0, 1}}, + {2120, {wxSpinCtrl, getValue, 0}}, + {2122, {wxSpinCtrl, setRange, 2}}, + {2123, {wxSpinCtrl, setSelection, 2}}, + {2125, {wxSpinCtrl, getMin, 0}}, + {2127, {wxSpinCtrl, getMax, 0}}, + {2128, {wxSpinCtrl, 'Destroy', undefined}}, + {2129, {wxStaticText, new_0, 0}}, + {2130, {wxStaticText, new_4, 4}}, + {2131, {wxStaticText, create, 4}}, + {2132, {wxStaticText, getLabel, 0}}, + {2133, {wxStaticText, setLabel, 1}}, + {2134, {wxStaticText, wrap, 1}}, + {2135, {wxStaticText, 'Destroy', undefined}}, + {2136, {wxStaticBitmap, new_0, 0}}, + {2137, {wxStaticBitmap, new_4, 4}}, + {2138, {wxStaticBitmap, create, 4}}, + {2139, {wxStaticBitmap, getBitmap, 0}}, + {2140, {wxStaticBitmap, setBitmap, 1}}, + {2141, {wxStaticBitmap, 'Destroy', undefined}}, + {2142, {wxRadioBox, new, 7}}, + {2144, {wxRadioBox, destruct, 0}}, + {2145, {wxRadioBox, create, 7}}, + {2146, {wxRadioBox, enable_2, 2}}, + {2147, {wxRadioBox, enable_1, 1}}, + {2148, {wxRadioBox, getSelection, 0}}, + {2149, {wxRadioBox, getString, 1}}, + {2150, {wxRadioBox, setSelection, 1}}, + {2151, {wxRadioBox, show_2, 2}}, + {2152, {wxRadioBox, show_1, 1}}, + {2153, {wxRadioBox, getColumnCount, 0}}, + {2154, {wxRadioBox, getItemHelpText, 1}}, + {2155, {wxRadioBox, getItemToolTip, 1}}, + {2157, {wxRadioBox, getItemFromPoint, 1}}, + {2158, {wxRadioBox, getRowCount, 0}}, + {2159, {wxRadioBox, isItemEnabled, 1}}, + {2160, {wxRadioBox, isItemShown, 1}}, + {2161, {wxRadioBox, setItemHelpText, 2}}, + {2162, {wxRadioBox, setItemToolTip, 2}}, + {2163, {wxRadioButton, new_0, 0}}, + {2164, {wxRadioButton, new_4, 4}}, + {2165, {wxRadioButton, create, 4}}, + {2166, {wxRadioButton, getValue, 0}}, + {2167, {wxRadioButton, setValue, 1}}, + {2168, {wxRadioButton, 'Destroy', undefined}}, + {2170, {wxSlider, new_6, 6}}, + {2171, {wxSlider, new_0, 0}}, + {2172, {wxSlider, create, 6}}, + {2173, {wxSlider, getLineSize, 0}}, + {2174, {wxSlider, getMax, 0}}, + {2175, {wxSlider, getMin, 0}}, + {2176, {wxSlider, getPageSize, 0}}, + {2177, {wxSlider, getThumbLength, 0}}, + {2178, {wxSlider, getValue, 0}}, + {2179, {wxSlider, setLineSize, 1}}, + {2180, {wxSlider, setPageSize, 1}}, + {2181, {wxSlider, setRange, 2}}, + {2182, {wxSlider, setThumbLength, 1}}, + {2183, {wxSlider, setValue, 1}}, + {2184, {wxSlider, 'Destroy', undefined}}, + {2186, {wxDialog, new_4, 4}}, + {2187, {wxDialog, new_0, 0}}, + {2189, {wxDialog, destruct, 0}}, + {2190, {wxDialog, create, 4}}, + {2191, {wxDialog, createButtonSizer, 1}}, + {2192, {wxDialog, createStdDialogButtonSizer, 1}}, + {2193, {wxDialog, endModal, 1}}, + {2194, {wxDialog, getAffirmativeId, 0}}, + {2195, {wxDialog, getReturnCode, 0}}, + {2196, {wxDialog, isModal, 0}}, + {2197, {wxDialog, setAffirmativeId, 1}}, + {2198, {wxDialog, setReturnCode, 1}}, + {2199, {wxDialog, show, 1}}, + {2200, {wxDialog, showModal, 0}}, + {2201, {wxColourDialog, new_0, 0}}, + {2202, {wxColourDialog, new_2, 2}}, + {2203, {wxColourDialog, destruct, 0}}, + {2204, {wxColourDialog, create, 2}}, + {2205, {wxColourDialog, getColourData, 0}}, + {2206, {wxColourData, new_0, 0}}, + {2207, {wxColourData, new_1, 1}}, + {2208, {wxColourData, destruct, 0}}, + {2209, {wxColourData, getChooseFull, 0}}, + {2210, {wxColourData, getColour, 0}}, + {2212, {wxColourData, getCustomColour, 1}}, + {2213, {wxColourData, setChooseFull, 1}}, + {2214, {wxColourData, setColour, 1}}, + {2215, {wxColourData, setCustomColour, 2}}, + {2216, {wxPalette, new_0, 0}}, + {2217, {wxPalette, new_4, 4}}, + {2219, {wxPalette, destruct, 0}}, + {2220, {wxPalette, create, 4}}, + {2221, {wxPalette, getColoursCount, 0}}, + {2222, {wxPalette, getPixel, 3}}, + {2223, {wxPalette, getRGB, 4}}, + {2224, {wxPalette, isOk, 0}}, + {2228, {wxDirDialog, new, 2}}, + {2229, {wxDirDialog, destruct, 0}}, + {2230, {wxDirDialog, getPath, 0}}, + {2231, {wxDirDialog, getMessage, 0}}, + {2232, {wxDirDialog, setMessage, 1}}, + {2233, {wxDirDialog, setPath, 1}}, + {2237, {wxFileDialog, new, 2}}, + {2238, {wxFileDialog, destruct, 0}}, + {2239, {wxFileDialog, getDirectory, 0}}, + {2240, {wxFileDialog, getFilename, 0}}, + {2241, {wxFileDialog, getFilenames, 1}}, + {2242, {wxFileDialog, getFilterIndex, 0}}, + {2243, {wxFileDialog, getMessage, 0}}, + {2244, {wxFileDialog, getPath, 0}}, + {2245, {wxFileDialog, getPaths, 1}}, + {2246, {wxFileDialog, getWildcard, 0}}, + {2247, {wxFileDialog, setDirectory, 1}}, + {2248, {wxFileDialog, setFilename, 1}}, + {2249, {wxFileDialog, setFilterIndex, 1}}, + {2250, {wxFileDialog, setMessage, 1}}, + {2251, {wxFileDialog, setPath, 1}}, + {2252, {wxFileDialog, setWildcard, 1}}, + {2253, {wxPickerBase, setInternalMargin, 1}}, + {2254, {wxPickerBase, getInternalMargin, 0}}, + {2255, {wxPickerBase, setTextCtrlProportion, 1}}, + {2256, {wxPickerBase, setPickerCtrlProportion, 1}}, + {2257, {wxPickerBase, getTextCtrlProportion, 0}}, + {2258, {wxPickerBase, getPickerCtrlProportion, 0}}, + {2259, {wxPickerBase, hasTextCtrl, 0}}, + {2260, {wxPickerBase, getTextCtrl, 0}}, + {2261, {wxPickerBase, isTextCtrlGrowable, 0}}, + {2262, {wxPickerBase, setPickerCtrlGrowable, 1}}, + {2263, {wxPickerBase, setTextCtrlGrowable, 1}}, + {2264, {wxPickerBase, isPickerCtrlGrowable, 0}}, + {2265, {wxFilePickerCtrl, new_0, 0}}, + {2266, {wxFilePickerCtrl, new_3, 3}}, + {2267, {wxFilePickerCtrl, create, 3}}, + {2268, {wxFilePickerCtrl, getPath, 0}}, + {2269, {wxFilePickerCtrl, setPath, 1}}, + {2270, {wxFilePickerCtrl, 'Destroy', undefined}}, + {2271, {wxDirPickerCtrl, new_0, 0}}, + {2272, {wxDirPickerCtrl, new_3, 3}}, + {2273, {wxDirPickerCtrl, create, 3}}, + {2274, {wxDirPickerCtrl, getPath, 0}}, + {2275, {wxDirPickerCtrl, setPath, 1}}, + {2276, {wxDirPickerCtrl, 'Destroy', undefined}}, + {2277, {wxColourPickerCtrl, new_0, 0}}, + {2278, {wxColourPickerCtrl, new_3, 3}}, + {2279, {wxColourPickerCtrl, create, 3}}, + {2280, {wxColourPickerCtrl, getColour, 0}}, + {2281, {wxColourPickerCtrl, setColour_1_1, 1}}, + {2282, {wxColourPickerCtrl, setColour_1_0, 1}}, + {2283, {wxColourPickerCtrl, 'Destroy', undefined}}, + {2284, {wxDatePickerCtrl, new_0, 0}}, + {2285, {wxDatePickerCtrl, new_3, 3}}, + {2286, {wxDatePickerCtrl, getRange, 2}}, + {2287, {wxDatePickerCtrl, getValue, 0}}, + {2288, {wxDatePickerCtrl, setRange, 2}}, + {2289, {wxDatePickerCtrl, setValue, 1}}, + {2290, {wxDatePickerCtrl, 'Destroy', undefined}}, + {2291, {wxFontPickerCtrl, new_0, 0}}, + {2292, {wxFontPickerCtrl, new_3, 3}}, + {2293, {wxFontPickerCtrl, create, 3}}, + {2294, {wxFontPickerCtrl, getSelectedFont, 0}}, + {2295, {wxFontPickerCtrl, setSelectedFont, 1}}, + {2296, {wxFontPickerCtrl, getMaxPointSize, 0}}, + {2297, {wxFontPickerCtrl, setMaxPointSize, 1}}, + {2298, {wxFontPickerCtrl, 'Destroy', undefined}}, + {2301, {wxFindReplaceDialog, new_0, 0}}, + {2302, {wxFindReplaceDialog, new_4, 4}}, + {2303, {wxFindReplaceDialog, destruct, 0}}, + {2304, {wxFindReplaceDialog, create, 4}}, + {2305, {wxFindReplaceDialog, getData, 0}}, + {2306, {wxFindReplaceData, new_0, 0}}, + {2307, {wxFindReplaceData, new_1, 1}}, + {2308, {wxFindReplaceData, getFindString, 0}}, + {2309, {wxFindReplaceData, getReplaceString, 0}}, + {2310, {wxFindReplaceData, getFlags, 0}}, + {2311, {wxFindReplaceData, setFlags, 1}}, + {2312, {wxFindReplaceData, setFindString, 1}}, + {2313, {wxFindReplaceData, setReplaceString, 1}}, + {2314, {wxFindReplaceData, 'Destroy', undefined}}, + {2315, {wxMultiChoiceDialog, new_0, 0}}, + {2317, {wxMultiChoiceDialog, new_5, 5}}, + {2318, {wxMultiChoiceDialog, getSelections, 0}}, + {2319, {wxMultiChoiceDialog, setSelections, 1}}, + {2320, {wxMultiChoiceDialog, 'Destroy', undefined}}, + {2321, {wxSingleChoiceDialog, new_0, 0}}, + {2323, {wxSingleChoiceDialog, new_5, 5}}, + {2324, {wxSingleChoiceDialog, getSelection, 0}}, + {2325, {wxSingleChoiceDialog, getStringSelection, 0}}, + {2326, {wxSingleChoiceDialog, setSelection, 1}}, + {2327, {wxSingleChoiceDialog, 'Destroy', undefined}}, + {2328, {wxTextEntryDialog, new, 3}}, + {2329, {wxTextEntryDialog, getValue, 0}}, + {2330, {wxTextEntryDialog, setValue, 1}}, + {2331, {wxTextEntryDialog, 'Destroy', undefined}}, + {2332, {wxPasswordEntryDialog, new, 3}}, + {2333, {wxPasswordEntryDialog, 'Destroy', undefined}}, + {2334, {wxFontData, new_0, 0}}, + {2335, {wxFontData, new_1, 1}}, + {2336, {wxFontData, destruct, 0}}, + {2337, {wxFontData, enableEffects, 1}}, + {2338, {wxFontData, getAllowSymbols, 0}}, + {2339, {wxFontData, getColour, 0}}, + {2340, {wxFontData, getChosenFont, 0}}, + {2341, {wxFontData, getEnableEffects, 0}}, + {2342, {wxFontData, getInitialFont, 0}}, + {2343, {wxFontData, getShowHelp, 0}}, + {2344, {wxFontData, setAllowSymbols, 1}}, + {2345, {wxFontData, setChosenFont, 1}}, + {2346, {wxFontData, setColour, 1}}, + {2347, {wxFontData, setInitialFont, 1}}, + {2348, {wxFontData, setRange, 2}}, + {2349, {wxFontData, setShowHelp, 1}}, + {2353, {wxFontDialog, new_0, 0}}, + {2355, {wxFontDialog, new_2, 2}}, + {2357, {wxFontDialog, create, 2}}, + {2358, {wxFontDialog, getFontData, 0}}, + {2360, {wxFontDialog, 'Destroy', undefined}}, + {2361, {wxProgressDialog, new, 3}}, + {2362, {wxProgressDialog, destruct, 0}}, + {2363, {wxProgressDialog, resume, 0}}, + {2364, {wxProgressDialog, update_2, 2}}, + {2365, {wxProgressDialog, update_0, 0}}, + {2366, {wxMessageDialog, new, 3}}, + {2367, {wxMessageDialog, destruct, 0}}, + {2368, {wxPageSetupDialog, new, 2}}, + {2369, {wxPageSetupDialog, destruct, 0}}, + {2370, {wxPageSetupDialog, getPageSetupData, 0}}, + {2371, {wxPageSetupDialog, showModal, 0}}, + {2372, {wxPageSetupDialogData, new_0, 0}}, + {2373, {wxPageSetupDialogData, new_1_0, 1}}, + {2374, {wxPageSetupDialogData, new_1_1, 1}}, + {2375, {wxPageSetupDialogData, destruct, 0}}, + {2376, {wxPageSetupDialogData, enableHelp, 1}}, + {2377, {wxPageSetupDialogData, enableMargins, 1}}, + {2378, {wxPageSetupDialogData, enableOrientation, 1}}, + {2379, {wxPageSetupDialogData, enablePaper, 1}}, + {2380, {wxPageSetupDialogData, enablePrinter, 1}}, + {2381, {wxPageSetupDialogData, getDefaultMinMargins, 0}}, + {2382, {wxPageSetupDialogData, getEnableMargins, 0}}, + {2383, {wxPageSetupDialogData, getEnableOrientation, 0}}, + {2384, {wxPageSetupDialogData, getEnablePaper, 0}}, + {2385, {wxPageSetupDialogData, getEnablePrinter, 0}}, + {2386, {wxPageSetupDialogData, getEnableHelp, 0}}, + {2387, {wxPageSetupDialogData, getDefaultInfo, 0}}, + {2388, {wxPageSetupDialogData, getMarginTopLeft, 0}}, + {2389, {wxPageSetupDialogData, getMarginBottomRight, 0}}, + {2390, {wxPageSetupDialogData, getMinMarginTopLeft, 0}}, + {2391, {wxPageSetupDialogData, getMinMarginBottomRight, 0}}, + {2392, {wxPageSetupDialogData, getPaperId, 0}}, + {2393, {wxPageSetupDialogData, getPaperSize, 0}}, + {2395, {wxPageSetupDialogData, getPrintData, 0}}, + {2396, {wxPageSetupDialogData, isOk, 0}}, + {2397, {wxPageSetupDialogData, setDefaultInfo, 1}}, + {2398, {wxPageSetupDialogData, setDefaultMinMargins, 1}}, + {2399, {wxPageSetupDialogData, setMarginTopLeft, 1}}, + {2400, {wxPageSetupDialogData, setMarginBottomRight, 1}}, + {2401, {wxPageSetupDialogData, setMinMarginTopLeft, 1}}, + {2402, {wxPageSetupDialogData, setMinMarginBottomRight, 1}}, + {2403, {wxPageSetupDialogData, setPaperId, 1}}, + {2404, {wxPageSetupDialogData, setPaperSize_1_1, 1}}, + {2405, {wxPageSetupDialogData, setPaperSize_1_0, 1}}, + {2406, {wxPageSetupDialogData, setPrintData, 1}}, + {2407, {wxPrintDialog, new_2_0, 2}}, + {2408, {wxPrintDialog, new_2_1, 2}}, + {2409, {wxPrintDialog, destruct, 0}}, + {2410, {wxPrintDialog, getPrintDialogData, 0}}, + {2411, {wxPrintDialog, getPrintDC, 0}}, + {2412, {wxPrintDialogData, new_0, 0}}, + {2413, {wxPrintDialogData, new_1_1, 1}}, + {2414, {wxPrintDialogData, new_1_0, 1}}, + {2415, {wxPrintDialogData, destruct, 0}}, + {2416, {wxPrintDialogData, enableHelp, 1}}, + {2417, {wxPrintDialogData, enablePageNumbers, 1}}, + {2418, {wxPrintDialogData, enablePrintToFile, 1}}, + {2419, {wxPrintDialogData, enableSelection, 1}}, + {2420, {wxPrintDialogData, getAllPages, 0}}, + {2421, {wxPrintDialogData, getCollate, 0}}, + {2422, {wxPrintDialogData, getFromPage, 0}}, + {2423, {wxPrintDialogData, getMaxPage, 0}}, + {2424, {wxPrintDialogData, getMinPage, 0}}, + {2425, {wxPrintDialogData, getNoCopies, 0}}, + {2426, {wxPrintDialogData, getPrintData, 0}}, + {2427, {wxPrintDialogData, getPrintToFile, 0}}, + {2428, {wxPrintDialogData, getSelection, 0}}, + {2429, {wxPrintDialogData, getToPage, 0}}, + {2430, {wxPrintDialogData, isOk, 0}}, + {2431, {wxPrintDialogData, setCollate, 1}}, + {2432, {wxPrintDialogData, setFromPage, 1}}, + {2433, {wxPrintDialogData, setMaxPage, 1}}, + {2434, {wxPrintDialogData, setMinPage, 1}}, + {2435, {wxPrintDialogData, setNoCopies, 1}}, + {2436, {wxPrintDialogData, setPrintData, 1}}, + {2437, {wxPrintDialogData, setPrintToFile, 1}}, + {2438, {wxPrintDialogData, setSelection, 1}}, + {2439, {wxPrintDialogData, setToPage, 1}}, + {2440, {wxPrintData, new_0, 0}}, + {2441, {wxPrintData, new_1, 1}}, + {2442, {wxPrintData, destruct, 0}}, + {2443, {wxPrintData, getCollate, 0}}, + {2444, {wxPrintData, getBin, 0}}, + {2445, {wxPrintData, getColour, 0}}, + {2446, {wxPrintData, getDuplex, 0}}, + {2447, {wxPrintData, getNoCopies, 0}}, + {2448, {wxPrintData, getOrientation, 0}}, + {2449, {wxPrintData, getPaperId, 0}}, + {2450, {wxPrintData, getPrinterName, 0}}, + {2451, {wxPrintData, getQuality, 0}}, + {2452, {wxPrintData, isOk, 0}}, + {2453, {wxPrintData, setBin, 1}}, + {2454, {wxPrintData, setCollate, 1}}, + {2455, {wxPrintData, setColour, 1}}, + {2456, {wxPrintData, setDuplex, 1}}, + {2457, {wxPrintData, setNoCopies, 1}}, + {2458, {wxPrintData, setOrientation, 1}}, + {2459, {wxPrintData, setPaperId, 1}}, + {2460, {wxPrintData, setPrinterName, 1}}, + {2461, {wxPrintData, setQuality, 1}}, + {2464, {wxPrintPreview, new_2, 2}}, + {2465, {wxPrintPreview, new_3, 3}}, + {2467, {wxPrintPreview, destruct, 0}}, + {2468, {wxPrintPreview, getCanvas, 0}}, + {2469, {wxPrintPreview, getCurrentPage, 0}}, + {2470, {wxPrintPreview, getFrame, 0}}, + {2471, {wxPrintPreview, getMaxPage, 0}}, + {2472, {wxPrintPreview, getMinPage, 0}}, + {2473, {wxPrintPreview, getPrintout, 0}}, + {2474, {wxPrintPreview, getPrintoutForPrinting, 0}}, + {2475, {wxPrintPreview, isOk, 0}}, + {2476, {wxPrintPreview, paintPage, 2}}, + {2477, {wxPrintPreview, print, 1}}, + {2478, {wxPrintPreview, renderPage, 1}}, + {2479, {wxPrintPreview, setCanvas, 1}}, + {2480, {wxPrintPreview, setCurrentPage, 1}}, + {2481, {wxPrintPreview, setFrame, 1}}, + {2482, {wxPrintPreview, setPrintout, 1}}, + {2483, {wxPrintPreview, setZoom, 1}}, + {2484, {wxPreviewFrame, new, 3}}, + {2485, {wxPreviewFrame, destruct, 0}}, + {2486, {wxPreviewFrame, createControlBar, 0}}, + {2487, {wxPreviewFrame, createCanvas, 0}}, + {2488, {wxPreviewFrame, initialize, 0}}, + {2489, {wxPreviewFrame, onCloseWindow, 1}}, + {2490, {wxPreviewControlBar, new, 4}}, + {2491, {wxPreviewControlBar, destruct, 0}}, + {2492, {wxPreviewControlBar, createButtons, 0}}, + {2493, {wxPreviewControlBar, getPrintPreview, 0}}, + {2494, {wxPreviewControlBar, getZoomControl, 0}}, + {2495, {wxPreviewControlBar, setZoomControl, 1}}, + {2497, {wxPrinter, new, 1}}, + {2498, {wxPrinter, createAbortWindow, 2}}, + {2499, {wxPrinter, getAbort, 0}}, + {2500, {wxPrinter, getLastError, 0}}, + {2501, {wxPrinter, getPrintDialogData, 0}}, + {2502, {wxPrinter, print, 3}}, + {2503, {wxPrinter, printDialog, 1}}, + {2504, {wxPrinter, reportError, 3}}, + {2505, {wxPrinter, setup, 1}}, + {2506, {wxPrinter, 'Destroy', undefined}}, + {2507, {wxXmlResource, new_1, 1}}, + {2508, {wxXmlResource, new_2, 2}}, + {2509, {wxXmlResource, destruct, 0}}, + {2510, {wxXmlResource, attachUnknownControl, 3}}, + {2511, {wxXmlResource, clearHandlers, 0}}, + {2512, {wxXmlResource, compareVersion, 4}}, + {2513, {wxXmlResource, get, 0}}, + {2514, {wxXmlResource, getFlags, 0}}, + {2515, {wxXmlResource, getVersion, 0}}, + {2516, {wxXmlResource, getXRCID, 2}}, + {2517, {wxXmlResource, initAllHandlers, 0}}, + {2518, {wxXmlResource, load, 1}}, + {2519, {wxXmlResource, loadBitmap, 1}}, + {2520, {wxXmlResource, loadDialog_2, 2}}, + {2521, {wxXmlResource, loadDialog_3, 3}}, + {2522, {wxXmlResource, loadFrame_2, 2}}, + {2523, {wxXmlResource, loadFrame_3, 3}}, + {2524, {wxXmlResource, loadIcon, 1}}, + {2525, {wxXmlResource, loadMenu, 1}}, + {2526, {wxXmlResource, loadMenuBar_2, 2}}, + {2527, {wxXmlResource, loadMenuBar_1, 1}}, + {2528, {wxXmlResource, loadPanel_2, 2}}, + {2529, {wxXmlResource, loadPanel_3, 3}}, + {2530, {wxXmlResource, loadToolBar, 2}}, + {2531, {wxXmlResource, set, 1}}, + {2532, {wxXmlResource, setFlags, 1}}, + {2533, {wxXmlResource, unload, 1}}, + {2534, {wxXmlResource, xrcctrl, 3}}, + {2535, {wxHtmlEasyPrinting, new, 1}}, + {2536, {wxHtmlEasyPrinting, destruct, 0}}, + {2537, {wxHtmlEasyPrinting, getPrintData, 0}}, + {2538, {wxHtmlEasyPrinting, getPageSetupData, 0}}, + {2539, {wxHtmlEasyPrinting, previewFile, 1}}, + {2540, {wxHtmlEasyPrinting, previewText, 2}}, + {2541, {wxHtmlEasyPrinting, printFile, 1}}, + {2542, {wxHtmlEasyPrinting, printText, 2}}, + {2543, {wxHtmlEasyPrinting, pageSetup, 0}}, + {2544, {wxHtmlEasyPrinting, setFonts, 3}}, + {2545, {wxHtmlEasyPrinting, setHeader, 2}}, + {2546, {wxHtmlEasyPrinting, setFooter, 2}}, + {2548, {wxGLCanvas, new_2, 2}}, + {2549, {wxGLCanvas, new_3_1, 3}}, + {2550, {wxGLCanvas, new_3_0, 3}}, + {2551, {wxGLCanvas, getContext, 0}}, + {2553, {wxGLCanvas, setCurrent, 0}}, + {2554, {wxGLCanvas, swapBuffers, 0}}, + {2555, {wxGLCanvas, 'Destroy', undefined}}, + {2556, {wxAuiManager, new, 1}}, + {2557, {wxAuiManager, destruct, 0}}, + {2558, {wxAuiManager, addPane_2_1, 2}}, + {2559, {wxAuiManager, addPane_3, 3}}, + {2560, {wxAuiManager, addPane_2_0, 2}}, + {2561, {wxAuiManager, detachPane, 1}}, + {2562, {wxAuiManager, getAllPanes, 0}}, + {2563, {wxAuiManager, getArtProvider, 0}}, + {2564, {wxAuiManager, getDockSizeConstraint, 2}}, + {2565, {wxAuiManager, getFlags, 0}}, + {2566, {wxAuiManager, getManagedWindow, 0}}, + {2567, {wxAuiManager, getManager, 1}}, + {2568, {wxAuiManager, getPane_1_1, 1}}, + {2569, {wxAuiManager, getPane_1_0, 1}}, + {2570, {wxAuiManager, hideHint, 0}}, + {2571, {wxAuiManager, insertPane, 3}}, + {2572, {wxAuiManager, loadPaneInfo, 2}}, + {2573, {wxAuiManager, loadPerspective, 2}}, + {2574, {wxAuiManager, savePaneInfo, 1}}, + {2575, {wxAuiManager, savePerspective, 0}}, + {2576, {wxAuiManager, setArtProvider, 1}}, + {2577, {wxAuiManager, setDockSizeConstraint, 2}}, + {2578, {wxAuiManager, setFlags, 1}}, + {2579, {wxAuiManager, setManagedWindow, 1}}, + {2580, {wxAuiManager, showHint, 1}}, + {2581, {wxAuiManager, unInit, 0}}, + {2582, {wxAuiManager, update, 0}}, + {2583, {wxAuiPaneInfo, new_0, 0}}, + {2584, {wxAuiPaneInfo, new_1, 1}}, + {2585, {wxAuiPaneInfo, destruct, 0}}, + {2586, {wxAuiPaneInfo, bestSize_1, 1}}, + {2587, {wxAuiPaneInfo, bestSize_2, 2}}, + {2588, {wxAuiPaneInfo, bottom, 0}}, + {2589, {wxAuiPaneInfo, bottomDockable, 1}}, + {2590, {wxAuiPaneInfo, caption, 1}}, + {2591, {wxAuiPaneInfo, captionVisible, 1}}, + {2592, {wxAuiPaneInfo, centre, 0}}, + {2593, {wxAuiPaneInfo, centrePane, 0}}, + {2594, {wxAuiPaneInfo, closeButton, 1}}, + {2595, {wxAuiPaneInfo, defaultPane, 0}}, + {2596, {wxAuiPaneInfo, destroyOnClose, 1}}, + {2597, {wxAuiPaneInfo, direction, 1}}, + {2598, {wxAuiPaneInfo, dock, 0}}, + {2599, {wxAuiPaneInfo, dockable, 1}}, + {2600, {wxAuiPaneInfo, fixed, 0}}, + {2601, {wxAuiPaneInfo, float, 0}}, + {2602, {wxAuiPaneInfo, floatable, 1}}, + {2603, {wxAuiPaneInfo, floatingPosition_1, 1}}, + {2604, {wxAuiPaneInfo, floatingPosition_2, 2}}, + {2605, {wxAuiPaneInfo, floatingSize_1, 1}}, + {2606, {wxAuiPaneInfo, floatingSize_2, 2}}, + {2607, {wxAuiPaneInfo, gripper, 1}}, + {2608, {wxAuiPaneInfo, gripperTop, 1}}, + {2609, {wxAuiPaneInfo, hasBorder, 0}}, + {2610, {wxAuiPaneInfo, hasCaption, 0}}, + {2611, {wxAuiPaneInfo, hasCloseButton, 0}}, + {2612, {wxAuiPaneInfo, hasFlag, 1}}, + {2613, {wxAuiPaneInfo, hasGripper, 0}}, + {2614, {wxAuiPaneInfo, hasGripperTop, 0}}, + {2615, {wxAuiPaneInfo, hasMaximizeButton, 0}}, + {2616, {wxAuiPaneInfo, hasMinimizeButton, 0}}, + {2617, {wxAuiPaneInfo, hasPinButton, 0}}, + {2618, {wxAuiPaneInfo, hide, 0}}, + {2619, {wxAuiPaneInfo, isBottomDockable, 0}}, + {2620, {wxAuiPaneInfo, isDocked, 0}}, + {2621, {wxAuiPaneInfo, isFixed, 0}}, + {2622, {wxAuiPaneInfo, isFloatable, 0}}, + {2623, {wxAuiPaneInfo, isFloating, 0}}, + {2624, {wxAuiPaneInfo, isLeftDockable, 0}}, + {2625, {wxAuiPaneInfo, isMovable, 0}}, + {2626, {wxAuiPaneInfo, isOk, 0}}, + {2627, {wxAuiPaneInfo, isResizable, 0}}, + {2628, {wxAuiPaneInfo, isRightDockable, 0}}, + {2629, {wxAuiPaneInfo, isShown, 0}}, + {2630, {wxAuiPaneInfo, isToolbar, 0}}, + {2631, {wxAuiPaneInfo, isTopDockable, 0}}, + {2632, {wxAuiPaneInfo, layer, 1}}, + {2633, {wxAuiPaneInfo, left, 0}}, + {2634, {wxAuiPaneInfo, leftDockable, 1}}, + {2635, {wxAuiPaneInfo, maxSize_1, 1}}, + {2636, {wxAuiPaneInfo, maxSize_2, 2}}, + {2637, {wxAuiPaneInfo, maximizeButton, 1}}, + {2638, {wxAuiPaneInfo, minSize_1, 1}}, + {2639, {wxAuiPaneInfo, minSize_2, 2}}, + {2640, {wxAuiPaneInfo, minimizeButton, 1}}, + {2641, {wxAuiPaneInfo, movable, 1}}, + {2642, {wxAuiPaneInfo, name, 1}}, + {2643, {wxAuiPaneInfo, paneBorder, 1}}, + {2644, {wxAuiPaneInfo, pinButton, 1}}, + {2645, {wxAuiPaneInfo, position, 1}}, + {2646, {wxAuiPaneInfo, resizable, 1}}, + {2647, {wxAuiPaneInfo, right, 0}}, + {2648, {wxAuiPaneInfo, rightDockable, 1}}, + {2649, {wxAuiPaneInfo, row, 1}}, + {2650, {wxAuiPaneInfo, safeSet, 1}}, + {2651, {wxAuiPaneInfo, setFlag, 2}}, + {2652, {wxAuiPaneInfo, show, 1}}, + {2653, {wxAuiPaneInfo, toolbarPane, 0}}, + {2654, {wxAuiPaneInfo, top, 0}}, + {2655, {wxAuiPaneInfo, topDockable, 1}}, + {2656, {wxAuiPaneInfo, window, 1}}, + {2657, {wxAuiPaneInfo, getWindow, 0}}, + {2658, {wxAuiPaneInfo, getFrame, 0}}, + {2659, {wxAuiPaneInfo, getDirection, 0}}, + {2660, {wxAuiPaneInfo, getLayer, 0}}, + {2661, {wxAuiPaneInfo, getRow, 0}}, + {2662, {wxAuiPaneInfo, getPosition, 0}}, + {2663, {wxAuiPaneInfo, getFloatingPosition, 0}}, + {2664, {wxAuiPaneInfo, getFloatingSize, 0}}, + {2665, {wxAuiNotebook, new_0, 0}}, + {2666, {wxAuiNotebook, new_2, 2}}, + {2667, {wxAuiNotebook, addPage, 3}}, + {2668, {wxAuiNotebook, create, 2}}, + {2669, {wxAuiNotebook, deletePage, 1}}, + {2670, {wxAuiNotebook, getArtProvider, 0}}, + {2671, {wxAuiNotebook, getPage, 1}}, + {2672, {wxAuiNotebook, getPageBitmap, 1}}, + {2673, {wxAuiNotebook, getPageCount, 0}}, + {2674, {wxAuiNotebook, getPageIndex, 1}}, + {2675, {wxAuiNotebook, getPageText, 1}}, + {2676, {wxAuiNotebook, getSelection, 0}}, + {2677, {wxAuiNotebook, insertPage, 4}}, + {2678, {wxAuiNotebook, removePage, 1}}, + {2679, {wxAuiNotebook, setArtProvider, 1}}, + {2680, {wxAuiNotebook, setFont, 1}}, + {2681, {wxAuiNotebook, setPageBitmap, 2}}, + {2682, {wxAuiNotebook, setPageText, 2}}, + {2683, {wxAuiNotebook, setSelection, 1}}, + {2684, {wxAuiNotebook, setTabCtrlHeight, 1}}, + {2685, {wxAuiNotebook, setUniformBitmapSize, 1}}, + {2686, {wxAuiNotebook, 'Destroy', undefined}}, + {2687, {wxAuiTabArt, setFlags, 1}}, + {2688, {wxAuiTabArt, setMeasuringFont, 1}}, + {2689, {wxAuiTabArt, setNormalFont, 1}}, + {2690, {wxAuiTabArt, setSelectedFont, 1}}, + {2691, {wxAuiTabArt, setColour, 1}}, + {2692, {wxAuiTabArt, setActiveColour, 1}}, + {2693, {wxAuiDockArt, getColour, 1}}, + {2694, {wxAuiDockArt, getFont, 1}}, + {2695, {wxAuiDockArt, getMetric, 1}}, + {2696, {wxAuiDockArt, setColour, 2}}, + {2697, {wxAuiDockArt, setFont, 2}}, + {2698, {wxAuiDockArt, setMetric, 2}}, + {2699, {wxAuiSimpleTabArt, new, 0}}, + {2700, {wxAuiSimpleTabArt, 'Destroy', undefined}}, + {2701, {wxMDIParentFrame, new_0, 0}}, + {2702, {wxMDIParentFrame, new_4, 4}}, + {2703, {wxMDIParentFrame, destruct, 0}}, + {2704, {wxMDIParentFrame, activateNext, 0}}, + {2705, {wxMDIParentFrame, activatePrevious, 0}}, + {2706, {wxMDIParentFrame, arrangeIcons, 0}}, + {2707, {wxMDIParentFrame, cascade, 0}}, + {2708, {wxMDIParentFrame, create, 4}}, + {2709, {wxMDIParentFrame, getActiveChild, 0}}, + {2710, {wxMDIParentFrame, getClientWindow, 0}}, + {2711, {wxMDIParentFrame, tile, 1}}, + {2712, {wxMDIChildFrame, new_0, 0}}, + {2713, {wxMDIChildFrame, new_4, 4}}, + {2714, {wxMDIChildFrame, destruct, 0}}, + {2715, {wxMDIChildFrame, activate, 0}}, + {2716, {wxMDIChildFrame, create, 4}}, + {2717, {wxMDIChildFrame, maximize, 1}}, + {2718, {wxMDIChildFrame, restore, 0}}, + {2719, {wxMDIClientWindow, new_0, 0}}, + {2720, {wxMDIClientWindow, new_2, 2}}, + {2721, {wxMDIClientWindow, destruct, 0}}, + {2722, {wxMDIClientWindow, createClient, 2}}, + {2723, {wxLayoutAlgorithm, new, 0}}, + {2724, {wxLayoutAlgorithm, layoutFrame, 2}}, + {2725, {wxLayoutAlgorithm, layoutMDIFrame, 2}}, + {2726, {wxLayoutAlgorithm, layoutWindow, 2}}, + {2727, {wxLayoutAlgorithm, 'Destroy', undefined}}, + {2728, {wxEvent, getId, 0}}, + {2729, {wxEvent, getSkipped, 0}}, + {2730, {wxEvent, getTimestamp, 0}}, + {2731, {wxEvent, isCommandEvent, 0}}, + {2732, {wxEvent, resumePropagation, 1}}, + {2733, {wxEvent, shouldPropagate, 0}}, + {2734, {wxEvent, skip, 1}}, + {2735, {wxEvent, stopPropagation, 0}}, + {2736, {wxCommandEvent, getClientData, 0}}, + {2737, {wxCommandEvent, getExtraLong, 0}}, + {2738, {wxCommandEvent, getInt, 0}}, + {2739, {wxCommandEvent, getSelection, 0}}, + {2740, {wxCommandEvent, getString, 0}}, + {2741, {wxCommandEvent, isChecked, 0}}, + {2742, {wxCommandEvent, isSelection, 0}}, + {2743, {wxCommandEvent, setInt, 1}}, + {2744, {wxCommandEvent, setString, 1}}, + {2745, {wxScrollEvent, getOrientation, 0}}, + {2746, {wxScrollEvent, getPosition, 0}}, + {2747, {wxScrollWinEvent, getOrientation, 0}}, + {2748, {wxScrollWinEvent, getPosition, 0}}, + {2749, {wxMouseEvent, altDown, 0}}, + {2750, {wxMouseEvent, button, 1}}, + {2751, {wxMouseEvent, buttonDClick, 1}}, + {2752, {wxMouseEvent, buttonDown, 1}}, + {2753, {wxMouseEvent, buttonUp, 1}}, + {2754, {wxMouseEvent, cmdDown, 0}}, + {2755, {wxMouseEvent, controlDown, 0}}, + {2756, {wxMouseEvent, dragging, 0}}, + {2757, {wxMouseEvent, entering, 0}}, + {2758, {wxMouseEvent, getButton, 0}}, + {2761, {wxMouseEvent, getPosition, 0}}, + {2762, {wxMouseEvent, getLogicalPosition, 1}}, + {2763, {wxMouseEvent, getLinesPerAction, 0}}, + {2764, {wxMouseEvent, getWheelRotation, 0}}, + {2765, {wxMouseEvent, getWheelDelta, 0}}, + {2766, {wxMouseEvent, getX, 0}}, + {2767, {wxMouseEvent, getY, 0}}, + {2768, {wxMouseEvent, isButton, 0}}, + {2769, {wxMouseEvent, isPageScroll, 0}}, + {2770, {wxMouseEvent, leaving, 0}}, + {2771, {wxMouseEvent, leftDClick, 0}}, + {2772, {wxMouseEvent, leftDown, 0}}, + {2773, {wxMouseEvent, leftIsDown, 0}}, + {2774, {wxMouseEvent, leftUp, 0}}, + {2775, {wxMouseEvent, metaDown, 0}}, + {2776, {wxMouseEvent, middleDClick, 0}}, + {2777, {wxMouseEvent, middleDown, 0}}, + {2778, {wxMouseEvent, middleIsDown, 0}}, + {2779, {wxMouseEvent, middleUp, 0}}, + {2780, {wxMouseEvent, moving, 0}}, + {2781, {wxMouseEvent, rightDClick, 0}}, + {2782, {wxMouseEvent, rightDown, 0}}, + {2783, {wxMouseEvent, rightIsDown, 0}}, + {2784, {wxMouseEvent, rightUp, 0}}, + {2785, {wxMouseEvent, shiftDown, 0}}, + {2786, {wxSetCursorEvent, getCursor, 0}}, + {2787, {wxSetCursorEvent, getX, 0}}, + {2788, {wxSetCursorEvent, getY, 0}}, + {2789, {wxSetCursorEvent, hasCursor, 0}}, + {2790, {wxSetCursorEvent, setCursor, 1}}, + {2791, {wxKeyEvent, altDown, 0}}, + {2792, {wxKeyEvent, cmdDown, 0}}, + {2793, {wxKeyEvent, controlDown, 0}}, + {2794, {wxKeyEvent, getKeyCode, 0}}, + {2795, {wxKeyEvent, getModifiers, 0}}, + {2798, {wxKeyEvent, getPosition, 0}}, + {2799, {wxKeyEvent, getRawKeyCode, 0}}, + {2800, {wxKeyEvent, getRawKeyFlags, 0}}, + {2801, {wxKeyEvent, getUnicodeKey, 0}}, + {2802, {wxKeyEvent, getX, 0}}, + {2803, {wxKeyEvent, getY, 0}}, + {2804, {wxKeyEvent, hasModifiers, 0}}, + {2805, {wxKeyEvent, metaDown, 0}}, + {2806, {wxKeyEvent, shiftDown, 0}}, + {2807, {wxSizeEvent, getSize, 0}}, + {2808, {wxMoveEvent, getPosition, 0}}, + {2809, {wxEraseEvent, getDC, 0}}, + {2810, {wxFocusEvent, getWindow, 0}}, + {2811, {wxChildFocusEvent, getWindow, 0}}, + {2812, {wxMenuEvent, getMenu, 0}}, + {2813, {wxMenuEvent, getMenuId, 0}}, + {2814, {wxMenuEvent, isPopup, 0}}, + {2815, {wxCloseEvent, canVeto, 0}}, + {2816, {wxCloseEvent, getLoggingOff, 0}}, + {2817, {wxCloseEvent, setCanVeto, 1}}, + {2818, {wxCloseEvent, setLoggingOff, 1}}, + {2819, {wxCloseEvent, veto, 1}}, + {2820, {wxShowEvent, setShow, 1}}, + {2821, {wxShowEvent, getShow, 0}}, + {2822, {wxIconizeEvent, iconized, 0}}, + {2823, {wxJoystickEvent, buttonDown, 1}}, + {2824, {wxJoystickEvent, buttonIsDown, 1}}, + {2825, {wxJoystickEvent, buttonUp, 1}}, + {2826, {wxJoystickEvent, getButtonChange, 0}}, + {2827, {wxJoystickEvent, getButtonState, 0}}, + {2828, {wxJoystickEvent, getJoystick, 0}}, + {2829, {wxJoystickEvent, getPosition, 0}}, + {2830, {wxJoystickEvent, getZPosition, 0}}, + {2831, {wxJoystickEvent, isButton, 0}}, + {2832, {wxJoystickEvent, isMove, 0}}, + {2833, {wxJoystickEvent, isZMove, 0}}, + {2834, {wxUpdateUIEvent, canUpdate, 1}}, + {2835, {wxUpdateUIEvent, check, 1}}, + {2836, {wxUpdateUIEvent, enable, 1}}, + {2837, {wxUpdateUIEvent, show, 1}}, + {2838, {wxUpdateUIEvent, getChecked, 0}}, + {2839, {wxUpdateUIEvent, getEnabled, 0}}, + {2840, {wxUpdateUIEvent, getShown, 0}}, + {2841, {wxUpdateUIEvent, getSetChecked, 0}}, + {2842, {wxUpdateUIEvent, getSetEnabled, 0}}, + {2843, {wxUpdateUIEvent, getSetShown, 0}}, + {2844, {wxUpdateUIEvent, getSetText, 0}}, + {2845, {wxUpdateUIEvent, getText, 0}}, + {2846, {wxUpdateUIEvent, getMode, 0}}, + {2847, {wxUpdateUIEvent, getUpdateInterval, 0}}, + {2848, {wxUpdateUIEvent, resetUpdateTime, 0}}, + {2849, {wxUpdateUIEvent, setMode, 1}}, + {2850, {wxUpdateUIEvent, setText, 1}}, + {2851, {wxUpdateUIEvent, setUpdateInterval, 1}}, + {2852, {wxMouseCaptureChangedEvent, getCapturedWindow, 0}}, + {2853, {wxPaletteChangedEvent, setChangedWindow, 1}}, + {2854, {wxPaletteChangedEvent, getChangedWindow, 0}}, + {2855, {wxQueryNewPaletteEvent, setPaletteRealized, 1}}, + {2856, {wxQueryNewPaletteEvent, getPaletteRealized, 0}}, + {2857, {wxNavigationKeyEvent, getDirection, 0}}, + {2858, {wxNavigationKeyEvent, setDirection, 1}}, + {2859, {wxNavigationKeyEvent, isWindowChange, 0}}, + {2860, {wxNavigationKeyEvent, setWindowChange, 1}}, + {2861, {wxNavigationKeyEvent, isFromTab, 0}}, + {2862, {wxNavigationKeyEvent, setFromTab, 1}}, + {2863, {wxNavigationKeyEvent, getCurrentFocus, 0}}, + {2864, {wxNavigationKeyEvent, setCurrentFocus, 1}}, + {2865, {wxHelpEvent, getOrigin, 0}}, + {2866, {wxHelpEvent, getPosition, 0}}, + {2867, {wxHelpEvent, setOrigin, 1}}, + {2868, {wxHelpEvent, setPosition, 1}}, + {2869, {wxContextMenuEvent, getPosition, 0}}, + {2870, {wxContextMenuEvent, setPosition, 1}}, + {2871, {wxIdleEvent, canSend, 1}}, + {2872, {wxIdleEvent, getMode, 0}}, + {2873, {wxIdleEvent, requestMore, 1}}, + {2874, {wxIdleEvent, moreRequested, 0}}, + {2875, {wxIdleEvent, setMode, 1}}, + {2876, {wxGridEvent, altDown, 0}}, + {2877, {wxGridEvent, controlDown, 0}}, + {2878, {wxGridEvent, getCol, 0}}, + {2879, {wxGridEvent, getPosition, 0}}, + {2880, {wxGridEvent, getRow, 0}}, + {2881, {wxGridEvent, metaDown, 0}}, + {2882, {wxGridEvent, selecting, 0}}, + {2883, {wxGridEvent, shiftDown, 0}}, + {2884, {wxNotifyEvent, allow, 0}}, + {2885, {wxNotifyEvent, isAllowed, 0}}, + {2886, {wxNotifyEvent, veto, 0}}, + {2887, {wxSashEvent, getEdge, 0}}, + {2888, {wxSashEvent, getDragRect, 0}}, + {2889, {wxSashEvent, getDragStatus, 0}}, + {2890, {wxListEvent, getCacheFrom, 0}}, + {2891, {wxListEvent, getCacheTo, 0}}, + {2892, {wxListEvent, getKeyCode, 0}}, + {2893, {wxListEvent, getIndex, 0}}, + {2894, {wxListEvent, getColumn, 0}}, + {2895, {wxListEvent, getPoint, 0}}, + {2896, {wxListEvent, getLabel, 0}}, + {2897, {wxListEvent, getText, 0}}, + {2898, {wxListEvent, getImage, 0}}, + {2899, {wxListEvent, getData, 0}}, + {2900, {wxListEvent, getMask, 0}}, + {2901, {wxListEvent, getItem, 0}}, + {2902, {wxListEvent, isEditCancelled, 0}}, + {2903, {wxDateEvent, getDate, 0}}, + {2904, {wxCalendarEvent, getWeekDay, 0}}, + {2905, {wxFileDirPickerEvent, getPath, 0}}, + {2906, {wxColourPickerEvent, getColour, 0}}, + {2907, {wxFontPickerEvent, getFont, 0}}, + {2908, {wxStyledTextEvent, getPosition, 0}}, + {2909, {wxStyledTextEvent, getKey, 0}}, + {2910, {wxStyledTextEvent, getModifiers, 0}}, + {2911, {wxStyledTextEvent, getModificationType, 0}}, + {2912, {wxStyledTextEvent, getText, 0}}, + {2913, {wxStyledTextEvent, getLength, 0}}, + {2914, {wxStyledTextEvent, getLinesAdded, 0}}, + {2915, {wxStyledTextEvent, getLine, 0}}, + {2916, {wxStyledTextEvent, getFoldLevelNow, 0}}, + {2917, {wxStyledTextEvent, getFoldLevelPrev, 0}}, + {2918, {wxStyledTextEvent, getMargin, 0}}, + {2919, {wxStyledTextEvent, getMessage, 0}}, + {2920, {wxStyledTextEvent, getWParam, 0}}, + {2921, {wxStyledTextEvent, getLParam, 0}}, + {2922, {wxStyledTextEvent, getListType, 0}}, + {2923, {wxStyledTextEvent, getX, 0}}, + {2924, {wxStyledTextEvent, getY, 0}}, + {2925, {wxStyledTextEvent, getDragText, 0}}, + {2926, {wxStyledTextEvent, getDragAllowMove, 0}}, + {2927, {wxStyledTextEvent, getDragResult, 0}}, + {2928, {wxStyledTextEvent, getShift, 0}}, + {2929, {wxStyledTextEvent, getControl, 0}}, + {2930, {wxStyledTextEvent, getAlt, 0}}, + {2931, {utils, getKeyState, 1}}, + {2932, {utils, getMousePosition, 2}}, + {2933, {utils, getMouseState, 0}}, + {2934, {utils, setDetectableAutoRepeat, 1}}, + {2935, {utils, bell, 0}}, + {2936, {utils, findMenuItemId, 3}}, + {2937, {utils, genericFindWindowAtPoint, 1}}, + {2938, {utils, findWindowAtPoint, 1}}, + {2939, {utils, beginBusyCursor, 1}}, + {2940, {utils, endBusyCursor, 0}}, + {2941, {utils, isBusy, 0}}, + {2942, {utils, shutdown, 1}}, + {2943, {utils, shell, 1}}, + {2944, {utils, launchDefaultBrowser, 2}}, + {2945, {utils, getEmailAddress, 0}}, + {2946, {utils, getUserId, 0}}, + {2947, {utils, getHomeDir, 0}}, + {2948, {utils, newId, 0}}, + {2949, {utils, registerId, 1}}, + {2950, {utils, getCurrentId, 0}}, + {2951, {utils, getOsDescription, 0}}, + {2952, {utils, isPlatformLittleEndian, 0}}, + {2953, {utils, isPlatform64Bit, 0}}, + {2954, {gdicmn, displaySize, 2}}, + {2955, {gdicmn, setCursor, 1}}, + {2956, {wxPrintout, new, 1}}, + {2957, {wxPrintout, destruct, 0}}, + {2958, {wxPrintout, getDC, 0}}, + {2959, {wxPrintout, getPageSizeMM, 2}}, + {2960, {wxPrintout, getPageSizePixels, 2}}, + {2961, {wxPrintout, getPaperRectPixels, 0}}, + {2962, {wxPrintout, getPPIPrinter, 2}}, + {2963, {wxPrintout, getPPIScreen, 2}}, + {2964, {wxPrintout, getTitle, 0}}, + {2965, {wxPrintout, isPreview, 0}}, + {2966, {wxPrintout, fitThisSizeToPaper, 1}}, + {2967, {wxPrintout, fitThisSizeToPage, 1}}, + {2968, {wxPrintout, fitThisSizeToPageMargins, 2}}, + {2969, {wxPrintout, mapScreenSizeToPaper, 0}}, + {2970, {wxPrintout, mapScreenSizeToPage, 0}}, + {2971, {wxPrintout, mapScreenSizeToPageMargins, 1}}, + {2972, {wxPrintout, mapScreenSizeToDevice, 0}}, + {2973, {wxPrintout, getLogicalPaperRect, 0}}, + {2974, {wxPrintout, getLogicalPageRect, 0}}, + {2975, {wxPrintout, getLogicalPageMarginsRect, 1}}, + {2976, {wxPrintout, setLogicalOrigin, 2}}, + {2977, {wxPrintout, offsetLogicalOrigin, 2}}, + {2978, {wxStyledTextCtrl, new_2, 2}}, + {2979, {wxStyledTextCtrl, new_0, 0}}, + {2980, {wxStyledTextCtrl, destruct, 0}}, + {2981, {wxStyledTextCtrl, create, 2}}, + {2982, {wxStyledTextCtrl, addText, 1}}, + {2983, {wxStyledTextCtrl, addStyledText, 1}}, + {2984, {wxStyledTextCtrl, insertText, 2}}, + {2985, {wxStyledTextCtrl, clearAll, 0}}, + {2986, {wxStyledTextCtrl, clearDocumentStyle, 0}}, + {2987, {wxStyledTextCtrl, getLength, 0}}, + {2988, {wxStyledTextCtrl, getCharAt, 1}}, + {2989, {wxStyledTextCtrl, getCurrentPos, 0}}, + {2990, {wxStyledTextCtrl, getAnchor, 0}}, + {2991, {wxStyledTextCtrl, getStyleAt, 1}}, + {2992, {wxStyledTextCtrl, redo, 0}}, + {2993, {wxStyledTextCtrl, setUndoCollection, 1}}, + {2994, {wxStyledTextCtrl, selectAll, 0}}, + {2995, {wxStyledTextCtrl, setSavePoint, 0}}, + {2996, {wxStyledTextCtrl, getStyledText, 2}}, + {2997, {wxStyledTextCtrl, canRedo, 0}}, + {2998, {wxStyledTextCtrl, markerLineFromHandle, 1}}, + {2999, {wxStyledTextCtrl, markerDeleteHandle, 1}}, + {3000, {wxStyledTextCtrl, getUndoCollection, 0}}, + {3001, {wxStyledTextCtrl, getViewWhiteSpace, 0}}, + {3002, {wxStyledTextCtrl, setViewWhiteSpace, 1}}, + {3003, {wxStyledTextCtrl, positionFromPoint, 1}}, + {3004, {wxStyledTextCtrl, positionFromPointClose, 2}}, + {3005, {wxStyledTextCtrl, gotoLine, 1}}, + {3006, {wxStyledTextCtrl, gotoPos, 1}}, + {3007, {wxStyledTextCtrl, setAnchor, 1}}, + {3008, {wxStyledTextCtrl, getCurLine, 1}}, + {3009, {wxStyledTextCtrl, getEndStyled, 0}}, + {3010, {wxStyledTextCtrl, convertEOLs, 1}}, + {3011, {wxStyledTextCtrl, getEOLMode, 0}}, + {3012, {wxStyledTextCtrl, setEOLMode, 1}}, + {3013, {wxStyledTextCtrl, startStyling, 2}}, + {3014, {wxStyledTextCtrl, setStyling, 2}}, + {3015, {wxStyledTextCtrl, getBufferedDraw, 0}}, + {3016, {wxStyledTextCtrl, setBufferedDraw, 1}}, + {3017, {wxStyledTextCtrl, setTabWidth, 1}}, + {3018, {wxStyledTextCtrl, getTabWidth, 0}}, + {3019, {wxStyledTextCtrl, setCodePage, 1}}, + {3020, {wxStyledTextCtrl, markerDefine, 3}}, + {3021, {wxStyledTextCtrl, markerSetForeground, 2}}, + {3022, {wxStyledTextCtrl, markerSetBackground, 2}}, + {3023, {wxStyledTextCtrl, markerAdd, 2}}, + {3024, {wxStyledTextCtrl, markerDelete, 2}}, + {3025, {wxStyledTextCtrl, markerDeleteAll, 1}}, + {3026, {wxStyledTextCtrl, markerGet, 1}}, + {3027, {wxStyledTextCtrl, markerNext, 2}}, + {3028, {wxStyledTextCtrl, markerPrevious, 2}}, + {3029, {wxStyledTextCtrl, markerDefineBitmap, 2}}, + {3030, {wxStyledTextCtrl, markerAddSet, 2}}, + {3031, {wxStyledTextCtrl, markerSetAlpha, 2}}, + {3032, {wxStyledTextCtrl, setMarginType, 2}}, + {3033, {wxStyledTextCtrl, getMarginType, 1}}, + {3034, {wxStyledTextCtrl, setMarginWidth, 2}}, + {3035, {wxStyledTextCtrl, getMarginWidth, 1}}, + {3036, {wxStyledTextCtrl, setMarginMask, 2}}, + {3037, {wxStyledTextCtrl, getMarginMask, 1}}, + {3038, {wxStyledTextCtrl, setMarginSensitive, 2}}, + {3039, {wxStyledTextCtrl, getMarginSensitive, 1}}, + {3040, {wxStyledTextCtrl, styleClearAll, 0}}, + {3041, {wxStyledTextCtrl, styleSetForeground, 2}}, + {3042, {wxStyledTextCtrl, styleSetBackground, 2}}, + {3043, {wxStyledTextCtrl, styleSetBold, 2}}, + {3044, {wxStyledTextCtrl, styleSetItalic, 2}}, + {3045, {wxStyledTextCtrl, styleSetSize, 2}}, + {3046, {wxStyledTextCtrl, styleSetFaceName, 2}}, + {3047, {wxStyledTextCtrl, styleSetEOLFilled, 2}}, + {3048, {wxStyledTextCtrl, styleResetDefault, 0}}, + {3049, {wxStyledTextCtrl, styleSetUnderline, 2}}, + {3050, {wxStyledTextCtrl, styleSetCase, 2}}, + {3051, {wxStyledTextCtrl, styleSetHotSpot, 2}}, + {3052, {wxStyledTextCtrl, setSelForeground, 2}}, + {3053, {wxStyledTextCtrl, setSelBackground, 2}}, + {3054, {wxStyledTextCtrl, getSelAlpha, 0}}, + {3055, {wxStyledTextCtrl, setSelAlpha, 1}}, + {3056, {wxStyledTextCtrl, setCaretForeground, 1}}, + {3057, {wxStyledTextCtrl, cmdKeyAssign, 3}}, + {3058, {wxStyledTextCtrl, cmdKeyClear, 2}}, + {3059, {wxStyledTextCtrl, cmdKeyClearAll, 0}}, + {3060, {wxStyledTextCtrl, setStyleBytes, 2}}, + {3061, {wxStyledTextCtrl, styleSetVisible, 2}}, + {3062, {wxStyledTextCtrl, getCaretPeriod, 0}}, + {3063, {wxStyledTextCtrl, setCaretPeriod, 1}}, + {3064, {wxStyledTextCtrl, setWordChars, 1}}, + {3065, {wxStyledTextCtrl, beginUndoAction, 0}}, + {3066, {wxStyledTextCtrl, endUndoAction, 0}}, + {3067, {wxStyledTextCtrl, indicatorSetStyle, 2}}, + {3068, {wxStyledTextCtrl, indicatorGetStyle, 1}}, + {3069, {wxStyledTextCtrl, indicatorSetForeground, 2}}, + {3070, {wxStyledTextCtrl, indicatorGetForeground, 1}}, + {3071, {wxStyledTextCtrl, setWhitespaceForeground, 2}}, + {3072, {wxStyledTextCtrl, setWhitespaceBackground, 2}}, + {3073, {wxStyledTextCtrl, getStyleBits, 0}}, + {3074, {wxStyledTextCtrl, setLineState, 2}}, + {3075, {wxStyledTextCtrl, getLineState, 1}}, + {3076, {wxStyledTextCtrl, getMaxLineState, 0}}, + {3077, {wxStyledTextCtrl, getCaretLineVisible, 0}}, + {3078, {wxStyledTextCtrl, setCaretLineVisible, 1}}, + {3079, {wxStyledTextCtrl, getCaretLineBackground, 0}}, + {3080, {wxStyledTextCtrl, setCaretLineBackground, 1}}, + {3081, {wxStyledTextCtrl, autoCompShow, 2}}, + {3082, {wxStyledTextCtrl, autoCompCancel, 0}}, + {3083, {wxStyledTextCtrl, autoCompActive, 0}}, + {3084, {wxStyledTextCtrl, autoCompPosStart, 0}}, + {3085, {wxStyledTextCtrl, autoCompComplete, 0}}, + {3086, {wxStyledTextCtrl, autoCompStops, 1}}, + {3087, {wxStyledTextCtrl, autoCompSetSeparator, 1}}, + {3088, {wxStyledTextCtrl, autoCompGetSeparator, 0}}, + {3089, {wxStyledTextCtrl, autoCompSelect, 1}}, + {3090, {wxStyledTextCtrl, autoCompSetCancelAtStart, 1}}, + {3091, {wxStyledTextCtrl, autoCompGetCancelAtStart, 0}}, + {3092, {wxStyledTextCtrl, autoCompSetFillUps, 1}}, + {3093, {wxStyledTextCtrl, autoCompSetChooseSingle, 1}}, + {3094, {wxStyledTextCtrl, autoCompGetChooseSingle, 0}}, + {3095, {wxStyledTextCtrl, autoCompSetIgnoreCase, 1}}, + {3096, {wxStyledTextCtrl, autoCompGetIgnoreCase, 0}}, + {3097, {wxStyledTextCtrl, userListShow, 2}}, + {3098, {wxStyledTextCtrl, autoCompSetAutoHide, 1}}, + {3099, {wxStyledTextCtrl, autoCompGetAutoHide, 0}}, + {3100, {wxStyledTextCtrl, autoCompSetDropRestOfWord, 1}}, + {3101, {wxStyledTextCtrl, autoCompGetDropRestOfWord, 0}}, + {3102, {wxStyledTextCtrl, registerImage, 2}}, + {3103, {wxStyledTextCtrl, clearRegisteredImages, 0}}, + {3104, {wxStyledTextCtrl, autoCompGetTypeSeparator, 0}}, + {3105, {wxStyledTextCtrl, autoCompSetTypeSeparator, 1}}, + {3106, {wxStyledTextCtrl, autoCompSetMaxWidth, 1}}, + {3107, {wxStyledTextCtrl, autoCompGetMaxWidth, 0}}, + {3108, {wxStyledTextCtrl, autoCompSetMaxHeight, 1}}, + {3109, {wxStyledTextCtrl, autoCompGetMaxHeight, 0}}, + {3110, {wxStyledTextCtrl, setIndent, 1}}, + {3111, {wxStyledTextCtrl, getIndent, 0}}, + {3112, {wxStyledTextCtrl, setUseTabs, 1}}, + {3113, {wxStyledTextCtrl, getUseTabs, 0}}, + {3114, {wxStyledTextCtrl, setLineIndentation, 2}}, + {3115, {wxStyledTextCtrl, getLineIndentation, 1}}, + {3116, {wxStyledTextCtrl, getLineIndentPosition, 1}}, + {3117, {wxStyledTextCtrl, getColumn, 1}}, + {3118, {wxStyledTextCtrl, setUseHorizontalScrollBar, 1}}, + {3119, {wxStyledTextCtrl, getUseHorizontalScrollBar, 0}}, + {3120, {wxStyledTextCtrl, setIndentationGuides, 1}}, + {3121, {wxStyledTextCtrl, getIndentationGuides, 0}}, + {3122, {wxStyledTextCtrl, setHighlightGuide, 1}}, + {3123, {wxStyledTextCtrl, getHighlightGuide, 0}}, + {3124, {wxStyledTextCtrl, getLineEndPosition, 1}}, + {3125, {wxStyledTextCtrl, getCodePage, 0}}, + {3126, {wxStyledTextCtrl, getCaretForeground, 0}}, + {3127, {wxStyledTextCtrl, getReadOnly, 0}}, + {3128, {wxStyledTextCtrl, setCurrentPos, 1}}, + {3129, {wxStyledTextCtrl, setSelectionStart, 1}}, + {3130, {wxStyledTextCtrl, getSelectionStart, 0}}, + {3131, {wxStyledTextCtrl, setSelectionEnd, 1}}, + {3132, {wxStyledTextCtrl, getSelectionEnd, 0}}, + {3133, {wxStyledTextCtrl, setPrintMagnification, 1}}, + {3134, {wxStyledTextCtrl, getPrintMagnification, 0}}, + {3135, {wxStyledTextCtrl, setPrintColourMode, 1}}, + {3136, {wxStyledTextCtrl, getPrintColourMode, 0}}, + {3137, {wxStyledTextCtrl, findText, 4}}, + {3138, {wxStyledTextCtrl, formatRange, 7}}, + {3139, {wxStyledTextCtrl, getFirstVisibleLine, 0}}, + {3140, {wxStyledTextCtrl, getLine, 1}}, + {3141, {wxStyledTextCtrl, getLineCount, 0}}, + {3142, {wxStyledTextCtrl, setMarginLeft, 1}}, + {3143, {wxStyledTextCtrl, getMarginLeft, 0}}, + {3144, {wxStyledTextCtrl, setMarginRight, 1}}, + {3145, {wxStyledTextCtrl, getMarginRight, 0}}, + {3146, {wxStyledTextCtrl, getModify, 0}}, + {3147, {wxStyledTextCtrl, setSelection, 2}}, + {3148, {wxStyledTextCtrl, getSelectedText, 0}}, + {3149, {wxStyledTextCtrl, getTextRange, 2}}, + {3150, {wxStyledTextCtrl, hideSelection, 1}}, + {3151, {wxStyledTextCtrl, lineFromPosition, 1}}, + {3152, {wxStyledTextCtrl, positionFromLine, 1}}, + {3153, {wxStyledTextCtrl, lineScroll, 2}}, + {3154, {wxStyledTextCtrl, ensureCaretVisible, 0}}, + {3155, {wxStyledTextCtrl, replaceSelection, 1}}, + {3156, {wxStyledTextCtrl, setReadOnly, 1}}, + {3157, {wxStyledTextCtrl, canPaste, 0}}, + {3158, {wxStyledTextCtrl, canUndo, 0}}, + {3159, {wxStyledTextCtrl, emptyUndoBuffer, 0}}, + {3160, {wxStyledTextCtrl, undo, 0}}, + {3161, {wxStyledTextCtrl, cut, 0}}, + {3162, {wxStyledTextCtrl, copy, 0}}, + {3163, {wxStyledTextCtrl, paste, 0}}, + {3164, {wxStyledTextCtrl, clear, 0}}, + {3165, {wxStyledTextCtrl, setText, 1}}, + {3166, {wxStyledTextCtrl, getText, 0}}, + {3167, {wxStyledTextCtrl, getTextLength, 0}}, + {3168, {wxStyledTextCtrl, getOvertype, 0}}, + {3169, {wxStyledTextCtrl, setCaretWidth, 1}}, + {3170, {wxStyledTextCtrl, getCaretWidth, 0}}, + {3171, {wxStyledTextCtrl, setTargetStart, 1}}, + {3172, {wxStyledTextCtrl, getTargetStart, 0}}, + {3173, {wxStyledTextCtrl, setTargetEnd, 1}}, + {3174, {wxStyledTextCtrl, getTargetEnd, 0}}, + {3175, {wxStyledTextCtrl, replaceTarget, 1}}, + {3176, {wxStyledTextCtrl, searchInTarget, 1}}, + {3177, {wxStyledTextCtrl, setSearchFlags, 1}}, + {3178, {wxStyledTextCtrl, getSearchFlags, 0}}, + {3179, {wxStyledTextCtrl, callTipShow, 2}}, + {3180, {wxStyledTextCtrl, callTipCancel, 0}}, + {3181, {wxStyledTextCtrl, callTipActive, 0}}, + {3182, {wxStyledTextCtrl, callTipPosAtStart, 0}}, + {3183, {wxStyledTextCtrl, callTipSetHighlight, 2}}, + {3184, {wxStyledTextCtrl, callTipSetBackground, 1}}, + {3185, {wxStyledTextCtrl, callTipSetForeground, 1}}, + {3186, {wxStyledTextCtrl, callTipSetForegroundHighlight, 1}}, + {3187, {wxStyledTextCtrl, callTipUseStyle, 1}}, + {3188, {wxStyledTextCtrl, visibleFromDocLine, 1}}, + {3189, {wxStyledTextCtrl, docLineFromVisible, 1}}, + {3190, {wxStyledTextCtrl, wrapCount, 1}}, + {3191, {wxStyledTextCtrl, setFoldLevel, 2}}, + {3192, {wxStyledTextCtrl, getFoldLevel, 1}}, + {3193, {wxStyledTextCtrl, getLastChild, 2}}, + {3194, {wxStyledTextCtrl, getFoldParent, 1}}, + {3195, {wxStyledTextCtrl, showLines, 2}}, + {3196, {wxStyledTextCtrl, hideLines, 2}}, + {3197, {wxStyledTextCtrl, getLineVisible, 1}}, + {3198, {wxStyledTextCtrl, setFoldExpanded, 2}}, + {3199, {wxStyledTextCtrl, getFoldExpanded, 1}}, + {3200, {wxStyledTextCtrl, toggleFold, 1}}, + {3201, {wxStyledTextCtrl, ensureVisible, 1}}, + {3202, {wxStyledTextCtrl, setFoldFlags, 1}}, + {3203, {wxStyledTextCtrl, ensureVisibleEnforcePolicy, 1}}, + {3204, {wxStyledTextCtrl, setTabIndents, 1}}, + {3205, {wxStyledTextCtrl, getTabIndents, 0}}, + {3206, {wxStyledTextCtrl, setBackSpaceUnIndents, 1}}, + {3207, {wxStyledTextCtrl, getBackSpaceUnIndents, 0}}, + {3208, {wxStyledTextCtrl, setMouseDwellTime, 1}}, + {3209, {wxStyledTextCtrl, getMouseDwellTime, 0}}, + {3210, {wxStyledTextCtrl, wordStartPosition, 2}}, + {3211, {wxStyledTextCtrl, wordEndPosition, 2}}, + {3212, {wxStyledTextCtrl, setWrapMode, 1}}, + {3213, {wxStyledTextCtrl, getWrapMode, 0}}, + {3214, {wxStyledTextCtrl, setWrapVisualFlags, 1}}, + {3215, {wxStyledTextCtrl, getWrapVisualFlags, 0}}, + {3216, {wxStyledTextCtrl, setWrapVisualFlagsLocation, 1}}, + {3217, {wxStyledTextCtrl, getWrapVisualFlagsLocation, 0}}, + {3218, {wxStyledTextCtrl, setWrapStartIndent, 1}}, + {3219, {wxStyledTextCtrl, getWrapStartIndent, 0}}, + {3220, {wxStyledTextCtrl, setLayoutCache, 1}}, + {3221, {wxStyledTextCtrl, getLayoutCache, 0}}, + {3222, {wxStyledTextCtrl, setScrollWidth, 1}}, + {3223, {wxStyledTextCtrl, getScrollWidth, 0}}, + {3224, {wxStyledTextCtrl, textWidth, 2}}, + {3225, {wxStyledTextCtrl, getEndAtLastLine, 0}}, + {3226, {wxStyledTextCtrl, textHeight, 1}}, + {3227, {wxStyledTextCtrl, setUseVerticalScrollBar, 1}}, + {3228, {wxStyledTextCtrl, getUseVerticalScrollBar, 0}}, + {3229, {wxStyledTextCtrl, appendText, 1}}, + {3230, {wxStyledTextCtrl, getTwoPhaseDraw, 0}}, + {3231, {wxStyledTextCtrl, setTwoPhaseDraw, 1}}, + {3232, {wxStyledTextCtrl, targetFromSelection, 0}}, + {3233, {wxStyledTextCtrl, linesJoin, 0}}, + {3234, {wxStyledTextCtrl, linesSplit, 1}}, + {3235, {wxStyledTextCtrl, setFoldMarginColour, 2}}, + {3236, {wxStyledTextCtrl, setFoldMarginHiColour, 2}}, + {3237, {wxStyledTextCtrl, lineDown, 0}}, + {3238, {wxStyledTextCtrl, lineDownExtend, 0}}, + {3239, {wxStyledTextCtrl, lineUp, 0}}, + {3240, {wxStyledTextCtrl, lineUpExtend, 0}}, + {3241, {wxStyledTextCtrl, charLeft, 0}}, + {3242, {wxStyledTextCtrl, charLeftExtend, 0}}, + {3243, {wxStyledTextCtrl, charRight, 0}}, + {3244, {wxStyledTextCtrl, charRightExtend, 0}}, + {3245, {wxStyledTextCtrl, wordLeft, 0}}, + {3246, {wxStyledTextCtrl, wordLeftExtend, 0}}, + {3247, {wxStyledTextCtrl, wordRight, 0}}, + {3248, {wxStyledTextCtrl, wordRightExtend, 0}}, + {3249, {wxStyledTextCtrl, home, 0}}, + {3250, {wxStyledTextCtrl, homeExtend, 0}}, + {3251, {wxStyledTextCtrl, lineEnd, 0}}, + {3252, {wxStyledTextCtrl, lineEndExtend, 0}}, + {3253, {wxStyledTextCtrl, documentStart, 0}}, + {3254, {wxStyledTextCtrl, documentStartExtend, 0}}, + {3255, {wxStyledTextCtrl, documentEnd, 0}}, + {3256, {wxStyledTextCtrl, documentEndExtend, 0}}, + {3257, {wxStyledTextCtrl, pageUp, 0}}, + {3258, {wxStyledTextCtrl, pageUpExtend, 0}}, + {3259, {wxStyledTextCtrl, pageDown, 0}}, + {3260, {wxStyledTextCtrl, pageDownExtend, 0}}, + {3261, {wxStyledTextCtrl, editToggleOvertype, 0}}, + {3262, {wxStyledTextCtrl, cancel, 0}}, + {3263, {wxStyledTextCtrl, deleteBack, 0}}, + {3264, {wxStyledTextCtrl, tab, 0}}, + {3265, {wxStyledTextCtrl, backTab, 0}}, + {3266, {wxStyledTextCtrl, newLine, 0}}, + {3267, {wxStyledTextCtrl, formFeed, 0}}, + {3268, {wxStyledTextCtrl, vCHome, 0}}, + {3269, {wxStyledTextCtrl, vCHomeExtend, 0}}, + {3270, {wxStyledTextCtrl, zoomIn, 0}}, + {3271, {wxStyledTextCtrl, zoomOut, 0}}, + {3272, {wxStyledTextCtrl, delWordLeft, 0}}, + {3273, {wxStyledTextCtrl, delWordRight, 0}}, + {3274, {wxStyledTextCtrl, lineCut, 0}}, + {3275, {wxStyledTextCtrl, lineDelete, 0}}, + {3276, {wxStyledTextCtrl, lineTranspose, 0}}, + {3277, {wxStyledTextCtrl, lineDuplicate, 0}}, + {3278, {wxStyledTextCtrl, lowerCase, 0}}, + {3279, {wxStyledTextCtrl, upperCase, 0}}, + {3280, {wxStyledTextCtrl, lineScrollDown, 0}}, + {3281, {wxStyledTextCtrl, lineScrollUp, 0}}, + {3282, {wxStyledTextCtrl, deleteBackNotLine, 0}}, + {3283, {wxStyledTextCtrl, homeDisplay, 0}}, + {3284, {wxStyledTextCtrl, homeDisplayExtend, 0}}, + {3285, {wxStyledTextCtrl, lineEndDisplay, 0}}, + {3286, {wxStyledTextCtrl, lineEndDisplayExtend, 0}}, + {3287, {wxStyledTextCtrl, homeWrapExtend, 0}}, + {3288, {wxStyledTextCtrl, lineEndWrap, 0}}, + {3289, {wxStyledTextCtrl, lineEndWrapExtend, 0}}, + {3290, {wxStyledTextCtrl, vCHomeWrap, 0}}, + {3291, {wxStyledTextCtrl, vCHomeWrapExtend, 0}}, + {3292, {wxStyledTextCtrl, lineCopy, 0}}, + {3293, {wxStyledTextCtrl, moveCaretInsideView, 0}}, + {3294, {wxStyledTextCtrl, lineLength, 1}}, + {3295, {wxStyledTextCtrl, braceHighlight, 2}}, + {3296, {wxStyledTextCtrl, braceBadLight, 1}}, + {3297, {wxStyledTextCtrl, braceMatch, 1}}, + {3298, {wxStyledTextCtrl, getViewEOL, 0}}, + {3299, {wxStyledTextCtrl, setViewEOL, 1}}, + {3300, {wxStyledTextCtrl, setModEventMask, 1}}, + {3301, {wxStyledTextCtrl, getEdgeColumn, 0}}, + {3302, {wxStyledTextCtrl, setEdgeColumn, 1}}, + {3303, {wxStyledTextCtrl, setEdgeMode, 1}}, + {3304, {wxStyledTextCtrl, getEdgeMode, 0}}, + {3305, {wxStyledTextCtrl, getEdgeColour, 0}}, + {3306, {wxStyledTextCtrl, setEdgeColour, 1}}, + {3307, {wxStyledTextCtrl, searchAnchor, 0}}, + {3308, {wxStyledTextCtrl, searchNext, 2}}, + {3309, {wxStyledTextCtrl, searchPrev, 2}}, + {3310, {wxStyledTextCtrl, linesOnScreen, 0}}, + {3311, {wxStyledTextCtrl, usePopUp, 1}}, + {3312, {wxStyledTextCtrl, selectionIsRectangle, 0}}, + {3313, {wxStyledTextCtrl, setZoom, 1}}, + {3314, {wxStyledTextCtrl, getZoom, 0}}, + {3315, {wxStyledTextCtrl, getModEventMask, 0}}, + {3316, {wxStyledTextCtrl, setSTCFocus, 1}}, + {3317, {wxStyledTextCtrl, getSTCFocus, 0}}, + {3318, {wxStyledTextCtrl, setStatus, 1}}, + {3319, {wxStyledTextCtrl, getStatus, 0}}, + {3320, {wxStyledTextCtrl, setMouseDownCaptures, 1}}, + {3321, {wxStyledTextCtrl, getMouseDownCaptures, 0}}, + {3322, {wxStyledTextCtrl, setSTCCursor, 1}}, + {3323, {wxStyledTextCtrl, getSTCCursor, 0}}, + {3324, {wxStyledTextCtrl, setControlCharSymbol, 1}}, + {3325, {wxStyledTextCtrl, getControlCharSymbol, 0}}, + {3326, {wxStyledTextCtrl, wordPartLeft, 0}}, + {3327, {wxStyledTextCtrl, wordPartLeftExtend, 0}}, + {3328, {wxStyledTextCtrl, wordPartRight, 0}}, + {3329, {wxStyledTextCtrl, wordPartRightExtend, 0}}, + {3330, {wxStyledTextCtrl, setVisiblePolicy, 2}}, + {3331, {wxStyledTextCtrl, delLineLeft, 0}}, + {3332, {wxStyledTextCtrl, delLineRight, 0}}, + {3333, {wxStyledTextCtrl, getXOffset, 0}}, + {3334, {wxStyledTextCtrl, chooseCaretX, 0}}, + {3335, {wxStyledTextCtrl, setXCaretPolicy, 2}}, + {3336, {wxStyledTextCtrl, setYCaretPolicy, 2}}, + {3337, {wxStyledTextCtrl, getPrintWrapMode, 0}}, + {3338, {wxStyledTextCtrl, setHotspotActiveForeground, 2}}, + {3339, {wxStyledTextCtrl, setHotspotActiveBackground, 2}}, + {3340, {wxStyledTextCtrl, setHotspotActiveUnderline, 1}}, + {3341, {wxStyledTextCtrl, setHotspotSingleLine, 1}}, + {3342, {wxStyledTextCtrl, paraDownExtend, 0}}, + {3343, {wxStyledTextCtrl, paraUp, 0}}, + {3344, {wxStyledTextCtrl, paraUpExtend, 0}}, + {3345, {wxStyledTextCtrl, positionBefore, 1}}, + {3346, {wxStyledTextCtrl, positionAfter, 1}}, + {3347, {wxStyledTextCtrl, copyRange, 2}}, + {3348, {wxStyledTextCtrl, copyText, 2}}, + {3349, {wxStyledTextCtrl, setSelectionMode, 1}}, + {3350, {wxStyledTextCtrl, getSelectionMode, 0}}, + {3351, {wxStyledTextCtrl, lineDownRectExtend, 0}}, + {3352, {wxStyledTextCtrl, lineUpRectExtend, 0}}, + {3353, {wxStyledTextCtrl, charLeftRectExtend, 0}}, + {3354, {wxStyledTextCtrl, charRightRectExtend, 0}}, + {3355, {wxStyledTextCtrl, homeRectExtend, 0}}, + {3356, {wxStyledTextCtrl, vCHomeRectExtend, 0}}, + {3357, {wxStyledTextCtrl, lineEndRectExtend, 0}}, + {3358, {wxStyledTextCtrl, pageUpRectExtend, 0}}, + {3359, {wxStyledTextCtrl, pageDownRectExtend, 0}}, + {3360, {wxStyledTextCtrl, stutteredPageUp, 0}}, + {3361, {wxStyledTextCtrl, stutteredPageUpExtend, 0}}, + {3362, {wxStyledTextCtrl, stutteredPageDown, 0}}, + {3363, {wxStyledTextCtrl, stutteredPageDownExtend, 0}}, + {3364, {wxStyledTextCtrl, wordLeftEnd, 0}}, + {3365, {wxStyledTextCtrl, wordLeftEndExtend, 0}}, + {3366, {wxStyledTextCtrl, wordRightEnd, 0}}, + {3367, {wxStyledTextCtrl, wordRightEndExtend, 0}}, + {3368, {wxStyledTextCtrl, setWhitespaceChars, 1}}, + {3369, {wxStyledTextCtrl, setCharsDefault, 0}}, + {3370, {wxStyledTextCtrl, autoCompGetCurrent, 0}}, + {3371, {wxStyledTextCtrl, allocate, 1}}, + {3372, {wxStyledTextCtrl, findColumn, 2}}, + {3373, {wxStyledTextCtrl, getCaretSticky, 0}}, + {3374, {wxStyledTextCtrl, setCaretSticky, 1}}, + {3375, {wxStyledTextCtrl, toggleCaretSticky, 0}}, + {3376, {wxStyledTextCtrl, setPasteConvertEndings, 1}}, + {3377, {wxStyledTextCtrl, getPasteConvertEndings, 0}}, + {3378, {wxStyledTextCtrl, selectionDuplicate, 0}}, + {3379, {wxStyledTextCtrl, setCaretLineBackAlpha, 1}}, + {3380, {wxStyledTextCtrl, getCaretLineBackAlpha, 0}}, + {3381, {wxStyledTextCtrl, startRecord, 0}}, + {3382, {wxStyledTextCtrl, stopRecord, 0}}, + {3383, {wxStyledTextCtrl, setLexer, 1}}, + {3384, {wxStyledTextCtrl, getLexer, 0}}, + {3385, {wxStyledTextCtrl, colourise, 2}}, + {3386, {wxStyledTextCtrl, setProperty, 2}}, + {3387, {wxStyledTextCtrl, setKeyWords, 2}}, + {3388, {wxStyledTextCtrl, setLexerLanguage, 1}}, + {3389, {wxStyledTextCtrl, getProperty, 1}}, + {3390, {wxStyledTextCtrl, getStyleBitsNeeded, 0}}, + {3391, {wxStyledTextCtrl, getCurrentLine, 0}}, + {3392, {wxStyledTextCtrl, styleSetSpec, 2}}, + {3393, {wxStyledTextCtrl, styleSetFont, 2}}, + {3394, {wxStyledTextCtrl, styleSetFontAttr, 7}}, + {3395, {wxStyledTextCtrl, styleSetCharacterSet, 2}}, + {3396, {wxStyledTextCtrl, styleSetFontEncoding, 2}}, + {3397, {wxStyledTextCtrl, cmdKeyExecute, 1}}, + {3398, {wxStyledTextCtrl, setMargins, 2}}, + {3399, {wxStyledTextCtrl, getSelection, 2}}, + {3400, {wxStyledTextCtrl, pointFromPosition, 1}}, + {3401, {wxStyledTextCtrl, scrollToLine, 1}}, + {3402, {wxStyledTextCtrl, scrollToColumn, 1}}, + {3403, {wxStyledTextCtrl, setVScrollBar, 1}}, + {3404, {wxStyledTextCtrl, setHScrollBar, 1}}, + {3405, {wxStyledTextCtrl, getLastKeydownProcessed, 0}}, + {3406, {wxStyledTextCtrl, setLastKeydownProcessed, 1}}, + {3407, {wxStyledTextCtrl, saveFile, 1}}, + {3408, {wxStyledTextCtrl, loadFile, 1}}, + {3409, {wxStyledTextCtrl, doDragOver, 3}}, + {3410, {wxStyledTextCtrl, doDropText, 3}}, + {3411, {wxStyledTextCtrl, getUseAntiAliasing, 0}}, + {3412, {wxStyledTextCtrl, addTextRaw, 1}}, + {3413, {wxStyledTextCtrl, insertTextRaw, 2}}, + {3414, {wxStyledTextCtrl, getCurLineRaw, 1}}, + {3415, {wxStyledTextCtrl, getLineRaw, 1}}, + {3416, {wxStyledTextCtrl, getSelectedTextRaw, 0}}, + {3417, {wxStyledTextCtrl, getTextRangeRaw, 2}}, + {3418, {wxStyledTextCtrl, setTextRaw, 1}}, + {3419, {wxStyledTextCtrl, getTextRaw, 0}}, + {3420, {wxStyledTextCtrl, appendTextRaw, 1}}, + {3421, {wxArtProvider, getBitmap, 2}}, + {3422, {wxArtProvider, getIcon, 2}}, + {3423, {wxTreeEvent, getKeyCode, 0}}, + {3424, {wxTreeEvent, getItem, 0}}, + {3425, {wxTreeEvent, getKeyEvent, 0}}, + {3426, {wxTreeEvent, getLabel, 0}}, + {3427, {wxTreeEvent, getOldItem, 0}}, + {3428, {wxTreeEvent, getPoint, 0}}, + {3429, {wxTreeEvent, isEditCancelled, 0}}, + {3430, {wxTreeEvent, setToolTip, 1}}, + {3431, {wxNotebookEvent, getOldSelection, 0}}, + {3432, {wxNotebookEvent, getSelection, 0}}, + {3433, {wxNotebookEvent, setOldSelection, 1}}, + {3434, {wxNotebookEvent, setSelection, 1}}, + {3435, {wxFileDataObject, new, 0}}, + {3436, {wxFileDataObject, addFile, 1}}, + {3437, {wxFileDataObject, getFilenames, 0}}, + {3438, {wxFileDataObject, 'Destroy', undefined}}, + {3439, {wxTextDataObject, new, 1}}, + {3440, {wxTextDataObject, getTextLength, 0}}, + {3441, {wxTextDataObject, getText, 0}}, + {3442, {wxTextDataObject, setText, 1}}, + {3443, {wxTextDataObject, 'Destroy', undefined}}, + {3444, {wxBitmapDataObject, new_1_1, 1}}, + {3445, {wxBitmapDataObject, new_1_0, 1}}, + {3446, {wxBitmapDataObject, getBitmap, 0}}, + {3447, {wxBitmapDataObject, setBitmap, 1}}, + {3448, {wxBitmapDataObject, 'Destroy', undefined}}, + {3450, {wxClipboard, new, 0}}, + {3451, {wxClipboard, destruct, 0}}, + {3452, {wxClipboard, addData, 1}}, + {3453, {wxClipboard, clear, 0}}, + {3454, {wxClipboard, close, 0}}, + {3455, {wxClipboard, flush, 0}}, + {3456, {wxClipboard, getData, 1}}, + {3457, {wxClipboard, isOpened, 0}}, + {3458, {wxClipboard, open, 0}}, + {3459, {wxClipboard, setData, 1}}, + {3461, {wxClipboard, usePrimarySelection, 1}}, + {3462, {wxClipboard, isSupported, 1}}, + {3463, {wxClipboard, get, 0}}, + {3464, {wxSpinEvent, getPosition, 0}}, + {3465, {wxSpinEvent, setPosition, 1}}, + {3466, {wxSplitterWindow, new_0, 0}}, + {3467, {wxSplitterWindow, new_2, 2}}, + {3468, {wxSplitterWindow, destruct, 0}}, + {3469, {wxSplitterWindow, create, 2}}, + {3470, {wxSplitterWindow, getMinimumPaneSize, 0}}, + {3471, {wxSplitterWindow, getSashGravity, 0}}, + {3472, {wxSplitterWindow, getSashPosition, 0}}, + {3473, {wxSplitterWindow, getSplitMode, 0}}, + {3474, {wxSplitterWindow, getWindow1, 0}}, + {3475, {wxSplitterWindow, getWindow2, 0}}, + {3476, {wxSplitterWindow, initialize, 1}}, + {3477, {wxSplitterWindow, isSplit, 0}}, + {3478, {wxSplitterWindow, replaceWindow, 2}}, + {3479, {wxSplitterWindow, setSashGravity, 1}}, + {3480, {wxSplitterWindow, setSashPosition, 2}}, + {3481, {wxSplitterWindow, setSashSize, 1}}, + {3482, {wxSplitterWindow, setMinimumPaneSize, 1}}, + {3483, {wxSplitterWindow, setSplitMode, 1}}, + {3484, {wxSplitterWindow, splitHorizontally, 3}}, + {3485, {wxSplitterWindow, splitVertically, 3}}, + {3486, {wxSplitterWindow, unsplit, 1}}, + {3487, {wxSplitterWindow, updateSize, 0}}, + {3488, {wxSplitterEvent, getSashPosition, 0}}, + {3489, {wxSplitterEvent, getX, 0}}, + {3490, {wxSplitterEvent, getY, 0}}, + {3491, {wxSplitterEvent, getWindowBeingRemoved, 0}}, + {3492, {wxSplitterEvent, setSashPosition, 1}}, + {3493, {wxHtmlWindow, new_0, 0}}, + {3494, {wxHtmlWindow, new_2, 2}}, + {3495, {wxHtmlWindow, appendToPage, 1}}, + {3496, {wxHtmlWindow, getOpenedAnchor, 0}}, + {3497, {wxHtmlWindow, getOpenedPage, 0}}, + {3498, {wxHtmlWindow, getOpenedPageTitle, 0}}, + {3499, {wxHtmlWindow, getRelatedFrame, 0}}, + {3500, {wxHtmlWindow, historyBack, 0}}, + {3501, {wxHtmlWindow, historyCanBack, 0}}, + {3502, {wxHtmlWindow, historyCanForward, 0}}, + {3503, {wxHtmlWindow, historyClear, 0}}, + {3504, {wxHtmlWindow, historyForward, 0}}, + {3505, {wxHtmlWindow, loadFile, 1}}, + {3506, {wxHtmlWindow, loadPage, 1}}, + {3507, {wxHtmlWindow, selectAll, 0}}, + {3508, {wxHtmlWindow, selectionToText, 0}}, + {3509, {wxHtmlWindow, selectLine, 1}}, + {3510, {wxHtmlWindow, selectWord, 1}}, + {3511, {wxHtmlWindow, setBorders, 1}}, + {3512, {wxHtmlWindow, setFonts, 3}}, + {3513, {wxHtmlWindow, setPage, 1}}, + {3514, {wxHtmlWindow, setRelatedFrame, 2}}, + {3515, {wxHtmlWindow, setRelatedStatusBar, 1}}, + {3516, {wxHtmlWindow, toText, 0}}, + {3517, {wxHtmlWindow, 'Destroy', undefined}}, + {3518, {wxHtmlLinkEvent, getLinkInfo, 0}}, + {3519, {wxSystemSettings, getColour, 1}}, + {3520, {wxSystemSettings, getFont, 1}}, + {3521, {wxSystemSettings, getMetric, 2}}, + {3522, {wxSystemSettings, getScreenType, 0}}, + {3523, {wxSystemOptions, getOption, 1}}, + {3524, {wxSystemOptions, getOptionInt, 1}}, + {3525, {wxSystemOptions, hasOption, 1}}, + {3526, {wxSystemOptions, isFalse, 1}}, + {3527, {wxSystemOptions, setOption_2_1, 2}}, + {3528, {wxSystemOptions, setOption_2_0, 2}}, + {3529, {wxAuiNotebookEvent, setSelection, 1}}, + {3530, {wxAuiNotebookEvent, getSelection, 0}}, + {3531, {wxAuiNotebookEvent, setOldSelection, 1}}, + {3532, {wxAuiNotebookEvent, getOldSelection, 0}}, + {3533, {wxAuiNotebookEvent, setDragSource, 1}}, + {3534, {wxAuiNotebookEvent, getDragSource, 0}}, + {3535, {wxAuiManagerEvent, setManager, 1}}, + {3536, {wxAuiManagerEvent, getManager, 0}}, + {3537, {wxAuiManagerEvent, setPane, 1}}, + {3538, {wxAuiManagerEvent, getPane, 0}}, + {3539, {wxAuiManagerEvent, setButton, 1}}, + {3540, {wxAuiManagerEvent, getButton, 0}}, + {3541, {wxAuiManagerEvent, setDC, 1}}, + {3542, {wxAuiManagerEvent, getDC, 0}}, + {3543, {wxAuiManagerEvent, veto, 1}}, + {3544, {wxAuiManagerEvent, getVeto, 0}}, + {3545, {wxAuiManagerEvent, setCanVeto, 1}}, + {3546, {wxAuiManagerEvent, canVeto, 0}}, + {3547, {wxLogNull, new, 0}}, + {3548, {wxLogNull, 'Destroy', undefined}}, + {3549, {wxTaskBarIcon, new, 0}}, + {3550, {wxTaskBarIcon, destruct, 0}}, + {3551, {wxTaskBarIcon, popupMenu, 1}}, + {3552, {wxTaskBarIcon, removeIcon, 0}}, + {3553, {wxTaskBarIcon, setIcon, 2}}, + {3554, {wxLocale, new_0, 0}}, + {3556, {wxLocale, new_2, 2}}, + {3557, {wxLocale, destruct, 0}}, + {3559, {wxLocale, init, 1}}, + {3560, {wxLocale, addCatalog_1, 1}}, + {3561, {wxLocale, addCatalog_3, 3}}, + {3562, {wxLocale, addCatalogLookupPathPrefix, 1}}, + {3563, {wxLocale, getCanonicalName, 0}}, + {3564, {wxLocale, getLanguage, 0}}, + {3565, {wxLocale, getLanguageName, 1}}, + {3566, {wxLocale, getLocale, 0}}, + {3567, {wxLocale, getName, 0}}, + {3568, {wxLocale, getString_2, 2}}, + {3569, {wxLocale, getString_4, 4}}, + {3570, {wxLocale, getHeaderValue, 2}}, + {3571, {wxLocale, getSysName, 0}}, + {3572, {wxLocale, getSystemEncoding, 0}}, + {3573, {wxLocale, getSystemEncodingName, 0}}, + {3574, {wxLocale, getSystemLanguage, 0}}, + {3575, {wxLocale, isLoaded, 1}}, + {3576, {wxLocale, isOk, 0}}, + {3577, {wxActivateEvent, getActive, 0}}, + {3579, {wxPopupWindow, new_2, 2}}, + {3580, {wxPopupWindow, new_0, 0}}, + {3582, {wxPopupWindow, destruct, 0}}, + {3583, {wxPopupWindow, create, 2}}, + {3584, {wxPopupWindow, position, 2}}, + {3585, {wxPopupTransientWindow, new_0, 0}}, + {3586, {wxPopupTransientWindow, new_2, 2}}, + {3587, {wxPopupTransientWindow, destruct, 0}}, + {3588, {wxPopupTransientWindow, popup, 1}}, + {3589, {wxPopupTransientWindow, dismiss, 0}}, + {3590, {wxOverlay, new, 0}}, + {3591, {wxOverlay, destruct, 0}}, + {3592, {wxOverlay, reset, 0}}, + {3593, {wxDCOverlay, new_6, 6}}, + {3594, {wxDCOverlay, new_2, 2}}, + {3595, {wxDCOverlay, destruct, 0}}, + {3596, {wxDCOverlay, clear, 0}}, + {3597, {wxDropFilesEvent, getPosition, 0}}, + {3598, {wxDropFilesEvent, getNumberOfFiles, 0}}, + {3599, {wxDropFilesEvent, getFiles, 0}}, {-1, {mod, func, -1}} ]. diff --git a/lib/wx/src/gen/wxe_funcs.hrl b/lib/wx/src/gen/wxe_funcs.hrl index 84fa592aaa..af0cee0dcd 100644 --- a/lib/wx/src/gen/wxe_funcs.hrl +++ b/lib/wx/src/gen/wxe_funcs.hrl @@ -42,3330 +42,3335 @@ -define(wxWindow_Destroy, 123). -define(wxWindow_DestroyChildren, 124). -define(wxWindow_Disable, 125). --define(wxWindow_Enable, 126). --define(wxWindow_FindFocus, 127). --define(wxWindow_FindWindow_1_0, 128). --define(wxWindow_FindWindow_1_1, 129). --define(wxWindow_FindWindowById, 130). --define(wxWindow_FindWindowByName, 131). --define(wxWindow_FindWindowByLabel, 132). --define(wxWindow_Fit, 133). --define(wxWindow_FitInside, 134). --define(wxWindow_Freeze, 135). --define(wxWindow_GetAcceleratorTable, 136). --define(wxWindow_GetBackgroundColour, 137). --define(wxWindow_GetBackgroundStyle, 138). --define(wxWindow_GetBestSize, 139). --define(wxWindow_GetCaret, 141). --define(wxWindow_GetCapture, 142). --define(wxWindow_GetCharHeight, 143). --define(wxWindow_GetCharWidth, 144). --define(wxWindow_GetChildren, 145). --define(wxWindow_GetClientSize, 148). --define(wxWindow_GetContainingSizer, 149). --define(wxWindow_GetCursor, 150). --define(wxWindow_GetDropTarget, 151). --define(wxWindow_GetEventHandler, 152). --define(wxWindow_GetExtraStyle, 153). --define(wxWindow_GetFont, 154). --define(wxWindow_GetForegroundColour, 155). --define(wxWindow_GetGrandParent, 156). --define(wxWindow_GetHandle, 157). --define(wxWindow_GetHelpText, 158). --define(wxWindow_GetId, 159). --define(wxWindow_GetLabel, 160). --define(wxWindow_GetMaxSize, 161). --define(wxWindow_GetMinSize, 162). --define(wxWindow_GetName, 163). --define(wxWindow_GetParent, 164). --define(wxWindow_GetPosition, 166). --define(wxWindow_GetRect, 167). --define(wxWindow_GetScreenPosition, 169). --define(wxWindow_GetScreenRect, 170). --define(wxWindow_GetScrollPos, 171). --define(wxWindow_GetScrollRange, 172). --define(wxWindow_GetScrollThumb, 173). --define(wxWindow_GetSize, 175). --define(wxWindow_GetSizer, 176). --define(wxWindow_GetTextExtent, 177). --define(wxWindow_GetToolTip, 178). --define(wxWindow_GetUpdateRegion, 179). --define(wxWindow_GetVirtualSize, 181). --define(wxWindow_GetWindowStyleFlag, 183). --define(wxWindow_GetWindowVariant, 184). --define(wxWindow_HasCapture, 185). --define(wxWindow_HasScrollbar, 186). --define(wxWindow_HasTransparentBackground, 187). --define(wxWindow_Hide, 188). --define(wxWindow_InheritAttributes, 189). --define(wxWindow_InitDialog, 190). --define(wxWindow_InvalidateBestSize, 191). --define(wxWindow_IsEnabled, 192). --define(wxWindow_IsExposed_2, 193). --define(wxWindow_IsExposed_4, 194). --define(wxWindow_IsExposed_1_0, 195). --define(wxWindow_IsExposed_1_1, 196). --define(wxWindow_IsRetained, 197). --define(wxWindow_IsShown, 198). --define(wxWindow_IsTopLevel, 199). --define(wxWindow_Layout, 200). --define(wxWindow_LineDown, 201). --define(wxWindow_LineUp, 202). --define(wxWindow_Lower, 203). --define(wxWindow_MakeModal, 204). --define(wxWindow_Move_3, 205). --define(wxWindow_Move_2, 206). --define(wxWindow_MoveAfterInTabOrder, 207). --define(wxWindow_MoveBeforeInTabOrder, 208). --define(wxWindow_Navigate, 209). --define(wxWindow_PageDown, 210). --define(wxWindow_PageUp, 211). --define(wxWindow_PopEventHandler, 212). --define(wxWindow_PopupMenu_2, 213). --define(wxWindow_PopupMenu_3, 214). --define(wxWindow_Raise, 215). --define(wxWindow_Refresh, 216). --define(wxWindow_RefreshRect, 217). --define(wxWindow_ReleaseMouse, 218). --define(wxWindow_RemoveChild, 219). --define(wxWindow_Reparent, 220). --define(wxWindow_ScreenToClient_2, 221). --define(wxWindow_ScreenToClient_1, 222). --define(wxWindow_ScrollLines, 224). --define(wxWindow_ScrollPages, 226). --define(wxWindow_ScrollWindow, 227). --define(wxWindow_SetAcceleratorTable, 228). --define(wxWindow_SetAutoLayout, 229). --define(wxWindow_SetBackgroundColour, 230). --define(wxWindow_SetBackgroundStyle, 231). --define(wxWindow_SetCaret, 232). --define(wxWindow_SetClientSize_2, 233). --define(wxWindow_SetClientSize_1_0, 234). --define(wxWindow_SetClientSize_1_1, 235). --define(wxWindow_SetContainingSizer, 236). --define(wxWindow_SetCursor, 237). --define(wxWindow_SetMaxSize, 238). --define(wxWindow_SetMinSize, 239). --define(wxWindow_SetOwnBackgroundColour, 240). --define(wxWindow_SetOwnFont, 241). --define(wxWindow_SetOwnForegroundColour, 242). --define(wxWindow_SetDropTarget, 243). --define(wxWindow_SetExtraStyle, 244). --define(wxWindow_SetFocus, 245). --define(wxWindow_SetFocusFromKbd, 246). --define(wxWindow_SetFont, 247). --define(wxWindow_SetForegroundColour, 248). --define(wxWindow_SetHelpText, 249). --define(wxWindow_SetId, 250). --define(wxWindow_SetLabel, 252). --define(wxWindow_SetName, 253). --define(wxWindow_SetPalette, 254). --define(wxWindow_SetScrollbar, 255). --define(wxWindow_SetScrollPos, 256). --define(wxWindow_SetSize_5, 257). --define(wxWindow_SetSize_2_0, 258). --define(wxWindow_SetSize_1, 259). --define(wxWindow_SetSize_2_1, 260). --define(wxWindow_SetSizeHints_3, 261). --define(wxWindow_SetSizeHints_2, 262). --define(wxWindow_SetSizer, 263). --define(wxWindow_SetSizerAndFit, 264). --define(wxWindow_SetThemeEnabled, 265). --define(wxWindow_SetToolTip_1_0, 266). --define(wxWindow_SetToolTip_1_1, 267). --define(wxWindow_SetVirtualSize_1, 268). --define(wxWindow_SetVirtualSize_2, 269). --define(wxWindow_SetVirtualSizeHints_3, 270). --define(wxWindow_SetVirtualSizeHints_2, 271). --define(wxWindow_SetWindowStyle, 272). --define(wxWindow_SetWindowStyleFlag, 273). --define(wxWindow_SetWindowVariant, 274). --define(wxWindow_ShouldInheritColours, 275). --define(wxWindow_Show, 276). --define(wxWindow_Thaw, 277). --define(wxWindow_TransferDataFromWindow, 278). --define(wxWindow_TransferDataToWindow, 279). --define(wxWindow_Update, 280). --define(wxWindow_UpdateWindowUI, 281). --define(wxWindow_Validate, 282). --define(wxWindow_WarpPointer, 283). --define(wxWindow_SetTransparent, 284). --define(wxWindow_CanSetTransparent, 285). --define(wxWindow_IsDoubleBuffered, 286). --define(wxWindow_SetDoubleBuffered, 287). --define(wxTopLevelWindow_GetIcon, 288). --define(wxTopLevelWindow_GetIcons, 289). --define(wxTopLevelWindow_GetTitle, 290). --define(wxTopLevelWindow_IsActive, 291). --define(wxTopLevelWindow_Iconize, 292). --define(wxTopLevelWindow_IsFullScreen, 293). --define(wxTopLevelWindow_IsIconized, 294). --define(wxTopLevelWindow_IsMaximized, 295). --define(wxTopLevelWindow_Maximize, 296). --define(wxTopLevelWindow_RequestUserAttention, 297). --define(wxTopLevelWindow_SetIcon, 298). --define(wxTopLevelWindow_SetIcons, 299). --define(wxTopLevelWindow_CenterOnScreen, 300). --define(wxTopLevelWindow_CentreOnScreen, 301). --define(wxTopLevelWindow_SetShape, 303). --define(wxTopLevelWindow_SetTitle, 304). --define(wxTopLevelWindow_ShowFullScreen, 305). --define(wxFrame_new_4, 307). --define(wxFrame_new_0, 308). --define(wxFrame_destruct, 310). --define(wxFrame_Create, 311). --define(wxFrame_CreateStatusBar, 312). --define(wxFrame_CreateToolBar, 313). --define(wxFrame_GetClientAreaOrigin, 314). --define(wxFrame_GetMenuBar, 315). --define(wxFrame_GetStatusBar, 316). --define(wxFrame_GetStatusBarPane, 317). --define(wxFrame_GetToolBar, 318). --define(wxFrame_ProcessCommand, 319). --define(wxFrame_SendSizeEvent, 320). --define(wxFrame_SetMenuBar, 321). --define(wxFrame_SetStatusBar, 322). --define(wxFrame_SetStatusBarPane, 323). --define(wxFrame_SetStatusText, 324). --define(wxFrame_SetStatusWidths, 325). --define(wxFrame_SetToolBar, 326). --define(wxMiniFrame_new_0, 327). --define(wxMiniFrame_new_4, 328). --define(wxMiniFrame_Create, 329). --define(wxMiniFrame_destroy, 330). --define(wxSplashScreen_new_0, 331). --define(wxSplashScreen_new_6, 332). --define(wxSplashScreen_destruct, 333). --define(wxSplashScreen_GetSplashStyle, 334). --define(wxSplashScreen_GetTimeout, 335). --define(wxPanel_new_0, 336). --define(wxPanel_new_6, 337). --define(wxPanel_new_2, 338). --define(wxPanel_destruct, 339). --define(wxPanel_InitDialog, 340). --define(wxPanel_SetFocusIgnoringChildren, 341). --define(wxScrolledWindow_new_0, 342). --define(wxScrolledWindow_new_2, 343). --define(wxScrolledWindow_destruct, 344). --define(wxScrolledWindow_CalcScrolledPosition_4, 345). --define(wxScrolledWindow_CalcScrolledPosition_1, 346). --define(wxScrolledWindow_CalcUnscrolledPosition_4, 347). --define(wxScrolledWindow_CalcUnscrolledPosition_1, 348). --define(wxScrolledWindow_EnableScrolling, 349). --define(wxScrolledWindow_GetScrollPixelsPerUnit, 350). --define(wxScrolledWindow_GetViewStart, 351). --define(wxScrolledWindow_DoPrepareDC, 352). --define(wxScrolledWindow_PrepareDC, 353). --define(wxScrolledWindow_Scroll, 354). --define(wxScrolledWindow_SetScrollbars, 355). --define(wxScrolledWindow_SetScrollRate, 356). --define(wxScrolledWindow_SetTargetWindow, 357). --define(wxSashWindow_new_0, 358). --define(wxSashWindow_new_2, 359). --define(wxSashWindow_destruct, 360). --define(wxSashWindow_GetSashVisible, 361). --define(wxSashWindow_GetMaximumSizeX, 362). --define(wxSashWindow_GetMaximumSizeY, 363). --define(wxSashWindow_GetMinimumSizeX, 364). --define(wxSashWindow_GetMinimumSizeY, 365). --define(wxSashWindow_SetMaximumSizeX, 366). --define(wxSashWindow_SetMaximumSizeY, 367). --define(wxSashWindow_SetMinimumSizeX, 368). --define(wxSashWindow_SetMinimumSizeY, 369). --define(wxSashWindow_SetSashVisible, 370). --define(wxSashLayoutWindow_new_0, 371). --define(wxSashLayoutWindow_new_2, 372). --define(wxSashLayoutWindow_Create, 373). --define(wxSashLayoutWindow_GetAlignment, 374). --define(wxSashLayoutWindow_GetOrientation, 375). --define(wxSashLayoutWindow_SetAlignment, 376). --define(wxSashLayoutWindow_SetDefaultSize, 377). --define(wxSashLayoutWindow_SetOrientation, 378). --define(wxSashLayoutWindow_destroy, 379). --define(wxGrid_new_0, 380). --define(wxGrid_new_3, 381). --define(wxGrid_new_4, 382). --define(wxGrid_destruct, 383). --define(wxGrid_AppendCols, 384). --define(wxGrid_AppendRows, 385). --define(wxGrid_AutoSize, 386). --define(wxGrid_AutoSizeColumn, 387). --define(wxGrid_AutoSizeColumns, 388). --define(wxGrid_AutoSizeRow, 389). --define(wxGrid_AutoSizeRows, 390). --define(wxGrid_BeginBatch, 391). --define(wxGrid_BlockToDeviceRect, 392). --define(wxGrid_CanDragColSize, 393). --define(wxGrid_CanDragRowSize, 394). --define(wxGrid_CanDragGridSize, 395). --define(wxGrid_CanEnableCellControl, 396). --define(wxGrid_CellToRect_2, 397). --define(wxGrid_CellToRect_1, 398). --define(wxGrid_ClearGrid, 399). --define(wxGrid_ClearSelection, 400). --define(wxGrid_CreateGrid, 401). --define(wxGrid_DeleteCols, 402). --define(wxGrid_DeleteRows, 403). --define(wxGrid_DisableCellEditControl, 404). --define(wxGrid_DisableDragColSize, 405). --define(wxGrid_DisableDragGridSize, 406). --define(wxGrid_DisableDragRowSize, 407). --define(wxGrid_EnableCellEditControl, 408). --define(wxGrid_EnableDragColSize, 409). --define(wxGrid_EnableDragGridSize, 410). --define(wxGrid_EnableDragRowSize, 411). --define(wxGrid_EnableEditing, 412). --define(wxGrid_EnableGridLines, 413). --define(wxGrid_EndBatch, 414). --define(wxGrid_Fit, 415). --define(wxGrid_ForceRefresh, 416). --define(wxGrid_GetBatchCount, 417). --define(wxGrid_GetCellAlignment, 418). --define(wxGrid_GetCellBackgroundColour, 419). --define(wxGrid_GetCellEditor, 420). --define(wxGrid_GetCellFont, 421). --define(wxGrid_GetCellRenderer, 422). --define(wxGrid_GetCellTextColour, 423). --define(wxGrid_GetCellValue_2, 424). --define(wxGrid_GetCellValue_1, 425). --define(wxGrid_GetColLabelAlignment, 426). --define(wxGrid_GetColLabelSize, 427). --define(wxGrid_GetColLabelValue, 428). --define(wxGrid_GetColMinimalAcceptableWidth, 429). --define(wxGrid_GetDefaultCellAlignment, 430). --define(wxGrid_GetDefaultCellBackgroundColour, 431). --define(wxGrid_GetDefaultCellFont, 432). --define(wxGrid_GetDefaultCellTextColour, 433). --define(wxGrid_GetDefaultColLabelSize, 434). --define(wxGrid_GetDefaultColSize, 435). --define(wxGrid_GetDefaultEditor, 436). --define(wxGrid_GetDefaultEditorForCell_2, 437). --define(wxGrid_GetDefaultEditorForCell_1, 438). --define(wxGrid_GetDefaultEditorForType, 439). --define(wxGrid_GetDefaultRenderer, 440). --define(wxGrid_GetDefaultRendererForCell, 441). --define(wxGrid_GetDefaultRendererForType, 442). --define(wxGrid_GetDefaultRowLabelSize, 443). --define(wxGrid_GetDefaultRowSize, 444). --define(wxGrid_GetGridCursorCol, 445). --define(wxGrid_GetGridCursorRow, 446). --define(wxGrid_GetGridLineColour, 447). --define(wxGrid_GridLinesEnabled, 448). --define(wxGrid_GetLabelBackgroundColour, 449). --define(wxGrid_GetLabelFont, 450). --define(wxGrid_GetLabelTextColour, 451). --define(wxGrid_GetNumberCols, 452). --define(wxGrid_GetNumberRows, 453). --define(wxGrid_GetOrCreateCellAttr, 454). --define(wxGrid_GetRowMinimalAcceptableHeight, 455). --define(wxGrid_GetRowLabelAlignment, 456). --define(wxGrid_GetRowLabelSize, 457). --define(wxGrid_GetRowLabelValue, 458). --define(wxGrid_GetRowSize, 459). --define(wxGrid_GetScrollLineX, 460). --define(wxGrid_GetScrollLineY, 461). --define(wxGrid_GetSelectedCells, 462). --define(wxGrid_GetSelectedCols, 463). --define(wxGrid_GetSelectedRows, 464). --define(wxGrid_GetSelectionBackground, 465). --define(wxGrid_GetSelectionBlockTopLeft, 466). --define(wxGrid_GetSelectionBlockBottomRight, 467). --define(wxGrid_GetSelectionForeground, 468). --define(wxGrid_GetViewWidth, 469). --define(wxGrid_GetGridWindow, 470). --define(wxGrid_GetGridRowLabelWindow, 471). --define(wxGrid_GetGridColLabelWindow, 472). --define(wxGrid_GetGridCornerLabelWindow, 473). --define(wxGrid_HideCellEditControl, 474). --define(wxGrid_InsertCols, 475). --define(wxGrid_InsertRows, 476). --define(wxGrid_IsCellEditControlEnabled, 477). --define(wxGrid_IsCurrentCellReadOnly, 478). --define(wxGrid_IsEditable, 479). --define(wxGrid_IsInSelection_2, 480). --define(wxGrid_IsInSelection_1, 481). --define(wxGrid_IsReadOnly, 482). --define(wxGrid_IsSelection, 483). --define(wxGrid_IsVisible_3, 484). --define(wxGrid_IsVisible_2, 485). --define(wxGrid_MakeCellVisible_2, 486). --define(wxGrid_MakeCellVisible_1, 487). --define(wxGrid_MoveCursorDown, 488). --define(wxGrid_MoveCursorLeft, 489). --define(wxGrid_MoveCursorRight, 490). --define(wxGrid_MoveCursorUp, 491). --define(wxGrid_MoveCursorDownBlock, 492). --define(wxGrid_MoveCursorLeftBlock, 493). --define(wxGrid_MoveCursorRightBlock, 494). --define(wxGrid_MoveCursorUpBlock, 495). --define(wxGrid_MovePageDown, 496). --define(wxGrid_MovePageUp, 497). --define(wxGrid_RegisterDataType, 498). --define(wxGrid_SaveEditControlValue, 499). --define(wxGrid_SelectAll, 500). --define(wxGrid_SelectBlock_5, 501). --define(wxGrid_SelectBlock_3, 502). --define(wxGrid_SelectCol, 503). --define(wxGrid_SelectRow, 504). --define(wxGrid_SetCellAlignment_4, 505). --define(wxGrid_SetCellAlignment_3, 506). --define(wxGrid_SetCellAlignment_1, 507). --define(wxGrid_SetCellBackgroundColour_3_0, 508). --define(wxGrid_SetCellBackgroundColour_1, 509). --define(wxGrid_SetCellBackgroundColour_3_1, 510). --define(wxGrid_SetCellEditor, 511). --define(wxGrid_SetCellFont, 512). --define(wxGrid_SetCellRenderer, 513). --define(wxGrid_SetCellTextColour_3_0, 514). --define(wxGrid_SetCellTextColour_3_1, 515). --define(wxGrid_SetCellTextColour_1, 516). --define(wxGrid_SetCellValue_3_0, 517). --define(wxGrid_SetCellValue_2, 518). --define(wxGrid_SetCellValue_3_1, 519). --define(wxGrid_SetColAttr, 520). --define(wxGrid_SetColFormatBool, 521). --define(wxGrid_SetColFormatNumber, 522). --define(wxGrid_SetColFormatFloat, 523). --define(wxGrid_SetColFormatCustom, 524). --define(wxGrid_SetColLabelAlignment, 525). --define(wxGrid_SetColLabelSize, 526). --define(wxGrid_SetColLabelValue, 527). --define(wxGrid_SetColMinimalWidth, 528). --define(wxGrid_SetColMinimalAcceptableWidth, 529). --define(wxGrid_SetColSize, 530). --define(wxGrid_SetDefaultCellAlignment, 531). --define(wxGrid_SetDefaultCellBackgroundColour, 532). --define(wxGrid_SetDefaultCellFont, 533). --define(wxGrid_SetDefaultCellTextColour, 534). --define(wxGrid_SetDefaultEditor, 535). --define(wxGrid_SetDefaultRenderer, 536). --define(wxGrid_SetDefaultColSize, 537). --define(wxGrid_SetDefaultRowSize, 538). --define(wxGrid_SetGridCursor, 539). --define(wxGrid_SetGridLineColour, 540). --define(wxGrid_SetLabelBackgroundColour, 541). --define(wxGrid_SetLabelFont, 542). --define(wxGrid_SetLabelTextColour, 543). --define(wxGrid_SetMargins, 544). --define(wxGrid_SetReadOnly, 545). --define(wxGrid_SetRowAttr, 546). --define(wxGrid_SetRowLabelAlignment, 547). --define(wxGrid_SetRowLabelSize, 548). --define(wxGrid_SetRowLabelValue, 549). --define(wxGrid_SetRowMinimalHeight, 550). --define(wxGrid_SetRowMinimalAcceptableHeight, 551). --define(wxGrid_SetRowSize, 552). --define(wxGrid_SetScrollLineX, 553). --define(wxGrid_SetScrollLineY, 554). --define(wxGrid_SetSelectionBackground, 555). --define(wxGrid_SetSelectionForeground, 556). --define(wxGrid_SetSelectionMode, 557). --define(wxGrid_ShowCellEditControl, 558). --define(wxGrid_XToCol, 559). --define(wxGrid_XToEdgeOfCol, 560). --define(wxGrid_YToEdgeOfRow, 561). --define(wxGrid_YToRow, 562). --define(wxGridCellRenderer_Draw, 563). --define(wxGridCellRenderer_GetBestSize, 564). --define(wxGridCellEditor_Create, 565). --define(wxGridCellEditor_IsCreated, 566). --define(wxGridCellEditor_SetSize, 567). --define(wxGridCellEditor_Show, 568). --define(wxGridCellEditor_PaintBackground, 569). --define(wxGridCellEditor_BeginEdit, 570). --define(wxGridCellEditor_EndEdit, 571). --define(wxGridCellEditor_Reset, 572). --define(wxGridCellEditor_StartingKey, 573). --define(wxGridCellEditor_StartingClick, 574). --define(wxGridCellEditor_HandleReturn, 575). --define(wxGridCellBoolRenderer_new, 576). --define(wxGridCellBoolRenderer_destroy, 577). --define(wxGridCellBoolEditor_new, 578). --define(wxGridCellBoolEditor_IsTrueValue, 579). --define(wxGridCellBoolEditor_UseStringValues, 580). --define(wxGridCellBoolEditor_destroy, 581). --define(wxGridCellFloatRenderer_new, 582). --define(wxGridCellFloatRenderer_GetPrecision, 583). --define(wxGridCellFloatRenderer_GetWidth, 584). --define(wxGridCellFloatRenderer_SetParameters, 585). --define(wxGridCellFloatRenderer_SetPrecision, 586). --define(wxGridCellFloatRenderer_SetWidth, 587). --define(wxGridCellFloatRenderer_destroy, 588). --define(wxGridCellFloatEditor_new, 589). --define(wxGridCellFloatEditor_SetParameters, 590). --define(wxGridCellFloatEditor_destroy, 591). --define(wxGridCellStringRenderer_new, 592). --define(wxGridCellStringRenderer_destroy, 593). --define(wxGridCellTextEditor_new, 594). --define(wxGridCellTextEditor_SetParameters, 595). --define(wxGridCellTextEditor_destroy, 596). --define(wxGridCellChoiceEditor_new, 598). --define(wxGridCellChoiceEditor_SetParameters, 599). --define(wxGridCellChoiceEditor_destroy, 600). --define(wxGridCellNumberRenderer_new, 601). --define(wxGridCellNumberRenderer_destroy, 602). --define(wxGridCellNumberEditor_new, 603). --define(wxGridCellNumberEditor_GetValue, 604). --define(wxGridCellNumberEditor_SetParameters, 605). --define(wxGridCellNumberEditor_destroy, 606). --define(wxGridCellAttr_SetTextColour, 607). --define(wxGridCellAttr_SetBackgroundColour, 608). --define(wxGridCellAttr_SetFont, 609). --define(wxGridCellAttr_SetAlignment, 610). --define(wxGridCellAttr_SetReadOnly, 611). --define(wxGridCellAttr_SetRenderer, 612). --define(wxGridCellAttr_SetEditor, 613). --define(wxGridCellAttr_HasTextColour, 614). --define(wxGridCellAttr_HasBackgroundColour, 615). --define(wxGridCellAttr_HasFont, 616). --define(wxGridCellAttr_HasAlignment, 617). --define(wxGridCellAttr_HasRenderer, 618). --define(wxGridCellAttr_HasEditor, 619). --define(wxGridCellAttr_GetTextColour, 620). --define(wxGridCellAttr_GetBackgroundColour, 621). --define(wxGridCellAttr_GetFont, 622). --define(wxGridCellAttr_GetAlignment, 623). --define(wxGridCellAttr_GetRenderer, 624). --define(wxGridCellAttr_GetEditor, 625). --define(wxGridCellAttr_IsReadOnly, 626). --define(wxGridCellAttr_SetDefAttr, 627). --define(wxDC_Blit, 628). --define(wxDC_CalcBoundingBox, 629). --define(wxDC_Clear, 630). --define(wxDC_ComputeScaleAndOrigin, 631). --define(wxDC_CrossHair, 632). --define(wxDC_DestroyClippingRegion, 633). --define(wxDC_DeviceToLogicalX, 634). --define(wxDC_DeviceToLogicalXRel, 635). --define(wxDC_DeviceToLogicalY, 636). --define(wxDC_DeviceToLogicalYRel, 637). --define(wxDC_DrawArc, 638). --define(wxDC_DrawBitmap, 639). --define(wxDC_DrawCheckMark, 640). --define(wxDC_DrawCircle, 641). --define(wxDC_DrawEllipse_2, 643). --define(wxDC_DrawEllipse_1, 644). --define(wxDC_DrawEllipticArc, 645). --define(wxDC_DrawIcon, 646). --define(wxDC_DrawLabel, 647). --define(wxDC_DrawLine, 648). --define(wxDC_DrawLines, 649). --define(wxDC_DrawPolygon, 651). --define(wxDC_DrawPoint, 653). --define(wxDC_DrawRectangle_2, 655). --define(wxDC_DrawRectangle_1, 656). --define(wxDC_DrawRotatedText, 657). --define(wxDC_DrawRoundedRectangle_3, 659). --define(wxDC_DrawRoundedRectangle_2, 660). --define(wxDC_DrawText, 661). --define(wxDC_EndDoc, 662). --define(wxDC_EndPage, 663). --define(wxDC_FloodFill, 664). --define(wxDC_GetBackground, 665). --define(wxDC_GetBackgroundMode, 666). --define(wxDC_GetBrush, 667). --define(wxDC_GetCharHeight, 668). --define(wxDC_GetCharWidth, 669). --define(wxDC_GetClippingBox, 670). --define(wxDC_GetFont, 672). --define(wxDC_GetLayoutDirection, 673). --define(wxDC_GetLogicalFunction, 674). --define(wxDC_GetMapMode, 675). --define(wxDC_GetMultiLineTextExtent_4, 676). --define(wxDC_GetMultiLineTextExtent_1, 677). --define(wxDC_GetPartialTextExtents, 678). --define(wxDC_GetPen, 679). --define(wxDC_GetPixel, 680). --define(wxDC_GetPPI, 681). --define(wxDC_GetSize, 683). --define(wxDC_GetSizeMM, 685). --define(wxDC_GetTextBackground, 686). --define(wxDC_GetTextExtent_4, 687). --define(wxDC_GetTextExtent_1, 688). --define(wxDC_GetTextForeground, 690). --define(wxDC_GetUserScale, 691). --define(wxDC_GradientFillConcentric_3, 692). --define(wxDC_GradientFillConcentric_4, 693). --define(wxDC_GradientFillLinear, 694). --define(wxDC_LogicalToDeviceX, 695). --define(wxDC_LogicalToDeviceXRel, 696). --define(wxDC_LogicalToDeviceY, 697). --define(wxDC_LogicalToDeviceYRel, 698). --define(wxDC_MaxX, 699). --define(wxDC_MaxY, 700). --define(wxDC_MinX, 701). --define(wxDC_MinY, 702). --define(wxDC_IsOk, 703). --define(wxDC_ResetBoundingBox, 704). --define(wxDC_SetAxisOrientation, 705). --define(wxDC_SetBackground, 706). --define(wxDC_SetBackgroundMode, 707). --define(wxDC_SetBrush, 708). --define(wxDC_SetClippingRegion_2, 710). --define(wxDC_SetClippingRegion_1_1, 711). --define(wxDC_SetClippingRegion_1_0, 712). --define(wxDC_SetDeviceOrigin, 713). --define(wxDC_SetFont, 714). --define(wxDC_SetLayoutDirection, 715). --define(wxDC_SetLogicalFunction, 716). --define(wxDC_SetMapMode, 717). --define(wxDC_SetPalette, 718). --define(wxDC_SetPen, 719). --define(wxDC_SetTextBackground, 720). --define(wxDC_SetTextForeground, 721). --define(wxDC_SetUserScale, 722). --define(wxDC_StartDoc, 723). --define(wxDC_StartPage, 724). --define(wxMirrorDC_new, 725). --define(wxMirrorDC_destroy, 726). --define(wxScreenDC_new, 727). --define(wxScreenDC_destruct, 728). --define(wxPostScriptDC_new_0, 729). --define(wxPostScriptDC_new_1, 730). --define(wxPostScriptDC_destruct, 731). --define(wxPostScriptDC_SetResolution, 732). --define(wxPostScriptDC_GetResolution, 733). --define(wxWindowDC_new_0, 734). --define(wxWindowDC_new_1, 735). --define(wxWindowDC_destruct, 736). --define(wxClientDC_new_0, 737). --define(wxClientDC_new_1, 738). --define(wxClientDC_destroy, 739). --define(wxPaintDC_new_0, 740). --define(wxPaintDC_new_1, 741). --define(wxPaintDC_destroy, 742). --define(wxMemoryDC_new_1_0, 744). --define(wxMemoryDC_new_1_1, 745). --define(wxMemoryDC_new_0, 746). --define(wxMemoryDC_destruct, 748). --define(wxMemoryDC_SelectObject, 749). --define(wxMemoryDC_SelectObjectAsSource, 750). --define(wxBufferedDC_new_0, 751). --define(wxBufferedDC_new_2, 752). --define(wxBufferedDC_new_3, 753). --define(wxBufferedDC_destruct, 754). --define(wxBufferedDC_Init_2, 755). --define(wxBufferedDC_Init_3, 756). --define(wxBufferedPaintDC_new_3, 757). --define(wxBufferedPaintDC_new_2, 758). --define(wxBufferedPaintDC_destruct, 759). --define(wxGraphicsObject_destruct, 760). --define(wxGraphicsObject_GetRenderer, 761). --define(wxGraphicsObject_IsNull, 762). --define(wxGraphicsContext_destruct, 763). --define(wxGraphicsContext_Create_1_1, 764). --define(wxGraphicsContext_Create_1_0, 765). --define(wxGraphicsContext_Create_0, 766). --define(wxGraphicsContext_CreatePen, 767). --define(wxGraphicsContext_CreateBrush, 768). --define(wxGraphicsContext_CreateRadialGradientBrush, 769). --define(wxGraphicsContext_CreateLinearGradientBrush, 770). --define(wxGraphicsContext_CreateFont, 771). --define(wxGraphicsContext_CreateMatrix, 772). --define(wxGraphicsContext_CreatePath, 773). --define(wxGraphicsContext_Clip_1, 774). --define(wxGraphicsContext_Clip_4, 775). --define(wxGraphicsContext_ResetClip, 776). --define(wxGraphicsContext_DrawBitmap, 777). --define(wxGraphicsContext_DrawEllipse, 778). --define(wxGraphicsContext_DrawIcon, 779). --define(wxGraphicsContext_DrawLines, 780). --define(wxGraphicsContext_DrawPath, 781). --define(wxGraphicsContext_DrawRectangle, 782). --define(wxGraphicsContext_DrawRoundedRectangle, 783). --define(wxGraphicsContext_DrawText_3, 784). --define(wxGraphicsContext_DrawText_4_0, 785). --define(wxGraphicsContext_DrawText_4_1, 786). --define(wxGraphicsContext_DrawText_5, 787). --define(wxGraphicsContext_FillPath, 788). --define(wxGraphicsContext_StrokePath, 789). --define(wxGraphicsContext_GetPartialTextExtents, 790). --define(wxGraphicsContext_GetTextExtent, 791). --define(wxGraphicsContext_Rotate, 792). --define(wxGraphicsContext_Scale, 793). --define(wxGraphicsContext_Translate, 794). --define(wxGraphicsContext_GetTransform, 795). --define(wxGraphicsContext_SetTransform, 796). --define(wxGraphicsContext_ConcatTransform, 797). --define(wxGraphicsContext_SetBrush_1_1, 798). --define(wxGraphicsContext_SetBrush_1_0, 799). --define(wxGraphicsContext_SetFont_1, 800). --define(wxGraphicsContext_SetFont_2, 801). --define(wxGraphicsContext_SetPen_1_0, 802). --define(wxGraphicsContext_SetPen_1_1, 803). --define(wxGraphicsContext_StrokeLine, 804). --define(wxGraphicsContext_StrokeLines, 805). --define(wxGraphicsMatrix_Concat, 807). --define(wxGraphicsMatrix_Get, 809). --define(wxGraphicsMatrix_Invert, 810). --define(wxGraphicsMatrix_IsEqual, 811). --define(wxGraphicsMatrix_IsIdentity, 813). --define(wxGraphicsMatrix_Rotate, 814). --define(wxGraphicsMatrix_Scale, 815). --define(wxGraphicsMatrix_Translate, 816). --define(wxGraphicsMatrix_Set, 817). --define(wxGraphicsMatrix_TransformPoint, 818). --define(wxGraphicsMatrix_TransformDistance, 819). --define(wxGraphicsPath_MoveToPoint_2, 820). --define(wxGraphicsPath_MoveToPoint_1, 821). --define(wxGraphicsPath_AddArc_6, 822). --define(wxGraphicsPath_AddArc_5, 823). --define(wxGraphicsPath_AddArcToPoint, 824). --define(wxGraphicsPath_AddCircle, 825). --define(wxGraphicsPath_AddCurveToPoint_6, 826). --define(wxGraphicsPath_AddCurveToPoint_3, 827). --define(wxGraphicsPath_AddEllipse, 828). --define(wxGraphicsPath_AddLineToPoint_2, 829). --define(wxGraphicsPath_AddLineToPoint_1, 830). --define(wxGraphicsPath_AddPath, 831). --define(wxGraphicsPath_AddQuadCurveToPoint, 832). --define(wxGraphicsPath_AddRectangle, 833). --define(wxGraphicsPath_AddRoundedRectangle, 834). --define(wxGraphicsPath_CloseSubpath, 835). --define(wxGraphicsPath_Contains_3, 836). --define(wxGraphicsPath_Contains_2, 837). --define(wxGraphicsPath_GetBox, 839). --define(wxGraphicsPath_GetCurrentPoint, 841). --define(wxGraphicsPath_Transform, 842). --define(wxGraphicsRenderer_GetDefaultRenderer, 843). --define(wxGraphicsRenderer_CreateContext_1_1, 844). --define(wxGraphicsRenderer_CreateContext_1_0, 845). --define(wxGraphicsRenderer_CreatePen, 846). --define(wxGraphicsRenderer_CreateBrush, 847). --define(wxGraphicsRenderer_CreateLinearGradientBrush, 848). --define(wxGraphicsRenderer_CreateRadialGradientBrush, 849). --define(wxGraphicsRenderer_CreateFont, 850). --define(wxGraphicsRenderer_CreateMatrix, 851). --define(wxGraphicsRenderer_CreatePath, 852). --define(wxMenuBar_new_1, 854). --define(wxMenuBar_new_0, 856). --define(wxMenuBar_destruct, 858). --define(wxMenuBar_Append, 859). --define(wxMenuBar_Check, 860). --define(wxMenuBar_Enable_2, 861). --define(wxMenuBar_Enable_1, 862). --define(wxMenuBar_EnableTop, 863). --define(wxMenuBar_FindMenu, 864). --define(wxMenuBar_FindMenuItem, 865). --define(wxMenuBar_FindItem, 866). --define(wxMenuBar_GetHelpString, 867). --define(wxMenuBar_GetLabel_1, 868). --define(wxMenuBar_GetLabel_0, 869). --define(wxMenuBar_GetLabelTop, 870). --define(wxMenuBar_GetMenu, 871). --define(wxMenuBar_GetMenuCount, 872). --define(wxMenuBar_Insert, 873). --define(wxMenuBar_IsChecked, 874). --define(wxMenuBar_IsEnabled_1, 875). --define(wxMenuBar_IsEnabled_0, 876). --define(wxMenuBar_Remove, 877). --define(wxMenuBar_Replace, 878). --define(wxMenuBar_SetHelpString, 879). --define(wxMenuBar_SetLabel_2, 880). --define(wxMenuBar_SetLabel_1, 881). --define(wxMenuBar_SetLabelTop, 882). --define(wxControl_GetLabel, 883). --define(wxControl_SetLabel, 884). --define(wxControlWithItems_Append_1, 885). --define(wxControlWithItems_Append_2, 886). --define(wxControlWithItems_appendStrings_1, 887). --define(wxControlWithItems_Clear, 888). --define(wxControlWithItems_Delete, 889). --define(wxControlWithItems_FindString, 890). --define(wxControlWithItems_getClientData, 891). --define(wxControlWithItems_setClientData, 892). --define(wxControlWithItems_GetCount, 893). --define(wxControlWithItems_GetSelection, 894). --define(wxControlWithItems_GetString, 895). --define(wxControlWithItems_GetStringSelection, 896). --define(wxControlWithItems_Insert_2, 897). --define(wxControlWithItems_Insert_3, 898). --define(wxControlWithItems_IsEmpty, 899). --define(wxControlWithItems_Select, 900). --define(wxControlWithItems_SetSelection, 901). --define(wxControlWithItems_SetString, 902). --define(wxControlWithItems_SetStringSelection, 903). --define(wxMenu_new_2, 906). --define(wxMenu_new_1, 907). --define(wxMenu_destruct, 909). --define(wxMenu_Append_3, 910). --define(wxMenu_Append_1, 911). --define(wxMenu_Append_4_0, 912). --define(wxMenu_Append_4_1, 913). --define(wxMenu_AppendCheckItem, 914). --define(wxMenu_AppendRadioItem, 915). --define(wxMenu_AppendSeparator, 916). --define(wxMenu_Break, 917). --define(wxMenu_Check, 918). --define(wxMenu_Delete_1_0, 919). --define(wxMenu_Delete_1_1, 920). --define(wxMenu_Destroy_1_0, 921). --define(wxMenu_Destroy_1_1, 922). --define(wxMenu_Enable, 923). --define(wxMenu_FindItem_1, 924). --define(wxMenu_FindItem_2, 925). --define(wxMenu_FindItemByPosition, 926). --define(wxMenu_GetHelpString, 927). --define(wxMenu_GetLabel, 928). --define(wxMenu_GetMenuItemCount, 929). --define(wxMenu_GetMenuItems, 930). --define(wxMenu_GetTitle, 932). --define(wxMenu_Insert_2, 933). --define(wxMenu_Insert_3, 934). --define(wxMenu_Insert_5_1, 935). --define(wxMenu_Insert_5_0, 936). --define(wxMenu_InsertCheckItem, 937). --define(wxMenu_InsertRadioItem, 938). --define(wxMenu_InsertSeparator, 939). --define(wxMenu_IsChecked, 940). --define(wxMenu_IsEnabled, 941). --define(wxMenu_Prepend_1, 942). --define(wxMenu_Prepend_2, 943). --define(wxMenu_Prepend_4_1, 944). --define(wxMenu_Prepend_4_0, 945). --define(wxMenu_PrependCheckItem, 946). --define(wxMenu_PrependRadioItem, 947). --define(wxMenu_PrependSeparator, 948). --define(wxMenu_Remove_1_0, 949). --define(wxMenu_Remove_1_1, 950). --define(wxMenu_SetHelpString, 951). --define(wxMenu_SetLabel, 952). --define(wxMenu_SetTitle, 953). --define(wxMenuItem_new, 954). --define(wxMenuItem_destruct, 956). --define(wxMenuItem_Check, 957). --define(wxMenuItem_Enable, 958). --define(wxMenuItem_GetBitmap, 959). --define(wxMenuItem_GetHelp, 960). --define(wxMenuItem_GetId, 961). --define(wxMenuItem_GetKind, 962). --define(wxMenuItem_GetLabel, 963). --define(wxMenuItem_GetLabelFromText, 964). --define(wxMenuItem_GetMenu, 965). --define(wxMenuItem_GetText, 966). --define(wxMenuItem_GetSubMenu, 967). --define(wxMenuItem_IsCheckable, 968). --define(wxMenuItem_IsChecked, 969). --define(wxMenuItem_IsEnabled, 970). --define(wxMenuItem_IsSeparator, 971). --define(wxMenuItem_IsSubMenu, 972). --define(wxMenuItem_SetBitmap, 973). --define(wxMenuItem_SetHelp, 974). --define(wxMenuItem_SetMenu, 975). --define(wxMenuItem_SetSubMenu, 976). --define(wxMenuItem_SetText, 977). --define(wxToolBar_AddControl, 978). --define(wxToolBar_AddSeparator, 979). --define(wxToolBar_AddTool_5, 980). --define(wxToolBar_AddTool_4_0, 981). --define(wxToolBar_AddTool_1, 982). --define(wxToolBar_AddTool_4_1, 983). --define(wxToolBar_AddTool_3, 984). --define(wxToolBar_AddTool_6, 985). --define(wxToolBar_AddCheckTool, 986). --define(wxToolBar_AddRadioTool, 987). --define(wxToolBar_AddStretchableSpace, 988). --define(wxToolBar_InsertStretchableSpace, 989). --define(wxToolBar_DeleteTool, 990). --define(wxToolBar_DeleteToolByPos, 991). --define(wxToolBar_EnableTool, 992). --define(wxToolBar_FindById, 993). --define(wxToolBar_FindControl, 994). --define(wxToolBar_FindToolForPosition, 995). --define(wxToolBar_GetToolSize, 996). --define(wxToolBar_GetToolBitmapSize, 997). --define(wxToolBar_GetMargins, 998). --define(wxToolBar_GetToolEnabled, 999). --define(wxToolBar_GetToolLongHelp, 1000). --define(wxToolBar_GetToolPacking, 1001). --define(wxToolBar_GetToolPos, 1002). --define(wxToolBar_GetToolSeparation, 1003). --define(wxToolBar_GetToolShortHelp, 1004). --define(wxToolBar_GetToolState, 1005). --define(wxToolBar_InsertControl, 1006). --define(wxToolBar_InsertSeparator, 1007). --define(wxToolBar_InsertTool_5, 1008). --define(wxToolBar_InsertTool_2, 1009). --define(wxToolBar_InsertTool_4, 1010). --define(wxToolBar_Realize, 1011). --define(wxToolBar_RemoveTool, 1012). --define(wxToolBar_SetMargins, 1013). --define(wxToolBar_SetToolBitmapSize, 1014). --define(wxToolBar_SetToolLongHelp, 1015). --define(wxToolBar_SetToolPacking, 1016). --define(wxToolBar_SetToolShortHelp, 1017). --define(wxToolBar_SetToolSeparation, 1018). --define(wxToolBar_ToggleTool, 1019). --define(wxStatusBar_new_0, 1021). --define(wxStatusBar_new_2, 1022). --define(wxStatusBar_destruct, 1024). --define(wxStatusBar_Create, 1025). --define(wxStatusBar_GetFieldRect, 1026). --define(wxStatusBar_GetFieldsCount, 1027). --define(wxStatusBar_GetStatusText, 1028). --define(wxStatusBar_PopStatusText, 1029). --define(wxStatusBar_PushStatusText, 1030). --define(wxStatusBar_SetFieldsCount, 1031). --define(wxStatusBar_SetMinHeight, 1032). --define(wxStatusBar_SetStatusText, 1033). --define(wxStatusBar_SetStatusWidths, 1034). --define(wxStatusBar_SetStatusStyles, 1035). --define(wxBitmap_new_0, 1036). --define(wxBitmap_new_3, 1037). --define(wxBitmap_new_4, 1038). --define(wxBitmap_new_2_0, 1039). --define(wxBitmap_new_2_1, 1040). --define(wxBitmap_destruct, 1041). --define(wxBitmap_ConvertToImage, 1042). --define(wxBitmap_CopyFromIcon, 1043). --define(wxBitmap_Create, 1044). --define(wxBitmap_GetDepth, 1045). --define(wxBitmap_GetHeight, 1046). --define(wxBitmap_GetPalette, 1047). --define(wxBitmap_GetMask, 1048). --define(wxBitmap_GetWidth, 1049). --define(wxBitmap_GetSubBitmap, 1050). --define(wxBitmap_LoadFile, 1051). --define(wxBitmap_Ok, 1052). --define(wxBitmap_SaveFile, 1053). --define(wxBitmap_SetDepth, 1054). --define(wxBitmap_SetHeight, 1055). --define(wxBitmap_SetMask, 1056). --define(wxBitmap_SetPalette, 1057). --define(wxBitmap_SetWidth, 1058). --define(wxIcon_new_0, 1059). --define(wxIcon_new_2, 1060). --define(wxIcon_new_1, 1061). --define(wxIcon_CopyFromBitmap, 1062). --define(wxIcon_destroy, 1063). --define(wxIconBundle_new_0, 1064). --define(wxIconBundle_new_2, 1065). --define(wxIconBundle_new_1_0, 1066). --define(wxIconBundle_new_1_1, 1067). --define(wxIconBundle_destruct, 1068). --define(wxIconBundle_AddIcon_2, 1069). --define(wxIconBundle_AddIcon_1, 1070). --define(wxIconBundle_GetIcon_1_1, 1071). --define(wxIconBundle_GetIcon_1_0, 1072). --define(wxCursor_new_0, 1073). --define(wxCursor_new_1_0, 1074). --define(wxCursor_new_1_1, 1075). --define(wxCursor_new_4, 1076). --define(wxCursor_destruct, 1077). --define(wxCursor_Ok, 1078). --define(wxMask_new_0, 1079). --define(wxMask_new_2_1, 1080). --define(wxMask_new_2_0, 1081). --define(wxMask_new_1, 1082). --define(wxMask_destruct, 1083). --define(wxMask_Create_2_1, 1084). --define(wxMask_Create_2_0, 1085). --define(wxMask_Create_1, 1086). --define(wxImage_new_0, 1087). --define(wxImage_new_3_0, 1088). --define(wxImage_new_4, 1089). --define(wxImage_new_5, 1090). --define(wxImage_new_2, 1091). --define(wxImage_new_3_1, 1092). --define(wxImage_Blur, 1093). --define(wxImage_BlurHorizontal, 1094). --define(wxImage_BlurVertical, 1095). --define(wxImage_ConvertAlphaToMask, 1096). --define(wxImage_ConvertToGreyscale, 1097). --define(wxImage_ConvertToMono, 1098). --define(wxImage_Copy, 1099). --define(wxImage_Create_3, 1100). --define(wxImage_Create_4, 1101). --define(wxImage_Create_5, 1102). --define(wxImage_Destroy, 1103). --define(wxImage_FindFirstUnusedColour, 1104). --define(wxImage_GetImageExtWildcard, 1105). --define(wxImage_GetAlpha_2, 1106). --define(wxImage_GetAlpha_0, 1107). --define(wxImage_GetBlue, 1108). --define(wxImage_GetData, 1109). --define(wxImage_GetGreen, 1110). --define(wxImage_GetImageCount, 1111). --define(wxImage_GetHeight, 1112). --define(wxImage_GetMaskBlue, 1113). --define(wxImage_GetMaskGreen, 1114). --define(wxImage_GetMaskRed, 1115). --define(wxImage_GetOrFindMaskColour, 1116). --define(wxImage_GetPalette, 1117). --define(wxImage_GetRed, 1118). --define(wxImage_GetSubImage, 1119). --define(wxImage_GetWidth, 1120). --define(wxImage_HasAlpha, 1121). --define(wxImage_HasMask, 1122). --define(wxImage_GetOption, 1123). --define(wxImage_GetOptionInt, 1124). --define(wxImage_HasOption, 1125). --define(wxImage_InitAlpha, 1126). --define(wxImage_InitStandardHandlers, 1127). --define(wxImage_IsTransparent, 1128). --define(wxImage_LoadFile_2, 1129). --define(wxImage_LoadFile_3, 1130). --define(wxImage_Ok, 1131). --define(wxImage_RemoveHandler, 1132). --define(wxImage_Mirror, 1133). --define(wxImage_Replace, 1134). --define(wxImage_Rescale, 1135). --define(wxImage_Resize, 1136). --define(wxImage_Rotate, 1137). --define(wxImage_RotateHue, 1138). --define(wxImage_Rotate90, 1139). --define(wxImage_SaveFile_1, 1140). --define(wxImage_SaveFile_2_0, 1141). --define(wxImage_SaveFile_2_1, 1142). --define(wxImage_Scale, 1143). --define(wxImage_Size, 1144). --define(wxImage_SetAlpha_3, 1145). --define(wxImage_SetAlpha_2, 1146). --define(wxImage_SetData_2, 1147). --define(wxImage_SetData_4, 1148). --define(wxImage_SetMask, 1149). --define(wxImage_SetMaskColour, 1150). --define(wxImage_SetMaskFromImage, 1151). --define(wxImage_SetOption_2_1, 1152). --define(wxImage_SetOption_2_0, 1153). --define(wxImage_SetPalette, 1154). --define(wxImage_SetRGB_5, 1155). --define(wxImage_SetRGB_4, 1156). --define(wxImage_destroy, 1157). --define(wxBrush_new_0, 1158). --define(wxBrush_new_2, 1159). --define(wxBrush_new_1, 1160). --define(wxBrush_destruct, 1162). --define(wxBrush_GetColour, 1163). --define(wxBrush_GetStipple, 1164). --define(wxBrush_GetStyle, 1165). --define(wxBrush_IsHatch, 1166). --define(wxBrush_IsOk, 1167). --define(wxBrush_SetColour_1, 1168). --define(wxBrush_SetColour_3, 1169). --define(wxBrush_SetStipple, 1170). --define(wxBrush_SetStyle, 1171). --define(wxPen_new_0, 1172). --define(wxPen_new_2, 1173). --define(wxPen_destruct, 1174). --define(wxPen_GetCap, 1175). --define(wxPen_GetColour, 1176). --define(wxPen_GetJoin, 1177). --define(wxPen_GetStyle, 1178). --define(wxPen_GetWidth, 1179). --define(wxPen_IsOk, 1180). --define(wxPen_SetCap, 1181). --define(wxPen_SetColour_1, 1182). --define(wxPen_SetColour_3, 1183). --define(wxPen_SetJoin, 1184). --define(wxPen_SetStyle, 1185). --define(wxPen_SetWidth, 1186). --define(wxRegion_new_0, 1187). --define(wxRegion_new_4, 1188). --define(wxRegion_new_2, 1189). --define(wxRegion_new_1_1, 1190). --define(wxRegion_new_1_0, 1192). --define(wxRegion_destruct, 1194). --define(wxRegion_Clear, 1195). --define(wxRegion_Contains_2, 1196). --define(wxRegion_Contains_1_0, 1197). --define(wxRegion_Contains_4, 1198). --define(wxRegion_Contains_1_1, 1199). --define(wxRegion_ConvertToBitmap, 1200). --define(wxRegion_GetBox, 1201). --define(wxRegion_Intersect_4, 1202). --define(wxRegion_Intersect_1_1, 1203). --define(wxRegion_Intersect_1_0, 1204). --define(wxRegion_IsEmpty, 1205). --define(wxRegion_Subtract_4, 1206). --define(wxRegion_Subtract_1_1, 1207). --define(wxRegion_Subtract_1_0, 1208). --define(wxRegion_Offset_2, 1209). --define(wxRegion_Offset_1, 1210). --define(wxRegion_Union_4, 1211). --define(wxRegion_Union_1_2, 1212). --define(wxRegion_Union_1_1, 1213). --define(wxRegion_Union_1_0, 1214). --define(wxRegion_Union_3, 1215). --define(wxRegion_Xor_4, 1216). --define(wxRegion_Xor_1_1, 1217). --define(wxRegion_Xor_1_0, 1218). --define(wxAcceleratorTable_new_0, 1219). --define(wxAcceleratorTable_new_2, 1220). --define(wxAcceleratorTable_destruct, 1221). --define(wxAcceleratorTable_Ok, 1222). --define(wxAcceleratorEntry_new_1_0, 1223). --define(wxAcceleratorEntry_new_1_1, 1224). --define(wxAcceleratorEntry_GetCommand, 1225). --define(wxAcceleratorEntry_GetFlags, 1226). --define(wxAcceleratorEntry_GetKeyCode, 1227). --define(wxAcceleratorEntry_Set, 1228). --define(wxAcceleratorEntry_destroy, 1229). --define(wxCaret_new_3, 1234). --define(wxCaret_new_2, 1235). --define(wxCaret_destruct, 1237). --define(wxCaret_Create_3, 1238). --define(wxCaret_Create_2, 1239). --define(wxCaret_GetBlinkTime, 1240). --define(wxCaret_GetPosition, 1242). --define(wxCaret_GetSize, 1244). --define(wxCaret_GetWindow, 1245). --define(wxCaret_Hide, 1246). --define(wxCaret_IsOk, 1247). --define(wxCaret_IsVisible, 1248). --define(wxCaret_Move_2, 1249). --define(wxCaret_Move_1, 1250). --define(wxCaret_SetBlinkTime, 1251). --define(wxCaret_SetSize_2, 1252). --define(wxCaret_SetSize_1, 1253). --define(wxCaret_Show, 1254). --define(wxSizer_Add_2_1, 1255). --define(wxSizer_Add_2_0, 1256). --define(wxSizer_Add_3, 1257). --define(wxSizer_Add_2_3, 1258). --define(wxSizer_Add_2_2, 1259). --define(wxSizer_AddSpacer, 1260). --define(wxSizer_AddStretchSpacer, 1261). --define(wxSizer_CalcMin, 1262). --define(wxSizer_Clear, 1263). --define(wxSizer_Detach_1_2, 1264). --define(wxSizer_Detach_1_1, 1265). --define(wxSizer_Detach_1_0, 1266). --define(wxSizer_Fit, 1267). --define(wxSizer_FitInside, 1268). --define(wxSizer_GetChildren, 1269). --define(wxSizer_GetItem_2_1, 1270). --define(wxSizer_GetItem_2_0, 1271). --define(wxSizer_GetItem_1, 1272). --define(wxSizer_GetSize, 1273). --define(wxSizer_GetPosition, 1274). --define(wxSizer_GetMinSize, 1275). --define(wxSizer_Hide_2_0, 1276). --define(wxSizer_Hide_2_1, 1277). --define(wxSizer_Hide_1, 1278). --define(wxSizer_Insert_3_1, 1279). --define(wxSizer_Insert_3_0, 1280). --define(wxSizer_Insert_4, 1281). --define(wxSizer_Insert_3_3, 1282). --define(wxSizer_Insert_3_2, 1283). --define(wxSizer_Insert_2, 1284). --define(wxSizer_InsertSpacer, 1285). --define(wxSizer_InsertStretchSpacer, 1286). --define(wxSizer_IsShown_1_2, 1287). --define(wxSizer_IsShown_1_1, 1288). --define(wxSizer_IsShown_1_0, 1289). --define(wxSizer_Layout, 1290). --define(wxSizer_Prepend_2_1, 1291). --define(wxSizer_Prepend_2_0, 1292). --define(wxSizer_Prepend_3, 1293). --define(wxSizer_Prepend_2_3, 1294). --define(wxSizer_Prepend_2_2, 1295). --define(wxSizer_Prepend_1, 1296). --define(wxSizer_PrependSpacer, 1297). --define(wxSizer_PrependStretchSpacer, 1298). --define(wxSizer_RecalcSizes, 1299). --define(wxSizer_Remove_1_1, 1300). --define(wxSizer_Remove_1_0, 1301). --define(wxSizer_Replace_3_1, 1302). --define(wxSizer_Replace_3_0, 1303). --define(wxSizer_Replace_2, 1304). --define(wxSizer_SetDimension, 1305). --define(wxSizer_SetMinSize_2, 1306). --define(wxSizer_SetMinSize_1, 1307). --define(wxSizer_SetItemMinSize_3_2, 1308). --define(wxSizer_SetItemMinSize_2_2, 1309). --define(wxSizer_SetItemMinSize_3_1, 1310). --define(wxSizer_SetItemMinSize_2_1, 1311). --define(wxSizer_SetItemMinSize_3_0, 1312). --define(wxSizer_SetItemMinSize_2_0, 1313). --define(wxSizer_SetSizeHints, 1314). --define(wxSizer_SetVirtualSizeHints, 1315). --define(wxSizer_Show_2_2, 1316). --define(wxSizer_Show_2_1, 1317). --define(wxSizer_Show_2_0, 1318). --define(wxSizer_Show_1, 1319). --define(wxSizerFlags_new, 1320). --define(wxSizerFlags_Align, 1321). --define(wxSizerFlags_Border_2, 1322). --define(wxSizerFlags_Border_1, 1323). --define(wxSizerFlags_Center, 1324). --define(wxSizerFlags_Centre, 1325). --define(wxSizerFlags_Expand, 1326). --define(wxSizerFlags_Left, 1327). --define(wxSizerFlags_Proportion, 1328). --define(wxSizerFlags_Right, 1329). --define(wxSizerFlags_destroy, 1330). --define(wxSizerItem_new_5_1, 1331). --define(wxSizerItem_new_2_1, 1332). --define(wxSizerItem_new_5_0, 1333). --define(wxSizerItem_new_2_0, 1334). --define(wxSizerItem_new_6, 1335). --define(wxSizerItem_new_3, 1336). --define(wxSizerItem_new_0, 1337). --define(wxSizerItem_destruct, 1338). --define(wxSizerItem_CalcMin, 1339). --define(wxSizerItem_DeleteWindows, 1340). --define(wxSizerItem_DetachSizer, 1341). --define(wxSizerItem_GetBorder, 1342). --define(wxSizerItem_GetFlag, 1343). --define(wxSizerItem_GetMinSize, 1344). --define(wxSizerItem_GetPosition, 1345). --define(wxSizerItem_GetProportion, 1346). --define(wxSizerItem_GetRatio, 1347). --define(wxSizerItem_GetRect, 1348). --define(wxSizerItem_GetSize, 1349). --define(wxSizerItem_GetSizer, 1350). --define(wxSizerItem_GetSpacer, 1351). --define(wxSizerItem_GetUserData, 1352). --define(wxSizerItem_GetWindow, 1353). --define(wxSizerItem_IsSizer, 1354). --define(wxSizerItem_IsShown, 1355). --define(wxSizerItem_IsSpacer, 1356). --define(wxSizerItem_IsWindow, 1357). --define(wxSizerItem_SetBorder, 1358). --define(wxSizerItem_SetDimension, 1359). --define(wxSizerItem_SetFlag, 1360). --define(wxSizerItem_SetInitSize, 1361). --define(wxSizerItem_SetMinSize_1, 1362). --define(wxSizerItem_SetMinSize_2, 1363). --define(wxSizerItem_SetProportion, 1364). --define(wxSizerItem_SetRatio_2, 1365). --define(wxSizerItem_SetRatio_1_1, 1366). --define(wxSizerItem_SetRatio_1_0, 1367). --define(wxSizerItem_SetSizer, 1368). --define(wxSizerItem_SetSpacer_1, 1369). --define(wxSizerItem_SetSpacer_2, 1370). --define(wxSizerItem_SetWindow, 1371). --define(wxSizerItem_Show, 1372). --define(wxBoxSizer_new, 1373). --define(wxBoxSizer_GetOrientation, 1374). --define(wxBoxSizer_destroy, 1375). --define(wxStaticBoxSizer_new_2, 1376). --define(wxStaticBoxSizer_new_3, 1377). --define(wxStaticBoxSizer_GetStaticBox, 1378). --define(wxStaticBoxSizer_destroy, 1379). --define(wxGridSizer_new_4, 1380). --define(wxGridSizer_new_2, 1381). --define(wxGridSizer_GetCols, 1382). --define(wxGridSizer_GetHGap, 1383). --define(wxGridSizer_GetRows, 1384). --define(wxGridSizer_GetVGap, 1385). --define(wxGridSizer_SetCols, 1386). --define(wxGridSizer_SetHGap, 1387). --define(wxGridSizer_SetRows, 1388). --define(wxGridSizer_SetVGap, 1389). --define(wxGridSizer_destroy, 1390). --define(wxFlexGridSizer_new_4, 1391). --define(wxFlexGridSizer_new_2, 1392). --define(wxFlexGridSizer_AddGrowableCol, 1393). --define(wxFlexGridSizer_AddGrowableRow, 1394). --define(wxFlexGridSizer_GetFlexibleDirection, 1395). --define(wxFlexGridSizer_GetNonFlexibleGrowMode, 1396). --define(wxFlexGridSizer_RemoveGrowableCol, 1397). --define(wxFlexGridSizer_RemoveGrowableRow, 1398). --define(wxFlexGridSizer_SetFlexibleDirection, 1399). --define(wxFlexGridSizer_SetNonFlexibleGrowMode, 1400). --define(wxFlexGridSizer_destroy, 1401). --define(wxGridBagSizer_new, 1402). --define(wxGridBagSizer_Add_3_2, 1403). --define(wxGridBagSizer_Add_3_1, 1404). --define(wxGridBagSizer_Add_4, 1405). --define(wxGridBagSizer_Add_1_0, 1406). --define(wxGridBagSizer_Add_2_1, 1407). --define(wxGridBagSizer_Add_2_0, 1408). --define(wxGridBagSizer_Add_3_0, 1409). --define(wxGridBagSizer_Add_1_1, 1410). --define(wxGridBagSizer_CalcMin, 1411). --define(wxGridBagSizer_CheckForIntersection_2, 1412). --define(wxGridBagSizer_CheckForIntersection_3, 1413). --define(wxGridBagSizer_FindItem_1_1, 1414). --define(wxGridBagSizer_FindItem_1_0, 1415). --define(wxGridBagSizer_FindItemAtPoint, 1416). --define(wxGridBagSizer_FindItemAtPosition, 1417). --define(wxGridBagSizer_FindItemWithData, 1418). --define(wxGridBagSizer_GetCellSize, 1419). --define(wxGridBagSizer_GetEmptyCellSize, 1420). --define(wxGridBagSizer_GetItemPosition_1_2, 1421). --define(wxGridBagSizer_GetItemPosition_1_1, 1422). --define(wxGridBagSizer_GetItemPosition_1_0, 1423). --define(wxGridBagSizer_GetItemSpan_1_2, 1424). --define(wxGridBagSizer_GetItemSpan_1_1, 1425). --define(wxGridBagSizer_GetItemSpan_1_0, 1426). --define(wxGridBagSizer_SetEmptyCellSize, 1427). --define(wxGridBagSizer_SetItemPosition_2_2, 1428). --define(wxGridBagSizer_SetItemPosition_2_1, 1429). --define(wxGridBagSizer_SetItemPosition_2_0, 1430). --define(wxGridBagSizer_SetItemSpan_2_2, 1431). --define(wxGridBagSizer_SetItemSpan_2_1, 1432). --define(wxGridBagSizer_SetItemSpan_2_0, 1433). --define(wxGridBagSizer_destroy, 1434). --define(wxStdDialogButtonSizer_new, 1435). --define(wxStdDialogButtonSizer_AddButton, 1436). --define(wxStdDialogButtonSizer_Realize, 1437). --define(wxStdDialogButtonSizer_SetAffirmativeButton, 1438). --define(wxStdDialogButtonSizer_SetCancelButton, 1439). --define(wxStdDialogButtonSizer_SetNegativeButton, 1440). --define(wxStdDialogButtonSizer_destroy, 1441). --define(wxFont_new_0, 1442). --define(wxFont_new_1, 1443). --define(wxFont_new_5, 1444). --define(wxFont_destruct, 1446). --define(wxFont_IsFixedWidth, 1447). --define(wxFont_GetDefaultEncoding, 1448). --define(wxFont_GetFaceName, 1449). --define(wxFont_GetFamily, 1450). --define(wxFont_GetNativeFontInfoDesc, 1451). --define(wxFont_GetNativeFontInfoUserDesc, 1452). --define(wxFont_GetPointSize, 1453). --define(wxFont_GetStyle, 1454). --define(wxFont_GetUnderlined, 1455). --define(wxFont_GetWeight, 1456). --define(wxFont_Ok, 1457). --define(wxFont_SetDefaultEncoding, 1458). --define(wxFont_SetFaceName, 1459). --define(wxFont_SetFamily, 1460). --define(wxFont_SetPointSize, 1461). --define(wxFont_SetStyle, 1462). --define(wxFont_SetUnderlined, 1463). --define(wxFont_SetWeight, 1464). --define(wxToolTip_Enable, 1465). --define(wxToolTip_SetDelay, 1466). --define(wxToolTip_new, 1467). --define(wxToolTip_SetTip, 1468). --define(wxToolTip_GetTip, 1469). --define(wxToolTip_GetWindow, 1470). --define(wxToolTip_destroy, 1471). --define(wxButton_new_3, 1473). --define(wxButton_new_0, 1474). --define(wxButton_destruct, 1475). --define(wxButton_Create, 1476). --define(wxButton_GetDefaultSize, 1477). --define(wxButton_SetDefault, 1478). --define(wxButton_SetLabel, 1479). --define(wxBitmapButton_new_4, 1481). --define(wxBitmapButton_new_0, 1482). --define(wxBitmapButton_Create, 1483). --define(wxBitmapButton_GetBitmapDisabled, 1484). --define(wxBitmapButton_GetBitmapFocus, 1486). --define(wxBitmapButton_GetBitmapLabel, 1488). --define(wxBitmapButton_GetBitmapSelected, 1490). --define(wxBitmapButton_SetBitmapDisabled, 1492). --define(wxBitmapButton_SetBitmapFocus, 1493). --define(wxBitmapButton_SetBitmapLabel, 1494). --define(wxBitmapButton_SetBitmapSelected, 1495). --define(wxBitmapButton_destroy, 1496). --define(wxToggleButton_new_0, 1497). --define(wxToggleButton_new_4, 1498). --define(wxToggleButton_Create, 1499). --define(wxToggleButton_GetValue, 1500). --define(wxToggleButton_SetValue, 1501). --define(wxToggleButton_destroy, 1502). --define(wxCalendarCtrl_new_0, 1503). --define(wxCalendarCtrl_new_3, 1504). --define(wxCalendarCtrl_Create, 1505). --define(wxCalendarCtrl_destruct, 1506). --define(wxCalendarCtrl_SetDate, 1507). --define(wxCalendarCtrl_GetDate, 1508). --define(wxCalendarCtrl_EnableYearChange, 1509). --define(wxCalendarCtrl_EnableMonthChange, 1510). --define(wxCalendarCtrl_EnableHolidayDisplay, 1511). --define(wxCalendarCtrl_SetHeaderColours, 1512). --define(wxCalendarCtrl_GetHeaderColourFg, 1513). --define(wxCalendarCtrl_GetHeaderColourBg, 1514). --define(wxCalendarCtrl_SetHighlightColours, 1515). --define(wxCalendarCtrl_GetHighlightColourFg, 1516). --define(wxCalendarCtrl_GetHighlightColourBg, 1517). --define(wxCalendarCtrl_SetHolidayColours, 1518). --define(wxCalendarCtrl_GetHolidayColourFg, 1519). --define(wxCalendarCtrl_GetHolidayColourBg, 1520). --define(wxCalendarCtrl_GetAttr, 1521). --define(wxCalendarCtrl_SetAttr, 1522). --define(wxCalendarCtrl_SetHoliday, 1523). --define(wxCalendarCtrl_ResetAttr, 1524). --define(wxCalendarCtrl_HitTest, 1525). --define(wxCalendarDateAttr_new_0, 1526). --define(wxCalendarDateAttr_new_2_1, 1527). --define(wxCalendarDateAttr_new_2_0, 1528). --define(wxCalendarDateAttr_SetTextColour, 1529). --define(wxCalendarDateAttr_SetBackgroundColour, 1530). --define(wxCalendarDateAttr_SetBorderColour, 1531). --define(wxCalendarDateAttr_SetFont, 1532). --define(wxCalendarDateAttr_SetBorder, 1533). --define(wxCalendarDateAttr_SetHoliday, 1534). --define(wxCalendarDateAttr_HasTextColour, 1535). --define(wxCalendarDateAttr_HasBackgroundColour, 1536). --define(wxCalendarDateAttr_HasBorderColour, 1537). --define(wxCalendarDateAttr_HasFont, 1538). --define(wxCalendarDateAttr_HasBorder, 1539). --define(wxCalendarDateAttr_IsHoliday, 1540). --define(wxCalendarDateAttr_GetTextColour, 1541). --define(wxCalendarDateAttr_GetBackgroundColour, 1542). --define(wxCalendarDateAttr_GetBorderColour, 1543). --define(wxCalendarDateAttr_GetFont, 1544). --define(wxCalendarDateAttr_GetBorder, 1545). --define(wxCalendarDateAttr_destroy, 1546). --define(wxCheckBox_new_4, 1548). --define(wxCheckBox_new_0, 1549). --define(wxCheckBox_Create, 1550). --define(wxCheckBox_GetValue, 1551). --define(wxCheckBox_Get3StateValue, 1552). --define(wxCheckBox_Is3rdStateAllowedForUser, 1553). --define(wxCheckBox_Is3State, 1554). --define(wxCheckBox_IsChecked, 1555). --define(wxCheckBox_SetValue, 1556). --define(wxCheckBox_Set3StateValue, 1557). --define(wxCheckBox_destroy, 1558). --define(wxCheckListBox_new_0, 1559). --define(wxCheckListBox_new_3, 1561). --define(wxCheckListBox_Check, 1562). --define(wxCheckListBox_IsChecked, 1563). --define(wxCheckListBox_destroy, 1564). --define(wxChoice_new_3, 1567). --define(wxChoice_new_0, 1568). --define(wxChoice_destruct, 1570). --define(wxChoice_Create, 1572). --define(wxChoice_Delete, 1573). --define(wxChoice_GetColumns, 1574). --define(wxChoice_SetColumns, 1575). --define(wxComboBox_new_0, 1576). --define(wxComboBox_new_3, 1578). --define(wxComboBox_destruct, 1579). --define(wxComboBox_Create, 1581). --define(wxComboBox_CanCopy, 1582). --define(wxComboBox_CanCut, 1583). --define(wxComboBox_CanPaste, 1584). --define(wxComboBox_CanRedo, 1585). --define(wxComboBox_CanUndo, 1586). --define(wxComboBox_Copy, 1587). --define(wxComboBox_Cut, 1588). --define(wxComboBox_GetInsertionPoint, 1589). --define(wxComboBox_GetLastPosition, 1590). --define(wxComboBox_GetValue, 1591). --define(wxComboBox_Paste, 1592). --define(wxComboBox_Redo, 1593). --define(wxComboBox_Replace, 1594). --define(wxComboBox_Remove, 1595). --define(wxComboBox_SetInsertionPoint, 1596). --define(wxComboBox_SetInsertionPointEnd, 1597). --define(wxComboBox_SetSelection_1, 1598). --define(wxComboBox_SetSelection_2, 1599). --define(wxComboBox_SetValue, 1600). --define(wxComboBox_Undo, 1601). --define(wxGauge_new_0, 1602). --define(wxGauge_new_4, 1603). --define(wxGauge_Create, 1604). --define(wxGauge_GetRange, 1605). --define(wxGauge_GetValue, 1606). --define(wxGauge_IsVertical, 1607). --define(wxGauge_SetRange, 1608). --define(wxGauge_SetValue, 1609). --define(wxGauge_Pulse, 1610). --define(wxGauge_destroy, 1611). --define(wxGenericDirCtrl_new_0, 1612). --define(wxGenericDirCtrl_new_2, 1613). --define(wxGenericDirCtrl_destruct, 1614). --define(wxGenericDirCtrl_Create, 1615). --define(wxGenericDirCtrl_Init, 1616). --define(wxGenericDirCtrl_CollapseTree, 1617). --define(wxGenericDirCtrl_ExpandPath, 1618). --define(wxGenericDirCtrl_GetDefaultPath, 1619). --define(wxGenericDirCtrl_GetPath, 1620). --define(wxGenericDirCtrl_GetFilePath, 1621). --define(wxGenericDirCtrl_GetFilter, 1622). --define(wxGenericDirCtrl_GetFilterIndex, 1623). --define(wxGenericDirCtrl_GetRootId, 1624). --define(wxGenericDirCtrl_GetTreeCtrl, 1625). --define(wxGenericDirCtrl_ReCreateTree, 1626). --define(wxGenericDirCtrl_SetDefaultPath, 1627). --define(wxGenericDirCtrl_SetFilter, 1628). --define(wxGenericDirCtrl_SetFilterIndex, 1629). --define(wxGenericDirCtrl_SetPath, 1630). --define(wxStaticBox_new_4, 1632). --define(wxStaticBox_new_0, 1633). --define(wxStaticBox_Create, 1634). --define(wxStaticBox_destroy, 1635). --define(wxStaticLine_new_2, 1637). --define(wxStaticLine_new_0, 1638). --define(wxStaticLine_Create, 1639). --define(wxStaticLine_IsVertical, 1640). --define(wxStaticLine_GetDefaultSize, 1641). --define(wxStaticLine_destroy, 1642). --define(wxListBox_new_3, 1645). --define(wxListBox_new_0, 1646). --define(wxListBox_destruct, 1648). --define(wxListBox_Create, 1650). --define(wxListBox_Deselect, 1651). --define(wxListBox_GetSelections, 1652). --define(wxListBox_InsertItems, 1653). --define(wxListBox_IsSelected, 1654). --define(wxListBox_Set, 1655). --define(wxListBox_HitTest, 1656). --define(wxListBox_SetFirstItem_1_0, 1657). --define(wxListBox_SetFirstItem_1_1, 1658). --define(wxListCtrl_new_0, 1659). --define(wxListCtrl_new_2, 1660). --define(wxListCtrl_Arrange, 1661). --define(wxListCtrl_AssignImageList, 1662). --define(wxListCtrl_ClearAll, 1663). --define(wxListCtrl_Create, 1664). --define(wxListCtrl_DeleteAllItems, 1665). --define(wxListCtrl_DeleteColumn, 1666). --define(wxListCtrl_DeleteItem, 1667). --define(wxListCtrl_EditLabel, 1668). --define(wxListCtrl_EnsureVisible, 1669). --define(wxListCtrl_FindItem_3_0, 1670). --define(wxListCtrl_FindItem_3_1, 1671). --define(wxListCtrl_GetColumn, 1672). --define(wxListCtrl_GetColumnCount, 1673). --define(wxListCtrl_GetColumnWidth, 1674). --define(wxListCtrl_GetCountPerPage, 1675). --define(wxListCtrl_GetEditControl, 1676). --define(wxListCtrl_GetImageList, 1677). --define(wxListCtrl_GetItem, 1678). --define(wxListCtrl_GetItemBackgroundColour, 1679). --define(wxListCtrl_GetItemCount, 1680). --define(wxListCtrl_GetItemData, 1681). --define(wxListCtrl_GetItemFont, 1682). --define(wxListCtrl_GetItemPosition, 1683). --define(wxListCtrl_GetItemRect, 1684). --define(wxListCtrl_GetItemSpacing, 1685). --define(wxListCtrl_GetItemState, 1686). --define(wxListCtrl_GetItemText, 1687). --define(wxListCtrl_GetItemTextColour, 1688). --define(wxListCtrl_GetNextItem, 1689). --define(wxListCtrl_GetSelectedItemCount, 1690). --define(wxListCtrl_GetTextColour, 1691). --define(wxListCtrl_GetTopItem, 1692). --define(wxListCtrl_GetViewRect, 1693). --define(wxListCtrl_HitTest, 1694). --define(wxListCtrl_InsertColumn_2, 1695). --define(wxListCtrl_InsertColumn_3, 1696). --define(wxListCtrl_InsertItem_1, 1697). --define(wxListCtrl_InsertItem_2_1, 1698). --define(wxListCtrl_InsertItem_2_0, 1699). --define(wxListCtrl_InsertItem_3, 1700). --define(wxListCtrl_RefreshItem, 1701). --define(wxListCtrl_RefreshItems, 1702). --define(wxListCtrl_ScrollList, 1703). --define(wxListCtrl_SetBackgroundColour, 1704). --define(wxListCtrl_SetColumn, 1705). --define(wxListCtrl_SetColumnWidth, 1706). --define(wxListCtrl_SetImageList, 1707). --define(wxListCtrl_SetItem_1, 1708). --define(wxListCtrl_SetItem_4, 1709). --define(wxListCtrl_SetItemBackgroundColour, 1710). --define(wxListCtrl_SetItemCount, 1711). --define(wxListCtrl_SetItemData, 1712). --define(wxListCtrl_SetItemFont, 1713). --define(wxListCtrl_SetItemImage, 1714). --define(wxListCtrl_SetItemColumnImage, 1715). --define(wxListCtrl_SetItemPosition, 1716). --define(wxListCtrl_SetItemState, 1717). --define(wxListCtrl_SetItemText, 1718). --define(wxListCtrl_SetItemTextColour, 1719). --define(wxListCtrl_SetSingleStyle, 1720). --define(wxListCtrl_SetTextColour, 1721). --define(wxListCtrl_SetWindowStyleFlag, 1722). --define(wxListCtrl_SortItems, 1723). --define(wxListCtrl_destroy, 1724). --define(wxListView_ClearColumnImage, 1725). --define(wxListView_Focus, 1726). --define(wxListView_GetFirstSelected, 1727). --define(wxListView_GetFocusedItem, 1728). --define(wxListView_GetNextSelected, 1729). --define(wxListView_IsSelected, 1730). --define(wxListView_Select, 1731). --define(wxListView_SetColumnImage, 1732). --define(wxListItem_new_0, 1733). --define(wxListItem_new_1, 1734). --define(wxListItem_destruct, 1735). --define(wxListItem_Clear, 1736). --define(wxListItem_GetAlign, 1737). --define(wxListItem_GetBackgroundColour, 1738). --define(wxListItem_GetColumn, 1739). --define(wxListItem_GetFont, 1740). --define(wxListItem_GetId, 1741). --define(wxListItem_GetImage, 1742). --define(wxListItem_GetMask, 1743). --define(wxListItem_GetState, 1744). --define(wxListItem_GetText, 1745). --define(wxListItem_GetTextColour, 1746). --define(wxListItem_GetWidth, 1747). --define(wxListItem_SetAlign, 1748). --define(wxListItem_SetBackgroundColour, 1749). --define(wxListItem_SetColumn, 1750). --define(wxListItem_SetFont, 1751). --define(wxListItem_SetId, 1752). --define(wxListItem_SetImage, 1753). --define(wxListItem_SetMask, 1754). --define(wxListItem_SetState, 1755). --define(wxListItem_SetStateMask, 1756). --define(wxListItem_SetText, 1757). --define(wxListItem_SetTextColour, 1758). --define(wxListItem_SetWidth, 1759). --define(wxListItemAttr_new_0, 1760). --define(wxListItemAttr_new_3, 1761). --define(wxListItemAttr_GetBackgroundColour, 1762). --define(wxListItemAttr_GetFont, 1763). --define(wxListItemAttr_GetTextColour, 1764). --define(wxListItemAttr_HasBackgroundColour, 1765). --define(wxListItemAttr_HasFont, 1766). --define(wxListItemAttr_HasTextColour, 1767). --define(wxListItemAttr_SetBackgroundColour, 1768). --define(wxListItemAttr_SetFont, 1769). --define(wxListItemAttr_SetTextColour, 1770). --define(wxListItemAttr_destroy, 1771). --define(wxImageList_new_0, 1772). --define(wxImageList_new_3, 1773). --define(wxImageList_Add_1, 1774). --define(wxImageList_Add_2_0, 1775). --define(wxImageList_Add_2_1, 1776). --define(wxImageList_Create, 1777). --define(wxImageList_Draw, 1779). --define(wxImageList_GetBitmap, 1780). --define(wxImageList_GetIcon, 1781). --define(wxImageList_GetImageCount, 1782). --define(wxImageList_GetSize, 1783). --define(wxImageList_Remove, 1784). --define(wxImageList_RemoveAll, 1785). --define(wxImageList_Replace_2, 1786). --define(wxImageList_Replace_3, 1787). --define(wxImageList_destroy, 1788). --define(wxTextAttr_new_0, 1789). --define(wxTextAttr_new_2, 1790). --define(wxTextAttr_GetAlignment, 1791). --define(wxTextAttr_GetBackgroundColour, 1792). --define(wxTextAttr_GetFont, 1793). --define(wxTextAttr_GetLeftIndent, 1794). --define(wxTextAttr_GetLeftSubIndent, 1795). --define(wxTextAttr_GetRightIndent, 1796). --define(wxTextAttr_GetTabs, 1797). --define(wxTextAttr_GetTextColour, 1798). --define(wxTextAttr_HasBackgroundColour, 1799). --define(wxTextAttr_HasFont, 1800). --define(wxTextAttr_HasTextColour, 1801). --define(wxTextAttr_GetFlags, 1802). --define(wxTextAttr_IsDefault, 1803). --define(wxTextAttr_SetAlignment, 1804). --define(wxTextAttr_SetBackgroundColour, 1805). --define(wxTextAttr_SetFlags, 1806). --define(wxTextAttr_SetFont, 1807). --define(wxTextAttr_SetLeftIndent, 1808). --define(wxTextAttr_SetRightIndent, 1809). --define(wxTextAttr_SetTabs, 1810). --define(wxTextAttr_SetTextColour, 1811). --define(wxTextAttr_destroy, 1812). --define(wxTextCtrl_new_3, 1814). --define(wxTextCtrl_new_0, 1815). --define(wxTextCtrl_destruct, 1817). --define(wxTextCtrl_AppendText, 1818). --define(wxTextCtrl_CanCopy, 1819). --define(wxTextCtrl_CanCut, 1820). --define(wxTextCtrl_CanPaste, 1821). --define(wxTextCtrl_CanRedo, 1822). --define(wxTextCtrl_CanUndo, 1823). --define(wxTextCtrl_Clear, 1824). --define(wxTextCtrl_Copy, 1825). --define(wxTextCtrl_Create, 1826). --define(wxTextCtrl_Cut, 1827). --define(wxTextCtrl_DiscardEdits, 1828). --define(wxTextCtrl_ChangeValue, 1829). --define(wxTextCtrl_EmulateKeyPress, 1830). --define(wxTextCtrl_GetDefaultStyle, 1831). --define(wxTextCtrl_GetInsertionPoint, 1832). --define(wxTextCtrl_GetLastPosition, 1833). --define(wxTextCtrl_GetLineLength, 1834). --define(wxTextCtrl_GetLineText, 1835). --define(wxTextCtrl_GetNumberOfLines, 1836). --define(wxTextCtrl_GetRange, 1837). --define(wxTextCtrl_GetSelection, 1838). --define(wxTextCtrl_GetStringSelection, 1839). --define(wxTextCtrl_GetStyle, 1840). --define(wxTextCtrl_GetValue, 1841). --define(wxTextCtrl_IsEditable, 1842). --define(wxTextCtrl_IsModified, 1843). --define(wxTextCtrl_IsMultiLine, 1844). --define(wxTextCtrl_IsSingleLine, 1845). --define(wxTextCtrl_LoadFile, 1846). --define(wxTextCtrl_MarkDirty, 1847). --define(wxTextCtrl_Paste, 1848). --define(wxTextCtrl_PositionToXY, 1849). --define(wxTextCtrl_Redo, 1850). --define(wxTextCtrl_Remove, 1851). --define(wxTextCtrl_Replace, 1852). --define(wxTextCtrl_SaveFile, 1853). --define(wxTextCtrl_SetDefaultStyle, 1854). --define(wxTextCtrl_SetEditable, 1855). --define(wxTextCtrl_SetInsertionPoint, 1856). --define(wxTextCtrl_SetInsertionPointEnd, 1857). --define(wxTextCtrl_SetMaxLength, 1859). --define(wxTextCtrl_SetSelection, 1860). --define(wxTextCtrl_SetStyle, 1861). --define(wxTextCtrl_SetValue, 1862). --define(wxTextCtrl_ShowPosition, 1863). --define(wxTextCtrl_Undo, 1864). --define(wxTextCtrl_WriteText, 1865). --define(wxTextCtrl_XYToPosition, 1866). --define(wxNotebook_new_0, 1869). --define(wxNotebook_new_3, 1870). --define(wxNotebook_destruct, 1871). --define(wxNotebook_AddPage, 1872). --define(wxNotebook_AdvanceSelection, 1873). --define(wxNotebook_AssignImageList, 1874). --define(wxNotebook_Create, 1875). --define(wxNotebook_DeleteAllPages, 1876). --define(wxNotebook_DeletePage, 1877). --define(wxNotebook_RemovePage, 1878). --define(wxNotebook_GetCurrentPage, 1879). --define(wxNotebook_GetImageList, 1880). --define(wxNotebook_GetPage, 1882). --define(wxNotebook_GetPageCount, 1883). --define(wxNotebook_GetPageImage, 1884). --define(wxNotebook_GetPageText, 1885). --define(wxNotebook_GetRowCount, 1886). --define(wxNotebook_GetSelection, 1887). --define(wxNotebook_GetThemeBackgroundColour, 1888). --define(wxNotebook_HitTest, 1890). --define(wxNotebook_InsertPage, 1892). --define(wxNotebook_SetImageList, 1893). --define(wxNotebook_SetPadding, 1894). --define(wxNotebook_SetPageSize, 1895). --define(wxNotebook_SetPageImage, 1896). --define(wxNotebook_SetPageText, 1897). --define(wxNotebook_SetSelection, 1898). --define(wxNotebook_ChangeSelection, 1899). --define(wxChoicebook_new_0, 1900). --define(wxChoicebook_new_3, 1901). --define(wxChoicebook_AddPage, 1902). --define(wxChoicebook_AdvanceSelection, 1903). --define(wxChoicebook_AssignImageList, 1904). --define(wxChoicebook_Create, 1905). --define(wxChoicebook_DeleteAllPages, 1906). --define(wxChoicebook_DeletePage, 1907). --define(wxChoicebook_RemovePage, 1908). --define(wxChoicebook_GetCurrentPage, 1909). --define(wxChoicebook_GetImageList, 1910). --define(wxChoicebook_GetPage, 1912). --define(wxChoicebook_GetPageCount, 1913). --define(wxChoicebook_GetPageImage, 1914). --define(wxChoicebook_GetPageText, 1915). --define(wxChoicebook_GetSelection, 1916). --define(wxChoicebook_HitTest, 1917). --define(wxChoicebook_InsertPage, 1918). --define(wxChoicebook_SetImageList, 1919). --define(wxChoicebook_SetPageSize, 1920). --define(wxChoicebook_SetPageImage, 1921). --define(wxChoicebook_SetPageText, 1922). --define(wxChoicebook_SetSelection, 1923). --define(wxChoicebook_ChangeSelection, 1924). --define(wxChoicebook_destroy, 1925). --define(wxToolbook_new_0, 1926). --define(wxToolbook_new_3, 1927). --define(wxToolbook_AddPage, 1928). --define(wxToolbook_AdvanceSelection, 1929). --define(wxToolbook_AssignImageList, 1930). --define(wxToolbook_Create, 1931). --define(wxToolbook_DeleteAllPages, 1932). --define(wxToolbook_DeletePage, 1933). --define(wxToolbook_RemovePage, 1934). --define(wxToolbook_GetCurrentPage, 1935). --define(wxToolbook_GetImageList, 1936). --define(wxToolbook_GetPage, 1938). --define(wxToolbook_GetPageCount, 1939). --define(wxToolbook_GetPageImage, 1940). --define(wxToolbook_GetPageText, 1941). --define(wxToolbook_GetSelection, 1942). --define(wxToolbook_HitTest, 1944). --define(wxToolbook_InsertPage, 1945). --define(wxToolbook_SetImageList, 1946). --define(wxToolbook_SetPageSize, 1947). --define(wxToolbook_SetPageImage, 1948). --define(wxToolbook_SetPageText, 1949). --define(wxToolbook_SetSelection, 1950). --define(wxToolbook_ChangeSelection, 1951). --define(wxToolbook_destroy, 1952). --define(wxListbook_new_0, 1953). --define(wxListbook_new_3, 1954). --define(wxListbook_AddPage, 1955). --define(wxListbook_AdvanceSelection, 1956). --define(wxListbook_AssignImageList, 1957). --define(wxListbook_Create, 1958). --define(wxListbook_DeleteAllPages, 1959). --define(wxListbook_DeletePage, 1960). --define(wxListbook_RemovePage, 1961). --define(wxListbook_GetCurrentPage, 1962). --define(wxListbook_GetImageList, 1963). --define(wxListbook_GetPage, 1965). --define(wxListbook_GetPageCount, 1966). --define(wxListbook_GetPageImage, 1967). --define(wxListbook_GetPageText, 1968). --define(wxListbook_GetSelection, 1969). --define(wxListbook_HitTest, 1971). --define(wxListbook_InsertPage, 1972). --define(wxListbook_SetImageList, 1973). --define(wxListbook_SetPageSize, 1974). --define(wxListbook_SetPageImage, 1975). --define(wxListbook_SetPageText, 1976). --define(wxListbook_SetSelection, 1977). --define(wxListbook_ChangeSelection, 1978). --define(wxListbook_destroy, 1979). --define(wxTreebook_new_0, 1980). --define(wxTreebook_new_3, 1981). --define(wxTreebook_AddPage, 1982). --define(wxTreebook_AdvanceSelection, 1983). --define(wxTreebook_AssignImageList, 1984). --define(wxTreebook_Create, 1985). --define(wxTreebook_DeleteAllPages, 1986). --define(wxTreebook_DeletePage, 1987). --define(wxTreebook_RemovePage, 1988). --define(wxTreebook_GetCurrentPage, 1989). --define(wxTreebook_GetImageList, 1990). --define(wxTreebook_GetPage, 1992). --define(wxTreebook_GetPageCount, 1993). --define(wxTreebook_GetPageImage, 1994). --define(wxTreebook_GetPageText, 1995). --define(wxTreebook_GetSelection, 1996). --define(wxTreebook_ExpandNode, 1997). --define(wxTreebook_IsNodeExpanded, 1998). --define(wxTreebook_HitTest, 2000). --define(wxTreebook_InsertPage, 2001). --define(wxTreebook_InsertSubPage, 2002). --define(wxTreebook_SetImageList, 2003). --define(wxTreebook_SetPageSize, 2004). --define(wxTreebook_SetPageImage, 2005). --define(wxTreebook_SetPageText, 2006). --define(wxTreebook_SetSelection, 2007). --define(wxTreebook_ChangeSelection, 2008). --define(wxTreebook_destroy, 2009). --define(wxTreeCtrl_new_2, 2012). --define(wxTreeCtrl_new_0, 2013). --define(wxTreeCtrl_destruct, 2015). --define(wxTreeCtrl_AddRoot, 2016). --define(wxTreeCtrl_AppendItem, 2017). --define(wxTreeCtrl_AssignImageList, 2018). --define(wxTreeCtrl_AssignStateImageList, 2019). --define(wxTreeCtrl_Collapse, 2020). --define(wxTreeCtrl_CollapseAndReset, 2021). --define(wxTreeCtrl_Create, 2022). --define(wxTreeCtrl_Delete, 2023). --define(wxTreeCtrl_DeleteAllItems, 2024). --define(wxTreeCtrl_DeleteChildren, 2025). --define(wxTreeCtrl_EditLabel, 2026). --define(wxTreeCtrl_EnsureVisible, 2027). --define(wxTreeCtrl_Expand, 2028). --define(wxTreeCtrl_GetBoundingRect, 2029). --define(wxTreeCtrl_GetChildrenCount, 2031). --define(wxTreeCtrl_GetCount, 2032). --define(wxTreeCtrl_GetEditControl, 2033). --define(wxTreeCtrl_GetFirstChild, 2034). --define(wxTreeCtrl_GetNextChild, 2035). --define(wxTreeCtrl_GetFirstVisibleItem, 2036). --define(wxTreeCtrl_GetImageList, 2037). --define(wxTreeCtrl_GetIndent, 2038). --define(wxTreeCtrl_GetItemBackgroundColour, 2039). --define(wxTreeCtrl_GetItemData, 2040). --define(wxTreeCtrl_GetItemFont, 2041). --define(wxTreeCtrl_GetItemImage_1, 2042). --define(wxTreeCtrl_GetItemImage_2, 2043). --define(wxTreeCtrl_GetItemText, 2044). --define(wxTreeCtrl_GetItemTextColour, 2045). --define(wxTreeCtrl_GetLastChild, 2046). --define(wxTreeCtrl_GetNextSibling, 2047). --define(wxTreeCtrl_GetNextVisible, 2048). --define(wxTreeCtrl_GetItemParent, 2049). --define(wxTreeCtrl_GetPrevSibling, 2050). --define(wxTreeCtrl_GetPrevVisible, 2051). --define(wxTreeCtrl_GetRootItem, 2052). --define(wxTreeCtrl_GetSelection, 2053). --define(wxTreeCtrl_GetSelections, 2054). --define(wxTreeCtrl_GetStateImageList, 2055). --define(wxTreeCtrl_HitTest, 2056). --define(wxTreeCtrl_InsertItem, 2058). --define(wxTreeCtrl_IsBold, 2059). --define(wxTreeCtrl_IsExpanded, 2060). --define(wxTreeCtrl_IsSelected, 2061). --define(wxTreeCtrl_IsVisible, 2062). --define(wxTreeCtrl_ItemHasChildren, 2063). --define(wxTreeCtrl_IsTreeItemIdOk, 2064). --define(wxTreeCtrl_PrependItem, 2065). --define(wxTreeCtrl_ScrollTo, 2066). --define(wxTreeCtrl_SelectItem_1, 2067). --define(wxTreeCtrl_SelectItem_2, 2068). --define(wxTreeCtrl_SetIndent, 2069). --define(wxTreeCtrl_SetImageList, 2070). --define(wxTreeCtrl_SetItemBackgroundColour, 2071). --define(wxTreeCtrl_SetItemBold, 2072). --define(wxTreeCtrl_SetItemData, 2073). --define(wxTreeCtrl_SetItemDropHighlight, 2074). --define(wxTreeCtrl_SetItemFont, 2075). --define(wxTreeCtrl_SetItemHasChildren, 2076). --define(wxTreeCtrl_SetItemImage_2, 2077). --define(wxTreeCtrl_SetItemImage_3, 2078). --define(wxTreeCtrl_SetItemText, 2079). --define(wxTreeCtrl_SetItemTextColour, 2080). --define(wxTreeCtrl_SetStateImageList, 2081). --define(wxTreeCtrl_SetWindowStyle, 2082). --define(wxTreeCtrl_SortChildren, 2083). --define(wxTreeCtrl_Toggle, 2084). --define(wxTreeCtrl_ToggleItemSelection, 2085). --define(wxTreeCtrl_Unselect, 2086). --define(wxTreeCtrl_UnselectAll, 2087). --define(wxTreeCtrl_UnselectItem, 2088). --define(wxScrollBar_new_0, 2089). --define(wxScrollBar_new_3, 2090). --define(wxScrollBar_destruct, 2091). --define(wxScrollBar_Create, 2092). --define(wxScrollBar_GetRange, 2093). --define(wxScrollBar_GetPageSize, 2094). --define(wxScrollBar_GetThumbPosition, 2095). --define(wxScrollBar_GetThumbSize, 2096). --define(wxScrollBar_SetThumbPosition, 2097). --define(wxScrollBar_SetScrollbar, 2098). --define(wxSpinButton_new_2, 2100). --define(wxSpinButton_new_0, 2101). --define(wxSpinButton_Create, 2102). --define(wxSpinButton_GetMax, 2103). --define(wxSpinButton_GetMin, 2104). --define(wxSpinButton_GetValue, 2105). --define(wxSpinButton_SetRange, 2106). --define(wxSpinButton_SetValue, 2107). --define(wxSpinButton_destroy, 2108). --define(wxSpinCtrl_new_0, 2109). --define(wxSpinCtrl_new_2, 2110). --define(wxSpinCtrl_Create, 2112). --define(wxSpinCtrl_SetValue_1_1, 2115). --define(wxSpinCtrl_SetValue_1_0, 2116). --define(wxSpinCtrl_GetValue, 2118). --define(wxSpinCtrl_SetRange, 2120). --define(wxSpinCtrl_SetSelection, 2121). --define(wxSpinCtrl_GetMin, 2123). --define(wxSpinCtrl_GetMax, 2125). --define(wxSpinCtrl_destroy, 2126). --define(wxStaticText_new_0, 2127). --define(wxStaticText_new_4, 2128). --define(wxStaticText_Create, 2129). --define(wxStaticText_GetLabel, 2130). --define(wxStaticText_SetLabel, 2131). --define(wxStaticText_Wrap, 2132). --define(wxStaticText_destroy, 2133). --define(wxStaticBitmap_new_0, 2134). --define(wxStaticBitmap_new_4, 2135). --define(wxStaticBitmap_Create, 2136). --define(wxStaticBitmap_GetBitmap, 2137). --define(wxStaticBitmap_SetBitmap, 2138). --define(wxStaticBitmap_destroy, 2139). --define(wxRadioBox_new, 2140). --define(wxRadioBox_destruct, 2142). --define(wxRadioBox_Create, 2143). --define(wxRadioBox_Enable_2, 2144). --define(wxRadioBox_Enable_1, 2145). --define(wxRadioBox_GetSelection, 2146). --define(wxRadioBox_GetString, 2147). --define(wxRadioBox_SetSelection, 2148). --define(wxRadioBox_Show_2, 2149). --define(wxRadioBox_Show_1, 2150). --define(wxRadioBox_GetColumnCount, 2151). --define(wxRadioBox_GetItemHelpText, 2152). --define(wxRadioBox_GetItemToolTip, 2153). --define(wxRadioBox_GetItemFromPoint, 2155). --define(wxRadioBox_GetRowCount, 2156). --define(wxRadioBox_IsItemEnabled, 2157). --define(wxRadioBox_IsItemShown, 2158). --define(wxRadioBox_SetItemHelpText, 2159). --define(wxRadioBox_SetItemToolTip, 2160). --define(wxRadioButton_new_0, 2161). --define(wxRadioButton_new_4, 2162). --define(wxRadioButton_Create, 2163). --define(wxRadioButton_GetValue, 2164). --define(wxRadioButton_SetValue, 2165). --define(wxRadioButton_destroy, 2166). --define(wxSlider_new_6, 2168). --define(wxSlider_new_0, 2169). --define(wxSlider_Create, 2170). --define(wxSlider_GetLineSize, 2171). --define(wxSlider_GetMax, 2172). --define(wxSlider_GetMin, 2173). --define(wxSlider_GetPageSize, 2174). --define(wxSlider_GetThumbLength, 2175). --define(wxSlider_GetValue, 2176). --define(wxSlider_SetLineSize, 2177). --define(wxSlider_SetPageSize, 2178). --define(wxSlider_SetRange, 2179). --define(wxSlider_SetThumbLength, 2180). --define(wxSlider_SetValue, 2181). --define(wxSlider_destroy, 2182). --define(wxDialog_new_4, 2184). --define(wxDialog_new_0, 2185). --define(wxDialog_destruct, 2187). --define(wxDialog_Create, 2188). --define(wxDialog_CreateButtonSizer, 2189). --define(wxDialog_CreateStdDialogButtonSizer, 2190). --define(wxDialog_EndModal, 2191). --define(wxDialog_GetAffirmativeId, 2192). --define(wxDialog_GetReturnCode, 2193). --define(wxDialog_IsModal, 2194). --define(wxDialog_SetAffirmativeId, 2195). --define(wxDialog_SetReturnCode, 2196). --define(wxDialog_Show, 2197). --define(wxDialog_ShowModal, 2198). --define(wxColourDialog_new_0, 2199). --define(wxColourDialog_new_2, 2200). --define(wxColourDialog_destruct, 2201). --define(wxColourDialog_Create, 2202). --define(wxColourDialog_GetColourData, 2203). --define(wxColourData_new_0, 2204). --define(wxColourData_new_1, 2205). --define(wxColourData_destruct, 2206). --define(wxColourData_GetChooseFull, 2207). --define(wxColourData_GetColour, 2208). --define(wxColourData_GetCustomColour, 2210). --define(wxColourData_SetChooseFull, 2211). --define(wxColourData_SetColour, 2212). --define(wxColourData_SetCustomColour, 2213). --define(wxPalette_new_0, 2214). --define(wxPalette_new_4, 2215). --define(wxPalette_destruct, 2217). --define(wxPalette_Create, 2218). --define(wxPalette_GetColoursCount, 2219). --define(wxPalette_GetPixel, 2220). --define(wxPalette_GetRGB, 2221). --define(wxPalette_IsOk, 2222). --define(wxDirDialog_new, 2226). --define(wxDirDialog_destruct, 2227). --define(wxDirDialog_GetPath, 2228). --define(wxDirDialog_GetMessage, 2229). --define(wxDirDialog_SetMessage, 2230). --define(wxDirDialog_SetPath, 2231). --define(wxFileDialog_new, 2235). --define(wxFileDialog_destruct, 2236). --define(wxFileDialog_GetDirectory, 2237). --define(wxFileDialog_GetFilename, 2238). --define(wxFileDialog_GetFilenames, 2239). --define(wxFileDialog_GetFilterIndex, 2240). --define(wxFileDialog_GetMessage, 2241). --define(wxFileDialog_GetPath, 2242). --define(wxFileDialog_GetPaths, 2243). --define(wxFileDialog_GetWildcard, 2244). --define(wxFileDialog_SetDirectory, 2245). --define(wxFileDialog_SetFilename, 2246). --define(wxFileDialog_SetFilterIndex, 2247). --define(wxFileDialog_SetMessage, 2248). --define(wxFileDialog_SetPath, 2249). --define(wxFileDialog_SetWildcard, 2250). --define(wxPickerBase_SetInternalMargin, 2251). --define(wxPickerBase_GetInternalMargin, 2252). --define(wxPickerBase_SetTextCtrlProportion, 2253). --define(wxPickerBase_SetPickerCtrlProportion, 2254). --define(wxPickerBase_GetTextCtrlProportion, 2255). --define(wxPickerBase_GetPickerCtrlProportion, 2256). --define(wxPickerBase_HasTextCtrl, 2257). --define(wxPickerBase_GetTextCtrl, 2258). --define(wxPickerBase_IsTextCtrlGrowable, 2259). --define(wxPickerBase_SetPickerCtrlGrowable, 2260). --define(wxPickerBase_SetTextCtrlGrowable, 2261). --define(wxPickerBase_IsPickerCtrlGrowable, 2262). --define(wxFilePickerCtrl_new_0, 2263). --define(wxFilePickerCtrl_new_3, 2264). --define(wxFilePickerCtrl_Create, 2265). --define(wxFilePickerCtrl_GetPath, 2266). --define(wxFilePickerCtrl_SetPath, 2267). --define(wxFilePickerCtrl_destroy, 2268). --define(wxDirPickerCtrl_new_0, 2269). --define(wxDirPickerCtrl_new_3, 2270). --define(wxDirPickerCtrl_Create, 2271). --define(wxDirPickerCtrl_GetPath, 2272). --define(wxDirPickerCtrl_SetPath, 2273). --define(wxDirPickerCtrl_destroy, 2274). --define(wxColourPickerCtrl_new_0, 2275). --define(wxColourPickerCtrl_new_3, 2276). --define(wxColourPickerCtrl_Create, 2277). --define(wxColourPickerCtrl_GetColour, 2278). --define(wxColourPickerCtrl_SetColour_1_1, 2279). --define(wxColourPickerCtrl_SetColour_1_0, 2280). --define(wxColourPickerCtrl_destroy, 2281). --define(wxDatePickerCtrl_new_0, 2282). --define(wxDatePickerCtrl_new_3, 2283). --define(wxDatePickerCtrl_GetRange, 2284). --define(wxDatePickerCtrl_GetValue, 2285). --define(wxDatePickerCtrl_SetRange, 2286). --define(wxDatePickerCtrl_SetValue, 2287). --define(wxDatePickerCtrl_destroy, 2288). --define(wxFontPickerCtrl_new_0, 2289). --define(wxFontPickerCtrl_new_3, 2290). --define(wxFontPickerCtrl_Create, 2291). --define(wxFontPickerCtrl_GetSelectedFont, 2292). --define(wxFontPickerCtrl_SetSelectedFont, 2293). --define(wxFontPickerCtrl_GetMaxPointSize, 2294). --define(wxFontPickerCtrl_SetMaxPointSize, 2295). --define(wxFontPickerCtrl_destroy, 2296). --define(wxFindReplaceDialog_new_0, 2299). --define(wxFindReplaceDialog_new_4, 2300). --define(wxFindReplaceDialog_destruct, 2301). --define(wxFindReplaceDialog_Create, 2302). --define(wxFindReplaceDialog_GetData, 2303). --define(wxFindReplaceData_new_0, 2304). --define(wxFindReplaceData_new_1, 2305). --define(wxFindReplaceData_GetFindString, 2306). --define(wxFindReplaceData_GetReplaceString, 2307). --define(wxFindReplaceData_GetFlags, 2308). --define(wxFindReplaceData_SetFlags, 2309). --define(wxFindReplaceData_SetFindString, 2310). --define(wxFindReplaceData_SetReplaceString, 2311). --define(wxFindReplaceData_destroy, 2312). --define(wxMultiChoiceDialog_new_0, 2313). --define(wxMultiChoiceDialog_new_5, 2315). --define(wxMultiChoiceDialog_GetSelections, 2316). --define(wxMultiChoiceDialog_SetSelections, 2317). --define(wxMultiChoiceDialog_destroy, 2318). --define(wxSingleChoiceDialog_new_0, 2319). --define(wxSingleChoiceDialog_new_5, 2321). --define(wxSingleChoiceDialog_GetSelection, 2322). --define(wxSingleChoiceDialog_GetStringSelection, 2323). --define(wxSingleChoiceDialog_SetSelection, 2324). --define(wxSingleChoiceDialog_destroy, 2325). --define(wxTextEntryDialog_new, 2326). --define(wxTextEntryDialog_GetValue, 2327). --define(wxTextEntryDialog_SetValue, 2328). --define(wxTextEntryDialog_destroy, 2329). --define(wxPasswordEntryDialog_new, 2330). --define(wxPasswordEntryDialog_destroy, 2331). --define(wxFontData_new_0, 2332). --define(wxFontData_new_1, 2333). --define(wxFontData_destruct, 2334). --define(wxFontData_EnableEffects, 2335). --define(wxFontData_GetAllowSymbols, 2336). --define(wxFontData_GetColour, 2337). --define(wxFontData_GetChosenFont, 2338). --define(wxFontData_GetEnableEffects, 2339). --define(wxFontData_GetInitialFont, 2340). --define(wxFontData_GetShowHelp, 2341). --define(wxFontData_SetAllowSymbols, 2342). --define(wxFontData_SetChosenFont, 2343). --define(wxFontData_SetColour, 2344). --define(wxFontData_SetInitialFont, 2345). --define(wxFontData_SetRange, 2346). --define(wxFontData_SetShowHelp, 2347). --define(wxFontDialog_new_0, 2351). --define(wxFontDialog_new_2, 2353). --define(wxFontDialog_Create, 2355). --define(wxFontDialog_GetFontData, 2356). --define(wxFontDialog_destroy, 2358). --define(wxProgressDialog_new, 2359). --define(wxProgressDialog_destruct, 2360). --define(wxProgressDialog_Resume, 2361). --define(wxProgressDialog_Update_2, 2362). --define(wxProgressDialog_Update_0, 2363). --define(wxMessageDialog_new, 2364). --define(wxMessageDialog_destruct, 2365). --define(wxPageSetupDialog_new, 2366). --define(wxPageSetupDialog_destruct, 2367). --define(wxPageSetupDialog_GetPageSetupData, 2368). --define(wxPageSetupDialog_ShowModal, 2369). --define(wxPageSetupDialogData_new_0, 2370). --define(wxPageSetupDialogData_new_1_0, 2371). --define(wxPageSetupDialogData_new_1_1, 2372). --define(wxPageSetupDialogData_destruct, 2373). --define(wxPageSetupDialogData_EnableHelp, 2374). --define(wxPageSetupDialogData_EnableMargins, 2375). --define(wxPageSetupDialogData_EnableOrientation, 2376). --define(wxPageSetupDialogData_EnablePaper, 2377). --define(wxPageSetupDialogData_EnablePrinter, 2378). --define(wxPageSetupDialogData_GetDefaultMinMargins, 2379). --define(wxPageSetupDialogData_GetEnableMargins, 2380). --define(wxPageSetupDialogData_GetEnableOrientation, 2381). --define(wxPageSetupDialogData_GetEnablePaper, 2382). --define(wxPageSetupDialogData_GetEnablePrinter, 2383). --define(wxPageSetupDialogData_GetEnableHelp, 2384). --define(wxPageSetupDialogData_GetDefaultInfo, 2385). --define(wxPageSetupDialogData_GetMarginTopLeft, 2386). --define(wxPageSetupDialogData_GetMarginBottomRight, 2387). --define(wxPageSetupDialogData_GetMinMarginTopLeft, 2388). --define(wxPageSetupDialogData_GetMinMarginBottomRight, 2389). --define(wxPageSetupDialogData_GetPaperId, 2390). --define(wxPageSetupDialogData_GetPaperSize, 2391). --define(wxPageSetupDialogData_GetPrintData, 2393). --define(wxPageSetupDialogData_IsOk, 2394). --define(wxPageSetupDialogData_SetDefaultInfo, 2395). --define(wxPageSetupDialogData_SetDefaultMinMargins, 2396). --define(wxPageSetupDialogData_SetMarginTopLeft, 2397). --define(wxPageSetupDialogData_SetMarginBottomRight, 2398). --define(wxPageSetupDialogData_SetMinMarginTopLeft, 2399). --define(wxPageSetupDialogData_SetMinMarginBottomRight, 2400). --define(wxPageSetupDialogData_SetPaperId, 2401). --define(wxPageSetupDialogData_SetPaperSize_1_1, 2402). --define(wxPageSetupDialogData_SetPaperSize_1_0, 2403). --define(wxPageSetupDialogData_SetPrintData, 2404). --define(wxPrintDialog_new_2_0, 2405). --define(wxPrintDialog_new_2_1, 2406). --define(wxPrintDialog_destruct, 2407). --define(wxPrintDialog_GetPrintDialogData, 2408). --define(wxPrintDialog_GetPrintDC, 2409). --define(wxPrintDialogData_new_0, 2410). --define(wxPrintDialogData_new_1_1, 2411). --define(wxPrintDialogData_new_1_0, 2412). --define(wxPrintDialogData_destruct, 2413). --define(wxPrintDialogData_EnableHelp, 2414). --define(wxPrintDialogData_EnablePageNumbers, 2415). --define(wxPrintDialogData_EnablePrintToFile, 2416). --define(wxPrintDialogData_EnableSelection, 2417). --define(wxPrintDialogData_GetAllPages, 2418). --define(wxPrintDialogData_GetCollate, 2419). --define(wxPrintDialogData_GetFromPage, 2420). --define(wxPrintDialogData_GetMaxPage, 2421). --define(wxPrintDialogData_GetMinPage, 2422). --define(wxPrintDialogData_GetNoCopies, 2423). --define(wxPrintDialogData_GetPrintData, 2424). --define(wxPrintDialogData_GetPrintToFile, 2425). --define(wxPrintDialogData_GetSelection, 2426). --define(wxPrintDialogData_GetToPage, 2427). --define(wxPrintDialogData_IsOk, 2428). --define(wxPrintDialogData_SetCollate, 2429). --define(wxPrintDialogData_SetFromPage, 2430). --define(wxPrintDialogData_SetMaxPage, 2431). --define(wxPrintDialogData_SetMinPage, 2432). --define(wxPrintDialogData_SetNoCopies, 2433). --define(wxPrintDialogData_SetPrintData, 2434). --define(wxPrintDialogData_SetPrintToFile, 2435). --define(wxPrintDialogData_SetSelection, 2436). --define(wxPrintDialogData_SetToPage, 2437). --define(wxPrintData_new_0, 2438). --define(wxPrintData_new_1, 2439). --define(wxPrintData_destruct, 2440). --define(wxPrintData_GetCollate, 2441). --define(wxPrintData_GetBin, 2442). --define(wxPrintData_GetColour, 2443). --define(wxPrintData_GetDuplex, 2444). --define(wxPrintData_GetNoCopies, 2445). --define(wxPrintData_GetOrientation, 2446). --define(wxPrintData_GetPaperId, 2447). --define(wxPrintData_GetPrinterName, 2448). --define(wxPrintData_GetQuality, 2449). --define(wxPrintData_IsOk, 2450). --define(wxPrintData_SetBin, 2451). --define(wxPrintData_SetCollate, 2452). --define(wxPrintData_SetColour, 2453). --define(wxPrintData_SetDuplex, 2454). --define(wxPrintData_SetNoCopies, 2455). --define(wxPrintData_SetOrientation, 2456). --define(wxPrintData_SetPaperId, 2457). --define(wxPrintData_SetPrinterName, 2458). --define(wxPrintData_SetQuality, 2459). --define(wxPrintPreview_new_2, 2462). --define(wxPrintPreview_new_3, 2463). --define(wxPrintPreview_destruct, 2465). --define(wxPrintPreview_GetCanvas, 2466). --define(wxPrintPreview_GetCurrentPage, 2467). --define(wxPrintPreview_GetFrame, 2468). --define(wxPrintPreview_GetMaxPage, 2469). --define(wxPrintPreview_GetMinPage, 2470). --define(wxPrintPreview_GetPrintout, 2471). --define(wxPrintPreview_GetPrintoutForPrinting, 2472). --define(wxPrintPreview_IsOk, 2473). --define(wxPrintPreview_PaintPage, 2474). --define(wxPrintPreview_Print, 2475). --define(wxPrintPreview_RenderPage, 2476). --define(wxPrintPreview_SetCanvas, 2477). --define(wxPrintPreview_SetCurrentPage, 2478). --define(wxPrintPreview_SetFrame, 2479). --define(wxPrintPreview_SetPrintout, 2480). --define(wxPrintPreview_SetZoom, 2481). --define(wxPreviewFrame_new, 2482). --define(wxPreviewFrame_destruct, 2483). --define(wxPreviewFrame_CreateControlBar, 2484). --define(wxPreviewFrame_CreateCanvas, 2485). --define(wxPreviewFrame_Initialize, 2486). --define(wxPreviewFrame_OnCloseWindow, 2487). --define(wxPreviewControlBar_new, 2488). --define(wxPreviewControlBar_destruct, 2489). --define(wxPreviewControlBar_CreateButtons, 2490). --define(wxPreviewControlBar_GetPrintPreview, 2491). --define(wxPreviewControlBar_GetZoomControl, 2492). --define(wxPreviewControlBar_SetZoomControl, 2493). --define(wxPrinter_new, 2495). --define(wxPrinter_CreateAbortWindow, 2496). --define(wxPrinter_GetAbort, 2497). --define(wxPrinter_GetLastError, 2498). --define(wxPrinter_GetPrintDialogData, 2499). --define(wxPrinter_Print, 2500). --define(wxPrinter_PrintDialog, 2501). --define(wxPrinter_ReportError, 2502). --define(wxPrinter_Setup, 2503). --define(wxPrinter_destroy, 2504). --define(wxXmlResource_new_1, 2505). --define(wxXmlResource_new_2, 2506). --define(wxXmlResource_destruct, 2507). --define(wxXmlResource_AttachUnknownControl, 2508). --define(wxXmlResource_ClearHandlers, 2509). --define(wxXmlResource_CompareVersion, 2510). --define(wxXmlResource_Get, 2511). --define(wxXmlResource_GetFlags, 2512). --define(wxXmlResource_GetVersion, 2513). --define(wxXmlResource_GetXRCID, 2514). --define(wxXmlResource_InitAllHandlers, 2515). --define(wxXmlResource_Load, 2516). --define(wxXmlResource_LoadBitmap, 2517). --define(wxXmlResource_LoadDialog_2, 2518). --define(wxXmlResource_LoadDialog_3, 2519). --define(wxXmlResource_LoadFrame_2, 2520). --define(wxXmlResource_LoadFrame_3, 2521). --define(wxXmlResource_LoadIcon, 2522). --define(wxXmlResource_LoadMenu, 2523). --define(wxXmlResource_LoadMenuBar_2, 2524). --define(wxXmlResource_LoadMenuBar_1, 2525). --define(wxXmlResource_LoadPanel_2, 2526). --define(wxXmlResource_LoadPanel_3, 2527). --define(wxXmlResource_LoadToolBar, 2528). --define(wxXmlResource_Set, 2529). --define(wxXmlResource_SetFlags, 2530). --define(wxXmlResource_Unload, 2531). --define(wxXmlResource_xrcctrl, 2532). --define(wxHtmlEasyPrinting_new, 2533). --define(wxHtmlEasyPrinting_destruct, 2534). --define(wxHtmlEasyPrinting_GetPrintData, 2535). --define(wxHtmlEasyPrinting_GetPageSetupData, 2536). --define(wxHtmlEasyPrinting_PreviewFile, 2537). --define(wxHtmlEasyPrinting_PreviewText, 2538). --define(wxHtmlEasyPrinting_PrintFile, 2539). --define(wxHtmlEasyPrinting_PrintText, 2540). --define(wxHtmlEasyPrinting_PageSetup, 2541). --define(wxHtmlEasyPrinting_SetFonts, 2542). --define(wxHtmlEasyPrinting_SetHeader, 2543). --define(wxHtmlEasyPrinting_SetFooter, 2544). --define(wxGLCanvas_new_2, 2546). --define(wxGLCanvas_new_3_1, 2547). --define(wxGLCanvas_new_3_0, 2548). --define(wxGLCanvas_GetContext, 2549). --define(wxGLCanvas_SetCurrent, 2551). --define(wxGLCanvas_SwapBuffers, 2552). --define(wxGLCanvas_destroy, 2553). --define(wxAuiManager_new, 2554). --define(wxAuiManager_destruct, 2555). --define(wxAuiManager_AddPane_2_1, 2556). --define(wxAuiManager_AddPane_3, 2557). --define(wxAuiManager_AddPane_2_0, 2558). --define(wxAuiManager_DetachPane, 2559). --define(wxAuiManager_GetAllPanes, 2560). --define(wxAuiManager_GetArtProvider, 2561). --define(wxAuiManager_GetDockSizeConstraint, 2562). --define(wxAuiManager_GetFlags, 2563). --define(wxAuiManager_GetManagedWindow, 2564). --define(wxAuiManager_GetManager, 2565). --define(wxAuiManager_GetPane_1_1, 2566). --define(wxAuiManager_GetPane_1_0, 2567). --define(wxAuiManager_HideHint, 2568). --define(wxAuiManager_InsertPane, 2569). --define(wxAuiManager_LoadPaneInfo, 2570). --define(wxAuiManager_LoadPerspective, 2571). --define(wxAuiManager_SavePaneInfo, 2572). --define(wxAuiManager_SavePerspective, 2573). --define(wxAuiManager_SetArtProvider, 2574). --define(wxAuiManager_SetDockSizeConstraint, 2575). --define(wxAuiManager_SetFlags, 2576). --define(wxAuiManager_SetManagedWindow, 2577). --define(wxAuiManager_ShowHint, 2578). --define(wxAuiManager_UnInit, 2579). --define(wxAuiManager_Update, 2580). --define(wxAuiPaneInfo_new_0, 2581). --define(wxAuiPaneInfo_new_1, 2582). --define(wxAuiPaneInfo_destruct, 2583). --define(wxAuiPaneInfo_BestSize_1, 2584). --define(wxAuiPaneInfo_BestSize_2, 2585). --define(wxAuiPaneInfo_Bottom, 2586). --define(wxAuiPaneInfo_BottomDockable, 2587). --define(wxAuiPaneInfo_Caption, 2588). --define(wxAuiPaneInfo_CaptionVisible, 2589). --define(wxAuiPaneInfo_Centre, 2590). --define(wxAuiPaneInfo_CentrePane, 2591). --define(wxAuiPaneInfo_CloseButton, 2592). --define(wxAuiPaneInfo_DefaultPane, 2593). --define(wxAuiPaneInfo_DestroyOnClose, 2594). --define(wxAuiPaneInfo_Direction, 2595). --define(wxAuiPaneInfo_Dock, 2596). --define(wxAuiPaneInfo_Dockable, 2597). --define(wxAuiPaneInfo_Fixed, 2598). --define(wxAuiPaneInfo_Float, 2599). --define(wxAuiPaneInfo_Floatable, 2600). --define(wxAuiPaneInfo_FloatingPosition_1, 2601). --define(wxAuiPaneInfo_FloatingPosition_2, 2602). --define(wxAuiPaneInfo_FloatingSize_1, 2603). --define(wxAuiPaneInfo_FloatingSize_2, 2604). --define(wxAuiPaneInfo_Gripper, 2605). --define(wxAuiPaneInfo_GripperTop, 2606). --define(wxAuiPaneInfo_HasBorder, 2607). --define(wxAuiPaneInfo_HasCaption, 2608). --define(wxAuiPaneInfo_HasCloseButton, 2609). --define(wxAuiPaneInfo_HasFlag, 2610). --define(wxAuiPaneInfo_HasGripper, 2611). --define(wxAuiPaneInfo_HasGripperTop, 2612). --define(wxAuiPaneInfo_HasMaximizeButton, 2613). --define(wxAuiPaneInfo_HasMinimizeButton, 2614). --define(wxAuiPaneInfo_HasPinButton, 2615). --define(wxAuiPaneInfo_Hide, 2616). --define(wxAuiPaneInfo_IsBottomDockable, 2617). --define(wxAuiPaneInfo_IsDocked, 2618). --define(wxAuiPaneInfo_IsFixed, 2619). --define(wxAuiPaneInfo_IsFloatable, 2620). --define(wxAuiPaneInfo_IsFloating, 2621). --define(wxAuiPaneInfo_IsLeftDockable, 2622). --define(wxAuiPaneInfo_IsMovable, 2623). --define(wxAuiPaneInfo_IsOk, 2624). --define(wxAuiPaneInfo_IsResizable, 2625). --define(wxAuiPaneInfo_IsRightDockable, 2626). --define(wxAuiPaneInfo_IsShown, 2627). --define(wxAuiPaneInfo_IsToolbar, 2628). --define(wxAuiPaneInfo_IsTopDockable, 2629). --define(wxAuiPaneInfo_Layer, 2630). --define(wxAuiPaneInfo_Left, 2631). --define(wxAuiPaneInfo_LeftDockable, 2632). --define(wxAuiPaneInfo_MaxSize_1, 2633). --define(wxAuiPaneInfo_MaxSize_2, 2634). --define(wxAuiPaneInfo_MaximizeButton, 2635). --define(wxAuiPaneInfo_MinSize_1, 2636). --define(wxAuiPaneInfo_MinSize_2, 2637). --define(wxAuiPaneInfo_MinimizeButton, 2638). --define(wxAuiPaneInfo_Movable, 2639). --define(wxAuiPaneInfo_Name, 2640). --define(wxAuiPaneInfo_PaneBorder, 2641). --define(wxAuiPaneInfo_PinButton, 2642). --define(wxAuiPaneInfo_Position, 2643). --define(wxAuiPaneInfo_Resizable, 2644). --define(wxAuiPaneInfo_Right, 2645). --define(wxAuiPaneInfo_RightDockable, 2646). --define(wxAuiPaneInfo_Row, 2647). --define(wxAuiPaneInfo_SafeSet, 2648). --define(wxAuiPaneInfo_SetFlag, 2649). --define(wxAuiPaneInfo_Show, 2650). --define(wxAuiPaneInfo_ToolbarPane, 2651). --define(wxAuiPaneInfo_Top, 2652). --define(wxAuiPaneInfo_TopDockable, 2653). --define(wxAuiPaneInfo_Window, 2654). --define(wxAuiPaneInfo_GetWindow, 2655). --define(wxAuiPaneInfo_GetFrame, 2656). --define(wxAuiPaneInfo_GetDirection, 2657). --define(wxAuiPaneInfo_GetLayer, 2658). --define(wxAuiPaneInfo_GetRow, 2659). --define(wxAuiPaneInfo_GetPosition, 2660). --define(wxAuiPaneInfo_GetFloatingPosition, 2661). --define(wxAuiPaneInfo_GetFloatingSize, 2662). --define(wxAuiNotebook_new_0, 2663). --define(wxAuiNotebook_new_2, 2664). --define(wxAuiNotebook_AddPage, 2665). --define(wxAuiNotebook_Create, 2666). --define(wxAuiNotebook_DeletePage, 2667). --define(wxAuiNotebook_GetArtProvider, 2668). --define(wxAuiNotebook_GetPage, 2669). --define(wxAuiNotebook_GetPageBitmap, 2670). --define(wxAuiNotebook_GetPageCount, 2671). --define(wxAuiNotebook_GetPageIndex, 2672). --define(wxAuiNotebook_GetPageText, 2673). --define(wxAuiNotebook_GetSelection, 2674). --define(wxAuiNotebook_InsertPage, 2675). --define(wxAuiNotebook_RemovePage, 2676). --define(wxAuiNotebook_SetArtProvider, 2677). --define(wxAuiNotebook_SetFont, 2678). --define(wxAuiNotebook_SetPageBitmap, 2679). --define(wxAuiNotebook_SetPageText, 2680). --define(wxAuiNotebook_SetSelection, 2681). --define(wxAuiNotebook_SetTabCtrlHeight, 2682). --define(wxAuiNotebook_SetUniformBitmapSize, 2683). --define(wxAuiNotebook_destroy, 2684). --define(wxAuiTabArt_SetFlags, 2685). --define(wxAuiTabArt_SetMeasuringFont, 2686). --define(wxAuiTabArt_SetNormalFont, 2687). --define(wxAuiTabArt_SetSelectedFont, 2688). --define(wxAuiTabArt_SetColour, 2689). --define(wxAuiTabArt_SetActiveColour, 2690). --define(wxAuiDockArt_GetColour, 2691). --define(wxAuiDockArt_GetFont, 2692). --define(wxAuiDockArt_GetMetric, 2693). --define(wxAuiDockArt_SetColour, 2694). --define(wxAuiDockArt_SetFont, 2695). --define(wxAuiDockArt_SetMetric, 2696). --define(wxAuiSimpleTabArt_new, 2697). --define(wxAuiSimpleTabArt_destroy, 2698). --define(wxMDIParentFrame_new_0, 2699). --define(wxMDIParentFrame_new_4, 2700). --define(wxMDIParentFrame_destruct, 2701). --define(wxMDIParentFrame_ActivateNext, 2702). --define(wxMDIParentFrame_ActivatePrevious, 2703). --define(wxMDIParentFrame_ArrangeIcons, 2704). --define(wxMDIParentFrame_Cascade, 2705). --define(wxMDIParentFrame_Create, 2706). --define(wxMDIParentFrame_GetActiveChild, 2707). --define(wxMDIParentFrame_GetClientWindow, 2708). --define(wxMDIParentFrame_Tile, 2709). --define(wxMDIChildFrame_new_0, 2710). --define(wxMDIChildFrame_new_4, 2711). --define(wxMDIChildFrame_destruct, 2712). --define(wxMDIChildFrame_Activate, 2713). --define(wxMDIChildFrame_Create, 2714). --define(wxMDIChildFrame_Maximize, 2715). --define(wxMDIChildFrame_Restore, 2716). --define(wxMDIClientWindow_new_0, 2717). --define(wxMDIClientWindow_new_2, 2718). --define(wxMDIClientWindow_destruct, 2719). --define(wxMDIClientWindow_CreateClient, 2720). --define(wxLayoutAlgorithm_new, 2721). --define(wxLayoutAlgorithm_LayoutFrame, 2722). --define(wxLayoutAlgorithm_LayoutMDIFrame, 2723). --define(wxLayoutAlgorithm_LayoutWindow, 2724). --define(wxLayoutAlgorithm_destroy, 2725). --define(wxEvent_GetId, 2726). --define(wxEvent_GetSkipped, 2727). --define(wxEvent_GetTimestamp, 2728). --define(wxEvent_IsCommandEvent, 2729). --define(wxEvent_ResumePropagation, 2730). --define(wxEvent_ShouldPropagate, 2731). --define(wxEvent_Skip, 2732). --define(wxEvent_StopPropagation, 2733). --define(wxCommandEvent_getClientData, 2734). --define(wxCommandEvent_GetExtraLong, 2735). --define(wxCommandEvent_GetInt, 2736). --define(wxCommandEvent_GetSelection, 2737). --define(wxCommandEvent_GetString, 2738). --define(wxCommandEvent_IsChecked, 2739). --define(wxCommandEvent_IsSelection, 2740). --define(wxCommandEvent_SetInt, 2741). --define(wxCommandEvent_SetString, 2742). --define(wxScrollEvent_GetOrientation, 2743). --define(wxScrollEvent_GetPosition, 2744). --define(wxScrollWinEvent_GetOrientation, 2745). --define(wxScrollWinEvent_GetPosition, 2746). --define(wxMouseEvent_AltDown, 2747). --define(wxMouseEvent_Button, 2748). --define(wxMouseEvent_ButtonDClick, 2749). --define(wxMouseEvent_ButtonDown, 2750). --define(wxMouseEvent_ButtonUp, 2751). --define(wxMouseEvent_CmdDown, 2752). --define(wxMouseEvent_ControlDown, 2753). --define(wxMouseEvent_Dragging, 2754). --define(wxMouseEvent_Entering, 2755). --define(wxMouseEvent_GetButton, 2756). --define(wxMouseEvent_GetPosition, 2759). --define(wxMouseEvent_GetLogicalPosition, 2760). --define(wxMouseEvent_GetLinesPerAction, 2761). --define(wxMouseEvent_GetWheelRotation, 2762). --define(wxMouseEvent_GetWheelDelta, 2763). --define(wxMouseEvent_GetX, 2764). --define(wxMouseEvent_GetY, 2765). --define(wxMouseEvent_IsButton, 2766). --define(wxMouseEvent_IsPageScroll, 2767). --define(wxMouseEvent_Leaving, 2768). --define(wxMouseEvent_LeftDClick, 2769). --define(wxMouseEvent_LeftDown, 2770). --define(wxMouseEvent_LeftIsDown, 2771). --define(wxMouseEvent_LeftUp, 2772). --define(wxMouseEvent_MetaDown, 2773). --define(wxMouseEvent_MiddleDClick, 2774). --define(wxMouseEvent_MiddleDown, 2775). --define(wxMouseEvent_MiddleIsDown, 2776). --define(wxMouseEvent_MiddleUp, 2777). --define(wxMouseEvent_Moving, 2778). --define(wxMouseEvent_RightDClick, 2779). --define(wxMouseEvent_RightDown, 2780). --define(wxMouseEvent_RightIsDown, 2781). --define(wxMouseEvent_RightUp, 2782). --define(wxMouseEvent_ShiftDown, 2783). --define(wxSetCursorEvent_GetCursor, 2784). --define(wxSetCursorEvent_GetX, 2785). --define(wxSetCursorEvent_GetY, 2786). --define(wxSetCursorEvent_HasCursor, 2787). --define(wxSetCursorEvent_SetCursor, 2788). --define(wxKeyEvent_AltDown, 2789). --define(wxKeyEvent_CmdDown, 2790). --define(wxKeyEvent_ControlDown, 2791). --define(wxKeyEvent_GetKeyCode, 2792). --define(wxKeyEvent_GetModifiers, 2793). --define(wxKeyEvent_GetPosition, 2796). --define(wxKeyEvent_GetRawKeyCode, 2797). --define(wxKeyEvent_GetRawKeyFlags, 2798). --define(wxKeyEvent_GetUnicodeKey, 2799). --define(wxKeyEvent_GetX, 2800). --define(wxKeyEvent_GetY, 2801). --define(wxKeyEvent_HasModifiers, 2802). --define(wxKeyEvent_MetaDown, 2803). --define(wxKeyEvent_ShiftDown, 2804). --define(wxSizeEvent_GetSize, 2805). --define(wxMoveEvent_GetPosition, 2806). --define(wxEraseEvent_GetDC, 2807). --define(wxFocusEvent_GetWindow, 2808). --define(wxChildFocusEvent_GetWindow, 2809). --define(wxMenuEvent_GetMenu, 2810). --define(wxMenuEvent_GetMenuId, 2811). --define(wxMenuEvent_IsPopup, 2812). --define(wxCloseEvent_CanVeto, 2813). --define(wxCloseEvent_GetLoggingOff, 2814). --define(wxCloseEvent_SetCanVeto, 2815). --define(wxCloseEvent_SetLoggingOff, 2816). --define(wxCloseEvent_Veto, 2817). --define(wxShowEvent_SetShow, 2818). --define(wxShowEvent_GetShow, 2819). --define(wxIconizeEvent_Iconized, 2820). --define(wxJoystickEvent_ButtonDown, 2821). --define(wxJoystickEvent_ButtonIsDown, 2822). --define(wxJoystickEvent_ButtonUp, 2823). --define(wxJoystickEvent_GetButtonChange, 2824). --define(wxJoystickEvent_GetButtonState, 2825). --define(wxJoystickEvent_GetJoystick, 2826). --define(wxJoystickEvent_GetPosition, 2827). --define(wxJoystickEvent_GetZPosition, 2828). --define(wxJoystickEvent_IsButton, 2829). --define(wxJoystickEvent_IsMove, 2830). --define(wxJoystickEvent_IsZMove, 2831). --define(wxUpdateUIEvent_CanUpdate, 2832). --define(wxUpdateUIEvent_Check, 2833). --define(wxUpdateUIEvent_Enable, 2834). --define(wxUpdateUIEvent_Show, 2835). --define(wxUpdateUIEvent_GetChecked, 2836). --define(wxUpdateUIEvent_GetEnabled, 2837). --define(wxUpdateUIEvent_GetShown, 2838). --define(wxUpdateUIEvent_GetSetChecked, 2839). --define(wxUpdateUIEvent_GetSetEnabled, 2840). --define(wxUpdateUIEvent_GetSetShown, 2841). --define(wxUpdateUIEvent_GetSetText, 2842). --define(wxUpdateUIEvent_GetText, 2843). --define(wxUpdateUIEvent_GetMode, 2844). --define(wxUpdateUIEvent_GetUpdateInterval, 2845). --define(wxUpdateUIEvent_ResetUpdateTime, 2846). --define(wxUpdateUIEvent_SetMode, 2847). --define(wxUpdateUIEvent_SetText, 2848). --define(wxUpdateUIEvent_SetUpdateInterval, 2849). --define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2850). --define(wxPaletteChangedEvent_SetChangedWindow, 2851). --define(wxPaletteChangedEvent_GetChangedWindow, 2852). --define(wxQueryNewPaletteEvent_SetPaletteRealized, 2853). --define(wxQueryNewPaletteEvent_GetPaletteRealized, 2854). --define(wxNavigationKeyEvent_GetDirection, 2855). --define(wxNavigationKeyEvent_SetDirection, 2856). --define(wxNavigationKeyEvent_IsWindowChange, 2857). --define(wxNavigationKeyEvent_SetWindowChange, 2858). --define(wxNavigationKeyEvent_IsFromTab, 2859). --define(wxNavigationKeyEvent_SetFromTab, 2860). --define(wxNavigationKeyEvent_GetCurrentFocus, 2861). --define(wxNavigationKeyEvent_SetCurrentFocus, 2862). --define(wxHelpEvent_GetOrigin, 2863). --define(wxHelpEvent_GetPosition, 2864). --define(wxHelpEvent_SetOrigin, 2865). --define(wxHelpEvent_SetPosition, 2866). --define(wxContextMenuEvent_GetPosition, 2867). --define(wxContextMenuEvent_SetPosition, 2868). --define(wxIdleEvent_CanSend, 2869). --define(wxIdleEvent_GetMode, 2870). --define(wxIdleEvent_RequestMore, 2871). --define(wxIdleEvent_MoreRequested, 2872). --define(wxIdleEvent_SetMode, 2873). --define(wxGridEvent_AltDown, 2874). --define(wxGridEvent_ControlDown, 2875). --define(wxGridEvent_GetCol, 2876). --define(wxGridEvent_GetPosition, 2877). --define(wxGridEvent_GetRow, 2878). --define(wxGridEvent_MetaDown, 2879). --define(wxGridEvent_Selecting, 2880). --define(wxGridEvent_ShiftDown, 2881). --define(wxNotifyEvent_Allow, 2882). --define(wxNotifyEvent_IsAllowed, 2883). --define(wxNotifyEvent_Veto, 2884). --define(wxSashEvent_GetEdge, 2885). --define(wxSashEvent_GetDragRect, 2886). --define(wxSashEvent_GetDragStatus, 2887). --define(wxListEvent_GetCacheFrom, 2888). --define(wxListEvent_GetCacheTo, 2889). --define(wxListEvent_GetKeyCode, 2890). --define(wxListEvent_GetIndex, 2891). --define(wxListEvent_GetColumn, 2892). --define(wxListEvent_GetPoint, 2893). --define(wxListEvent_GetLabel, 2894). --define(wxListEvent_GetText, 2895). --define(wxListEvent_GetImage, 2896). --define(wxListEvent_GetData, 2897). --define(wxListEvent_GetMask, 2898). --define(wxListEvent_GetItem, 2899). --define(wxListEvent_IsEditCancelled, 2900). --define(wxDateEvent_GetDate, 2901). --define(wxCalendarEvent_GetWeekDay, 2902). --define(wxFileDirPickerEvent_GetPath, 2903). --define(wxColourPickerEvent_GetColour, 2904). --define(wxFontPickerEvent_GetFont, 2905). --define(wxStyledTextEvent_GetPosition, 2906). --define(wxStyledTextEvent_GetKey, 2907). --define(wxStyledTextEvent_GetModifiers, 2908). --define(wxStyledTextEvent_GetModificationType, 2909). --define(wxStyledTextEvent_GetText, 2910). --define(wxStyledTextEvent_GetLength, 2911). --define(wxStyledTextEvent_GetLinesAdded, 2912). --define(wxStyledTextEvent_GetLine, 2913). --define(wxStyledTextEvent_GetFoldLevelNow, 2914). --define(wxStyledTextEvent_GetFoldLevelPrev, 2915). --define(wxStyledTextEvent_GetMargin, 2916). --define(wxStyledTextEvent_GetMessage, 2917). --define(wxStyledTextEvent_GetWParam, 2918). --define(wxStyledTextEvent_GetLParam, 2919). --define(wxStyledTextEvent_GetListType, 2920). --define(wxStyledTextEvent_GetX, 2921). --define(wxStyledTextEvent_GetY, 2922). --define(wxStyledTextEvent_GetDragText, 2923). --define(wxStyledTextEvent_GetDragAllowMove, 2924). --define(wxStyledTextEvent_GetDragResult, 2925). --define(wxStyledTextEvent_GetShift, 2926). --define(wxStyledTextEvent_GetControl, 2927). --define(wxStyledTextEvent_GetAlt, 2928). --define(utils_wxGetKeyState, 2929). --define(utils_wxGetMousePosition, 2930). --define(utils_wxGetMouseState, 2931). --define(utils_wxSetDetectableAutoRepeat, 2932). --define(utils_wxBell, 2933). --define(utils_wxFindMenuItemId, 2934). --define(utils_wxGenericFindWindowAtPoint, 2935). --define(utils_wxFindWindowAtPoint, 2936). --define(utils_wxBeginBusyCursor, 2937). --define(utils_wxEndBusyCursor, 2938). --define(utils_wxIsBusy, 2939). --define(utils_wxShutdown, 2940). --define(utils_wxShell, 2941). --define(utils_wxLaunchDefaultBrowser, 2942). --define(utils_wxGetEmailAddress, 2943). --define(utils_wxGetUserId, 2944). --define(utils_wxGetHomeDir, 2945). --define(utils_wxNewId, 2946). --define(utils_wxRegisterId, 2947). --define(utils_wxGetCurrentId, 2948). --define(utils_wxGetOsDescription, 2949). --define(utils_wxIsPlatformLittleEndian, 2950). --define(utils_wxIsPlatform64Bit, 2951). --define(gdicmn_wxDisplaySize, 2952). --define(gdicmn_wxSetCursor, 2953). --define(wxPrintout_new, 2954). --define(wxPrintout_destruct, 2955). --define(wxPrintout_GetDC, 2956). --define(wxPrintout_GetPageSizeMM, 2957). --define(wxPrintout_GetPageSizePixels, 2958). --define(wxPrintout_GetPaperRectPixels, 2959). --define(wxPrintout_GetPPIPrinter, 2960). --define(wxPrintout_GetPPIScreen, 2961). --define(wxPrintout_GetTitle, 2962). --define(wxPrintout_IsPreview, 2963). --define(wxPrintout_FitThisSizeToPaper, 2964). --define(wxPrintout_FitThisSizeToPage, 2965). --define(wxPrintout_FitThisSizeToPageMargins, 2966). --define(wxPrintout_MapScreenSizeToPaper, 2967). --define(wxPrintout_MapScreenSizeToPage, 2968). --define(wxPrintout_MapScreenSizeToPageMargins, 2969). --define(wxPrintout_MapScreenSizeToDevice, 2970). --define(wxPrintout_GetLogicalPaperRect, 2971). --define(wxPrintout_GetLogicalPageRect, 2972). --define(wxPrintout_GetLogicalPageMarginsRect, 2973). --define(wxPrintout_SetLogicalOrigin, 2974). --define(wxPrintout_OffsetLogicalOrigin, 2975). --define(wxStyledTextCtrl_new_2, 2976). --define(wxStyledTextCtrl_new_0, 2977). --define(wxStyledTextCtrl_destruct, 2978). --define(wxStyledTextCtrl_Create, 2979). --define(wxStyledTextCtrl_AddText, 2980). --define(wxStyledTextCtrl_AddStyledText, 2981). --define(wxStyledTextCtrl_InsertText, 2982). --define(wxStyledTextCtrl_ClearAll, 2983). --define(wxStyledTextCtrl_ClearDocumentStyle, 2984). --define(wxStyledTextCtrl_GetLength, 2985). --define(wxStyledTextCtrl_GetCharAt, 2986). --define(wxStyledTextCtrl_GetCurrentPos, 2987). --define(wxStyledTextCtrl_GetAnchor, 2988). --define(wxStyledTextCtrl_GetStyleAt, 2989). --define(wxStyledTextCtrl_Redo, 2990). --define(wxStyledTextCtrl_SetUndoCollection, 2991). --define(wxStyledTextCtrl_SelectAll, 2992). --define(wxStyledTextCtrl_SetSavePoint, 2993). --define(wxStyledTextCtrl_GetStyledText, 2994). --define(wxStyledTextCtrl_CanRedo, 2995). --define(wxStyledTextCtrl_MarkerLineFromHandle, 2996). --define(wxStyledTextCtrl_MarkerDeleteHandle, 2997). --define(wxStyledTextCtrl_GetUndoCollection, 2998). --define(wxStyledTextCtrl_GetViewWhiteSpace, 2999). --define(wxStyledTextCtrl_SetViewWhiteSpace, 3000). --define(wxStyledTextCtrl_PositionFromPoint, 3001). --define(wxStyledTextCtrl_PositionFromPointClose, 3002). --define(wxStyledTextCtrl_GotoLine, 3003). --define(wxStyledTextCtrl_GotoPos, 3004). --define(wxStyledTextCtrl_SetAnchor, 3005). --define(wxStyledTextCtrl_GetCurLine, 3006). --define(wxStyledTextCtrl_GetEndStyled, 3007). --define(wxStyledTextCtrl_ConvertEOLs, 3008). --define(wxStyledTextCtrl_GetEOLMode, 3009). --define(wxStyledTextCtrl_SetEOLMode, 3010). --define(wxStyledTextCtrl_StartStyling, 3011). --define(wxStyledTextCtrl_SetStyling, 3012). --define(wxStyledTextCtrl_GetBufferedDraw, 3013). --define(wxStyledTextCtrl_SetBufferedDraw, 3014). --define(wxStyledTextCtrl_SetTabWidth, 3015). --define(wxStyledTextCtrl_GetTabWidth, 3016). --define(wxStyledTextCtrl_SetCodePage, 3017). --define(wxStyledTextCtrl_MarkerDefine, 3018). --define(wxStyledTextCtrl_MarkerSetForeground, 3019). --define(wxStyledTextCtrl_MarkerSetBackground, 3020). --define(wxStyledTextCtrl_MarkerAdd, 3021). --define(wxStyledTextCtrl_MarkerDelete, 3022). --define(wxStyledTextCtrl_MarkerDeleteAll, 3023). --define(wxStyledTextCtrl_MarkerGet, 3024). --define(wxStyledTextCtrl_MarkerNext, 3025). --define(wxStyledTextCtrl_MarkerPrevious, 3026). --define(wxStyledTextCtrl_MarkerDefineBitmap, 3027). --define(wxStyledTextCtrl_MarkerAddSet, 3028). --define(wxStyledTextCtrl_MarkerSetAlpha, 3029). --define(wxStyledTextCtrl_SetMarginType, 3030). --define(wxStyledTextCtrl_GetMarginType, 3031). --define(wxStyledTextCtrl_SetMarginWidth, 3032). --define(wxStyledTextCtrl_GetMarginWidth, 3033). --define(wxStyledTextCtrl_SetMarginMask, 3034). --define(wxStyledTextCtrl_GetMarginMask, 3035). --define(wxStyledTextCtrl_SetMarginSensitive, 3036). --define(wxStyledTextCtrl_GetMarginSensitive, 3037). --define(wxStyledTextCtrl_StyleClearAll, 3038). --define(wxStyledTextCtrl_StyleSetForeground, 3039). --define(wxStyledTextCtrl_StyleSetBackground, 3040). --define(wxStyledTextCtrl_StyleSetBold, 3041). --define(wxStyledTextCtrl_StyleSetItalic, 3042). --define(wxStyledTextCtrl_StyleSetSize, 3043). --define(wxStyledTextCtrl_StyleSetFaceName, 3044). --define(wxStyledTextCtrl_StyleSetEOLFilled, 3045). --define(wxStyledTextCtrl_StyleResetDefault, 3046). --define(wxStyledTextCtrl_StyleSetUnderline, 3047). --define(wxStyledTextCtrl_StyleSetCase, 3048). --define(wxStyledTextCtrl_StyleSetHotSpot, 3049). --define(wxStyledTextCtrl_SetSelForeground, 3050). --define(wxStyledTextCtrl_SetSelBackground, 3051). --define(wxStyledTextCtrl_GetSelAlpha, 3052). --define(wxStyledTextCtrl_SetSelAlpha, 3053). --define(wxStyledTextCtrl_SetCaretForeground, 3054). --define(wxStyledTextCtrl_CmdKeyAssign, 3055). --define(wxStyledTextCtrl_CmdKeyClear, 3056). --define(wxStyledTextCtrl_CmdKeyClearAll, 3057). --define(wxStyledTextCtrl_SetStyleBytes, 3058). --define(wxStyledTextCtrl_StyleSetVisible, 3059). --define(wxStyledTextCtrl_GetCaretPeriod, 3060). --define(wxStyledTextCtrl_SetCaretPeriod, 3061). --define(wxStyledTextCtrl_SetWordChars, 3062). --define(wxStyledTextCtrl_BeginUndoAction, 3063). --define(wxStyledTextCtrl_EndUndoAction, 3064). --define(wxStyledTextCtrl_IndicatorSetStyle, 3065). --define(wxStyledTextCtrl_IndicatorGetStyle, 3066). --define(wxStyledTextCtrl_IndicatorSetForeground, 3067). --define(wxStyledTextCtrl_IndicatorGetForeground, 3068). --define(wxStyledTextCtrl_SetWhitespaceForeground, 3069). --define(wxStyledTextCtrl_SetWhitespaceBackground, 3070). --define(wxStyledTextCtrl_GetStyleBits, 3071). --define(wxStyledTextCtrl_SetLineState, 3072). --define(wxStyledTextCtrl_GetLineState, 3073). --define(wxStyledTextCtrl_GetMaxLineState, 3074). --define(wxStyledTextCtrl_GetCaretLineVisible, 3075). --define(wxStyledTextCtrl_SetCaretLineVisible, 3076). --define(wxStyledTextCtrl_GetCaretLineBackground, 3077). --define(wxStyledTextCtrl_SetCaretLineBackground, 3078). --define(wxStyledTextCtrl_AutoCompShow, 3079). --define(wxStyledTextCtrl_AutoCompCancel, 3080). --define(wxStyledTextCtrl_AutoCompActive, 3081). --define(wxStyledTextCtrl_AutoCompPosStart, 3082). --define(wxStyledTextCtrl_AutoCompComplete, 3083). --define(wxStyledTextCtrl_AutoCompStops, 3084). --define(wxStyledTextCtrl_AutoCompSetSeparator, 3085). --define(wxStyledTextCtrl_AutoCompGetSeparator, 3086). --define(wxStyledTextCtrl_AutoCompSelect, 3087). --define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3088). --define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3089). --define(wxStyledTextCtrl_AutoCompSetFillUps, 3090). --define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3091). --define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3092). --define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3093). --define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3094). --define(wxStyledTextCtrl_UserListShow, 3095). --define(wxStyledTextCtrl_AutoCompSetAutoHide, 3096). --define(wxStyledTextCtrl_AutoCompGetAutoHide, 3097). --define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3098). --define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3099). --define(wxStyledTextCtrl_RegisterImage, 3100). --define(wxStyledTextCtrl_ClearRegisteredImages, 3101). --define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3102). --define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3103). --define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3104). --define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3105). --define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3106). --define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3107). --define(wxStyledTextCtrl_SetIndent, 3108). --define(wxStyledTextCtrl_GetIndent, 3109). --define(wxStyledTextCtrl_SetUseTabs, 3110). --define(wxStyledTextCtrl_GetUseTabs, 3111). --define(wxStyledTextCtrl_SetLineIndentation, 3112). --define(wxStyledTextCtrl_GetLineIndentation, 3113). --define(wxStyledTextCtrl_GetLineIndentPosition, 3114). --define(wxStyledTextCtrl_GetColumn, 3115). --define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3116). --define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3117). --define(wxStyledTextCtrl_SetIndentationGuides, 3118). --define(wxStyledTextCtrl_GetIndentationGuides, 3119). --define(wxStyledTextCtrl_SetHighlightGuide, 3120). --define(wxStyledTextCtrl_GetHighlightGuide, 3121). --define(wxStyledTextCtrl_GetLineEndPosition, 3122). --define(wxStyledTextCtrl_GetCodePage, 3123). --define(wxStyledTextCtrl_GetCaretForeground, 3124). --define(wxStyledTextCtrl_GetReadOnly, 3125). --define(wxStyledTextCtrl_SetCurrentPos, 3126). --define(wxStyledTextCtrl_SetSelectionStart, 3127). --define(wxStyledTextCtrl_GetSelectionStart, 3128). --define(wxStyledTextCtrl_SetSelectionEnd, 3129). --define(wxStyledTextCtrl_GetSelectionEnd, 3130). --define(wxStyledTextCtrl_SetPrintMagnification, 3131). --define(wxStyledTextCtrl_GetPrintMagnification, 3132). --define(wxStyledTextCtrl_SetPrintColourMode, 3133). --define(wxStyledTextCtrl_GetPrintColourMode, 3134). --define(wxStyledTextCtrl_FindText, 3135). --define(wxStyledTextCtrl_FormatRange, 3136). --define(wxStyledTextCtrl_GetFirstVisibleLine, 3137). --define(wxStyledTextCtrl_GetLine, 3138). --define(wxStyledTextCtrl_GetLineCount, 3139). --define(wxStyledTextCtrl_SetMarginLeft, 3140). --define(wxStyledTextCtrl_GetMarginLeft, 3141). --define(wxStyledTextCtrl_SetMarginRight, 3142). --define(wxStyledTextCtrl_GetMarginRight, 3143). --define(wxStyledTextCtrl_GetModify, 3144). --define(wxStyledTextCtrl_SetSelection, 3145). --define(wxStyledTextCtrl_GetSelectedText, 3146). --define(wxStyledTextCtrl_GetTextRange, 3147). --define(wxStyledTextCtrl_HideSelection, 3148). --define(wxStyledTextCtrl_LineFromPosition, 3149). --define(wxStyledTextCtrl_PositionFromLine, 3150). --define(wxStyledTextCtrl_LineScroll, 3151). --define(wxStyledTextCtrl_EnsureCaretVisible, 3152). --define(wxStyledTextCtrl_ReplaceSelection, 3153). --define(wxStyledTextCtrl_SetReadOnly, 3154). --define(wxStyledTextCtrl_CanPaste, 3155). --define(wxStyledTextCtrl_CanUndo, 3156). --define(wxStyledTextCtrl_EmptyUndoBuffer, 3157). --define(wxStyledTextCtrl_Undo, 3158). --define(wxStyledTextCtrl_Cut, 3159). --define(wxStyledTextCtrl_Copy, 3160). --define(wxStyledTextCtrl_Paste, 3161). --define(wxStyledTextCtrl_Clear, 3162). --define(wxStyledTextCtrl_SetText, 3163). --define(wxStyledTextCtrl_GetText, 3164). --define(wxStyledTextCtrl_GetTextLength, 3165). --define(wxStyledTextCtrl_GetOvertype, 3166). --define(wxStyledTextCtrl_SetCaretWidth, 3167). --define(wxStyledTextCtrl_GetCaretWidth, 3168). --define(wxStyledTextCtrl_SetTargetStart, 3169). --define(wxStyledTextCtrl_GetTargetStart, 3170). --define(wxStyledTextCtrl_SetTargetEnd, 3171). --define(wxStyledTextCtrl_GetTargetEnd, 3172). --define(wxStyledTextCtrl_ReplaceTarget, 3173). --define(wxStyledTextCtrl_SearchInTarget, 3174). --define(wxStyledTextCtrl_SetSearchFlags, 3175). --define(wxStyledTextCtrl_GetSearchFlags, 3176). --define(wxStyledTextCtrl_CallTipShow, 3177). --define(wxStyledTextCtrl_CallTipCancel, 3178). --define(wxStyledTextCtrl_CallTipActive, 3179). --define(wxStyledTextCtrl_CallTipPosAtStart, 3180). --define(wxStyledTextCtrl_CallTipSetHighlight, 3181). --define(wxStyledTextCtrl_CallTipSetBackground, 3182). --define(wxStyledTextCtrl_CallTipSetForeground, 3183). --define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3184). --define(wxStyledTextCtrl_CallTipUseStyle, 3185). --define(wxStyledTextCtrl_VisibleFromDocLine, 3186). --define(wxStyledTextCtrl_DocLineFromVisible, 3187). --define(wxStyledTextCtrl_WrapCount, 3188). --define(wxStyledTextCtrl_SetFoldLevel, 3189). --define(wxStyledTextCtrl_GetFoldLevel, 3190). --define(wxStyledTextCtrl_GetLastChild, 3191). --define(wxStyledTextCtrl_GetFoldParent, 3192). --define(wxStyledTextCtrl_ShowLines, 3193). --define(wxStyledTextCtrl_HideLines, 3194). --define(wxStyledTextCtrl_GetLineVisible, 3195). --define(wxStyledTextCtrl_SetFoldExpanded, 3196). --define(wxStyledTextCtrl_GetFoldExpanded, 3197). --define(wxStyledTextCtrl_ToggleFold, 3198). --define(wxStyledTextCtrl_EnsureVisible, 3199). --define(wxStyledTextCtrl_SetFoldFlags, 3200). --define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3201). --define(wxStyledTextCtrl_SetTabIndents, 3202). --define(wxStyledTextCtrl_GetTabIndents, 3203). --define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3204). --define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3205). --define(wxStyledTextCtrl_SetMouseDwellTime, 3206). --define(wxStyledTextCtrl_GetMouseDwellTime, 3207). --define(wxStyledTextCtrl_WordStartPosition, 3208). --define(wxStyledTextCtrl_WordEndPosition, 3209). --define(wxStyledTextCtrl_SetWrapMode, 3210). --define(wxStyledTextCtrl_GetWrapMode, 3211). --define(wxStyledTextCtrl_SetWrapVisualFlags, 3212). --define(wxStyledTextCtrl_GetWrapVisualFlags, 3213). --define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3214). --define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3215). --define(wxStyledTextCtrl_SetWrapStartIndent, 3216). --define(wxStyledTextCtrl_GetWrapStartIndent, 3217). --define(wxStyledTextCtrl_SetLayoutCache, 3218). --define(wxStyledTextCtrl_GetLayoutCache, 3219). --define(wxStyledTextCtrl_SetScrollWidth, 3220). --define(wxStyledTextCtrl_GetScrollWidth, 3221). --define(wxStyledTextCtrl_TextWidth, 3222). --define(wxStyledTextCtrl_GetEndAtLastLine, 3223). --define(wxStyledTextCtrl_TextHeight, 3224). --define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3225). --define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3226). --define(wxStyledTextCtrl_AppendText, 3227). --define(wxStyledTextCtrl_GetTwoPhaseDraw, 3228). --define(wxStyledTextCtrl_SetTwoPhaseDraw, 3229). --define(wxStyledTextCtrl_TargetFromSelection, 3230). --define(wxStyledTextCtrl_LinesJoin, 3231). --define(wxStyledTextCtrl_LinesSplit, 3232). --define(wxStyledTextCtrl_SetFoldMarginColour, 3233). --define(wxStyledTextCtrl_SetFoldMarginHiColour, 3234). --define(wxStyledTextCtrl_LineDown, 3235). --define(wxStyledTextCtrl_LineDownExtend, 3236). --define(wxStyledTextCtrl_LineUp, 3237). --define(wxStyledTextCtrl_LineUpExtend, 3238). --define(wxStyledTextCtrl_CharLeft, 3239). --define(wxStyledTextCtrl_CharLeftExtend, 3240). --define(wxStyledTextCtrl_CharRight, 3241). --define(wxStyledTextCtrl_CharRightExtend, 3242). --define(wxStyledTextCtrl_WordLeft, 3243). --define(wxStyledTextCtrl_WordLeftExtend, 3244). --define(wxStyledTextCtrl_WordRight, 3245). --define(wxStyledTextCtrl_WordRightExtend, 3246). --define(wxStyledTextCtrl_Home, 3247). --define(wxStyledTextCtrl_HomeExtend, 3248). --define(wxStyledTextCtrl_LineEnd, 3249). --define(wxStyledTextCtrl_LineEndExtend, 3250). --define(wxStyledTextCtrl_DocumentStart, 3251). --define(wxStyledTextCtrl_DocumentStartExtend, 3252). --define(wxStyledTextCtrl_DocumentEnd, 3253). --define(wxStyledTextCtrl_DocumentEndExtend, 3254). --define(wxStyledTextCtrl_PageUp, 3255). --define(wxStyledTextCtrl_PageUpExtend, 3256). --define(wxStyledTextCtrl_PageDown, 3257). --define(wxStyledTextCtrl_PageDownExtend, 3258). --define(wxStyledTextCtrl_EditToggleOvertype, 3259). --define(wxStyledTextCtrl_Cancel, 3260). --define(wxStyledTextCtrl_DeleteBack, 3261). --define(wxStyledTextCtrl_Tab, 3262). --define(wxStyledTextCtrl_BackTab, 3263). --define(wxStyledTextCtrl_NewLine, 3264). --define(wxStyledTextCtrl_FormFeed, 3265). --define(wxStyledTextCtrl_VCHome, 3266). --define(wxStyledTextCtrl_VCHomeExtend, 3267). --define(wxStyledTextCtrl_ZoomIn, 3268). --define(wxStyledTextCtrl_ZoomOut, 3269). --define(wxStyledTextCtrl_DelWordLeft, 3270). --define(wxStyledTextCtrl_DelWordRight, 3271). --define(wxStyledTextCtrl_LineCut, 3272). --define(wxStyledTextCtrl_LineDelete, 3273). --define(wxStyledTextCtrl_LineTranspose, 3274). --define(wxStyledTextCtrl_LineDuplicate, 3275). --define(wxStyledTextCtrl_LowerCase, 3276). --define(wxStyledTextCtrl_UpperCase, 3277). --define(wxStyledTextCtrl_LineScrollDown, 3278). --define(wxStyledTextCtrl_LineScrollUp, 3279). --define(wxStyledTextCtrl_DeleteBackNotLine, 3280). --define(wxStyledTextCtrl_HomeDisplay, 3281). --define(wxStyledTextCtrl_HomeDisplayExtend, 3282). --define(wxStyledTextCtrl_LineEndDisplay, 3283). --define(wxStyledTextCtrl_LineEndDisplayExtend, 3284). --define(wxStyledTextCtrl_HomeWrapExtend, 3285). --define(wxStyledTextCtrl_LineEndWrap, 3286). --define(wxStyledTextCtrl_LineEndWrapExtend, 3287). --define(wxStyledTextCtrl_VCHomeWrap, 3288). --define(wxStyledTextCtrl_VCHomeWrapExtend, 3289). --define(wxStyledTextCtrl_LineCopy, 3290). --define(wxStyledTextCtrl_MoveCaretInsideView, 3291). --define(wxStyledTextCtrl_LineLength, 3292). --define(wxStyledTextCtrl_BraceHighlight, 3293). --define(wxStyledTextCtrl_BraceBadLight, 3294). --define(wxStyledTextCtrl_BraceMatch, 3295). --define(wxStyledTextCtrl_GetViewEOL, 3296). --define(wxStyledTextCtrl_SetViewEOL, 3297). --define(wxStyledTextCtrl_SetModEventMask, 3298). --define(wxStyledTextCtrl_GetEdgeColumn, 3299). --define(wxStyledTextCtrl_SetEdgeColumn, 3300). --define(wxStyledTextCtrl_SetEdgeMode, 3301). --define(wxStyledTextCtrl_GetEdgeMode, 3302). --define(wxStyledTextCtrl_GetEdgeColour, 3303). --define(wxStyledTextCtrl_SetEdgeColour, 3304). --define(wxStyledTextCtrl_SearchAnchor, 3305). --define(wxStyledTextCtrl_SearchNext, 3306). --define(wxStyledTextCtrl_SearchPrev, 3307). --define(wxStyledTextCtrl_LinesOnScreen, 3308). --define(wxStyledTextCtrl_UsePopUp, 3309). --define(wxStyledTextCtrl_SelectionIsRectangle, 3310). --define(wxStyledTextCtrl_SetZoom, 3311). --define(wxStyledTextCtrl_GetZoom, 3312). --define(wxStyledTextCtrl_GetModEventMask, 3313). --define(wxStyledTextCtrl_SetSTCFocus, 3314). --define(wxStyledTextCtrl_GetSTCFocus, 3315). --define(wxStyledTextCtrl_SetStatus, 3316). --define(wxStyledTextCtrl_GetStatus, 3317). --define(wxStyledTextCtrl_SetMouseDownCaptures, 3318). --define(wxStyledTextCtrl_GetMouseDownCaptures, 3319). --define(wxStyledTextCtrl_SetSTCCursor, 3320). --define(wxStyledTextCtrl_GetSTCCursor, 3321). --define(wxStyledTextCtrl_SetControlCharSymbol, 3322). --define(wxStyledTextCtrl_GetControlCharSymbol, 3323). --define(wxStyledTextCtrl_WordPartLeft, 3324). --define(wxStyledTextCtrl_WordPartLeftExtend, 3325). --define(wxStyledTextCtrl_WordPartRight, 3326). --define(wxStyledTextCtrl_WordPartRightExtend, 3327). --define(wxStyledTextCtrl_SetVisiblePolicy, 3328). --define(wxStyledTextCtrl_DelLineLeft, 3329). --define(wxStyledTextCtrl_DelLineRight, 3330). --define(wxStyledTextCtrl_GetXOffset, 3331). --define(wxStyledTextCtrl_ChooseCaretX, 3332). --define(wxStyledTextCtrl_SetXCaretPolicy, 3333). --define(wxStyledTextCtrl_SetYCaretPolicy, 3334). --define(wxStyledTextCtrl_GetPrintWrapMode, 3335). --define(wxStyledTextCtrl_SetHotspotActiveForeground, 3336). --define(wxStyledTextCtrl_SetHotspotActiveBackground, 3337). --define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3338). --define(wxStyledTextCtrl_SetHotspotSingleLine, 3339). --define(wxStyledTextCtrl_ParaDownExtend, 3340). --define(wxStyledTextCtrl_ParaUp, 3341). --define(wxStyledTextCtrl_ParaUpExtend, 3342). --define(wxStyledTextCtrl_PositionBefore, 3343). --define(wxStyledTextCtrl_PositionAfter, 3344). --define(wxStyledTextCtrl_CopyRange, 3345). --define(wxStyledTextCtrl_CopyText, 3346). --define(wxStyledTextCtrl_SetSelectionMode, 3347). --define(wxStyledTextCtrl_GetSelectionMode, 3348). --define(wxStyledTextCtrl_LineDownRectExtend, 3349). --define(wxStyledTextCtrl_LineUpRectExtend, 3350). --define(wxStyledTextCtrl_CharLeftRectExtend, 3351). --define(wxStyledTextCtrl_CharRightRectExtend, 3352). --define(wxStyledTextCtrl_HomeRectExtend, 3353). --define(wxStyledTextCtrl_VCHomeRectExtend, 3354). --define(wxStyledTextCtrl_LineEndRectExtend, 3355). --define(wxStyledTextCtrl_PageUpRectExtend, 3356). --define(wxStyledTextCtrl_PageDownRectExtend, 3357). --define(wxStyledTextCtrl_StutteredPageUp, 3358). --define(wxStyledTextCtrl_StutteredPageUpExtend, 3359). --define(wxStyledTextCtrl_StutteredPageDown, 3360). --define(wxStyledTextCtrl_StutteredPageDownExtend, 3361). --define(wxStyledTextCtrl_WordLeftEnd, 3362). --define(wxStyledTextCtrl_WordLeftEndExtend, 3363). --define(wxStyledTextCtrl_WordRightEnd, 3364). --define(wxStyledTextCtrl_WordRightEndExtend, 3365). --define(wxStyledTextCtrl_SetWhitespaceChars, 3366). --define(wxStyledTextCtrl_SetCharsDefault, 3367). --define(wxStyledTextCtrl_AutoCompGetCurrent, 3368). --define(wxStyledTextCtrl_Allocate, 3369). --define(wxStyledTextCtrl_FindColumn, 3370). --define(wxStyledTextCtrl_GetCaretSticky, 3371). --define(wxStyledTextCtrl_SetCaretSticky, 3372). --define(wxStyledTextCtrl_ToggleCaretSticky, 3373). --define(wxStyledTextCtrl_SetPasteConvertEndings, 3374). --define(wxStyledTextCtrl_GetPasteConvertEndings, 3375). --define(wxStyledTextCtrl_SelectionDuplicate, 3376). --define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3377). --define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3378). --define(wxStyledTextCtrl_StartRecord, 3379). --define(wxStyledTextCtrl_StopRecord, 3380). --define(wxStyledTextCtrl_SetLexer, 3381). --define(wxStyledTextCtrl_GetLexer, 3382). --define(wxStyledTextCtrl_Colourise, 3383). --define(wxStyledTextCtrl_SetProperty, 3384). --define(wxStyledTextCtrl_SetKeyWords, 3385). --define(wxStyledTextCtrl_SetLexerLanguage, 3386). --define(wxStyledTextCtrl_GetProperty, 3387). --define(wxStyledTextCtrl_GetStyleBitsNeeded, 3388). --define(wxStyledTextCtrl_GetCurrentLine, 3389). --define(wxStyledTextCtrl_StyleSetSpec, 3390). --define(wxStyledTextCtrl_StyleSetFont, 3391). --define(wxStyledTextCtrl_StyleSetFontAttr, 3392). --define(wxStyledTextCtrl_StyleSetCharacterSet, 3393). --define(wxStyledTextCtrl_StyleSetFontEncoding, 3394). --define(wxStyledTextCtrl_CmdKeyExecute, 3395). --define(wxStyledTextCtrl_SetMargins, 3396). --define(wxStyledTextCtrl_GetSelection, 3397). --define(wxStyledTextCtrl_PointFromPosition, 3398). --define(wxStyledTextCtrl_ScrollToLine, 3399). --define(wxStyledTextCtrl_ScrollToColumn, 3400). --define(wxStyledTextCtrl_SetVScrollBar, 3401). --define(wxStyledTextCtrl_SetHScrollBar, 3402). --define(wxStyledTextCtrl_GetLastKeydownProcessed, 3403). --define(wxStyledTextCtrl_SetLastKeydownProcessed, 3404). --define(wxStyledTextCtrl_SaveFile, 3405). --define(wxStyledTextCtrl_LoadFile, 3406). --define(wxStyledTextCtrl_DoDragOver, 3407). --define(wxStyledTextCtrl_DoDropText, 3408). --define(wxStyledTextCtrl_GetUseAntiAliasing, 3409). --define(wxStyledTextCtrl_AddTextRaw, 3410). --define(wxStyledTextCtrl_InsertTextRaw, 3411). --define(wxStyledTextCtrl_GetCurLineRaw, 3412). --define(wxStyledTextCtrl_GetLineRaw, 3413). --define(wxStyledTextCtrl_GetSelectedTextRaw, 3414). --define(wxStyledTextCtrl_GetTextRangeRaw, 3415). --define(wxStyledTextCtrl_SetTextRaw, 3416). --define(wxStyledTextCtrl_GetTextRaw, 3417). --define(wxStyledTextCtrl_AppendTextRaw, 3418). --define(wxArtProvider_GetBitmap, 3419). --define(wxArtProvider_GetIcon, 3420). --define(wxTreeEvent_GetKeyCode, 3421). --define(wxTreeEvent_GetItem, 3422). --define(wxTreeEvent_GetKeyEvent, 3423). --define(wxTreeEvent_GetLabel, 3424). --define(wxTreeEvent_GetOldItem, 3425). --define(wxTreeEvent_GetPoint, 3426). --define(wxTreeEvent_IsEditCancelled, 3427). --define(wxTreeEvent_SetToolTip, 3428). --define(wxNotebookEvent_GetOldSelection, 3429). --define(wxNotebookEvent_GetSelection, 3430). --define(wxNotebookEvent_SetOldSelection, 3431). --define(wxNotebookEvent_SetSelection, 3432). --define(wxFileDataObject_new, 3433). --define(wxFileDataObject_AddFile, 3434). --define(wxFileDataObject_GetFilenames, 3435). --define(wxFileDataObject_destroy, 3436). --define(wxTextDataObject_new, 3437). --define(wxTextDataObject_GetTextLength, 3438). --define(wxTextDataObject_GetText, 3439). --define(wxTextDataObject_SetText, 3440). --define(wxTextDataObject_destroy, 3441). --define(wxBitmapDataObject_new_1_1, 3442). --define(wxBitmapDataObject_new_1_0, 3443). --define(wxBitmapDataObject_GetBitmap, 3444). --define(wxBitmapDataObject_SetBitmap, 3445). --define(wxBitmapDataObject_destroy, 3446). --define(wxClipboard_new, 3448). --define(wxClipboard_destruct, 3449). --define(wxClipboard_AddData, 3450). --define(wxClipboard_Clear, 3451). --define(wxClipboard_Close, 3452). --define(wxClipboard_Flush, 3453). --define(wxClipboard_GetData, 3454). --define(wxClipboard_IsOpened, 3455). --define(wxClipboard_Open, 3456). --define(wxClipboard_SetData, 3457). --define(wxClipboard_UsePrimarySelection, 3459). --define(wxClipboard_IsSupported, 3460). --define(wxClipboard_Get, 3461). --define(wxSpinEvent_GetPosition, 3462). --define(wxSpinEvent_SetPosition, 3463). --define(wxSplitterWindow_new_0, 3464). --define(wxSplitterWindow_new_2, 3465). --define(wxSplitterWindow_destruct, 3466). --define(wxSplitterWindow_Create, 3467). --define(wxSplitterWindow_GetMinimumPaneSize, 3468). --define(wxSplitterWindow_GetSashGravity, 3469). --define(wxSplitterWindow_GetSashPosition, 3470). --define(wxSplitterWindow_GetSplitMode, 3471). --define(wxSplitterWindow_GetWindow1, 3472). --define(wxSplitterWindow_GetWindow2, 3473). --define(wxSplitterWindow_Initialize, 3474). --define(wxSplitterWindow_IsSplit, 3475). --define(wxSplitterWindow_ReplaceWindow, 3476). --define(wxSplitterWindow_SetSashGravity, 3477). --define(wxSplitterWindow_SetSashPosition, 3478). --define(wxSplitterWindow_SetSashSize, 3479). --define(wxSplitterWindow_SetMinimumPaneSize, 3480). --define(wxSplitterWindow_SetSplitMode, 3481). --define(wxSplitterWindow_SplitHorizontally, 3482). --define(wxSplitterWindow_SplitVertically, 3483). --define(wxSplitterWindow_Unsplit, 3484). --define(wxSplitterWindow_UpdateSize, 3485). --define(wxSplitterEvent_GetSashPosition, 3486). --define(wxSplitterEvent_GetX, 3487). --define(wxSplitterEvent_GetY, 3488). --define(wxSplitterEvent_GetWindowBeingRemoved, 3489). --define(wxSplitterEvent_SetSashPosition, 3490). --define(wxHtmlWindow_new_0, 3491). --define(wxHtmlWindow_new_2, 3492). --define(wxHtmlWindow_AppendToPage, 3493). --define(wxHtmlWindow_GetOpenedAnchor, 3494). --define(wxHtmlWindow_GetOpenedPage, 3495). --define(wxHtmlWindow_GetOpenedPageTitle, 3496). --define(wxHtmlWindow_GetRelatedFrame, 3497). --define(wxHtmlWindow_HistoryBack, 3498). --define(wxHtmlWindow_HistoryCanBack, 3499). --define(wxHtmlWindow_HistoryCanForward, 3500). --define(wxHtmlWindow_HistoryClear, 3501). --define(wxHtmlWindow_HistoryForward, 3502). --define(wxHtmlWindow_LoadFile, 3503). --define(wxHtmlWindow_LoadPage, 3504). --define(wxHtmlWindow_SelectAll, 3505). --define(wxHtmlWindow_SelectionToText, 3506). --define(wxHtmlWindow_SelectLine, 3507). --define(wxHtmlWindow_SelectWord, 3508). --define(wxHtmlWindow_SetBorders, 3509). --define(wxHtmlWindow_SetFonts, 3510). --define(wxHtmlWindow_SetPage, 3511). --define(wxHtmlWindow_SetRelatedFrame, 3512). --define(wxHtmlWindow_SetRelatedStatusBar, 3513). --define(wxHtmlWindow_ToText, 3514). --define(wxHtmlWindow_destroy, 3515). --define(wxHtmlLinkEvent_GetLinkInfo, 3516). --define(wxSystemSettings_GetColour, 3517). --define(wxSystemSettings_GetFont, 3518). --define(wxSystemSettings_GetMetric, 3519). --define(wxSystemSettings_GetScreenType, 3520). --define(wxSystemOptions_GetOption, 3521). --define(wxSystemOptions_GetOptionInt, 3522). --define(wxSystemOptions_HasOption, 3523). --define(wxSystemOptions_IsFalse, 3524). --define(wxSystemOptions_SetOption_2_1, 3525). --define(wxSystemOptions_SetOption_2_0, 3526). --define(wxAuiNotebookEvent_SetSelection, 3527). --define(wxAuiNotebookEvent_GetSelection, 3528). --define(wxAuiNotebookEvent_SetOldSelection, 3529). --define(wxAuiNotebookEvent_GetOldSelection, 3530). --define(wxAuiNotebookEvent_SetDragSource, 3531). --define(wxAuiNotebookEvent_GetDragSource, 3532). --define(wxAuiManagerEvent_SetManager, 3533). --define(wxAuiManagerEvent_GetManager, 3534). --define(wxAuiManagerEvent_SetPane, 3535). --define(wxAuiManagerEvent_GetPane, 3536). --define(wxAuiManagerEvent_SetButton, 3537). --define(wxAuiManagerEvent_GetButton, 3538). --define(wxAuiManagerEvent_SetDC, 3539). --define(wxAuiManagerEvent_GetDC, 3540). --define(wxAuiManagerEvent_Veto, 3541). --define(wxAuiManagerEvent_GetVeto, 3542). --define(wxAuiManagerEvent_SetCanVeto, 3543). --define(wxAuiManagerEvent_CanVeto, 3544). --define(wxLogNull_new, 3545). --define(wxLogNull_destroy, 3546). --define(wxTaskBarIcon_new, 3547). --define(wxTaskBarIcon_destruct, 3548). --define(wxTaskBarIcon_PopupMenu, 3549). --define(wxTaskBarIcon_RemoveIcon, 3550). --define(wxTaskBarIcon_SetIcon, 3551). --define(wxLocale_new_0, 3552). --define(wxLocale_new_2, 3554). --define(wxLocale_destruct, 3555). --define(wxLocale_Init, 3557). --define(wxLocale_AddCatalog_1, 3558). --define(wxLocale_AddCatalog_3, 3559). --define(wxLocale_AddCatalogLookupPathPrefix, 3560). --define(wxLocale_GetCanonicalName, 3561). --define(wxLocale_GetLanguage, 3562). --define(wxLocale_GetLanguageName, 3563). --define(wxLocale_GetLocale, 3564). --define(wxLocale_GetName, 3565). --define(wxLocale_GetString_2, 3566). --define(wxLocale_GetString_4, 3567). --define(wxLocale_GetHeaderValue, 3568). --define(wxLocale_GetSysName, 3569). --define(wxLocale_GetSystemEncoding, 3570). --define(wxLocale_GetSystemEncodingName, 3571). --define(wxLocale_GetSystemLanguage, 3572). --define(wxLocale_IsLoaded, 3573). --define(wxLocale_IsOk, 3574). --define(wxActivateEvent_GetActive, 3575). --define(wxPopupWindow_new_2, 3577). --define(wxPopupWindow_new_0, 3578). --define(wxPopupWindow_destruct, 3580). --define(wxPopupWindow_Create, 3581). --define(wxPopupWindow_Position, 3582). --define(wxPopupTransientWindow_new_0, 3583). --define(wxPopupTransientWindow_new_2, 3584). --define(wxPopupTransientWindow_destruct, 3585). --define(wxPopupTransientWindow_Popup, 3586). --define(wxPopupTransientWindow_Dismiss, 3587). --define(wxOverlay_new, 3588). --define(wxOverlay_destruct, 3589). --define(wxOverlay_Reset, 3590). --define(wxDCOverlay_new_6, 3591). --define(wxDCOverlay_new_2, 3592). --define(wxDCOverlay_destruct, 3593). --define(wxDCOverlay_Clear, 3594). +-define(wxWindow_DragAcceptFiles, 126). +-define(wxWindow_Enable, 127). +-define(wxWindow_FindFocus, 128). +-define(wxWindow_FindWindow_1_0, 129). +-define(wxWindow_FindWindow_1_1, 130). +-define(wxWindow_FindWindowById, 131). +-define(wxWindow_FindWindowByName, 132). +-define(wxWindow_FindWindowByLabel, 133). +-define(wxWindow_Fit, 134). +-define(wxWindow_FitInside, 135). +-define(wxWindow_Freeze, 136). +-define(wxWindow_GetAcceleratorTable, 137). +-define(wxWindow_GetBackgroundColour, 138). +-define(wxWindow_GetBackgroundStyle, 139). +-define(wxWindow_GetBestSize, 140). +-define(wxWindow_GetCaret, 142). +-define(wxWindow_GetCapture, 143). +-define(wxWindow_GetCharHeight, 144). +-define(wxWindow_GetCharWidth, 145). +-define(wxWindow_GetChildren, 146). +-define(wxWindow_GetClientSize, 149). +-define(wxWindow_GetContainingSizer, 150). +-define(wxWindow_GetCursor, 151). +-define(wxWindow_GetDropTarget, 152). +-define(wxWindow_GetEventHandler, 153). +-define(wxWindow_GetExtraStyle, 154). +-define(wxWindow_GetFont, 155). +-define(wxWindow_GetForegroundColour, 156). +-define(wxWindow_GetGrandParent, 157). +-define(wxWindow_GetHandle, 158). +-define(wxWindow_GetHelpText, 159). +-define(wxWindow_GetId, 160). +-define(wxWindow_GetLabel, 161). +-define(wxWindow_GetMaxSize, 162). +-define(wxWindow_GetMinSize, 163). +-define(wxWindow_GetName, 164). +-define(wxWindow_GetParent, 165). +-define(wxWindow_GetPosition, 167). +-define(wxWindow_GetRect, 168). +-define(wxWindow_GetScreenPosition, 170). +-define(wxWindow_GetScreenRect, 171). +-define(wxWindow_GetScrollPos, 172). +-define(wxWindow_GetScrollRange, 173). +-define(wxWindow_GetScrollThumb, 174). +-define(wxWindow_GetSize, 176). +-define(wxWindow_GetSizer, 177). +-define(wxWindow_GetTextExtent, 178). +-define(wxWindow_GetToolTip, 179). +-define(wxWindow_GetUpdateRegion, 180). +-define(wxWindow_GetVirtualSize, 182). +-define(wxWindow_GetWindowStyleFlag, 184). +-define(wxWindow_GetWindowVariant, 185). +-define(wxWindow_HasCapture, 186). +-define(wxWindow_HasScrollbar, 187). +-define(wxWindow_HasTransparentBackground, 188). +-define(wxWindow_Hide, 189). +-define(wxWindow_InheritAttributes, 190). +-define(wxWindow_InitDialog, 191). +-define(wxWindow_InvalidateBestSize, 192). +-define(wxWindow_IsEnabled, 193). +-define(wxWindow_IsExposed_2, 194). +-define(wxWindow_IsExposed_4, 195). +-define(wxWindow_IsExposed_1_0, 196). +-define(wxWindow_IsExposed_1_1, 197). +-define(wxWindow_IsRetained, 198). +-define(wxWindow_IsShown, 199). +-define(wxWindow_IsTopLevel, 200). +-define(wxWindow_Layout, 201). +-define(wxWindow_LineDown, 202). +-define(wxWindow_LineUp, 203). +-define(wxWindow_Lower, 204). +-define(wxWindow_MakeModal, 205). +-define(wxWindow_Move_3, 206). +-define(wxWindow_Move_2, 207). +-define(wxWindow_MoveAfterInTabOrder, 208). +-define(wxWindow_MoveBeforeInTabOrder, 209). +-define(wxWindow_Navigate, 210). +-define(wxWindow_PageDown, 211). +-define(wxWindow_PageUp, 212). +-define(wxWindow_PopEventHandler, 213). +-define(wxWindow_PopupMenu_2, 214). +-define(wxWindow_PopupMenu_3, 215). +-define(wxWindow_Raise, 216). +-define(wxWindow_Refresh, 217). +-define(wxWindow_RefreshRect, 218). +-define(wxWindow_ReleaseMouse, 219). +-define(wxWindow_RemoveChild, 220). +-define(wxWindow_Reparent, 221). +-define(wxWindow_ScreenToClient_2, 222). +-define(wxWindow_ScreenToClient_1, 223). +-define(wxWindow_ScrollLines, 225). +-define(wxWindow_ScrollPages, 227). +-define(wxWindow_ScrollWindow, 228). +-define(wxWindow_SetAcceleratorTable, 229). +-define(wxWindow_SetAutoLayout, 230). +-define(wxWindow_SetBackgroundColour, 231). +-define(wxWindow_SetBackgroundStyle, 232). +-define(wxWindow_SetCaret, 233). +-define(wxWindow_SetClientSize_2, 234). +-define(wxWindow_SetClientSize_1_0, 235). +-define(wxWindow_SetClientSize_1_1, 236). +-define(wxWindow_SetContainingSizer, 237). +-define(wxWindow_SetCursor, 238). +-define(wxWindow_SetMaxSize, 239). +-define(wxWindow_SetMinSize, 240). +-define(wxWindow_SetOwnBackgroundColour, 241). +-define(wxWindow_SetOwnFont, 242). +-define(wxWindow_SetOwnForegroundColour, 243). +-define(wxWindow_SetDropTarget, 244). +-define(wxWindow_SetExtraStyle, 245). +-define(wxWindow_SetFocus, 246). +-define(wxWindow_SetFocusFromKbd, 247). +-define(wxWindow_SetFont, 248). +-define(wxWindow_SetForegroundColour, 249). +-define(wxWindow_SetHelpText, 250). +-define(wxWindow_SetId, 251). +-define(wxWindow_SetLabel, 253). +-define(wxWindow_SetName, 254). +-define(wxWindow_SetPalette, 255). +-define(wxWindow_SetScrollbar, 256). +-define(wxWindow_SetScrollPos, 257). +-define(wxWindow_SetSize_5, 258). +-define(wxWindow_SetSize_2_0, 259). +-define(wxWindow_SetSize_1, 260). +-define(wxWindow_SetSize_2_1, 261). +-define(wxWindow_SetSizeHints_3, 262). +-define(wxWindow_SetSizeHints_2, 263). +-define(wxWindow_SetSizer, 264). +-define(wxWindow_SetSizerAndFit, 265). +-define(wxWindow_SetThemeEnabled, 266). +-define(wxWindow_SetToolTip_1_0, 267). +-define(wxWindow_SetToolTip_1_1, 268). +-define(wxWindow_SetVirtualSize_1, 269). +-define(wxWindow_SetVirtualSize_2, 270). +-define(wxWindow_SetVirtualSizeHints_3, 271). +-define(wxWindow_SetVirtualSizeHints_2, 272). +-define(wxWindow_SetWindowStyle, 273). +-define(wxWindow_SetWindowStyleFlag, 274). +-define(wxWindow_SetWindowVariant, 275). +-define(wxWindow_ShouldInheritColours, 276). +-define(wxWindow_Show, 277). +-define(wxWindow_Thaw, 278). +-define(wxWindow_TransferDataFromWindow, 279). +-define(wxWindow_TransferDataToWindow, 280). +-define(wxWindow_Update, 281). +-define(wxWindow_UpdateWindowUI, 282). +-define(wxWindow_Validate, 283). +-define(wxWindow_WarpPointer, 284). +-define(wxWindow_SetTransparent, 285). +-define(wxWindow_CanSetTransparent, 286). +-define(wxWindow_IsDoubleBuffered, 287). +-define(wxWindow_SetDoubleBuffered, 288). +-define(wxWindow_GetContentScaleFactor, 289). +-define(wxTopLevelWindow_GetIcon, 290). +-define(wxTopLevelWindow_GetIcons, 291). +-define(wxTopLevelWindow_GetTitle, 292). +-define(wxTopLevelWindow_IsActive, 293). +-define(wxTopLevelWindow_Iconize, 294). +-define(wxTopLevelWindow_IsFullScreen, 295). +-define(wxTopLevelWindow_IsIconized, 296). +-define(wxTopLevelWindow_IsMaximized, 297). +-define(wxTopLevelWindow_Maximize, 298). +-define(wxTopLevelWindow_RequestUserAttention, 299). +-define(wxTopLevelWindow_SetIcon, 300). +-define(wxTopLevelWindow_SetIcons, 301). +-define(wxTopLevelWindow_CenterOnScreen, 302). +-define(wxTopLevelWindow_CentreOnScreen, 303). +-define(wxTopLevelWindow_SetShape, 305). +-define(wxTopLevelWindow_SetTitle, 306). +-define(wxTopLevelWindow_ShowFullScreen, 307). +-define(wxFrame_new_4, 309). +-define(wxFrame_new_0, 310). +-define(wxFrame_destruct, 312). +-define(wxFrame_Create, 313). +-define(wxFrame_CreateStatusBar, 314). +-define(wxFrame_CreateToolBar, 315). +-define(wxFrame_GetClientAreaOrigin, 316). +-define(wxFrame_GetMenuBar, 317). +-define(wxFrame_GetStatusBar, 318). +-define(wxFrame_GetStatusBarPane, 319). +-define(wxFrame_GetToolBar, 320). +-define(wxFrame_ProcessCommand, 321). +-define(wxFrame_SendSizeEvent, 322). +-define(wxFrame_SetMenuBar, 323). +-define(wxFrame_SetStatusBar, 324). +-define(wxFrame_SetStatusBarPane, 325). +-define(wxFrame_SetStatusText, 326). +-define(wxFrame_SetStatusWidths, 327). +-define(wxFrame_SetToolBar, 328). +-define(wxMiniFrame_new_0, 329). +-define(wxMiniFrame_new_4, 330). +-define(wxMiniFrame_Create, 331). +-define(wxMiniFrame_destroy, 332). +-define(wxSplashScreen_new_0, 333). +-define(wxSplashScreen_new_6, 334). +-define(wxSplashScreen_destruct, 335). +-define(wxSplashScreen_GetSplashStyle, 336). +-define(wxSplashScreen_GetTimeout, 337). +-define(wxPanel_new_0, 338). +-define(wxPanel_new_6, 339). +-define(wxPanel_new_2, 340). +-define(wxPanel_destruct, 341). +-define(wxPanel_InitDialog, 342). +-define(wxPanel_SetFocusIgnoringChildren, 343). +-define(wxScrolledWindow_new_0, 344). +-define(wxScrolledWindow_new_2, 345). +-define(wxScrolledWindow_destruct, 346). +-define(wxScrolledWindow_CalcScrolledPosition_4, 347). +-define(wxScrolledWindow_CalcScrolledPosition_1, 348). +-define(wxScrolledWindow_CalcUnscrolledPosition_4, 349). +-define(wxScrolledWindow_CalcUnscrolledPosition_1, 350). +-define(wxScrolledWindow_EnableScrolling, 351). +-define(wxScrolledWindow_GetScrollPixelsPerUnit, 352). +-define(wxScrolledWindow_GetViewStart, 353). +-define(wxScrolledWindow_DoPrepareDC, 354). +-define(wxScrolledWindow_PrepareDC, 355). +-define(wxScrolledWindow_Scroll, 356). +-define(wxScrolledWindow_SetScrollbars, 357). +-define(wxScrolledWindow_SetScrollRate, 358). +-define(wxScrolledWindow_SetTargetWindow, 359). +-define(wxSashWindow_new_0, 360). +-define(wxSashWindow_new_2, 361). +-define(wxSashWindow_destruct, 362). +-define(wxSashWindow_GetSashVisible, 363). +-define(wxSashWindow_GetMaximumSizeX, 364). +-define(wxSashWindow_GetMaximumSizeY, 365). +-define(wxSashWindow_GetMinimumSizeX, 366). +-define(wxSashWindow_GetMinimumSizeY, 367). +-define(wxSashWindow_SetMaximumSizeX, 368). +-define(wxSashWindow_SetMaximumSizeY, 369). +-define(wxSashWindow_SetMinimumSizeX, 370). +-define(wxSashWindow_SetMinimumSizeY, 371). +-define(wxSashWindow_SetSashVisible, 372). +-define(wxSashLayoutWindow_new_0, 373). +-define(wxSashLayoutWindow_new_2, 374). +-define(wxSashLayoutWindow_Create, 375). +-define(wxSashLayoutWindow_GetAlignment, 376). +-define(wxSashLayoutWindow_GetOrientation, 377). +-define(wxSashLayoutWindow_SetAlignment, 378). +-define(wxSashLayoutWindow_SetDefaultSize, 379). +-define(wxSashLayoutWindow_SetOrientation, 380). +-define(wxSashLayoutWindow_destroy, 381). +-define(wxGrid_new_0, 382). +-define(wxGrid_new_3, 383). +-define(wxGrid_new_4, 384). +-define(wxGrid_destruct, 385). +-define(wxGrid_AppendCols, 386). +-define(wxGrid_AppendRows, 387). +-define(wxGrid_AutoSize, 388). +-define(wxGrid_AutoSizeColumn, 389). +-define(wxGrid_AutoSizeColumns, 390). +-define(wxGrid_AutoSizeRow, 391). +-define(wxGrid_AutoSizeRows, 392). +-define(wxGrid_BeginBatch, 393). +-define(wxGrid_BlockToDeviceRect, 394). +-define(wxGrid_CanDragColSize, 395). +-define(wxGrid_CanDragRowSize, 396). +-define(wxGrid_CanDragGridSize, 397). +-define(wxGrid_CanEnableCellControl, 398). +-define(wxGrid_CellToRect_2, 399). +-define(wxGrid_CellToRect_1, 400). +-define(wxGrid_ClearGrid, 401). +-define(wxGrid_ClearSelection, 402). +-define(wxGrid_CreateGrid, 403). +-define(wxGrid_DeleteCols, 404). +-define(wxGrid_DeleteRows, 405). +-define(wxGrid_DisableCellEditControl, 406). +-define(wxGrid_DisableDragColSize, 407). +-define(wxGrid_DisableDragGridSize, 408). +-define(wxGrid_DisableDragRowSize, 409). +-define(wxGrid_EnableCellEditControl, 410). +-define(wxGrid_EnableDragColSize, 411). +-define(wxGrid_EnableDragGridSize, 412). +-define(wxGrid_EnableDragRowSize, 413). +-define(wxGrid_EnableEditing, 414). +-define(wxGrid_EnableGridLines, 415). +-define(wxGrid_EndBatch, 416). +-define(wxGrid_Fit, 417). +-define(wxGrid_ForceRefresh, 418). +-define(wxGrid_GetBatchCount, 419). +-define(wxGrid_GetCellAlignment, 420). +-define(wxGrid_GetCellBackgroundColour, 421). +-define(wxGrid_GetCellEditor, 422). +-define(wxGrid_GetCellFont, 423). +-define(wxGrid_GetCellRenderer, 424). +-define(wxGrid_GetCellTextColour, 425). +-define(wxGrid_GetCellValue_2, 426). +-define(wxGrid_GetCellValue_1, 427). +-define(wxGrid_GetColLabelAlignment, 428). +-define(wxGrid_GetColLabelSize, 429). +-define(wxGrid_GetColLabelValue, 430). +-define(wxGrid_GetColMinimalAcceptableWidth, 431). +-define(wxGrid_GetDefaultCellAlignment, 432). +-define(wxGrid_GetDefaultCellBackgroundColour, 433). +-define(wxGrid_GetDefaultCellFont, 434). +-define(wxGrid_GetDefaultCellTextColour, 435). +-define(wxGrid_GetDefaultColLabelSize, 436). +-define(wxGrid_GetDefaultColSize, 437). +-define(wxGrid_GetDefaultEditor, 438). +-define(wxGrid_GetDefaultEditorForCell_2, 439). +-define(wxGrid_GetDefaultEditorForCell_1, 440). +-define(wxGrid_GetDefaultEditorForType, 441). +-define(wxGrid_GetDefaultRenderer, 442). +-define(wxGrid_GetDefaultRendererForCell, 443). +-define(wxGrid_GetDefaultRendererForType, 444). +-define(wxGrid_GetDefaultRowLabelSize, 445). +-define(wxGrid_GetDefaultRowSize, 446). +-define(wxGrid_GetGridCursorCol, 447). +-define(wxGrid_GetGridCursorRow, 448). +-define(wxGrid_GetGridLineColour, 449). +-define(wxGrid_GridLinesEnabled, 450). +-define(wxGrid_GetLabelBackgroundColour, 451). +-define(wxGrid_GetLabelFont, 452). +-define(wxGrid_GetLabelTextColour, 453). +-define(wxGrid_GetNumberCols, 454). +-define(wxGrid_GetNumberRows, 455). +-define(wxGrid_GetOrCreateCellAttr, 456). +-define(wxGrid_GetRowMinimalAcceptableHeight, 457). +-define(wxGrid_GetRowLabelAlignment, 458). +-define(wxGrid_GetRowLabelSize, 459). +-define(wxGrid_GetRowLabelValue, 460). +-define(wxGrid_GetRowSize, 461). +-define(wxGrid_GetScrollLineX, 462). +-define(wxGrid_GetScrollLineY, 463). +-define(wxGrid_GetSelectedCells, 464). +-define(wxGrid_GetSelectedCols, 465). +-define(wxGrid_GetSelectedRows, 466). +-define(wxGrid_GetSelectionBackground, 467). +-define(wxGrid_GetSelectionBlockTopLeft, 468). +-define(wxGrid_GetSelectionBlockBottomRight, 469). +-define(wxGrid_GetSelectionForeground, 470). +-define(wxGrid_GetViewWidth, 471). +-define(wxGrid_GetGridWindow, 472). +-define(wxGrid_GetGridRowLabelWindow, 473). +-define(wxGrid_GetGridColLabelWindow, 474). +-define(wxGrid_GetGridCornerLabelWindow, 475). +-define(wxGrid_HideCellEditControl, 476). +-define(wxGrid_InsertCols, 477). +-define(wxGrid_InsertRows, 478). +-define(wxGrid_IsCellEditControlEnabled, 479). +-define(wxGrid_IsCurrentCellReadOnly, 480). +-define(wxGrid_IsEditable, 481). +-define(wxGrid_IsInSelection_2, 482). +-define(wxGrid_IsInSelection_1, 483). +-define(wxGrid_IsReadOnly, 484). +-define(wxGrid_IsSelection, 485). +-define(wxGrid_IsVisible_3, 486). +-define(wxGrid_IsVisible_2, 487). +-define(wxGrid_MakeCellVisible_2, 488). +-define(wxGrid_MakeCellVisible_1, 489). +-define(wxGrid_MoveCursorDown, 490). +-define(wxGrid_MoveCursorLeft, 491). +-define(wxGrid_MoveCursorRight, 492). +-define(wxGrid_MoveCursorUp, 493). +-define(wxGrid_MoveCursorDownBlock, 494). +-define(wxGrid_MoveCursorLeftBlock, 495). +-define(wxGrid_MoveCursorRightBlock, 496). +-define(wxGrid_MoveCursorUpBlock, 497). +-define(wxGrid_MovePageDown, 498). +-define(wxGrid_MovePageUp, 499). +-define(wxGrid_RegisterDataType, 500). +-define(wxGrid_SaveEditControlValue, 501). +-define(wxGrid_SelectAll, 502). +-define(wxGrid_SelectBlock_5, 503). +-define(wxGrid_SelectBlock_3, 504). +-define(wxGrid_SelectCol, 505). +-define(wxGrid_SelectRow, 506). +-define(wxGrid_SetCellAlignment_4, 507). +-define(wxGrid_SetCellAlignment_3, 508). +-define(wxGrid_SetCellAlignment_1, 509). +-define(wxGrid_SetCellBackgroundColour_3_0, 510). +-define(wxGrid_SetCellBackgroundColour_1, 511). +-define(wxGrid_SetCellBackgroundColour_3_1, 512). +-define(wxGrid_SetCellEditor, 513). +-define(wxGrid_SetCellFont, 514). +-define(wxGrid_SetCellRenderer, 515). +-define(wxGrid_SetCellTextColour_3_0, 516). +-define(wxGrid_SetCellTextColour_3_1, 517). +-define(wxGrid_SetCellTextColour_1, 518). +-define(wxGrid_SetCellValue_3_0, 519). +-define(wxGrid_SetCellValue_2, 520). +-define(wxGrid_SetCellValue_3_1, 521). +-define(wxGrid_SetColAttr, 522). +-define(wxGrid_SetColFormatBool, 523). +-define(wxGrid_SetColFormatNumber, 524). +-define(wxGrid_SetColFormatFloat, 525). +-define(wxGrid_SetColFormatCustom, 526). +-define(wxGrid_SetColLabelAlignment, 527). +-define(wxGrid_SetColLabelSize, 528). +-define(wxGrid_SetColLabelValue, 529). +-define(wxGrid_SetColMinimalWidth, 530). +-define(wxGrid_SetColMinimalAcceptableWidth, 531). +-define(wxGrid_SetColSize, 532). +-define(wxGrid_SetDefaultCellAlignment, 533). +-define(wxGrid_SetDefaultCellBackgroundColour, 534). +-define(wxGrid_SetDefaultCellFont, 535). +-define(wxGrid_SetDefaultCellTextColour, 536). +-define(wxGrid_SetDefaultEditor, 537). +-define(wxGrid_SetDefaultRenderer, 538). +-define(wxGrid_SetDefaultColSize, 539). +-define(wxGrid_SetDefaultRowSize, 540). +-define(wxGrid_SetGridCursor, 541). +-define(wxGrid_SetGridLineColour, 542). +-define(wxGrid_SetLabelBackgroundColour, 543). +-define(wxGrid_SetLabelFont, 544). +-define(wxGrid_SetLabelTextColour, 545). +-define(wxGrid_SetMargins, 546). +-define(wxGrid_SetReadOnly, 547). +-define(wxGrid_SetRowAttr, 548). +-define(wxGrid_SetRowLabelAlignment, 549). +-define(wxGrid_SetRowLabelSize, 550). +-define(wxGrid_SetRowLabelValue, 551). +-define(wxGrid_SetRowMinimalHeight, 552). +-define(wxGrid_SetRowMinimalAcceptableHeight, 553). +-define(wxGrid_SetRowSize, 554). +-define(wxGrid_SetScrollLineX, 555). +-define(wxGrid_SetScrollLineY, 556). +-define(wxGrid_SetSelectionBackground, 557). +-define(wxGrid_SetSelectionForeground, 558). +-define(wxGrid_SetSelectionMode, 559). +-define(wxGrid_ShowCellEditControl, 560). +-define(wxGrid_XToCol, 561). +-define(wxGrid_XToEdgeOfCol, 562). +-define(wxGrid_YToEdgeOfRow, 563). +-define(wxGrid_YToRow, 564). +-define(wxGridCellRenderer_Draw, 565). +-define(wxGridCellRenderer_GetBestSize, 566). +-define(wxGridCellEditor_Create, 567). +-define(wxGridCellEditor_IsCreated, 568). +-define(wxGridCellEditor_SetSize, 569). +-define(wxGridCellEditor_Show, 570). +-define(wxGridCellEditor_PaintBackground, 571). +-define(wxGridCellEditor_BeginEdit, 572). +-define(wxGridCellEditor_EndEdit, 573). +-define(wxGridCellEditor_Reset, 574). +-define(wxGridCellEditor_StartingKey, 575). +-define(wxGridCellEditor_StartingClick, 576). +-define(wxGridCellEditor_HandleReturn, 577). +-define(wxGridCellBoolRenderer_new, 578). +-define(wxGridCellBoolRenderer_destroy, 579). +-define(wxGridCellBoolEditor_new, 580). +-define(wxGridCellBoolEditor_IsTrueValue, 581). +-define(wxGridCellBoolEditor_UseStringValues, 582). +-define(wxGridCellBoolEditor_destroy, 583). +-define(wxGridCellFloatRenderer_new, 584). +-define(wxGridCellFloatRenderer_GetPrecision, 585). +-define(wxGridCellFloatRenderer_GetWidth, 586). +-define(wxGridCellFloatRenderer_SetParameters, 587). +-define(wxGridCellFloatRenderer_SetPrecision, 588). +-define(wxGridCellFloatRenderer_SetWidth, 589). +-define(wxGridCellFloatRenderer_destroy, 590). +-define(wxGridCellFloatEditor_new, 591). +-define(wxGridCellFloatEditor_SetParameters, 592). +-define(wxGridCellFloatEditor_destroy, 593). +-define(wxGridCellStringRenderer_new, 594). +-define(wxGridCellStringRenderer_destroy, 595). +-define(wxGridCellTextEditor_new, 596). +-define(wxGridCellTextEditor_SetParameters, 597). +-define(wxGridCellTextEditor_destroy, 598). +-define(wxGridCellChoiceEditor_new, 600). +-define(wxGridCellChoiceEditor_SetParameters, 601). +-define(wxGridCellChoiceEditor_destroy, 602). +-define(wxGridCellNumberRenderer_new, 603). +-define(wxGridCellNumberRenderer_destroy, 604). +-define(wxGridCellNumberEditor_new, 605). +-define(wxGridCellNumberEditor_GetValue, 606). +-define(wxGridCellNumberEditor_SetParameters, 607). +-define(wxGridCellNumberEditor_destroy, 608). +-define(wxGridCellAttr_SetTextColour, 609). +-define(wxGridCellAttr_SetBackgroundColour, 610). +-define(wxGridCellAttr_SetFont, 611). +-define(wxGridCellAttr_SetAlignment, 612). +-define(wxGridCellAttr_SetReadOnly, 613). +-define(wxGridCellAttr_SetRenderer, 614). +-define(wxGridCellAttr_SetEditor, 615). +-define(wxGridCellAttr_HasTextColour, 616). +-define(wxGridCellAttr_HasBackgroundColour, 617). +-define(wxGridCellAttr_HasFont, 618). +-define(wxGridCellAttr_HasAlignment, 619). +-define(wxGridCellAttr_HasRenderer, 620). +-define(wxGridCellAttr_HasEditor, 621). +-define(wxGridCellAttr_GetTextColour, 622). +-define(wxGridCellAttr_GetBackgroundColour, 623). +-define(wxGridCellAttr_GetFont, 624). +-define(wxGridCellAttr_GetAlignment, 625). +-define(wxGridCellAttr_GetRenderer, 626). +-define(wxGridCellAttr_GetEditor, 627). +-define(wxGridCellAttr_IsReadOnly, 628). +-define(wxGridCellAttr_SetDefAttr, 629). +-define(wxDC_Blit, 630). +-define(wxDC_CalcBoundingBox, 631). +-define(wxDC_Clear, 632). +-define(wxDC_ComputeScaleAndOrigin, 633). +-define(wxDC_CrossHair, 634). +-define(wxDC_DestroyClippingRegion, 635). +-define(wxDC_DeviceToLogicalX, 636). +-define(wxDC_DeviceToLogicalXRel, 637). +-define(wxDC_DeviceToLogicalY, 638). +-define(wxDC_DeviceToLogicalYRel, 639). +-define(wxDC_DrawArc, 640). +-define(wxDC_DrawBitmap, 641). +-define(wxDC_DrawCheckMark, 642). +-define(wxDC_DrawCircle, 643). +-define(wxDC_DrawEllipse_2, 645). +-define(wxDC_DrawEllipse_1, 646). +-define(wxDC_DrawEllipticArc, 647). +-define(wxDC_DrawIcon, 648). +-define(wxDC_DrawLabel, 649). +-define(wxDC_DrawLine, 650). +-define(wxDC_DrawLines, 651). +-define(wxDC_DrawPolygon, 653). +-define(wxDC_DrawPoint, 655). +-define(wxDC_DrawRectangle_2, 657). +-define(wxDC_DrawRectangle_1, 658). +-define(wxDC_DrawRotatedText, 659). +-define(wxDC_DrawRoundedRectangle_3, 661). +-define(wxDC_DrawRoundedRectangle_2, 662). +-define(wxDC_DrawText, 663). +-define(wxDC_EndDoc, 664). +-define(wxDC_EndPage, 665). +-define(wxDC_FloodFill, 666). +-define(wxDC_GetBackground, 667). +-define(wxDC_GetBackgroundMode, 668). +-define(wxDC_GetBrush, 669). +-define(wxDC_GetCharHeight, 670). +-define(wxDC_GetCharWidth, 671). +-define(wxDC_GetClippingBox, 672). +-define(wxDC_GetFont, 674). +-define(wxDC_GetLayoutDirection, 675). +-define(wxDC_GetLogicalFunction, 676). +-define(wxDC_GetMapMode, 677). +-define(wxDC_GetMultiLineTextExtent_4, 678). +-define(wxDC_GetMultiLineTextExtent_1, 679). +-define(wxDC_GetPartialTextExtents, 680). +-define(wxDC_GetPen, 681). +-define(wxDC_GetPixel, 682). +-define(wxDC_GetPPI, 683). +-define(wxDC_GetSize, 685). +-define(wxDC_GetSizeMM, 687). +-define(wxDC_GetTextBackground, 688). +-define(wxDC_GetTextExtent_4, 689). +-define(wxDC_GetTextExtent_1, 690). +-define(wxDC_GetTextForeground, 692). +-define(wxDC_GetUserScale, 693). +-define(wxDC_GradientFillConcentric_3, 694). +-define(wxDC_GradientFillConcentric_4, 695). +-define(wxDC_GradientFillLinear, 696). +-define(wxDC_LogicalToDeviceX, 697). +-define(wxDC_LogicalToDeviceXRel, 698). +-define(wxDC_LogicalToDeviceY, 699). +-define(wxDC_LogicalToDeviceYRel, 700). +-define(wxDC_MaxX, 701). +-define(wxDC_MaxY, 702). +-define(wxDC_MinX, 703). +-define(wxDC_MinY, 704). +-define(wxDC_IsOk, 705). +-define(wxDC_ResetBoundingBox, 706). +-define(wxDC_SetAxisOrientation, 707). +-define(wxDC_SetBackground, 708). +-define(wxDC_SetBackgroundMode, 709). +-define(wxDC_SetBrush, 710). +-define(wxDC_SetClippingRegion_2, 712). +-define(wxDC_SetClippingRegion_1_1, 713). +-define(wxDC_SetClippingRegion_1_0, 714). +-define(wxDC_SetDeviceOrigin, 715). +-define(wxDC_SetFont, 716). +-define(wxDC_SetLayoutDirection, 717). +-define(wxDC_SetLogicalFunction, 718). +-define(wxDC_SetMapMode, 719). +-define(wxDC_SetPalette, 720). +-define(wxDC_SetPen, 721). +-define(wxDC_SetTextBackground, 722). +-define(wxDC_SetTextForeground, 723). +-define(wxDC_SetUserScale, 724). +-define(wxDC_StartDoc, 725). +-define(wxDC_StartPage, 726). +-define(wxMirrorDC_new, 727). +-define(wxMirrorDC_destroy, 728). +-define(wxScreenDC_new, 729). +-define(wxScreenDC_destruct, 730). +-define(wxPostScriptDC_new_0, 731). +-define(wxPostScriptDC_new_1, 732). +-define(wxPostScriptDC_destruct, 733). +-define(wxPostScriptDC_SetResolution, 734). +-define(wxPostScriptDC_GetResolution, 735). +-define(wxWindowDC_new_0, 736). +-define(wxWindowDC_new_1, 737). +-define(wxWindowDC_destruct, 738). +-define(wxClientDC_new_0, 739). +-define(wxClientDC_new_1, 740). +-define(wxClientDC_destroy, 741). +-define(wxPaintDC_new_0, 742). +-define(wxPaintDC_new_1, 743). +-define(wxPaintDC_destroy, 744). +-define(wxMemoryDC_new_1_0, 746). +-define(wxMemoryDC_new_1_1, 747). +-define(wxMemoryDC_new_0, 748). +-define(wxMemoryDC_destruct, 750). +-define(wxMemoryDC_SelectObject, 751). +-define(wxMemoryDC_SelectObjectAsSource, 752). +-define(wxBufferedDC_new_0, 753). +-define(wxBufferedDC_new_2, 754). +-define(wxBufferedDC_new_3, 755). +-define(wxBufferedDC_destruct, 756). +-define(wxBufferedDC_Init_2, 757). +-define(wxBufferedDC_Init_3, 758). +-define(wxBufferedPaintDC_new_3, 759). +-define(wxBufferedPaintDC_new_2, 760). +-define(wxBufferedPaintDC_destruct, 761). +-define(wxGraphicsObject_destruct, 762). +-define(wxGraphicsObject_GetRenderer, 763). +-define(wxGraphicsObject_IsNull, 764). +-define(wxGraphicsContext_destruct, 765). +-define(wxGraphicsContext_Create_1_1, 766). +-define(wxGraphicsContext_Create_1_0, 767). +-define(wxGraphicsContext_Create_0, 768). +-define(wxGraphicsContext_CreatePen, 769). +-define(wxGraphicsContext_CreateBrush, 770). +-define(wxGraphicsContext_CreateRadialGradientBrush, 771). +-define(wxGraphicsContext_CreateLinearGradientBrush, 772). +-define(wxGraphicsContext_CreateFont, 773). +-define(wxGraphicsContext_CreateMatrix, 774). +-define(wxGraphicsContext_CreatePath, 775). +-define(wxGraphicsContext_Clip_1, 776). +-define(wxGraphicsContext_Clip_4, 777). +-define(wxGraphicsContext_ResetClip, 778). +-define(wxGraphicsContext_DrawBitmap, 779). +-define(wxGraphicsContext_DrawEllipse, 780). +-define(wxGraphicsContext_DrawIcon, 781). +-define(wxGraphicsContext_DrawLines, 782). +-define(wxGraphicsContext_DrawPath, 783). +-define(wxGraphicsContext_DrawRectangle, 784). +-define(wxGraphicsContext_DrawRoundedRectangle, 785). +-define(wxGraphicsContext_DrawText_3, 786). +-define(wxGraphicsContext_DrawText_4_0, 787). +-define(wxGraphicsContext_DrawText_4_1, 788). +-define(wxGraphicsContext_DrawText_5, 789). +-define(wxGraphicsContext_FillPath, 790). +-define(wxGraphicsContext_StrokePath, 791). +-define(wxGraphicsContext_GetPartialTextExtents, 792). +-define(wxGraphicsContext_GetTextExtent, 793). +-define(wxGraphicsContext_Rotate, 794). +-define(wxGraphicsContext_Scale, 795). +-define(wxGraphicsContext_Translate, 796). +-define(wxGraphicsContext_GetTransform, 797). +-define(wxGraphicsContext_SetTransform, 798). +-define(wxGraphicsContext_ConcatTransform, 799). +-define(wxGraphicsContext_SetBrush_1_1, 800). +-define(wxGraphicsContext_SetBrush_1_0, 801). +-define(wxGraphicsContext_SetFont_1, 802). +-define(wxGraphicsContext_SetFont_2, 803). +-define(wxGraphicsContext_SetPen_1_0, 804). +-define(wxGraphicsContext_SetPen_1_1, 805). +-define(wxGraphicsContext_StrokeLine, 806). +-define(wxGraphicsContext_StrokeLines, 807). +-define(wxGraphicsMatrix_Concat, 809). +-define(wxGraphicsMatrix_Get, 811). +-define(wxGraphicsMatrix_Invert, 812). +-define(wxGraphicsMatrix_IsEqual, 813). +-define(wxGraphicsMatrix_IsIdentity, 815). +-define(wxGraphicsMatrix_Rotate, 816). +-define(wxGraphicsMatrix_Scale, 817). +-define(wxGraphicsMatrix_Translate, 818). +-define(wxGraphicsMatrix_Set, 819). +-define(wxGraphicsMatrix_TransformPoint, 820). +-define(wxGraphicsMatrix_TransformDistance, 821). +-define(wxGraphicsPath_MoveToPoint_2, 822). +-define(wxGraphicsPath_MoveToPoint_1, 823). +-define(wxGraphicsPath_AddArc_6, 824). +-define(wxGraphicsPath_AddArc_5, 825). +-define(wxGraphicsPath_AddArcToPoint, 826). +-define(wxGraphicsPath_AddCircle, 827). +-define(wxGraphicsPath_AddCurveToPoint_6, 828). +-define(wxGraphicsPath_AddCurveToPoint_3, 829). +-define(wxGraphicsPath_AddEllipse, 830). +-define(wxGraphicsPath_AddLineToPoint_2, 831). +-define(wxGraphicsPath_AddLineToPoint_1, 832). +-define(wxGraphicsPath_AddPath, 833). +-define(wxGraphicsPath_AddQuadCurveToPoint, 834). +-define(wxGraphicsPath_AddRectangle, 835). +-define(wxGraphicsPath_AddRoundedRectangle, 836). +-define(wxGraphicsPath_CloseSubpath, 837). +-define(wxGraphicsPath_Contains_3, 838). +-define(wxGraphicsPath_Contains_2, 839). +-define(wxGraphicsPath_GetBox, 841). +-define(wxGraphicsPath_GetCurrentPoint, 843). +-define(wxGraphicsPath_Transform, 844). +-define(wxGraphicsRenderer_GetDefaultRenderer, 845). +-define(wxGraphicsRenderer_CreateContext_1_1, 846). +-define(wxGraphicsRenderer_CreateContext_1_0, 847). +-define(wxGraphicsRenderer_CreatePen, 848). +-define(wxGraphicsRenderer_CreateBrush, 849). +-define(wxGraphicsRenderer_CreateLinearGradientBrush, 850). +-define(wxGraphicsRenderer_CreateRadialGradientBrush, 851). +-define(wxGraphicsRenderer_CreateFont, 852). +-define(wxGraphicsRenderer_CreateMatrix, 853). +-define(wxGraphicsRenderer_CreatePath, 854). +-define(wxMenuBar_new_1, 856). +-define(wxMenuBar_new_0, 858). +-define(wxMenuBar_destruct, 860). +-define(wxMenuBar_Append, 861). +-define(wxMenuBar_Check, 862). +-define(wxMenuBar_Enable_2, 863). +-define(wxMenuBar_Enable_1, 864). +-define(wxMenuBar_EnableTop, 865). +-define(wxMenuBar_FindMenu, 866). +-define(wxMenuBar_FindMenuItem, 867). +-define(wxMenuBar_FindItem, 868). +-define(wxMenuBar_GetHelpString, 869). +-define(wxMenuBar_GetLabel_1, 870). +-define(wxMenuBar_GetLabel_0, 871). +-define(wxMenuBar_GetLabelTop, 872). +-define(wxMenuBar_GetMenu, 873). +-define(wxMenuBar_GetMenuCount, 874). +-define(wxMenuBar_Insert, 875). +-define(wxMenuBar_IsChecked, 876). +-define(wxMenuBar_IsEnabled_1, 877). +-define(wxMenuBar_IsEnabled_0, 878). +-define(wxMenuBar_Remove, 879). +-define(wxMenuBar_Replace, 880). +-define(wxMenuBar_SetHelpString, 881). +-define(wxMenuBar_SetLabel_2, 882). +-define(wxMenuBar_SetLabel_1, 883). +-define(wxMenuBar_SetLabelTop, 884). +-define(wxControl_GetLabel, 885). +-define(wxControl_SetLabel, 886). +-define(wxControlWithItems_Append_1, 887). +-define(wxControlWithItems_Append_2, 888). +-define(wxControlWithItems_appendStrings_1, 889). +-define(wxControlWithItems_Clear, 890). +-define(wxControlWithItems_Delete, 891). +-define(wxControlWithItems_FindString, 892). +-define(wxControlWithItems_getClientData, 893). +-define(wxControlWithItems_setClientData, 894). +-define(wxControlWithItems_GetCount, 895). +-define(wxControlWithItems_GetSelection, 896). +-define(wxControlWithItems_GetString, 897). +-define(wxControlWithItems_GetStringSelection, 898). +-define(wxControlWithItems_Insert_2, 899). +-define(wxControlWithItems_Insert_3, 900). +-define(wxControlWithItems_IsEmpty, 901). +-define(wxControlWithItems_Select, 902). +-define(wxControlWithItems_SetSelection, 903). +-define(wxControlWithItems_SetString, 904). +-define(wxControlWithItems_SetStringSelection, 905). +-define(wxMenu_new_2, 908). +-define(wxMenu_new_1, 909). +-define(wxMenu_destruct, 911). +-define(wxMenu_Append_3, 912). +-define(wxMenu_Append_1, 913). +-define(wxMenu_Append_4_0, 914). +-define(wxMenu_Append_4_1, 915). +-define(wxMenu_AppendCheckItem, 916). +-define(wxMenu_AppendRadioItem, 917). +-define(wxMenu_AppendSeparator, 918). +-define(wxMenu_Break, 919). +-define(wxMenu_Check, 920). +-define(wxMenu_Delete_1_0, 921). +-define(wxMenu_Delete_1_1, 922). +-define(wxMenu_Destroy_1_0, 923). +-define(wxMenu_Destroy_1_1, 924). +-define(wxMenu_Enable, 925). +-define(wxMenu_FindItem_1, 926). +-define(wxMenu_FindItem_2, 927). +-define(wxMenu_FindItemByPosition, 928). +-define(wxMenu_GetHelpString, 929). +-define(wxMenu_GetLabel, 930). +-define(wxMenu_GetMenuItemCount, 931). +-define(wxMenu_GetMenuItems, 932). +-define(wxMenu_GetTitle, 934). +-define(wxMenu_Insert_2, 935). +-define(wxMenu_Insert_3, 936). +-define(wxMenu_Insert_5_1, 937). +-define(wxMenu_Insert_5_0, 938). +-define(wxMenu_InsertCheckItem, 939). +-define(wxMenu_InsertRadioItem, 940). +-define(wxMenu_InsertSeparator, 941). +-define(wxMenu_IsChecked, 942). +-define(wxMenu_IsEnabled, 943). +-define(wxMenu_Prepend_1, 944). +-define(wxMenu_Prepend_2, 945). +-define(wxMenu_Prepend_4_1, 946). +-define(wxMenu_Prepend_4_0, 947). +-define(wxMenu_PrependCheckItem, 948). +-define(wxMenu_PrependRadioItem, 949). +-define(wxMenu_PrependSeparator, 950). +-define(wxMenu_Remove_1_0, 951). +-define(wxMenu_Remove_1_1, 952). +-define(wxMenu_SetHelpString, 953). +-define(wxMenu_SetLabel, 954). +-define(wxMenu_SetTitle, 955). +-define(wxMenuItem_new, 956). +-define(wxMenuItem_destruct, 958). +-define(wxMenuItem_Check, 959). +-define(wxMenuItem_Enable, 960). +-define(wxMenuItem_GetBitmap, 961). +-define(wxMenuItem_GetHelp, 962). +-define(wxMenuItem_GetId, 963). +-define(wxMenuItem_GetKind, 964). +-define(wxMenuItem_GetLabel, 965). +-define(wxMenuItem_GetLabelFromText, 966). +-define(wxMenuItem_GetMenu, 967). +-define(wxMenuItem_GetText, 968). +-define(wxMenuItem_GetSubMenu, 969). +-define(wxMenuItem_IsCheckable, 970). +-define(wxMenuItem_IsChecked, 971). +-define(wxMenuItem_IsEnabled, 972). +-define(wxMenuItem_IsSeparator, 973). +-define(wxMenuItem_IsSubMenu, 974). +-define(wxMenuItem_SetBitmap, 975). +-define(wxMenuItem_SetHelp, 976). +-define(wxMenuItem_SetMenu, 977). +-define(wxMenuItem_SetSubMenu, 978). +-define(wxMenuItem_SetText, 979). +-define(wxToolBar_AddControl, 980). +-define(wxToolBar_AddSeparator, 981). +-define(wxToolBar_AddTool_5, 982). +-define(wxToolBar_AddTool_4_0, 983). +-define(wxToolBar_AddTool_1, 984). +-define(wxToolBar_AddTool_4_1, 985). +-define(wxToolBar_AddTool_3, 986). +-define(wxToolBar_AddTool_6, 987). +-define(wxToolBar_AddCheckTool, 988). +-define(wxToolBar_AddRadioTool, 989). +-define(wxToolBar_AddStretchableSpace, 990). +-define(wxToolBar_InsertStretchableSpace, 991). +-define(wxToolBar_DeleteTool, 992). +-define(wxToolBar_DeleteToolByPos, 993). +-define(wxToolBar_EnableTool, 994). +-define(wxToolBar_FindById, 995). +-define(wxToolBar_FindControl, 996). +-define(wxToolBar_FindToolForPosition, 997). +-define(wxToolBar_GetToolSize, 998). +-define(wxToolBar_GetToolBitmapSize, 999). +-define(wxToolBar_GetMargins, 1000). +-define(wxToolBar_GetToolEnabled, 1001). +-define(wxToolBar_GetToolLongHelp, 1002). +-define(wxToolBar_GetToolPacking, 1003). +-define(wxToolBar_GetToolPos, 1004). +-define(wxToolBar_GetToolSeparation, 1005). +-define(wxToolBar_GetToolShortHelp, 1006). +-define(wxToolBar_GetToolState, 1007). +-define(wxToolBar_InsertControl, 1008). +-define(wxToolBar_InsertSeparator, 1009). +-define(wxToolBar_InsertTool_5, 1010). +-define(wxToolBar_InsertTool_2, 1011). +-define(wxToolBar_InsertTool_4, 1012). +-define(wxToolBar_Realize, 1013). +-define(wxToolBar_RemoveTool, 1014). +-define(wxToolBar_SetMargins, 1015). +-define(wxToolBar_SetToolBitmapSize, 1016). +-define(wxToolBar_SetToolLongHelp, 1017). +-define(wxToolBar_SetToolPacking, 1018). +-define(wxToolBar_SetToolShortHelp, 1019). +-define(wxToolBar_SetToolSeparation, 1020). +-define(wxToolBar_ToggleTool, 1021). +-define(wxStatusBar_new_0, 1023). +-define(wxStatusBar_new_2, 1024). +-define(wxStatusBar_destruct, 1026). +-define(wxStatusBar_Create, 1027). +-define(wxStatusBar_GetFieldRect, 1028). +-define(wxStatusBar_GetFieldsCount, 1029). +-define(wxStatusBar_GetStatusText, 1030). +-define(wxStatusBar_PopStatusText, 1031). +-define(wxStatusBar_PushStatusText, 1032). +-define(wxStatusBar_SetFieldsCount, 1033). +-define(wxStatusBar_SetMinHeight, 1034). +-define(wxStatusBar_SetStatusText, 1035). +-define(wxStatusBar_SetStatusWidths, 1036). +-define(wxStatusBar_SetStatusStyles, 1037). +-define(wxBitmap_new_0, 1038). +-define(wxBitmap_new_3, 1039). +-define(wxBitmap_new_4, 1040). +-define(wxBitmap_new_2_0, 1041). +-define(wxBitmap_new_2_1, 1042). +-define(wxBitmap_destruct, 1043). +-define(wxBitmap_ConvertToImage, 1044). +-define(wxBitmap_CopyFromIcon, 1045). +-define(wxBitmap_Create, 1046). +-define(wxBitmap_GetDepth, 1047). +-define(wxBitmap_GetHeight, 1048). +-define(wxBitmap_GetPalette, 1049). +-define(wxBitmap_GetMask, 1050). +-define(wxBitmap_GetWidth, 1051). +-define(wxBitmap_GetSubBitmap, 1052). +-define(wxBitmap_LoadFile, 1053). +-define(wxBitmap_Ok, 1054). +-define(wxBitmap_SaveFile, 1055). +-define(wxBitmap_SetDepth, 1056). +-define(wxBitmap_SetHeight, 1057). +-define(wxBitmap_SetMask, 1058). +-define(wxBitmap_SetPalette, 1059). +-define(wxBitmap_SetWidth, 1060). +-define(wxIcon_new_0, 1061). +-define(wxIcon_new_2, 1062). +-define(wxIcon_new_1, 1063). +-define(wxIcon_CopyFromBitmap, 1064). +-define(wxIcon_destroy, 1065). +-define(wxIconBundle_new_0, 1066). +-define(wxIconBundle_new_2, 1067). +-define(wxIconBundle_new_1_0, 1068). +-define(wxIconBundle_new_1_1, 1069). +-define(wxIconBundle_destruct, 1070). +-define(wxIconBundle_AddIcon_2, 1071). +-define(wxIconBundle_AddIcon_1, 1072). +-define(wxIconBundle_GetIcon_1_1, 1073). +-define(wxIconBundle_GetIcon_1_0, 1074). +-define(wxCursor_new_0, 1075). +-define(wxCursor_new_1_0, 1076). +-define(wxCursor_new_1_1, 1077). +-define(wxCursor_new_4, 1078). +-define(wxCursor_destruct, 1079). +-define(wxCursor_Ok, 1080). +-define(wxMask_new_0, 1081). +-define(wxMask_new_2_1, 1082). +-define(wxMask_new_2_0, 1083). +-define(wxMask_new_1, 1084). +-define(wxMask_destruct, 1085). +-define(wxMask_Create_2_1, 1086). +-define(wxMask_Create_2_0, 1087). +-define(wxMask_Create_1, 1088). +-define(wxImage_new_0, 1089). +-define(wxImage_new_3_0, 1090). +-define(wxImage_new_4, 1091). +-define(wxImage_new_5, 1092). +-define(wxImage_new_2, 1093). +-define(wxImage_new_3_1, 1094). +-define(wxImage_Blur, 1095). +-define(wxImage_BlurHorizontal, 1096). +-define(wxImage_BlurVertical, 1097). +-define(wxImage_ConvertAlphaToMask, 1098). +-define(wxImage_ConvertToGreyscale, 1099). +-define(wxImage_ConvertToMono, 1100). +-define(wxImage_Copy, 1101). +-define(wxImage_Create_3, 1102). +-define(wxImage_Create_4, 1103). +-define(wxImage_Create_5, 1104). +-define(wxImage_Destroy, 1105). +-define(wxImage_FindFirstUnusedColour, 1106). +-define(wxImage_GetImageExtWildcard, 1107). +-define(wxImage_GetAlpha_2, 1108). +-define(wxImage_GetAlpha_0, 1109). +-define(wxImage_GetBlue, 1110). +-define(wxImage_GetData, 1111). +-define(wxImage_GetGreen, 1112). +-define(wxImage_GetImageCount, 1113). +-define(wxImage_GetHeight, 1114). +-define(wxImage_GetMaskBlue, 1115). +-define(wxImage_GetMaskGreen, 1116). +-define(wxImage_GetMaskRed, 1117). +-define(wxImage_GetOrFindMaskColour, 1118). +-define(wxImage_GetPalette, 1119). +-define(wxImage_GetRed, 1120). +-define(wxImage_GetSubImage, 1121). +-define(wxImage_GetWidth, 1122). +-define(wxImage_HasAlpha, 1123). +-define(wxImage_HasMask, 1124). +-define(wxImage_GetOption, 1125). +-define(wxImage_GetOptionInt, 1126). +-define(wxImage_HasOption, 1127). +-define(wxImage_InitAlpha, 1128). +-define(wxImage_InitStandardHandlers, 1129). +-define(wxImage_IsTransparent, 1130). +-define(wxImage_LoadFile_2, 1131). +-define(wxImage_LoadFile_3, 1132). +-define(wxImage_Ok, 1133). +-define(wxImage_RemoveHandler, 1134). +-define(wxImage_Mirror, 1135). +-define(wxImage_Replace, 1136). +-define(wxImage_Rescale, 1137). +-define(wxImage_Resize, 1138). +-define(wxImage_Rotate, 1139). +-define(wxImage_RotateHue, 1140). +-define(wxImage_Rotate90, 1141). +-define(wxImage_SaveFile_1, 1142). +-define(wxImage_SaveFile_2_0, 1143). +-define(wxImage_SaveFile_2_1, 1144). +-define(wxImage_Scale, 1145). +-define(wxImage_Size, 1146). +-define(wxImage_SetAlpha_3, 1147). +-define(wxImage_SetAlpha_2, 1148). +-define(wxImage_SetData_2, 1149). +-define(wxImage_SetData_4, 1150). +-define(wxImage_SetMask, 1151). +-define(wxImage_SetMaskColour, 1152). +-define(wxImage_SetMaskFromImage, 1153). +-define(wxImage_SetOption_2_1, 1154). +-define(wxImage_SetOption_2_0, 1155). +-define(wxImage_SetPalette, 1156). +-define(wxImage_SetRGB_5, 1157). +-define(wxImage_SetRGB_4, 1158). +-define(wxImage_destroy, 1159). +-define(wxBrush_new_0, 1160). +-define(wxBrush_new_2, 1161). +-define(wxBrush_new_1, 1162). +-define(wxBrush_destruct, 1164). +-define(wxBrush_GetColour, 1165). +-define(wxBrush_GetStipple, 1166). +-define(wxBrush_GetStyle, 1167). +-define(wxBrush_IsHatch, 1168). +-define(wxBrush_IsOk, 1169). +-define(wxBrush_SetColour_1, 1170). +-define(wxBrush_SetColour_3, 1171). +-define(wxBrush_SetStipple, 1172). +-define(wxBrush_SetStyle, 1173). +-define(wxPen_new_0, 1174). +-define(wxPen_new_2, 1175). +-define(wxPen_destruct, 1176). +-define(wxPen_GetCap, 1177). +-define(wxPen_GetColour, 1178). +-define(wxPen_GetJoin, 1179). +-define(wxPen_GetStyle, 1180). +-define(wxPen_GetWidth, 1181). +-define(wxPen_IsOk, 1182). +-define(wxPen_SetCap, 1183). +-define(wxPen_SetColour_1, 1184). +-define(wxPen_SetColour_3, 1185). +-define(wxPen_SetJoin, 1186). +-define(wxPen_SetStyle, 1187). +-define(wxPen_SetWidth, 1188). +-define(wxRegion_new_0, 1189). +-define(wxRegion_new_4, 1190). +-define(wxRegion_new_2, 1191). +-define(wxRegion_new_1_1, 1192). +-define(wxRegion_new_1_0, 1194). +-define(wxRegion_destruct, 1196). +-define(wxRegion_Clear, 1197). +-define(wxRegion_Contains_2, 1198). +-define(wxRegion_Contains_1_0, 1199). +-define(wxRegion_Contains_4, 1200). +-define(wxRegion_Contains_1_1, 1201). +-define(wxRegion_ConvertToBitmap, 1202). +-define(wxRegion_GetBox, 1203). +-define(wxRegion_Intersect_4, 1204). +-define(wxRegion_Intersect_1_1, 1205). +-define(wxRegion_Intersect_1_0, 1206). +-define(wxRegion_IsEmpty, 1207). +-define(wxRegion_Subtract_4, 1208). +-define(wxRegion_Subtract_1_1, 1209). +-define(wxRegion_Subtract_1_0, 1210). +-define(wxRegion_Offset_2, 1211). +-define(wxRegion_Offset_1, 1212). +-define(wxRegion_Union_4, 1213). +-define(wxRegion_Union_1_2, 1214). +-define(wxRegion_Union_1_1, 1215). +-define(wxRegion_Union_1_0, 1216). +-define(wxRegion_Union_3, 1217). +-define(wxRegion_Xor_4, 1218). +-define(wxRegion_Xor_1_1, 1219). +-define(wxRegion_Xor_1_0, 1220). +-define(wxAcceleratorTable_new_0, 1221). +-define(wxAcceleratorTable_new_2, 1222). +-define(wxAcceleratorTable_destruct, 1223). +-define(wxAcceleratorTable_Ok, 1224). +-define(wxAcceleratorEntry_new_1_0, 1225). +-define(wxAcceleratorEntry_new_1_1, 1226). +-define(wxAcceleratorEntry_GetCommand, 1227). +-define(wxAcceleratorEntry_GetFlags, 1228). +-define(wxAcceleratorEntry_GetKeyCode, 1229). +-define(wxAcceleratorEntry_Set, 1230). +-define(wxAcceleratorEntry_destroy, 1231). +-define(wxCaret_new_3, 1236). +-define(wxCaret_new_2, 1237). +-define(wxCaret_destruct, 1239). +-define(wxCaret_Create_3, 1240). +-define(wxCaret_Create_2, 1241). +-define(wxCaret_GetBlinkTime, 1242). +-define(wxCaret_GetPosition, 1244). +-define(wxCaret_GetSize, 1246). +-define(wxCaret_GetWindow, 1247). +-define(wxCaret_Hide, 1248). +-define(wxCaret_IsOk, 1249). +-define(wxCaret_IsVisible, 1250). +-define(wxCaret_Move_2, 1251). +-define(wxCaret_Move_1, 1252). +-define(wxCaret_SetBlinkTime, 1253). +-define(wxCaret_SetSize_2, 1254). +-define(wxCaret_SetSize_1, 1255). +-define(wxCaret_Show, 1256). +-define(wxSizer_Add_2_1, 1257). +-define(wxSizer_Add_2_0, 1258). +-define(wxSizer_Add_3, 1259). +-define(wxSizer_Add_2_3, 1260). +-define(wxSizer_Add_2_2, 1261). +-define(wxSizer_AddSpacer, 1262). +-define(wxSizer_AddStretchSpacer, 1263). +-define(wxSizer_CalcMin, 1264). +-define(wxSizer_Clear, 1265). +-define(wxSizer_Detach_1_2, 1266). +-define(wxSizer_Detach_1_1, 1267). +-define(wxSizer_Detach_1_0, 1268). +-define(wxSizer_Fit, 1269). +-define(wxSizer_FitInside, 1270). +-define(wxSizer_GetChildren, 1271). +-define(wxSizer_GetItem_2_1, 1272). +-define(wxSizer_GetItem_2_0, 1273). +-define(wxSizer_GetItem_1, 1274). +-define(wxSizer_GetSize, 1275). +-define(wxSizer_GetPosition, 1276). +-define(wxSizer_GetMinSize, 1277). +-define(wxSizer_Hide_2_0, 1278). +-define(wxSizer_Hide_2_1, 1279). +-define(wxSizer_Hide_1, 1280). +-define(wxSizer_Insert_3_1, 1281). +-define(wxSizer_Insert_3_0, 1282). +-define(wxSizer_Insert_4, 1283). +-define(wxSizer_Insert_3_3, 1284). +-define(wxSizer_Insert_3_2, 1285). +-define(wxSizer_Insert_2, 1286). +-define(wxSizer_InsertSpacer, 1287). +-define(wxSizer_InsertStretchSpacer, 1288). +-define(wxSizer_IsShown_1_2, 1289). +-define(wxSizer_IsShown_1_1, 1290). +-define(wxSizer_IsShown_1_0, 1291). +-define(wxSizer_Layout, 1292). +-define(wxSizer_Prepend_2_1, 1293). +-define(wxSizer_Prepend_2_0, 1294). +-define(wxSizer_Prepend_3, 1295). +-define(wxSizer_Prepend_2_3, 1296). +-define(wxSizer_Prepend_2_2, 1297). +-define(wxSizer_Prepend_1, 1298). +-define(wxSizer_PrependSpacer, 1299). +-define(wxSizer_PrependStretchSpacer, 1300). +-define(wxSizer_RecalcSizes, 1301). +-define(wxSizer_Remove_1_1, 1302). +-define(wxSizer_Remove_1_0, 1303). +-define(wxSizer_Replace_3_1, 1304). +-define(wxSizer_Replace_3_0, 1305). +-define(wxSizer_Replace_2, 1306). +-define(wxSizer_SetDimension, 1307). +-define(wxSizer_SetMinSize_2, 1308). +-define(wxSizer_SetMinSize_1, 1309). +-define(wxSizer_SetItemMinSize_3_2, 1310). +-define(wxSizer_SetItemMinSize_2_2, 1311). +-define(wxSizer_SetItemMinSize_3_1, 1312). +-define(wxSizer_SetItemMinSize_2_1, 1313). +-define(wxSizer_SetItemMinSize_3_0, 1314). +-define(wxSizer_SetItemMinSize_2_0, 1315). +-define(wxSizer_SetSizeHints, 1316). +-define(wxSizer_SetVirtualSizeHints, 1317). +-define(wxSizer_Show_2_2, 1318). +-define(wxSizer_Show_2_1, 1319). +-define(wxSizer_Show_2_0, 1320). +-define(wxSizer_Show_1, 1321). +-define(wxSizerFlags_new, 1322). +-define(wxSizerFlags_Align, 1323). +-define(wxSizerFlags_Border_2, 1324). +-define(wxSizerFlags_Border_1, 1325). +-define(wxSizerFlags_Center, 1326). +-define(wxSizerFlags_Centre, 1327). +-define(wxSizerFlags_Expand, 1328). +-define(wxSizerFlags_Left, 1329). +-define(wxSizerFlags_Proportion, 1330). +-define(wxSizerFlags_Right, 1331). +-define(wxSizerFlags_destroy, 1332). +-define(wxSizerItem_new_5_1, 1333). +-define(wxSizerItem_new_2_1, 1334). +-define(wxSizerItem_new_5_0, 1335). +-define(wxSizerItem_new_2_0, 1336). +-define(wxSizerItem_new_6, 1337). +-define(wxSizerItem_new_3, 1338). +-define(wxSizerItem_new_0, 1339). +-define(wxSizerItem_destruct, 1340). +-define(wxSizerItem_CalcMin, 1341). +-define(wxSizerItem_DeleteWindows, 1342). +-define(wxSizerItem_DetachSizer, 1343). +-define(wxSizerItem_GetBorder, 1344). +-define(wxSizerItem_GetFlag, 1345). +-define(wxSizerItem_GetMinSize, 1346). +-define(wxSizerItem_GetPosition, 1347). +-define(wxSizerItem_GetProportion, 1348). +-define(wxSizerItem_GetRatio, 1349). +-define(wxSizerItem_GetRect, 1350). +-define(wxSizerItem_GetSize, 1351). +-define(wxSizerItem_GetSizer, 1352). +-define(wxSizerItem_GetSpacer, 1353). +-define(wxSizerItem_GetUserData, 1354). +-define(wxSizerItem_GetWindow, 1355). +-define(wxSizerItem_IsSizer, 1356). +-define(wxSizerItem_IsShown, 1357). +-define(wxSizerItem_IsSpacer, 1358). +-define(wxSizerItem_IsWindow, 1359). +-define(wxSizerItem_SetBorder, 1360). +-define(wxSizerItem_SetDimension, 1361). +-define(wxSizerItem_SetFlag, 1362). +-define(wxSizerItem_SetInitSize, 1363). +-define(wxSizerItem_SetMinSize_1, 1364). +-define(wxSizerItem_SetMinSize_2, 1365). +-define(wxSizerItem_SetProportion, 1366). +-define(wxSizerItem_SetRatio_2, 1367). +-define(wxSizerItem_SetRatio_1_1, 1368). +-define(wxSizerItem_SetRatio_1_0, 1369). +-define(wxSizerItem_SetSizer, 1370). +-define(wxSizerItem_SetSpacer_1, 1371). +-define(wxSizerItem_SetSpacer_2, 1372). +-define(wxSizerItem_SetWindow, 1373). +-define(wxSizerItem_Show, 1374). +-define(wxBoxSizer_new, 1375). +-define(wxBoxSizer_GetOrientation, 1376). +-define(wxBoxSizer_destroy, 1377). +-define(wxStaticBoxSizer_new_2, 1378). +-define(wxStaticBoxSizer_new_3, 1379). +-define(wxStaticBoxSizer_GetStaticBox, 1380). +-define(wxStaticBoxSizer_destroy, 1381). +-define(wxGridSizer_new_4, 1382). +-define(wxGridSizer_new_2, 1383). +-define(wxGridSizer_GetCols, 1384). +-define(wxGridSizer_GetHGap, 1385). +-define(wxGridSizer_GetRows, 1386). +-define(wxGridSizer_GetVGap, 1387). +-define(wxGridSizer_SetCols, 1388). +-define(wxGridSizer_SetHGap, 1389). +-define(wxGridSizer_SetRows, 1390). +-define(wxGridSizer_SetVGap, 1391). +-define(wxGridSizer_destroy, 1392). +-define(wxFlexGridSizer_new_4, 1393). +-define(wxFlexGridSizer_new_2, 1394). +-define(wxFlexGridSizer_AddGrowableCol, 1395). +-define(wxFlexGridSizer_AddGrowableRow, 1396). +-define(wxFlexGridSizer_GetFlexibleDirection, 1397). +-define(wxFlexGridSizer_GetNonFlexibleGrowMode, 1398). +-define(wxFlexGridSizer_RemoveGrowableCol, 1399). +-define(wxFlexGridSizer_RemoveGrowableRow, 1400). +-define(wxFlexGridSizer_SetFlexibleDirection, 1401). +-define(wxFlexGridSizer_SetNonFlexibleGrowMode, 1402). +-define(wxFlexGridSizer_destroy, 1403). +-define(wxGridBagSizer_new, 1404). +-define(wxGridBagSizer_Add_3_2, 1405). +-define(wxGridBagSizer_Add_3_1, 1406). +-define(wxGridBagSizer_Add_4, 1407). +-define(wxGridBagSizer_Add_1_0, 1408). +-define(wxGridBagSizer_Add_2_1, 1409). +-define(wxGridBagSizer_Add_2_0, 1410). +-define(wxGridBagSizer_Add_3_0, 1411). +-define(wxGridBagSizer_Add_1_1, 1412). +-define(wxGridBagSizer_CalcMin, 1413). +-define(wxGridBagSizer_CheckForIntersection_2, 1414). +-define(wxGridBagSizer_CheckForIntersection_3, 1415). +-define(wxGridBagSizer_FindItem_1_1, 1416). +-define(wxGridBagSizer_FindItem_1_0, 1417). +-define(wxGridBagSizer_FindItemAtPoint, 1418). +-define(wxGridBagSizer_FindItemAtPosition, 1419). +-define(wxGridBagSizer_FindItemWithData, 1420). +-define(wxGridBagSizer_GetCellSize, 1421). +-define(wxGridBagSizer_GetEmptyCellSize, 1422). +-define(wxGridBagSizer_GetItemPosition_1_2, 1423). +-define(wxGridBagSizer_GetItemPosition_1_1, 1424). +-define(wxGridBagSizer_GetItemPosition_1_0, 1425). +-define(wxGridBagSizer_GetItemSpan_1_2, 1426). +-define(wxGridBagSizer_GetItemSpan_1_1, 1427). +-define(wxGridBagSizer_GetItemSpan_1_0, 1428). +-define(wxGridBagSizer_SetEmptyCellSize, 1429). +-define(wxGridBagSizer_SetItemPosition_2_2, 1430). +-define(wxGridBagSizer_SetItemPosition_2_1, 1431). +-define(wxGridBagSizer_SetItemPosition_2_0, 1432). +-define(wxGridBagSizer_SetItemSpan_2_2, 1433). +-define(wxGridBagSizer_SetItemSpan_2_1, 1434). +-define(wxGridBagSizer_SetItemSpan_2_0, 1435). +-define(wxGridBagSizer_destroy, 1436). +-define(wxStdDialogButtonSizer_new, 1437). +-define(wxStdDialogButtonSizer_AddButton, 1438). +-define(wxStdDialogButtonSizer_Realize, 1439). +-define(wxStdDialogButtonSizer_SetAffirmativeButton, 1440). +-define(wxStdDialogButtonSizer_SetCancelButton, 1441). +-define(wxStdDialogButtonSizer_SetNegativeButton, 1442). +-define(wxStdDialogButtonSizer_destroy, 1443). +-define(wxFont_new_0, 1444). +-define(wxFont_new_1, 1445). +-define(wxFont_new_5, 1446). +-define(wxFont_destruct, 1448). +-define(wxFont_IsFixedWidth, 1449). +-define(wxFont_GetDefaultEncoding, 1450). +-define(wxFont_GetFaceName, 1451). +-define(wxFont_GetFamily, 1452). +-define(wxFont_GetNativeFontInfoDesc, 1453). +-define(wxFont_GetNativeFontInfoUserDesc, 1454). +-define(wxFont_GetPointSize, 1455). +-define(wxFont_GetStyle, 1456). +-define(wxFont_GetUnderlined, 1457). +-define(wxFont_GetWeight, 1458). +-define(wxFont_Ok, 1459). +-define(wxFont_SetDefaultEncoding, 1460). +-define(wxFont_SetFaceName, 1461). +-define(wxFont_SetFamily, 1462). +-define(wxFont_SetPointSize, 1463). +-define(wxFont_SetStyle, 1464). +-define(wxFont_SetUnderlined, 1465). +-define(wxFont_SetWeight, 1466). +-define(wxToolTip_Enable, 1467). +-define(wxToolTip_SetDelay, 1468). +-define(wxToolTip_new, 1469). +-define(wxToolTip_SetTip, 1470). +-define(wxToolTip_GetTip, 1471). +-define(wxToolTip_GetWindow, 1472). +-define(wxToolTip_destroy, 1473). +-define(wxButton_new_3, 1475). +-define(wxButton_new_0, 1476). +-define(wxButton_destruct, 1477). +-define(wxButton_Create, 1478). +-define(wxButton_GetDefaultSize, 1479). +-define(wxButton_SetDefault, 1480). +-define(wxButton_SetLabel, 1481). +-define(wxBitmapButton_new_4, 1483). +-define(wxBitmapButton_new_0, 1484). +-define(wxBitmapButton_Create, 1485). +-define(wxBitmapButton_GetBitmapDisabled, 1486). +-define(wxBitmapButton_GetBitmapFocus, 1488). +-define(wxBitmapButton_GetBitmapLabel, 1490). +-define(wxBitmapButton_GetBitmapSelected, 1492). +-define(wxBitmapButton_SetBitmapDisabled, 1494). +-define(wxBitmapButton_SetBitmapFocus, 1495). +-define(wxBitmapButton_SetBitmapLabel, 1496). +-define(wxBitmapButton_SetBitmapSelected, 1497). +-define(wxBitmapButton_destroy, 1498). +-define(wxToggleButton_new_0, 1499). +-define(wxToggleButton_new_4, 1500). +-define(wxToggleButton_Create, 1501). +-define(wxToggleButton_GetValue, 1502). +-define(wxToggleButton_SetValue, 1503). +-define(wxToggleButton_destroy, 1504). +-define(wxCalendarCtrl_new_0, 1505). +-define(wxCalendarCtrl_new_3, 1506). +-define(wxCalendarCtrl_Create, 1507). +-define(wxCalendarCtrl_destruct, 1508). +-define(wxCalendarCtrl_SetDate, 1509). +-define(wxCalendarCtrl_GetDate, 1510). +-define(wxCalendarCtrl_EnableYearChange, 1511). +-define(wxCalendarCtrl_EnableMonthChange, 1512). +-define(wxCalendarCtrl_EnableHolidayDisplay, 1513). +-define(wxCalendarCtrl_SetHeaderColours, 1514). +-define(wxCalendarCtrl_GetHeaderColourFg, 1515). +-define(wxCalendarCtrl_GetHeaderColourBg, 1516). +-define(wxCalendarCtrl_SetHighlightColours, 1517). +-define(wxCalendarCtrl_GetHighlightColourFg, 1518). +-define(wxCalendarCtrl_GetHighlightColourBg, 1519). +-define(wxCalendarCtrl_SetHolidayColours, 1520). +-define(wxCalendarCtrl_GetHolidayColourFg, 1521). +-define(wxCalendarCtrl_GetHolidayColourBg, 1522). +-define(wxCalendarCtrl_GetAttr, 1523). +-define(wxCalendarCtrl_SetAttr, 1524). +-define(wxCalendarCtrl_SetHoliday, 1525). +-define(wxCalendarCtrl_ResetAttr, 1526). +-define(wxCalendarCtrl_HitTest, 1527). +-define(wxCalendarDateAttr_new_0, 1528). +-define(wxCalendarDateAttr_new_2_1, 1529). +-define(wxCalendarDateAttr_new_2_0, 1530). +-define(wxCalendarDateAttr_SetTextColour, 1531). +-define(wxCalendarDateAttr_SetBackgroundColour, 1532). +-define(wxCalendarDateAttr_SetBorderColour, 1533). +-define(wxCalendarDateAttr_SetFont, 1534). +-define(wxCalendarDateAttr_SetBorder, 1535). +-define(wxCalendarDateAttr_SetHoliday, 1536). +-define(wxCalendarDateAttr_HasTextColour, 1537). +-define(wxCalendarDateAttr_HasBackgroundColour, 1538). +-define(wxCalendarDateAttr_HasBorderColour, 1539). +-define(wxCalendarDateAttr_HasFont, 1540). +-define(wxCalendarDateAttr_HasBorder, 1541). +-define(wxCalendarDateAttr_IsHoliday, 1542). +-define(wxCalendarDateAttr_GetTextColour, 1543). +-define(wxCalendarDateAttr_GetBackgroundColour, 1544). +-define(wxCalendarDateAttr_GetBorderColour, 1545). +-define(wxCalendarDateAttr_GetFont, 1546). +-define(wxCalendarDateAttr_GetBorder, 1547). +-define(wxCalendarDateAttr_destroy, 1548). +-define(wxCheckBox_new_4, 1550). +-define(wxCheckBox_new_0, 1551). +-define(wxCheckBox_Create, 1552). +-define(wxCheckBox_GetValue, 1553). +-define(wxCheckBox_Get3StateValue, 1554). +-define(wxCheckBox_Is3rdStateAllowedForUser, 1555). +-define(wxCheckBox_Is3State, 1556). +-define(wxCheckBox_IsChecked, 1557). +-define(wxCheckBox_SetValue, 1558). +-define(wxCheckBox_Set3StateValue, 1559). +-define(wxCheckBox_destroy, 1560). +-define(wxCheckListBox_new_0, 1561). +-define(wxCheckListBox_new_3, 1563). +-define(wxCheckListBox_Check, 1564). +-define(wxCheckListBox_IsChecked, 1565). +-define(wxCheckListBox_destroy, 1566). +-define(wxChoice_new_3, 1569). +-define(wxChoice_new_0, 1570). +-define(wxChoice_destruct, 1572). +-define(wxChoice_Create, 1574). +-define(wxChoice_Delete, 1575). +-define(wxChoice_GetColumns, 1576). +-define(wxChoice_SetColumns, 1577). +-define(wxComboBox_new_0, 1578). +-define(wxComboBox_new_3, 1580). +-define(wxComboBox_destruct, 1581). +-define(wxComboBox_Create, 1583). +-define(wxComboBox_CanCopy, 1584). +-define(wxComboBox_CanCut, 1585). +-define(wxComboBox_CanPaste, 1586). +-define(wxComboBox_CanRedo, 1587). +-define(wxComboBox_CanUndo, 1588). +-define(wxComboBox_Copy, 1589). +-define(wxComboBox_Cut, 1590). +-define(wxComboBox_GetInsertionPoint, 1591). +-define(wxComboBox_GetLastPosition, 1592). +-define(wxComboBox_GetValue, 1593). +-define(wxComboBox_Paste, 1594). +-define(wxComboBox_Redo, 1595). +-define(wxComboBox_Replace, 1596). +-define(wxComboBox_Remove, 1597). +-define(wxComboBox_SetInsertionPoint, 1598). +-define(wxComboBox_SetInsertionPointEnd, 1599). +-define(wxComboBox_SetSelection_1, 1600). +-define(wxComboBox_SetSelection_2, 1601). +-define(wxComboBox_SetValue, 1602). +-define(wxComboBox_Undo, 1603). +-define(wxGauge_new_0, 1604). +-define(wxGauge_new_4, 1605). +-define(wxGauge_Create, 1606). +-define(wxGauge_GetRange, 1607). +-define(wxGauge_GetValue, 1608). +-define(wxGauge_IsVertical, 1609). +-define(wxGauge_SetRange, 1610). +-define(wxGauge_SetValue, 1611). +-define(wxGauge_Pulse, 1612). +-define(wxGauge_destroy, 1613). +-define(wxGenericDirCtrl_new_0, 1614). +-define(wxGenericDirCtrl_new_2, 1615). +-define(wxGenericDirCtrl_destruct, 1616). +-define(wxGenericDirCtrl_Create, 1617). +-define(wxGenericDirCtrl_Init, 1618). +-define(wxGenericDirCtrl_CollapseTree, 1619). +-define(wxGenericDirCtrl_ExpandPath, 1620). +-define(wxGenericDirCtrl_GetDefaultPath, 1621). +-define(wxGenericDirCtrl_GetPath, 1622). +-define(wxGenericDirCtrl_GetFilePath, 1623). +-define(wxGenericDirCtrl_GetFilter, 1624). +-define(wxGenericDirCtrl_GetFilterIndex, 1625). +-define(wxGenericDirCtrl_GetRootId, 1626). +-define(wxGenericDirCtrl_GetTreeCtrl, 1627). +-define(wxGenericDirCtrl_ReCreateTree, 1628). +-define(wxGenericDirCtrl_SetDefaultPath, 1629). +-define(wxGenericDirCtrl_SetFilter, 1630). +-define(wxGenericDirCtrl_SetFilterIndex, 1631). +-define(wxGenericDirCtrl_SetPath, 1632). +-define(wxStaticBox_new_4, 1634). +-define(wxStaticBox_new_0, 1635). +-define(wxStaticBox_Create, 1636). +-define(wxStaticBox_destroy, 1637). +-define(wxStaticLine_new_2, 1639). +-define(wxStaticLine_new_0, 1640). +-define(wxStaticLine_Create, 1641). +-define(wxStaticLine_IsVertical, 1642). +-define(wxStaticLine_GetDefaultSize, 1643). +-define(wxStaticLine_destroy, 1644). +-define(wxListBox_new_3, 1647). +-define(wxListBox_new_0, 1648). +-define(wxListBox_destruct, 1650). +-define(wxListBox_Create, 1652). +-define(wxListBox_Deselect, 1653). +-define(wxListBox_GetSelections, 1654). +-define(wxListBox_InsertItems, 1655). +-define(wxListBox_IsSelected, 1656). +-define(wxListBox_Set, 1657). +-define(wxListBox_HitTest, 1658). +-define(wxListBox_SetFirstItem_1_0, 1659). +-define(wxListBox_SetFirstItem_1_1, 1660). +-define(wxListCtrl_new_0, 1661). +-define(wxListCtrl_new_2, 1662). +-define(wxListCtrl_Arrange, 1663). +-define(wxListCtrl_AssignImageList, 1664). +-define(wxListCtrl_ClearAll, 1665). +-define(wxListCtrl_Create, 1666). +-define(wxListCtrl_DeleteAllItems, 1667). +-define(wxListCtrl_DeleteColumn, 1668). +-define(wxListCtrl_DeleteItem, 1669). +-define(wxListCtrl_EditLabel, 1670). +-define(wxListCtrl_EnsureVisible, 1671). +-define(wxListCtrl_FindItem_3_0, 1672). +-define(wxListCtrl_FindItem_3_1, 1673). +-define(wxListCtrl_GetColumn, 1674). +-define(wxListCtrl_GetColumnCount, 1675). +-define(wxListCtrl_GetColumnWidth, 1676). +-define(wxListCtrl_GetCountPerPage, 1677). +-define(wxListCtrl_GetEditControl, 1678). +-define(wxListCtrl_GetImageList, 1679). +-define(wxListCtrl_GetItem, 1680). +-define(wxListCtrl_GetItemBackgroundColour, 1681). +-define(wxListCtrl_GetItemCount, 1682). +-define(wxListCtrl_GetItemData, 1683). +-define(wxListCtrl_GetItemFont, 1684). +-define(wxListCtrl_GetItemPosition, 1685). +-define(wxListCtrl_GetItemRect, 1686). +-define(wxListCtrl_GetItemSpacing, 1687). +-define(wxListCtrl_GetItemState, 1688). +-define(wxListCtrl_GetItemText, 1689). +-define(wxListCtrl_GetItemTextColour, 1690). +-define(wxListCtrl_GetNextItem, 1691). +-define(wxListCtrl_GetSelectedItemCount, 1692). +-define(wxListCtrl_GetTextColour, 1693). +-define(wxListCtrl_GetTopItem, 1694). +-define(wxListCtrl_GetViewRect, 1695). +-define(wxListCtrl_HitTest, 1696). +-define(wxListCtrl_InsertColumn_2, 1697). +-define(wxListCtrl_InsertColumn_3, 1698). +-define(wxListCtrl_InsertItem_1, 1699). +-define(wxListCtrl_InsertItem_2_1, 1700). +-define(wxListCtrl_InsertItem_2_0, 1701). +-define(wxListCtrl_InsertItem_3, 1702). +-define(wxListCtrl_RefreshItem, 1703). +-define(wxListCtrl_RefreshItems, 1704). +-define(wxListCtrl_ScrollList, 1705). +-define(wxListCtrl_SetBackgroundColour, 1706). +-define(wxListCtrl_SetColumn, 1707). +-define(wxListCtrl_SetColumnWidth, 1708). +-define(wxListCtrl_SetImageList, 1709). +-define(wxListCtrl_SetItem_1, 1710). +-define(wxListCtrl_SetItem_4, 1711). +-define(wxListCtrl_SetItemBackgroundColour, 1712). +-define(wxListCtrl_SetItemCount, 1713). +-define(wxListCtrl_SetItemData, 1714). +-define(wxListCtrl_SetItemFont, 1715). +-define(wxListCtrl_SetItemImage, 1716). +-define(wxListCtrl_SetItemColumnImage, 1717). +-define(wxListCtrl_SetItemPosition, 1718). +-define(wxListCtrl_SetItemState, 1719). +-define(wxListCtrl_SetItemText, 1720). +-define(wxListCtrl_SetItemTextColour, 1721). +-define(wxListCtrl_SetSingleStyle, 1722). +-define(wxListCtrl_SetTextColour, 1723). +-define(wxListCtrl_SetWindowStyleFlag, 1724). +-define(wxListCtrl_SortItems, 1725). +-define(wxListCtrl_destroy, 1726). +-define(wxListView_ClearColumnImage, 1727). +-define(wxListView_Focus, 1728). +-define(wxListView_GetFirstSelected, 1729). +-define(wxListView_GetFocusedItem, 1730). +-define(wxListView_GetNextSelected, 1731). +-define(wxListView_IsSelected, 1732). +-define(wxListView_Select, 1733). +-define(wxListView_SetColumnImage, 1734). +-define(wxListItem_new_0, 1735). +-define(wxListItem_new_1, 1736). +-define(wxListItem_destruct, 1737). +-define(wxListItem_Clear, 1738). +-define(wxListItem_GetAlign, 1739). +-define(wxListItem_GetBackgroundColour, 1740). +-define(wxListItem_GetColumn, 1741). +-define(wxListItem_GetFont, 1742). +-define(wxListItem_GetId, 1743). +-define(wxListItem_GetImage, 1744). +-define(wxListItem_GetMask, 1745). +-define(wxListItem_GetState, 1746). +-define(wxListItem_GetText, 1747). +-define(wxListItem_GetTextColour, 1748). +-define(wxListItem_GetWidth, 1749). +-define(wxListItem_SetAlign, 1750). +-define(wxListItem_SetBackgroundColour, 1751). +-define(wxListItem_SetColumn, 1752). +-define(wxListItem_SetFont, 1753). +-define(wxListItem_SetId, 1754). +-define(wxListItem_SetImage, 1755). +-define(wxListItem_SetMask, 1756). +-define(wxListItem_SetState, 1757). +-define(wxListItem_SetStateMask, 1758). +-define(wxListItem_SetText, 1759). +-define(wxListItem_SetTextColour, 1760). +-define(wxListItem_SetWidth, 1761). +-define(wxListItemAttr_new_0, 1762). +-define(wxListItemAttr_new_3, 1763). +-define(wxListItemAttr_GetBackgroundColour, 1764). +-define(wxListItemAttr_GetFont, 1765). +-define(wxListItemAttr_GetTextColour, 1766). +-define(wxListItemAttr_HasBackgroundColour, 1767). +-define(wxListItemAttr_HasFont, 1768). +-define(wxListItemAttr_HasTextColour, 1769). +-define(wxListItemAttr_SetBackgroundColour, 1770). +-define(wxListItemAttr_SetFont, 1771). +-define(wxListItemAttr_SetTextColour, 1772). +-define(wxListItemAttr_destroy, 1773). +-define(wxImageList_new_0, 1774). +-define(wxImageList_new_3, 1775). +-define(wxImageList_Add_1, 1776). +-define(wxImageList_Add_2_0, 1777). +-define(wxImageList_Add_2_1, 1778). +-define(wxImageList_Create, 1779). +-define(wxImageList_Draw, 1781). +-define(wxImageList_GetBitmap, 1782). +-define(wxImageList_GetIcon, 1783). +-define(wxImageList_GetImageCount, 1784). +-define(wxImageList_GetSize, 1785). +-define(wxImageList_Remove, 1786). +-define(wxImageList_RemoveAll, 1787). +-define(wxImageList_Replace_2, 1788). +-define(wxImageList_Replace_3, 1789). +-define(wxImageList_destroy, 1790). +-define(wxTextAttr_new_0, 1791). +-define(wxTextAttr_new_2, 1792). +-define(wxTextAttr_GetAlignment, 1793). +-define(wxTextAttr_GetBackgroundColour, 1794). +-define(wxTextAttr_GetFont, 1795). +-define(wxTextAttr_GetLeftIndent, 1796). +-define(wxTextAttr_GetLeftSubIndent, 1797). +-define(wxTextAttr_GetRightIndent, 1798). +-define(wxTextAttr_GetTabs, 1799). +-define(wxTextAttr_GetTextColour, 1800). +-define(wxTextAttr_HasBackgroundColour, 1801). +-define(wxTextAttr_HasFont, 1802). +-define(wxTextAttr_HasTextColour, 1803). +-define(wxTextAttr_GetFlags, 1804). +-define(wxTextAttr_IsDefault, 1805). +-define(wxTextAttr_SetAlignment, 1806). +-define(wxTextAttr_SetBackgroundColour, 1807). +-define(wxTextAttr_SetFlags, 1808). +-define(wxTextAttr_SetFont, 1809). +-define(wxTextAttr_SetLeftIndent, 1810). +-define(wxTextAttr_SetRightIndent, 1811). +-define(wxTextAttr_SetTabs, 1812). +-define(wxTextAttr_SetTextColour, 1813). +-define(wxTextAttr_destroy, 1814). +-define(wxTextCtrl_new_3, 1816). +-define(wxTextCtrl_new_0, 1817). +-define(wxTextCtrl_destruct, 1819). +-define(wxTextCtrl_AppendText, 1820). +-define(wxTextCtrl_CanCopy, 1821). +-define(wxTextCtrl_CanCut, 1822). +-define(wxTextCtrl_CanPaste, 1823). +-define(wxTextCtrl_CanRedo, 1824). +-define(wxTextCtrl_CanUndo, 1825). +-define(wxTextCtrl_Clear, 1826). +-define(wxTextCtrl_Copy, 1827). +-define(wxTextCtrl_Create, 1828). +-define(wxTextCtrl_Cut, 1829). +-define(wxTextCtrl_DiscardEdits, 1830). +-define(wxTextCtrl_ChangeValue, 1831). +-define(wxTextCtrl_EmulateKeyPress, 1832). +-define(wxTextCtrl_GetDefaultStyle, 1833). +-define(wxTextCtrl_GetInsertionPoint, 1834). +-define(wxTextCtrl_GetLastPosition, 1835). +-define(wxTextCtrl_GetLineLength, 1836). +-define(wxTextCtrl_GetLineText, 1837). +-define(wxTextCtrl_GetNumberOfLines, 1838). +-define(wxTextCtrl_GetRange, 1839). +-define(wxTextCtrl_GetSelection, 1840). +-define(wxTextCtrl_GetStringSelection, 1841). +-define(wxTextCtrl_GetStyle, 1842). +-define(wxTextCtrl_GetValue, 1843). +-define(wxTextCtrl_IsEditable, 1844). +-define(wxTextCtrl_IsModified, 1845). +-define(wxTextCtrl_IsMultiLine, 1846). +-define(wxTextCtrl_IsSingleLine, 1847). +-define(wxTextCtrl_LoadFile, 1848). +-define(wxTextCtrl_MarkDirty, 1849). +-define(wxTextCtrl_Paste, 1850). +-define(wxTextCtrl_PositionToXY, 1851). +-define(wxTextCtrl_Redo, 1852). +-define(wxTextCtrl_Remove, 1853). +-define(wxTextCtrl_Replace, 1854). +-define(wxTextCtrl_SaveFile, 1855). +-define(wxTextCtrl_SetDefaultStyle, 1856). +-define(wxTextCtrl_SetEditable, 1857). +-define(wxTextCtrl_SetInsertionPoint, 1858). +-define(wxTextCtrl_SetInsertionPointEnd, 1859). +-define(wxTextCtrl_SetMaxLength, 1861). +-define(wxTextCtrl_SetSelection, 1862). +-define(wxTextCtrl_SetStyle, 1863). +-define(wxTextCtrl_SetValue, 1864). +-define(wxTextCtrl_ShowPosition, 1865). +-define(wxTextCtrl_Undo, 1866). +-define(wxTextCtrl_WriteText, 1867). +-define(wxTextCtrl_XYToPosition, 1868). +-define(wxNotebook_new_0, 1871). +-define(wxNotebook_new_3, 1872). +-define(wxNotebook_destruct, 1873). +-define(wxNotebook_AddPage, 1874). +-define(wxNotebook_AdvanceSelection, 1875). +-define(wxNotebook_AssignImageList, 1876). +-define(wxNotebook_Create, 1877). +-define(wxNotebook_DeleteAllPages, 1878). +-define(wxNotebook_DeletePage, 1879). +-define(wxNotebook_RemovePage, 1880). +-define(wxNotebook_GetCurrentPage, 1881). +-define(wxNotebook_GetImageList, 1882). +-define(wxNotebook_GetPage, 1884). +-define(wxNotebook_GetPageCount, 1885). +-define(wxNotebook_GetPageImage, 1886). +-define(wxNotebook_GetPageText, 1887). +-define(wxNotebook_GetRowCount, 1888). +-define(wxNotebook_GetSelection, 1889). +-define(wxNotebook_GetThemeBackgroundColour, 1890). +-define(wxNotebook_HitTest, 1892). +-define(wxNotebook_InsertPage, 1894). +-define(wxNotebook_SetImageList, 1895). +-define(wxNotebook_SetPadding, 1896). +-define(wxNotebook_SetPageSize, 1897). +-define(wxNotebook_SetPageImage, 1898). +-define(wxNotebook_SetPageText, 1899). +-define(wxNotebook_SetSelection, 1900). +-define(wxNotebook_ChangeSelection, 1901). +-define(wxChoicebook_new_0, 1902). +-define(wxChoicebook_new_3, 1903). +-define(wxChoicebook_AddPage, 1904). +-define(wxChoicebook_AdvanceSelection, 1905). +-define(wxChoicebook_AssignImageList, 1906). +-define(wxChoicebook_Create, 1907). +-define(wxChoicebook_DeleteAllPages, 1908). +-define(wxChoicebook_DeletePage, 1909). +-define(wxChoicebook_RemovePage, 1910). +-define(wxChoicebook_GetCurrentPage, 1911). +-define(wxChoicebook_GetImageList, 1912). +-define(wxChoicebook_GetPage, 1914). +-define(wxChoicebook_GetPageCount, 1915). +-define(wxChoicebook_GetPageImage, 1916). +-define(wxChoicebook_GetPageText, 1917). +-define(wxChoicebook_GetSelection, 1918). +-define(wxChoicebook_HitTest, 1919). +-define(wxChoicebook_InsertPage, 1920). +-define(wxChoicebook_SetImageList, 1921). +-define(wxChoicebook_SetPageSize, 1922). +-define(wxChoicebook_SetPageImage, 1923). +-define(wxChoicebook_SetPageText, 1924). +-define(wxChoicebook_SetSelection, 1925). +-define(wxChoicebook_ChangeSelection, 1926). +-define(wxChoicebook_destroy, 1927). +-define(wxToolbook_new_0, 1928). +-define(wxToolbook_new_3, 1929). +-define(wxToolbook_AddPage, 1930). +-define(wxToolbook_AdvanceSelection, 1931). +-define(wxToolbook_AssignImageList, 1932). +-define(wxToolbook_Create, 1933). +-define(wxToolbook_DeleteAllPages, 1934). +-define(wxToolbook_DeletePage, 1935). +-define(wxToolbook_RemovePage, 1936). +-define(wxToolbook_GetCurrentPage, 1937). +-define(wxToolbook_GetImageList, 1938). +-define(wxToolbook_GetPage, 1940). +-define(wxToolbook_GetPageCount, 1941). +-define(wxToolbook_GetPageImage, 1942). +-define(wxToolbook_GetPageText, 1943). +-define(wxToolbook_GetSelection, 1944). +-define(wxToolbook_HitTest, 1946). +-define(wxToolbook_InsertPage, 1947). +-define(wxToolbook_SetImageList, 1948). +-define(wxToolbook_SetPageSize, 1949). +-define(wxToolbook_SetPageImage, 1950). +-define(wxToolbook_SetPageText, 1951). +-define(wxToolbook_SetSelection, 1952). +-define(wxToolbook_ChangeSelection, 1953). +-define(wxToolbook_destroy, 1954). +-define(wxListbook_new_0, 1955). +-define(wxListbook_new_3, 1956). +-define(wxListbook_AddPage, 1957). +-define(wxListbook_AdvanceSelection, 1958). +-define(wxListbook_AssignImageList, 1959). +-define(wxListbook_Create, 1960). +-define(wxListbook_DeleteAllPages, 1961). +-define(wxListbook_DeletePage, 1962). +-define(wxListbook_RemovePage, 1963). +-define(wxListbook_GetCurrentPage, 1964). +-define(wxListbook_GetImageList, 1965). +-define(wxListbook_GetPage, 1967). +-define(wxListbook_GetPageCount, 1968). +-define(wxListbook_GetPageImage, 1969). +-define(wxListbook_GetPageText, 1970). +-define(wxListbook_GetSelection, 1971). +-define(wxListbook_HitTest, 1973). +-define(wxListbook_InsertPage, 1974). +-define(wxListbook_SetImageList, 1975). +-define(wxListbook_SetPageSize, 1976). +-define(wxListbook_SetPageImage, 1977). +-define(wxListbook_SetPageText, 1978). +-define(wxListbook_SetSelection, 1979). +-define(wxListbook_ChangeSelection, 1980). +-define(wxListbook_destroy, 1981). +-define(wxTreebook_new_0, 1982). +-define(wxTreebook_new_3, 1983). +-define(wxTreebook_AddPage, 1984). +-define(wxTreebook_AdvanceSelection, 1985). +-define(wxTreebook_AssignImageList, 1986). +-define(wxTreebook_Create, 1987). +-define(wxTreebook_DeleteAllPages, 1988). +-define(wxTreebook_DeletePage, 1989). +-define(wxTreebook_RemovePage, 1990). +-define(wxTreebook_GetCurrentPage, 1991). +-define(wxTreebook_GetImageList, 1992). +-define(wxTreebook_GetPage, 1994). +-define(wxTreebook_GetPageCount, 1995). +-define(wxTreebook_GetPageImage, 1996). +-define(wxTreebook_GetPageText, 1997). +-define(wxTreebook_GetSelection, 1998). +-define(wxTreebook_ExpandNode, 1999). +-define(wxTreebook_IsNodeExpanded, 2000). +-define(wxTreebook_HitTest, 2002). +-define(wxTreebook_InsertPage, 2003). +-define(wxTreebook_InsertSubPage, 2004). +-define(wxTreebook_SetImageList, 2005). +-define(wxTreebook_SetPageSize, 2006). +-define(wxTreebook_SetPageImage, 2007). +-define(wxTreebook_SetPageText, 2008). +-define(wxTreebook_SetSelection, 2009). +-define(wxTreebook_ChangeSelection, 2010). +-define(wxTreebook_destroy, 2011). +-define(wxTreeCtrl_new_2, 2014). +-define(wxTreeCtrl_new_0, 2015). +-define(wxTreeCtrl_destruct, 2017). +-define(wxTreeCtrl_AddRoot, 2018). +-define(wxTreeCtrl_AppendItem, 2019). +-define(wxTreeCtrl_AssignImageList, 2020). +-define(wxTreeCtrl_AssignStateImageList, 2021). +-define(wxTreeCtrl_Collapse, 2022). +-define(wxTreeCtrl_CollapseAndReset, 2023). +-define(wxTreeCtrl_Create, 2024). +-define(wxTreeCtrl_Delete, 2025). +-define(wxTreeCtrl_DeleteAllItems, 2026). +-define(wxTreeCtrl_DeleteChildren, 2027). +-define(wxTreeCtrl_EditLabel, 2028). +-define(wxTreeCtrl_EnsureVisible, 2029). +-define(wxTreeCtrl_Expand, 2030). +-define(wxTreeCtrl_GetBoundingRect, 2031). +-define(wxTreeCtrl_GetChildrenCount, 2033). +-define(wxTreeCtrl_GetCount, 2034). +-define(wxTreeCtrl_GetEditControl, 2035). +-define(wxTreeCtrl_GetFirstChild, 2036). +-define(wxTreeCtrl_GetNextChild, 2037). +-define(wxTreeCtrl_GetFirstVisibleItem, 2038). +-define(wxTreeCtrl_GetImageList, 2039). +-define(wxTreeCtrl_GetIndent, 2040). +-define(wxTreeCtrl_GetItemBackgroundColour, 2041). +-define(wxTreeCtrl_GetItemData, 2042). +-define(wxTreeCtrl_GetItemFont, 2043). +-define(wxTreeCtrl_GetItemImage_1, 2044). +-define(wxTreeCtrl_GetItemImage_2, 2045). +-define(wxTreeCtrl_GetItemText, 2046). +-define(wxTreeCtrl_GetItemTextColour, 2047). +-define(wxTreeCtrl_GetLastChild, 2048). +-define(wxTreeCtrl_GetNextSibling, 2049). +-define(wxTreeCtrl_GetNextVisible, 2050). +-define(wxTreeCtrl_GetItemParent, 2051). +-define(wxTreeCtrl_GetPrevSibling, 2052). +-define(wxTreeCtrl_GetPrevVisible, 2053). +-define(wxTreeCtrl_GetRootItem, 2054). +-define(wxTreeCtrl_GetSelection, 2055). +-define(wxTreeCtrl_GetSelections, 2056). +-define(wxTreeCtrl_GetStateImageList, 2057). +-define(wxTreeCtrl_HitTest, 2058). +-define(wxTreeCtrl_InsertItem, 2060). +-define(wxTreeCtrl_IsBold, 2061). +-define(wxTreeCtrl_IsExpanded, 2062). +-define(wxTreeCtrl_IsSelected, 2063). +-define(wxTreeCtrl_IsVisible, 2064). +-define(wxTreeCtrl_ItemHasChildren, 2065). +-define(wxTreeCtrl_IsTreeItemIdOk, 2066). +-define(wxTreeCtrl_PrependItem, 2067). +-define(wxTreeCtrl_ScrollTo, 2068). +-define(wxTreeCtrl_SelectItem_1, 2069). +-define(wxTreeCtrl_SelectItem_2, 2070). +-define(wxTreeCtrl_SetIndent, 2071). +-define(wxTreeCtrl_SetImageList, 2072). +-define(wxTreeCtrl_SetItemBackgroundColour, 2073). +-define(wxTreeCtrl_SetItemBold, 2074). +-define(wxTreeCtrl_SetItemData, 2075). +-define(wxTreeCtrl_SetItemDropHighlight, 2076). +-define(wxTreeCtrl_SetItemFont, 2077). +-define(wxTreeCtrl_SetItemHasChildren, 2078). +-define(wxTreeCtrl_SetItemImage_2, 2079). +-define(wxTreeCtrl_SetItemImage_3, 2080). +-define(wxTreeCtrl_SetItemText, 2081). +-define(wxTreeCtrl_SetItemTextColour, 2082). +-define(wxTreeCtrl_SetStateImageList, 2083). +-define(wxTreeCtrl_SetWindowStyle, 2084). +-define(wxTreeCtrl_SortChildren, 2085). +-define(wxTreeCtrl_Toggle, 2086). +-define(wxTreeCtrl_ToggleItemSelection, 2087). +-define(wxTreeCtrl_Unselect, 2088). +-define(wxTreeCtrl_UnselectAll, 2089). +-define(wxTreeCtrl_UnselectItem, 2090). +-define(wxScrollBar_new_0, 2091). +-define(wxScrollBar_new_3, 2092). +-define(wxScrollBar_destruct, 2093). +-define(wxScrollBar_Create, 2094). +-define(wxScrollBar_GetRange, 2095). +-define(wxScrollBar_GetPageSize, 2096). +-define(wxScrollBar_GetThumbPosition, 2097). +-define(wxScrollBar_GetThumbSize, 2098). +-define(wxScrollBar_SetThumbPosition, 2099). +-define(wxScrollBar_SetScrollbar, 2100). +-define(wxSpinButton_new_2, 2102). +-define(wxSpinButton_new_0, 2103). +-define(wxSpinButton_Create, 2104). +-define(wxSpinButton_GetMax, 2105). +-define(wxSpinButton_GetMin, 2106). +-define(wxSpinButton_GetValue, 2107). +-define(wxSpinButton_SetRange, 2108). +-define(wxSpinButton_SetValue, 2109). +-define(wxSpinButton_destroy, 2110). +-define(wxSpinCtrl_new_0, 2111). +-define(wxSpinCtrl_new_2, 2112). +-define(wxSpinCtrl_Create, 2114). +-define(wxSpinCtrl_SetValue_1_1, 2117). +-define(wxSpinCtrl_SetValue_1_0, 2118). +-define(wxSpinCtrl_GetValue, 2120). +-define(wxSpinCtrl_SetRange, 2122). +-define(wxSpinCtrl_SetSelection, 2123). +-define(wxSpinCtrl_GetMin, 2125). +-define(wxSpinCtrl_GetMax, 2127). +-define(wxSpinCtrl_destroy, 2128). +-define(wxStaticText_new_0, 2129). +-define(wxStaticText_new_4, 2130). +-define(wxStaticText_Create, 2131). +-define(wxStaticText_GetLabel, 2132). +-define(wxStaticText_SetLabel, 2133). +-define(wxStaticText_Wrap, 2134). +-define(wxStaticText_destroy, 2135). +-define(wxStaticBitmap_new_0, 2136). +-define(wxStaticBitmap_new_4, 2137). +-define(wxStaticBitmap_Create, 2138). +-define(wxStaticBitmap_GetBitmap, 2139). +-define(wxStaticBitmap_SetBitmap, 2140). +-define(wxStaticBitmap_destroy, 2141). +-define(wxRadioBox_new, 2142). +-define(wxRadioBox_destruct, 2144). +-define(wxRadioBox_Create, 2145). +-define(wxRadioBox_Enable_2, 2146). +-define(wxRadioBox_Enable_1, 2147). +-define(wxRadioBox_GetSelection, 2148). +-define(wxRadioBox_GetString, 2149). +-define(wxRadioBox_SetSelection, 2150). +-define(wxRadioBox_Show_2, 2151). +-define(wxRadioBox_Show_1, 2152). +-define(wxRadioBox_GetColumnCount, 2153). +-define(wxRadioBox_GetItemHelpText, 2154). +-define(wxRadioBox_GetItemToolTip, 2155). +-define(wxRadioBox_GetItemFromPoint, 2157). +-define(wxRadioBox_GetRowCount, 2158). +-define(wxRadioBox_IsItemEnabled, 2159). +-define(wxRadioBox_IsItemShown, 2160). +-define(wxRadioBox_SetItemHelpText, 2161). +-define(wxRadioBox_SetItemToolTip, 2162). +-define(wxRadioButton_new_0, 2163). +-define(wxRadioButton_new_4, 2164). +-define(wxRadioButton_Create, 2165). +-define(wxRadioButton_GetValue, 2166). +-define(wxRadioButton_SetValue, 2167). +-define(wxRadioButton_destroy, 2168). +-define(wxSlider_new_6, 2170). +-define(wxSlider_new_0, 2171). +-define(wxSlider_Create, 2172). +-define(wxSlider_GetLineSize, 2173). +-define(wxSlider_GetMax, 2174). +-define(wxSlider_GetMin, 2175). +-define(wxSlider_GetPageSize, 2176). +-define(wxSlider_GetThumbLength, 2177). +-define(wxSlider_GetValue, 2178). +-define(wxSlider_SetLineSize, 2179). +-define(wxSlider_SetPageSize, 2180). +-define(wxSlider_SetRange, 2181). +-define(wxSlider_SetThumbLength, 2182). +-define(wxSlider_SetValue, 2183). +-define(wxSlider_destroy, 2184). +-define(wxDialog_new_4, 2186). +-define(wxDialog_new_0, 2187). +-define(wxDialog_destruct, 2189). +-define(wxDialog_Create, 2190). +-define(wxDialog_CreateButtonSizer, 2191). +-define(wxDialog_CreateStdDialogButtonSizer, 2192). +-define(wxDialog_EndModal, 2193). +-define(wxDialog_GetAffirmativeId, 2194). +-define(wxDialog_GetReturnCode, 2195). +-define(wxDialog_IsModal, 2196). +-define(wxDialog_SetAffirmativeId, 2197). +-define(wxDialog_SetReturnCode, 2198). +-define(wxDialog_Show, 2199). +-define(wxDialog_ShowModal, 2200). +-define(wxColourDialog_new_0, 2201). +-define(wxColourDialog_new_2, 2202). +-define(wxColourDialog_destruct, 2203). +-define(wxColourDialog_Create, 2204). +-define(wxColourDialog_GetColourData, 2205). +-define(wxColourData_new_0, 2206). +-define(wxColourData_new_1, 2207). +-define(wxColourData_destruct, 2208). +-define(wxColourData_GetChooseFull, 2209). +-define(wxColourData_GetColour, 2210). +-define(wxColourData_GetCustomColour, 2212). +-define(wxColourData_SetChooseFull, 2213). +-define(wxColourData_SetColour, 2214). +-define(wxColourData_SetCustomColour, 2215). +-define(wxPalette_new_0, 2216). +-define(wxPalette_new_4, 2217). +-define(wxPalette_destruct, 2219). +-define(wxPalette_Create, 2220). +-define(wxPalette_GetColoursCount, 2221). +-define(wxPalette_GetPixel, 2222). +-define(wxPalette_GetRGB, 2223). +-define(wxPalette_IsOk, 2224). +-define(wxDirDialog_new, 2228). +-define(wxDirDialog_destruct, 2229). +-define(wxDirDialog_GetPath, 2230). +-define(wxDirDialog_GetMessage, 2231). +-define(wxDirDialog_SetMessage, 2232). +-define(wxDirDialog_SetPath, 2233). +-define(wxFileDialog_new, 2237). +-define(wxFileDialog_destruct, 2238). +-define(wxFileDialog_GetDirectory, 2239). +-define(wxFileDialog_GetFilename, 2240). +-define(wxFileDialog_GetFilenames, 2241). +-define(wxFileDialog_GetFilterIndex, 2242). +-define(wxFileDialog_GetMessage, 2243). +-define(wxFileDialog_GetPath, 2244). +-define(wxFileDialog_GetPaths, 2245). +-define(wxFileDialog_GetWildcard, 2246). +-define(wxFileDialog_SetDirectory, 2247). +-define(wxFileDialog_SetFilename, 2248). +-define(wxFileDialog_SetFilterIndex, 2249). +-define(wxFileDialog_SetMessage, 2250). +-define(wxFileDialog_SetPath, 2251). +-define(wxFileDialog_SetWildcard, 2252). +-define(wxPickerBase_SetInternalMargin, 2253). +-define(wxPickerBase_GetInternalMargin, 2254). +-define(wxPickerBase_SetTextCtrlProportion, 2255). +-define(wxPickerBase_SetPickerCtrlProportion, 2256). +-define(wxPickerBase_GetTextCtrlProportion, 2257). +-define(wxPickerBase_GetPickerCtrlProportion, 2258). +-define(wxPickerBase_HasTextCtrl, 2259). +-define(wxPickerBase_GetTextCtrl, 2260). +-define(wxPickerBase_IsTextCtrlGrowable, 2261). +-define(wxPickerBase_SetPickerCtrlGrowable, 2262). +-define(wxPickerBase_SetTextCtrlGrowable, 2263). +-define(wxPickerBase_IsPickerCtrlGrowable, 2264). +-define(wxFilePickerCtrl_new_0, 2265). +-define(wxFilePickerCtrl_new_3, 2266). +-define(wxFilePickerCtrl_Create, 2267). +-define(wxFilePickerCtrl_GetPath, 2268). +-define(wxFilePickerCtrl_SetPath, 2269). +-define(wxFilePickerCtrl_destroy, 2270). +-define(wxDirPickerCtrl_new_0, 2271). +-define(wxDirPickerCtrl_new_3, 2272). +-define(wxDirPickerCtrl_Create, 2273). +-define(wxDirPickerCtrl_GetPath, 2274). +-define(wxDirPickerCtrl_SetPath, 2275). +-define(wxDirPickerCtrl_destroy, 2276). +-define(wxColourPickerCtrl_new_0, 2277). +-define(wxColourPickerCtrl_new_3, 2278). +-define(wxColourPickerCtrl_Create, 2279). +-define(wxColourPickerCtrl_GetColour, 2280). +-define(wxColourPickerCtrl_SetColour_1_1, 2281). +-define(wxColourPickerCtrl_SetColour_1_0, 2282). +-define(wxColourPickerCtrl_destroy, 2283). +-define(wxDatePickerCtrl_new_0, 2284). +-define(wxDatePickerCtrl_new_3, 2285). +-define(wxDatePickerCtrl_GetRange, 2286). +-define(wxDatePickerCtrl_GetValue, 2287). +-define(wxDatePickerCtrl_SetRange, 2288). +-define(wxDatePickerCtrl_SetValue, 2289). +-define(wxDatePickerCtrl_destroy, 2290). +-define(wxFontPickerCtrl_new_0, 2291). +-define(wxFontPickerCtrl_new_3, 2292). +-define(wxFontPickerCtrl_Create, 2293). +-define(wxFontPickerCtrl_GetSelectedFont, 2294). +-define(wxFontPickerCtrl_SetSelectedFont, 2295). +-define(wxFontPickerCtrl_GetMaxPointSize, 2296). +-define(wxFontPickerCtrl_SetMaxPointSize, 2297). +-define(wxFontPickerCtrl_destroy, 2298). +-define(wxFindReplaceDialog_new_0, 2301). +-define(wxFindReplaceDialog_new_4, 2302). +-define(wxFindReplaceDialog_destruct, 2303). +-define(wxFindReplaceDialog_Create, 2304). +-define(wxFindReplaceDialog_GetData, 2305). +-define(wxFindReplaceData_new_0, 2306). +-define(wxFindReplaceData_new_1, 2307). +-define(wxFindReplaceData_GetFindString, 2308). +-define(wxFindReplaceData_GetReplaceString, 2309). +-define(wxFindReplaceData_GetFlags, 2310). +-define(wxFindReplaceData_SetFlags, 2311). +-define(wxFindReplaceData_SetFindString, 2312). +-define(wxFindReplaceData_SetReplaceString, 2313). +-define(wxFindReplaceData_destroy, 2314). +-define(wxMultiChoiceDialog_new_0, 2315). +-define(wxMultiChoiceDialog_new_5, 2317). +-define(wxMultiChoiceDialog_GetSelections, 2318). +-define(wxMultiChoiceDialog_SetSelections, 2319). +-define(wxMultiChoiceDialog_destroy, 2320). +-define(wxSingleChoiceDialog_new_0, 2321). +-define(wxSingleChoiceDialog_new_5, 2323). +-define(wxSingleChoiceDialog_GetSelection, 2324). +-define(wxSingleChoiceDialog_GetStringSelection, 2325). +-define(wxSingleChoiceDialog_SetSelection, 2326). +-define(wxSingleChoiceDialog_destroy, 2327). +-define(wxTextEntryDialog_new, 2328). +-define(wxTextEntryDialog_GetValue, 2329). +-define(wxTextEntryDialog_SetValue, 2330). +-define(wxTextEntryDialog_destroy, 2331). +-define(wxPasswordEntryDialog_new, 2332). +-define(wxPasswordEntryDialog_destroy, 2333). +-define(wxFontData_new_0, 2334). +-define(wxFontData_new_1, 2335). +-define(wxFontData_destruct, 2336). +-define(wxFontData_EnableEffects, 2337). +-define(wxFontData_GetAllowSymbols, 2338). +-define(wxFontData_GetColour, 2339). +-define(wxFontData_GetChosenFont, 2340). +-define(wxFontData_GetEnableEffects, 2341). +-define(wxFontData_GetInitialFont, 2342). +-define(wxFontData_GetShowHelp, 2343). +-define(wxFontData_SetAllowSymbols, 2344). +-define(wxFontData_SetChosenFont, 2345). +-define(wxFontData_SetColour, 2346). +-define(wxFontData_SetInitialFont, 2347). +-define(wxFontData_SetRange, 2348). +-define(wxFontData_SetShowHelp, 2349). +-define(wxFontDialog_new_0, 2353). +-define(wxFontDialog_new_2, 2355). +-define(wxFontDialog_Create, 2357). +-define(wxFontDialog_GetFontData, 2358). +-define(wxFontDialog_destroy, 2360). +-define(wxProgressDialog_new, 2361). +-define(wxProgressDialog_destruct, 2362). +-define(wxProgressDialog_Resume, 2363). +-define(wxProgressDialog_Update_2, 2364). +-define(wxProgressDialog_Update_0, 2365). +-define(wxMessageDialog_new, 2366). +-define(wxMessageDialog_destruct, 2367). +-define(wxPageSetupDialog_new, 2368). +-define(wxPageSetupDialog_destruct, 2369). +-define(wxPageSetupDialog_GetPageSetupData, 2370). +-define(wxPageSetupDialog_ShowModal, 2371). +-define(wxPageSetupDialogData_new_0, 2372). +-define(wxPageSetupDialogData_new_1_0, 2373). +-define(wxPageSetupDialogData_new_1_1, 2374). +-define(wxPageSetupDialogData_destruct, 2375). +-define(wxPageSetupDialogData_EnableHelp, 2376). +-define(wxPageSetupDialogData_EnableMargins, 2377). +-define(wxPageSetupDialogData_EnableOrientation, 2378). +-define(wxPageSetupDialogData_EnablePaper, 2379). +-define(wxPageSetupDialogData_EnablePrinter, 2380). +-define(wxPageSetupDialogData_GetDefaultMinMargins, 2381). +-define(wxPageSetupDialogData_GetEnableMargins, 2382). +-define(wxPageSetupDialogData_GetEnableOrientation, 2383). +-define(wxPageSetupDialogData_GetEnablePaper, 2384). +-define(wxPageSetupDialogData_GetEnablePrinter, 2385). +-define(wxPageSetupDialogData_GetEnableHelp, 2386). +-define(wxPageSetupDialogData_GetDefaultInfo, 2387). +-define(wxPageSetupDialogData_GetMarginTopLeft, 2388). +-define(wxPageSetupDialogData_GetMarginBottomRight, 2389). +-define(wxPageSetupDialogData_GetMinMarginTopLeft, 2390). +-define(wxPageSetupDialogData_GetMinMarginBottomRight, 2391). +-define(wxPageSetupDialogData_GetPaperId, 2392). +-define(wxPageSetupDialogData_GetPaperSize, 2393). +-define(wxPageSetupDialogData_GetPrintData, 2395). +-define(wxPageSetupDialogData_IsOk, 2396). +-define(wxPageSetupDialogData_SetDefaultInfo, 2397). +-define(wxPageSetupDialogData_SetDefaultMinMargins, 2398). +-define(wxPageSetupDialogData_SetMarginTopLeft, 2399). +-define(wxPageSetupDialogData_SetMarginBottomRight, 2400). +-define(wxPageSetupDialogData_SetMinMarginTopLeft, 2401). +-define(wxPageSetupDialogData_SetMinMarginBottomRight, 2402). +-define(wxPageSetupDialogData_SetPaperId, 2403). +-define(wxPageSetupDialogData_SetPaperSize_1_1, 2404). +-define(wxPageSetupDialogData_SetPaperSize_1_0, 2405). +-define(wxPageSetupDialogData_SetPrintData, 2406). +-define(wxPrintDialog_new_2_0, 2407). +-define(wxPrintDialog_new_2_1, 2408). +-define(wxPrintDialog_destruct, 2409). +-define(wxPrintDialog_GetPrintDialogData, 2410). +-define(wxPrintDialog_GetPrintDC, 2411). +-define(wxPrintDialogData_new_0, 2412). +-define(wxPrintDialogData_new_1_1, 2413). +-define(wxPrintDialogData_new_1_0, 2414). +-define(wxPrintDialogData_destruct, 2415). +-define(wxPrintDialogData_EnableHelp, 2416). +-define(wxPrintDialogData_EnablePageNumbers, 2417). +-define(wxPrintDialogData_EnablePrintToFile, 2418). +-define(wxPrintDialogData_EnableSelection, 2419). +-define(wxPrintDialogData_GetAllPages, 2420). +-define(wxPrintDialogData_GetCollate, 2421). +-define(wxPrintDialogData_GetFromPage, 2422). +-define(wxPrintDialogData_GetMaxPage, 2423). +-define(wxPrintDialogData_GetMinPage, 2424). +-define(wxPrintDialogData_GetNoCopies, 2425). +-define(wxPrintDialogData_GetPrintData, 2426). +-define(wxPrintDialogData_GetPrintToFile, 2427). +-define(wxPrintDialogData_GetSelection, 2428). +-define(wxPrintDialogData_GetToPage, 2429). +-define(wxPrintDialogData_IsOk, 2430). +-define(wxPrintDialogData_SetCollate, 2431). +-define(wxPrintDialogData_SetFromPage, 2432). +-define(wxPrintDialogData_SetMaxPage, 2433). +-define(wxPrintDialogData_SetMinPage, 2434). +-define(wxPrintDialogData_SetNoCopies, 2435). +-define(wxPrintDialogData_SetPrintData, 2436). +-define(wxPrintDialogData_SetPrintToFile, 2437). +-define(wxPrintDialogData_SetSelection, 2438). +-define(wxPrintDialogData_SetToPage, 2439). +-define(wxPrintData_new_0, 2440). +-define(wxPrintData_new_1, 2441). +-define(wxPrintData_destruct, 2442). +-define(wxPrintData_GetCollate, 2443). +-define(wxPrintData_GetBin, 2444). +-define(wxPrintData_GetColour, 2445). +-define(wxPrintData_GetDuplex, 2446). +-define(wxPrintData_GetNoCopies, 2447). +-define(wxPrintData_GetOrientation, 2448). +-define(wxPrintData_GetPaperId, 2449). +-define(wxPrintData_GetPrinterName, 2450). +-define(wxPrintData_GetQuality, 2451). +-define(wxPrintData_IsOk, 2452). +-define(wxPrintData_SetBin, 2453). +-define(wxPrintData_SetCollate, 2454). +-define(wxPrintData_SetColour, 2455). +-define(wxPrintData_SetDuplex, 2456). +-define(wxPrintData_SetNoCopies, 2457). +-define(wxPrintData_SetOrientation, 2458). +-define(wxPrintData_SetPaperId, 2459). +-define(wxPrintData_SetPrinterName, 2460). +-define(wxPrintData_SetQuality, 2461). +-define(wxPrintPreview_new_2, 2464). +-define(wxPrintPreview_new_3, 2465). +-define(wxPrintPreview_destruct, 2467). +-define(wxPrintPreview_GetCanvas, 2468). +-define(wxPrintPreview_GetCurrentPage, 2469). +-define(wxPrintPreview_GetFrame, 2470). +-define(wxPrintPreview_GetMaxPage, 2471). +-define(wxPrintPreview_GetMinPage, 2472). +-define(wxPrintPreview_GetPrintout, 2473). +-define(wxPrintPreview_GetPrintoutForPrinting, 2474). +-define(wxPrintPreview_IsOk, 2475). +-define(wxPrintPreview_PaintPage, 2476). +-define(wxPrintPreview_Print, 2477). +-define(wxPrintPreview_RenderPage, 2478). +-define(wxPrintPreview_SetCanvas, 2479). +-define(wxPrintPreview_SetCurrentPage, 2480). +-define(wxPrintPreview_SetFrame, 2481). +-define(wxPrintPreview_SetPrintout, 2482). +-define(wxPrintPreview_SetZoom, 2483). +-define(wxPreviewFrame_new, 2484). +-define(wxPreviewFrame_destruct, 2485). +-define(wxPreviewFrame_CreateControlBar, 2486). +-define(wxPreviewFrame_CreateCanvas, 2487). +-define(wxPreviewFrame_Initialize, 2488). +-define(wxPreviewFrame_OnCloseWindow, 2489). +-define(wxPreviewControlBar_new, 2490). +-define(wxPreviewControlBar_destruct, 2491). +-define(wxPreviewControlBar_CreateButtons, 2492). +-define(wxPreviewControlBar_GetPrintPreview, 2493). +-define(wxPreviewControlBar_GetZoomControl, 2494). +-define(wxPreviewControlBar_SetZoomControl, 2495). +-define(wxPrinter_new, 2497). +-define(wxPrinter_CreateAbortWindow, 2498). +-define(wxPrinter_GetAbort, 2499). +-define(wxPrinter_GetLastError, 2500). +-define(wxPrinter_GetPrintDialogData, 2501). +-define(wxPrinter_Print, 2502). +-define(wxPrinter_PrintDialog, 2503). +-define(wxPrinter_ReportError, 2504). +-define(wxPrinter_Setup, 2505). +-define(wxPrinter_destroy, 2506). +-define(wxXmlResource_new_1, 2507). +-define(wxXmlResource_new_2, 2508). +-define(wxXmlResource_destruct, 2509). +-define(wxXmlResource_AttachUnknownControl, 2510). +-define(wxXmlResource_ClearHandlers, 2511). +-define(wxXmlResource_CompareVersion, 2512). +-define(wxXmlResource_Get, 2513). +-define(wxXmlResource_GetFlags, 2514). +-define(wxXmlResource_GetVersion, 2515). +-define(wxXmlResource_GetXRCID, 2516). +-define(wxXmlResource_InitAllHandlers, 2517). +-define(wxXmlResource_Load, 2518). +-define(wxXmlResource_LoadBitmap, 2519). +-define(wxXmlResource_LoadDialog_2, 2520). +-define(wxXmlResource_LoadDialog_3, 2521). +-define(wxXmlResource_LoadFrame_2, 2522). +-define(wxXmlResource_LoadFrame_3, 2523). +-define(wxXmlResource_LoadIcon, 2524). +-define(wxXmlResource_LoadMenu, 2525). +-define(wxXmlResource_LoadMenuBar_2, 2526). +-define(wxXmlResource_LoadMenuBar_1, 2527). +-define(wxXmlResource_LoadPanel_2, 2528). +-define(wxXmlResource_LoadPanel_3, 2529). +-define(wxXmlResource_LoadToolBar, 2530). +-define(wxXmlResource_Set, 2531). +-define(wxXmlResource_SetFlags, 2532). +-define(wxXmlResource_Unload, 2533). +-define(wxXmlResource_xrcctrl, 2534). +-define(wxHtmlEasyPrinting_new, 2535). +-define(wxHtmlEasyPrinting_destruct, 2536). +-define(wxHtmlEasyPrinting_GetPrintData, 2537). +-define(wxHtmlEasyPrinting_GetPageSetupData, 2538). +-define(wxHtmlEasyPrinting_PreviewFile, 2539). +-define(wxHtmlEasyPrinting_PreviewText, 2540). +-define(wxHtmlEasyPrinting_PrintFile, 2541). +-define(wxHtmlEasyPrinting_PrintText, 2542). +-define(wxHtmlEasyPrinting_PageSetup, 2543). +-define(wxHtmlEasyPrinting_SetFonts, 2544). +-define(wxHtmlEasyPrinting_SetHeader, 2545). +-define(wxHtmlEasyPrinting_SetFooter, 2546). +-define(wxGLCanvas_new_2, 2548). +-define(wxGLCanvas_new_3_1, 2549). +-define(wxGLCanvas_new_3_0, 2550). +-define(wxGLCanvas_GetContext, 2551). +-define(wxGLCanvas_SetCurrent, 2553). +-define(wxGLCanvas_SwapBuffers, 2554). +-define(wxGLCanvas_destroy, 2555). +-define(wxAuiManager_new, 2556). +-define(wxAuiManager_destruct, 2557). +-define(wxAuiManager_AddPane_2_1, 2558). +-define(wxAuiManager_AddPane_3, 2559). +-define(wxAuiManager_AddPane_2_0, 2560). +-define(wxAuiManager_DetachPane, 2561). +-define(wxAuiManager_GetAllPanes, 2562). +-define(wxAuiManager_GetArtProvider, 2563). +-define(wxAuiManager_GetDockSizeConstraint, 2564). +-define(wxAuiManager_GetFlags, 2565). +-define(wxAuiManager_GetManagedWindow, 2566). +-define(wxAuiManager_GetManager, 2567). +-define(wxAuiManager_GetPane_1_1, 2568). +-define(wxAuiManager_GetPane_1_0, 2569). +-define(wxAuiManager_HideHint, 2570). +-define(wxAuiManager_InsertPane, 2571). +-define(wxAuiManager_LoadPaneInfo, 2572). +-define(wxAuiManager_LoadPerspective, 2573). +-define(wxAuiManager_SavePaneInfo, 2574). +-define(wxAuiManager_SavePerspective, 2575). +-define(wxAuiManager_SetArtProvider, 2576). +-define(wxAuiManager_SetDockSizeConstraint, 2577). +-define(wxAuiManager_SetFlags, 2578). +-define(wxAuiManager_SetManagedWindow, 2579). +-define(wxAuiManager_ShowHint, 2580). +-define(wxAuiManager_UnInit, 2581). +-define(wxAuiManager_Update, 2582). +-define(wxAuiPaneInfo_new_0, 2583). +-define(wxAuiPaneInfo_new_1, 2584). +-define(wxAuiPaneInfo_destruct, 2585). +-define(wxAuiPaneInfo_BestSize_1, 2586). +-define(wxAuiPaneInfo_BestSize_2, 2587). +-define(wxAuiPaneInfo_Bottom, 2588). +-define(wxAuiPaneInfo_BottomDockable, 2589). +-define(wxAuiPaneInfo_Caption, 2590). +-define(wxAuiPaneInfo_CaptionVisible, 2591). +-define(wxAuiPaneInfo_Centre, 2592). +-define(wxAuiPaneInfo_CentrePane, 2593). +-define(wxAuiPaneInfo_CloseButton, 2594). +-define(wxAuiPaneInfo_DefaultPane, 2595). +-define(wxAuiPaneInfo_DestroyOnClose, 2596). +-define(wxAuiPaneInfo_Direction, 2597). +-define(wxAuiPaneInfo_Dock, 2598). +-define(wxAuiPaneInfo_Dockable, 2599). +-define(wxAuiPaneInfo_Fixed, 2600). +-define(wxAuiPaneInfo_Float, 2601). +-define(wxAuiPaneInfo_Floatable, 2602). +-define(wxAuiPaneInfo_FloatingPosition_1, 2603). +-define(wxAuiPaneInfo_FloatingPosition_2, 2604). +-define(wxAuiPaneInfo_FloatingSize_1, 2605). +-define(wxAuiPaneInfo_FloatingSize_2, 2606). +-define(wxAuiPaneInfo_Gripper, 2607). +-define(wxAuiPaneInfo_GripperTop, 2608). +-define(wxAuiPaneInfo_HasBorder, 2609). +-define(wxAuiPaneInfo_HasCaption, 2610). +-define(wxAuiPaneInfo_HasCloseButton, 2611). +-define(wxAuiPaneInfo_HasFlag, 2612). +-define(wxAuiPaneInfo_HasGripper, 2613). +-define(wxAuiPaneInfo_HasGripperTop, 2614). +-define(wxAuiPaneInfo_HasMaximizeButton, 2615). +-define(wxAuiPaneInfo_HasMinimizeButton, 2616). +-define(wxAuiPaneInfo_HasPinButton, 2617). +-define(wxAuiPaneInfo_Hide, 2618). +-define(wxAuiPaneInfo_IsBottomDockable, 2619). +-define(wxAuiPaneInfo_IsDocked, 2620). +-define(wxAuiPaneInfo_IsFixed, 2621). +-define(wxAuiPaneInfo_IsFloatable, 2622). +-define(wxAuiPaneInfo_IsFloating, 2623). +-define(wxAuiPaneInfo_IsLeftDockable, 2624). +-define(wxAuiPaneInfo_IsMovable, 2625). +-define(wxAuiPaneInfo_IsOk, 2626). +-define(wxAuiPaneInfo_IsResizable, 2627). +-define(wxAuiPaneInfo_IsRightDockable, 2628). +-define(wxAuiPaneInfo_IsShown, 2629). +-define(wxAuiPaneInfo_IsToolbar, 2630). +-define(wxAuiPaneInfo_IsTopDockable, 2631). +-define(wxAuiPaneInfo_Layer, 2632). +-define(wxAuiPaneInfo_Left, 2633). +-define(wxAuiPaneInfo_LeftDockable, 2634). +-define(wxAuiPaneInfo_MaxSize_1, 2635). +-define(wxAuiPaneInfo_MaxSize_2, 2636). +-define(wxAuiPaneInfo_MaximizeButton, 2637). +-define(wxAuiPaneInfo_MinSize_1, 2638). +-define(wxAuiPaneInfo_MinSize_2, 2639). +-define(wxAuiPaneInfo_MinimizeButton, 2640). +-define(wxAuiPaneInfo_Movable, 2641). +-define(wxAuiPaneInfo_Name, 2642). +-define(wxAuiPaneInfo_PaneBorder, 2643). +-define(wxAuiPaneInfo_PinButton, 2644). +-define(wxAuiPaneInfo_Position, 2645). +-define(wxAuiPaneInfo_Resizable, 2646). +-define(wxAuiPaneInfo_Right, 2647). +-define(wxAuiPaneInfo_RightDockable, 2648). +-define(wxAuiPaneInfo_Row, 2649). +-define(wxAuiPaneInfo_SafeSet, 2650). +-define(wxAuiPaneInfo_SetFlag, 2651). +-define(wxAuiPaneInfo_Show, 2652). +-define(wxAuiPaneInfo_ToolbarPane, 2653). +-define(wxAuiPaneInfo_Top, 2654). +-define(wxAuiPaneInfo_TopDockable, 2655). +-define(wxAuiPaneInfo_Window, 2656). +-define(wxAuiPaneInfo_GetWindow, 2657). +-define(wxAuiPaneInfo_GetFrame, 2658). +-define(wxAuiPaneInfo_GetDirection, 2659). +-define(wxAuiPaneInfo_GetLayer, 2660). +-define(wxAuiPaneInfo_GetRow, 2661). +-define(wxAuiPaneInfo_GetPosition, 2662). +-define(wxAuiPaneInfo_GetFloatingPosition, 2663). +-define(wxAuiPaneInfo_GetFloatingSize, 2664). +-define(wxAuiNotebook_new_0, 2665). +-define(wxAuiNotebook_new_2, 2666). +-define(wxAuiNotebook_AddPage, 2667). +-define(wxAuiNotebook_Create, 2668). +-define(wxAuiNotebook_DeletePage, 2669). +-define(wxAuiNotebook_GetArtProvider, 2670). +-define(wxAuiNotebook_GetPage, 2671). +-define(wxAuiNotebook_GetPageBitmap, 2672). +-define(wxAuiNotebook_GetPageCount, 2673). +-define(wxAuiNotebook_GetPageIndex, 2674). +-define(wxAuiNotebook_GetPageText, 2675). +-define(wxAuiNotebook_GetSelection, 2676). +-define(wxAuiNotebook_InsertPage, 2677). +-define(wxAuiNotebook_RemovePage, 2678). +-define(wxAuiNotebook_SetArtProvider, 2679). +-define(wxAuiNotebook_SetFont, 2680). +-define(wxAuiNotebook_SetPageBitmap, 2681). +-define(wxAuiNotebook_SetPageText, 2682). +-define(wxAuiNotebook_SetSelection, 2683). +-define(wxAuiNotebook_SetTabCtrlHeight, 2684). +-define(wxAuiNotebook_SetUniformBitmapSize, 2685). +-define(wxAuiNotebook_destroy, 2686). +-define(wxAuiTabArt_SetFlags, 2687). +-define(wxAuiTabArt_SetMeasuringFont, 2688). +-define(wxAuiTabArt_SetNormalFont, 2689). +-define(wxAuiTabArt_SetSelectedFont, 2690). +-define(wxAuiTabArt_SetColour, 2691). +-define(wxAuiTabArt_SetActiveColour, 2692). +-define(wxAuiDockArt_GetColour, 2693). +-define(wxAuiDockArt_GetFont, 2694). +-define(wxAuiDockArt_GetMetric, 2695). +-define(wxAuiDockArt_SetColour, 2696). +-define(wxAuiDockArt_SetFont, 2697). +-define(wxAuiDockArt_SetMetric, 2698). +-define(wxAuiSimpleTabArt_new, 2699). +-define(wxAuiSimpleTabArt_destroy, 2700). +-define(wxMDIParentFrame_new_0, 2701). +-define(wxMDIParentFrame_new_4, 2702). +-define(wxMDIParentFrame_destruct, 2703). +-define(wxMDIParentFrame_ActivateNext, 2704). +-define(wxMDIParentFrame_ActivatePrevious, 2705). +-define(wxMDIParentFrame_ArrangeIcons, 2706). +-define(wxMDIParentFrame_Cascade, 2707). +-define(wxMDIParentFrame_Create, 2708). +-define(wxMDIParentFrame_GetActiveChild, 2709). +-define(wxMDIParentFrame_GetClientWindow, 2710). +-define(wxMDIParentFrame_Tile, 2711). +-define(wxMDIChildFrame_new_0, 2712). +-define(wxMDIChildFrame_new_4, 2713). +-define(wxMDIChildFrame_destruct, 2714). +-define(wxMDIChildFrame_Activate, 2715). +-define(wxMDIChildFrame_Create, 2716). +-define(wxMDIChildFrame_Maximize, 2717). +-define(wxMDIChildFrame_Restore, 2718). +-define(wxMDIClientWindow_new_0, 2719). +-define(wxMDIClientWindow_new_2, 2720). +-define(wxMDIClientWindow_destruct, 2721). +-define(wxMDIClientWindow_CreateClient, 2722). +-define(wxLayoutAlgorithm_new, 2723). +-define(wxLayoutAlgorithm_LayoutFrame, 2724). +-define(wxLayoutAlgorithm_LayoutMDIFrame, 2725). +-define(wxLayoutAlgorithm_LayoutWindow, 2726). +-define(wxLayoutAlgorithm_destroy, 2727). +-define(wxEvent_GetId, 2728). +-define(wxEvent_GetSkipped, 2729). +-define(wxEvent_GetTimestamp, 2730). +-define(wxEvent_IsCommandEvent, 2731). +-define(wxEvent_ResumePropagation, 2732). +-define(wxEvent_ShouldPropagate, 2733). +-define(wxEvent_Skip, 2734). +-define(wxEvent_StopPropagation, 2735). +-define(wxCommandEvent_getClientData, 2736). +-define(wxCommandEvent_GetExtraLong, 2737). +-define(wxCommandEvent_GetInt, 2738). +-define(wxCommandEvent_GetSelection, 2739). +-define(wxCommandEvent_GetString, 2740). +-define(wxCommandEvent_IsChecked, 2741). +-define(wxCommandEvent_IsSelection, 2742). +-define(wxCommandEvent_SetInt, 2743). +-define(wxCommandEvent_SetString, 2744). +-define(wxScrollEvent_GetOrientation, 2745). +-define(wxScrollEvent_GetPosition, 2746). +-define(wxScrollWinEvent_GetOrientation, 2747). +-define(wxScrollWinEvent_GetPosition, 2748). +-define(wxMouseEvent_AltDown, 2749). +-define(wxMouseEvent_Button, 2750). +-define(wxMouseEvent_ButtonDClick, 2751). +-define(wxMouseEvent_ButtonDown, 2752). +-define(wxMouseEvent_ButtonUp, 2753). +-define(wxMouseEvent_CmdDown, 2754). +-define(wxMouseEvent_ControlDown, 2755). +-define(wxMouseEvent_Dragging, 2756). +-define(wxMouseEvent_Entering, 2757). +-define(wxMouseEvent_GetButton, 2758). +-define(wxMouseEvent_GetPosition, 2761). +-define(wxMouseEvent_GetLogicalPosition, 2762). +-define(wxMouseEvent_GetLinesPerAction, 2763). +-define(wxMouseEvent_GetWheelRotation, 2764). +-define(wxMouseEvent_GetWheelDelta, 2765). +-define(wxMouseEvent_GetX, 2766). +-define(wxMouseEvent_GetY, 2767). +-define(wxMouseEvent_IsButton, 2768). +-define(wxMouseEvent_IsPageScroll, 2769). +-define(wxMouseEvent_Leaving, 2770). +-define(wxMouseEvent_LeftDClick, 2771). +-define(wxMouseEvent_LeftDown, 2772). +-define(wxMouseEvent_LeftIsDown, 2773). +-define(wxMouseEvent_LeftUp, 2774). +-define(wxMouseEvent_MetaDown, 2775). +-define(wxMouseEvent_MiddleDClick, 2776). +-define(wxMouseEvent_MiddleDown, 2777). +-define(wxMouseEvent_MiddleIsDown, 2778). +-define(wxMouseEvent_MiddleUp, 2779). +-define(wxMouseEvent_Moving, 2780). +-define(wxMouseEvent_RightDClick, 2781). +-define(wxMouseEvent_RightDown, 2782). +-define(wxMouseEvent_RightIsDown, 2783). +-define(wxMouseEvent_RightUp, 2784). +-define(wxMouseEvent_ShiftDown, 2785). +-define(wxSetCursorEvent_GetCursor, 2786). +-define(wxSetCursorEvent_GetX, 2787). +-define(wxSetCursorEvent_GetY, 2788). +-define(wxSetCursorEvent_HasCursor, 2789). +-define(wxSetCursorEvent_SetCursor, 2790). +-define(wxKeyEvent_AltDown, 2791). +-define(wxKeyEvent_CmdDown, 2792). +-define(wxKeyEvent_ControlDown, 2793). +-define(wxKeyEvent_GetKeyCode, 2794). +-define(wxKeyEvent_GetModifiers, 2795). +-define(wxKeyEvent_GetPosition, 2798). +-define(wxKeyEvent_GetRawKeyCode, 2799). +-define(wxKeyEvent_GetRawKeyFlags, 2800). +-define(wxKeyEvent_GetUnicodeKey, 2801). +-define(wxKeyEvent_GetX, 2802). +-define(wxKeyEvent_GetY, 2803). +-define(wxKeyEvent_HasModifiers, 2804). +-define(wxKeyEvent_MetaDown, 2805). +-define(wxKeyEvent_ShiftDown, 2806). +-define(wxSizeEvent_GetSize, 2807). +-define(wxMoveEvent_GetPosition, 2808). +-define(wxEraseEvent_GetDC, 2809). +-define(wxFocusEvent_GetWindow, 2810). +-define(wxChildFocusEvent_GetWindow, 2811). +-define(wxMenuEvent_GetMenu, 2812). +-define(wxMenuEvent_GetMenuId, 2813). +-define(wxMenuEvent_IsPopup, 2814). +-define(wxCloseEvent_CanVeto, 2815). +-define(wxCloseEvent_GetLoggingOff, 2816). +-define(wxCloseEvent_SetCanVeto, 2817). +-define(wxCloseEvent_SetLoggingOff, 2818). +-define(wxCloseEvent_Veto, 2819). +-define(wxShowEvent_SetShow, 2820). +-define(wxShowEvent_GetShow, 2821). +-define(wxIconizeEvent_Iconized, 2822). +-define(wxJoystickEvent_ButtonDown, 2823). +-define(wxJoystickEvent_ButtonIsDown, 2824). +-define(wxJoystickEvent_ButtonUp, 2825). +-define(wxJoystickEvent_GetButtonChange, 2826). +-define(wxJoystickEvent_GetButtonState, 2827). +-define(wxJoystickEvent_GetJoystick, 2828). +-define(wxJoystickEvent_GetPosition, 2829). +-define(wxJoystickEvent_GetZPosition, 2830). +-define(wxJoystickEvent_IsButton, 2831). +-define(wxJoystickEvent_IsMove, 2832). +-define(wxJoystickEvent_IsZMove, 2833). +-define(wxUpdateUIEvent_CanUpdate, 2834). +-define(wxUpdateUIEvent_Check, 2835). +-define(wxUpdateUIEvent_Enable, 2836). +-define(wxUpdateUIEvent_Show, 2837). +-define(wxUpdateUIEvent_GetChecked, 2838). +-define(wxUpdateUIEvent_GetEnabled, 2839). +-define(wxUpdateUIEvent_GetShown, 2840). +-define(wxUpdateUIEvent_GetSetChecked, 2841). +-define(wxUpdateUIEvent_GetSetEnabled, 2842). +-define(wxUpdateUIEvent_GetSetShown, 2843). +-define(wxUpdateUIEvent_GetSetText, 2844). +-define(wxUpdateUIEvent_GetText, 2845). +-define(wxUpdateUIEvent_GetMode, 2846). +-define(wxUpdateUIEvent_GetUpdateInterval, 2847). +-define(wxUpdateUIEvent_ResetUpdateTime, 2848). +-define(wxUpdateUIEvent_SetMode, 2849). +-define(wxUpdateUIEvent_SetText, 2850). +-define(wxUpdateUIEvent_SetUpdateInterval, 2851). +-define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2852). +-define(wxPaletteChangedEvent_SetChangedWindow, 2853). +-define(wxPaletteChangedEvent_GetChangedWindow, 2854). +-define(wxQueryNewPaletteEvent_SetPaletteRealized, 2855). +-define(wxQueryNewPaletteEvent_GetPaletteRealized, 2856). +-define(wxNavigationKeyEvent_GetDirection, 2857). +-define(wxNavigationKeyEvent_SetDirection, 2858). +-define(wxNavigationKeyEvent_IsWindowChange, 2859). +-define(wxNavigationKeyEvent_SetWindowChange, 2860). +-define(wxNavigationKeyEvent_IsFromTab, 2861). +-define(wxNavigationKeyEvent_SetFromTab, 2862). +-define(wxNavigationKeyEvent_GetCurrentFocus, 2863). +-define(wxNavigationKeyEvent_SetCurrentFocus, 2864). +-define(wxHelpEvent_GetOrigin, 2865). +-define(wxHelpEvent_GetPosition, 2866). +-define(wxHelpEvent_SetOrigin, 2867). +-define(wxHelpEvent_SetPosition, 2868). +-define(wxContextMenuEvent_GetPosition, 2869). +-define(wxContextMenuEvent_SetPosition, 2870). +-define(wxIdleEvent_CanSend, 2871). +-define(wxIdleEvent_GetMode, 2872). +-define(wxIdleEvent_RequestMore, 2873). +-define(wxIdleEvent_MoreRequested, 2874). +-define(wxIdleEvent_SetMode, 2875). +-define(wxGridEvent_AltDown, 2876). +-define(wxGridEvent_ControlDown, 2877). +-define(wxGridEvent_GetCol, 2878). +-define(wxGridEvent_GetPosition, 2879). +-define(wxGridEvent_GetRow, 2880). +-define(wxGridEvent_MetaDown, 2881). +-define(wxGridEvent_Selecting, 2882). +-define(wxGridEvent_ShiftDown, 2883). +-define(wxNotifyEvent_Allow, 2884). +-define(wxNotifyEvent_IsAllowed, 2885). +-define(wxNotifyEvent_Veto, 2886). +-define(wxSashEvent_GetEdge, 2887). +-define(wxSashEvent_GetDragRect, 2888). +-define(wxSashEvent_GetDragStatus, 2889). +-define(wxListEvent_GetCacheFrom, 2890). +-define(wxListEvent_GetCacheTo, 2891). +-define(wxListEvent_GetKeyCode, 2892). +-define(wxListEvent_GetIndex, 2893). +-define(wxListEvent_GetColumn, 2894). +-define(wxListEvent_GetPoint, 2895). +-define(wxListEvent_GetLabel, 2896). +-define(wxListEvent_GetText, 2897). +-define(wxListEvent_GetImage, 2898). +-define(wxListEvent_GetData, 2899). +-define(wxListEvent_GetMask, 2900). +-define(wxListEvent_GetItem, 2901). +-define(wxListEvent_IsEditCancelled, 2902). +-define(wxDateEvent_GetDate, 2903). +-define(wxCalendarEvent_GetWeekDay, 2904). +-define(wxFileDirPickerEvent_GetPath, 2905). +-define(wxColourPickerEvent_GetColour, 2906). +-define(wxFontPickerEvent_GetFont, 2907). +-define(wxStyledTextEvent_GetPosition, 2908). +-define(wxStyledTextEvent_GetKey, 2909). +-define(wxStyledTextEvent_GetModifiers, 2910). +-define(wxStyledTextEvent_GetModificationType, 2911). +-define(wxStyledTextEvent_GetText, 2912). +-define(wxStyledTextEvent_GetLength, 2913). +-define(wxStyledTextEvent_GetLinesAdded, 2914). +-define(wxStyledTextEvent_GetLine, 2915). +-define(wxStyledTextEvent_GetFoldLevelNow, 2916). +-define(wxStyledTextEvent_GetFoldLevelPrev, 2917). +-define(wxStyledTextEvent_GetMargin, 2918). +-define(wxStyledTextEvent_GetMessage, 2919). +-define(wxStyledTextEvent_GetWParam, 2920). +-define(wxStyledTextEvent_GetLParam, 2921). +-define(wxStyledTextEvent_GetListType, 2922). +-define(wxStyledTextEvent_GetX, 2923). +-define(wxStyledTextEvent_GetY, 2924). +-define(wxStyledTextEvent_GetDragText, 2925). +-define(wxStyledTextEvent_GetDragAllowMove, 2926). +-define(wxStyledTextEvent_GetDragResult, 2927). +-define(wxStyledTextEvent_GetShift, 2928). +-define(wxStyledTextEvent_GetControl, 2929). +-define(wxStyledTextEvent_GetAlt, 2930). +-define(utils_wxGetKeyState, 2931). +-define(utils_wxGetMousePosition, 2932). +-define(utils_wxGetMouseState, 2933). +-define(utils_wxSetDetectableAutoRepeat, 2934). +-define(utils_wxBell, 2935). +-define(utils_wxFindMenuItemId, 2936). +-define(utils_wxGenericFindWindowAtPoint, 2937). +-define(utils_wxFindWindowAtPoint, 2938). +-define(utils_wxBeginBusyCursor, 2939). +-define(utils_wxEndBusyCursor, 2940). +-define(utils_wxIsBusy, 2941). +-define(utils_wxShutdown, 2942). +-define(utils_wxShell, 2943). +-define(utils_wxLaunchDefaultBrowser, 2944). +-define(utils_wxGetEmailAddress, 2945). +-define(utils_wxGetUserId, 2946). +-define(utils_wxGetHomeDir, 2947). +-define(utils_wxNewId, 2948). +-define(utils_wxRegisterId, 2949). +-define(utils_wxGetCurrentId, 2950). +-define(utils_wxGetOsDescription, 2951). +-define(utils_wxIsPlatformLittleEndian, 2952). +-define(utils_wxIsPlatform64Bit, 2953). +-define(gdicmn_wxDisplaySize, 2954). +-define(gdicmn_wxSetCursor, 2955). +-define(wxPrintout_new, 2956). +-define(wxPrintout_destruct, 2957). +-define(wxPrintout_GetDC, 2958). +-define(wxPrintout_GetPageSizeMM, 2959). +-define(wxPrintout_GetPageSizePixels, 2960). +-define(wxPrintout_GetPaperRectPixels, 2961). +-define(wxPrintout_GetPPIPrinter, 2962). +-define(wxPrintout_GetPPIScreen, 2963). +-define(wxPrintout_GetTitle, 2964). +-define(wxPrintout_IsPreview, 2965). +-define(wxPrintout_FitThisSizeToPaper, 2966). +-define(wxPrintout_FitThisSizeToPage, 2967). +-define(wxPrintout_FitThisSizeToPageMargins, 2968). +-define(wxPrintout_MapScreenSizeToPaper, 2969). +-define(wxPrintout_MapScreenSizeToPage, 2970). +-define(wxPrintout_MapScreenSizeToPageMargins, 2971). +-define(wxPrintout_MapScreenSizeToDevice, 2972). +-define(wxPrintout_GetLogicalPaperRect, 2973). +-define(wxPrintout_GetLogicalPageRect, 2974). +-define(wxPrintout_GetLogicalPageMarginsRect, 2975). +-define(wxPrintout_SetLogicalOrigin, 2976). +-define(wxPrintout_OffsetLogicalOrigin, 2977). +-define(wxStyledTextCtrl_new_2, 2978). +-define(wxStyledTextCtrl_new_0, 2979). +-define(wxStyledTextCtrl_destruct, 2980). +-define(wxStyledTextCtrl_Create, 2981). +-define(wxStyledTextCtrl_AddText, 2982). +-define(wxStyledTextCtrl_AddStyledText, 2983). +-define(wxStyledTextCtrl_InsertText, 2984). +-define(wxStyledTextCtrl_ClearAll, 2985). +-define(wxStyledTextCtrl_ClearDocumentStyle, 2986). +-define(wxStyledTextCtrl_GetLength, 2987). +-define(wxStyledTextCtrl_GetCharAt, 2988). +-define(wxStyledTextCtrl_GetCurrentPos, 2989). +-define(wxStyledTextCtrl_GetAnchor, 2990). +-define(wxStyledTextCtrl_GetStyleAt, 2991). +-define(wxStyledTextCtrl_Redo, 2992). +-define(wxStyledTextCtrl_SetUndoCollection, 2993). +-define(wxStyledTextCtrl_SelectAll, 2994). +-define(wxStyledTextCtrl_SetSavePoint, 2995). +-define(wxStyledTextCtrl_GetStyledText, 2996). +-define(wxStyledTextCtrl_CanRedo, 2997). +-define(wxStyledTextCtrl_MarkerLineFromHandle, 2998). +-define(wxStyledTextCtrl_MarkerDeleteHandle, 2999). +-define(wxStyledTextCtrl_GetUndoCollection, 3000). +-define(wxStyledTextCtrl_GetViewWhiteSpace, 3001). +-define(wxStyledTextCtrl_SetViewWhiteSpace, 3002). +-define(wxStyledTextCtrl_PositionFromPoint, 3003). +-define(wxStyledTextCtrl_PositionFromPointClose, 3004). +-define(wxStyledTextCtrl_GotoLine, 3005). +-define(wxStyledTextCtrl_GotoPos, 3006). +-define(wxStyledTextCtrl_SetAnchor, 3007). +-define(wxStyledTextCtrl_GetCurLine, 3008). +-define(wxStyledTextCtrl_GetEndStyled, 3009). +-define(wxStyledTextCtrl_ConvertEOLs, 3010). +-define(wxStyledTextCtrl_GetEOLMode, 3011). +-define(wxStyledTextCtrl_SetEOLMode, 3012). +-define(wxStyledTextCtrl_StartStyling, 3013). +-define(wxStyledTextCtrl_SetStyling, 3014). +-define(wxStyledTextCtrl_GetBufferedDraw, 3015). +-define(wxStyledTextCtrl_SetBufferedDraw, 3016). +-define(wxStyledTextCtrl_SetTabWidth, 3017). +-define(wxStyledTextCtrl_GetTabWidth, 3018). +-define(wxStyledTextCtrl_SetCodePage, 3019). +-define(wxStyledTextCtrl_MarkerDefine, 3020). +-define(wxStyledTextCtrl_MarkerSetForeground, 3021). +-define(wxStyledTextCtrl_MarkerSetBackground, 3022). +-define(wxStyledTextCtrl_MarkerAdd, 3023). +-define(wxStyledTextCtrl_MarkerDelete, 3024). +-define(wxStyledTextCtrl_MarkerDeleteAll, 3025). +-define(wxStyledTextCtrl_MarkerGet, 3026). +-define(wxStyledTextCtrl_MarkerNext, 3027). +-define(wxStyledTextCtrl_MarkerPrevious, 3028). +-define(wxStyledTextCtrl_MarkerDefineBitmap, 3029). +-define(wxStyledTextCtrl_MarkerAddSet, 3030). +-define(wxStyledTextCtrl_MarkerSetAlpha, 3031). +-define(wxStyledTextCtrl_SetMarginType, 3032). +-define(wxStyledTextCtrl_GetMarginType, 3033). +-define(wxStyledTextCtrl_SetMarginWidth, 3034). +-define(wxStyledTextCtrl_GetMarginWidth, 3035). +-define(wxStyledTextCtrl_SetMarginMask, 3036). +-define(wxStyledTextCtrl_GetMarginMask, 3037). +-define(wxStyledTextCtrl_SetMarginSensitive, 3038). +-define(wxStyledTextCtrl_GetMarginSensitive, 3039). +-define(wxStyledTextCtrl_StyleClearAll, 3040). +-define(wxStyledTextCtrl_StyleSetForeground, 3041). +-define(wxStyledTextCtrl_StyleSetBackground, 3042). +-define(wxStyledTextCtrl_StyleSetBold, 3043). +-define(wxStyledTextCtrl_StyleSetItalic, 3044). +-define(wxStyledTextCtrl_StyleSetSize, 3045). +-define(wxStyledTextCtrl_StyleSetFaceName, 3046). +-define(wxStyledTextCtrl_StyleSetEOLFilled, 3047). +-define(wxStyledTextCtrl_StyleResetDefault, 3048). +-define(wxStyledTextCtrl_StyleSetUnderline, 3049). +-define(wxStyledTextCtrl_StyleSetCase, 3050). +-define(wxStyledTextCtrl_StyleSetHotSpot, 3051). +-define(wxStyledTextCtrl_SetSelForeground, 3052). +-define(wxStyledTextCtrl_SetSelBackground, 3053). +-define(wxStyledTextCtrl_GetSelAlpha, 3054). +-define(wxStyledTextCtrl_SetSelAlpha, 3055). +-define(wxStyledTextCtrl_SetCaretForeground, 3056). +-define(wxStyledTextCtrl_CmdKeyAssign, 3057). +-define(wxStyledTextCtrl_CmdKeyClear, 3058). +-define(wxStyledTextCtrl_CmdKeyClearAll, 3059). +-define(wxStyledTextCtrl_SetStyleBytes, 3060). +-define(wxStyledTextCtrl_StyleSetVisible, 3061). +-define(wxStyledTextCtrl_GetCaretPeriod, 3062). +-define(wxStyledTextCtrl_SetCaretPeriod, 3063). +-define(wxStyledTextCtrl_SetWordChars, 3064). +-define(wxStyledTextCtrl_BeginUndoAction, 3065). +-define(wxStyledTextCtrl_EndUndoAction, 3066). +-define(wxStyledTextCtrl_IndicatorSetStyle, 3067). +-define(wxStyledTextCtrl_IndicatorGetStyle, 3068). +-define(wxStyledTextCtrl_IndicatorSetForeground, 3069). +-define(wxStyledTextCtrl_IndicatorGetForeground, 3070). +-define(wxStyledTextCtrl_SetWhitespaceForeground, 3071). +-define(wxStyledTextCtrl_SetWhitespaceBackground, 3072). +-define(wxStyledTextCtrl_GetStyleBits, 3073). +-define(wxStyledTextCtrl_SetLineState, 3074). +-define(wxStyledTextCtrl_GetLineState, 3075). +-define(wxStyledTextCtrl_GetMaxLineState, 3076). +-define(wxStyledTextCtrl_GetCaretLineVisible, 3077). +-define(wxStyledTextCtrl_SetCaretLineVisible, 3078). +-define(wxStyledTextCtrl_GetCaretLineBackground, 3079). +-define(wxStyledTextCtrl_SetCaretLineBackground, 3080). +-define(wxStyledTextCtrl_AutoCompShow, 3081). +-define(wxStyledTextCtrl_AutoCompCancel, 3082). +-define(wxStyledTextCtrl_AutoCompActive, 3083). +-define(wxStyledTextCtrl_AutoCompPosStart, 3084). +-define(wxStyledTextCtrl_AutoCompComplete, 3085). +-define(wxStyledTextCtrl_AutoCompStops, 3086). +-define(wxStyledTextCtrl_AutoCompSetSeparator, 3087). +-define(wxStyledTextCtrl_AutoCompGetSeparator, 3088). +-define(wxStyledTextCtrl_AutoCompSelect, 3089). +-define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3090). +-define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3091). +-define(wxStyledTextCtrl_AutoCompSetFillUps, 3092). +-define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3093). +-define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3094). +-define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3095). +-define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3096). +-define(wxStyledTextCtrl_UserListShow, 3097). +-define(wxStyledTextCtrl_AutoCompSetAutoHide, 3098). +-define(wxStyledTextCtrl_AutoCompGetAutoHide, 3099). +-define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3100). +-define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3101). +-define(wxStyledTextCtrl_RegisterImage, 3102). +-define(wxStyledTextCtrl_ClearRegisteredImages, 3103). +-define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3104). +-define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3105). +-define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3106). +-define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3107). +-define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3108). +-define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3109). +-define(wxStyledTextCtrl_SetIndent, 3110). +-define(wxStyledTextCtrl_GetIndent, 3111). +-define(wxStyledTextCtrl_SetUseTabs, 3112). +-define(wxStyledTextCtrl_GetUseTabs, 3113). +-define(wxStyledTextCtrl_SetLineIndentation, 3114). +-define(wxStyledTextCtrl_GetLineIndentation, 3115). +-define(wxStyledTextCtrl_GetLineIndentPosition, 3116). +-define(wxStyledTextCtrl_GetColumn, 3117). +-define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3118). +-define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3119). +-define(wxStyledTextCtrl_SetIndentationGuides, 3120). +-define(wxStyledTextCtrl_GetIndentationGuides, 3121). +-define(wxStyledTextCtrl_SetHighlightGuide, 3122). +-define(wxStyledTextCtrl_GetHighlightGuide, 3123). +-define(wxStyledTextCtrl_GetLineEndPosition, 3124). +-define(wxStyledTextCtrl_GetCodePage, 3125). +-define(wxStyledTextCtrl_GetCaretForeground, 3126). +-define(wxStyledTextCtrl_GetReadOnly, 3127). +-define(wxStyledTextCtrl_SetCurrentPos, 3128). +-define(wxStyledTextCtrl_SetSelectionStart, 3129). +-define(wxStyledTextCtrl_GetSelectionStart, 3130). +-define(wxStyledTextCtrl_SetSelectionEnd, 3131). +-define(wxStyledTextCtrl_GetSelectionEnd, 3132). +-define(wxStyledTextCtrl_SetPrintMagnification, 3133). +-define(wxStyledTextCtrl_GetPrintMagnification, 3134). +-define(wxStyledTextCtrl_SetPrintColourMode, 3135). +-define(wxStyledTextCtrl_GetPrintColourMode, 3136). +-define(wxStyledTextCtrl_FindText, 3137). +-define(wxStyledTextCtrl_FormatRange, 3138). +-define(wxStyledTextCtrl_GetFirstVisibleLine, 3139). +-define(wxStyledTextCtrl_GetLine, 3140). +-define(wxStyledTextCtrl_GetLineCount, 3141). +-define(wxStyledTextCtrl_SetMarginLeft, 3142). +-define(wxStyledTextCtrl_GetMarginLeft, 3143). +-define(wxStyledTextCtrl_SetMarginRight, 3144). +-define(wxStyledTextCtrl_GetMarginRight, 3145). +-define(wxStyledTextCtrl_GetModify, 3146). +-define(wxStyledTextCtrl_SetSelection, 3147). +-define(wxStyledTextCtrl_GetSelectedText, 3148). +-define(wxStyledTextCtrl_GetTextRange, 3149). +-define(wxStyledTextCtrl_HideSelection, 3150). +-define(wxStyledTextCtrl_LineFromPosition, 3151). +-define(wxStyledTextCtrl_PositionFromLine, 3152). +-define(wxStyledTextCtrl_LineScroll, 3153). +-define(wxStyledTextCtrl_EnsureCaretVisible, 3154). +-define(wxStyledTextCtrl_ReplaceSelection, 3155). +-define(wxStyledTextCtrl_SetReadOnly, 3156). +-define(wxStyledTextCtrl_CanPaste, 3157). +-define(wxStyledTextCtrl_CanUndo, 3158). +-define(wxStyledTextCtrl_EmptyUndoBuffer, 3159). +-define(wxStyledTextCtrl_Undo, 3160). +-define(wxStyledTextCtrl_Cut, 3161). +-define(wxStyledTextCtrl_Copy, 3162). +-define(wxStyledTextCtrl_Paste, 3163). +-define(wxStyledTextCtrl_Clear, 3164). +-define(wxStyledTextCtrl_SetText, 3165). +-define(wxStyledTextCtrl_GetText, 3166). +-define(wxStyledTextCtrl_GetTextLength, 3167). +-define(wxStyledTextCtrl_GetOvertype, 3168). +-define(wxStyledTextCtrl_SetCaretWidth, 3169). +-define(wxStyledTextCtrl_GetCaretWidth, 3170). +-define(wxStyledTextCtrl_SetTargetStart, 3171). +-define(wxStyledTextCtrl_GetTargetStart, 3172). +-define(wxStyledTextCtrl_SetTargetEnd, 3173). +-define(wxStyledTextCtrl_GetTargetEnd, 3174). +-define(wxStyledTextCtrl_ReplaceTarget, 3175). +-define(wxStyledTextCtrl_SearchInTarget, 3176). +-define(wxStyledTextCtrl_SetSearchFlags, 3177). +-define(wxStyledTextCtrl_GetSearchFlags, 3178). +-define(wxStyledTextCtrl_CallTipShow, 3179). +-define(wxStyledTextCtrl_CallTipCancel, 3180). +-define(wxStyledTextCtrl_CallTipActive, 3181). +-define(wxStyledTextCtrl_CallTipPosAtStart, 3182). +-define(wxStyledTextCtrl_CallTipSetHighlight, 3183). +-define(wxStyledTextCtrl_CallTipSetBackground, 3184). +-define(wxStyledTextCtrl_CallTipSetForeground, 3185). +-define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3186). +-define(wxStyledTextCtrl_CallTipUseStyle, 3187). +-define(wxStyledTextCtrl_VisibleFromDocLine, 3188). +-define(wxStyledTextCtrl_DocLineFromVisible, 3189). +-define(wxStyledTextCtrl_WrapCount, 3190). +-define(wxStyledTextCtrl_SetFoldLevel, 3191). +-define(wxStyledTextCtrl_GetFoldLevel, 3192). +-define(wxStyledTextCtrl_GetLastChild, 3193). +-define(wxStyledTextCtrl_GetFoldParent, 3194). +-define(wxStyledTextCtrl_ShowLines, 3195). +-define(wxStyledTextCtrl_HideLines, 3196). +-define(wxStyledTextCtrl_GetLineVisible, 3197). +-define(wxStyledTextCtrl_SetFoldExpanded, 3198). +-define(wxStyledTextCtrl_GetFoldExpanded, 3199). +-define(wxStyledTextCtrl_ToggleFold, 3200). +-define(wxStyledTextCtrl_EnsureVisible, 3201). +-define(wxStyledTextCtrl_SetFoldFlags, 3202). +-define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3203). +-define(wxStyledTextCtrl_SetTabIndents, 3204). +-define(wxStyledTextCtrl_GetTabIndents, 3205). +-define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3206). +-define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3207). +-define(wxStyledTextCtrl_SetMouseDwellTime, 3208). +-define(wxStyledTextCtrl_GetMouseDwellTime, 3209). +-define(wxStyledTextCtrl_WordStartPosition, 3210). +-define(wxStyledTextCtrl_WordEndPosition, 3211). +-define(wxStyledTextCtrl_SetWrapMode, 3212). +-define(wxStyledTextCtrl_GetWrapMode, 3213). +-define(wxStyledTextCtrl_SetWrapVisualFlags, 3214). +-define(wxStyledTextCtrl_GetWrapVisualFlags, 3215). +-define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3216). +-define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3217). +-define(wxStyledTextCtrl_SetWrapStartIndent, 3218). +-define(wxStyledTextCtrl_GetWrapStartIndent, 3219). +-define(wxStyledTextCtrl_SetLayoutCache, 3220). +-define(wxStyledTextCtrl_GetLayoutCache, 3221). +-define(wxStyledTextCtrl_SetScrollWidth, 3222). +-define(wxStyledTextCtrl_GetScrollWidth, 3223). +-define(wxStyledTextCtrl_TextWidth, 3224). +-define(wxStyledTextCtrl_GetEndAtLastLine, 3225). +-define(wxStyledTextCtrl_TextHeight, 3226). +-define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3227). +-define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3228). +-define(wxStyledTextCtrl_AppendText, 3229). +-define(wxStyledTextCtrl_GetTwoPhaseDraw, 3230). +-define(wxStyledTextCtrl_SetTwoPhaseDraw, 3231). +-define(wxStyledTextCtrl_TargetFromSelection, 3232). +-define(wxStyledTextCtrl_LinesJoin, 3233). +-define(wxStyledTextCtrl_LinesSplit, 3234). +-define(wxStyledTextCtrl_SetFoldMarginColour, 3235). +-define(wxStyledTextCtrl_SetFoldMarginHiColour, 3236). +-define(wxStyledTextCtrl_LineDown, 3237). +-define(wxStyledTextCtrl_LineDownExtend, 3238). +-define(wxStyledTextCtrl_LineUp, 3239). +-define(wxStyledTextCtrl_LineUpExtend, 3240). +-define(wxStyledTextCtrl_CharLeft, 3241). +-define(wxStyledTextCtrl_CharLeftExtend, 3242). +-define(wxStyledTextCtrl_CharRight, 3243). +-define(wxStyledTextCtrl_CharRightExtend, 3244). +-define(wxStyledTextCtrl_WordLeft, 3245). +-define(wxStyledTextCtrl_WordLeftExtend, 3246). +-define(wxStyledTextCtrl_WordRight, 3247). +-define(wxStyledTextCtrl_WordRightExtend, 3248). +-define(wxStyledTextCtrl_Home, 3249). +-define(wxStyledTextCtrl_HomeExtend, 3250). +-define(wxStyledTextCtrl_LineEnd, 3251). +-define(wxStyledTextCtrl_LineEndExtend, 3252). +-define(wxStyledTextCtrl_DocumentStart, 3253). +-define(wxStyledTextCtrl_DocumentStartExtend, 3254). +-define(wxStyledTextCtrl_DocumentEnd, 3255). +-define(wxStyledTextCtrl_DocumentEndExtend, 3256). +-define(wxStyledTextCtrl_PageUp, 3257). +-define(wxStyledTextCtrl_PageUpExtend, 3258). +-define(wxStyledTextCtrl_PageDown, 3259). +-define(wxStyledTextCtrl_PageDownExtend, 3260). +-define(wxStyledTextCtrl_EditToggleOvertype, 3261). +-define(wxStyledTextCtrl_Cancel, 3262). +-define(wxStyledTextCtrl_DeleteBack, 3263). +-define(wxStyledTextCtrl_Tab, 3264). +-define(wxStyledTextCtrl_BackTab, 3265). +-define(wxStyledTextCtrl_NewLine, 3266). +-define(wxStyledTextCtrl_FormFeed, 3267). +-define(wxStyledTextCtrl_VCHome, 3268). +-define(wxStyledTextCtrl_VCHomeExtend, 3269). +-define(wxStyledTextCtrl_ZoomIn, 3270). +-define(wxStyledTextCtrl_ZoomOut, 3271). +-define(wxStyledTextCtrl_DelWordLeft, 3272). +-define(wxStyledTextCtrl_DelWordRight, 3273). +-define(wxStyledTextCtrl_LineCut, 3274). +-define(wxStyledTextCtrl_LineDelete, 3275). +-define(wxStyledTextCtrl_LineTranspose, 3276). +-define(wxStyledTextCtrl_LineDuplicate, 3277). +-define(wxStyledTextCtrl_LowerCase, 3278). +-define(wxStyledTextCtrl_UpperCase, 3279). +-define(wxStyledTextCtrl_LineScrollDown, 3280). +-define(wxStyledTextCtrl_LineScrollUp, 3281). +-define(wxStyledTextCtrl_DeleteBackNotLine, 3282). +-define(wxStyledTextCtrl_HomeDisplay, 3283). +-define(wxStyledTextCtrl_HomeDisplayExtend, 3284). +-define(wxStyledTextCtrl_LineEndDisplay, 3285). +-define(wxStyledTextCtrl_LineEndDisplayExtend, 3286). +-define(wxStyledTextCtrl_HomeWrapExtend, 3287). +-define(wxStyledTextCtrl_LineEndWrap, 3288). +-define(wxStyledTextCtrl_LineEndWrapExtend, 3289). +-define(wxStyledTextCtrl_VCHomeWrap, 3290). +-define(wxStyledTextCtrl_VCHomeWrapExtend, 3291). +-define(wxStyledTextCtrl_LineCopy, 3292). +-define(wxStyledTextCtrl_MoveCaretInsideView, 3293). +-define(wxStyledTextCtrl_LineLength, 3294). +-define(wxStyledTextCtrl_BraceHighlight, 3295). +-define(wxStyledTextCtrl_BraceBadLight, 3296). +-define(wxStyledTextCtrl_BraceMatch, 3297). +-define(wxStyledTextCtrl_GetViewEOL, 3298). +-define(wxStyledTextCtrl_SetViewEOL, 3299). +-define(wxStyledTextCtrl_SetModEventMask, 3300). +-define(wxStyledTextCtrl_GetEdgeColumn, 3301). +-define(wxStyledTextCtrl_SetEdgeColumn, 3302). +-define(wxStyledTextCtrl_SetEdgeMode, 3303). +-define(wxStyledTextCtrl_GetEdgeMode, 3304). +-define(wxStyledTextCtrl_GetEdgeColour, 3305). +-define(wxStyledTextCtrl_SetEdgeColour, 3306). +-define(wxStyledTextCtrl_SearchAnchor, 3307). +-define(wxStyledTextCtrl_SearchNext, 3308). +-define(wxStyledTextCtrl_SearchPrev, 3309). +-define(wxStyledTextCtrl_LinesOnScreen, 3310). +-define(wxStyledTextCtrl_UsePopUp, 3311). +-define(wxStyledTextCtrl_SelectionIsRectangle, 3312). +-define(wxStyledTextCtrl_SetZoom, 3313). +-define(wxStyledTextCtrl_GetZoom, 3314). +-define(wxStyledTextCtrl_GetModEventMask, 3315). +-define(wxStyledTextCtrl_SetSTCFocus, 3316). +-define(wxStyledTextCtrl_GetSTCFocus, 3317). +-define(wxStyledTextCtrl_SetStatus, 3318). +-define(wxStyledTextCtrl_GetStatus, 3319). +-define(wxStyledTextCtrl_SetMouseDownCaptures, 3320). +-define(wxStyledTextCtrl_GetMouseDownCaptures, 3321). +-define(wxStyledTextCtrl_SetSTCCursor, 3322). +-define(wxStyledTextCtrl_GetSTCCursor, 3323). +-define(wxStyledTextCtrl_SetControlCharSymbol, 3324). +-define(wxStyledTextCtrl_GetControlCharSymbol, 3325). +-define(wxStyledTextCtrl_WordPartLeft, 3326). +-define(wxStyledTextCtrl_WordPartLeftExtend, 3327). +-define(wxStyledTextCtrl_WordPartRight, 3328). +-define(wxStyledTextCtrl_WordPartRightExtend, 3329). +-define(wxStyledTextCtrl_SetVisiblePolicy, 3330). +-define(wxStyledTextCtrl_DelLineLeft, 3331). +-define(wxStyledTextCtrl_DelLineRight, 3332). +-define(wxStyledTextCtrl_GetXOffset, 3333). +-define(wxStyledTextCtrl_ChooseCaretX, 3334). +-define(wxStyledTextCtrl_SetXCaretPolicy, 3335). +-define(wxStyledTextCtrl_SetYCaretPolicy, 3336). +-define(wxStyledTextCtrl_GetPrintWrapMode, 3337). +-define(wxStyledTextCtrl_SetHotspotActiveForeground, 3338). +-define(wxStyledTextCtrl_SetHotspotActiveBackground, 3339). +-define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3340). +-define(wxStyledTextCtrl_SetHotspotSingleLine, 3341). +-define(wxStyledTextCtrl_ParaDownExtend, 3342). +-define(wxStyledTextCtrl_ParaUp, 3343). +-define(wxStyledTextCtrl_ParaUpExtend, 3344). +-define(wxStyledTextCtrl_PositionBefore, 3345). +-define(wxStyledTextCtrl_PositionAfter, 3346). +-define(wxStyledTextCtrl_CopyRange, 3347). +-define(wxStyledTextCtrl_CopyText, 3348). +-define(wxStyledTextCtrl_SetSelectionMode, 3349). +-define(wxStyledTextCtrl_GetSelectionMode, 3350). +-define(wxStyledTextCtrl_LineDownRectExtend, 3351). +-define(wxStyledTextCtrl_LineUpRectExtend, 3352). +-define(wxStyledTextCtrl_CharLeftRectExtend, 3353). +-define(wxStyledTextCtrl_CharRightRectExtend, 3354). +-define(wxStyledTextCtrl_HomeRectExtend, 3355). +-define(wxStyledTextCtrl_VCHomeRectExtend, 3356). +-define(wxStyledTextCtrl_LineEndRectExtend, 3357). +-define(wxStyledTextCtrl_PageUpRectExtend, 3358). +-define(wxStyledTextCtrl_PageDownRectExtend, 3359). +-define(wxStyledTextCtrl_StutteredPageUp, 3360). +-define(wxStyledTextCtrl_StutteredPageUpExtend, 3361). +-define(wxStyledTextCtrl_StutteredPageDown, 3362). +-define(wxStyledTextCtrl_StutteredPageDownExtend, 3363). +-define(wxStyledTextCtrl_WordLeftEnd, 3364). +-define(wxStyledTextCtrl_WordLeftEndExtend, 3365). +-define(wxStyledTextCtrl_WordRightEnd, 3366). +-define(wxStyledTextCtrl_WordRightEndExtend, 3367). +-define(wxStyledTextCtrl_SetWhitespaceChars, 3368). +-define(wxStyledTextCtrl_SetCharsDefault, 3369). +-define(wxStyledTextCtrl_AutoCompGetCurrent, 3370). +-define(wxStyledTextCtrl_Allocate, 3371). +-define(wxStyledTextCtrl_FindColumn, 3372). +-define(wxStyledTextCtrl_GetCaretSticky, 3373). +-define(wxStyledTextCtrl_SetCaretSticky, 3374). +-define(wxStyledTextCtrl_ToggleCaretSticky, 3375). +-define(wxStyledTextCtrl_SetPasteConvertEndings, 3376). +-define(wxStyledTextCtrl_GetPasteConvertEndings, 3377). +-define(wxStyledTextCtrl_SelectionDuplicate, 3378). +-define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3379). +-define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3380). +-define(wxStyledTextCtrl_StartRecord, 3381). +-define(wxStyledTextCtrl_StopRecord, 3382). +-define(wxStyledTextCtrl_SetLexer, 3383). +-define(wxStyledTextCtrl_GetLexer, 3384). +-define(wxStyledTextCtrl_Colourise, 3385). +-define(wxStyledTextCtrl_SetProperty, 3386). +-define(wxStyledTextCtrl_SetKeyWords, 3387). +-define(wxStyledTextCtrl_SetLexerLanguage, 3388). +-define(wxStyledTextCtrl_GetProperty, 3389). +-define(wxStyledTextCtrl_GetStyleBitsNeeded, 3390). +-define(wxStyledTextCtrl_GetCurrentLine, 3391). +-define(wxStyledTextCtrl_StyleSetSpec, 3392). +-define(wxStyledTextCtrl_StyleSetFont, 3393). +-define(wxStyledTextCtrl_StyleSetFontAttr, 3394). +-define(wxStyledTextCtrl_StyleSetCharacterSet, 3395). +-define(wxStyledTextCtrl_StyleSetFontEncoding, 3396). +-define(wxStyledTextCtrl_CmdKeyExecute, 3397). +-define(wxStyledTextCtrl_SetMargins, 3398). +-define(wxStyledTextCtrl_GetSelection, 3399). +-define(wxStyledTextCtrl_PointFromPosition, 3400). +-define(wxStyledTextCtrl_ScrollToLine, 3401). +-define(wxStyledTextCtrl_ScrollToColumn, 3402). +-define(wxStyledTextCtrl_SetVScrollBar, 3403). +-define(wxStyledTextCtrl_SetHScrollBar, 3404). +-define(wxStyledTextCtrl_GetLastKeydownProcessed, 3405). +-define(wxStyledTextCtrl_SetLastKeydownProcessed, 3406). +-define(wxStyledTextCtrl_SaveFile, 3407). +-define(wxStyledTextCtrl_LoadFile, 3408). +-define(wxStyledTextCtrl_DoDragOver, 3409). +-define(wxStyledTextCtrl_DoDropText, 3410). +-define(wxStyledTextCtrl_GetUseAntiAliasing, 3411). +-define(wxStyledTextCtrl_AddTextRaw, 3412). +-define(wxStyledTextCtrl_InsertTextRaw, 3413). +-define(wxStyledTextCtrl_GetCurLineRaw, 3414). +-define(wxStyledTextCtrl_GetLineRaw, 3415). +-define(wxStyledTextCtrl_GetSelectedTextRaw, 3416). +-define(wxStyledTextCtrl_GetTextRangeRaw, 3417). +-define(wxStyledTextCtrl_SetTextRaw, 3418). +-define(wxStyledTextCtrl_GetTextRaw, 3419). +-define(wxStyledTextCtrl_AppendTextRaw, 3420). +-define(wxArtProvider_GetBitmap, 3421). +-define(wxArtProvider_GetIcon, 3422). +-define(wxTreeEvent_GetKeyCode, 3423). +-define(wxTreeEvent_GetItem, 3424). +-define(wxTreeEvent_GetKeyEvent, 3425). +-define(wxTreeEvent_GetLabel, 3426). +-define(wxTreeEvent_GetOldItem, 3427). +-define(wxTreeEvent_GetPoint, 3428). +-define(wxTreeEvent_IsEditCancelled, 3429). +-define(wxTreeEvent_SetToolTip, 3430). +-define(wxNotebookEvent_GetOldSelection, 3431). +-define(wxNotebookEvent_GetSelection, 3432). +-define(wxNotebookEvent_SetOldSelection, 3433). +-define(wxNotebookEvent_SetSelection, 3434). +-define(wxFileDataObject_new, 3435). +-define(wxFileDataObject_AddFile, 3436). +-define(wxFileDataObject_GetFilenames, 3437). +-define(wxFileDataObject_destroy, 3438). +-define(wxTextDataObject_new, 3439). +-define(wxTextDataObject_GetTextLength, 3440). +-define(wxTextDataObject_GetText, 3441). +-define(wxTextDataObject_SetText, 3442). +-define(wxTextDataObject_destroy, 3443). +-define(wxBitmapDataObject_new_1_1, 3444). +-define(wxBitmapDataObject_new_1_0, 3445). +-define(wxBitmapDataObject_GetBitmap, 3446). +-define(wxBitmapDataObject_SetBitmap, 3447). +-define(wxBitmapDataObject_destroy, 3448). +-define(wxClipboard_new, 3450). +-define(wxClipboard_destruct, 3451). +-define(wxClipboard_AddData, 3452). +-define(wxClipboard_Clear, 3453). +-define(wxClipboard_Close, 3454). +-define(wxClipboard_Flush, 3455). +-define(wxClipboard_GetData, 3456). +-define(wxClipboard_IsOpened, 3457). +-define(wxClipboard_Open, 3458). +-define(wxClipboard_SetData, 3459). +-define(wxClipboard_UsePrimarySelection, 3461). +-define(wxClipboard_IsSupported, 3462). +-define(wxClipboard_Get, 3463). +-define(wxSpinEvent_GetPosition, 3464). +-define(wxSpinEvent_SetPosition, 3465). +-define(wxSplitterWindow_new_0, 3466). +-define(wxSplitterWindow_new_2, 3467). +-define(wxSplitterWindow_destruct, 3468). +-define(wxSplitterWindow_Create, 3469). +-define(wxSplitterWindow_GetMinimumPaneSize, 3470). +-define(wxSplitterWindow_GetSashGravity, 3471). +-define(wxSplitterWindow_GetSashPosition, 3472). +-define(wxSplitterWindow_GetSplitMode, 3473). +-define(wxSplitterWindow_GetWindow1, 3474). +-define(wxSplitterWindow_GetWindow2, 3475). +-define(wxSplitterWindow_Initialize, 3476). +-define(wxSplitterWindow_IsSplit, 3477). +-define(wxSplitterWindow_ReplaceWindow, 3478). +-define(wxSplitterWindow_SetSashGravity, 3479). +-define(wxSplitterWindow_SetSashPosition, 3480). +-define(wxSplitterWindow_SetSashSize, 3481). +-define(wxSplitterWindow_SetMinimumPaneSize, 3482). +-define(wxSplitterWindow_SetSplitMode, 3483). +-define(wxSplitterWindow_SplitHorizontally, 3484). +-define(wxSplitterWindow_SplitVertically, 3485). +-define(wxSplitterWindow_Unsplit, 3486). +-define(wxSplitterWindow_UpdateSize, 3487). +-define(wxSplitterEvent_GetSashPosition, 3488). +-define(wxSplitterEvent_GetX, 3489). +-define(wxSplitterEvent_GetY, 3490). +-define(wxSplitterEvent_GetWindowBeingRemoved, 3491). +-define(wxSplitterEvent_SetSashPosition, 3492). +-define(wxHtmlWindow_new_0, 3493). +-define(wxHtmlWindow_new_2, 3494). +-define(wxHtmlWindow_AppendToPage, 3495). +-define(wxHtmlWindow_GetOpenedAnchor, 3496). +-define(wxHtmlWindow_GetOpenedPage, 3497). +-define(wxHtmlWindow_GetOpenedPageTitle, 3498). +-define(wxHtmlWindow_GetRelatedFrame, 3499). +-define(wxHtmlWindow_HistoryBack, 3500). +-define(wxHtmlWindow_HistoryCanBack, 3501). +-define(wxHtmlWindow_HistoryCanForward, 3502). +-define(wxHtmlWindow_HistoryClear, 3503). +-define(wxHtmlWindow_HistoryForward, 3504). +-define(wxHtmlWindow_LoadFile, 3505). +-define(wxHtmlWindow_LoadPage, 3506). +-define(wxHtmlWindow_SelectAll, 3507). +-define(wxHtmlWindow_SelectionToText, 3508). +-define(wxHtmlWindow_SelectLine, 3509). +-define(wxHtmlWindow_SelectWord, 3510). +-define(wxHtmlWindow_SetBorders, 3511). +-define(wxHtmlWindow_SetFonts, 3512). +-define(wxHtmlWindow_SetPage, 3513). +-define(wxHtmlWindow_SetRelatedFrame, 3514). +-define(wxHtmlWindow_SetRelatedStatusBar, 3515). +-define(wxHtmlWindow_ToText, 3516). +-define(wxHtmlWindow_destroy, 3517). +-define(wxHtmlLinkEvent_GetLinkInfo, 3518). +-define(wxSystemSettings_GetColour, 3519). +-define(wxSystemSettings_GetFont, 3520). +-define(wxSystemSettings_GetMetric, 3521). +-define(wxSystemSettings_GetScreenType, 3522). +-define(wxSystemOptions_GetOption, 3523). +-define(wxSystemOptions_GetOptionInt, 3524). +-define(wxSystemOptions_HasOption, 3525). +-define(wxSystemOptions_IsFalse, 3526). +-define(wxSystemOptions_SetOption_2_1, 3527). +-define(wxSystemOptions_SetOption_2_0, 3528). +-define(wxAuiNotebookEvent_SetSelection, 3529). +-define(wxAuiNotebookEvent_GetSelection, 3530). +-define(wxAuiNotebookEvent_SetOldSelection, 3531). +-define(wxAuiNotebookEvent_GetOldSelection, 3532). +-define(wxAuiNotebookEvent_SetDragSource, 3533). +-define(wxAuiNotebookEvent_GetDragSource, 3534). +-define(wxAuiManagerEvent_SetManager, 3535). +-define(wxAuiManagerEvent_GetManager, 3536). +-define(wxAuiManagerEvent_SetPane, 3537). +-define(wxAuiManagerEvent_GetPane, 3538). +-define(wxAuiManagerEvent_SetButton, 3539). +-define(wxAuiManagerEvent_GetButton, 3540). +-define(wxAuiManagerEvent_SetDC, 3541). +-define(wxAuiManagerEvent_GetDC, 3542). +-define(wxAuiManagerEvent_Veto, 3543). +-define(wxAuiManagerEvent_GetVeto, 3544). +-define(wxAuiManagerEvent_SetCanVeto, 3545). +-define(wxAuiManagerEvent_CanVeto, 3546). +-define(wxLogNull_new, 3547). +-define(wxLogNull_destroy, 3548). +-define(wxTaskBarIcon_new, 3549). +-define(wxTaskBarIcon_destruct, 3550). +-define(wxTaskBarIcon_PopupMenu, 3551). +-define(wxTaskBarIcon_RemoveIcon, 3552). +-define(wxTaskBarIcon_SetIcon, 3553). +-define(wxLocale_new_0, 3554). +-define(wxLocale_new_2, 3556). +-define(wxLocale_destruct, 3557). +-define(wxLocale_Init, 3559). +-define(wxLocale_AddCatalog_1, 3560). +-define(wxLocale_AddCatalog_3, 3561). +-define(wxLocale_AddCatalogLookupPathPrefix, 3562). +-define(wxLocale_GetCanonicalName, 3563). +-define(wxLocale_GetLanguage, 3564). +-define(wxLocale_GetLanguageName, 3565). +-define(wxLocale_GetLocale, 3566). +-define(wxLocale_GetName, 3567). +-define(wxLocale_GetString_2, 3568). +-define(wxLocale_GetString_4, 3569). +-define(wxLocale_GetHeaderValue, 3570). +-define(wxLocale_GetSysName, 3571). +-define(wxLocale_GetSystemEncoding, 3572). +-define(wxLocale_GetSystemEncodingName, 3573). +-define(wxLocale_GetSystemLanguage, 3574). +-define(wxLocale_IsLoaded, 3575). +-define(wxLocale_IsOk, 3576). +-define(wxActivateEvent_GetActive, 3577). +-define(wxPopupWindow_new_2, 3579). +-define(wxPopupWindow_new_0, 3580). +-define(wxPopupWindow_destruct, 3582). +-define(wxPopupWindow_Create, 3583). +-define(wxPopupWindow_Position, 3584). +-define(wxPopupTransientWindow_new_0, 3585). +-define(wxPopupTransientWindow_new_2, 3586). +-define(wxPopupTransientWindow_destruct, 3587). +-define(wxPopupTransientWindow_Popup, 3588). +-define(wxPopupTransientWindow_Dismiss, 3589). +-define(wxOverlay_new, 3590). +-define(wxOverlay_destruct, 3591). +-define(wxOverlay_Reset, 3592). +-define(wxDCOverlay_new_6, 3593). +-define(wxDCOverlay_new_2, 3594). +-define(wxDCOverlay_destruct, 3595). +-define(wxDCOverlay_Clear, 3596). +-define(wxDropFilesEvent_GetPosition, 3597). +-define(wxDropFilesEvent_GetNumberOfFiles, 3598). +-define(wxDropFilesEvent_GetFiles, 3599). diff --git a/lib/wx/src/wxe.hrl b/lib/wx/src/wxe.hrl index da65cb939d..0f42d7e82e 100644 --- a/lib/wx/src/wxe.hrl +++ b/lib/wx/src/wxe.hrl @@ -44,6 +44,8 @@ -define(I, signed-native). -define(F, float-native). +-define(is_chardata(String), (is_list(String) orelse is_binary(String))). + -define(WXE_IDENTIFIER, wx_env). -define(BATCH_BEGIN, 0). -define(BATCH_END, 1). diff --git a/lib/wx/test/wx_opengl_SUITE.erl b/lib/wx/test/wx_opengl_SUITE.erl index 643a0df6a3..3de9209fae 100644 --- a/lib/wx/test/wx_opengl_SUITE.erl +++ b/lib/wx/test/wx_opengl_SUITE.erl @@ -111,6 +111,8 @@ canvas(Config) -> ?m(false, wx:is_null(wxGLCanvas:getContext(Canvas))), ?m({'EXIT', {{error, no_gl_context,_},_}}, gl:getString(?GL_VENDOR)), + gl:viewport(0,0,50,50), %% Show cause an error report + ?m(ok, wxGLCanvas:setCurrent(Canvas)), io:format("Vendor: ~s~n", [gl:getString(?GL_VENDOR)]), diff --git a/system/doc/design_principles/applications.xml b/system/doc/design_principles/applications.xml index 0a1b65ea8e..c673fde07e 100644 --- a/system/doc/design_principles/applications.xml +++ b/system/doc/design_principles/applications.xml @@ -11,7 +11,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software @@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + </legalnotice> <title>Applications</title> @@ -172,31 +172,136 @@ ch_app:stop([])</code> </section> <section> - <marker id="app_dir"></marker> - <title>Directory Structure</title> - <p>When packaging code using <c>systools</c>, the code for each - application is placed in a separate directory, - <c>lib/Application-Vsn</c>, where <c>Vsn</c> is the version number.</p> - <p>This can be useful to know, even if <c>systools</c> is not used, - since Erlang/OTP is packaged according to the OTP principles - and thus comes with this directory structure. The code server - (see the <c>code(3)</c> manual page in Kernel) automatically - uses code from - the directory with the highest version number, if more than one - version of an application is present.</p> - <p>The application directory structure can also be used in the - development environment. The version number can then - be omitted from the name.</p> - <p>The application directory has the following sub-directories:</p> - <list type="bulleted"> - <item><c>src</c> - Contains the Erlang source code.</item> - <item><c>ebin</c> - Contains the Erlang object code, the - <c>beam</c> files. The <c>.app</c> file is also placed here.</item> - <item><c>priv</c> - Used for application specific files. For - example, C executables are placed here. The function - <c>code:priv_dir/1</c> is to be used to access this directory.</item> - <item><c>include</c> - Used for include files.</item> - </list> + <marker id="app_dir"></marker> + <title>Directory Structure</title> + <p>When packaging code using <c>systools</c>, the code for each + application is placed in a separate directory, + <c>lib/Application-Vsn</c>, where <c>Vsn</c> is the version number.</p> + <p>This can be useful to know, even if <c>systools</c> is not used, + since Erlang/OTP is packaged according to the OTP principles + and thus comes with a specific directory structure. The code server + (see the <seealso marker="kernel:code"><c>code(3)</c></seealso> manual + page in Kernel) automatically uses code from + the directory with the highest version number, if more than one + version of an application is present.</p> + <section> + <title>Directory Structure guidelines for a Development Environment</title> + <p>Any directory structure for development will suffice as long as the released directory structure + adhere to the <seealso marker="#app_dir_released">description below</seealso>, + but it is encouraged that the same directory structure + also be used in a development environment. The version number should be omitted from the + application directory name since this is an artifact of the release step. + </p> + <p> Some sub-directories are <em>required</em>. Some sub-directories are <em>optional</em>, meaning that it should + only be used if the application itself requires it. Finally, some sub-directories are <em>recommended</em>, + meaning it is encouraged that it is used and used as described here. For example, both documentation + and tests are encouraged to exist in an application for it to be deemed a proper OTP application.</p> +<code type="none"> + ─ ${application} + ├── doc + │ ├── internal + │ ├── examples + │ └── src + ├── include + ├── priv + ├── src + │ └── ${application}.app.src + └── test +</code> + <list type="bulleted"> + <item><c>src</c> - Required. Contains the Erlang source code, the source of the <c>.app</c> file + and internal include files used by the application itself. Additional sub-directories within + <c>src</c> can be used as namespaces to organize source files. These directories should never + be deeper than one level.</item> + <item><c>priv</c> - Optional. Used for application specific files. </item> + <item><c>include</c> - Optional. Used for public include files that must be reachable from + other applications.</item> + <item><c>doc</c> - Recommended. Any source documentation should be placed in sub-directories here.</item> + <item><c>doc/internal</c> - Recommended. Any documentation that describes implementation details about + this application, not intended for publication, should be placed here.</item> + <item><c>doc/examples</c> - Recommended. Source code for examples on how to use this application should + be placed here. It is encouraged that examples are sourced to the public documentation from + this directory.</item> + <item><c>doc/src</c> - Recommended. All source files for documentation, such as Markdown, AsciiDoc or + XML-files, should be placed here.</item> + <item><c>test</c> - Recommended. All files regarding tests, such as test suites and test specifications, + should be placed here. </item> + </list> + + <p>Other directories in the development environment may be needed. If source code from languages other + than Erlang is used, for instance C-code for NIFs, that code should be placed in a separate directory. + By convention it is recommended to prefix such directories with the language name, for example + <c>c_src</c> for C, <c>java_src</c> for Java or <c>go_src</c> for Go. Directories with <c>_src</c> + suffix indicates that it is a part of the application and the compilation step. The final build artifacts + should target the <c>priv/lib</c> or <c>priv/bin</c> directories.</p> + <p>The <c>priv</c> directory holds assets that the application needs during runtime. Executables should + reside in <c>priv/bin</c> and dynamically-linked libraries should reside in <c>priv/lib</c>. Other assets + are free to reside within the <c>priv</c> directory but it is recommended it does so in a structured manner.</p> + <p>Source files from other languages that generate Erlang code, such as ASN.1 or Mibs, should be placed + in directories, at the top level or in <c>src</c>, with the same name as the source language, for example + <c>asn1</c> and <c>mibs</c>. Build artifacts should be placed in their respective language directory, + such as <c>src</c> for Erlang code or <c>java_src</c> for Java code.</p> + <p>The <c>.app</c> file for release may reside in the <c>ebin</c>-directory in a development environment + but it is encouraged that this is an artifact of the build step. By convention a <c>.app.src</c> file + is used, which resides in the <c>src</c> directory. This file is nearly identical as the + <c>.app</c> file but certain fields may be replaced during the build step, such as the application version.</p> + <p>Directory names should not be capitalized.</p> + <p>It is encouraged to omit empty directories.</p> + + </section> + + <section> + <marker id="app_dir_released"></marker> + <title>Directory Structure for a Released System</title> + <p>A released application must follow a certain structure. + </p> +<code type="none"> + ─ ${application}-${version} + ├── bin + ├── doc + │ ├── html + │ ├── man[1-9] + │ ├── pdf + │ ├── internal + │ └── examples + ├── ebin + │ └── ${application}.app + ├── include + ├── priv + │ ├── lib + │ └── bin + └── src +</code> + <list type="bulleted"> + <item><c>src</c> - Optional. Contains the Erlang source code and internal include files + used by the application itself. This directory is no longer required in a released application.</item> + <item><c>ebin</c> - Required. Contains the Erlang object code, the <c>beam</c> files. + The <c>.app</c> file must also be placed here.</item> + <item><c>priv</c> - Optional. Used for application specific files. <c>code:priv_dir/1</c> + is to be used to access this directory.</item> + <item><c>priv/lib</c> - Recommended. Any shared-object files that are used by the application, + such as NIFs or linked-in-drivers, should be placed here.</item> + <item><c>priv/bin</c> - Recommended. Any executable that is used by the application, + such as port-programs, should be placed here.</item> + <item><c>include</c> - Optional. Used for public include files that must be reachable from + other applications.</item> + <item><c>bin</c> - Optional. Any executable that is a product of the application, + such as escripts or shell-scripts, should be placed here.</item> + <item><c>doc</c> - Optional. Any released documentation should be placed in + sub-directories here.</item> + <item><c>doc/man1</c> - Recommended. Man pages for Application executables.</item> + <item><c>doc/man3</c> - Recommended. Man pages for module APIs.</item> + <item><c>doc/man6</c> - Recommended. Man pages for Application overview.</item> + <item><c>doc/html</c> - Optional. HTML pages for the entire Application.</item> + <item><c>doc/pdf</c> - Optional. PDF documentation for the entire Application.</item> + </list> + + <p>The <c>src</c> directory could be useful to release for debugging purposes but is not required. + The <c>include</c> directory should only be released if the applications has public include files.</p> + <p>The only documentation that is recommended to be released in this way are the man pages. HTML and PDF + will normally be distributed in some other manner.</p> + <p>It is encouraged to omit empty directories.</p> + </section> </section> <section> @@ -381,4 +486,3 @@ application:start(Application, Type)</code> <c>shutdown</c>, not <c>normal</c>.</p> </section> </chapter> - diff --git a/system/doc/design_principles/code_lock.dia b/system/doc/design_principles/code_lock.dia Binary files differindex 8e6ff8a898..eaa2aca5b0 100644 --- a/system/doc/design_principles/code_lock.dia +++ b/system/doc/design_principles/code_lock.dia diff --git a/system/doc/design_principles/code_lock.png b/system/doc/design_principles/code_lock.png Binary files differindex 745fd91920..40bd35fc74 100644 --- a/system/doc/design_principles/code_lock.png +++ b/system/doc/design_principles/code_lock.png diff --git a/system/doc/design_principles/code_lock_2.dia b/system/doc/design_principles/code_lock_2.dia Binary files differindex 142909a2f5..3b9ba554d8 100644 --- a/system/doc/design_principles/code_lock_2.dia +++ b/system/doc/design_principles/code_lock_2.dia diff --git a/system/doc/design_principles/code_lock_2.png b/system/doc/design_principles/code_lock_2.png Binary files differindex ecf7b0d799..3aca9dd5aa 100644 --- a/system/doc/design_principles/code_lock_2.png +++ b/system/doc/design_principles/code_lock_2.png diff --git a/system/doc/design_principles/statem.xml b/system/doc/design_principles/statem.xml index 57e47431b8..f627145f9f 100644 --- a/system/doc/design_principles/statem.xml +++ b/system/doc/design_principles/statem.xml @@ -29,7 +29,7 @@ <rev></rev> <file>statem.xml</file> </header> - <marker id="gen_statem behaviour"></marker> + <marker id="gen_statem Behaviour" /> <p> This section is to be read with the <seealso marker="stdlib:gen_statem"><c>gen_statem(3)</c></seealso> @@ -50,6 +50,7 @@ <!-- =================================================================== --> <section> + <marker id="Event-Driven State Machines" /> <title>Event-Driven State Machines</title> <p> Established Automata Theory does not deal much with @@ -94,7 +95,7 @@ State(S) x Event(E) -> Actions(A), State(S')</pre> <!-- =================================================================== --> <section> - <marker id="callback_modes" /> + <marker id="Callback Modes" /> <title>Callback Modes</title> <p> The <c>gen_statem</c> behavior supports two callback modes: @@ -109,8 +110,13 @@ State(S) x Event(E) -> Actions(A), State(S')</pre> </p> <pre> StateName(EventType, EventContent, Data) -> - .. code for actions here ... - {next_state, NewStateName, NewData}.</pre> + ... code for actions here ... + {next_state, NewStateName, NewData}. + </pre> + <p> + This form is used in most examples here for example in section + <seealso marker="#Example">Example</seealso>. + </p> </item> <item> <p> @@ -120,8 +126,14 @@ StateName(EventType, EventContent, Data) -> </p> <pre> handle_event(EventType, EventContent, State, Data) -> - .. code for actions here ... - {next_state, NewState, NewData}</pre> + ... code for actions here ... + {next_state, NewState, NewData} + </pre> + <p> + Se section + <seealso marker="#One Event Handler">One Event Handler</seealso> + for an example. + </p> </item> </list> <p> @@ -134,10 +146,11 @@ handle_event(EventType, EventContent, State, Data) -> </p> <section> + <marker id="Choosing the Callback Mode" /> <title>Choosing the Callback Mode</title> <p> The two - <seealso marker="#callback_modes">callback modes</seealso> + <seealso marker="#Callback Modes">callback modes</seealso> give different possibilities and restrictions, but one goal remains: you want to handle all possible combinations of @@ -195,10 +208,195 @@ handle_event(EventType, EventContent, State, Data) -> <!-- =================================================================== --> <section> + <marker id="State Enter Calls" /> + <title>State Enter Calls</title> + <p> + The <c>gen_statem</c> behavior can regardless of callback mode + automatically + <seealso marker="stdlib:gen_statem#type-state_enter"> + call the state callback + </seealso> + with special arguments whenever the state changes + so you can write state entry actions + near the rest of the state transition rules. + It typically looks like this: + </p> + <pre> +StateName(enter, _OldState, Data) -> + ... code for state entry actions here ... + {keep_state, NewData}; +StateName(EventType, EventContent, Data) -> + ... code for actions here ... + {next_state, NewStateName, NewData}.</pre> + <p> + Depending on how your state machine is specified, + this can be a very useful feature, + but it forces you to handle the state enter calls in all states. + See also the + <seealso marker="#State Entry Actions"> + State Entry Actions + </seealso> + chapter. + </p> + </section> + +<!-- =================================================================== --> + + <section> + <marker id="Actions" /> + <title>Actions</title> + <p> + In the first section + <seealso marker="#Event-Driven State Machines"> + Event-Driven State Machines + </seealso> + actions were mentioned as a part of + the general state machine model. These general actions + are implemented with the code that callback module + <c>gen_statem</c> executes in an event-handling + callback function before returning + to the <c>gen_statem</c> engine. + </p> + <p> + There are more specific state-transition actions + that a callback function can order the <c>gen_statem</c> + engine to do after the callback function return. + These are ordered by returning a list of + <seealso marker="stdlib:gen_statem#type-action">actions</seealso> + in the + <seealso marker="stdlib:gen_statem#type-state_callback_result">return tuple</seealso> + from the + <seealso marker="stdlib:gen_statem#Module:StateName/3">callback function</seealso>. + These state transition actions affect the <c>gen_statem</c> + engine itself and can do the following: + </p> + <list type="bulleted"> + <item> + <seealso marker="stdlib:gen_statem#type-postpone"> + Postpone + </seealso> + the current event, see section + <seealso marker="#Postponing Events">Postponing Events</seealso> + </item> + <item> + <seealso marker="stdlib:gen_statem#type-hibernate"> + Hibernate + </seealso> + the <c>gen_statem</c>, treated in + <seealso marker="#Hibernation">Hibernation</seealso> + </item> + <item> + Start a + <seealso marker="stdlib:gen_statem#type-state_timeout"> + state time-out</seealso>, + read more in section + <seealso marker="#State Time-Outs">State Time-Outs</seealso> + </item> + <item> + Start an + <seealso marker="stdlib:gen_statem#type-event_timeout">event time-out</seealso>, + see more in section + <seealso marker="#Event Time-Outs">Event Time-Outs</seealso> + </item> + <item> + <seealso marker="stdlib:gen_statem#type-reply_action"> + Reply + </seealso> + to a caller, mentioned at the end of section + <seealso marker="#All State Events">All State Events</seealso> + </item> + <item> + Generate the + <seealso marker="stdlib:gen_statem#type-action"> + next event + </seealso> + to handle, see section + <seealso marker="#Self-Generated Events">Self-Generated Events</seealso> + </item> + </list> + <p> + For details, see the + <seealso marker="stdlib:gen_statem#type-action"> + <c>gen_statem(3)</c> + </seealso> + manual page. + You can, for example, reply to many callers + and generate multiple next events to handle. + </p> + </section> + +<!-- =================================================================== --> + + <section> + <marker id="Event Types" /> + <title>Event Types</title> + <p> + Events are categorized in different + <seealso marker="stdlib:gen_statem#type-event_type">event types</seealso>. + Events of all types are handled in the same callback function, + for a given state, and the function gets + <c>EventType</c> and <c>EventContent</c> as arguments. + </p> + <p> + The following is a complete list of event types and where + they come from: + </p> + <taglist> + <tag><c>cast</c></tag> + <item> + Generated by + <seealso marker="stdlib:gen_statem#cast/2"><c>gen_statem:cast</c></seealso>. + </item> + <tag><c>{call,From}</c></tag> + <item> + Generated by + <seealso marker="stdlib:gen_statem#call/2"><c>gen_statem:call</c></seealso>, + where <c>From</c> is the reply address to use + when replying either through the state transition action + <c>{reply,From,Msg}</c> or by calling + <seealso marker="stdlib:gen_statem#reply/1"><c>gen_statem:reply</c></seealso>. + </item> + <tag><c>info</c></tag> + <item> + Generated by any regular process message sent to + the <c>gen_statem</c> process. + </item> + <tag><c>state_timeout</c></tag> + <item> + Generated by state transition action + <seealso marker="stdlib:gen_statem#type-state_timeout"> + <c>{state_timeout,Time,EventContent}</c> + </seealso> + state timer timing out. + </item> + <tag><c>timeout</c></tag> + <item> + Generated by state transition action + <seealso marker="stdlib:gen_statem#type-event_timeout"> + <c>{timeout,Time,EventContent}</c> + </seealso> + (or its short form <c>Time</c>) + event timer timing out. + </item> + <tag><c>internal</c></tag> + <item> + Generated by state transition + <seealso marker="stdlib:gen_statem#type-action">action</seealso> + <c>{next_event,internal,EventContent}</c>. + All event types above can also be generated using + <c>{next_event,EventType,EventContent}</c>. + </item> + </taglist> + </section> + +<!-- =================================================================== --> + + <section> + <marker id="Example" /> <title>Example</title> <p> This example starts off as equivalent to the example in section - <seealso marker="fsm"><c>gen_fsm</c> Behavior</seealso>. + <seealso marker="fsm"><c>gen_fsm</c> Behavior</seealso>. In later sections, additions and tweaks are made using features in <c>gen_statem</c> that <c>gen_fsm</c> does not have. The end of this chapter provides the example again @@ -221,7 +419,6 @@ handle_event(EventType, EventContent, State, Data) -> This code lock state machine can be implemented using <c>gen_statem</c> with the following callback module: </p> - <marker id="ex"></marker> <code type="erl"><![CDATA[ -module(code_lock). -behaviour(gen_statem). @@ -241,7 +438,7 @@ button(Digit) -> init(Code) -> do_lock(), Data = #{code => Code, remaining => Code}, - {ok,locked,Data}. + {ok, locked, Data}. callback_mode() -> state_functions. @@ -252,19 +449,19 @@ locked( case Remaining of [Digit] -> do_unlock(), - {next_state,open,Data#{remaining := Code},10000}; + {next_state, open, Data#{remaining := Code}, + [{state_timeout,10000,lock}]; [Digit|Rest] -> % Incomplete - {next_state,locked,Data#{remaining := Rest}}; + {next_state, locked, Data#{remaining := Rest}}; _Wrong -> - {next_state,locked,Data#{remaining := Code}} + {next_state, locked, Data#{remaining := Code}} end. -open(timeout, _, Data) -> +open(state_timeout, lock, Data) -> do_lock(), - {next_state,locked,Data}; + {next_state, locked, Data}; open(cast, {button,_}, Data) -> - do_lock(), - {next_state,locked,Data}. + {next_state, open, Data}. do_lock() -> io:format("Lock~n", []). @@ -275,7 +472,7 @@ terminate(_Reason, State, _Data) -> State =/= locked andalso do_lock(), ok. code_change(_Vsn, State, Data, _Extra) -> - {ok,State,Data}. + {ok, State, Data}. ]]></code> <p>The code is explained in the next sections.</p> </section> @@ -283,6 +480,7 @@ code_change(_Vsn, State, Data, _Extra) -> <!-- =================================================================== --> <section> + <marker id="Starting gen_statem" /> <title>Starting gen_statem</title> <p> In the example in the previous section, <c>gen_statem</c> is @@ -345,7 +543,7 @@ start_link(Code) -> <p> If name registration succeeds, the new <c>gen_statem</c> process calls callback function <c>code_lock:init(Code)</c>. - This function is expected to return <c>{ok,State,Data}</c>, + This function is expected to return <c>{ok, State, Data}</c>, where <c>State</c> is the initial state of the <c>gen_statem</c>, in this case <c>locked</c>; assuming that the door is locked to begin with. <c>Data</c> is the internal server data of the <c>gen_statem</c>. @@ -386,7 +584,7 @@ callback_mode() -> Function <seealso marker="stdlib:gen_statem#Module:callback_mode/0"><c>Module:callback_mode/0</c></seealso> selects the - <seealso marker="#callback_modes"><c>CallbackMode</c></seealso> + <seealso marker="#Callback Modes"><c>CallbackMode</c></seealso> for the callback module, in this case <seealso marker="stdlib:gen_statem#type-callback_mode"><c>state_functions</c></seealso>. That is, each state has got its own handler function. @@ -397,6 +595,7 @@ callback_mode() -> <!-- =================================================================== --> <section> + <marker id="Handling Events" /> <title>Handling Events</title> <p>The function notifying the code lock about a button event is implemented using @@ -416,11 +615,13 @@ button(Digit) -> The event is made into a message and sent to the <c>gen_statem</c>. When the event is received, the <c>gen_statem</c> calls <c>StateName(cast, Event, Data)</c>, which is expected to - return a tuple <c>{next_state,NewStateName,NewData}</c>. + return a tuple <c>{next_state, NewStateName, NewData}</c>, + or <c>{next_state, NewStateName, NewData, Actions}</c>. <c>StateName</c> is the name of the current state and <c>NewStateName</c> is the name of the next state to go to. <c>NewData</c> is a new value for the server data of - the <c>gen_statem</c>. + the <c>gen_statem</c>, and <c>Actions</c> is a list of + actions on the <c>gen_statem</c> engine. </p> <code type="erl"><![CDATA[ locked( @@ -429,19 +630,19 @@ locked( case Remaining of [Digit] -> % Complete do_unlock(), - {next_state,open,Data#{remaining := Code},10000}; + {next_state, open, Data#{remaining := Code}, + [{state_timeout,10000,lock}]}; [Digit|Rest] -> % Incomplete - {next_state,locked,Data#{remaining := Rest}}; + {next_state, locked, Data#{remaining := Rest}}; [_|_] -> % Wrong - {next_state,locked,Data#{remaining := Code}} + {next_state, locked, Data#{remaining := Code}} end. -open(timeout, _, Data) -> +open(state_timeout, lock, Data) -> do_lock(), - {next_state,locked,Data}; + {next_state, locked, Data}; open(cast, {button,_}, Data) -> - do_lock(), - {next_state,locked,Data}. + {next_state, open, Data}. ]]></code> <p> If the door is locked and a button is pressed, the pressed @@ -455,38 +656,55 @@ open(cast, {button,_}, Data) -> restarts from the start of the code sequence. </p> <p> - In state <c>open</c>, any button locks the door, as - any event cancels the event timer, so no - time-out event occurs after a button event. + If the whole code is correct, the server changes states + to <c>open</c>. + </p> + <p> + In state <c>open</c>, a button event is ignored + by staying in the same state. This can also be done + by returning <c>{keep_state, Data}</c> or in this case + since <c>Data</c> unchanged even by returning + <c>keep_state_and_data</c>. </p> </section> <section> - <title>Event Time-Outs</title> + <marker id="State Time-Outs" /> + <title>State Time-Outs</title> <p> When a correct code has been given, the door is unlocked and the following tuple is returned from <c>locked/2</c>: </p> <code type="erl"><![CDATA[ -{next_state,open,Data#{remaining := Code},10000}; +{next_state, open, Data#{remaining := Code}, + [{state_timeout,10000,lock}]}; ]]></code> <p> 10,000 is a time-out value in milliseconds. After this time (10 seconds), a time-out occurs. - Then, <c>StateName(timeout, 10000, Data)</c> is called. + Then, <c>StateName(state_timeout, lock, Data)</c> is called. The time-out occurs when the door has been in state <c>open</c> for 10 seconds. After that the door is locked again: </p> <code type="erl"><![CDATA[ -open(timeout, _, Data) -> +open(state_timeout, lock, Data) -> do_lock(), - {next_state,locked,Data}; + {next_state, locked, Data}; ]]></code> + <p> + The timer for a state time-out is automatically cancelled + when the state machine changes states. You can restart + a state time-out by setting it to a new time, which cancels + the running timer and starts a new. This implies that + you can cancel a state time-out by restarting it with + time <c>infinity</c>. + </p> </section> <!-- =================================================================== --> <section> + <marker id="All State Events" /> <title>All State Events</title> <p> Sometimes events can arrive in any state of the <c>gen_statem</c>. @@ -519,21 +737,24 @@ open(EventType, EventContent, Data) -> handle_event(EventType, EventContent, Data). handle_event({call,From}, code_length, #{code := Code} = Data) -> - {keep_state,Data,[{reply,From,length(Code)}]}. + {keep_state, Data, [{reply,From,length(Code)}]}. ]]></code> <p> This example uses <seealso marker="stdlib:gen_statem#call/2"><c>gen_statem:call/2</c></seealso>, which waits for a reply from the server. The reply is sent with a <c>{reply,From,Reply}</c> tuple - in an action list in the <c>{keep_state,...}</c> tuple - that retains the current state. + in an action list in the <c>{keep_state, ...}</c> tuple + that retains the current state. This return form is convenient + when you want to stay in the current state but do not know or + care about what it is. </p> </section> <!-- =================================================================== --> <section> + <marker id="One Event Handler" /> <title>One Event Handler</title> <p> If mode <c>handle_event_function</c> is used, @@ -557,19 +778,19 @@ handle_event(cast, {button,Digit}, State, #{code := Code} = Data) -> case maps:get(remaining, Data) of [Digit] -> % Complete do_unlock(), - {next_state,open,Data#{remaining := Code},10000}; + {next_state, open, Data#{remaining := Code}, + [{state_timeout,10000,lock}}; [Digit|Rest] -> % Incomplete - {keep_state,Data#{remaining := Rest}}; + {keep_state, Data#{remaining := Rest}}; [_|_] -> % Wrong - {keep_state,Data#{remaining := Code}} + {keep_state, Data#{remaining := Code}} end; open -> - do_lock(), - {next_state,locked,Data} + keep_state_and_data end; -handle_event(timeout, _, open, Data) -> +handle_event(state_timeout, lock, open, Data) -> do_lock(), - {next_state,locked,Data}. + {next_state, locked, Data}. ... ]]></code> @@ -578,9 +799,11 @@ handle_event(timeout, _, open, Data) -> <!-- =================================================================== --> <section> + <marker id="Stopping" /> <title>Stopping</title> <section> + <marker id="In a Supervision Tree" /> <title>In a Supervision Tree</title> <p> If the <c>gen_statem</c> is part of a supervision tree, @@ -620,6 +843,7 @@ terminate(_Reason, State, _Data) -> </section> <section> + <marker id="Standalone gen_statem" /> <title>Standalone gen_statem</title> <p> If the <c>gen_statem</c> is not part of a supervision tree, @@ -646,127 +870,77 @@ stop() -> <!-- =================================================================== --> <section> - <title>Actions</title> + <marker id="Event Time-Outs" /> + <title>Event Time-Outs</title> <p> - In the first sections actions were mentioned as a part of - the general state machine model. These general actions - are implemented with the code that callback module - <c>gen_statem</c> executes in an event-handling - callback function before returning - to the <c>gen_statem</c> engine. + A timeout feature inherited from <c>gen_statem</c>'s predecessor + <seealso marker="stdlib:gen_fsm"><c>gen_fsm</c></seealso>, + is an event time-out, that is, + if an event arrives the timer is cancelled. + You get either an event or a time-out, but not both. </p> <p> - There are more specific state-transition actions - that a callback function can order the <c>gen_statem</c> - engine to do after the callback function return. - These are ordered by returning a list of - <seealso marker="stdlib:gen_statem#type-action">actions</seealso> - in the - <seealso marker="stdlib:gen_statem#type-state_function_result">return tuple</seealso> - from the - <seealso marker="stdlib:gen_statem#Module:StateName/3">callback function</seealso>. - These state transition actions affect the <c>gen_statem</c> - engine itself and can do the following: + It is ordered by the state transition action + <c>{timeout,Time,EventContent}</c>, or just <c>Time</c>, + or even just <c>Time</c> instead of an action list + (the latter is a form inherited from <c>gen_fsm</c>. </p> - <list type="bulleted"> - <item>Postpone the current event</item> - <item>Hibernate the <c>gen_statem</c></item> - <item>Start an event time-out</item> - <item>Reply to a caller</item> - <item>Generate the next event to handle</item> - </list> <p> - In the example earlier was mentioned the event time-out - and replying to a caller. - An example of event postponing is included later in this chapter. - For details, see the - <seealso marker="stdlib:gen_statem#type-action"><c>gen_statem(3)</c></seealso> - manual page. - You can, for example, reply to many callers - and generate multiple next events to handle. + This type of time-out is useful to for example act on inactivity. + Let us start restart the code sequence + if no button is pressed for say 30 seconds: </p> - </section> - -<!-- =================================================================== --> + <code type="erl"><![CDATA[ +... - <section> - <title>Event Types</title> +locked( + timeout, _, + #{code := Code, remaining := Remaining} = Data) -> + {next_state, locked, Data#{remaining := Code}}; +locked( + cast, {button,Digit}, + #{code := Code, remaining := Remaining} = Data) -> +... + [Digit|Rest] -> % Incomplete + {next_state, locked, Data#{remaining := Rest}, 30000}; +... + ]]></code> <p> - The previous sections mentioned a few - <seealso marker="stdlib:gen_statem#type-event_type">event types</seealso>. - Events of all types are handled in the same callback function, - for a given state, and the function gets - <c>EventType</c> and <c>EventContent</c> as arguments. + Whenever we receive a button event we start an event timeout + of 30 seconds, and if we get an event type <c>timeout</c> + we reset the remaining code sequence. </p> <p> - The following is a complete list of event types and where - they come from: + An event timeout is cancelled by any other event so you either + get some other event or the timeout event. It is therefore + not possible nor needed to cancel or restart an event timeout. + Whatever event you act on has already cancelled + the event timeout... </p> - <taglist> - <tag><c>cast</c></tag> - <item> - Generated by - <seealso marker="stdlib:gen_statem#cast/2"><c>gen_statem:cast</c></seealso>. - </item> - <tag><c>{call,From}</c></tag> - <item> - Generated by - <seealso marker="stdlib:gen_statem#call/2"><c>gen_statem:call</c></seealso>, - where <c>From</c> is the reply address to use - when replying either through the state transition action - <c>{reply,From,Msg}</c> or by calling - <seealso marker="stdlib:gen_statem#reply/1"><c>gen_statem:reply</c></seealso>. - </item> - <tag><c>info</c></tag> - <item> - Generated by any regular process message sent to - the <c>gen_statem</c> process. - </item> - <tag><c>timeout</c></tag> - <item> - Generated by state transition action - <c>{timeout,Time,EventContent}</c> (or its short form <c>Time</c>) - timer timing out. - </item> - <tag><c>internal</c></tag> - <item> - Generated by state transition action - <c>{next_event,internal,EventContent}</c>. - All event types above can also be generated using - <c>{next_event,EventType,EventContent}</c>. - </item> - </taglist> </section> <!-- =================================================================== --> <section> - <title>State Time-Outs</title> + <marker id="Erlang Timers" /> + <title>Erlang Timers</title> <p> - The time-out event generated by state transition action - <c>{timeout,Time,EventContent}</c> is an event time-out, - that is, if an event arrives the timer is cancelled. - You get either an event or a time-out, but not both. + The previous example of state time-outs only work if + the state machine stays in the same state during the + time-out time. And event time-outs only work if no + disturbing unrelated events occur. </p> <p> - Often you want a timer not to be cancelled by any event - or you want to start a timer in one state and respond - to the time-out in another. This can be accomplished - with a regular Erlang timer: - <seealso marker="erts:erlang#start_timer/4"><c>erlang:start_timer</c></seealso>. + You may want to start a timer in one state and respond + to the time-out in another, maybe cancel the time-out + without changing states, or perhaps run multiple + time-outs in parallel. All this can be accomplished + with Erlang Timers: + <seealso marker="erts:erlang#start_timer/4"><c>erlang:start_timer3,4</c></seealso>. </p> <p> - For the example so far in this chapter: using the - <c>gen_statem</c> event timer has the consequence that - if a button event is generated while in the <c>open</c> state, - the time-out is cancelled and the button event is delivered. - So, we choose to lock the door if this occurred. - </p> - <p> - Suppose that we do not want a button to lock the door, - instead we want to ignore button events in the <c>open</c> state. - Then we start a timer when entering the <c>open</c> state - and wait for it to expire while ignoring button events: + Here is how to accomplish the state time-out + in the previous example by insted using an Erlang Timer: </p> <code type="erl"><![CDATA[ ... @@ -777,25 +951,37 @@ locked( [Digit] -> do_unlock(), Tref = erlang:start_timer(10000, self(), lock), - {next_state,open,Data#{remaining := Code, timer := Tref}}; + {next_state, open, Data#{remaining := Code, timer => Tref}}; ... open(info, {timeout,Tref,lock}, #{timer := Tref} = Data) -> do_lock(), - {next_state,locked,Data}; + {next_state,locked,maps:remove(timer, Data)}; open(cast, {button,_}, Data) -> {keep_state,Data}; ... ]]></code> <p> + Removing the <c>timer</c> key from the map when we + change to state <c>locked</c> is not strictly + necessary since we can only get into state <c>open</c> + with an updated <c>timer</c> map value. But it can be nice + to not have outdated values in the state <c>Data</c>! + </p> + <p> If you need to cancel a timer because of some other event, you can use <seealso marker="erts:erlang#cancel_timer/2"><c>erlang:cancel_timer(Tref)</c></seealso>. - Notice that a time-out message cannot arrive after this, - unless you have postponed it (see the next section) before, + Note that a time-out message cannot arrive after this, + unless you have postponed it before (see the next section), so ensure that you do not accidentally postpone such messages. + Also note that a time-out message may have arrived + just before you cancelling it, so you may have to read out + such a message from the process mailbox depending on + the return value from + <seealso marker="erts:erlang#cancel_timer/2"><c>erlang:cancel_timer(Tref)</c></seealso>. </p> <p> - Another way to cancel a timer is not to cancel it, + Another way to handle a late time-out can be to not cancel it, but to ignore it if it arrives in a state where it is known to be late. </p> @@ -804,6 +990,7 @@ open(cast, {button,_}, Data) -> <!-- =================================================================== --> <section> + <marker id="Postponing Events" /> <title>Postponing Events</title> <p> If you want to ignore a particular event in the current state @@ -828,20 +1015,28 @@ open(cast, {button,_}, Data) -> ... ]]></code> <p> - The fact that a postponed event is only retried after a state change - translates into a requirement on the event and state space. - If you have a choice between storing a state data item - in the <c>State</c> or in the <c>Data</c>: - if a change in the item value affects which events that - are handled, then this item is to be part of the state. + Since a postponed event is only retried after a state change, + you have to think about where to keep a state data item. + You can keep it in the server <c>Data</c> + or in the <c>State</c> itself, + for example by having two more or less identical states + to keep a boolean value, or by using a complex state with + <seealso marker="#Callback Modes">callback mode</seealso> + <seealso marker="stdlib:gen_statem#type-callback_mode"><c>handle_event_function</c></seealso>. + If a change in the value changes the set of events that is handled, + then the value should be kept in the State. + Otherwise no postponed events will be retried + since only the server Data changes. </p> <p> - You want to avoid that you maybe much later decide - to postpone an event in one state and by misfortune it is never retried, - as the code only changes the <c>Data</c> but not the <c>State</c>. + This is not important if you do not postpone events. + But if you later decide to start postponing some events, + then the design flaw of not having separate states + when they should be, might become a hard to find bug. </p> <section> + <marker id="Fuzzy State Diagrams" /> <title>Fuzzy State Diagrams</title> <p> It is not uncommon that a state diagram does not specify @@ -858,6 +1053,7 @@ open(cast, {button,_}, Data) -> </section> <section> + <marker id="Selective Receive" /> <title>Selective Receive</title> <p> Erlang's selective receive statement is often used to @@ -937,6 +1133,59 @@ do_unlock() -> <!-- =================================================================== --> <section> + <marker id="State Entry Actions" /> + <title>State Entry Actions</title> + <p> + Say you have a state machine specification + that uses state entry actions. + Allthough you can code this using self-generated events + (described in the next section), especially if just + one or a few states has got state entry actions, + this is a perfect use case for the built in + <seealso marker="#State Enter Calls">state enter calls</seealso>. + </p> + <p> + You return a list containing <c>state_enter</c> from your + <seealso marker="stdlib:gen_statem#Module:callback_mode/0"><c>callback_mode/0</c></seealso> + function and the <c>gen_statem</c> engine will call your + state callback once with the arguments + <c>(enter, OldState, ...)</c> whenever the state changes. + Then you just need to handle these event-like calls in all states. + </p> + <code type="erl"><![CDATA[ +... +init(Code) -> + process_flag(trap_exit, true), + Data = #{code => Code}, + {ok, locked, Data}. + +callback_mode() -> + [state_functions,state_enter]. + +locked(enter, _OldState, Data) -> + do_lock(), + {keep_state,Data#{remaining => Code}}; +locked( + cast, {button,Digit}, + #{code := Code, remaining := Remaining} = Data) -> + case Remaining of + [Digit] -> + {next_state, open, Data}; +... + +open(enter, _OldState, _Data) -> + do_unlock(), + {keep_state_and_data, [{state_timeout,10000,lock}]}; +open(state_timeout, lock, Data) -> + {next_state, locked, Data}; +... + ]]></code> + </section> + +<!-- =================================================================== --> + + <section> + <marker id="Self-Generated Events" /> <title>Self-Generated Events</title> <p> It can sometimes be beneficial to be able to generate events @@ -954,64 +1203,71 @@ do_unlock() -> from your state machine to itself. </p> <p> - One example of using self-generated events can be when you have - a state machine specification that uses state entry actions. - You can code that using a dedicated function - to do the state transition. But if you want that code to be - visible besides the other state logic, you can insert - an <c>internal</c> event that does the entry actions. - This has the same unfortunate consequence as using - state transition functions: everywhere you go to - the state, you must explicitly - insert the <c>internal</c> event - or use a state transition function. + One example for this is to pre-process incoming data, for example + decrypting chunks or collecting characters up to a line break. + Purists may argue that this should be modelled with a separate + state machine that sends pre-processed events + to the main state machine. + But to decrease overhead the small pre-processing state machine + can be implemented in the common state event handling + of the main state machine using a few state data variables + that then sends the pre-processed events as internal events + to the main state machine. </p> <p> - The following is an implementation of entry actions - using <c>internal</c> events with content <c>enter</c> - using a helper function <c>enter/3</c> for state entry: + The following example uses an input model where you give the lock + characters with <c>put_chars(Chars)</c> and then call + <c>enter()</c> to finish the input. </p> <code type="erl"><![CDATA[ ... -init(Code) -> - process_flag(trap_exit, true), - Data = #{code => Code}, - enter(ok, locked, Data). +-export(put_chars/1, enter/0). +... +put_chars(Chars) when is_binary(Chars) -> + gen_statem:call(?NAME, {chars,Chars}). -callback_mode() -> - state_functions. +enter() -> + gen_statem:call(?NAME, enter). -locked(internal, enter, _Data) -> - do_lock(), - {keep_state,Data#{remaining => Code}}; -locked( - cast, {button,Digit}, - #{code := Code, remaining := Remaining} = Data) -> - case Remaining of - [Digit] -> - enter(next_state, open, Data); ... -open(internal, enter, _Data) -> - Tref = erlang:start_timer(10000, self(), lock), - do_unlock(), - {keep_state,Data#{timer => Tref}}; -open(info, {timeout,Tref,lock}, #{timer := Tref} = Data) -> - enter(next_state, locked, Data); +locked(enter, _OldState, Data) -> + do_lock(), + {keep_state,Data#{remaining => Code, buf => []}}; ... -enter(Tag, State, Data) -> - {Tag,State,Data,[{next_event,internal,enter}]}. +handle_event({call,From}, {chars,Chars}, #{buf := Buf} = Data) -> + {keep_state, Data#{buf := [Chars|Buf], + [{reply,From,ok}]}; +handle_event({call,From}, enter, #{buf := Buf} = Data) -> + Chars = unicode:characters_to_binary(lists:reverse(Buf)), + try binary_to_integer(Chars) of + Digit -> + {keep_state, Data#{buf := []}, + [{reply,From,ok}, + {next_event,internal,{button,Chars}}]} + catch + error:badarg -> + {keep_state, Data#{buf := []}, + [{reply,From,{error,not_an_integer}}]} + end; +... ]]></code> + <p> + If you start this program with <c>code_lock:start([17])</c> + you can unlock with <c>code_lock:put_chars(<<"001">>), + code_lock:put_chars(<<"7">>), code_lock:enter()</c>. + </p> </section> <!-- =================================================================== --> <section> + <marker id="Example Revisited" /> <title>Example Revisited</title> <p> - This section includes the example after all mentioned modifications - and some more using the entry actions, + This section includes the example after most of the mentioned + modifications and some more using state enter calls, which deserves a new state diagram: </p> <image file="../design_principles/code_lock_2.png"> @@ -1027,6 +1283,7 @@ enter(Tag, State, Data) -> </p> <section> + <marker id="Callback Mode: state_functions" /> <title>Callback Mode: state_functions</title> <p> Using state functions: @@ -1054,43 +1311,44 @@ code_length() -> init(Code) -> process_flag(trap_exit, true), Data = #{code => Code}, - enter(ok, locked, Data). + {ok, locked, Data}. callback_mode() -> - state_functions. + [state_functions,state_enter]. -locked(internal, enter, #{code := Code} = Data) -> +locked(enter, _OldState, #{code := Code} = Data) -> do_lock(), - {keep_state,Data#{remaining => Code}}; + {keep_state, Data#{remaining => Code}}; +locked( + timeout, _, + #{code := Code, remaining := Remaining} = Data) -> + {keep_state, Data#{remaining := Code}}; locked( cast, {button,Digit}, #{code := Code, remaining := Remaining} = Data) -> case Remaining of [Digit] -> % Complete - enter(next_state, open, Data); + {next_state, open, Data}; [Digit|Rest] -> % Incomplete - {keep_state,Data#{remaining := Rest}}; + {keep_state, Data#{remaining := Rest}, 30000}; [_|_] -> % Wrong - {keep_state,Data#{remaining := Code}} + {keep_state, Data#{remaining := Code}} end; locked(EventType, EventContent, Data) -> handle_event(EventType, EventContent, Data). -open(internal, enter, Data) -> - Tref = erlang:start_timer(10000, self(), lock), +open(enter, _OldState, _Data) -> do_unlock(), - {keep_state,Data#{timer => Tref}}; -open(info, {timeout,Tref,lock}, #{timer := Tref} = Data) -> - enter(next_state, locked, Data); + {keep_state_and_data, [{state_timeout,10000,lock}]}; +open(state_timeout, lock, Data) -> + {next_state, locked, Data}; open(cast, {button,_}, _) -> - {keep_state_and_data,[postpone]}; + {keep_state_and_data, [postpone]}; open(EventType, EventContent, Data) -> handle_event(EventType, EventContent, Data). handle_event({call,From}, code_length, #{code := Code}) -> - {keep_state_and_data,[{reply,From,length(Code)}]}. -enter(Tag, State, Data) -> - {Tag,State,Data,[{next_event,internal,enter}]}. + {keep_state_and_data, [{reply,From,length(Code)}]}. do_lock() -> io:format("Locked~n", []). @@ -1106,13 +1364,14 @@ code_change(_Vsn, State, Data, _Extra) -> </section> <section> + <marker id="Callback Mode: handle_event_function" /> <title>Callback Mode: handle_event_function</title> <p> This section describes what to change in the example to use one <c>handle_event/4</c> function. The previously used approach to first branch depending on event - does not work that well here because of the generated - entry actions, so this example first branches depending on state: + does not work that well here because of the state enter calls, + so this example first branches depending on state: </p> <code type="erl"><![CDATA[ ... @@ -1120,44 +1379,49 @@ code_change(_Vsn, State, Data, _Extra) -> ... callback_mode() -> - handle_event_function. + [handle_event_function,state_enter]. %% State: locked -handle_event(internal, enter, locked, #{code := Code} = Data) -> +handle_event( + enter, _OldState, locked, + #{code := Code} = Data) -> do_lock(), - {keep_state,Data#{remaining => Code}}; + {keep_state, Data#{remaining => Code}}; +handle_event( + timeout, _, locked, + #{code := Code, remaining := Remaining} = Data) -> + {keep_state, Data#{remaining := Code}}; handle_event( cast, {button,Digit}, locked, #{code := Code, remaining := Remaining} = Data) -> case Remaining of [Digit] -> % Complete - enter(next_state, open, Data); + {next_state, open, Data}; [Digit|Rest] -> % Incomplete - {keep_state,Data#{remaining := Rest}}; + {keep_state, Data#{remaining := Rest}, 30000}; [_|_] -> % Wrong - {keep_state,Data#{remaining := Code}} + {keep_state, Data#{remaining := Code}} end; %% %% State: open -handle_event(internal, enter, open, Data) -> - Tref = erlang:start_timer(10000, self(), lock), +handle_event(enter, _OldState, open, _Data) -> do_unlock(), - {keep_state,Data#{timer => Tref}}; -handle_event(info, {timeout,Tref,lock}, open, #{timer := Tref} = Data) -> - enter(next_state, locked, Data); + {keep_state_and_data, [{state_timeout,10000,lock}]}; +handle_event(state_timeout, lock, open, Data) -> + {next_state, locked, Data}; handle_event(cast, {button,_}, open, _) -> {keep_state_and_data,[postpone]}; %% %% Any state handle_event({call,From}, code_length, _State, #{code := Code}) -> - {keep_state_and_data,[{reply,From,length(Code)}]}. + {keep_state_and_data, [{reply,From,length(Code)}]}. ... ]]></code> </section> <p> Notice that postponing buttons from the <c>locked</c> state - to the <c>open</c> state feels like the wrong thing to do + to the <c>open</c> state feels like a strange thing to do for a code lock, but it at least illustrates event postponing. </p> </section> @@ -1165,6 +1429,7 @@ handle_event({call,From}, code_length, _State, #{code := Code}) -> <!-- =================================================================== --> <section> + <marker id="Filter the State" /> <title>Filter the State</title> <p> The example servers so far in this chapter @@ -1225,12 +1490,13 @@ format_status(Opt, [_PDict,State,Data]) -> <!-- =================================================================== --> <section> + <marker id="Complex State" /> <title>Complex State</title> <p> The callback mode <seealso marker="stdlib:gen_statem#type-callback_mode"><c>handle_event_function</c></seealso> enables using a non-atom state as described in section - <seealso marker="#callback_modes">Callback Modes</seealso>, + <seealso marker="#Callback Modes">Callback Modes</seealso>, for example, a complex state term like a tuple. </p> <p> @@ -1304,71 +1570,68 @@ set_lock_button(LockButton) -> init({Code,LockButton}) -> process_flag(trap_exit, true), - Data = #{code => Code, remaining => undefined, timer => undefined}, - enter(ok, {locked,LockButton}, Data, []). + Data = #{code => Code, remaining => undefined}, + {ok, {locked,LockButton}, Data}. callback_mode() -> - handle_event_function. + [handle_event_function,state_enter]. handle_event( {call,From}, {set_lock_button,NewLockButton}, {StateName,OldLockButton}, Data) -> - {next_state,{StateName,NewLockButton},Data, + {next_state, {StateName,NewLockButton}, Data, [{reply,From,OldLockButton}]}; handle_event( {call,From}, code_length, {_StateName,_LockButton}, #{code := Code}) -> {keep_state_and_data, - [{reply,From,length(Code)}]}; + [{reply,From,length(Code)}]}; +%% +%% State: locked handle_event( EventType, EventContent, {locked,LockButton}, #{code := Code, remaining := Remaining} = Data) -> - case {EventType,EventContent} of - {internal,enter} -> + case {EventType, EventContent} of + {enter, _OldState} -> do_lock(), - {keep_state,Data#{remaining := Code}}; - {{call,From},{button,Digit}} -> + {keep_state, Data#{remaining := Code}}; + {timeout, _} -> + {keep_state, Data#{remaining := Code}}; + {{call,From}, {button,Digit}} -> case Remaining of [Digit] -> % Complete - next_state( - {open,LockButton}, Data, - [{reply,From,ok}]); + {next_state, {open,LockButton}, Data, + [{reply,From,ok}]}; [Digit|Rest] -> % Incomplete - {keep_state,Data#{remaining := Rest}, + {keep_state, Data#{remaining := Rest, 30000}, [{reply,From,ok}]}; [_|_] -> % Wrong - {keep_state,Data#{remaining := Code}, + {keep_state, Data#{remaining := Code}, [{reply,From,ok}]} end end; +%% +%% State: open handle_event( EventType, EventContent, - {open,LockButton}, #{timer := Timer} = Data) -> - case {EventType,EventContent} of - {internal,enter} -> - Tref = erlang:start_timer(10000, self(), lock), + {open,LockButton}, Data) -> + case {EventType, EventContent} of + {enter, _OldState} -> do_unlock(), - {keep_state,Data#{timer := Tref}}; - {info,{timeout,Timer,lock}} -> - next_state({locked,LockButton}, Data, []); - {{call,From},{button,Digit}} -> + {keep_state_and_data, [{state_timeout,10000,lock}]}; + {state_timeout, lock} -> + {next_state, {locked,LockButton}, Data}; + {{call,From}, {button,Digit}} -> if Digit =:= LockButton -> - erlang:cancel_timer(Timer), - next_state( - {locked,LockButton}, Data, - [{reply,From,locked}]); + {next_state, {locked,LockButton}, Data, + [{reply,From,locked}]); true -> {keep_state_and_data, [postpone]} end end. -next_state(State, Data, Actions) -> - enter(next_state, State, Data, Actions). -enter(Tag, State, Data, Actions) -> - {Tag,State,Data,[{next_event,internal,enter}|Actions]}. - do_lock() -> io:format("Locked~n", []). do_unlock() -> @@ -1405,6 +1668,7 @@ format_status(Opt, [_PDict,State,Data]) -> <!-- =================================================================== --> <section> + <marker id="Hibernation" /> <title>Hibernation</title> <p> If you have many servers in one node @@ -1430,20 +1694,21 @@ format_status(Opt, [_PDict,State,Data]) -> </p> <code type="erl"><![CDATA[ ... +%% State: open handle_event( EventType, EventContent, - {open,LockButton}, #{timer := Timer} = Data) -> - case {EventType,EventContent} of - {internal,enter} -> - Tref = erlang:start_timer(10000, self(), lock), + {open,LockButton}, Data) -> + case {EventType, EventContent} of + {enter, _OldState} -> do_unlock(), - {keep_state,Data#{timer := Tref},[hibernate]}; + {keep_state_and_data, + [{state_timeout,10000,lock},hibernate]}; ... ]]></code> <p> - The - <seealso marker="stdlib:gen_statem#type-hibernate"><c>[hibernate]</c></seealso> - action list on the last line + The atom + <seealso marker="stdlib:gen_statem#type-hibernate"><c>hibernate</c></seealso> + in the action list on the last line when entering the <c>{open,_}</c> state is the only change. If any event arrives in the <c>{open,_},</c> state, we do not bother to rehibernate, so the server stays @@ -1458,6 +1723,10 @@ handle_event( <c>{open,_}</c> state, which would clutter the code. </p> <p> + Another not uncommon scenario is to use the event time-out + to triger hibernation after a certain time of inactivity. + </p> + <p> This server probably does not use heap memory worth hibernating for. To gain anything from hibernation, your server would diff --git a/system/doc/reference_manual/typespec.xml b/system/doc/reference_manual/typespec.xml index 1899efd5f3..ced584ed35 100644 --- a/system/doc/reference_manual/typespec.xml +++ b/system/doc/reference_manual/typespec.xml @@ -409,11 +409,13 @@ The initial values for fields are to be compatible with (that is, a member of) the corresponding types. This is checked by the compiler and results in a compilation error - if a violation is detected. For fields without initial values, - the singleton type <c>'undefined'</c> is added to all declared types. - In other words, the following two record declarations have identical - effects: + if a violation is detected. </p> + <note> + <p>Before Erlang/OTP 19, for fields without initial values, + the singleton type <c>'undefined'</c> was added to all declared types. + In other words, the following two record declarations had identical + effects:</p> <pre> -record(rec, {f1 = 42 :: integer(), f2 :: float(), @@ -423,9 +425,10 @@ f2 :: 'undefined' | float(), f3 :: 'undefined' | 'a' | 'b'}).</pre> <p> - For this reason, it is recommended that records contain initializers, - whenever possible. + This is no longer the case. If you require <c>'undefined'</c> in your record field + type, you must explicitly add it to the typespec, as in the 2nd example. </p> + </note> <p> Any record, containing type information or not, once defined, can be used as a type using the following syntax: |