summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml7
-rw-r--r--HOWTO/INSTALL.md4
-rw-r--r--OTP_VERSION2
-rw-r--r--bootstrap/lib/compiler/ebin/beam_bsm.beambin12632 -> 12600 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/compile.beambin39112 -> 39452 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/sys_core_fold.beambin52472 -> 52532 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/kernel.app2
-rw-r--r--bootstrap/lib/stdlib/ebin/gen_statem.beambin14076 -> 17420 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/ms_transform.beambin20460 -> 20488 bytes
-rw-r--r--configure.in7
-rw-r--r--erts/configure.in38
-rw-r--r--erts/doc/src/erl.xml14
-rw-r--r--erts/doc/src/erl_driver.xml10
-rw-r--r--erts/doc/src/erlang.xml20
-rw-r--r--erts/doc/src/notes.xml44
-rw-r--r--erts/emulator/Makefile.in7
-rw-r--r--erts/emulator/beam/atom.c4
-rw-r--r--erts/emulator/beam/atom.h4
-rw-r--r--erts/emulator/beam/beam_bif_load.c15
-rw-r--r--erts/emulator/beam/beam_bp.c2
-rw-r--r--erts/emulator/beam/beam_bp.h2
-rw-r--r--erts/emulator/beam/beam_debug.c4
-rw-r--r--erts/emulator/beam/beam_emu.c4
-rw-r--r--erts/emulator/beam/beam_load.h3
-rw-r--r--erts/emulator/beam/break.c142
-rw-r--r--erts/emulator/beam/dist.c14
-rw-r--r--erts/emulator/beam/erl_afit_alloc.c4
-rw-r--r--erts/emulator/beam/erl_alloc.c12
-rw-r--r--erts/emulator/beam/erl_alloc.h6
-rw-r--r--erts/emulator/beam/erl_alloc_util.c41
-rw-r--r--erts/emulator/beam/erl_alloc_util.h10
-rw-r--r--erts/emulator/beam/erl_ao_firstfit_alloc.c4
-rw-r--r--erts/emulator/beam/erl_bestfit_alloc.c4
-rw-r--r--erts/emulator/beam/erl_bif_info.c2
-rw-r--r--erts/emulator/beam/erl_bif_trace.c10
-rw-r--r--erts/emulator/beam/erl_db.c6
-rw-r--r--erts/emulator/beam/erl_db.h2
-rw-r--r--erts/emulator/beam/erl_db_hash.c4
-rw-r--r--erts/emulator/beam/erl_db_tree.c4
-rw-r--r--erts/emulator/beam/erl_db_util.h2
-rw-r--r--erts/emulator/beam/erl_debug.c10
-rw-r--r--erts/emulator/beam/erl_fun.c5
-rw-r--r--erts/emulator/beam/erl_fun.h4
-rw-r--r--erts/emulator/beam/erl_gc.c11
-rw-r--r--erts/emulator/beam/erl_goodfit_alloc.c4
-rw-r--r--erts/emulator/beam/erl_hl_timer.c4
-rw-r--r--erts/emulator/beam/erl_hl_timer.h2
-rw-r--r--erts/emulator/beam/erl_init.c16
-rw-r--r--erts/emulator/beam/erl_instrument.c74
-rw-r--r--erts/emulator/beam/erl_instrument.h4
-rw-r--r--erts/emulator/beam/erl_lock_count.c4
-rw-r--r--erts/emulator/beam/erl_nif.c39
-rw-r--r--erts/emulator/beam/erl_node_tables.c8
-rw-r--r--erts/emulator/beam/erl_node_tables.h6
-rw-r--r--erts/emulator/beam/erl_port.h2
-rw-r--r--erts/emulator/beam/erl_process.c72
-rw-r--r--erts/emulator/beam/erl_process.h16
-rw-r--r--erts/emulator/beam/erl_process_dict.c6
-rw-r--r--erts/emulator/beam/erl_process_dict.h6
-rw-r--r--erts/emulator/beam/erl_process_dump.c48
-rw-r--r--erts/emulator/beam/export.c2
-rw-r--r--erts/emulator/beam/export.h2
-rw-r--r--erts/emulator/beam/global.h17
-rw-r--r--erts/emulator/beam/hash.c2
-rw-r--r--erts/emulator/beam/hash.h4
-rw-r--r--erts/emulator/beam/index.c2
-rw-r--r--erts/emulator/beam/index.h2
-rw-r--r--erts/emulator/beam/io.c4
-rw-r--r--erts/emulator/beam/module.c2
-rw-r--r--erts/emulator/beam/module.h2
-rw-r--r--erts/emulator/beam/register.c2
-rw-r--r--erts/emulator/beam/register.h2
-rw-r--r--erts/emulator/beam/sys.h21
-rw-r--r--erts/emulator/beam/utils.c31
-rw-r--r--erts/emulator/hipe/hipe_bif0.c4
-rw-r--r--erts/emulator/hipe/hipe_mode_switch.h6
-rw-r--r--erts/emulator/sys/common/erl_mmap.c8
-rw-r--r--erts/emulator/sys/common/erl_mmap.h5
-rw-r--r--erts/emulator/sys/common/erl_mseg.c20
-rw-r--r--erts/emulator/sys/common/erl_mseg.h4
-rw-r--r--erts/emulator/sys/unix/sys.c8
-rw-r--r--erts/emulator/sys/win32/erl_win_sys.h2
-rw-r--r--erts/emulator/sys/win32/sys.c9
-rw-r--r--erts/emulator/test/bif_SUITE.erl29
-rw-r--r--erts/emulator/test/port_SUITE.erl25
-rw-r--r--erts/emulator/test/trace_SUITE.erl32
-rw-r--r--erts/etc/unix/etp-commands.in195
-rw-r--r--erts/include/internal/erl_printf.h7
-rw-r--r--erts/include/internal/erl_printf_format.h3
-rw-r--r--erts/lib_src/common/erl_printf.c37
-rw-r--r--erts/preloaded/ebin/erl_prim_loader.beambin55752 -> 55804 bytes
-rw-r--r--erts/preloaded/ebin/erlang.beambin105100 -> 105116 bytes
-rw-r--r--erts/preloaded/ebin/erts_internal.beambin11104 -> 11132 bytes
-rw-r--r--erts/preloaded/src/erl_prim_loader.erl23
-rw-r--r--erts/preloaded/src/erlang.erl3
-rw-r--r--erts/preloaded/src/erts_internal.erl3
-rw-r--r--erts/vsn.mk2
-rw-r--r--lib/common_test/doc/src/ct.xml86
-rw-r--r--lib/common_test/doc/src/write_test_chapter.xml44
-rw-r--r--lib/common_test/src/Makefile1
-rw-r--r--lib/common_test/src/ct.erl96
-rw-r--r--lib/common_test/src/ct_default_gl.erl83
-rw-r--r--lib/common_test/src/ct_framework.erl14
-rw-r--r--lib/common_test/src/ct_logs.erl91
-rw-r--r--lib/common_test/src/ct_run.erl15
-rw-r--r--lib/common_test/src/ct_util.erl18
-rw-r--r--lib/common_test/src/ct_util.hrl1
-rw-r--r--lib/common_test/src/test_server_gl.erl14
-rw-r--r--lib/common_test/src/test_server_io.erl6
-rw-r--r--lib/common_test/test/ct_log_SUITE.erl134
-rw-r--r--lib/compiler/src/compile.erl13
-rw-r--r--lib/compiler/src/sys_core_fold.erl10
-rw-r--r--lib/compiler/test/guard_SUITE.erl13
-rw-r--r--lib/compiler/test/warnings_SUITE.erl28
-rw-r--r--lib/dialyzer/RELEASE_NOTES2
-rw-r--r--lib/dialyzer/doc/manual.txt2
-rw-r--r--lib/dialyzer/doc/src/dialyzer.xml2
-rw-r--r--lib/dialyzer/doc/src/notes.xml4
-rw-r--r--lib/dialyzer/src/dialyzer.erl16
-rw-r--r--lib/dialyzer/src/dialyzer_analysis_callgraph.erl40
-rw-r--r--lib/dialyzer/src/dialyzer_cl_parse.erl4
-rw-r--r--lib/dialyzer/src/dialyzer_contracts.erl35
-rw-r--r--lib/dialyzer/src/dialyzer_dataflow.erl57
-rw-r--r--lib/dialyzer/src/dialyzer_gui_wx.erl4
-rw-r--r--lib/dialyzer/src/dialyzer_utils.erl21
-rw-r--r--lib/dialyzer/test/map_SUITE_data/results/map_in_guard24
-rw-r--r--lib/dialyzer/test/map_SUITE_data/results/opaque_key8
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/array4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/dict18
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/ets6
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/my_queue2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/opaque2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/para4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/queue6
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/rec4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/simple46
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/timer4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/union8
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/wings8
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/dict/dict_use.erl2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/para/para3.erl2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/recrec/erl_types.erl2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_api.erl2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/is_rec.erl6
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_api.erl8
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_api.erl26
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/timer/timer_use.erl4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/wings/wings_util.erl4
-rw-r--r--lib/dialyzer/test/plt_SUITE.erl30
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/guards2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/ms.erl8
-rw-r--r--lib/edoc/include/edoc_doclet.hrl2
-rw-r--r--lib/edoc/src/edoc.erl2
-rw-r--r--lib/edoc/src/edoc.hrl2
-rw-r--r--lib/edoc/src/edoc_data.erl2
-rw-r--r--lib/edoc/src/edoc_doclet.erl2
-rw-r--r--lib/edoc/src/edoc_extract.erl2
-rw-r--r--lib/edoc/src/edoc_layout.erl2
-rw-r--r--lib/edoc/src/edoc_lib.erl2
-rw-r--r--lib/edoc/src/edoc_macros.erl2
-rw-r--r--lib/edoc/src/edoc_refs.erl2
-rw-r--r--lib/edoc/src/edoc_report.erl2
-rw-r--r--lib/edoc/src/edoc_run.erl2
-rw-r--r--lib/edoc/src/edoc_tags.erl2
-rw-r--r--lib/edoc/src/edoc_types.erl2
-rw-r--r--lib/edoc/src/edoc_types.hrl2
-rw-r--r--lib/edoc/src/edoc_wiki.erl2
-rw-r--r--lib/edoc/src/otpsgml_layout.erl2
-rw-r--r--lib/eldap/doc/src/eldap.xml22
-rw-r--r--lib/eldap/vsn.mk2
-rw-r--r--lib/erl_interface/doc/src/book.xml11
-rw-r--r--lib/erl_interface/doc/src/ei.xml1181
-rw-r--r--lib/erl_interface/doc/src/ei_connect.xml1057
-rw-r--r--lib/erl_interface/doc/src/ei_users_guide.xml715
-rw-r--r--lib/erl_interface/doc/src/erl_call.xml217
-rw-r--r--lib/erl_interface/doc/src/erl_connect.xml803
-rw-r--r--lib/erl_interface/doc/src/erl_error.xml94
-rw-r--r--lib/erl_interface/doc/src/erl_eterm.xml795
-rw-r--r--lib/erl_interface/doc/src/erl_format.xml102
-rw-r--r--lib/erl_interface/doc/src/erl_global.xml132
-rw-r--r--lib/erl_interface/doc/src/erl_interface.xml209
-rw-r--r--lib/erl_interface/doc/src/erl_malloc.xml181
-rw-r--r--lib/erl_interface/doc/src/erl_marshal.xml287
-rw-r--r--lib/erl_interface/doc/src/fascicules.xml24
-rw-r--r--lib/erl_interface/doc/src/part.xml2
-rw-r--r--lib/erl_interface/doc/src/part_erl_interface.xml5
-rw-r--r--lib/erl_interface/doc/src/ref_man.xml18
-rw-r--r--lib/erl_interface/doc/src/ref_man_ei.xml13
-rw-r--r--lib/erl_interface/doc/src/ref_man_erl_interface.xml5
-rw-r--r--lib/erl_interface/doc/src/registry.xml869
-rw-r--r--lib/erl_interface/src/connect/ei_connect.c4
-rw-r--r--lib/eunit/include/eunit.hrl2
-rw-r--r--lib/eunit/src/eunit.erl2
-rw-r--r--lib/eunit/src/eunit_autoexport.erl2
-rw-r--r--lib/eunit/src/eunit_data.erl2
-rw-r--r--lib/eunit/src/eunit_lib.erl2
-rw-r--r--lib/eunit/src/eunit_proc.erl2
-rw-r--r--lib/eunit/src/eunit_serial.erl2
-rw-r--r--lib/eunit/src/eunit_server.erl2
-rw-r--r--lib/eunit/src/eunit_striptests.erl2
-rw-r--r--lib/eunit/src/eunit_surefire.erl2
-rw-r--r--lib/eunit/src/eunit_test.erl2
-rw-r--r--lib/eunit/src/eunit_tests.erl2
-rw-r--r--lib/eunit/src/eunit_tty.erl2
-rw-r--r--lib/hipe/cerl/erl_types.erl2
-rw-r--r--lib/hipe/icode/hipe_beam_to_icode.erl28
-rw-r--r--lib/hipe/icode/hipe_icode_call_elim.erl3
-rw-r--r--lib/hipe/icode/hipe_icode_primops.erl8
-rw-r--r--lib/hipe/llvm/hipe_llvm_main.erl14
-rw-r--r--lib/hipe/llvm/hipe_rtl_to_llvm.erl103
-rw-r--r--lib/hipe/main/hipe.erl89
-rw-r--r--lib/hipe/main/hipe.hrl.src10
-rw-r--r--lib/hipe/rtl/hipe_rtl_binary.erl2
-rw-r--r--lib/hipe/rtl/hipe_rtl_binary_match.erl37
-rw-r--r--lib/hipe/test/bs_SUITE_data/bs_pmatch_bugs.erl48
-rw-r--r--lib/hipe/test/maps_SUITE_data/maps_redundant_branch_is_key.erl14
-rw-r--r--lib/inets/doc/src/http_uri.xml2
-rw-r--r--lib/inets/src/ftp/ftp.erl89
-rw-r--r--lib/inets/src/ftp/ftp_progress.erl26
-rw-r--r--lib/inets/src/ftp/ftp_response.erl18
-rw-r--r--lib/inets/src/http_client/httpc_handler.erl6
-rw-r--r--lib/inets/src/http_client/httpc_request.erl6
-rw-r--r--lib/inets/test/ftp_format_SUITE.erl13
-rw-r--r--lib/kernel/doc/src/file.xml8
-rw-r--r--lib/kernel/doc/src/gen_tcp.xml6
-rw-r--r--lib/kernel/doc/src/gen_udp.xml6
-rw-r--r--lib/kernel/doc/src/inet.xml5
-rw-r--r--lib/kernel/doc/src/rpc.xml16
-rw-r--r--lib/kernel/src/gen_sctp.erl2
-rw-r--r--lib/kernel/src/gen_tcp.erl2
-rw-r--r--lib/kernel/src/gen_udp.erl2
-rw-r--r--lib/kernel/src/kernel.app.src2
-rw-r--r--lib/megaco/test/megaco_app_test.erl308
-rw-r--r--lib/megaco/test/megaco_appup_test.erl498
-rw-r--r--lib/megaco/vsn.mk2
-rw-r--r--lib/mnesia/src/mnesia.erl7
-rw-r--r--lib/mnesia/src/mnesia_controller.erl7
-rw-r--r--lib/mnesia/src/mnesia_loader.erl17
-rw-r--r--lib/mnesia/src/mnesia_tm.erl3
-rw-r--r--lib/mnesia/test/mnesia_test_lib.erl1
-rwxr-xr-xlib/observer/priv/bin/cdv2
-rw-r--r--lib/observer/priv/bin/cdv.bat2
-rw-r--r--lib/observer/priv/crashdump_viewer.tool2
-rw-r--r--lib/observer/priv/crashdump_viewer/collapsd.gifbin141 -> 0 bytes
-rw-r--r--lib/observer/priv/crashdump_viewer/exploded.gifbin143 -> 0 bytes
-rw-r--r--lib/observer/src/Makefile10
-rw-r--r--lib/observer/src/cdv_ets_cb.erl7
-rw-r--r--lib/observer/src/cdv_mem_cb.erl4
-rw-r--r--lib/observer/src/crashdump_viewer.erl73
-rw-r--r--lib/observer/test/crashdump_viewer_SUITE.erl10
-rw-r--r--lib/odbc/configure.in24
-rw-r--r--lib/public_key/doc/src/public_key.xml30
-rw-r--r--lib/public_key/src/public_key.erl39
-rw-r--r--lib/public_key/test/public_key.cover2
-rw-r--r--lib/public_key/test/public_key_SUITE.erl82
-rw-r--r--lib/public_key/vsn.mk2
-rw-r--r--lib/ssh/doc/src/introduction.xml2
-rw-r--r--lib/ssh/doc/src/notes.xml15
-rw-r--r--lib/ssh/doc/src/ssh.xml14
-rw-r--r--lib/ssh/doc/src/ssh_protocol.xml2
-rw-r--r--lib/ssh/src/Makefile2
-rw-r--r--lib/ssh/src/ssh.erl9
-rw-r--r--lib/ssh/src/ssh_channel.erl2
-rw-r--r--lib/ssh/src/ssh_connection.erl3
-rw-r--r--lib/ssh/src/ssh_connection_handler.erl30
-rw-r--r--lib/ssh/src/ssh_dbg.erl10
-rw-r--r--lib/ssh/src/ssh_dbg.hrl27
-rw-r--r--lib/ssh/src/ssh_transport.erl16
-rw-r--r--lib/ssh/test/ssh.cover1
-rw-r--r--lib/ssh/test/ssh_basic_SUITE.erl33
-rw-r--r--lib/ssh/test/ssh_connection_SUITE.erl140
-rw-r--r--lib/ssh/test/ssh_options_SUITE.erl126
-rw-r--r--lib/ssh/test/ssh_renegotiate_SUITE.erl40
-rw-r--r--lib/ssh/test/ssh_sftp_SUITE.erl20
-rw-r--r--lib/ssh/test/ssh_test_lib.erl72
-rw-r--r--lib/ssh/test/ssh_to_openssh_SUITE.erl142
-rw-r--r--lib/ssh/vsn.mk2
-rw-r--r--lib/ssl/doc/src/ssl.xml31
-rw-r--r--lib/ssl/doc/src/ssl_distribution.xml2
-rw-r--r--lib/ssl/src/Makefile5
-rw-r--r--lib/ssl/src/dtls_connection.erl604
-rw-r--r--lib/ssl/src/dtls_connection.hrl20
-rw-r--r--lib/ssl/src/dtls_connection_sup.erl2
-rw-r--r--lib/ssl/src/dtls_handshake.erl555
-rw-r--r--lib/ssl/src/dtls_handshake.hrl15
-rw-r--r--lib/ssl/src/dtls_record.erl340
-rw-r--r--lib/ssl/src/dtls_record.hrl9
-rw-r--r--lib/ssl/src/dtls_socket.erl148
-rw-r--r--lib/ssl/src/dtls_udp_listener.erl205
-rw-r--r--lib/ssl/src/dtls_udp_sup.erl62
-rw-r--r--lib/ssl/src/dtls_v1.erl12
-rw-r--r--lib/ssl/src/ssl.app.src5
-rw-r--r--lib/ssl/src/ssl.erl237
-rw-r--r--lib/ssl/src/ssl_alert.erl11
-rw-r--r--lib/ssl/src/ssl_cipher.erl29
-rw-r--r--lib/ssl/src/ssl_connection.erl96
-rw-r--r--lib/ssl/src/ssl_connection.hrl17
-rw-r--r--lib/ssl/src/ssl_dist_sup.erl4
-rw-r--r--lib/ssl/src/ssl_handshake.erl45
-rw-r--r--lib/ssl/src/ssl_internal.hrl5
-rw-r--r--lib/ssl/src/ssl_listen_tracker_sup.erl4
-rw-r--r--lib/ssl/src/ssl_record.erl140
-rw-r--r--lib/ssl/src/ssl_sup.erl43
-rw-r--r--lib/ssl/src/tls_connection.erl41
-rw-r--r--lib/ssl/src/tls_handshake.erl6
-rw-r--r--lib/ssl/src/tls_record.erl380
-rw-r--r--lib/ssl/src/tls_socket.erl (renamed from lib/ssl/src/ssl_socket.erl)93
-rw-r--r--lib/ssl/src/tls_v1.erl33
-rw-r--r--lib/ssl/test/ssl_ECC_SUITE.erl282
-rw-r--r--lib/ssl/test/ssl_basic_SUITE.erl50
-rw-r--r--lib/ssl/test/ssl_certificate_verify_SUITE.erl3
-rw-r--r--lib/ssl/test/ssl_packet_SUITE.erl6
-rw-r--r--lib/ssl/test/ssl_test_lib.erl63
-rw-r--r--lib/ssl/test/ssl_to_openssl_SUITE.erl2
-rw-r--r--lib/ssl/vsn.mk2
-rw-r--r--lib/stdlib/doc/src/gen_statem.xml535
-rw-r--r--lib/stdlib/doc/src/maps.xml2
-rw-r--r--lib/stdlib/doc/src/shell_default.xml2
-rw-r--r--lib/stdlib/src/erl_parse.yrl31
-rw-r--r--lib/stdlib/src/gen_statem.erl1207
-rw-r--r--lib/stdlib/src/ms_transform.erl2
-rw-r--r--lib/stdlib/test/base64_SUITE.erl41
-rw-r--r--lib/stdlib/test/ets_SUITE.erl282
-rw-r--r--lib/stdlib/test/gen_statem_SUITE.erl204
-rw-r--r--lib/stdlib/test/ms_transform_SUITE.erl2
-rw-r--r--lib/stdlib/test/rand_SUITE.erl26
-rw-r--r--lib/stdlib/test/tar_SUITE.erl26
-rw-r--r--lib/syntax_tools/src/epp_dodger.erl2
-rw-r--r--lib/syntax_tools/src/erl_comment_scan.erl2
-rw-r--r--lib/syntax_tools/src/erl_prettypr.erl2
-rw-r--r--lib/syntax_tools/src/erl_recomment.erl2
-rw-r--r--lib/syntax_tools/src/erl_syntax.erl2
-rw-r--r--lib/syntax_tools/src/erl_syntax_lib.erl2
-rw-r--r--lib/syntax_tools/src/erl_tidy.erl2
-rw-r--r--lib/syntax_tools/src/igor.erl2
-rw-r--r--lib/syntax_tools/src/prettypr.erl2
-rw-r--r--lib/tools/emacs/Makefile1
-rw-r--r--lib/tools/emacs/erlang-edoc.el2
-rw-r--r--lib/tools/emacs/erlang-skels.el36
-rw-r--r--lib/tools/emacs/erlang-start.el14
-rw-r--r--lib/tools/emacs/erlang.el3517
-rw-r--r--lib/tools/emacs/erldoc.el508
-rw-r--r--lib/tools/emacs/test.erl.indented810
-rw-r--r--lib/tools/emacs/test.erl.orig210
-rw-r--r--lib/tools/src/fprof.erl6
-rw-r--r--lib/wx/api_gen/gl_gen.erl33
-rw-r--r--lib/wx/api_gen/gl_gen_c.erl31
-rw-r--r--lib/wx/api_gen/gl_gen_erl.erl55
-rw-r--r--lib/wx/api_gen/glapi.conf6
-rw-r--r--lib/wx/api_gen/wx_extra/added_func.h11
-rw-r--r--lib/wx/api_gen/wx_gen_cpp.erl3
-rw-r--r--lib/wx/api_gen/wxapi.conf3
-rw-r--r--lib/wx/c_src/gen/gl_funcs.cpp1052
-rw-r--r--lib/wx/c_src/gen/wxe_events.cpp2
-rw-r--r--lib/wx/c_src/gen/wxe_funcs.cpp9
-rw-r--r--lib/wx/c_src/gen/wxe_macros.h6359
-rw-r--r--lib/wx/include/wx.hrl4
-rw-r--r--lib/wx/src/gen/gl.erl1223
-rw-r--r--lib/wx/src/gen/glu.erl4
-rw-r--r--lib/wx/src/gen/wxAuiNotebook.erl6
-rw-r--r--lib/wx/src/gen/wxBitmapButton.erl6
-rw-r--r--lib/wx/src/gen/wxButton.erl6
-rw-r--r--lib/wx/src/gen/wxCalendarCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxCheckBox.erl6
-rw-r--r--lib/wx/src/gen/wxCheckListBox.erl38
-rw-r--r--lib/wx/src/gen/wxChoice.erl63
-rw-r--r--lib/wx/src/gen/wxChoicebook.erl6
-rw-r--r--lib/wx/src/gen/wxColourDialog.erl6
-rw-r--r--lib/wx/src/gen/wxColourPickerCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxComboBox.erl66
-rw-r--r--lib/wx/src/gen/wxControl.erl6
-rw-r--r--lib/wx/src/gen/wxControlWithItems.erl6
-rw-r--r--lib/wx/src/gen/wxDatePickerCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxDialog.erl6
-rw-r--r--lib/wx/src/gen/wxDirDialog.erl6
-rw-r--r--lib/wx/src/gen/wxDirPickerCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxFileDialog.erl6
-rw-r--r--lib/wx/src/gen/wxFilePickerCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxFindReplaceDialog.erl6
-rw-r--r--lib/wx/src/gen/wxFontDialog.erl6
-rw-r--r--lib/wx/src/gen/wxFontPickerCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxFrame.erl6
-rw-r--r--lib/wx/src/gen/wxGLCanvas.erl6
-rw-r--r--lib/wx/src/gen/wxGauge.erl6
-rw-r--r--lib/wx/src/gen/wxGenericDirCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxGrid.erl58
-rw-r--r--lib/wx/src/gen/wxHtmlWindow.erl58
-rw-r--r--lib/wx/src/gen/wxListBox.erl63
-rw-r--r--lib/wx/src/gen/wxListCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxListView.erl6
-rw-r--r--lib/wx/src/gen/wxListbook.erl6
-rw-r--r--lib/wx/src/gen/wxMDIChildFrame.erl74
-rw-r--r--lib/wx/src/gen/wxMDIClientWindow.erl6
-rw-r--r--lib/wx/src/gen/wxMDIParentFrame.erl39
-rw-r--r--lib/wx/src/gen/wxMenuBar.erl37
-rw-r--r--lib/wx/src/gen/wxMessageDialog.erl6
-rw-r--r--lib/wx/src/gen/wxMiniFrame.erl39
-rw-r--r--lib/wx/src/gen/wxMultiChoiceDialog.erl6
-rw-r--r--lib/wx/src/gen/wxNotebook.erl6
-rw-r--r--lib/wx/src/gen/wxPanel.erl6
-rw-r--r--lib/wx/src/gen/wxPasswordEntryDialog.erl6
-rw-r--r--lib/wx/src/gen/wxPickerBase.erl6
-rw-r--r--lib/wx/src/gen/wxPopupTransientWindow.erl6
-rw-r--r--lib/wx/src/gen/wxPopupWindow.erl6
-rw-r--r--lib/wx/src/gen/wxPreviewCanvas.erl58
-rw-r--r--lib/wx/src/gen/wxPreviewControlBar.erl6
-rw-r--r--lib/wx/src/gen/wxPreviewFrame.erl39
-rw-r--r--lib/wx/src/gen/wxPrintDialog.erl6
-rw-r--r--lib/wx/src/gen/wxProgressDialog.erl6
-rw-r--r--lib/wx/src/gen/wxRadioBox.erl42
-rw-r--r--lib/wx/src/gen/wxRadioButton.erl6
-rw-r--r--lib/wx/src/gen/wxSashLayoutWindow.erl6
-rw-r--r--lib/wx/src/gen/wxSashWindow.erl6
-rw-r--r--lib/wx/src/gen/wxScrollBar.erl6
-rw-r--r--lib/wx/src/gen/wxScrolledWindow.erl6
-rw-r--r--lib/wx/src/gen/wxSingleChoiceDialog.erl6
-rw-r--r--lib/wx/src/gen/wxSlider.erl6
-rw-r--r--lib/wx/src/gen/wxSpinButton.erl6
-rw-r--r--lib/wx/src/gen/wxSpinCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxSplashScreen.erl39
-rw-r--r--lib/wx/src/gen/wxSplitterWindow.erl6
-rw-r--r--lib/wx/src/gen/wxStaticBitmap.erl6
-rw-r--r--lib/wx/src/gen/wxStaticBox.erl6
-rw-r--r--lib/wx/src/gen/wxStaticLine.erl6
-rw-r--r--lib/wx/src/gen/wxStaticText.erl6
-rw-r--r--lib/wx/src/gen/wxStatusBar.erl6
-rw-r--r--lib/wx/src/gen/wxStyledTextCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxTextCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxTextEntryDialog.erl6
-rw-r--r--lib/wx/src/gen/wxToggleButton.erl6
-rw-r--r--lib/wx/src/gen/wxToolBar.erl6
-rw-r--r--lib/wx/src/gen/wxToolbook.erl6
-rw-r--r--lib/wx/src/gen/wxTopLevelWindow.erl6
-rw-r--r--lib/wx/src/gen/wxTreeCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxTreebook.erl6
-rw-r--r--lib/wx/src/gen/wxWindow.erl49
-rw-r--r--lib/wx/src/gen/wxe_debug.hrl6359
-rw-r--r--lib/wx/src/gen/wxe_funcs.hrl6359
-rw-r--r--lib/wx/test/wx_opengl_SUITE.erl2
-rw-r--r--otp_versions.table2
-rw-r--r--system/doc/design_principles/applications.xml160
-rw-r--r--system/doc/design_principles/code_lock.diabin2932 -> 2945 bytes
-rw-r--r--system/doc/design_principles/code_lock.pngbin59160 -> 59827 bytes
-rw-r--r--system/doc/design_principles/code_lock_2.diabin2621 -> 2956 bytes
-rw-r--r--system/doc/design_principles/code_lock_2.pngbin48927 -> 55553 bytes
-rw-r--r--system/doc/design_principles/statem.xml811
446 files changed, 25430 insertions, 20891 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.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/OTP_VERSION b/OTP_VERSION
index 3af035ac64..87c0f53ffe 100644
--- a/OTP_VERSION
+++ b/OTP_VERSION
@@ -1 +1 @@
-19.1.4
+19.1.6
diff --git a/bootstrap/lib/compiler/ebin/beam_bsm.beam b/bootstrap/lib/compiler/ebin/beam_bsm.beam
index 48e8f80f79..fbea0b152b 100644
--- a/bootstrap/lib/compiler/ebin/beam_bsm.beam
+++ b/bootstrap/lib/compiler/ebin/beam_bsm.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/compile.beam b/bootstrap/lib/compiler/ebin/compile.beam
index 044ed03d93..163d9b8432 100644
--- a/bootstrap/lib/compiler/ebin/compile.beam
+++ b/bootstrap/lib/compiler/ebin/compile.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/sys_core_fold.beam b/bootstrap/lib/compiler/ebin/sys_core_fold.beam
index 3ba8d92655..f3bbc3401c 100644
--- a/bootstrap/lib/compiler/ebin/sys_core_fold.beam
+++ b/bootstrap/lib/compiler/ebin/sys_core_fold.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/kernel.app b/bootstrap/lib/kernel/ebin/kernel.app
index 569e0fb5b1..1c82da1c01 100644
--- a/bootstrap/lib/kernel/ebin/kernel.app
+++ b/bootstrap/lib/kernel/ebin/kernel.app
@@ -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/stdlib/ebin/gen_statem.beam b/bootstrap/lib/stdlib/ebin/gen_statem.beam
index e4f06a8278..c52a159368 100644
--- a/bootstrap/lib/stdlib/ebin/gen_statem.beam
+++ b/bootstrap/lib/stdlib/ebin/gen_statem.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/ms_transform.beam b/bootstrap/lib/stdlib/ebin/ms_transform.beam
index 2c0eb8a742..c72dd5c717 100644
--- a/bootstrap/lib/stdlib/ebin/ms_transform.beam
+++ b/bootstrap/lib/stdlib/ebin/ms_transform.beam
Binary files differ
diff --git a/configure.in b/configure.in
index 6db83124be..a149acbb55 100644
--- a/configure.in
+++ b/configure.in
@@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script.
dnl %CopyrightBegin%
dnl
-dnl Copyright Ericsson AB 1998-2014. All Rights Reserved.
+dnl Copyright Ericsson AB 1998-2016. All Rights Reserved.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
@@ -228,7 +228,10 @@ AS_HELP_STRING([--enable-kernel-poll], [enable kernel poll support])
AS_HELP_STRING([--disable-kernel-poll], [disable kernel poll support]))
AC_ARG_ENABLE(sctp,
-AS_HELP_STRING([--enable-sctp], [enable sctp support])
+AS_HELP_STRING([--enable-sctp], [enable sctp support (default)
+to on demand load the SCTP library in runtime])
+AS_HELP_STRING([--enable-sctp=lib], [enable sctp support
+to link against the SCTP library])
AS_HELP_STRING([--disable-sctp], [disable sctp support]))
AC_ARG_ENABLE(hipe,
diff --git a/erts/configure.in b/erts/configure.in
index 69b9af3c8c..ad9a66126f 100644
--- a/erts/configure.in
+++ b/erts/configure.in
@@ -196,12 +196,18 @@ AS_HELP_STRING([--disable-kernel-poll], [disable kernel poll support]),
AC_ARG_ENABLE(sctp,
-AS_HELP_STRING([--enable-sctp], [enable sctp support (default)])
+AS_HELP_STRING([--enable-sctp], [enable sctp support (default)
+to on demand load the SCTP library in runtime if needed])
+AS_HELP_STRING([--enable-sctp=lib], [enable sctp support
+to link against the SCTP library])
AS_HELP_STRING([--disable-sctp], [disable sctp support]),
-[ case "$enableval" in
- no) enable_sctp=no ;;
- *) enable_sctp=yes ;;
- esac ], enable_sctp=unknown)
+[ case "x$enableval" in
+ xno|xyes|xlib|x)
+ ;;
+ x*)
+ AC_MSG_ERROR("invalid value --enable-sctp=$enableval")
+ ;;
+ esac ])
AC_ARG_ENABLE(hipe,
AS_HELP_STRING([--enable-hipe], [enable hipe support])
@@ -1726,8 +1732,9 @@ if test "x$enable_sctp" != "xno" ; then
fi
if test x"$ac_cv_header_netinet_sctp_h" = x"yes"; then
- AC_CHECK_LIB(sctp, sctp_bindx)
- AC_CHECK_FUNCS([sctp_peeloff sctp_getladdrs sctp_freeladdrs sctp_getpaddrs sctp_freepaddrs])
+ AS_IF([test "x$enable_sctp" = "xlib"],
+ AC_CHECK_LIB(sctp, sctp_bindx))
+ AC_CHECK_FUNCS([sctp_bindx sctp_peeloff sctp_getladdrs sctp_freeladdrs sctp_getpaddrs sctp_freepaddrs])
AC_CHECK_DECLS([SCTP_UNORDERED, SCTP_ADDR_OVER, SCTP_ABORT,
SCTP_EOF, SCTP_SENDALL, SCTP_ADDR_CONFIRMED,
SCTP_DELAYED_ACK_TIME,
@@ -2787,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*)
diff --git a/erts/doc/src/erl.xml b/erts/doc/src/erl.xml
index eb1d24cf12..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
@@ -1535,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 b0d25389fd..9646953518 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -9529,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>
@@ -9660,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">
@@ -9672,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
@@ -9739,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
@@ -9809,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/notes.xml b/erts/doc/src/notes.xml
index 412675fd2b..dd260f2d1f 100644
--- a/erts/doc/src/notes.xml
+++ b/erts/doc/src/notes.xml
@@ -32,6 +32,50 @@
<p>This document describes the changes made to the ERTS application.</p>
+<section><title>Erts 8.1.1</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ The emulator got a dynamic library dependency towards
+ libsctp, which on Linux was not intended since the
+ emulator there loads and resolves the needed sctp
+ functions in runtime. This has been fixed and a configure
+ switch --enable-sctp=lib has been added for those who
+ want such a library dependency.</p>
+ <p>
+ Own Id: OTP-13956 Aux Id: ERL-262, ERL-133 </p>
+ </item>
+ <item>
+ <p>
+ Fix SIGUSR1 crashdump generation</p>
+ <p>
+ Do not generate a core when a crashdump is asked for.</p>
+ <p>
+ Own Id: OTP-13997</p>
+ </item>
+ <item>
+ <p>The new functions in <c>code</c> that allows loading
+ of many modules at once had a performance problem. While
+ executing a helper function in the <c>erl_prim_loader</c>
+ process, garbage messages were produced. The garbages
+ messages were ignored and ultimately discarded, but there
+ would be a negative impact on performance and memory
+ usage. The number of garbage message depended on both the
+ number of modules to be loaded and the length of the code
+ path.</p>
+ <p>The functions affected of this problem were:
+ <c>atomic_load/1</c>, <c>ensure_modules_loaded/1</c>, and
+ <c>prepare_loading/1</c>.</p>
+ <p>
+ Own Id: OTP-14009</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Erts 8.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
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 5969197168..ea1323d651 100644
--- a/erts/emulator/beam/beam_bif_load.c
+++ b/erts/emulator/beam/beam_bif_load.c
@@ -1086,6 +1086,11 @@ check_process_code(Process* rp, Module* modp, Uint flags, int *redsp, int fcalls
|| ErtsInArea(rp->cp, mod_start, mod_size)) {
return am_true;
}
+
+ *redsp += 1;
+
+ if (erts_check_nif_export_in_area(rp, mod_start, mod_size))
+ return am_true;
*redsp += (STACK_START(rp) - rp->stop) / 32;
@@ -1161,6 +1166,12 @@ check_process_code(Process* rp, Module* modp, Uint flags, int *redsp, int fcalls
|| ErtsInArea(rp->cp, mod_start, mod_size)) {
return am_true;
}
+
+ *redsp += 1;
+
+ if (erts_check_nif_export_in_area(rp, mod_start, mod_size))
+ return am_true;
+
/*
* Check all continuation pointers stored on the stack.
@@ -1623,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_bp.c b/erts/emulator/beam/beam_bp.c
index 920c8b1ed0..bbb2e4f34f 100644
--- a/erts/emulator/beam/beam_bp.c
+++ b/erts/emulator/beam/beam_bp.c
@@ -1517,7 +1517,7 @@ set_function_break(BeamInstr *pc, Binary *match_spec, Uint break_flags,
ASSERT((bp->flags & ERTS_BPF_TIME_TRACE) == 0);
bdt = Alloc(sizeof(BpDataTime));
erts_refc_init(&bdt->refc, 1);
- bdt->n = erts_no_schedulers;
+ bdt->n = erts_no_total_schedulers;
bdt->hash = Alloc(sizeof(bp_time_hash_t)*(bdt->n));
for (i = 0; i < bdt->n; i++) {
bp_hash_init(&(bdt->hash[i]), 32);
diff --git a/erts/emulator/beam/beam_bp.h b/erts/emulator/beam/beam_bp.h
index 541af77211..7206ef471a 100644
--- a/erts/emulator/beam/beam_bp.h
+++ b/erts/emulator/beam/beam_bp.h
@@ -80,7 +80,7 @@ typedef struct generic_bp {
#define ERTS_BP_CALL_TIME_SCHEDULE_EXITING (2)
#ifdef ERTS_SMP
-#define bp_sched2ix_proc(p) (erts_proc_sched_data(p)->no - 1)
+#define bp_sched2ix_proc(p) (erts_proc_sched_data(p)->thr_id - 1)
#else
#define bp_sched2ix_proc(p) (0)
#endif
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..59a9ea1417 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -5325,7 +5325,7 @@ void erts_dirty_process_main(ErtsSchedulerData *esdp)
I = c_p->i;
- ASSERT(BeamOp(op_call_nif) == (BeamInstr *) *I);
+ ASSERT(em_call_nif == (BeamInstr *) *I);
/*
* Set fcalls even though we ignore it, so we don't
@@ -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..dfbe1ced47 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..230ca6ccbb 100644
--- a/erts/emulator/beam/erl_alloc_util.c
+++ b/erts/emulator/beam/erl_alloc_util.c
@@ -4153,9 +4153,9 @@ destroy_carrier(Allctr_t *allctr, Block_t *blk, Carrier_t **busy_pcrr_pp)
ASSERT(IS_LAST_BLK(blk));
#ifdef ERTS_ALLOC_UTIL_HARD_DEBUG
- (*allctr->link_free_block)(allctr, blk, 0);
+ (*allctr->link_free_block)(allctr, blk);
HARD_CHECK_BLK_CARRIER(allctr, blk);
- (*allctr->unlink_free_block)(allctr, blk, 0);
+ (*allctr->unlink_free_block)(allctr, blk);
#endif
}
#endif
@@ -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)
@@ -6440,11 +6440,6 @@ check_blk_carrier(Allctr_t *allctr, Block_t *iblk)
ASSERT(SBC2BLK(allctr, sbc) == iblk);
ASSERT(CARRIER_SZ(sbc) - SBC_HEADER_SIZE >= SBC_BLK_SZ(iblk));
-#if HAVE_ERTS_MSEG
- if (IS_MSEG_CARRIER(sbc)) {
- ASSERT(CARRIER_SZ(sbc) % ERTS_SACRR_UNIT_SZ == 0);
- }
-#endif
crr = sbc;
cl = &allctr->sbc_list;
}
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_gc.c b/erts/emulator/beam/erl_gc.c
index 6f641a1ea7..af799d09da 100644
--- a/erts/emulator/beam/erl_gc.c
+++ b/erts/emulator/beam/erl_gc.c
@@ -2325,6 +2325,11 @@ move_msgq_to_heap(Process *p)
static Uint
setup_rootset(Process *p, Eterm *objv, int nobj, Rootset *rootset)
{
+ /*
+ * NOTE!
+ * Remember to update offset_rootset() when changing
+ * this function.
+ */
Roots* roots;
Uint n;
@@ -2969,6 +2974,12 @@ offset_one_rootset(Process *p, Sint offs, char* area, Uint area_size,
offset_heap_ptr(objv, nobj, offs, area, area_size);
}
offset_off_heap(p, offs, area, area_size);
+ if (ERTS_PROC_GET_NIF_TRAP_EXPORT(p)) {
+ Eterm* argv;
+ int argc;
+ if (erts_setup_nif_gc(p, &argv, &argc))
+ offset_heap_ptr(argv, argc, offs, area, area_size);
+ }
}
static void
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..2fd97208cc 100644
--- a/erts/emulator/beam/erl_init.c
+++ b/erts/emulator/beam/erl_init.c
@@ -795,9 +795,6 @@ early_init(int *argc, char **argv) /*
erts_thr_progress_pre_init();
#endif
-#ifdef ERTS_ENABLE_LOCK_CHECK
- erts_lc_init();
-#endif
#ifdef ERTS_SMP
erts_smp_atomic32_init_nob(&erts_writing_erl_crash_dump, 0L);
erts_tsd_key_create(&erts_is_crash_dumping_key,"erts_is_crash_dumping_key");
@@ -2374,6 +2371,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 +2384,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_lock_count.c b/erts/emulator/beam/erl_lock_count.c
index a00e0f0fff..481e92b2cd 100644
--- a/erts/emulator/beam/erl_lock_count.c
+++ b/erts/emulator/beam/erl_lock_count.c
@@ -274,11 +274,11 @@ void erts_lcnt_init() {
lcnt_unlock();
- /* set start timer and zero statistics */
- erts_lcnt_clear_counters();
}
void erts_lcnt_late_init() {
+ /* set start timer and zero statistics */
+ erts_lcnt_clear_counters();
erts_thr_install_exit_handler(erts_lcnt_thread_exit_handler);
}
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c
index 9a873857b9..6b265a8b80 100644
--- a/erts/emulator/beam/erl_nif.c
+++ b/erts/emulator/beam/erl_nif.c
@@ -2309,6 +2309,17 @@ erts_setup_nif_gc(Process* proc, Eterm** objv, int* nobj)
return gc;
}
+int
+erts_check_nif_export_in_area(Process *p, char *start, Uint size)
+{
+ NifExport *nep = ERTS_PROC_GET_NIF_TRAP_EXPORT(p);
+ if (!nep || !nep->saved_current)
+ return 0;
+ if (ErtsInArea(nep->saved_current, start, size))
+ return 1;
+ return 0;
+}
+
/*
* Allocate a NifExport and set it in proc specific data
*/
@@ -2360,6 +2371,7 @@ init_nif_sched_data(ErlNifEnv* env, NativeFunPtr direct_fp, NativeFunPtr indirec
Eterm* reg;
NifExport* ep;
int i, scheduler;
+ int orig_argc;
execution_state(env, &proc, &scheduler);
@@ -2370,11 +2382,14 @@ init_nif_sched_data(ErlNifEnv* env, NativeFunPtr direct_fp, NativeFunPtr indirec
reg = erts_proc_sched_data(proc)->x_reg_array;
+ ASSERT(!need_save || proc->current);
+ orig_argc = need_save ? (int) proc->current[2] : 0;
+
ep = (NifExport*) ERTS_PROC_GET_NIF_TRAP_EXPORT(proc);
if (!ep)
- ep = allocate_nif_sched_data(proc, argc);
- else if (need_save && ep->rootset_extra < argc) {
- NifExport* new_ep = allocate_nif_sched_data(proc, argc);
+ ep = allocate_nif_sched_data(proc, orig_argc);
+ else if (need_save && ep->rootset_extra < orig_argc) {
+ NifExport* new_ep = allocate_nif_sched_data(proc, orig_argc);
destroy_nif_export(ep);
ep = new_ep;
}
@@ -2387,16 +2402,14 @@ init_nif_sched_data(ErlNifEnv* env, NativeFunPtr direct_fp, NativeFunPtr indirec
}
if (scheduler > 0)
ERTS_VBUMP_ALL_REDS(proc);
- for (i = 0; i < argc; i++) {
- if (need_save)
- ep->rootset[i+1] = reg[i];
- reg[i] = (Eterm) argv[i];
- }
if (need_save) {
- ASSERT(proc->current);
ep->saved_current = proc->current;
- ep->saved_argc = argc;
+ ep->saved_argc = orig_argc;
+ for (i = 0; i < orig_argc; i++)
+ ep->rootset[i+1] = reg[i];
}
+ for (i = 0; i < argc; i++)
+ reg[i] = (Eterm) argv[i];
proc->i = (BeamInstr*) ep->exp.addressv[0];
ep->exp.code[0] = (BeamInstr) proc->current[0];
ep->exp.code[1] = (BeamInstr) proc->current[1];
@@ -3068,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");
}
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..b345c35a7e 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -154,6 +154,7 @@ int ERTS_WRITE_UNLIKELY(erts_eager_check_io) = 1;
int ERTS_WRITE_UNLIKELY(erts_sched_compact_load);
int ERTS_WRITE_UNLIKELY(erts_sched_balance_util) = 0;
Uint ERTS_WRITE_UNLIKELY(erts_no_schedulers);
+Uint ERTS_WRITE_UNLIKELY(erts_no_total_schedulers);
Uint ERTS_WRITE_UNLIKELY(erts_no_dirty_cpu_schedulers) = 0;
Uint ERTS_WRITE_UNLIKELY(erts_no_dirty_io_schedulers) = 0;
@@ -557,8 +558,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);
@@ -5908,9 +5909,12 @@ erts_init_scheduling(int no_schedulers, int no_schedulers_online
n = (int) no_schedulers;
erts_no_schedulers = n;
+ erts_no_total_schedulers = n;
#ifdef ERTS_DIRTY_SCHEDULERS
erts_no_dirty_cpu_schedulers = no_dirty_cpu_schedulers;
+ erts_no_total_schedulers += no_dirty_cpu_schedulers;
erts_no_dirty_io_schedulers = no_dirty_io_schedulers;
+ erts_no_total_schedulers += no_dirty_io_schedulers;
#endif
/* Create and initialize scheduler sleep info */
@@ -6271,7 +6275,11 @@ check_dirty_enqueue_in_prio_queue(Process *c_p,
return -1*queue;
}
- *newp |= ERTS_PSFLG_IN_RUNQ;
+ /*
+ * Enqueue using process struct.
+ */
+ *newp &= ~ERTS_PSFLGS_PRQ_PRIO_MASK;
+ *newp |= ERTS_PSFLG_IN_RUNQ | (aprio << ERTS_PSFLGS_PRQ_PRIO_OFFSET);
return queue;
}
@@ -6683,15 +6691,8 @@ schedule_process_sys_task(Process *p, erts_aint32_t prio, ErtsProcSysTask *st,
erts_aint32_t fail_state, state, a, n, enq_prio;
int enqueue; /* < 0 -> use proxy */
unsigned int prof_runnable_procs;
- int strict_fail_state;
fail_state = *fail_state_p;
- /*
- * If fail state something other than just exiting process,
- * ensure that the task wont be scheduled when the
- * receiver is in the failure state.
- */
- strict_fail_state = fail_state != ERTS_PSFLG_EXITING;
res = 1; /* prepare for success */
st->next = st->prev = st; /* Prep for empty prio queue */
@@ -6773,7 +6774,7 @@ schedule_process_sys_task(Process *p, erts_aint32_t prio, ErtsProcSysTask *st,
/* Status lock prevents out of order "runnable proc" trace msgs */
ERTS_SMP_LC_ASSERT(ERTS_PROC_LOCK_STATUS & erts_proc_lc_my_proc_locks(p));
- if (!prof_runnable_procs && !strict_fail_state) {
+ if (!prof_runnable_procs) {
erts_smp_proc_unlock(p, ERTS_PROC_LOCK_STATUS);
locked = 0;
}
@@ -6784,11 +6785,6 @@ schedule_process_sys_task(Process *p, erts_aint32_t prio, ErtsProcSysTask *st,
erts_aint32_t e;
n = e = a;
- if (strict_fail_state && (a & fail_state)) {
- *fail_state_p = (a & fail_state);
- goto cleanup;
- }
-
if (a & ERTS_PSFLG_FREE)
goto cleanup; /* We don't want to schedule free processes... */
@@ -12401,6 +12397,8 @@ send_exit_signal(Process *c_p, /* current process if and only
else if (!(state & (ERTS_PSFLG_RUNNING|ERTS_PSFLG_RUNNING_SYS))) {
/* Process not running ... */
ErtsProcLocks need_locks = ~(*rp_locks) & ERTS_PROC_LOCKS_ALL;
+ ErlHeapFragment *bp = NULL;
+ Eterm rsn_cpy;
if (need_locks
&& erts_smp_proc_trylock(rp, need_locks) == EBUSY) {
/* ... but we havn't got all locks on it ... */
@@ -12413,12 +12411,32 @@ send_exit_signal(Process *c_p, /* current process if and only
}
/* ...and we have all locks on it... */
*rp_locks = ERTS_PROC_LOCKS_ALL;
- set_proc_exiting(rp,
- state,
- (is_immed(rsn)
- ? rsn
- : copy_object(rsn, rp)),
- NULL);
+
+ state = erts_smp_atomic32_read_nob(&rp->state);
+
+ if (is_immed(rsn))
+ rsn_cpy = rsn;
+ else {
+ Eterm *hp;
+ ErlOffHeap *ohp;
+ Uint rsn_sz = size_object(rsn);
+#ifdef ERTS_DIRTY_SCHEDULERS
+ if (state & (ERTS_PSFLG_DIRTY_RUNNING
+ | ERTS_PSFLG_DIRTY_RUNNING_SYS)) {
+ bp = new_message_buffer(rsn_sz);
+ ohp = &bp->off_heap;
+ hp = &bp->mem[0];
+ }
+ else
+#endif
+ {
+ hp = HAlloc(rp, rsn_sz);
+ ohp = &rp->off_heap;
+ }
+ rsn_cpy = copy_struct(rsn, rsn_sz, &hp, ohp);
+ }
+
+ set_proc_exiting(rp, state, rsn_cpy, bp);
}
else { /* Process running... */
@@ -13171,7 +13189,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 +13204,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 +13234,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 +13256,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 +13288,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 3347a7a60e..9f7084c127 100644
--- a/erts/emulator/beam/erl_process.h
+++ b/erts/emulator/beam/erl_process.h
@@ -111,6 +111,7 @@ extern int erts_eager_check_io;
extern int erts_sched_compact_load;
extern int erts_sched_balance_util;
extern Uint erts_no_schedulers;
+extern Uint erts_no_total_schedulers;
#ifdef ERTS_DIRTY_SCHEDULERS
extern Uint erts_no_dirty_cpu_schedulers;
extern Uint erts_no_dirty_io_schedulers;
@@ -1586,6 +1587,7 @@ Uint64 erts_step_proc_interval(void);
int erts_setup_nif_gc(Process* proc, Eterm** objv, int* nobj); /* see erl_nif.c */
void erts_destroy_nif_export(void *); /* see erl_nif.c */
+int erts_check_nif_export_in_area(Process *p, char *start, Uint size);
ErtsProcList *erts_proclist_create(Process *);
ErtsProcList *erts_proclist_copy(ErtsProcList *);
@@ -1837,12 +1839,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);
@@ -1878,7 +1880,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 b0e623a5b9..4b2edace0a 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;
@@ -414,6 +412,10 @@ erts_sys_pre_init(void)
erts_thr_init(&eid);
+#ifdef ERTS_ENABLE_LOCK_CHECK
+ erts_lc_init();
+#endif
+
#ifdef ERTS_ENABLE_LOCK_COUNT
erts_lcnt_init();
#endif
@@ -672,7 +674,7 @@ sigusr1_exit(void)
}
prepare_crash_dump(secs);
- erts_exit(ERTS_ERROR_EXIT, "Received SIGUSR1\n");
+ erts_exit(ERTS_DUMP_EXIT, "Received SIGUSR1\n");
}
#ifdef ETHR_UNUSABLE_SIGUSRX
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..f3881e0736 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.
@@ -3187,16 +3186,16 @@ erts_sys_pre_init(void)
eid.thread_create_parent_func = thr_create_cleanup;
erts_thr_init(&eid);
+#ifdef ERTS_ENABLE_LOCK_CHECK
+ erts_lc_init();
#endif
-
- erts_init_sys_time_sup();
-
-#ifdef USE_THREADS
#ifdef ERTS_ENABLE_LOCK_COUNT
erts_lcnt_init();
#endif
#endif
+ erts_init_sys_time_sup();
+
erts_smp_atomic_init_nob(&sys_misc_mem_sz, 0);
}
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/etp-commands.in b/erts/etc/unix/etp-commands.in
index e2bf302cca..fa68bd26ee 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>"
@@ -2432,57 +2443,155 @@ define etp-schedulers
if (!erts_initialized)
printf "No schedulers, since system isn't initialized!\n"
else
+ set $sched_type = 0
set $sched_ix = 0
while $sched_ix < erts_no_schedulers
- printf "--- Scheduler %d ---\n", $sched_ix+1
- printf " IX: %d\n", $sched_ix
- if (erts_aligned_scheduler_data[$sched_ix].esd.cpu_id < 0)
- printf " CPU Binding: unbound\n"
- else
- printf " CPU Binding: %d\n", erts_aligned_scheduler_data[$sched_ix].esd.cpu_id
- end
- printf " Aux work Flags:"
- set $aux_work_flags = *((Uint32 *) &erts_aligned_scheduler_data[$sched_ix].esd.ssi->aux_work)
- etp-aux-work-flags $aux_work_flags
- printf " Sleep Info Flags:"
- set $ssi_flags = *((Uint32 *) &erts_aligned_scheduler_data[$sched_ix].esd.ssi->flags)
- etp-ssi-flags $ssi_flags
- printf " Pointer: (ErtsSchedulerData *) %p\n", &erts_aligned_scheduler_data[$sched_ix].esd
- printf " - Run Queue -\n"
- if (etp_smp_compiled)
- set $runq = erts_aligned_scheduler_data[$sched_ix].esd.run_queue
- else
- set $runq = &erts_aligned_run_queues[0].runq
- end
- printf " Length: total=%d", *((Uint32 *) &($runq->len))
- printf ", max=%d", *((Uint32 *) &($runq->procs.prio_info[0].len))
- printf ", high=%d", *((Uint32 *) &($runq->procs.prio_info[1].len))
- printf ", normal=%d", *((Uint32 *) &($runq->procs.prio_info[2].len))
- printf ", low=%d", *((Uint32 *) &($runq->procs.prio_info[3].len))
- printf ", port=%d\n", *((Uint32 *) &($runq->ports.info.len))
- if ($runq->misc.start)
- printf " Misc Jobs: yes\n"
- else
- printf " Misc Jobs: no\n"
- end
- set $rq_flags = *((Uint32 *) &($runq->flags))
- etp-rq-flags-int $rq_flags
- printf " Pointer: (ErtsRunQueue *) %p\n", $runq
-
+ etp-scheduler-info-internal
+ etp-run-queue-info-internal
set $sched_ix++
end
- printf "-------------------\n",
+ printf "---------------------\n"
+ if (erts_no_dirty_cpu_schedulers)
+ printf "\n\n"
+ set $sched_type = 1
+ set $sched_ix = 0
+ while $sched_ix < erts_no_dirty_cpu_schedulers
+ etp-scheduler-info-internal
+ set $sched_ix++
+ end
+ etp-run-queue-info-internal
+ printf "---------------------\n"
+ end
+ if (erts_no_dirty_io_schedulers)
+ printf "\n\n"
+ set $sched_type = 2
+ set $sched_ix = 0
+ while $sched_ix < erts_no_dirty_io_schedulers
+ etp-scheduler-info-internal
+ set $sched_ix++
+ end
+ etp-run-queue-info-internal
+ printf "---------------------\n"
+ end
end
end
document etp-schedulers
%---------------------------------------------------------------------------
% etp-schedulers
-%
+%
% Print misc info about all schedulers
%---------------------------------------------------------------------------
end
+define etp-scheduler-info-internal
+ if ($sched_type == 0)
+ printf "--- Scheduler %d ---\n", $sched_ix+1
+ set $sched_data=&erts_aligned_scheduler_data[$sched_ix].esd
+ else
+ if ($sched_type == 1)
+ printf "--- Dirty CPU Scheduler %d ---\n", $sched_ix+1
+ set $sched_data=&erts_aligned_dirty_cpu_scheduler_data[$sched_ix].esd
+ else
+ printf "--- Dirty I/O Scheduler %d ---\n", $sched_ix+1
+ set $sched_data=&erts_aligned_dirty_io_scheduler_data[$sched_ix].esd
+ end
+ end
+ printf " IX: %d\n", $sched_ix
+ if ($sched_data->cpu_id < 0)
+ printf " CPU Binding: unbound\n"
+ else
+ printf " CPU Binding: %d\n", $sched_data->cpu_id
+ end
+ printf " Aux work Flags:"
+ set $aux_work_flags = *((Uint32 *) &$sched_data->ssi->aux_work)
+ etp-aux-work-flags $aux_work_flags
+ printf " Sleep Info Flags:"
+ set $ssi_flags = *((Uint32 *) &$sched_data->ssi->flags)
+ etp-ssi-flags $ssi_flags
+ printf " Pointer: (ErtsSchedulerData *) %p\n", $sched_data
+end
+
+define etp-run-queue-info-internal
+ if ($sched_type == 0)
+ printf " - Run Queue -\n"
+ if (etp_smp_compiled)
+ set $runq = erts_aligned_scheduler_data[$sched_ix].esd.run_queue
+ else
+ set $runq = &erts_aligned_run_queues[0].runq
+ end
+ else
+ if ($sched_type == 1)
+ printf "\n--- Dirty CPU Run Queue ---\n"
+ set $runq = &erts_aligned_run_queues[-1].runq
+ else
+ printf "\n--- Dirty I/O Run Queue ---\n"
+ set $runq = &erts_aligned_run_queues[-2].runq
+ end
+ end
+ printf " Length: total=%d", *((Uint32 *) &($runq->len))
+ printf ", max=%d", *((Uint32 *) &($runq->procs.prio_info[0].len))
+ printf ", high=%d", *((Uint32 *) &($runq->procs.prio_info[1].len))
+ printf ", normal=%d", *((Uint32 *) &($runq->procs.prio_info[2].len))
+ printf ", low=%d", *((Uint32 *) &($runq->procs.prio_info[3].len))
+ printf ", port=%d\n", *((Uint32 *) &($runq->ports.info.len))
+ if ($runq->misc.start)
+ printf " Misc Jobs: yes\n"
+ else
+ printf " Misc Jobs: no\n"
+ end
+ set $rq_flags = *((Uint32 *) &($runq->flags))
+ etp-rq-flags-int $rq_flags
+ printf " Pointer: (ErtsRunQueue *) %p\n", $runq
+
+
+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/erl_prim_loader.beam b/erts/preloaded/ebin/erl_prim_loader.beam
index 796cbd74c5..64d1a70e61 100644
--- a/erts/preloaded/ebin/erl_prim_loader.beam
+++ b/erts/preloaded/ebin/erl_prim_loader.beam
Binary files differ
diff --git a/erts/preloaded/ebin/erlang.beam b/erts/preloaded/ebin/erlang.beam
index c68debeabc..fbbfefa462 100644
--- a/erts/preloaded/ebin/erlang.beam
+++ b/erts/preloaded/ebin/erlang.beam
Binary files differ
diff --git a/erts/preloaded/ebin/erts_internal.beam b/erts/preloaded/ebin/erts_internal.beam
index 227b62b7d3..2a7bfb8b86 100644
--- a/erts/preloaded/ebin/erts_internal.beam
+++ b/erts/preloaded/ebin/erts_internal.beam
Binary files differ
diff --git a/erts/preloaded/src/erl_prim_loader.erl b/erts/preloaded/src/erl_prim_loader.erl
index b3ec73a60e..1d09aeded9 100644
--- a/erts/preloaded/src/erl_prim_loader.erl
+++ b/erts/preloaded/src/erl_prim_loader.erl
@@ -555,17 +555,18 @@ efile_gm_get(Paths, Mod, ParentRef, Process) ->
efile_gm_get_1([P|Ps], File0, Mod, {Parent,Ref}=PR, Process) ->
File = join(P, File0),
- Res = try prim_file:read_file(File) of
- {ok,Bin} ->
- gm_process(Mod, File, Bin, Process);
- Error ->
- _ = check_file_result(get_modules, File, Error),
- efile_gm_get_1(Ps, File0, Mod, PR, Process)
- catch
- _:Reason ->
- {error,{crash,Reason}}
- end,
- Parent ! {Ref,Mod,Res};
+ try prim_file:read_file(File) of
+ {ok,Bin} ->
+ Res = gm_process(Mod, File, Bin, Process),
+ Parent ! {Ref,Mod,Res};
+ Error ->
+ _ = check_file_result(get_modules, File, Error),
+ efile_gm_get_1(Ps, File0, Mod, PR, Process)
+ catch
+ _:Reason ->
+ Res = {error,{crash,Reason}},
+ Parent ! {Ref,Mod,Res}
+ end;
efile_gm_get_1([], _, Mod, {Parent,Ref}, _Process) ->
Parent ! {Ref,Mod,{error,enoent}}.
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/vsn.mk b/erts/vsn.mk
index ad9148f61f..317d731cd7 100644
--- a/erts/vsn.mk
+++ b/erts/vsn.mk
@@ -18,7 +18,7 @@
# %CopyrightEnd%
#
-VSN = 8.1
+VSN = 8.1.1
# Port number 4365 in 4.2
# Port number 4366 in 4.3
diff --git a/lib/common_test/doc/src/ct.xml b/lib/common_test/doc/src/ct.xml
index 53ef41dd5b..ea9f956271 100644
--- a/lib/common_test/doc/src/ct.xml
+++ b/lib/common_test/doc/src/ct.xml
@@ -740,7 +740,7 @@
<v>Format = string()</v>
<v>FormatArgs = list()</v>
<v>Opts = [Opt]</v>
- <v>Opt = no_css | esc_chars</v>
+ <v>Opt = {heading,string()} | no_css | esc_chars</v>
</type>
<desc><marker id="log-5"/>
<p>Prints from a test case to the log file.</p>
@@ -798,53 +798,71 @@
<func>
<name>pal(Format) -&gt; ok</name>
- <fsummary>Equivalent to pal(default, 50, Format, []).</fsummary>
+ <fsummary>Equivalent to pal(default, 50, Format, [], []).</fsummary>
<desc><marker id="pal-1"/>
<p>Equivalent to
- <seealso marker="#pal-4"><c>ct:pal(default, 50, Format,
- [])</c></seealso>.</p>
+ <seealso marker="#pal-5"><c>ct:pal(default, 50, Format,
+ [], [])</c></seealso>.</p>
</desc>
</func>
<func>
<name>pal(X1, X2) -&gt; ok</name>
<fsummary>Equivalent to pal(Category, Importance, Format,
- FormatArgs).</fsummary>
+ FormatArgs, []).</fsummary>
<type>
<v>X1 = Category | Importance | Format</v>
<v>X2 = Format | FormatArgs</v>
</type>
<desc><marker id="pal-2"/>
- <p>Equivalent to <seealso marker="#pal-4"><c>ct:pal(Category,
- Importance, Format, FormatArgs)</c></seealso>.</p>
+ <p>Equivalent to <seealso marker="#pal-5"><c>ct:pal(Category,
+ Importance, Format, FormatArgs, [])</c></seealso>.</p>
</desc>
</func>
<func>
<name>pal(X1, X2, X3) -&gt; ok</name>
<fsummary>Equivalent to pal(Category, Importance, Format,
- FormatArgs).</fsummary>
+ FormatArgs, Opts).</fsummary>
<type>
<v>X1 = Category | Importance</v>
<v>X2 = Importance | Format</v>
- <v>X3 = Format | FormatArgs</v>
+ <v>X3 = Format | FormatArgs | Opts</v>
</type>
<desc><marker id="pal-3"/>
- <p>Equivalent to <seealso marker="#pal-4"><c>ct:pal(Category,
- Importance, Format, FormatArgs)</c></seealso>.</p>
+ <p>Equivalent to <seealso marker="#pal-5"><c>ct:pal(Category,
+ Importance, Format, FormatArgs, Opts)</c></seealso>.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>pal(X1, X2, X3, X4) -&gt; ok</name>
+ <fsummary>Equivalent to pal(Category, Importance, Format,
+ FormatArgs, Opts).</fsummary>
+ <type>
+ <v>X1 = Category | Importance</v>
+ <v>X2 = Importance | Format</v>
+ <v>X3 = Format | FormatArgs</v>
+ <v>X4 = FormatArgs | Opts</v>
+ </type>
+ <desc><marker id="pal-4"/>
+ <p>Equivalent to <seealso marker="#pal-5"><c>ct:pal(Category,
+ Importance, Format, FormatArgs, Opts)</c></seealso>.</p>
</desc>
</func>
<func>
- <name>pal(Category, Importance, Format, FormatArgs) -&gt; ok</name>
+ <name>pal(Category, Importance, Format, FormatArgs, Opts) -&gt; ok</name>
<fsummary>Prints and logs from a test case.</fsummary>
<type>
<v>Category = atom()</v>
<v>Importance = integer()</v>
<v>Format = string()</v>
<v>FormatArgs = list()</v>
+ <v>Opts = [Opt]</v>
+ <v>Opt = {heading,string()} | no_css</v>
</type>
- <desc><marker id="pal-4"/>
+ <desc><marker id="pal-5"/>
<p>Prints and logs from a test case.</p>
<p>This function is meant for printing a string from a test case,
@@ -888,52 +906,70 @@
<func>
<name>print(Format) -&gt; ok</name>
- <fsummary>Equivalent to print(default, 50, Format, []).</fsummary>
+ <fsummary>Equivalent to print(default, 50, Format, [], []).</fsummary>
<desc><marker id="print-1"/>
- <p>Equivalent to <seealso marker="#print-4"><c>ct:print(default,
- 50, Format, [])</c></seealso>.</p>
+ <p>Equivalent to <seealso marker="#print-5"><c>ct:print(default,
+ 50, Format, [], [])</c></seealso>.</p>
</desc>
</func>
<func>
<name>print(X1, X2) -&gt; ok</name>
<fsummary>Equivalent to print(Category, Importance, Format,
- FormatArgs).</fsummary>
+ FormatArgs, []).</fsummary>
<type>
<v>X1 = Category | Importance | Format</v>
<v>X2 = Format | FormatArgs</v>
</type>
<desc><marker id="print-2"/>
- <p>Equivalent to <seealso marker="#print-4"><c>ct:print(Category,
- Importance, Format, FormatArgs)</c></seealso>.</p>
+ <p>Equivalent to <seealso marker="#print-5"><c>ct:print(Category,
+ Importance, Format, FormatArgs, [])</c></seealso>.</p>
</desc>
</func>
<func>
<name>print(X1, X2, X3) -&gt; ok</name>
<fsummary>Equivalent to print(Category, Importance, Format,
- FormatArgs).</fsummary>
+ FormatArgs, Opts).</fsummary>
<type>
<v>X1 = Category | Importance</v>
<v>X2 = Importance | Format</v>
- <v>X3 = Format | FormatArgs</v>
+ <v>X3 = Format | FormatArgs | Opts</v>
</type>
<desc><marker id="print-3"/>
- <p>Equivalent to <seealso marker="#print-4"><c>ct:print(Category,
- Importance, Format, FormatArgs)</c></seealso>.</p>
+ <p>Equivalent to <seealso marker="#print-5"><c>ct:print(Category,
+ Importance, Format, FormatArgs, Opts)</c></seealso>.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>print(X1, X2, X3, X4) -&gt; ok</name>
+ <fsummary>Equivalent to print(Category, Importance, Format,
+ FormatArgs, Opts).</fsummary>
+ <type>
+ <v>X1 = Category | Importance</v>
+ <v>X2 = Importance | Format</v>
+ <v>X3 = Format | FormatArgs</v>
+ <v>X4 = FormatArgs | Opts</v>
+ </type>
+ <desc><marker id="print-4"/>
+ <p>Equivalent to <seealso marker="#print-5"><c>ct:print(Category,
+ Importance, Format, FormatArgs, Opts)</c></seealso>.</p>
</desc>
</func>
<func>
- <name>print(Category, Importance, Format, FormatArgs) -&gt; ok</name>
+ <name>print(Category, Importance, Format, FormatArgs, Opts) -&gt; ok</name>
<fsummary>Prints from a test case to the console.</fsummary>
<type>
<v>Category = atom()</v>
<v>Importance = integer()</v>
<v>Format = string()</v>
<v>FormatArgs = list()</v>
+ <v>Opts = [Opt]</v>
+ <v>Opt = {heading,string()}</v>
</type>
- <desc><marker id="print-4"/>
+ <desc><marker id="print-5"/>
<p>Prints from a test case to the console.</p>
<p>This function is meant for printing a string from a test case to
diff --git a/lib/common_test/doc/src/write_test_chapter.xml b/lib/common_test/doc/src/write_test_chapter.xml
index 1d3fbb6f76..f70bdb16c5 100644
--- a/lib/common_test/doc/src/write_test_chapter.xml
+++ b/lib/common_test/doc/src/write_test_chapter.xml
@@ -986,15 +986,17 @@
<c>io:put_chars/1</c>, and so on.</p>
<p><c>Importance</c> is compared to a verbosity level set by the
- <c>verbosity</c> start flag/option. The verbosity level can be set per
- category or generally, or both. The default verbosity level,
- <c>?STD_VERBOSITY</c>, is 50, that is, all standard I/O gets printed.
- If a lower verbosity level is set, standard I/O printouts are ignored.
- <c>Common Test</c> performs the following test:</p>
+ <c>verbosity</c> start flag/option. The level can be set per
+ category or generally, or both. If <c>verbosity</c> is not set by the user,
+ a level of 100 (<c>?MAX_VERBOSITY</c> = all printouts visible) is used as
+ default value. <c>Common Test</c> performs the following test:</p>
<pre>
- Importance >= (100-VerbosityLevel)</pre>
- <p>This also means that verbosity level 0 effectively turns all logging off
- (except from printouts made by <c>Common Test</c> itself).</p>
+Importance >= (100-VerbosityLevel)</pre>
+ <p>The constant <c>?STD_VERBOSITY</c> has value 50 (see <c>ct.hrl</c>).
+ At this level, all standard I/O gets printed. If a lower verbosity level
+ is set, standard I/O printouts are ignored. Verbosity level 0 effectively
+ turns all logging off (except from printouts made by <c>Common Test</c>
+ itself).</p>
<p>The general verbosity level is not associated with any particular
category. This level sets the threshold for the standard I/O printouts,
@@ -1003,17 +1005,17 @@
<p><em>Examples:</em></p>
<p>Some printouts during test case execution:</p>
- <pre>
+ <pre>
io:format("1. Standard IO, importance = ~w~n", [?STD_IMPORTANCE]),
ct:log("2. Uncategorized, importance = ~w", [?STD_IMPORTANCE]),
- ct:log(info, "3. Categorized info, importance = ~w", [?STD_IMPORTANCE]]),
+ ct:log(info, "3. Categorized info, importance = ~w", [?STD_IMPORTANCE]),
ct:log(info, ?LOW_IMPORTANCE, "4. Categorized info, importance = ~w", [?LOW_IMPORTANCE]),
- ct:log(error, "5. Categorized error, importance = ~w", [?HI_IMPORTANCE]),
- ct:log(error, ?HI_IMPORTANCE, "6. Categorized error, importance = ~w", [?MAX_IMPORTANCE]),</pre>
+ ct:log(error, ?HI_IMPORTANCE, "5. Categorized error, importance = ~w", [?HI_IMPORTANCE]),
+ ct:log(error, ?MAX_IMPORTANCE, "6. Categorized error, importance = ~w", [?MAX_IMPORTANCE]),</pre>
- <p>If starting the test without specifying any verbosity levels as follows:</p>
+ <p>If starting the test with a general verbosity level of 50 (<c>?STD_VERBOSITY</c>):</p>
<pre>
- $ ct_run ...</pre>
+ $ ct_run -verbosity 50</pre>
<p>the following is printed:</p>
<pre>
1. Standard IO, importance = 50
@@ -1031,10 +1033,22 @@
4. Categorized info, importance = 25
6. Categorized error, importance = 99</pre>
+ <p>Note that the category argument is not required in order to only specify the
+ importance of a printout. Example:</p>
+ <pre>
+<c>ct:pal(?LOW_IMPORTANCE, "Info report: ~p", [Info])</c></pre>
+ <p>Or perhaps in combination with constants:</p>
+ <pre>
+-define(INFO, ?LOW_IMPORTANCE).
+-define(ERROR, ?HI_IMPORTANCE).
+
+ct:log(?INFO, "Info report: ~p", [Info])
+ct:pal(?ERROR, "Error report: ~p", [Error])</pre>
+
<p>The functions <seealso marker="ct#set_verbosity-2"><c>ct:set_verbosity/2</c></seealso>
and <seealso marker="ct#get_verbosity-1"><c>ct:get_verbosity/1</c></seealso> may be used
to modify and read verbosity levels during test execution.</p>
-
+
<p>The arguments <c>Format</c> and <c>FormatArgs</c> in <c>ct:log/print/pal</c> are
always passed on to the STDLIB function <c>io:format/3</c> (For details,
see the <seealso marker="stdlib:io"><c>io</c></seealso> manual page).</p>
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.erl b/lib/common_test/src/ct.erl
index f9f845e1a9..43abb91819 100644
--- a/lib/common_test/src/ct.erl
+++ b/lib/common_test/src/ct.erl
@@ -66,8 +66,8 @@
reload_config/1,
escape_chars/1, escape_chars/2,
log/1, log/2, log/3, log/4, log/5,
- print/1, print/2, print/3, print/4,
- pal/1, pal/2, pal/3, pal/4,
+ print/1, print/2, print/3, print/4, print/5,
+ pal/1, pal/2, pal/3, pal/4, pal/5,
set_verbosity/2, get_verbosity/1,
capture_start/0, capture_stop/0, capture_get/0, capture_get/1,
fail/1, fail/2, comment/1, comment/2, make_priv_dir/0,
@@ -592,7 +592,7 @@ log(X1,X2,X3,X4) ->
%%% Format = string()
%%% Args = list()
%%% Opts = [Opt]
-%%% Opt = esc_chars | no_css
+%%% Opt = {heading,string()} | esc_chars | no_css
%%%
%%% @doc Printout from a test case to the log file.
%%%
@@ -610,43 +610,61 @@ log(Category,Importance,Format,Args,Opts) ->
%%%-----------------------------------------------------------------
%%% @spec print(Format) -> ok
-%%% @equiv print(default,50,Format,[])
+%%% @equiv print(default,50,Format,[],[])
print(Format) ->
- print(default,?STD_IMPORTANCE,Format,[]).
+ print(default,?STD_IMPORTANCE,Format,[],[]).
%%%-----------------------------------------------------------------
%%% @spec print(X1,X2) -> ok
%%% X1 = Category | Importance | Format
%%% X2 = Format | Args
-%%% @equiv print(Category,Importance,Format,Args)
+%%% @equiv print(Category,Importance,Format,Args,[])
print(X1,X2) ->
{Category,Importance,Format,Args} =
if is_atom(X1) -> {X1,?STD_IMPORTANCE,X2,[]};
is_integer(X1) -> {default,X1,X2,[]};
is_list(X1) -> {default,?STD_IMPORTANCE,X1,X2}
end,
- print(Category,Importance,Format,Args).
+ print(Category,Importance,Format,Args,[]).
%%%-----------------------------------------------------------------
%%% @spec print(X1,X2,X3) -> ok
+%%% X1 = Category | Importance | Format
+%%% X2 = Importance | Format | Args
+%%% X3 = Format | Args | Opts
+%%% @equiv print(Category,Importance,Format,Args,Opts)
+print(X1,X2,X3) ->
+ {Category,Importance,Format,Args,Opts} =
+ if is_atom(X1), is_integer(X2) -> {X1,X2,X3,[],[]};
+ is_atom(X1), is_list(X2) -> {X1,?STD_IMPORTANCE,X2,X3,[]};
+ is_integer(X1) -> {default,X1,X2,X3,[]};
+ is_list(X1), is_list(X2) -> {default,?STD_IMPORTANCE,X1,X2,X3}
+ end,
+ print(Category,Importance,Format,Args,Opts).
+
+%%%-----------------------------------------------------------------
+%%% @spec print(X1,X2,X3,X4) -> ok
%%% X1 = Category | Importance
%%% X2 = Importance | Format
%%% X3 = Format | Args
-%%% @equiv print(Category,Importance,Format,Args)
-print(X1,X2,X3) ->
- {Category,Importance,Format,Args} =
- if is_atom(X1), is_integer(X2) -> {X1,X2,X3,[]};
- is_atom(X1), is_list(X2) -> {X1,?STD_IMPORTANCE,X2,X3};
- is_integer(X1) -> {default,X1,X2,X3}
+%%% X4 = Args | Opts
+%%% @equiv print(Category,Importance,Format,Args,Opts)
+print(X1,X2,X3,X4) ->
+ {Category,Importance,Format,Args,Opts} =
+ if is_atom(X1), is_integer(X2) -> {X1,X2,X3,X4,[]};
+ is_atom(X1), is_list(X2) -> {X1,?STD_IMPORTANCE,X2,X3,X4};
+ is_integer(X1) -> {default,X1,X2,X3,X4}
end,
- print(Category,Importance,Format,Args).
+ print(Category,Importance,Format,Args,Opts).
%%%-----------------------------------------------------------------
-%%% @spec print(Category,Importance,Format,Args) -> ok
+%%% @spec print(Category,Importance,Format,Args,Opts) -> ok
%%% Category = atom()
%%% Importance = integer()
%%% Format = string()
%%% Args = list()
+%%% Opts = [Opt]
+%%% Opt = {heading,string()}
%%%
%%% @doc Printout from a test case to the console.
%%%
@@ -658,13 +676,13 @@ print(X1,X2,X3) ->
%%% and default value for <c>Args</c> is <c>[]</c>.</p>
%%% <p>Please see the User's Guide for details on <c>Category</c>
%%% and <c>Importance</c>.</p>
-print(Category,Importance,Format,Args) ->
- ct_logs:tc_print(Category,Importance,Format,Args).
+print(Category,Importance,Format,Args,Opts) ->
+ ct_logs:tc_print(Category,Importance,Format,Args,Opts).
%%%-----------------------------------------------------------------
%%% @spec pal(Format) -> ok
-%%% @equiv pal(default,50,Format,[])
+%%% @equiv pal(default,50,Format,[],[])
pal(Format) ->
pal(default,?STD_IMPORTANCE,Format,[]).
@@ -672,35 +690,53 @@ pal(Format) ->
%%% @spec pal(X1,X2) -> ok
%%% X1 = Category | Importance | Format
%%% X2 = Format | Args
-%%% @equiv pal(Category,Importance,Format,Args)
+%%% @equiv pal(Category,Importance,Format,Args,[])
pal(X1,X2) ->
{Category,Importance,Format,Args} =
if is_atom(X1) -> {X1,?STD_IMPORTANCE,X2,[]};
is_integer(X1) -> {default,X1,X2,[]};
is_list(X1) -> {default,?STD_IMPORTANCE,X1,X2}
end,
- pal(Category,Importance,Format,Args).
+ pal(Category,Importance,Format,Args,[]).
%%%-----------------------------------------------------------------
%%% @spec pal(X1,X2,X3) -> ok
+%%% X1 = Category | Importance | Format
+%%% X2 = Importance | Format | Args
+%%% X3 = Format | Args | Opts
+%%% @equiv pal(Category,Importance,Format,Args,Opts)
+pal(X1,X2,X3) ->
+ {Category,Importance,Format,Args,Opts} =
+ if is_atom(X1), is_integer(X2) -> {X1,X2,X3,[],[]};
+ is_atom(X1), is_list(X2) -> {X1,?STD_IMPORTANCE,X2,X3,[]};
+ is_integer(X1) -> {default,X1,X2,X3,[]};
+ is_list(X1), is_list(X2) -> {default,?STD_IMPORTANCE,X1,X2,X3}
+ end,
+ pal(Category,Importance,Format,Args,Opts).
+
+%%%-----------------------------------------------------------------
+%%% @spec pal(X1,X2,X3,X4) -> ok
%%% X1 = Category | Importance
%%% X2 = Importance | Format
%%% X3 = Format | Args
-%%% @equiv pal(Category,Importance,Format,Args)
-pal(X1,X2,X3) ->
- {Category,Importance,Format,Args} =
- if is_atom(X1), is_integer(X2) -> {X1,X2,X3,[]};
- is_atom(X1), is_list(X2) -> {X1,?STD_IMPORTANCE,X2,X3};
- is_integer(X1) -> {default,X1,X2,X3}
+%%% X4 = Args | Opts
+%%% @equiv pal(Category,Importance,Format,Args,Opts)
+pal(X1,X2,X3,X4) ->
+ {Category,Importance,Format,Args,Opts} =
+ if is_atom(X1), is_integer(X2) -> {X1,X2,X3,X4,[]};
+ is_atom(X1), is_list(X2) -> {X1,?STD_IMPORTANCE,X2,X3,X4};
+ is_integer(X1) -> {default,X1,X2,X3,X4}
end,
- pal(Category,Importance,Format,Args).
+ pal(Category,Importance,Format,Args,Opts).
%%%-----------------------------------------------------------------
-%%% @spec pal(Category,Importance,Format,Args) -> ok
+%%% @spec pal(Category,Importance,Format,Args,Opts) -> ok
%%% Category = atom()
%%% Importance = integer()
%%% Format = string()
%%% Args = list()
+%%% Opts = [Opt]
+%%% Opt = {heading,string()} | no_css
%%%
%%% @doc Print and log from a test case.
%%%
@@ -712,8 +748,8 @@ pal(X1,X2,X3) ->
%%% and default value for <c>Args</c> is <c>[]</c>.</p>
%%% <p>Please see the User's Guide for details on <c>Category</c>
%%% and <c>Importance</c>.</p>
-pal(Category,Importance,Format,Args) ->
- ct_logs:tc_pal(Category,Importance,Format,Args).
+pal(Category,Importance,Format,Args,Opts) ->
+ ct_logs:tc_pal(Category,Importance,Format,Args,Opts).
%%%-----------------------------------------------------------------
%%% @spec set_verbosity(Category, Level) -> ok
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..09ad709da5 100644
--- a/lib/common_test/src/ct_logs.erl
+++ b/lib/common_test/src/ct_logs.erl
@@ -45,8 +45,8 @@
%% Logging stuff directly from testcase
-export([tc_log/3, tc_log/4, tc_log/5, tc_log/6,
tc_log_async/3, tc_log_async/5,
- tc_print/3, tc_print/4,
- tc_pal/3, tc_pal/4, ct_log/3,
+ tc_print/3, tc_print/4, tc_print/5,
+ tc_pal/3, tc_pal/4, tc_pal/5, ct_log/3,
basic_html/0]).
%% Simulate logger process for use without ct environment running
@@ -447,10 +447,10 @@ tc_log(Category,Importance,Format,Args,Opts) ->
tc_log(Category,Importance,"User",Format,Args,Opts).
%%%-----------------------------------------------------------------
-%%% @spec tc_log(Category,Importance,Printer,Format,Args,Opts) -> ok
+%%% @spec tc_log(Category,Importance,Heading,Format,Args,Opts) -> ok
%%% Category = atom()
%%% Importance = integer()
-%%% Printer = string()
+%%% Heading = string()
%%% Format = string()
%%% Args = list()
%%% Opts = list()
@@ -460,13 +460,18 @@ tc_log(Category,Importance,Format,Args,Opts) ->
%%% <p>This function is called by <code>ct</code> when logging
%%% stuff directly from a testcase (i.e. not from within the CT
%%% framework).</p>
-tc_log(Category,Importance,Printer,Format,Args,Opts) ->
+tc_log(Category,Importance,Heading,Format,Args,Opts) ->
Data =
case lists:member(no_css, Opts) of
true ->
[{Format,Args}];
false ->
- [{hd,div_header(Category,Printer),[]},
+ Heading1 =
+ case proplists:get_value(heading, Opts) of
+ undefined -> Heading;
+ Str -> Str
+ end,
+ [{hd,div_header(Category,Heading1),[]},
{Format,Args},
{ft,div_footer(),[]}]
end,
@@ -484,7 +489,7 @@ tc_log_async(Category,Format,Args) ->
%%% @spec tc_log_async(Category,Importance,Format,Args) -> ok
%%% Category = atom()
%%% Importance = integer()
-%%% Printer = string()
+%%% Heading = string()
%%% Format = string()
%%% Args = list()
%%%
@@ -495,31 +500,38 @@ tc_log_async(Category,Format,Args) ->
%%% to avoid deadlocks when e.g. the hook that handles SASL printouts
%%% prints to the test case log file at the same time test server
%%% asks ct_logs for an html wrapper.</p>
-tc_log_async(Category,Importance,Printer,Format,Args) ->
+tc_log_async(Category,Importance,Heading,Format,Args) ->
cast({log,async,self(),group_leader(),Category,Importance,
- [{hd,div_header(Category,Printer),[]},
+ [{hd,div_header(Category,Heading),[]},
{Format,Args},
{ft,div_footer(),[]}],
true}),
ok.
%%%-----------------------------------------------------------------
%%% @spec tc_print(Category,Format,Args)
-%%% @equiv tc_print(Category,?STD_IMPORTANCE,Format,Args)
+%%% @equiv tc_print(Category,?STD_IMPORTANCE,Format,Args,[])
tc_print(Category,Format,Args) ->
- tc_print(Category,?STD_IMPORTANCE,Format,Args).
+ tc_print(Category,?STD_IMPORTANCE,Format,Args,[]).
+
+%%%-----------------------------------------------------------------
+%%% @spec tc_print(Category,Importance,Format,Args)
+%%% @equiv tc_print(Category,Importance,Format,Args,[])
+tc_print(Category,Importance,Format,Args) ->
+ tc_print(Category,Importance,Format,Args,[]).
%%%-----------------------------------------------------------------
-%%% @spec tc_print(Category,Importance,Format,Args) -> ok
+%%% @spec tc_print(Category,Importance,Format,Args,Opts) -> ok
%%% Category = atom()
%%% Importance = integer()
%%% Format = string()
%%% Args = list()
+%%% Opts = list()
%%%
%%% @doc Console printout from a testcase.
%%%
%%% <p>This function is called by <code>ct</code> when printing
%%% stuff from a testcase on the user console.</p>
-tc_print(Category,Importance,Format,Args) ->
+tc_print(Category,Importance,Format,Args,Opts) ->
VLvl = case ct_util:get_verbosity(Category) of
undefined ->
ct_util:get_verbosity('$unspecified');
@@ -531,50 +543,61 @@ 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),
+ Heading =
+ case proplists:get_value(heading, Opts) of
+ undefined -> atom_to_list(Category);
+ Hd -> Hd
+ end,
+ Str = lists:concat([get_header(Heading),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
end.
-get_heading(default) ->
+get_header("default") ->
io_lib:format("\n-----------------------------"
"-----------------------\n~s\n",
[log_timestamp(?now)]);
-get_heading(Category) ->
+get_header(Heading) ->
io_lib:format("\n-----------------------------"
- "-----------------------\n~s ~w\n",
- [log_timestamp(?now),Category]).
+ "-----------------------\n~s ~s\n",
+ [Heading,log_timestamp(?now)]).
%%%-----------------------------------------------------------------
%%% @spec tc_pal(Category,Format,Args) -> ok
-%%% @equiv tc_pal(Category,?STD_IMPORTANCE,Format,Args) -> ok
+%%% @equiv tc_pal(Category,?STD_IMPORTANCE,Format,Args,[]) -> ok
tc_pal(Category,Format,Args) ->
- tc_pal(Category,?STD_IMPORTANCE,Format,Args).
+ tc_pal(Category,?STD_IMPORTANCE,Format,Args,[]).
%%%-----------------------------------------------------------------
%%% @spec tc_pal(Category,Importance,Format,Args) -> ok
+%%% @equiv tc_pal(Category,Importance,Format,Args,[]) -> ok
+tc_pal(Category,Importance,Format,Args) ->
+ tc_pal(Category,Importance,Format,Args,[]).
+
+%%%-----------------------------------------------------------------
+%%% @spec tc_pal(Category,Importance,Format,Args,Opts) -> ok
%%% Category = atom()
%%% Importance = integer()
%%% Format = string()
%%% Args = list()
+%%% Opts = list()
%%%
%%% @doc Print and log from a testcase.
%%%
%%% <p>This function is called by <code>ct</code> when logging
%%% stuff directly from a testcase. The info is written both in the
%%% log and on the console.</p>
-tc_pal(Category,Importance,Format,Args) ->
- tc_print(Category,Importance,Format,Args),
- cast({log,sync,self(),group_leader(),Category,Importance,
- [{hd,div_header(Category),[]},
- {Format,Args},
- {ft,div_footer(),[]}],
- true}),
- ok.
-
+tc_pal(Category,Importance,Format,Args,Opts) ->
+ tc_print(Category,Importance,Format,Args,Opts),
+ tc_log(Category,Importance,"User",Format,Args,[esc_chars|Opts]).
%%%-----------------------------------------------------------------
%%% @spec ct_log(Category,Format,Args) -> ok
@@ -603,9 +626,9 @@ int_footer() ->
div_header(Class) ->
div_header(Class,"User").
-div_header(Class,Printer) ->
+div_header(Class,Heading) ->
"\n</pre>\n<div class=\"" ++ atom_to_list(Class) ++ "\"><pre><b>*** "
- ++ Printer ++ " " ++ log_timestamp(?now) ++ " ***</b>".
+ ++ Heading ++ " " ++ log_timestamp(?now) ++ " ***</b>".
div_footer() ->
"</pre></div>\n<pre>".
@@ -679,7 +702,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 +710,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/common_test/src/test_server_gl.erl b/lib/common_test/src/test_server_gl.erl
index 7d6fe64b92..4845b86dd3 100644
--- a/lib/common_test/src/test_server_gl.erl
+++ b/lib/common_test/src/test_server_gl.erl
@@ -24,7 +24,7 @@
%% through the test_server_io module/process.
-module(test_server_gl).
--export([start_link/0,stop/1,set_minor_fd/3,unset_minor_fd/1,
+-export([start_link/1,stop/1,set_minor_fd/3,unset_minor_fd/1,
get_tc_supervisor/1,print/4,set_props/2]).
-export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2]).
@@ -33,6 +33,7 @@
tc :: mfa() | 'undefined', %Current test case MFA
minor :: 'none'|pid(), %Minor fd
minor_monitor, %Monitor ref for minor fd
+ tsio_monitor, %Monitor red for controlling proc
capture :: 'none'|pid(), %Capture output
reject_io :: boolean(), %Reject I/O requests...
permit_io, %... and exceptions
@@ -45,8 +46,8 @@
%% Start a new group leader process. Only to be called by
%% the test_server_io process.
-start_link() ->
- case gen_server:start_link(?MODULE, [], []) of
+start_link(TSIO) ->
+ case gen_server:start_link(?MODULE, [TSIO], []) of
{ok,Pid} ->
{ok,Pid};
Other ->
@@ -130,14 +131,16 @@ set_props(GL, PropList) ->
%%% Internal functions.
-init([]) ->
+init([TSIO]) ->
EscChars = case application:get_env(test_server, esc_chars) of
{ok,ECBool} -> ECBool;
_ -> true
end,
+ Ref = erlang:monitor(process, TSIO),
{ok,#st{tc_supervisor=none,
minor=none,
minor_monitor=none,
+ tsio_monitor=Ref,
capture=none,
reject_io=false,
permit_io=gb_sets:empty(),
@@ -176,6 +179,9 @@ handle_info({'DOWN',Ref,process,_,Reason}=D, #st{minor_monitor=Ref}=St) ->
test_server_io:print_unexpected(Data)
end,
{noreply,St#st{minor=none,minor_monitor=none}};
+handle_info({'DOWN',Ref,process,_,_}, #st{tsio_monitor=Ref}=St) ->
+ %% controlling process (test_server_io) terminated, we're done
+ {stop,normal,St};
handle_info({permit_io,Pid}, #st{permit_io=P}=St) ->
{noreply,St#st{permit_io=gb_sets:add(Pid, P)}};
handle_info({capture,Cap0}, St) ->
diff --git a/lib/common_test/src/test_server_io.erl b/lib/common_test/src/test_server_io.erl
index 3d5238052b..fdabf17b08 100644
--- a/lib/common_test/src/test_server_io.erl
+++ b/lib/common_test/src/test_server_io.erl
@@ -185,7 +185,7 @@ reset_state() ->
init([]) ->
process_flag(trap_exit, true),
Empty = gb_trees:empty(),
- {ok,Shared} = test_server_gl:start_link(),
+ {ok,Shared} = test_server_gl:start_link(self()),
{ok,#st{fds=Empty,shared_gl=Shared,gls=gb_sets:empty(),
io_buffering=gb_sets:empty(),
buffered=Empty,
@@ -200,7 +200,7 @@ req(Req) ->
gen_server:call(?MODULE, Req, infinity).
handle_call({get_gl,false}, _From, #st{gls=Gls,gl_props=Props}=St) ->
- {ok,Pid} = test_server_gl:start_link(),
+ {ok,Pid} = test_server_gl:start_link(self()),
test_server_gl:set_props(Pid, Props),
{reply,Pid,St#st{gls=gb_sets:insert(Pid, Gls)}};
handle_call({get_gl,true}, _From, #st{shared_gl=Shared}=St) ->
@@ -285,7 +285,7 @@ handle_call(reset_state, _From, #st{fds=Fds,tags=Tags,gls=Gls,
ok
end,
Empty = gb_trees:empty(),
- {ok,Shared} = test_server_gl:start_link(),
+ {ok,Shared} = test_server_gl:start_link(self()),
{reply,ok,#st{fds=Empty,shared_gl=Shared,gls=gb_sets:empty(),
io_buffering=gb_sets:empty(),
buffered=Empty,
diff --git a/lib/common_test/test/ct_log_SUITE.erl b/lib/common_test/test/ct_log_SUITE.erl
index 9bdd44cbdf..93affda398 100644
--- a/lib/common_test/test/ct_log_SUITE.erl
+++ b/lib/common_test/test/ct_log_SUITE.erl
@@ -86,18 +86,7 @@ print(Config) ->
io:format("5. Printing a pid: ~w~n", [Pid]),
io:format("6. Printing HTML: <pre>~s</pre>~n", [String]),
- %% --- API ---
- %% pal(Format) ->
- %% = ct:pal(default, 50, Format, []).
- %% pal(X1, X2) -> ok
- %% X1 = Category | Importance | Format
- %% X2 = Format | FormatArgs
- %% pal(X1, X2, X3) -> ok
- %% X1 = Category | Importance
- %% X2 = Importance | Format
- %% X3 = Format | FormatArgs
- %% pal(Category, Importance, Format, FormatArgs) -> ok
- %% ------
+ %% ct:pal
ct:pal("1. Printing nothing"),
ct:pal("2. Printing nothing", []),
ct:pal("3. Printing a string: ~s", [String]),
@@ -111,23 +100,16 @@ print(Config) ->
ct:pal(50, "11. Printing with ~s", ["importance"]),
ct:pal(ct_internal, 50, "12. Printing with ~s", ["category and importance"]),
- %% --- API ---
- %% log(Format) -> ok
- %% = ct:log(default, 50, Format, [], []).
- %% log(X1, X2) -> ok
- %% X1 = Category | Importance | Format
- %% X2 = Format | FormatArgs
- %% log(X1, X2, X3) -> ok
- %% X1 = Category | Importance
- %% X2 = Importance | Format
- %% X3 = Format | FormatArgs | Opts
- %% log(X1, X2, X3, X4) -> ok
- %% X1 = Category | Importance
- %% X2 = Importance | Format
- %% X3 = Format | FormatArgs
- %% X4 = FormatArgs | Opts
- %% log(Category, Importance, Format, FormatArgs, Opts) -> ok
- %% ------
+ ct:pal("13. Printing with heading", [],
+ [{heading,"This is a heading"}]),
+ ct:pal(ct_internal, "14. Printing with category and heading", [],
+ [{heading,"This is a heading"}]),
+ ct:pal(50, "15. Printing with importance and heading", [],
+ [{heading,"This is a heading"}]),
+ ct:pal(ct_internal, 50, "16. Printing with category, importance and heading", [],
+ [{heading,"This is a heading"}]),
+
+ %% ct:log
ct:log("1. Printing nothing"),
ct:log("2. Printing nothing", []),
ct:log("3. Printing a string: ~s", [String]),
@@ -153,8 +135,37 @@ print(Config) ->
ct:log(ct_internal, 50, "21. Printing a pid escaped with ~s, no_css: ~w",
["category and importance",Pid], [esc_chars,no_css]),
+ ct:log("22. Printing with heading", [],
+ [{heading,"This is a heading"}]),
+ ct:log(ct_internal, "23. Printing with category and heading", [],
+ [{heading,"This is a heading"}]),
+ ct:log(50, "24. Printing with importance and heading", [],
+ [{heading,"This is a heading"}]),
+ ct:log(ct_internal, 50, "25. Printing with category, importance and heading", [],
+ [{heading,"This is a heading"}]),
+
%% END mark
ct:log("LOGGING END", [], [no_css]),
+
+
+ %% ct:print
+ ct:print("1. Does this show??"),
+ ct:print("2. Does this ~s", ["show??"]),
+ ct:print("3. Is this a non-html pid?? ~w", [self()]),
+ ct:print(ct_internal, "4. Printing with category"),
+ ct:print(ct_internal, "5. Printing with ~s", ["category"]),
+ ct:print(50, "6. Printing with importance"),
+ ct:print(50, "7. Printing with ~s", ["importance"]),
+ ct:print(ct_internal, 50, "8. Printing with ~s", ["category and importance"]),
+ ct:print("9. Printing with heading", [],
+ [{heading,"This is a heading"}]),
+ ct:print(ct_internal, "10. Printing with category and heading", [],
+ [{heading,"This is a heading"}]),
+ ct:print(50, "11. Printing with importance and heading", [],
+ [{heading,"This is a heading"}]),
+ ct:print(ct_internal, 50, "12. Printing with category, importance and heading", [],
+ [{heading,"This is a heading"}]),
+
{save_config,[{the_logfile,TcLogFile},{the_pid,Pid},{the_string,String}]}.
@@ -169,6 +180,8 @@ verify(Config) ->
{ok,Dev} = file:open(TcLogFile, [read]),
ok = read_until(Dev, "LOGGING START\n"),
+ ct:pal("VERIFYING LOG ENTRIES...", []),
+
%% io:format
match_line(Dev, "1. Printing nothing", []),
read_nl(Dev),
@@ -182,6 +195,7 @@ verify(Config) ->
read_nl(Dev),
match_line(Dev, "6. Printing HTML: &lt;pre&gt;~s&lt;/pre&gt;", [String]),
read_nl(Dev),
+
%% ct:pal
read_header(Dev),
match_line(Dev, "1. Printing nothing", []),
@@ -219,6 +233,19 @@ verify(Config) ->
read_header(Dev, "\"ct_internal\""),
match_line(Dev, "12. Printing with ~s", ["category and importance"]),
read_footer(Dev),
+ read_header(Dev, "\"default\"", "This is a heading"),
+ match_line(Dev, "13. Printing with heading", []),
+ read_footer(Dev),
+ read_header(Dev, "\"ct_internal\"", "This is a heading"),
+ match_line(Dev, "14. Printing with category and heading", []),
+ read_footer(Dev),
+ read_header(Dev, "\"default\"", "This is a heading"),
+ match_line(Dev, "15. Printing with importance and heading", []),
+ read_footer(Dev),
+ read_header(Dev, "\"ct_internal\"", "This is a heading"),
+ match_line(Dev, "16. Printing with category, importance and heading", []),
+ read_footer(Dev),
+
%% ct:log
read_header(Dev),
match_line(Dev, "1. Printing nothing", []),
@@ -275,7 +302,18 @@ verify(Config) ->
read_footer(Dev),
match_line(Dev, "21. Printing a pid escaped with ~s, no_css: ~s",
["category and importance",EscPid]),
-
+ read_header(Dev, "\"default\"", "This is a heading"),
+ match_line(Dev, "22. Printing with heading", []),
+ read_footer(Dev),
+ read_header(Dev, "\"ct_internal\"", "This is a heading"),
+ match_line(Dev, "23. Printing with category and heading", []),
+ read_footer(Dev),
+ read_header(Dev, "\"default\"", "This is a heading"),
+ match_line(Dev, "24. Printing with importance and heading", []),
+ read_footer(Dev),
+ read_header(Dev, "\"ct_internal\"", "This is a heading"),
+ match_line(Dev, "25. Printing with category, importance and heading", []),
+ read_footer(Dev),
file:close(Dev),
ok.
@@ -298,29 +336,51 @@ read_until(Dev, Pat) ->
match_line(Dev, Format, Args) ->
Pat = lists:flatten(io_lib:format(Format, Args)),
Line = element(2, file:read_line(Dev)),
+
+ %% for debugging purposes:
+ ct:pal("L: ~tp", [Line], [no_css]),
+
case re:run(Line, Pat) of
{match,_} ->
ok;
nomatch ->
- ct:pal("ERROR! No match for ~p.\nLine = ~p", [Pat,Line]),
+ ct:pal("ERROR! No match for ~p", [Pat]),
file:close(Dev),
ct:fail({mismatch,Pat,Line})
end.
read_header(Dev) ->
- read_header(Dev, "\"default\"").
+ read_header(Dev, "\"default\"", "User").
read_header(Dev, Cat) ->
+ read_header(Dev, Cat, "User").
+
+read_header(Dev, Cat, Heading) ->
file:read_line(Dev), % \n
"</pre>\n" = element(2, file:read_line(Dev)),
- {match,_} =
- re:run(element(2, file:read_line(Dev)), "<div class="++Cat++"><pre><b>"
- "\\*\\*\\* User \\d{4}-\\d{2}-\\d{2} "
- "\\d{2}:\\d{2}:\\d{2}.\\d{1,} \\*\\*\\*</b>").
+ {ok,Hd} = file:read_line(Dev),
+
+ %% for debugging purposes:
+ ct:pal("H: ~tp", [Hd], [no_css]),
+
+ Pat = "<div class="++Cat++"><pre><b>"++
+ "\\*\\*\\* "++Heading++" \\d{4}-\\d{2}-\\d{2} "++
+ "\\d{2}:\\d{2}:\\d{2}.\\d{1,} \\*\\*\\*</b>",
+
+ case re:run(Hd, Pat) of
+ {match,_} ->
+ ok;
+ _ ->
+ ct:pal("ERROR! No match for ~p", [Pat]),
+ file:close(Dev),
+ ct:fail({mismatch,Pat,Hd})
+ end.
read_footer(Dev) ->
"</pre></div>\n" = element(2, file:read_line(Dev)),
- "<pre>\n" = element(2, file:read_line(Dev)).
+ "<pre>\n" = element(2, file:read_line(Dev)),
+ %% for debugging purposes:
+ ct:pal("F: </pre></div><pre>", [], [no_css]).
read_nl(Dev) ->
file:read_line(Dev).
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/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/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/dialyzer.xml b/lib/dialyzer/doc/src/dialyzer.xml
index 553bfef41b..4b7eb4ad68 100644
--- a/lib/dialyzer/doc/src/dialyzer.xml
+++ b/lib/dialyzer/doc/src/dialyzer.xml
@@ -346,7 +346,7 @@ dialyzer --plts plt_1 ... plt_n -- files_to_analyze</code>
</item>
<tag><c>-Wno_opaque</c></tag>
<item>
- <p>Suppress warnings for violations of opaqueness of data types.</p>
+ <p>Suppress warnings for violations of opacity of data types.</p>
</item>
<tag><c>-Wno_return</c></tag>
<item>
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/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/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 b23d0cae3a..37b5b7b44e 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/para
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/para
@@ -16,9 +16,9 @@ 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
+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()}]
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/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/erl_types.erl b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/erl_types.erl
index 7826dada9d..449bf4cbb6 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/src/recrec/erl_types.erl
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/recrec/erl_types.erl
@@ -4366,7 +4366,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;
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/include/edoc_doclet.hrl b/lib/edoc/include/edoc_doclet.hrl
index ac6763fb33..9893ff3ee0 100644
--- a/lib/edoc/include/edoc_doclet.hrl
+++ b/lib/edoc/include/edoc_doclet.hrl
@@ -15,7 +15,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% Author contact: carlsson.richard@gmail.com
diff --git a/lib/edoc/src/edoc.erl b/lib/edoc/src/edoc.erl
index 94013bb5ac..7d61b9e9c5 100644
--- a/lib/edoc/src/edoc.erl
+++ b/lib/edoc/src/edoc.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 2001-2007 Richard Carlsson
diff --git a/lib/edoc/src/edoc.hrl b/lib/edoc/src/edoc.hrl
index 5b0fb68cf9..4b28c0b12e 100644
--- a/lib/edoc/src/edoc.hrl
+++ b/lib/edoc/src/edoc.hrl
@@ -15,7 +15,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% Author contact: carlsson.richard@gmail.com
diff --git a/lib/edoc/src/edoc_data.erl b/lib/edoc/src/edoc_data.erl
index b797d74a71..86273b8352 100644
--- a/lib/edoc/src/edoc_data.erl
+++ b/lib/edoc/src/edoc_data.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @private
diff --git a/lib/edoc/src/edoc_doclet.erl b/lib/edoc/src/edoc_doclet.erl
index 5961ca8cc0..9128c19a4d 100644
--- a/lib/edoc/src/edoc_doclet.erl
+++ b/lib/edoc/src/edoc_doclet.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 2003-2006 Richard Carlsson
diff --git a/lib/edoc/src/edoc_extract.erl b/lib/edoc/src/edoc_extract.erl
index 2d6cb04a6d..5c8c648319 100644
--- a/lib/edoc/src/edoc_extract.erl
+++ b/lib/edoc/src/edoc_extract.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 2001-2003 Richard Carlsson
diff --git a/lib/edoc/src/edoc_layout.erl b/lib/edoc/src/edoc_layout.erl
index ef57b7b084..41a0b193ec 100644
--- a/lib/edoc/src/edoc_layout.erl
+++ b/lib/edoc/src/edoc_layout.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/edoc/src/edoc_lib.erl b/lib/edoc/src/edoc_lib.erl
index cc0a8d0b94..8fbc83fa29 100644
--- a/lib/edoc/src/edoc_lib.erl
+++ b/lib/edoc/src/edoc_lib.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 2001-2003 Richard Carlsson
diff --git a/lib/edoc/src/edoc_macros.erl b/lib/edoc/src/edoc_macros.erl
index e1a54d5090..7c91cb0f57 100644
--- a/lib/edoc/src/edoc_macros.erl
+++ b/lib/edoc/src/edoc_macros.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @private
diff --git a/lib/edoc/src/edoc_refs.erl b/lib/edoc/src/edoc_refs.erl
index b9a9391053..9a45d5b0fa 100644
--- a/lib/edoc/src/edoc_refs.erl
+++ b/lib/edoc/src/edoc_refs.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @private
diff --git a/lib/edoc/src/edoc_report.erl b/lib/edoc/src/edoc_report.erl
index dc6320df6d..ce54e71538 100644
--- a/lib/edoc/src/edoc_report.erl
+++ b/lib/edoc/src/edoc_report.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @private
diff --git a/lib/edoc/src/edoc_run.erl b/lib/edoc/src/edoc_run.erl
index 261a649c70..d69bddc999 100644
--- a/lib/edoc/src/edoc_run.erl
+++ b/lib/edoc/src/edoc_run.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 2003 Richard Carlsson
diff --git a/lib/edoc/src/edoc_tags.erl b/lib/edoc/src/edoc_tags.erl
index 93f423b906..919159e125 100644
--- a/lib/edoc/src/edoc_tags.erl
+++ b/lib/edoc/src/edoc_tags.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @private
diff --git a/lib/edoc/src/edoc_types.erl b/lib/edoc/src/edoc_types.erl
index 5bb68e79fb..bd4a583b8e 100644
--- a/lib/edoc/src/edoc_types.erl
+++ b/lib/edoc/src/edoc_types.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @private
diff --git a/lib/edoc/src/edoc_types.hrl b/lib/edoc/src/edoc_types.hrl
index 3e5e91484f..3f502068af 100644
--- a/lib/edoc/src/edoc_types.hrl
+++ b/lib/edoc/src/edoc_types.hrl
@@ -15,7 +15,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% Author contact: carlsson.richard@gmail.com
diff --git a/lib/edoc/src/edoc_wiki.erl b/lib/edoc/src/edoc_wiki.erl
index 5d0d78bf3c..5d15bbcfcc 100644
--- a/lib/edoc/src/edoc_wiki.erl
+++ b/lib/edoc/src/edoc_wiki.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @private
diff --git a/lib/edoc/src/otpsgml_layout.erl b/lib/edoc/src/otpsgml_layout.erl
index 052c75b9d4..8458a52f2d 100644
--- a/lib/edoc/src/otpsgml_layout.erl
+++ b/lib/edoc/src/otpsgml_layout.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
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/eldap/vsn.mk b/lib/eldap/vsn.mk
index 721387d97d..1636b6bb6d 100644
--- a/lib/eldap/vsn.mk
+++ b/lib/eldap/vsn.mk
@@ -1 +1 @@
-ELDAP_VSN = 1.2.2
+ELDAP_VSN = 1.2.3
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, &amp;i, 2);
-ei_encode_atom(buf, &amp;i, "a");
-ei_encode_tuple_header(buf, &amp;i, 2);
-ei_encode_atom(buf, &amp;i, "b");
-ei_encode_tuple_header(buf, &amp;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, &amp;i, 3);
ei_encode_atom(buf, &amp;i, "c");
@@ -392,14 +539,13 @@ ei_encode_atom(buf, &amp;i, "d");
ei_encode_list_header(buf, &amp;i, 1);
ei_encode_atom(buf, &amp;i, "e");
ei_encode_atom(buf, &amp;i, "f");
-ei_encode_empty_list(buf, &amp;i);
- </pre>
+ei_encode_empty_list(buf, &amp;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(&amp;x, 1);
ei_x_encode_ulong(&amp;x, i); /* just an example */
}
-ei_x_encode_empty_list(&amp;x);
- </pre>
+ei_x_encode_empty_list(&amp;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(&amp;x, 2);
ei_x_encode_atom(&amp;x, "a");
ei_x_encode_string(&amp;x, "Apple");
ei_x_encode_atom(&amp;x, "b");
-ei_x_encode_string(&amp;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(&amp;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, &amp;i, 2);
+ei_encode_atom(buf, &amp;i, "a");
+ei_encode_tuple_header(buf, &amp;i, 2);
+ei_encode_atom(buf, &amp;i, "b");
+ei_encode_tuple_header(buf, &amp;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 "madonna@chivas.du.etx.ericsson.se"
+#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 "madonna@chivas.du.etx.ericsson.se"
-#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>&lt; 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-&gt;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-&gt;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-&gt;to</c> and
+ <c>msg-&gt;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-&gt;to</c> and
+ <c>msg-&gt;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="xyz@chivas.du.etx.ericsson.se"; /* 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&auml;cker</approved>
<checked>Torbj&ouml;rn T&ouml;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 &lt;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&auml;cker</approved>
<checked>Torbj&ouml;rn T&ouml;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>"c17@a.DNS.name"</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",
- "madonna@chivas.du.etx.ericsson.se",
- &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 "madonna@chivas.du.etx.ericsson.se"
#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>"c17@a.DNS.name"</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",
+ "madonna@chivas.du.etx.ericsson.se",
+ &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&auml;cker</approved>
<checked>Torbj&ouml;rn T&ouml;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>&lt;errno.h&gt;</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&auml;cker</approved>
<checked>Torbj&ouml;rn T&ouml;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&auml;cker</approved>
<checked>Torbj&ouml;rn T&ouml;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="xyz@chivas.du.etx.ericsson.se"; /* 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&auml;cker</approved>
<checked>Torbj&ouml;rn T&ouml;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 &gt; 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&auml;cker</approved>
<checked>Torbj&ouml;rn T&ouml;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> &lt; <c>term2</c>, or <c>1</c> if <c>term2</c> &lt;
+ <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 &lt; 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 &lt; 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/eunit/include/eunit.hrl b/lib/eunit/include/eunit.hrl
index 8a4cad1e7e..0f7a15f669 100644
--- a/lib/eunit/include/eunit.hrl
+++ b/lib/eunit/include/eunit.hrl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% Copyright (C) 2004-2006 Mickaël Rémond, Richard Carlsson
diff --git a/lib/eunit/src/eunit.erl b/lib/eunit/src/eunit.erl
index fbfd123c43..1009d76d5b 100644
--- a/lib/eunit/src/eunit.erl
+++ b/lib/eunit/src/eunit.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 2004-2009 Mickaël Rémond, Richard Carlsson
diff --git a/lib/eunit/src/eunit_autoexport.erl b/lib/eunit/src/eunit_autoexport.erl
index 7bb78f5ea8..a3eb64f9c8 100644
--- a/lib/eunit/src/eunit_autoexport.erl
+++ b/lib/eunit/src/eunit_autoexport.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/eunit/src/eunit_data.erl b/lib/eunit/src/eunit_data.erl
index cc002cb449..cea7bcd5c5 100644
--- a/lib/eunit/src/eunit_data.erl
+++ b/lib/eunit/src/eunit_data.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/eunit/src/eunit_lib.erl b/lib/eunit/src/eunit_lib.erl
index 9dbb4835f8..b19f50b990 100644
--- a/lib/eunit/src/eunit_lib.erl
+++ b/lib/eunit/src/eunit_lib.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 2004-2007 Mickaël Rémond, Richard Carlsson
diff --git a/lib/eunit/src/eunit_proc.erl b/lib/eunit/src/eunit_proc.erl
index 8bdf94c877..c6bb8bdbb3 100644
--- a/lib/eunit/src/eunit_proc.erl
+++ b/lib/eunit/src/eunit_proc.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/eunit/src/eunit_serial.erl b/lib/eunit/src/eunit_serial.erl
index da76064a53..bbda4400da 100644
--- a/lib/eunit/src/eunit_serial.erl
+++ b/lib/eunit/src/eunit_serial.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/eunit/src/eunit_server.erl b/lib/eunit/src/eunit_server.erl
index 387976eba1..e767822543 100644
--- a/lib/eunit/src/eunit_server.erl
+++ b/lib/eunit/src/eunit_server.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/eunit/src/eunit_striptests.erl b/lib/eunit/src/eunit_striptests.erl
index c6ade389ba..ae1a834662 100644
--- a/lib/eunit/src/eunit_striptests.erl
+++ b/lib/eunit/src/eunit_striptests.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/eunit/src/eunit_surefire.erl b/lib/eunit/src/eunit_surefire.erl
index 1b468551d8..a70b8bfd4c 100644
--- a/lib/eunit/src/eunit_surefire.erl
+++ b/lib/eunit/src/eunit_surefire.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Mickaël Rémond <mickael.remond@process-one.net>
diff --git a/lib/eunit/src/eunit_test.erl b/lib/eunit/src/eunit_test.erl
index 62d30b1930..f2b9fa46f2 100644
--- a/lib/eunit/src/eunit_test.erl
+++ b/lib/eunit/src/eunit_test.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/eunit/src/eunit_tests.erl b/lib/eunit/src/eunit_tests.erl
index 5dee1cb49e..7aadefb29f 100644
--- a/lib/eunit/src/eunit_tests.erl
+++ b/lib/eunit/src/eunit_tests.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/eunit/src/eunit_tty.erl b/lib/eunit/src/eunit_tty.erl
index f604ca5ba3..1fbc4edd45 100644
--- a/lib/eunit/src/eunit_tty.erl
+++ b/lib/eunit/src/eunit_tty.erl
@@ -10,7 +10,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @author Richard Carlsson <carlsson.richard@gmail.com>
diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl
index 9ef119ba46..226a5d0f61 100644
--- a/lib/hipe/cerl/erl_types.erl
+++ b/lib/hipe/cerl/erl_types.erl
@@ -4377,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;
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_call_elim.erl b/lib/hipe/icode/hipe_icode_call_elim.erl
index 6a22133962..71c709a7d1 100644
--- a/lib/hipe/icode/hipe_icode_call_elim.erl
+++ b/lib/hipe/icode/hipe_icode_call_elim.erl
@@ -46,7 +46,8 @@ cfg(IcodeSSA) ->
-spec elim_insn(icode_instr()) -> icode_instr().
elim_insn(Insn=#icode_call{'fun'={_,_,_}=MFA, args=Args, type=remote,
dstlist=[Dst=#icode_variable{
- annotation={type_anno, RetType, _}}]}) ->
+ annotation={type_anno, RetType, _}}],
+ continuation=[], fail_label=[]}) ->
Opaques = 'universe',
case erl_types:t_is_singleton(RetType, Opaques) of
true ->
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/main/hipe.erl b/lib/hipe/main/hipe.erl
index 6c525dd143..38a5a64398 100644
--- a/lib/hipe/main/hipe.erl
+++ b/lib/hipe/main/hipe.erl
@@ -635,44 +635,51 @@ run_compiler(Name, DisasmFun, IcodeFun, Opts0) ->
Opts = expand_basic_options(Opts0 ++ ?COMPILE_DEFAULTS),
?when_option(verbose, Opts, ?debug_msg("Compiling: ~p\n",[Name])),
?option_start_time("Compile", Opts),
- Res = run_compiler_1(DisasmFun, IcodeFun, Opts),
+ Res = run_compiler_1(Name, DisasmFun, IcodeFun, Opts),
?option_stop_time("Compile", Opts),
Res.
-run_compiler_1(DisasmFun, IcodeFun, Options) ->
+run_compiler_1(Name, DisasmFun, IcodeFun, Options) ->
Parent = self(),
{trap_exit,TrapExit} = process_info(Parent, trap_exit),
%% Spawn a compilation process CompProc. In case this process gets
%% killed, the trap_exit flag is restored to that of the Parent process.
process_flag(trap_exit, true),
- CompProc = spawn_link(fun () ->
- %% Compiler process
- set_architecture(Options),
- pre_init(Options),
- %% The full option expansion is not done
- %% until the DisasmFun returns.
- {Code, CompOpts} = DisasmFun(Options),
- Opts0 = expand_options(Options ++ CompOpts,
- get(hipe_target_arch)),
- Opts =
- case proplists:get_bool(to_llvm, Opts0) andalso
- not llvm_support_available() of
- true ->
- ?error_msg("No LLVM version 3.4 or greater "
- "found in $PATH; aborting "
- "native code compilation.\n", []),
- ?EXIT(cant_find_required_llvm_version);
- false ->
- Opts0
- end,
- check_options(Opts),
- ?when_option(verbose, Options,
- ?debug_msg("Options: ~p.\n",[Opts])),
- init(Opts),
- {Icode, WholeModule} = IcodeFun(Code, Opts),
- CompRes = compile_finish(Icode, WholeModule, Opts),
- compiler_return(CompRes, Parent)
- end),
+ CompProc =
+ spawn_link(
+ fun () ->
+ try
+ %% Compiler process
+ set_architecture(Options),
+ pre_init(Options),
+ %% The full option expansion is not done
+ %% until the DisasmFun returns.
+ {Code, CompOpts} = DisasmFun(Options),
+ Opts0 = expand_options(Options ++ CompOpts,
+ get(hipe_target_arch)),
+ Opts =
+ case proplists:get_bool(to_llvm, Opts0) andalso
+ not llvm_support_available() of
+ true ->
+ ?error_msg("No LLVM version 3.4 or greater "
+ "found in $PATH; aborting "
+ "native code compilation.\n", []),
+ ?EXIT(cant_find_required_llvm_version);
+ false ->
+ Opts0
+ end,
+ check_options(Opts),
+ ?when_option(verbose, Options,
+ ?debug_msg("Options: ~p.\n",[Opts])),
+ init(Opts),
+ {Icode, WholeModule} = IcodeFun(Code, Opts),
+ CompRes = compile_finish(Icode, WholeModule, Opts),
+ compiler_return(CompRes, Parent)
+ catch error:Error ->
+ print_crash_message(Name, Error),
+ exit(Error)
+ end
+ end),
Timeout = case proplists:get_value(timeout, Options) of
N when is_integer(N), N >= 0 -> N;
undefined -> ?DEFAULT_TIMEOUT;
@@ -691,7 +698,7 @@ run_compiler_1(DisasmFun, IcodeFun, Options) ->
exit(CompProc, kill),
receive {'EXIT', CompProc, _} -> ok end,
flush(),
- ?error_msg("ERROR: Compilation timed out.\n",[]),
+ ?error_msg("ERROR: Compilation of ~w timed out.\n",[Name]),
exit(timed_out)
end,
Result = receive {CompProc, Res} -> Res end,
@@ -844,11 +851,25 @@ finalize_fun_sequential({MFA, Icode}, Opts, Servers) ->
catch
error:Error ->
?when_option(verbose, Opts, ?debug_untagged_msg("\n", [])),
- ErrorInfo = {Error, erlang:get_stacktrace()},
- ?error_msg("ERROR: ~p~n", [ErrorInfo]),
- ?EXIT(ErrorInfo)
+ print_crash_message(MFA, Error),
+ exit(Error)
end.
+print_crash_message(What, Error) ->
+ StackFun = fun(_,_,_) -> false end,
+ FormatFun = fun (Term, _) -> io_lib:format("~p", [Term]) end,
+ StackTrace = lib:format_stacktrace(1, erlang:get_stacktrace(),
+ StackFun, FormatFun),
+ WhatS = case What of
+ {M,F,A} -> io_lib:format("~w:~w/~w", [M,F,A]);
+ Mod -> io_lib:format("~w", [Mod])
+ end,
+ ?error_msg("INTERNAL ERROR~n"
+ "while compiling ~s~n"
+ "crash reason: ~p~n"
+ "~s~n",
+ [WhatS, Error, StackTrace]).
+
pp_server_start(Opts) ->
set_architecture(Opts),
garbage_collect(),
diff --git a/lib/hipe/main/hipe.hrl.src b/lib/hipe/main/hipe.hrl.src
index 53b59f88f0..08bfd17f30 100644
--- a/lib/hipe/main/hipe.hrl.src
+++ b/lib/hipe/main/hipe.hrl.src
@@ -1,4 +1,4 @@
-%% -*- erlang-indent-level: 2 -*-
+%% -*- mode: erlang; erlang-indent-level: 2 -*-
%%
%% %CopyrightBegin%
%%
@@ -70,20 +70,24 @@
code_server:info_msg(?MSGTAG ++ Msg, Args)).
-define(untagged_msg(Msg, Args),
code_server:info_msg(Msg, Args)).
+-define(untagged_error_msg(Msg, Args),
+ code_server:error_msg(Msg, Args)).
-else.
-define(msg(Msg, Args),
io:format(?MSGTAG ++ Msg, Args)).
-define(untagged_msg(Msg, Args),
io:format(Msg, Args)).
+-define(untagged_error_msg(Msg, Args),
+ io:format(Msg, Args)).
-endif.
%%
%% Define error and warning messages.
%%
-define(error_msg(Msg, Args),
- code_server:error_msg(?MSGTAG ++
+ ?untagged_error_msg(?MSGTAG ++
"Error: [~s:~w]: " ++ Msg,
- [?MODULE,?LINE|Args])).
+ [?MODULE,?LINE|Args])).
-define(WARNING_MSG(Msg, Args),
?msg("Warning: [~s:~w]: " ++ Msg, [?MODULE,?LINE|Args])).
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 <pergu@it.uu.se>
%%% 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/hipe/test/maps_SUITE_data/maps_redundant_branch_is_key.erl b/lib/hipe/test/maps_SUITE_data/maps_redundant_branch_is_key.erl
new file mode 100644
index 0000000000..17c3acd6af
--- /dev/null
+++ b/lib/hipe/test/maps_SUITE_data/maps_redundant_branch_is_key.erl
@@ -0,0 +1,14 @@
+-module(maps_redundant_branch_is_key).
+-export([test/0]).
+
+test() ->
+ ok = thingy(#{a => 1}),
+ ok = thingy(#{a => 2}),
+ ok.
+
+thingy(Map) ->
+ try
+ #{a := _} = Map,
+ ok
+ catch _ -> error
+ end.
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/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 59cb1299e9..a09019f6ad 100644
--- a/lib/inets/src/http_client/httpc_handler.erl
+++ b/lib/inets/src/http_client/httpc_handler.erl
@@ -1749,14 +1749,16 @@ tls_tunnel(Address, Request, #state{session = #session{socket = Socket,
tls_tunnel_request(#request{headers = Headers,
settings = Options,
+ id = RequestId,
+ from = From,
address = {Host, Port}= Adress,
ipv6_host_with_brackets = IPV6}) ->
URI = Host ++":" ++ integer_to_list(Port),
#request{
- id = make_ref(),
- from = self(),
+ id = RequestId,
+ from = From,
scheme = http, %% Use tcp-first and then upgrade!
address = Adress,
path = URI,
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/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/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/inet.xml b/lib/kernel/doc/src/inet.xml
index d907cef7d3..4c4a5c39cb 100644
--- a/lib/kernel/doc/src/inet.xml
+++ b/lib/kernel/doc/src/inet.xml
@@ -987,11 +987,6 @@ setcap cap_sys_admin,cap_sys_ptrace,cap_dac_read_search+epi beam.smp</code>
<p>Sets the line delimiting character for line-oriented protocols
(<c>line</c>). Defaults to <c>$\n</c>.</p>
</item>
- <tag><c>{priority, Priority}</c></tag>
- <item>
- <p>Sets the protocol-defined priority for all packets to be sent
- on this socket.</p>
- </item>
<tag><c>{raw, Protocol, OptionNum, ValueBin}</c></tag>
<item>
<p>See below.</p>
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/megaco/test/megaco_app_test.erl b/lib/megaco/test/megaco_app_test.erl
index 346a123c66..981d93f5dd 100644
--- a/lib/megaco/test/megaco_app_test.erl
+++ b/lib/megaco/test/megaco_app_test.erl
@@ -17,8 +17,6 @@
%%
%% %CopyrightEnd%
%%
-
-%%
%%----------------------------------------------------------------------
%% Purpose: Verify the application specifics of the Megaco application
%%----------------------------------------------------------------------
@@ -26,296 +24,26 @@
-compile(export_all).
--include("megaco_test_lib.hrl").
-
-
-t() -> megaco_test_lib:t(?MODULE).
-t(Case) -> megaco_test_lib:t({?MODULE, Case}).
-
-
-%% Test server callbacks
-init_per_testcase(undef_funcs = Case, Config) ->
- NewConfig = [{tc_timeout, ?MINUTES(10)} | Config],
- megaco_test_lib:init_per_testcase(Case, NewConfig);
-init_per_testcase(Case, Config) ->
- megaco_test_lib:init_per_testcase(Case, Config).
-
-end_per_testcase(Case, Config) ->
- megaco_test_lib:end_per_testcase(Case, Config).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-include_lib("common_test/include/ct.hrl").
+%%--------------------------------------------------------------------
+%% Common Test interface functions -----------------------------------
+%%--------------------------------------------------------------------
all() ->
[
- fields,
- modules,
- exportall,
- app_depend,
- undef_funcs
+ app,
+ appup
].
-groups() ->
- [].
-
-init_per_group(_GroupName, Config) ->
- Config.
-
-end_per_group(_GroupName, Config) ->
- Config.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-init_per_suite(suite) -> [];
-init_per_suite(doc) -> [];
-init_per_suite(Config) when is_list(Config) ->
- case is_app(megaco) of
- {ok, AppFile} ->
- io:format("AppFile: ~n~p~n", [AppFile]),
- case megaco_flex_scanner:is_enabled() of
- true ->
- case megaco_flex_scanner:is_reentrant_enabled() of
- true ->
- io:format("~nMegaco reentrant flex scanner enabled~n~n", []);
- false ->
- io:format("~nMegaco non-reentrant flex scanner enabled~n~n", [])
- end;
- false ->
- io:format("~nMegaco flex scanner disabled~n~n", [])
- end,
- megaco:print_version_info(),
- [{app_file, AppFile}|Config];
- {error, Reason} ->
- fail(Reason)
- end.
-
-is_app(App) ->
- LibDir = code:lib_dir(App),
- File = filename:join([LibDir, "ebin", atom_to_list(App) ++ ".app"]),
- case file:consult(File) of
- {ok, [{application, App, AppFile}]} ->
- {ok, AppFile};
- {error, {LineNo, Mod, Code}} ->
- IoList = lists:concat([File, ":", LineNo, ": ",
- Mod:format_error(Code)]),
- {error, list_to_atom(lists:flatten(IoList))};
- Error ->
- {error, {invalid_format, Error}}
- end.
-
-
-end_per_suite(suite) -> [];
-end_per_suite(doc) -> [];
-end_per_suite(Config) when is_list(Config) ->
- Config.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-fields(suite) ->
- [];
-fields(doc) ->
- [];
-fields(Config) when is_list(Config) ->
- AppFile = key1search(app_file, Config),
- Fields = [vsn, description, modules, registered, applications],
- case check_fields(Fields, AppFile, []) of
- [] ->
- ok;
- Missing ->
- fail({missing_fields, Missing})
- end.
-
-check_fields([], _AppFile, Missing) ->
- Missing;
-check_fields([Field|Fields], AppFile, Missing) ->
- check_fields(Fields, AppFile, check_field(Field, AppFile, Missing)).
-
-check_field(Name, AppFile, Missing) ->
- io:format("checking field: ~p~n", [Name]),
- case lists:keymember(Name, 1, AppFile) of
- true ->
- Missing;
- false ->
- [Name|Missing]
- end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-modules(suite) ->
- [];
-modules(doc) ->
- [];
-modules(Config) when is_list(Config) ->
- AppFile = key1search(app_file, Config),
- Mods = key1search(modules, AppFile),
- EbinList = get_ebin_mods(megaco),
- case missing_modules(Mods, EbinList, []) of
- [] ->
- ok;
- Missing ->
- throw({error, {missing_modules, Missing}})
- end,
- case extra_modules(Mods, EbinList, []) of
- [] ->
- ok;
- Extra ->
- throw({error, {extra_modules, Extra}})
- end,
- {ok, Mods}.
-
-get_ebin_mods(App) ->
- LibDir = code:lib_dir(App),
- EbinDir = filename:join([LibDir,"ebin"]),
- {ok, Files0} = file:list_dir(EbinDir),
- Files1 = [lists:reverse(File) || File <- Files0],
- [list_to_atom(lists:reverse(Name)) || [$m,$a,$e,$b,$.|Name] <- Files1].
-
-
-missing_modules([], _Ebins, Missing) ->
- Missing;
-missing_modules([Mod|Mods], Ebins, Missing) ->
- case lists:member(Mod, Ebins) of
- true ->
- missing_modules(Mods, Ebins, Missing);
- false ->
- io:format("missing module: ~p~n", [Mod]),
- missing_modules(Mods, Ebins, [Mod|Missing])
- end.
-
-
-extra_modules(_Mods, [], Extra) ->
- Extra;
-extra_modules(Mods, [Mod|Ebins], Extra) ->
- case lists:member(Mod, Mods) of
- true ->
- extra_modules(Mods, Ebins, Extra);
- false ->
- io:format("supefluous module: ~p~n", [Mod]),
- extra_modules(Mods, Ebins, [Mod|Extra])
- end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-exportall(suite) ->
- [];
-exportall(doc) ->
- [];
-exportall(Config) when is_list(Config) ->
- AppFile = key1search(app_file, Config),
- Mods = key1search(modules, AppFile),
- check_export_all(Mods).
-
-
-check_export_all([]) ->
- ok;
-check_export_all([Mod|Mods]) ->
- case (catch apply(Mod, module_info, [compile])) of
- {'EXIT', {undef, _}} ->
- check_export_all(Mods);
- O ->
- case lists:keysearch(options, 1, O) of
- false ->
- check_export_all(Mods);
- {value, {options, List}} ->
- case lists:member(export_all, List) of
- true ->
- throw({error, {export_all, Mod}});
- false ->
- check_export_all(Mods)
- end
- end
- end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-app_depend(suite) ->
- [];
-app_depend(doc) ->
- [];
-app_depend(Config) when is_list(Config) ->
- AppFile = key1search(app_file, Config),
- Apps = key1search(applications, AppFile),
- check_apps(Apps).
-
-
-check_apps([]) ->
- ok;
-check_apps([App|Apps]) ->
- case is_app(App) of
- {ok, _} ->
- check_apps(Apps);
- Error ->
- throw({error, {missing_app, {App, Error}}})
- end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-undef_funcs(suite) ->
- [];
-undef_funcs(doc) ->
- [];
-undef_funcs(Config) when is_list(Config) ->
- App = megaco,
- AppFile = key1search(app_file, Config),
- Mods = key1search(modules, AppFile),
- Root = code:root_dir(),
- LibDir = code:lib_dir(App),
- EbinDir = filename:join([LibDir,"ebin"]),
- XRefTestName = undef_funcs_make_name(App, xref_test_name),
- {ok, XRef} = xref:start(XRefTestName),
- ok = xref:set_default(XRef,
- [{verbose,false},{warnings,false}]),
- XRefName = undef_funcs_make_name(App, xref_name),
- {ok, XRefName} = xref:add_release(XRef, Root, {name,XRefName}),
- {ok, App} = xref:replace_application(XRef, App, EbinDir),
- {ok, Undefs} = xref:analyze(XRef, undefined_function_calls),
- xref:stop(XRef),
- analyze_undefined_function_calls(Undefs, Mods, []).
-
-analyze_undefined_function_calls([], _, []) ->
- ok;
-analyze_undefined_function_calls([], _, AppUndefs) ->
- exit({suite_failed, {undefined_function_calls, AppUndefs}});
-analyze_undefined_function_calls([{{Mod, _F, _A}, _C} = AppUndef|Undefs],
- AppModules, AppUndefs) ->
- %% Check that this module is our's
- case lists:member(Mod,AppModules) of
- true ->
- {Calling,Called} = AppUndef,
- {Mod1,Func1,Ar1} = Calling,
- {Mod2,Func2,Ar2} = Called,
- io:format("undefined function call: "
- "~n ~w:~w/~w calls ~w:~w/~w~n",
- [Mod1,Func1,Ar1,Mod2,Func2,Ar2]),
- analyze_undefined_function_calls(Undefs, AppModules,
- [AppUndef|AppUndefs]);
- false ->
- io:format("dropping ~p~n", [Mod]),
- analyze_undefined_function_calls(Undefs, AppModules, AppUndefs)
- end.
-
-%% This function is used simply to avoid cut-and-paste errors later...
-undef_funcs_make_name(App, PostFix) ->
- list_to_atom(atom_to_list(App) ++ "_" ++ atom_to_list(PostFix)).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-fail(Reason) ->
- exit({suite_failed, Reason}).
-
-key1search(Key, L) ->
- case lists:keysearch(Key, 1, L) of
- undefined ->
- fail({not_found, Key, L});
- {value, {Key, Value}} ->
- Value
- end.
+%%--------------------------------------------------------------------
+%% Test Cases --------------------------------------------------------
+%%--------------------------------------------------------------------
+app() ->
+ [{doc, "Test that the megaco app file is ok"}].
+app(Config) when is_list(Config) ->
+ ok = test_server:app_test(megaco).
+%%--------------------------------------------------------------------
+appup() ->
+ [{doc, "Test that the megaco appup file is ok"}].
+appup(Config) when is_list(Config) ->
+ ok = test_server:appup_test(megaco).
diff --git a/lib/megaco/test/megaco_appup_test.erl b/lib/megaco/test/megaco_appup_test.erl
index 325e7a6096..8dc3ad51a0 100644
--- a/lib/megaco/test/megaco_appup_test.erl
+++ b/lib/megaco/test/megaco_appup_test.erl
@@ -17,8 +17,6 @@
%%
%% %CopyrightEnd%
%%
-
-%%
%%----------------------------------------------------------------------
%% Purpose: Verify the application specifics of the Megaco application
%%----------------------------------------------------------------------
@@ -27,26 +25,18 @@
-compile(export_all).
-compile({no_auto_import,[error/1]}).
+-include_lib("common_test/include/ct.hrl").
-include("megaco_test_lib.hrl").
--define(APPLICATION, megaco).
-
-t() -> megaco_test_lib:t(?MODULE).
-t(Case) -> megaco_test_lib:t({?MODULE, Case}).
-
-
-%% Test server callbacks
-init_per_testcase(Case, Config) ->
- megaco_test_lib:init_per_testcase(Case, Config).
-
-end_per_testcase(Case, Config) ->
- megaco_test_lib:end_per_testcase(Case, Config).
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
all() ->
- [appup].
+ Cases =
+ [
+ appup_file
+ ],
+ Cases.
groups() ->
[].
@@ -64,16 +54,9 @@ end_per_group(_GroupName, Config) ->
init_per_suite(suite) -> [];
init_per_suite(doc) -> [];
init_per_suite(Config) when is_list(Config) ->
- AppFile = file_name(?APPLICATION, ".app"),
- AppupFile = file_name(?APPLICATION, ".appup"),
- [{app_file, AppFile}, {appup_file, AppupFile}|Config].
+ Config.
-file_name(App, Ext) ->
- LibDir = code:lib_dir(App),
- filename:join([LibDir, "ebin", atom_to_list(App) ++ Ext]).
-
-
end_per_suite(suite) -> [];
end_per_suite(doc) -> [];
end_per_suite(Config) when is_list(Config) ->
@@ -82,468 +65,17 @@ end_per_suite(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-appup(suite) ->
- [];
-appup(doc) ->
- "perform a simple check of the appup file";
-appup(Config) when is_list(Config) ->
- AppupFile = key1search(appup_file, Config),
- AppFile = key1search(app_file, Config),
- Modules = modules(AppFile),
- check_appup(AppupFile, Modules).
-
-modules(File) ->
- case file:consult(File) of
- {ok, [{application,megaco,Info}]} ->
- case lists:keysearch(modules,1,Info) of
- {value, {modules, Modules}} ->
- Modules;
- false ->
- fail({bad_appinfo, Info})
- end;
- Error ->
- fail({bad_appfile, Error})
- end.
-
-
-check_appup(AppupFile, Modules) ->
- case file:consult(AppupFile) of
- {ok, [{V, UpFrom, DownTo}]} ->
- check_appup(V, UpFrom, DownTo, Modules);
- Else ->
- fail({bad_appupfile, Else})
- end.
-
-
-check_appup(V, UpFrom, DownTo, Modules) ->
- check_version(V),
- check_depends(up, UpFrom, Modules),
- check_depends(down, DownTo, Modules),
- check_module_subset(UpFrom),
- check_module_subset(DownTo),
- ok.
-
-
-check_depends(_, [], _) ->
- ok;
-check_depends(UpDown, [Dep|Deps], Modules) ->
- check_depend(UpDown, Dep, Modules),
- check_depends(UpDown, Deps, Modules).
-
-
-check_depend(up = UpDown, {add_application, ?APPLICATION} = Instr, Modules) ->
- d("check_instructions(~w) -> entry with"
- "~n Instruction: ~p"
- "~n Modules: ~p", [UpDown, Instr, Modules]),
- ok;
-check_depend(down = UpDown, {remove_application, ?APPLICATION} = Instr,
- Modules) ->
- d("check_instructions(~w) -> entry with"
- "~n Instruction: ~p"
- "~n Modules: ~p", [UpDown, Instr, Modules]),
- ok;
-check_depend(UpDown, {V, Instructions}, Modules) ->
- d("check_instructions(~w) -> entry with"
- "~n V: ~p"
- "~n Modules: ~p", [UpDown, V, Modules]),
- check_version(V),
- case check_instructions(UpDown,
- Instructions, Instructions, [], [], Modules) of
- {_Good, []} ->
- ok;
- {_, Bad} ->
- fail({bad_instructions, Bad, UpDown})
- end.
-
-
-check_instructions(_, [], _, Good, Bad, _) ->
- {lists:reverse(Good), lists:reverse(Bad)};
-check_instructions(UpDown, [Instr|Instrs], AllInstr, Good, Bad, Modules) ->
- d("check_instructions(~w) -> entry with"
- "~n Instr: ~p", [UpDown,Instr]),
- case (catch check_instruction(UpDown, Instr, AllInstr, Modules)) of
- ok ->
- check_instructions(UpDown, Instrs, AllInstr,
- [Instr|Good], Bad, Modules);
- {error, Reason} ->
- d("check_instructions(~w) -> bad instruction: "
- "~n Reason: ~p", [UpDown,Reason]),
- check_instructions(UpDown, Instrs, AllInstr, Good,
- [{Instr, Reason}|Bad], Modules)
- end.
-
-%% A new module is added
-check_instruction(up, {add_module, Module}, _, Modules)
- when is_atom(Module) ->
- d("check_instruction -> entry when up-add_module instruction with"
- "~n Module: ~p", [Module]),
- check_module(Module, Modules);
-
-%% An old module is re-added
-check_instruction(down, {add_module, Module}, _, Modules)
- when is_atom(Module) ->
- d("check_instruction -> entry when down-add_module instruction with"
- "~n Module: ~p", [Module]),
- case (catch check_module(Module, Modules)) of
- {error, {unknown_module, Module, Modules}} ->
- ok;
- ok ->
- error({existing_readded_module, Module})
- end;
-
-%% Removing a module on upgrade:
-%% - the module has been removed from the app-file.
-%% - check that no module depends on this (removed) module
-check_instruction(up, {remove, {Module, Pre, Post}}, _, Modules)
- when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) ->
- d("check_instruction -> entry when up-remove instruction with"
- "~n Module: ~p"
- "~n Pre: ~p"
- "~n Post: ~p", [Module, Pre, Post]),
- case (catch check_module(Module, Modules)) of
- {error, {unknown_module, Module, Modules}} ->
- check_purge(Pre),
- check_purge(Post);
- ok ->
- error({existing_removed_module, Module})
- end;
-
-%% Removing a module on downgrade: the module exist
-%% in the app-file.
-check_instruction(down, {remove, {Module, Pre, Post}}, AllInstr, Modules)
- when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) ->
- d("check_instruction -> entry when down-remove instruction with"
- "~n Module: ~p"
- "~n Pre: ~p"
- "~n Post: ~p", [Module, Pre, Post]),
- case (catch check_module(Module, Modules)) of
- ok ->
- check_purge(Pre),
- check_purge(Post),
- check_no_remove_depends(Module, AllInstr);
- {error, {unknown_module, Module, Modules}} ->
- error({nonexisting_removed_module, Module})
- end;
-
-check_instruction(_, {load_module, Module, Pre, Post, Depend},
- AllInstr, Modules)
- when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) andalso is_list(Depend) ->
- d("check_instruction -> entry when load_module instruction with"
- "~n Module: ~p"
- "~n Pre: ~p"
- "~n Post: ~p"
- "~n Depend: ~p", [Module, Pre, Post, Depend]),
- check_module(Module, Modules),
- check_module_depend(Module, Depend, Modules),
- check_module_depend(Module, Depend, updated_modules(AllInstr, [])),
- check_purge(Pre),
- check_purge(Post);
-
-check_instruction(_, {update, Module, Change, Pre, Post, Depend},
- AllInstr, Modules)
- when is_atom(Module) andalso is_atom(Pre) andalso is_atom(Post) andalso is_list(Depend) ->
- d("check_instruction -> entry when update instruction with"
- "~n Module: ~p"
- "~n Change: ~p"
- "~n Pre: ~p"
- "~n Post: ~p"
- "~n Depend: ~p", [Module, Change, Pre, Post, Depend]),
- check_module(Module, Modules),
- check_module_depend(Module, Depend, Modules),
- check_module_depend(Module, Depend, updated_modules(AllInstr, [])),
- check_change(Change),
- check_purge(Pre),
- check_purge(Post);
-
-check_instruction(_, {update, Module, supervisor}, _, Modules)
- when is_atom(Module) ->
- check_module(Module, Modules);
-
-check_instruction(_, {apply, {Module, Function, Args}}, _, Modules)
- when is_atom(Module) andalso is_atom(Function) andalso is_list(Args) ->
- d("check_instruction -> entry when down-apply instruction with"
- "~n Module: ~p"
- "~n Function: ~p"
- "~n Args: ~p", [Module, Function, Args]),
- check_module(Module, Modules),
- check_apply(Module, Function, Args);
-
-check_instruction(_, {restart_application, ?APPLICATION}, _AllInstr, _Modules) ->
- ok;
-
-check_instruction(_, Instr, _AllInstr, _Modules) ->
- d("check_instruction -> entry when unknown instruction with"
- "~n Instr: ~p", [Instr]),
- error({error, {unknown_instruction, Instr}}).
-
-
-%% If Module X depends on Module Y, then module Y must have an update
-%% instruction of some sort (otherwise the depend is faulty).
-updated_modules([], Modules) ->
- d("update_modules -> entry when done with"
- "~n Modules: ~p", [Modules]),
- Modules;
-updated_modules([Instr|Instrs], Modules) ->
- d("update_modules -> entry with"
- "~n Instr: ~p"
- "~n Modules: ~p", [Instr,Modules]),
- Module = instruction_module(Instr),
- d("update_modules -> Module: ~p", [Module]),
- updated_modules(Instrs, [Module|Modules]).
-
-instruction_module({add_module, Module}) ->
- Module;
-instruction_module({remove, {Module, _, _}}) ->
- Module;
-instruction_module({load_module, Module, _, _, _}) ->
- Module;
-instruction_module({update, Module, _, _, _, _}) ->
- Module;
-instruction_module({apply, {Module, _, _}}) ->
- Module;
-instruction_module(Instr) ->
- d("instruction_module -> entry when unknown instruction with"
- "~n Instr: ~p", [Instr]),
- error({error, {unknown_instruction, Instr}}).
-
-
-%% Check that the modules handled in an instruction set for version X
-%% is a subset of the instruction set for version X-1.
-check_module_subset(Instructions) ->
- %% io:format("check_module_subset -> "
- %% "~n Instructions: ~p"
- %% "~n", [Instructions]),
- do_check_module_subset(modules_of(Instructions)).
-
-do_check_module_subset([]) ->
- ok;
-do_check_module_subset([_]) ->
- ok;
-do_check_module_subset([{_V1, Mods1}|T]) ->
- %% io:format("do_check_module_subset -> "
- %% "~n V1: ~p"
- %% "~n Mods1: ~p"
- %% "~n T: ~p"
- %% "~n", [_V1, Mods1, T]),
- {V2, Mods2} = hd(T),
- %% Check that the modules in V1 is a subset of V2
- case do_check_module_subset2(Mods1, Mods2) of
- ok ->
- do_check_module_subset(T);
- {error, Modules} ->
- fail({subset_missing_instructions, V2, Modules})
- end.
-
-do_check_module_subset2(Mods1, Mods2) ->
- do_check_module_subset2(Mods1, Mods2, []).
-
-do_check_module_subset2([], _, []) ->
- ok;
-do_check_module_subset2([], _, Acc) ->
- {error, lists:reverse(Acc)};
-do_check_module_subset2([Mod|Mods], Mods2, Acc) ->
- case lists:member(Mod, Mods2) of
- true ->
- do_check_module_subset2(Mods, Mods2, Acc);
- false ->
- do_check_module_subset2(Mods, Mods2, [Mod|Acc])
- end.
-
-
-modules_of(Instructions) ->
- modules_of(Instructions, []).
-
-modules_of([], Acc) ->
- lists:reverse(Acc);
-modules_of([{V,Instructions}|T], Acc) ->
- %% io:format("modules_of -> "
- %% "~n V: ~p"
- %% "~n Instructions: ~p"
- %% "~n", [V, Instructions]),
- case modules_of2(Instructions, []) of
- Mods when is_list(Mods) ->
- %% io:format("modules_of -> "
- %% "~n Mods: ~p"
- %% "~n", [Mods]),
- modules_of(T, [{V, Mods}|Acc]);
- skip ->
- %% io:format("modules_of -> skip"
- %% "~n", []),
- modules_of(T, Acc)
- end.
-
-modules_of2([], Acc) ->
- lists:reverse(Acc);
-modules_of2([Instr|Instructions], Acc) ->
- case module_of(Instr) of
- {value, Mod} ->
- modules_of2(Instructions, [Mod|Acc]);
- skip ->
- skip;
- false ->
- modules_of2(Instructions, Acc)
- end.
-
-module_of({add_module, Module}) ->
- {value, Module};
-module_of({remove, {Module, _Pre, _Post}}) ->
- {value, Module};
-module_of({load_module, Module, _Pre, _Post, _Depend}) ->
- {value, Module};
-module_of({update, Module, _Change, _Pre, _Post, _Depend}) ->
- {value, Module};
-module_of({restart_application, _App}) ->
- skip;
-module_of(_) ->
- false.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%% The version is a string consting of numbers separated by dots: "."
-%% Example: "3.3.3"
-%%
-check_version(V) when is_list(V) ->
- case do_check_version(string:tokens(V, [$.])) of
- ok ->
- ok;
- {error, BadVersionPart} ->
- throw({error, {bad_version, V, BadVersionPart}})
- end;
-check_version(V) ->
- error({bad_version, V}).
-
-do_check_version([]) ->
- ok;
-do_check_version([H|T]) ->
- case (catch list_to_integer(H)) of
- I when is_integer(I) ->
- do_check_version(T);
- _ ->
- {error, H}
- end.
-
-check_module(M, Modules) when is_atom(M) ->
- case lists:member(M,Modules) of
- true ->
- ok;
- false ->
- error({unknown_module, M, Modules})
- end;
-check_module(M, _) ->
- error({bad_module, M}).
-
-
-check_module_depend(M, [], _) when is_atom(M) ->
- d("check_module_depend -> entry with"
- "~n M: ~p", [M]),
- ok;
-check_module_depend(M, Deps, Modules) when is_atom(M) andalso is_list(Deps) ->
- d("check_module_depend -> entry with"
- "~n M: ~p"
- "~n Deps: ~p"
- "~n Modules: ~p", [M, Deps, Modules]),
- case [Dep || Dep <- Deps, lists:member(Dep, Modules) == false] of
- [] ->
- ok;
- Unknown ->
- error({unknown_depend_modules, Unknown})
- end;
-check_module_depend(_M, D, _Modules) ->
- d("check_module_depend -> entry when bad depend with"
- "~n D: ~p", [D]),
- error({bad_depend, D}).
-
-
-check_no_remove_depends(_Module, []) ->
- ok;
-check_no_remove_depends(Module, [Instr|Instrs]) ->
- check_no_remove_depend(Module, Instr),
- check_no_remove_depends(Module, Instrs).
-
-check_no_remove_depend(Module, {load_module, Mod, _Pre, _Post, Depend}) ->
- case lists:member(Module, Depend) of
- true ->
- error({removed_module_in_depend, load_module, Mod, Module});
- false ->
- ok
- end;
-check_no_remove_depend(Module, {update, Mod, _Change, _Pre, _Post, Depend}) ->
- case lists:member(Module, Depend) of
- true ->
- error({removed_module_in_depend, update, Mod, Module});
- false ->
- ok
- end;
-check_no_remove_depend(_, _) ->
- ok.
-
-
-check_change(soft) ->
- ok;
-check_change({advanced, _Something}) ->
- ok;
-check_change(Change) ->
- error({bad_change, Change}).
-
-
-check_purge(soft_purge) ->
- ok;
-check_purge(brutal_purge) ->
- ok;
-check_purge(Purge) ->
- error({bad_purge, Purge}).
-
-
-check_apply(Module, Function, Args) ->
- case (catch Module:module_info()) of
- Info when is_list(Info) ->
- check_exported(Function, Args, Info);
- {'EXIT', {undef, _}} ->
- error({not_existing_module, Module})
- end.
-
-check_exported(Function, Args, Info) ->
- case lists:keysearch(exports, 1, Info) of
- {value, {exports, FuncList}} ->
- Arity = length(Args),
- Arities = [A || {F, A} <- FuncList, F == Function],
- case lists:member(Arity, Arities) of
- true ->
- ok;
- false ->
- error({not_exported_function, Function, Arity})
- end;
- _ ->
- error({bad_export, Info})
- end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-error(Reason) ->
- throw({error, Reason}).
-
-fail(Reason) ->
- exit({suite_failed, Reason}).
+%% Test server callbacks
+init_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
-key1search(Key, L) ->
- case lists:keysearch(Key, 1, L) of
- undefined ->
- fail({not_found, Key, L});
- {value, {Key, Value}} ->
- Value
- end.
+end_per_testcase(_Case, Config) when is_list(Config) ->
+ Config.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-d(F, A) ->
- d(false, F, A).
+%% Perform a simple check of the appup file
+appup_file(Config) when is_list(Config) ->
+ ok = ?t:appup_test(megaco).
-d(true, F, A) ->
- io:format(F ++ "~n", A);
-d(_, _, _) ->
- ok.
-
-
diff --git a/lib/megaco/vsn.mk b/lib/megaco/vsn.mk
index b95cd66a81..87a8151dbc 100644
--- a/lib/megaco/vsn.mk
+++ b/lib/megaco/vsn.mk
@@ -19,6 +19,6 @@
# %CopyrightEnd%
APPLICATION = megaco
-MEGACO_VSN = 3.18.1
+MEGACO_VSN = 3.18.2
PRE_VSN =
APP_VSN = "$(APPLICATION)-$(MEGACO_VSN)$(PRE_VSN)"
diff --git a/lib/mnesia/src/mnesia.erl b/lib/mnesia/src/mnesia.erl
index 5bf2fc2dc3..34efeca4fa 100644
--- a/lib/mnesia/src/mnesia.erl
+++ b/lib/mnesia/src/mnesia.erl
@@ -1882,9 +1882,10 @@ any_table_info(Tab, Item) when is_atom(Tab) ->
[] ->
abort({no_exists, Tab, Item});
Props ->
- lists:map(fun({setorbag, Type}) -> {type, Type};
- (Prop) -> Prop end,
- Props)
+ Rename = fun ({setorbag, Type}) -> {type, Type};
+ (Prop) -> Prop
+ end,
+ lists:sort(lists:map(Rename, Props))
end;
name ->
Tab;
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..305bf14bcf 100644
--- a/lib/mnesia/src/mnesia_tm.erl
+++ b/lib/mnesia/src/mnesia_tm.erl
@@ -80,6 +80,7 @@ start() ->
init(Parent) ->
register(?MODULE, self()),
process_flag(trap_exit, true),
+ process_flag(message_queue_data, off_heap),
%% Initialize the schema
IgnoreFallback = mnesia_monitor:get_env(ignore_fallback_at_startup),
@@ -950,7 +951,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/observer/priv/bin/cdv b/lib/observer/priv/bin/cdv
index 1c44785ac2..d14fd47e41 100755
--- a/lib/observer/priv/bin/cdv
+++ b/lib/observer/priv/bin/cdv
@@ -1,4 +1,4 @@
#!/bin/sh
-erl -sname cdv -noinput -s crashdump_viewer script_start $@
+erl -noinput -s crashdump_viewer script_start $@
diff --git a/lib/observer/priv/bin/cdv.bat b/lib/observer/priv/bin/cdv.bat
index efa8bf8687..18136a30d6 100644
--- a/lib/observer/priv/bin/cdv.bat
+++ b/lib/observer/priv/bin/cdv.bat
@@ -1,2 +1,2 @@
@ECHO OFF
-CALL werl -sname cdv -s crashdump_viewer script_start %*
+CALL werl -s crashdump_viewer script_start %*
diff --git a/lib/observer/priv/crashdump_viewer.tool b/lib/observer/priv/crashdump_viewer.tool
deleted file mode 100644
index b6bd6bbdef..0000000000
--- a/lib/observer/priv/crashdump_viewer.tool
+++ /dev/null
@@ -1,2 +0,0 @@
-{version,"1.2"}.
-[{config_func,{crashdump_viewer,configData,[]}}].
diff --git a/lib/observer/priv/crashdump_viewer/collapsd.gif b/lib/observer/priv/crashdump_viewer/collapsd.gif
deleted file mode 100644
index 0b90c08a9a..0000000000
--- a/lib/observer/priv/crashdump_viewer/collapsd.gif
+++ /dev/null
Binary files differ
diff --git a/lib/observer/priv/crashdump_viewer/exploded.gif b/lib/observer/priv/crashdump_viewer/exploded.gif
deleted file mode 100644
index e3ab5ca2e9..0000000000
--- a/lib/observer/priv/crashdump_viewer/exploded.gif
+++ /dev/null
Binary files differ
diff --git a/lib/observer/src/Makefile b/lib/observer/src/Makefile
index dd7831fa2b..ff2bcbdb99 100644
--- a/lib/observer/src/Makefile
+++ b/lib/observer/src/Makefile
@@ -92,7 +92,7 @@ EXAMPLE_FILES= multitrace.erl
TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
PRIVDIR= ../priv
-WEBTOOLFILES= $(PRIVDIR)/crashdump_viewer.tool $(PRIVDIR)/erlang_observer.png
+PNGFILES= $(PRIVDIR)/erlang_observer.png
BINDIR= $(PRIVDIR)/bin
ifeq ($(findstring win32,$(TARGET)),win32)
WIN32_EXECUTABLES= $(BINDIR)/etop.bat $(BINDIR)/cdv.bat
@@ -103,10 +103,6 @@ EXECUTABLES= \
$(BINDIR)/etop \
$(BINDIR)/cdv \
$(WIN32_EXECUTABLES)
-CDVDIR= $(PRIVDIR)/crashdump_viewer
-GIF_FILES= \
- $(CDVDIR)/collapsd.gif \
- $(CDVDIR)/exploded.gif
APP_FILE= observer.app
@@ -163,9 +159,7 @@ release_spec: opt
$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
$(INSTALL_DIR) "$(RELSYSDIR)/priv/bin"
$(INSTALL_SCRIPT) $(EXECUTABLES) "$(RELSYSDIR)/priv/bin"
- $(INSTALL_DIR) "$(RELSYSDIR)/priv/crashdump_viewer"
- $(INSTALL_DATA) $(WEBTOOLFILES) "$(RELSYSDIR)/priv"
- $(INSTALL_DATA) $(GIF_FILES) "$(RELSYSDIR)/priv/crashdump_viewer"
+ $(INSTALL_DATA) $(PNGFILES) "$(RELSYSDIR)/priv"
release_docs_spec:
diff --git a/lib/observer/src/cdv_ets_cb.erl b/lib/observer/src/cdv_ets_cb.erl
index 52a90b093b..ddd2d42df6 100644
--- a/lib/observer/src/cdv_ets_cb.erl
+++ b/lib/observer/src/cdv_ets_cb.erl
@@ -34,10 +34,8 @@
-define(COL_NAME, ?COL_ID+1).
-define(COL_SLOT, ?COL_NAME+1).
-define(COL_OWNER, ?COL_SLOT+1).
--define(COL_BUCK, ?COL_OWNER+1).
--define(COL_OBJ, ?COL_BUCK+1).
+-define(COL_OBJ, ?COL_OWNER+1).
-define(COL_MEM, ?COL_OBJ+1).
--define(COL_TYPE, ?COL_MEM+1).
%% Callbacks for cdv_virtual_list_wx
col_to_elem(id) -> col_to_elem(?COL_ID);
@@ -45,8 +43,6 @@ col_to_elem(?COL_ID) -> #ets_table.id;
col_to_elem(?COL_NAME) -> #ets_table.name;
col_to_elem(?COL_SLOT) -> #ets_table.slot;
col_to_elem(?COL_OWNER) -> #ets_table.pid;
-col_to_elem(?COL_TYPE) -> #ets_table.data_type;
-col_to_elem(?COL_BUCK) -> #ets_table.buckets;
col_to_elem(?COL_OBJ) -> #ets_table.size;
col_to_elem(?COL_MEM) -> #ets_table.memory.
@@ -57,7 +53,6 @@ col_spec() ->
{"Owner", ?wxLIST_FORMAT_CENTRE, 120},
{"Objects", ?wxLIST_FORMAT_RIGHT, 80},
{"Memory", ?wxLIST_FORMAT_RIGHT, 80}
-% {"Type", ?wxLIST_FORMAT_LEFT, 50}
].
get_info(Owner) ->
diff --git a/lib/observer/src/cdv_mem_cb.erl b/lib/observer/src/cdv_mem_cb.erl
index ba972d6963..abeddc7335 100644
--- a/lib/observer/src/cdv_mem_cb.erl
+++ b/lib/observer/src/cdv_mem_cb.erl
@@ -77,6 +77,10 @@ fix_alloc([{Title,Columns,Data}|Tables]) ->
fix_alloc(Tables)];
fix_alloc([{Title,[{_,V}|_]=Data}|Tables]) ->
fix_alloc([{Title,lists:duplicate(length(V),[]),Data}|Tables]);
+fix_alloc([{"",[]}|Tables]) -> % no name and no data, probably truncated dump
+ fix_alloc(Tables);
+fix_alloc([{Title,[]=Data}|Tables]) -> % no data, probably truncated dump
+ fix_alloc([{Title,[],Data}|Tables]);
fix_alloc([]) ->
[].
diff --git a/lib/observer/src/crashdump_viewer.erl b/lib/observer/src/crashdump_viewer.erl
index 9268dac180..2f9f81104a 100644
--- a/lib/observer/src/crashdump_viewer.erl
+++ b/lib/observer/src/crashdump_viewer.erl
@@ -90,6 +90,7 @@
%% All possible tags - use macros in order to avoid misspelling in the code
+-define(abort,abort).
-define(allocated_areas,allocated_areas).
-define(allocator,allocator).
-define(atoms,atoms).
@@ -321,8 +322,16 @@ handle_call(general_info,_From,State=#state{file=File}) ->
NumAtoms = GenInfo#general_info.num_atoms,
WS = parse_vsn_str(GenInfo#general_info.system_vsn,4),
TW = case get(truncated) of
- true -> ["WARNING: The crash dump is truncated. "
- "Some information might be missing."];
+ true ->
+ case get(truncated_reason) of
+ undefined ->
+ ["WARNING: The crash dump is truncated. "
+ "Some information might be missing."];
+ Reason ->
+ ["WARNING: The crash dump is truncated "
+ "("++Reason++"). "
+ "Some information might be missing."]
+ end;
false -> []
end,
ets:insert(cdv_reg_proc_table,
@@ -515,8 +524,15 @@ truncated_warning([Tag|Tags]) ->
false -> truncated_warning(Tags)
end.
truncated_warning() ->
- ["WARNING: The crash dump is truncated here. "
- "Some information might be missing."].
+ case get(truncated_reason) of
+ undefined ->
+ ["WARNING: The crash dump is truncated here. "
+ "Some information might be missing."];
+ Reason ->
+ ["WARNING: The crash dump is truncated here "
+ "("++Reason++"). "
+ "Some information might be missing."]
+ end.
truncated_here(Tag) ->
case get(truncated) of
@@ -692,6 +708,7 @@ val(Fd, NoExist) ->
{eof,[]} -> NoExist;
[] -> NoExist;
{eof,Val} -> Val;
+ "=abort:"++_ -> NoExist;
Val -> Val
end.
@@ -787,7 +804,7 @@ do_read_file(File) ->
?erl_crash_dump ->
reset_index_table(),
insert_index(Tag,Id,N1+1),
- put(last_tag,{Tag,""}),
+ put_last_tag(Tag,""),
indexify(Fd,Rest,N1),
end_progress(),
check_if_truncated(),
@@ -831,7 +848,7 @@ indexify(Fd,Bin,N) ->
<<_:Pos/binary,TagAndRest/binary>> = Bin,
{Tag,Id,Rest,N1} = tag(Fd,TagAndRest,N+Pos),
insert_index(Tag,Id,N1+1), % +1 to get past newline
- put(last_tag,{Tag,Id}),
+ put_last_tag(Tag,Id),
indexify(Fd,Rest,N1);
nomatch ->
case progress_read(Fd) of
@@ -1174,7 +1191,11 @@ parse_link_list("{from,"++Str,Links,Monitors,MonitoredBy) ->
parse_link_list(", "++Rest,Links,Monitors,MonitoredBy) ->
parse_link_list(Rest,Links,Monitors,MonitoredBy);
parse_link_list([],Links,Monitors,MonitoredBy) ->
- {lists:reverse(Links),lists:reverse(Monitors),lists:reverse(MonitoredBy)}.
+ {lists:reverse(Links),lists:reverse(Monitors),lists:reverse(MonitoredBy)};
+parse_link_list(Unexpected,Links,Monitors,MonitoredBy) ->
+ io:format("WARNING: found unexpected data in link list:~n~s~n",[Unexpected]),
+ parse_link_list([],Links,Monitors,MonitoredBy).
+
parse_port(Str) ->
{Port,Rest} = parse_link(Str,[]),
@@ -1813,16 +1834,16 @@ main_modinfo(_Fd,LM,_LineHead) ->
all_modinfo(Fd,LM,LineHead) ->
case LineHead of
"Current attributes" ->
- Str = hex_to_str(val(Fd)),
+ Str = hex_to_str(val(Fd,"")),
LM#loaded_mod{current_attrib=Str};
"Current compilation info" ->
- Str = hex_to_str(val(Fd)),
+ Str = hex_to_str(val(Fd,"")),
LM#loaded_mod{current_comp_info=Str};
"Old attributes" ->
- Str = hex_to_str(val(Fd)),
+ Str = hex_to_str(val(Fd,"")),
LM#loaded_mod{old_attrib=Str};
"Old compilation info" ->
- Str = hex_to_str(val(Fd)),
+ Str = hex_to_str(val(Fd,"")),
LM#loaded_mod{old_comp_info=Str};
Other ->
unexpected(Fd,Other,"loaded modules info"),
@@ -1848,7 +1869,12 @@ hex_to_term([],Acc) ->
Bin};
Term ->
Term
- end.
+ end;
+hex_to_term(Rest,Acc) ->
+ {"WARNING: The term is probably truncated!",
+ "I can not convert hex to term.",
+ Rest,list_to_binary(lists:reverse(Acc))}.
+
hex_to_dec("F") -> 15;
hex_to_dec("E") -> 14;
@@ -2159,7 +2185,8 @@ sort_allocator_types([{Name,Data}|Allocators],Acc,DoTotal) ->
Type =
case string:tokens(Name,"[]") of
[T,_Id] -> T;
- [Name] -> Name
+ [Name] -> Name;
+ Other -> Other
end,
TypeData = proplists:get_value(Type,Acc,[]),
{NewTypeData,NewDoTotal} = sort_type_data(Type,Data,TypeData,DoTotal),
@@ -2686,6 +2713,7 @@ count_index(Tag) ->
%%-----------------------------------------------------------------
%% Convert tags read from crashdump to atoms used as first part of key
%% in cdv_dump_index_table
+tag_to_atom("abort") -> ?abort;
tag_to_atom("allocated_areas") -> ?allocated_areas;
tag_to_atom("allocator") -> ?allocator;
tag_to_atom("atoms") -> ?atoms;
@@ -2720,6 +2748,14 @@ tag_to_atom(UnknownTag) ->
list_to_atom(UnknownTag).
%%%-----------------------------------------------------------------
+%%% Store last tag for use when truncated, and reason if aborted
+put_last_tag(?abort,Reason) ->
+ %% Don't overwrite the real last tag
+ put(truncated_reason,Reason);
+put_last_tag(Tag,Id) ->
+ put(last_tag,{Tag,Id}).
+
+%%%-----------------------------------------------------------------
%%% Fetch next chunk from crashdump file
lookup_and_parse_index(File,What,ParseFun,Str) when is_list(File) ->
Indices = lookup_index(What),
@@ -2815,7 +2851,16 @@ collect(Pids,Acc) ->
update_progress(),
collect(Pids,Acc);
{'DOWN', _Ref, process, Pid, {pmap_done,Result}} ->
- collect(lists:delete(Pid,Pids),[Result|Acc])
+ collect(lists:delete(Pid,Pids),[Result|Acc]);
+ {'DOWN', _Ref, process, Pid, _Error} ->
+ Warning =
+ "WARNING: an error occured while parsing data.\n" ++
+ case get(truncated) of
+ true -> "This might be because the dump is truncated.\n";
+ false -> ""
+ end,
+ io:format(Warning),
+ collect(lists:delete(Pid,Pids),Acc)
end.
%%%-----------------------------------------------------------------
diff --git a/lib/observer/test/crashdump_viewer_SUITE.erl b/lib/observer/test/crashdump_viewer_SUITE.erl
index 73ed890802..8df69c6624 100644
--- a/lib/observer/test/crashdump_viewer_SUITE.erl
+++ b/lib/observer/test/crashdump_viewer_SUITE.erl
@@ -420,6 +420,10 @@ special(File,Procs) ->
%% ".trunc" ->
%% %% ????
%% ok;
+ ".trunc.bytes" ->
+ {ok,_,[TW]} = crashdump_viewer:general_info(),
+ {match,_} = re:run(TW,"CRASH DUMP SIZE LIMIT REACHED"),
+ ok;
_ ->
ok
end,
@@ -481,7 +485,11 @@ do_create_dumps(DataDir,Rel) ->
current ->
CD3 = dump_with_args(DataDir,Rel,"instr","+Mim true"),
CD4 = dump_with_strange_module_name(DataDir,Rel,"strangemodname"),
- {[CD1,CD2,CD3,CD4], DosDump};
+ Bytes = rand:uniform(300000) + 100,
+ CD5 = dump_with_args(DataDir,Rel,"trunc.bytes",
+ "-env ERL_CRASH_DUMP_BYTES " ++
+ integer_to_list(Bytes)),
+ {[CD1,CD2,CD3,CD4,CD5], DosDump};
_ ->
{[CD1,CD2], DosDump}
end.
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/public_key/doc/src/public_key.xml b/lib/public_key/doc/src/public_key.xml
index 385604677c..edebfe0f84 100644
--- a/lib/public_key/doc/src/public_key.xml
+++ b/lib/public_key/doc/src/public_key.xml
@@ -822,6 +822,36 @@ fun(#'DistributionPoint'{}, #'CertificateList'{},
</func>
<func>
+ <name>ssh_hostkey_fingerprint(HostKey) -> string()</name>
+ <name>ssh_hostkey_fingerprint(DigestType, HostKey) -> string()</name>
+ <fsummary>Calculates a ssh fingerprint for a hostkey.</fsummary>
+ <type>
+ <v>Key = public_key()</v>
+ <v>DigestType = digest_type()</v>
+ </type>
+ <desc>
+ <p>Calculates a ssh fingerprint from a public host key as openssh does.</p>
+ <p>The algorithm in <c>ssh_hostkey_fingerprint/1</c> is md5 to be compatible with older
+ ssh-keygen commands. The string from the second variant is prepended by the algorithm name
+ in uppercase as in newer ssh-keygen commands.</p>
+ <p>Examples:</p>
+ <code>
+ 2> public_key:ssh_hostkey_fingerprint(Key).
+ "f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
+
+ 3> public_key:ssh_hostkey_fingerprint(md5,Key).
+ "MD5:f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
+
+ 4> public_key:ssh_hostkey_fingerprint(sha,Key).
+ "SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY"
+
+ 5> public_key:ssh_hostkey_fingerprint(sha256,Key).
+ "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"
+ </code>
+ </desc>
+ </func>
+
+ <func>
<name>verify(Msg, DigestType, Signature, Key) -> boolean()</name>
<fsummary>Verifies a digital signature.</fsummary>
<type>
diff --git a/lib/public_key/src/public_key.erl b/lib/public_key/src/public_key.erl
index d23abfe256..fed3b09f36 100644
--- a/lib/public_key/src/public_key.erl
+++ b/lib/public_key/src/public_key.erl
@@ -49,6 +49,7 @@
pkix_normalize_name/1,
pkix_path_validation/3,
ssh_decode/2, ssh_encode/2,
+ ssh_hostkey_fingerprint/1, ssh_hostkey_fingerprint/2,
ssh_curvename2oid/1, oid2ssh_curvename/1,
pkix_crls_validate/3,
pkix_dist_point/1,
@@ -91,7 +92,8 @@
-type public_crypt_options() :: [{rsa_pad, rsa_padding()}].
-type rsa_digest_type() :: 'md5' | 'sha'| 'sha224' | 'sha256' | 'sha384' | 'sha512'.
-type dss_digest_type() :: 'none' | 'sha'. %% None is for backwards compatibility
--type ecdsa_digest_type() :: 'sha'| 'sha224' | 'sha256' | 'sha384' | 'sha512'.
+-type ecdsa_digest_type() :: 'sha'| 'sha224' | 'sha256' | 'sha384' | 'sha512'.
+-type digest_type() :: rsa_digest_type() | dss_digest_type() | ecdsa_digest_type().
-type crl_reason() :: unspecified | keyCompromise | cACompromise | affiliationChanged | superseded
| cessationOfOperation | certificateHold | privilegeWithdrawn | aACompromise.
-type oid() :: tuple().
@@ -819,6 +821,41 @@ oid2ssh_curvename(?'secp384r1') -> <<"nistp384">>;
oid2ssh_curvename(?'secp521r1') -> <<"nistp521">>.
%%--------------------------------------------------------------------
+-spec ssh_hostkey_fingerprint(public_key()) -> string().
+-spec ssh_hostkey_fingerprint(digest_type(), public_key()) -> string().
+
+ssh_hostkey_fingerprint(Key) ->
+ sshfp_string(md5, Key).
+
+ssh_hostkey_fingerprint(HashAlg, Key) ->
+ lists:concat([sshfp_alg_name(HashAlg),
+ [$: | sshfp_string(HashAlg, Key)]
+ ]).
+
+sshfp_string(HashAlg, Key) ->
+ %% Other HashAlgs than md5 will be printed with
+ %% other formats than hextstr by
+ %% ssh-keygen -E <alg> -lf <file>
+ fp_fmt(sshfp_fmt(HashAlg), crypto:hash(HashAlg, public_key:ssh_encode(Key,ssh2_pubkey))).
+
+sshfp_alg_name(sha) -> "SHA1";
+sshfp_alg_name(Alg) -> string:to_upper(atom_to_list(Alg)).
+
+sshfp_fmt(md5) -> hexstr;
+sshfp_fmt(_) -> b64.
+
+fp_fmt(hexstr, Bin) ->
+ lists:flatten(string:join([io_lib:format("~2.16.0b",[C1]) || <<C1>> <= Bin], ":"));
+fp_fmt(b64, Bin) ->
+ %% This function clause *seems* to be
+ %% [C || C<-base64:encode_to_string(Bin), C =/= $=]
+ %% but I am not sure. Must be checked.
+ B64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
+ BitsInLast = 8*size(Bin) rem 6,
+ Padding = (6-BitsInLast) rem 6, % Want BitsInLast = [1:5] to map to padding [5:1] and 0 -> 0
+ [lists:nth(C+1,B64Chars) || <<C:6>> <= <<Bin/binary,0:Padding>> ].
+
+%%--------------------------------------------------------------------
-spec short_name_hash({rdnSequence, [#'AttributeTypeAndValue'{}]}) ->
string().
diff --git a/lib/public_key/test/public_key.cover b/lib/public_key/test/public_key.cover
index ec00814578..6c46492bec 100644
--- a/lib/public_key/test/public_key.cover
+++ b/lib/public_key/test/public_key.cover
@@ -1,4 +1,4 @@
{incl_app,public_key,details}.
-{excl_mods, public_key, ['OTP-PUB-KEY']}.
+{excl_mods, public_key, ['OTP-PUB-KEY', 'PKCS-FRAME']}.
diff --git a/lib/public_key/test/public_key_SUITE.erl b/lib/public_key/test/public_key_SUITE.erl
index b22b69a0f2..cd24819899 100644
--- a/lib/public_key/test/public_key_SUITE.erl
+++ b/lib/public_key/test/public_key_SUITE.erl
@@ -45,7 +45,14 @@ all() ->
{group, sign_verify},
pkix, pkix_countryname, pkix_emailaddress, pkix_path_validation,
pkix_iso_rsa_oid, pkix_iso_dsa_oid, pkix_crl, general_name,
- short_cert_issuer_hash, short_crl_issuer_hash].
+ short_cert_issuer_hash, short_crl_issuer_hash,
+ ssh_hostkey_fingerprint_md5_implicit,
+ ssh_hostkey_fingerprint_md5,
+ ssh_hostkey_fingerprint_sha,
+ ssh_hostkey_fingerprint_sha256,
+ ssh_hostkey_fingerprint_sha384,
+ ssh_hostkey_fingerprint_sha512
+ ].
groups() ->
[{pem_decode_encode, [], [dsa_pem, rsa_pem, ec_pem, encrypted_pem,
@@ -81,7 +88,25 @@ init_per_group(_GroupName, Config) ->
end_per_group(_GroupName, Config) ->
Config.
%%-------------------------------------------------------------------
-init_per_testcase(_TestCase, Config0) ->
+init_per_testcase(TestCase, Config) ->
+ case TestCase of
+ ssh_hostkey_fingerprint_md5_implicit -> init_fingerprint_testcase(md5, Config);
+ ssh_hostkey_fingerprint_md5 -> init_fingerprint_testcase(md5, Config);
+ ssh_hostkey_fingerprint_sha -> init_fingerprint_testcase(sha, Config);
+ ssh_hostkey_fingerprint_sha256 -> init_fingerprint_testcase(sha256, Config);
+ ssh_hostkey_fingerprint_sha384 -> init_fingerprint_testcase(sha384, Config);
+ ssh_hostkey_fingerprint_sha512 -> init_fingerprint_testcase(sha512, Config);
+ _ -> init_common_per_testcase(Config)
+ end.
+
+init_fingerprint_testcase(Alg, Config) ->
+ CryptoSupports = lists:member(Alg, proplists:get_value(hashs, crypto:supports())),
+ case CryptoSupports of
+ false -> {skip,{Alg,not_supported}};
+ true -> init_common_per_testcase(Config)
+ end.
+
+init_common_per_testcase(Config0) ->
Config = lists:keydelete(watchdog, 1, Config0),
Dog = ct:timetrap(?TIMEOUT),
[{watchdog, Dog} | Config].
@@ -89,6 +114,7 @@ init_per_testcase(_TestCase, Config0) ->
end_per_testcase(_TestCase, _Config) ->
ok.
+
%%--------------------------------------------------------------------
%% Test Cases --------------------------------------------------------
%%--------------------------------------------------------------------
@@ -529,6 +555,48 @@ ssh_openssh_public_key_long_header(Config) when is_list(Config) ->
Decoded = public_key:ssh_decode(Encoded, rfc4716_public_key).
%%--------------------------------------------------------------------
+%% Check of different host keys left to later
+ssh_hostkey_fingerprint_md5_implicit(_Config) ->
+ Expected = "4b:0b:63:de:0f:a7:3a:ab:2c:cc:2d:d1:21:37:1d:3a",
+ Expected = public_key:ssh_hostkey_fingerprint(ssh_hostkey(rsa)).
+
+%%--------------------------------------------------------------------
+%% Check of different host keys left to later
+ssh_hostkey_fingerprint_md5(_Config) ->
+ Expected = "MD5:4b:0b:63:de:0f:a7:3a:ab:2c:cc:2d:d1:21:37:1d:3a",
+ Expected = public_key:ssh_hostkey_fingerprint(md5, ssh_hostkey(rsa)).
+
+%%--------------------------------------------------------------------
+%% Since this kind of fingerprint is not available yet on standard
+%% distros, we do like this instead. The Expected is generated with:
+%% $ openssh-7.3p1/ssh-keygen -E sha1 -lf <file>
+%% 2048 SHA1:Soammnaqg06jrm2jivMSnzQGlmk none@example.org (RSA)
+ssh_hostkey_fingerprint_sha(_Config) ->
+ Expected = "SHA1:Soammnaqg06jrm2jivMSnzQGlmk",
+ Expected = public_key:ssh_hostkey_fingerprint(sha, ssh_hostkey(rsa)).
+
+%%--------------------------------------------------------------------
+%% Since this kind of fingerprint is not available yet on standard
+%% distros, we do like this instead.
+ssh_hostkey_fingerprint_sha256(_Config) ->
+ Expected = "SHA256:T7F1BahkJWR7iJO8+rpzWOPbp7LZP4MlNrDExdNYOvY",
+ Expected = public_key:ssh_hostkey_fingerprint(sha256, ssh_hostkey(rsa)).
+
+%%--------------------------------------------------------------------
+%% Since this kind of fingerprint is not available yet on standard
+%% distros, we do like this instead.
+ssh_hostkey_fingerprint_sha384(_Config) ->
+ Expected = "SHA384:QhkLoGNI4KXdPvC//HxxSCP3uTQVADqxdajbgm+Gkx9zqz8N94HyP1JmH8C4/aEl",
+ Expected = public_key:ssh_hostkey_fingerprint(sha384, ssh_hostkey(rsa)).
+
+%%--------------------------------------------------------------------
+%% Since this kind of fingerprint is not available yet on standard
+%% distros, we do like this instead.
+ssh_hostkey_fingerprint_sha512(_Config) ->
+ Expected = "SHA512:ezUismvm3ADQQb6Nm0c1DwQ6ydInlJNfsnSQejFkXNmABg1Aenk9oi45CXeBOoTnlfTsGG8nFDm0smP10PBEeA",
+ Expected = public_key:ssh_hostkey_fingerprint(sha512, ssh_hostkey(rsa)).
+
+%%--------------------------------------------------------------------
encrypt_decrypt() ->
[{doc, "Test public_key:encrypt_private and public_key:decrypt_public"}].
encrypt_decrypt(Config) when is_list(Config) ->
@@ -929,3 +997,13 @@ incorrect_countryname_pkix_cert() ->
incorrect_emailaddress_pkix_cert() ->
<<48,130,3,74,48,130,2,50,2,9,0,133,49,203,25,198,156,252,230,48,13,6,9,42,134, 72,134,247,13,1,1,5,5,0,48,103,49,11,48,9,6,3,85,4,6,19,2,65,85,49,19,48,17, 6,3,85,4,8,12,10,83,111,109,101,45,83,116,97,116,101,49,33,48,31,6,3,85,4,10, 12,24,73,110,116,101,114,110,101,116,32,87,105,100,103,105,116,115,32,80,116, 121,32,76,116,100,49,32,48,30,6,9,42,134,72,134,247,13,1,9,1,12,17,105,110, 118,97,108,105,100,64,101,109,97,105,108,46,99,111,109,48,30,23,13,49,51,49, 49,48,55,50,48,53,54,49,56,90,23,13,49,52,49,49,48,55,50,48,53,54,49,56,90, 48,103,49,11,48,9,6,3,85,4,6,19,2,65,85,49,19,48,17,6,3,85,4,8,12,10,83,111, 109,101,45,83,116,97,116,101,49,33,48,31,6,3,85,4,10,12,24,73,110,116,101, 114,110,101,116,32,87,105,100,103,105,116,115,32,80,116,121,32,76,116,100,49, 32,48,30,6,9,42,134,72,134,247,13,1,9,1,12,17,105,110,118,97,108,105,100,64, 101,109,97,105,108,46,99,111,109,48,130,1,34,48,13,6,9,42,134,72,134,247,13, 1,1,1,5,0,3,130,1,15,0,48,130,1,10,2,130,1,1,0,190,243,49,213,219,60,232,105, 1,127,126,9,130,15,60,190,78,100,148,235,246,223,21,91,238,200,251,84,55,212, 78,32,120,61,85,172,0,144,248,5,165,29,143,79,64,178,51,153,203,76,115,238, 192,49,173,37,121,203,89,62,157,13,181,166,30,112,154,40,202,140,104,211,157, 73,244,9,78,236,70,153,195,158,233,141,42,238,2,143,160,225,249,27,30,140, 151,176,43,211,87,114,164,108,69,47,39,195,123,185,179,219,28,218,122,53,83, 77,48,81,184,14,91,243,12,62,146,86,210,248,228,171,146,225,87,51,146,155, 116,112,238,212,36,111,58,41,67,27,6,61,61,3,84,150,126,214,121,57,38,12,87, 121,67,244,37,45,145,234,131,115,134,58,194,5,36,166,52,59,229,32,47,152,80, 237,190,58,182,248,98,7,165,198,211,5,31,231,152,116,31,108,71,218,64,188, 178,143,27,167,79,15,112,196,103,116,212,65,197,94,37,4,132,103,91,217,73, 223,207,185,7,153,221,240,232,31,44,102,108,82,83,56,242,210,214,74,71,246, 177,217,148,227,220,230,4,176,226,74,194,37,2,3,1,0,1,48,13,6,9,42,134,72, 134,247,13,1,1,5,5,0,3,130,1,1,0,89,247,141,154,173,123,123,203,143,85,28,79, 73,37,164,6,17,89,171,224,149,22,134,17,198,146,158,192,241,41,253,58,230, 133,71,189,43,66,123,88,15,242,119,227,249,99,137,61,200,54,161,0,177,167, 169,114,80,148,90,22,97,78,162,181,75,93,209,116,245,46,81,232,64,157,93,136, 52,57,229,113,197,218,113,93,42,161,213,104,205,137,30,144,183,58,10,98,47, 227,177,96,40,233,98,150,209,217,68,22,221,133,27,161,152,237,46,36,179,59, 172,97,134,194,205,101,137,71,192,57,153,20,114,27,173,233,166,45,56,0,61, 205,45,202,139,7,132,103,248,193,157,184,123,43,62,172,236,110,49,62,209,78, 249,83,219,133,1,213,143,73,174,16,113,143,189,41,84,60,128,222,30,177,104, 134,220,52,239,171,76,59,176,36,113,176,214,118,16,44,235,21,167,199,216,200, 76,219,142,248,13,70,145,205,216,230,226,148,97,223,216,179,68,209,222,63, 140,137,24,164,192,149,194,79,119,247,75,159,49,116,70,241,70,116,11,40,119, 176,157,36,160,102,140,255,34,248,25,231,136,59>>.
+
+
+
+ssh_hostkey(rsa) ->
+ [{PKdecoded,_}] =
+ public_key:ssh_decode(
+ <<"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYXcYmsyJBstl4EfFYzfQJmSiUE162zvSGSoMYybShYOI6rnnyvvihfw8Aml+2gZ716F2tqG48FQ/yPZEGWNPMrCejPpJctaPWhpNdNMJ8KFXSEgr5bY2mEpa19DHmuDeXKzeJJ+X7s3fVdYc4FMk5731KIW6Huf019ZnTxbx0VKG6b1KAJBg3vpNsDxEMwQ4LFMB0JHVklOTzbxmpaeULuIxvl65A+eGeFVeo2Q+YI9UnwY1vSgmc9Azwy8Ie9Z0HpQBN5I7Uc5xnknT8V6xDhgNfXEfzsgsRdDfZLECt1WO/1gP9wkosvAGZWt5oG8pbNQWiQdFq536ck8WQD9WD none@example.org">>,
+ public_key),
+ PKdecoded.
+
diff --git a/lib/public_key/vsn.mk b/lib/public_key/vsn.mk
index 84f6a659b5..2f541d8d84 100644
--- a/lib/public_key/vsn.mk
+++ b/lib/public_key/vsn.mk
@@ -1 +1 @@
-PUBLIC_KEY_VSN = 1.2
+PUBLIC_KEY_VSN = 1.3
diff --git a/lib/ssh/doc/src/introduction.xml b/lib/ssh/doc/src/introduction.xml
index ca84528f3d..b7a73e2597 100644
--- a/lib/ssh/doc/src/introduction.xml
+++ b/lib/ssh/doc/src/introduction.xml
@@ -195,8 +195,6 @@
Transport Layer Protocol</item>
<item><url href="http://www.ietf.org/rfc/rfc4254.txt">RFC 4254</url> -
Connection Protocol</item>
- <item><url href="http://www.ietf.org/rfc/rfc4255.txt">RFC 4255</url> -
- Key Fingerprints</item>
<item><url href="http://www.ietf.org/rfc/rfc4344.txt">RFC 4344</url> -
Transport Layer Encryption Modes</item>
<item><url href="http://www.ietf.org/rfc/rfc4716.txt">RFC 4716</url> -
diff --git a/lib/ssh/doc/src/notes.xml b/lib/ssh/doc/src/notes.xml
index 773a472818..f5a67bc00e 100644
--- a/lib/ssh/doc/src/notes.xml
+++ b/lib/ssh/doc/src/notes.xml
@@ -30,6 +30,21 @@
<file>notes.xml</file>
</header>
+<section><title>Ssh 4.3.6</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Re-negotiation problems with OpenSSH client solved.</p>
+ <p>
+ Own Id: OTP-13972</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Ssh 4.3.5</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/ssh/doc/src/ssh.xml b/lib/ssh/doc/src/ssh.xml
index ef9f7cbd9b..6b49f89449 100644
--- a/lib/ssh/doc/src/ssh.xml
+++ b/lib/ssh/doc/src/ssh.xml
@@ -175,11 +175,21 @@
supplied with this option.
</p>
</item>
- <tag><c><![CDATA[{silently_accept_hosts, boolean()}]]></c></tag>
+ <tag><c><![CDATA[{silently_accept_hosts, boolean() | accept_fun() | {crypto:digest_type(), accept_fun()} }]]></c>
+ <br/>
+ <c><![CDATA[accept_fun() :: fun(PeerName::string(), FingerPrint::string()) -> boolean()]]></c>
+ </tag>
<item>
<p>When <c>true</c>, hosts are added to the
file <c><![CDATA[known_hosts]]></c> without asking the user.
- Defaults to <c>false</c>.
+ Defaults to <c>false</c> which will give a user question on stdio of whether to accept or reject a previously
+ unseen host.</p>
+ <p>If the option value is has an <c>accept_fun()</c>, that fun will called with the arguments
+ <c>(PeerName, PeerHostKeyFingerPrint)</c>. The fingerprint is calculated on the Peer's Host Key with
+ <seealso marker="public_key:public_key#ssh_hostkey_fingerprint-1">public_key:ssh_hostkey_fingerprint/1</seealso>.
+ </p>
+ <p>If the <c>crypto:digest_type()</c> is present, the fingerprint is calculated with that digest type by the function
+ <seealso marker="public_key:public_key#ssh_hostkey_fingerprint-2">public_key:ssh_hostkey_fingerprint/2</seealso>.
</p>
</item>
<tag><c><![CDATA[{user_interaction, boolean()}]]></c></tag>
diff --git a/lib/ssh/doc/src/ssh_protocol.xml b/lib/ssh/doc/src/ssh_protocol.xml
index 7288266cf7..013823b4df 100644
--- a/lib/ssh/doc/src/ssh_protocol.xml
+++ b/lib/ssh/doc/src/ssh_protocol.xml
@@ -138,8 +138,6 @@
Transport Layer Protocol.</item>
<item><url href="http://www.ietf.org/rfc/rfc4254.txt">RFC 4254</url> -
Connection Protocol.</item>
- <item><url href="http://www.ietf.org/rfc/rfc4255.txt">RFC 4255</url> -
- Key Fingerprints.</item>
<item><url href="http://www.ietf.org/rfc/rfc4344.txt">RFC 4344</url> -
Transport Layer Encryption Modes.</item>
<item><url href="http://www.ietf.org/rfc/rfc4716.txt">RFC 4716</url> -
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.erl b/lib/ssh/src/ssh.erl
index 1d7be3547b..31e343e81b 100644
--- a/lib/ssh/src/ssh.erl
+++ b/lib/ssh/src/ssh.erl
@@ -617,6 +617,15 @@ handle_ssh_option({user_dir_fun, Value} = Opt) when is_function(Value) ->
Opt;
handle_ssh_option({silently_accept_hosts, Value} = Opt) when is_boolean(Value) ->
Opt;
+handle_ssh_option({silently_accept_hosts, Value} = Opt) when is_function(Value,2) ->
+ Opt;
+handle_ssh_option({silently_accept_hosts, {DigestAlg,Value}} = Opt) when is_function(Value,2) ->
+ case lists:member(DigestAlg, [md5, sha, sha224, sha256, sha384, sha512]) of
+ true ->
+ Opt;
+ false ->
+ throw({error, {eoptions, Opt}})
+ end;
handle_ssh_option({user_interaction, Value} = Opt) when is_boolean(Value) ->
Opt;
handle_ssh_option({preferred_algorithms,[_|_]} = Opt) ->
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_connection.erl b/lib/ssh/src/ssh_connection.erl
index d0f2d54c06..1153095135 100644
--- a/lib/ssh/src/ssh_connection.erl
+++ b/lib/ssh/src/ssh_connection.erl
@@ -287,6 +287,9 @@ handle_msg(#ssh_msg_channel_open_confirmation{recipient_channel = ChannelId,
ssh_channel:cache_update(Cache, Channel#channel{
remote_id = RemoteId,
+ recv_packet_size = max(32768, % rfc4254/5.2
+ min(PacketSz, Channel#channel.recv_packet_size)
+ ),
send_window_size = WindowSz,
send_packet_size = PacketSz}),
{Reply, Connection} = reply_msg(Channel, Connection0, {open, ChannelId}),
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl
index ced049f0d0..7451c9e6d0 100644
--- a/lib/ssh/src/ssh_connection_handler.erl
+++ b/lib/ssh/src/ssh_connection_handler.erl
@@ -671,8 +671,9 @@ handle_event(_, #ssh_msg_newkeys{} = Msg, {new_keys,Role,init}, D) ->
{next_state, {service_request,Role}, D#data{ssh_params=Ssh}};
%% Subsequent key exchange rounds (renegotiation):
-handle_event(_, #ssh_msg_newkeys{}, {new_keys,Role,renegotiate}, D) ->
- {next_state, {connected,Role}, D};
+handle_event(_, #ssh_msg_newkeys{} = Msg, {new_keys,Role,renegotiate}, D) ->
+ {ok, Ssh} = ssh_transport:handle_new_keys(Msg, D#data.ssh_params),
+ {next_state, {connected,Role}, D#data{ssh_params=Ssh}};
%%% ######## {service_request, client|server}
@@ -927,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) ->
@@ -1006,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 ->
@@ -1193,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 ->
@@ -1737,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;
@@ -1925,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/src/ssh_transport.erl b/lib/ssh/src/ssh_transport.erl
index 15b80de30a..21ba34506a 100644
--- a/lib/ssh/src/ssh_transport.erl
+++ b/lib/ssh/src/ssh_transport.erl
@@ -734,12 +734,16 @@ public_algo({#'ECPoint'{},{namedCurve,OID}}) ->
list_to_atom("ecdsa-sha2-" ++ binary_to_list(Curve)).
-accepted_host(Ssh, PeerName, Opts) ->
+accepted_host(Ssh, PeerName, Public, Opts) ->
case proplists:get_value(silently_accept_hosts, Opts, false) of
+ F when is_function(F,2) ->
+ true == (catch F(PeerName, public_key:ssh_hostkey_fingerprint(Public)));
+ {DigestAlg,F} when is_function(F,2) ->
+ true == (catch F(PeerName, public_key:ssh_hostkey_fingerprint(DigestAlg,Public)));
true ->
- yes;
+ true;
false ->
- yes_no(Ssh, "New host " ++ PeerName ++ " accept")
+ yes == yes_no(Ssh, "New host " ++ PeerName ++ " accept")
end.
known_host_key(#ssh{opts = Opts, key_cb = Mod, peer = Peer} = Ssh,
@@ -749,10 +753,10 @@ known_host_key(#ssh{opts = Opts, key_cb = Mod, peer = Peer} = Ssh,
true ->
ok;
false ->
- case accepted_host(Ssh, PeerName, Opts) of
- yes ->
+ case accepted_host(Ssh, PeerName, Public, Opts) of
+ true ->
Mod:add_host_key(PeerName, Public, Opts);
- no ->
+ false ->
{error, rejected}
end
end.
diff --git a/lib/ssh/test/ssh.cover b/lib/ssh/test/ssh.cover
index a4221fbbbe..69d2a1c4f8 100644
--- a/lib/ssh/test/ssh.cover
+++ b/lib/ssh/test/ssh.cover
@@ -1,2 +1,3 @@
{incl_app,ssh,details}.
+{excl_mods, ssh, [ssh_dbg, ssh_info, ssh_server_key_api, ssh_sftpd_file_api]}. \ No newline at end of file
diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl
index 51e0d5196b..0a0ab5cdf7 100644
--- a/lib/ssh/test/ssh_basic_SUITE.erl
+++ b/lib/ssh/test/ssh_basic_SUITE.erl
@@ -315,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()]),
@@ -343,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.
@@ -524,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);
@@ -562,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
@@ -596,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;
diff --git a/lib/ssh/test/ssh_connection_SUITE.erl b/lib/ssh/test/ssh_connection_SUITE.erl
index bcf3b01824..2819a4dbd9 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,58 +399,80 @@ 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},
Result =
- try collect_data(ConnectionRef, ChannelId)
+ try collect_data(ConnectionRef, ChannelId, EchoSize)
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.
%%--------------------------------------------------------------------
@@ -909,36 +931,46 @@ big_cat_rx(ConnectionRef, ChannelId, Acc) ->
timeout
end.
-collect_data(ConnectionRef, ChannelId) ->
- ct:log("Listener ~p running! ConnectionRef=~p, ChannelId=~p",[self(),ConnectionRef,ChannelId]),
- collect_data(ConnectionRef, ChannelId, [], 0).
+collect_data(ConnectionRef, ChannelId, EchoSize) ->
+ ct:log("~p:~p Listener ~p running! ConnectionRef=~p, ChannelId=~p",[?MODULE,?LINE,self(),ConnectionRef,ChannelId]),
+ collect_data(ConnectionRef, ChannelId, EchoSize, [], 0).
-collect_data(ConnectionRef, ChannelId, Acc, Sum) ->
+collect_data(ConnectionRef, ChannelId, EchoSize, 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)]),
- 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)]),
- Bin
- catch
- C:E ->
- ct:log("collect_data: received eof.~nAcc is strange...~nException=~p:~p~nAcc=~p",
- [C,E,Acc]),
- {error,{C,E}}
- end;
+ ct:log("~p:~p collect_data: received ~p bytes. total ~p bytes, want ~p more",
+ [?MODULE,?LINE,size(Data),Sum+size(Data),EchoSize-Sum]),
+ ssh_connection:adjust_window(ConnectionRef, ChannelId, size(Data)),
+ collect_data(ConnectionRef, ChannelId, EchoSize, [Data | Acc], Sum+size(Data));
+ {ssh_cm, ConnectionRef, Msg={eof, ChannelId}} ->
+ collect_data_report_end(Acc, Msg, EchoSize);
+
+ {ssh_cm, ConnectionRef, Msg={closed,ChannelId}} ->
+ collect_data_report_end(Acc, Msg, EchoSize);
+
Msg ->
- ct:log("collect_data: ***** unexpected message *****~n~p",[Msg]),
- collect_data(ConnectionRef, ChannelId, Acc, Sum)
+ ct:log("~p:~p collect_data: ***** unexpected message *****~n~p",[?MODULE,?LINE,Msg]),
+ collect_data(ConnectionRef, ChannelId, EchoSize, Acc, Sum)
after TO ->
- ct:log("collect_data: ----- Nothing received for ~p seconds -----~n",[]),
- collect_data(ConnectionRef, ChannelId, Acc, Sum)
+ ct:log("~p:~p collect_data: ----- Nothing received for ~p seconds -----~n",[?MODULE,?LINE,TO]),
+ collect_data(ConnectionRef, ChannelId, EchoSize, Acc, Sum)
+ end.
+
+collect_data_report_end(Acc, Msg, EchoSize) ->
+ try
+ iolist_to_binary(lists:reverse(Acc))
+ of
+ Bin ->
+ ct:log("~p:~p collect_data: received ~p.~nGot in total ~p bytes, want ~p more",
+ [?MODULE,?LINE,Msg,size(Bin),EchoSize,size(Bin)]),
+ Bin
+ catch
+ C:E ->
+ ct:log("~p:~p collect_data: received ~p.~nAcc is strange...~nException=~p:~p~nAcc=~p",
+ [?MODULE,?LINE,Msg,C,E,Acc]),
+ {error,{C,E}}
end.
%%%-------------------------------------------------------------------
diff --git a/lib/ssh/test/ssh_options_SUITE.erl b/lib/ssh/test/ssh_options_SUITE.erl
index 61883c0647..8f060bebd8 100644
--- a/lib/ssh/test/ssh_options_SUITE.erl
+++ b/lib/ssh/test/ssh_options_SUITE.erl
@@ -61,7 +61,13 @@
unexpectedfun_option_client/1,
unexpectedfun_option_server/1,
user_dir_option/1,
- connectfun_disconnectfun_server/1
+ connectfun_disconnectfun_server/1,
+ hostkey_fingerprint_check/1,
+ hostkey_fingerprint_check_md5/1,
+ hostkey_fingerprint_check_sha/1,
+ hostkey_fingerprint_check_sha256/1,
+ hostkey_fingerprint_check_sha384/1,
+ hostkey_fingerprint_check_sha512/1
]).
%%% Common test callbacks
@@ -100,6 +106,12 @@ all() ->
disconnectfun_option_client,
unexpectedfun_option_server,
unexpectedfun_option_client,
+ hostkey_fingerprint_check,
+ hostkey_fingerprint_check_md5,
+ hostkey_fingerprint_check_sha,
+ hostkey_fingerprint_check_sha256,
+ hostkey_fingerprint_check_sha384,
+ hostkey_fingerprint_check_sha512,
id_string_no_opt_client,
id_string_own_string_client,
id_string_random_client,
@@ -540,10 +552,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 +669,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
@@ -774,6 +794,93 @@ unexpectedfun_option_client(Config) ->
end.
%%--------------------------------------------------------------------
+hostkey_fingerprint_check(Config) ->
+ do_hostkey_fingerprint_check(Config, old).
+
+hostkey_fingerprint_check_md5(Config) ->
+ do_hostkey_fingerprint_check(Config, md5).
+
+hostkey_fingerprint_check_sha(Config) ->
+ do_hostkey_fingerprint_check(Config, sha).
+
+hostkey_fingerprint_check_sha256(Config) ->
+ do_hostkey_fingerprint_check(Config, sha256).
+
+hostkey_fingerprint_check_sha384(Config) ->
+ do_hostkey_fingerprint_check(Config, sha384).
+
+hostkey_fingerprint_check_sha512(Config) ->
+ do_hostkey_fingerprint_check(Config, sha512).
+
+
+%%%----
+do_hostkey_fingerprint_check(Config, HashAlg) ->
+ case supported_hash(HashAlg) of
+ true ->
+ really_do_hostkey_fingerprint_check(Config, HashAlg);
+ false ->
+ {skip,{unsupported_hash,HashAlg}}
+ end.
+
+supported_hash(old) -> true;
+supported_hash(HashAlg) ->
+ proplists:get_value(HashAlg,
+ proplists:get_value(hashs, crypto:supports(), []),
+ false).
+
+
+really_do_hostkey_fingerprint_check(Config, HashAlg) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
+ file:make_dir(UserDir),
+ SysDir = proplists:get_value(data_dir, Config),
+
+ %% All host key fingerprints. Trust that public_key has checked the ssh_hostkey_fingerprint
+ %% function since that function is used by the ssh client...
+ FPs = [case HashAlg of
+ old -> public_key:ssh_hostkey_fingerprint(Key);
+ _ -> public_key:ssh_hostkey_fingerprint(HashAlg, Key)
+ end
+ || FileCandidate <- begin
+ {ok,KeyFileCands} = file:list_dir(SysDir),
+ KeyFileCands
+ end,
+ nomatch =/= re:run(FileCandidate, ".*\\.pub", []),
+ {Key,_Cmnts} <- begin
+ {ok,Bin} = file:read_file(filename:join(SysDir, FileCandidate)),
+ try public_key:ssh_decode(Bin, public_key)
+ catch
+ _:_ -> []
+ end
+ end],
+ ct:log("Fingerprints(~p) = ~p",[HashAlg,FPs]),
+
+ %% Start daemon with the public keys that we got fingerprints from
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
+ {user_dir, UserDir},
+ {password, "morot"}]),
+
+ FP_check_fun = fun(PeerName, FP) ->
+ ct:pal("PeerName = ~p, FP = ~p",[PeerName,FP]),
+ HostCheck = (Host == PeerName),
+ FPCheck = lists:member(FP, FPs),
+ ct:log("check ~p == ~p (~p) and ~n~p in ~p (~p)~n",
+ [PeerName,Host,HostCheck,FP,FPs,FPCheck]),
+ HostCheck and FPCheck
+ end,
+
+ ssh_test_lib:connect(Host, Port, [{silently_accept_hosts,
+ case HashAlg of
+ old -> FP_check_fun;
+ _ -> {HashAlg, FP_check_fun}
+ end},
+ {user, "foo"},
+ {password, "morot"},
+ {user_dir, UserDir},
+ {user_interaction, false}]),
+ ssh:stop_daemon(Pid).
+
+%%--------------------------------------------------------------------
%%% Test connect_timeout option in ssh:connect/4
ssh_connect_timeout(_Config) ->
ConnTimeout = 2000,
@@ -974,7 +1081,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 +1117,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_sftp_SUITE.erl b/lib/ssh/test/ssh_sftp_SUITE.erl
index 19ad81e7da..70662f5d93 100644
--- a/lib/ssh/test/ssh_sftp_SUITE.erl
+++ b/lib/ssh/test/ssh_sftp_SUITE.erl
@@ -60,12 +60,16 @@ end_per_suite(_onfig) ->
groups() ->
[{not_unicode, [], [{group,erlang_server},
{group,openssh_server},
+ {group,big_recvpkt_size},
sftp_nonexistent_subsystem]},
{unicode, [], [{group,erlang_server},
{group,openssh_server},
sftp_nonexistent_subsystem]},
+ {big_recvpkt_size, [], [{group,erlang_server},
+ {group,openssh_server}]},
+
{erlang_server, [], [{group,write_read_tests},
version_option,
{group,remote_tar}]},
@@ -149,6 +153,9 @@ init_per_group(unicode, Config) ->
{skip, "Not unicode file encoding"}
end;
+init_per_group(big_recvpkt_size, Config) ->
+ [{pkt_sz,123456} | Config];
+
init_per_group(erlang_server, Config) ->
ct:comment("Begin ~p",[grps(Config)]),
PrivDir = proplists:get_value(priv_dir, Config),
@@ -257,7 +264,10 @@ init_per_testcase(Case, Config00) ->
Dog = ct:timetrap(2 * ?default_timeout),
User = proplists:get_value(user, Config0),
Passwd = proplists:get_value(passwd, Config0),
-
+ PktSzOpt = case proplists:get_value(pkt_sz, Config0) of
+ undefined -> [];
+ Sz -> [{packet_size,Sz}]
+ end,
Config =
case proplists:get_value(group,Config2) of
erlang_server ->
@@ -267,7 +277,9 @@ init_per_testcase(Case, Config00) ->
[{user, User},
{password, Passwd},
{user_interaction, false},
- {silently_accept_hosts, true}]
+ {silently_accept_hosts, true}
+ | PktSzOpt
+ ]
),
Sftp = {ChannelPid, Connection},
[{sftp, Sftp}, {watchdog, Dog} | Config2];
@@ -278,7 +290,9 @@ init_per_testcase(Case, Config00) ->
{ok, ChannelPid, Connection} =
ssh_sftp:start_channel(Host,
[{user_interaction, false},
- {silently_accept_hosts, true}]),
+ {silently_accept_hosts, true}
+ | PktSzOpt
+ ]),
Sftp = {ChannelPid, Connection},
[{sftp, Sftp}, {watchdog, Dog} | Config2]
end,
diff --git a/lib/ssh/test/ssh_test_lib.erl b/lib/ssh/test/ssh_test_lib.erl
index c43c6519f9..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()]).
@@ -208,6 +203,16 @@ reply(TestCase, Result) ->
rcv_expected(Expect, SshPort, Timeout) ->
receive
+ {SshPort, Recvd} when is_function(Expect) ->
+ case Expect(Recvd) of
+ true ->
+ ct:log("Got expected ~p from ~p",[Recvd,SshPort]),
+ catch port_close(SshPort),
+ rcv_lingering(50);
+ false ->
+ ct:log("Got UNEXPECTED ~p~n",[Recvd]),
+ rcv_expected(Expect, SshPort, Timeout)
+ end;
{SshPort, Expect} ->
ct:log("Got expected ~p from ~p",[Expect,SshPort]),
catch port_close(SshPort),
@@ -792,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 a914938c41..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,10 +56,12 @@ 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
+ erlang_server_openssh_client_public_key_rsa,
+ erlang_server_openssh_client_renegotiate
]}
].
@@ -104,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.
@@ -145,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).
@@ -386,6 +394,111 @@ erlang_server_openssh_client_public_key_X(Config, PubKeyAlg) ->
ssh:stop_daemon(Pid).
%%--------------------------------------------------------------------
+%% Test that the Erlang/OTP server can renegotiate with openSSH
+erlang_server_openssh_client_renegotiate(Config) ->
+ PubKeyAlg = ssh_rsa,
+ 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(trunc(1.1*RenegLimitK*1024), $a),
+ ok = file:write_file(DataFile, Data),
+
+ Cmd = "ssh -p " ++ integer_to_list(Port) ++
+ " -o UserKnownHostsFile=" ++ KnownHosts ++
+ " -o RekeyLimit=" ++ integer_to_list(RenegLimitK) ++"K" ++
+ " " ++ Host ++ " < " ++ DataFile,
+ OpenSsh = ssh_test_lib:open_port({spawn, Cmd}),
+
+ Expect = fun({data,R}) ->
+ 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.
+
+%%--------------------------------------------------------------------
+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() ->
[{doc, "Test client password option"}].
erlang_client_openssh_server_password(Config) when is_list(Config) ->
@@ -440,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/ssh/vsn.mk b/lib/ssh/vsn.mk
index 7eeeaf796e..c6a5990f41 100644
--- a/lib/ssh/vsn.mk
+++ b/lib/ssh/vsn.mk
@@ -1,5 +1,5 @@
#-*-makefile-*- ; force emacs to enter makefile-mode
-SSH_VSN = 4.3.5
+SSH_VSN = 4.4
APP_VSN = "ssh-$(SSH_VSN)"
diff --git a/lib/ssl/doc/src/ssl.xml b/lib/ssl/doc/src/ssl.xml
index 68f2f97b6e..edc7e0d8b2 100644
--- a/lib/ssl/doc/src/ssl.xml
+++ b/lib/ssl/doc/src/ssl.xml
@@ -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/Makefile b/lib/ssl/src/Makefile
index b625db0656..e96b1b971f 100644
--- a/lib/ssl/src/Makefile
+++ b/lib/ssl/src/Makefile
@@ -50,6 +50,7 @@ MODULES= \
ssl_app \
ssl_dist_sup\
ssl_sup \
+ dtls_udp_sup \
inet_tls_dist \
inet6_tls_dist \
ssl_certificate\
@@ -71,7 +72,9 @@ MODULES= \
ssl_crl\
ssl_crl_cache \
ssl_crl_hash_dir \
- ssl_socket \
+ tls_socket \
+ dtls_socket \
+ dtls_udp_listener\
ssl_listen_tracker_sup \
tls_record \
dtls_record \
diff --git a/lib/ssl/src/dtls_connection.erl b/lib/ssl/src/dtls_connection.erl
index 4f1f050e4b..68c6f93579 100644
--- a/lib/ssl/src/dtls_connection.erl
+++ b/lib/ssl/src/dtls_connection.erl
@@ -48,12 +48,12 @@
select_sni_extension/1]).
%% Alert and close handling
--export([send_alert/2, close/5]).
+-export([encode_alert/3,send_alert/2, close/5]).
%% Data handling
--export([passive_receive/2, next_record_if_active/1, handle_common_event/4
- ]).
+-export([encode_data/3, passive_receive/2, next_record_if_active/1, handle_common_event/4,
+ send/3]).
%% gen_statem state functions
-export([init/3, error/3, downgrade/3, %% Initiation and take down states
@@ -93,61 +93,120 @@ start_fsm(Role, Host, Port, Socket, {#ssl_options{erl_dist = true},_, Tracker} =
Error
end.
-send_handshake(Handshake, State) ->
- send_handshake_flight(queue_handshake(Handshake, State)).
+send_handshake(Handshake, #state{connection_states = ConnectionStates} = States) ->
+ #{epoch := Epoch} = ssl_record:current_connection_state(ConnectionStates, write),
+ send_handshake_flight(queue_handshake(Handshake, States), Epoch).
+
+queue_handshake(Handshake0, #state{tls_handshake_history = Hist0,
+ negotiated_version = Version,
+ flight_buffer = #{handshakes := HsBuffer0,
+ change_cipher_spec := undefined,
+ next_sequence := Seq} = Flight0} = State) ->
+ Handshake = dtls_handshake:encode_handshake(Handshake0, Version, Seq),
+ Hist = update_handshake_history(Handshake0, Handshake, Hist0),
+ State#state{flight_buffer = Flight0#{handshakes => [Handshake | HsBuffer0],
+ next_sequence => Seq +1},
+ tls_handshake_history = Hist};
+
+queue_handshake(Handshake0, #state{tls_handshake_history = Hist0,
+ negotiated_version = Version,
+ flight_buffer = #{handshakes_after_change_cipher_spec := Buffer0,
+ next_sequence := Seq} = Flight0} = State) ->
+ Handshake = dtls_handshake:encode_handshake(Handshake0, Version, Seq),
+ Hist = update_handshake_history(Handshake0, Handshake, Hist0),
+ State#state{flight_buffer = Flight0#{handshakes_after_change_cipher_spec => [Handshake | Buffer0],
+ next_sequence => Seq +1},
+ tls_handshake_history = Hist}.
-queue_flight_buffer(Msg, #state{negotiated_version = Version,
- connection_states = ConnectionStates,
- flight_buffer = Flight} = State) ->
- ConnectionState =
- ssl_record:current_connection_state(ConnectionStates, write),
- Epoch = maps:get(epoch, ConnectionState),
- State#state{flight_buffer = Flight ++ [{Version, Epoch, Msg}]}.
-
-queue_handshake(Handshake, #state{negotiated_version = Version,
- tls_handshake_history = Hist0,
- connection_states = ConnectionStates0} = State0) ->
- {Frag, ConnectionStates, Hist} =
- encode_handshake(Handshake, Version, ConnectionStates0, Hist0),
- queue_flight_buffer(Frag, State0#state{connection_states = ConnectionStates,
- tls_handshake_history = Hist}).
send_handshake_flight(#state{socket = Socket,
transport_cb = Transport,
- flight_buffer = Flight,
- connection_states = ConnectionStates0} = State0) ->
-
+ flight_buffer = #{handshakes := Flight,
+ change_cipher_spec := undefined},
+ negotiated_version = Version,
+ connection_states = ConnectionStates0} = State0, Epoch) ->
+ %% TODO remove hardcoded Max size
{Encoded, ConnectionStates} =
- encode_handshake_flight(Flight, ConnectionStates0),
+ encode_handshake_flight(lists:reverse(Flight), Version, 1400, Epoch, ConnectionStates0),
+ send(Transport, Socket, Encoded),
+ start_flight(State0#state{connection_states = ConnectionStates});
+
+send_handshake_flight(#state{socket = Socket,
+ transport_cb = Transport,
+ flight_buffer = #{handshakes := [_|_] = Flight0,
+ change_cipher_spec := ChangeCipher,
+ handshakes_after_change_cipher_spec := []},
+ negotiated_version = Version,
+ connection_states = ConnectionStates0} = State0, Epoch) ->
+ {HsBefore, ConnectionStates1} =
+ encode_handshake_flight(lists:reverse(Flight0), Version, 1400, Epoch, ConnectionStates0),
+ {EncChangeCipher, ConnectionStates} = encode_change_cipher(ChangeCipher, Version, Epoch, ConnectionStates1),
+
+ send(Transport, Socket, [HsBefore, EncChangeCipher]),
+ start_flight(State0#state{connection_states = ConnectionStates});
- Transport:send(Socket, Encoded),
- State0#state{flight_buffer = [], connection_states = ConnectionStates}.
+send_handshake_flight(#state{socket = Socket,
+ transport_cb = Transport,
+ flight_buffer = #{handshakes := [_|_] = Flight0,
+ change_cipher_spec := ChangeCipher,
+ handshakes_after_change_cipher_spec := Flight1},
+ negotiated_version = Version,
+ connection_states = ConnectionStates0} = State0, Epoch) ->
+ {HsBefore, ConnectionStates1} =
+ encode_handshake_flight(lists:reverse(Flight0), Version, 1400, Epoch-1, ConnectionStates0),
+ {EncChangeCipher, ConnectionStates2} =
+ encode_change_cipher(ChangeCipher, Version, Epoch-1, ConnectionStates1),
+ {HsAfter, ConnectionStates} =
+ encode_handshake_flight(lists:reverse(Flight1), Version, 1400, Epoch, ConnectionStates2),
+ send(Transport, Socket, [HsBefore, EncChangeCipher, HsAfter]),
+ start_flight(State0#state{connection_states = ConnectionStates});
-queue_change_cipher(Msg, State) ->
- queue_flight_buffer(Msg, State).
+send_handshake_flight(#state{socket = Socket,
+ transport_cb = Transport,
+ flight_buffer = #{handshakes := [],
+ change_cipher_spec := ChangeCipher,
+ handshakes_after_change_cipher_spec := Flight1},
+ negotiated_version = Version,
+ connection_states = ConnectionStates0} = State0, Epoch) ->
+ {EncChangeCipher, ConnectionStates1} =
+ encode_change_cipher(ChangeCipher, Version, Epoch-1, ConnectionStates0),
+ {HsAfter, ConnectionStates} =
+ encode_handshake_flight(lists:reverse(Flight1), Version, 1400, Epoch, ConnectionStates1),
+ send(Transport, Socket, [EncChangeCipher, HsAfter]),
+ start_flight(State0#state{connection_states = ConnectionStates}).
+
+queue_change_cipher(ChangeCipher, #state{flight_buffer = Flight,
+ connection_states = ConnectionStates0} = State) ->
+ ConnectionStates =
+ dtls_record:next_epoch(ConnectionStates0, write),
+ State#state{flight_buffer = Flight#{change_cipher_spec => ChangeCipher},
+ connection_states = ConnectionStates}.
send_alert(Alert, #state{negotiated_version = Version,
socket = Socket,
transport_cb = Transport,
connection_states = ConnectionStates0} = State0) ->
{BinMsg, ConnectionStates} =
- ssl_alert:encode(Alert, Version, ConnectionStates0),
- Transport:send(Socket, BinMsg),
+ encode_alert(Alert, Version, ConnectionStates0),
+ send(Transport, Socket, BinMsg),
State0#state{connection_states = ConnectionStates}.
close(downgrade, _,_,_,_) ->
ok;
%% Other
close(_, Socket, Transport, _,_) ->
- Transport:close(Socket).
+ dtls_socket:close(Transport,Socket).
reinit_handshake_data(#state{protocol_buffers = Buffers} = State) ->
State#state{premaster_secret = undefined,
public_key_info = undefined,
tls_handshake_history = ssl_handshake:init_handshake_history(),
protocol_buffers =
- Buffers#protocol_buffers{dtls_fragment_state =
- dtls_handshake:dtls_handshake_new_flight(0)}}.
+ Buffers#protocol_buffers{
+ dtls_handshake_next_seq = 0,
+ dtls_handshake_next_fragments = [],
+ dtls_handshake_later_fragments = []
+ }}.
select_sni_extension(#client_hello{extensions = HelloExtensions}) ->
HelloExtensions#hello_extensions.sni;
@@ -160,7 +219,7 @@ select_sni_extension(_) ->
%%--------------------------------------------------------------------
-spec start_link(atom(), host(), inet:port_number(), port(), list(), pid(), tuple()) ->
- {ok, pid()} | ignore | {error, reason()}.
+ {ok, pid()} | ignore | {error, reason()}.
%%
%% Description: Creates a gen_fsm process which calls Module:init/1 to
%% initialize. To ensure a synchronized start-up procedure, this function
@@ -191,7 +250,6 @@ init({call, From}, {start, Timeout},
#state{host = Host, port = Port, role = client,
ssl_options = SslOpts,
session = #session{own_certificate = Cert} = Session0,
- transport_cb = Transport, socket = Socket,
connection_states = ConnectionStates0,
renegotiation = {Renegotiation, _},
session_cache = Cache,
@@ -199,23 +257,26 @@ init({call, From}, {start, Timeout},
} = State0) ->
Timer = ssl_connection:start_or_recv_cancel_timer(Timeout, From),
Hello = dtls_handshake:client_hello(Host, Port, ConnectionStates0, SslOpts,
- Cache, CacheCb, Renegotiation, Cert),
-
+ Cache, CacheCb, Renegotiation, Cert),
+
Version = Hello#client_hello.client_version,
HelloVersion = dtls_record:lowest_protocol_version(SslOpts#ssl_options.versions),
- Handshake0 = ssl_handshake:init_handshake_history(),
- {BinMsg, ConnectionStates, Handshake} =
- encode_handshake(Hello, HelloVersion, ConnectionStates0, Handshake0),
- Transport:send(Socket, BinMsg),
- State1 = State0#state{connection_states = ConnectionStates,
- negotiated_version = Version, %% Requested version
+ State1 = prepare_flight(State0#state{negotiated_version = Version}),
+ State2 = send_handshake(Hello, State1#state{negotiated_version = HelloVersion}),
+ State3 = State2#state{negotiated_version = Version, %% Requested version
session =
Session0#session{session_id = Hello#client_hello.session_id},
- tls_handshake_history = Handshake,
start_or_recv_from = From,
timer = Timer},
- {Record, State} = next_record(State1),
+ {Record, State} = next_record(State3),
next_event(hello, Record, State);
+init({call, _} = Type, Event, #state{role = server, transport_cb = gen_udp} = State) ->
+ ssl_connection:init(Type, Event,
+ State#state{flight_state = {waiting, undefined, ?INITIAL_RETRANSMIT_TIMEOUT}},
+ ?MODULE);
+init({call, _} = Type, Event, #state{role = server} = State) ->
+ %% I.E. DTLS over sctp
+ ssl_connection:init(Type, Event, State#state{flight_state = reliable}, ?MODULE);
init(Type, Event, State) ->
ssl_connection:init(Type, Event, State, ?MODULE).
@@ -232,34 +293,53 @@ error(_, _, _) ->
#state{}) ->
gen_statem:state_function_result().
%%--------------------------------------------------------------------
-hello(internal, #client_hello{client_version = ClientVersion} = Hello,
- State = #state{connection_states = ConnectionStates0,
- port = Port, session = #session{own_certificate = Cert} = Session0,
- renegotiation = {Renegotiation, _},
- session_cache = Cache,
- session_cache_cb = CacheCb,
- negotiated_protocol = CurrentProtocol,
- key_algorithm = KeyExAlg,
- ssl_options = SslOpts}) ->
-
- case dtls_handshake:hello(Hello, SslOpts, {Port, Session0, Cache, CacheCb,
- ConnectionStates0, Cert, KeyExAlg}, Renegotiation) of
- #alert{} = Alert ->
- ssl_connection:handle_own_alert(Alert, ClientVersion, hello, State);
- {Version, {Type, Session},
- ConnectionStates, Protocol0, ServerHelloExt, HashSign} ->
- Protocol = case Protocol0 of
- undefined -> CurrentProtocol;
- _ -> Protocol0
- end,
-
- ssl_connection:hello(internal, {common_client_hello, Type, ServerHelloExt},
- State#state{connection_states = ConnectionStates,
- negotiated_version = Version,
- hashsign_algorithm = HashSign,
- session = Session,
- negotiated_protocol = Protocol}, ?MODULE)
+hello(internal, #client_hello{cookie = <<>>,
+ client_version = Version} = Hello, #state{role = server,
+ transport_cb = Transport,
+ socket = Socket} = State0) ->
+ %% TODO: not hard code key
+ {ok, {IP, Port}} = dtls_socket:peername(Transport, Socket),
+ Cookie = dtls_handshake:cookie(<<"secret">>, IP, Port, Hello),
+ VerifyRequest = dtls_handshake:hello_verify_request(Cookie, Version),
+ State1 = prepare_flight(State0#state{negotiated_version = Version}),
+ State2 = send_handshake(VerifyRequest, State1),
+ {Record, State} = next_record(State2),
+ next_event(hello, Record, State#state{tls_handshake_history = ssl_handshake:init_handshake_history()});
+hello(internal, #client_hello{cookie = Cookie} = Hello, #state{role = server,
+ transport_cb = Transport,
+ socket = Socket} = State0) ->
+ {ok, {IP, Port}} = dtls_socket:peername(Transport, Socket),
+ %% TODO: not hard code key
+ case dtls_handshake:cookie(<<"secret">>, IP, Port, Hello) of
+ Cookie ->
+ handle_client_hello(Hello, State0);
+ _ ->
+ %% Handle bad cookie as new cookie request RFC 6347 4.1.2
+ hello(internal, Hello#client_hello{cookie = <<>>}, State0)
end;
+hello(internal, #hello_verify_request{cookie = Cookie}, #state{role = client,
+ host = Host, port = Port,
+ ssl_options = SslOpts,
+ session = #session{own_certificate = OwnCert}
+ = Session0,
+ connection_states = ConnectionStates0,
+ renegotiation = {Renegotiation, _},
+ session_cache = Cache,
+ session_cache_cb = CacheCb
+ } = State0) ->
+ State1 = prepare_flight(State0#state{tls_handshake_history = ssl_handshake:init_handshake_history()}),
+ Hello = dtls_handshake:client_hello(Host, Port, Cookie, ConnectionStates0,
+ SslOpts,
+ Cache, CacheCb, Renegotiation, OwnCert),
+ Version = Hello#client_hello.client_version,
+ HelloVersion = dtls_record:lowest_protocol_version(SslOpts#ssl_options.versions),
+ State2 = send_handshake(Hello, State1#state{negotiated_version = HelloVersion}),
+ State3 = State2#state{negotiated_version = Version, %% Requested version
+ session =
+ Session0#session{session_id =
+ Hello#client_hello.session_id}},
+ {Record, State} = next_record(State3),
+ next_event(hello, Record, State);
hello(internal, #server_hello{} = Hello,
#state{connection_states = ConnectionStates0,
negotiated_version = ReqVersion,
@@ -273,24 +353,49 @@ hello(internal, #server_hello{} = Hello,
ssl_connection:handle_session(Hello,
Version, NewId, ConnectionStates, ProtoExt, Protocol, State)
end;
+hello(internal, {handshake, {#client_hello{cookie = <<>>} = Handshake, _}}, State) ->
+ %% Initial hello should not be in handshake history
+ {next_state, hello, State, [{next_event, internal, Handshake}]};
+
+hello(internal, {handshake, {#hello_verify_request{} = Handshake, _}}, State) ->
+ %% hello_verify should not be in handshake history
+ {next_state, hello, State, [{next_event, internal, Handshake}]};
+
hello(info, Event, State) ->
handle_info(Event, hello, State);
-
hello(Type, Event, State) ->
ssl_connection:hello(Type, Event, State, ?MODULE).
abbreviated(info, Event, State) ->
handle_info(Event, abbreviated, State);
+abbreviated(internal = Type,
+ #change_cipher_spec{type = <<1>>} = Event,
+ #state{connection_states = ConnectionStates0} = State) ->
+ ConnectionStates1 = dtls_record:save_current_connection_state(ConnectionStates0, read),
+ ConnectionStates = dtls_record:next_epoch(ConnectionStates1, read),
+ ssl_connection:abbreviated(Type, Event, State#state{connection_states = ConnectionStates}, ?MODULE);
+abbreviated(internal = Type, #finished{} = Event, #state{connection_states = ConnectionStates} = State) ->
+ ssl_connection:cipher(Type, Event, prepare_flight(State#state{connection_states = ConnectionStates}), ?MODULE);
abbreviated(Type, Event, State) ->
ssl_connection:abbreviated(Type, Event, State, ?MODULE).
certify(info, Event, State) ->
handle_info(Event, certify, State);
+certify(internal = Type, #server_hello_done{} = Event, State) ->
+ ssl_connection:certify(Type, Event, prepare_flight(State), ?MODULE);
certify(Type, Event, State) ->
ssl_connection:certify(Type, Event, State, ?MODULE).
cipher(info, Event, State) ->
handle_info(Event, cipher, State);
+cipher(internal = Type, #change_cipher_spec{type = <<1>>} = Event,
+ #state{connection_states = ConnectionStates0} = State) ->
+ ConnectionStates1 = dtls_record:save_current_connection_state(ConnectionStates0, read),
+ ConnectionStates = dtls_record:next_epoch(ConnectionStates1, read),
+ ssl_connection:cipher(Type, Event, State#state{connection_states = ConnectionStates}, ?MODULE);
+cipher(internal = Type, #finished{} = Event, #state{connection_states = ConnectionStates} = State) ->
+ ssl_connection:cipher(Type, Event,
+ prepare_flight(State#state{connection_states = ConnectionStates}), ?MODULE);
cipher(Type, Event, State) ->
ssl_connection:cipher(Type, Event, State, ?MODULE).
@@ -310,7 +415,6 @@ connection(internal, #hello_request{}, #state{host = Host, port = Port,
State1#state{session = Session0#session{session_id
= Hello#client_hello.session_id}}),
next_event(hello, Record, State);
-
connection(internal, #client_hello{} = Hello, #state{role = server, allow_renegotiate = true} = State) ->
%% Mitigate Computational DoS attack
%% http://www.educatedguesswork.org/2011/10/ssltls_and_computational_dos.html
@@ -319,14 +423,11 @@ connection(internal, #client_hello{} = Hello, #state{role = server, allow_renego
%% renegotiations immediately after each other.
erlang:send_after(?WAIT_TO_ALLOW_RENEGOTIATION, self(), allow_renegotiate),
{next_state, hello, State#state{allow_renegotiate = false}, [{next_event, internal, Hello}]};
-
-
connection(internal, #client_hello{}, #state{role = server, allow_renegotiate = false} = State0) ->
Alert = ?ALERT_REC(?WARNING, ?NO_RENEGOTIATION),
State1 = send_alert(Alert, State0),
{Record, State} = ssl_connection:prepare_connection(State1, ?MODULE),
next_event(connection, Record, State);
-
connection(Type, Event, State) ->
ssl_connection:connection(Type, Event, State, ?MODULE).
@@ -341,15 +442,25 @@ downgrade(Type, Event, State) ->
%%--------------------------------------------------------------------
%% raw data from socket, unpack records
-handle_info({Protocol, _, Data}, StateName,
+handle_info({_,flight_retransmission_timeout}, connection, _) ->
+ {next_state, keep_state_and_data};
+handle_info({Ref, flight_retransmission_timeout}, StateName,
+ #state{flight_state = {waiting, Ref, NextTimeout}} = State0) ->
+ State1 = send_handshake_flight(State0#state{flight_state = {retransmit_timer, NextTimeout}},
+ retransmit_epoch(StateName, State0)),
+ {Record, State} = next_record(State1),
+ next_event(StateName, Record, State);
+handle_info({_, flight_retransmission_timeout}, _, _) ->
+ {next_state, keep_state_and_data};
+handle_info({Protocol, _, _, _, Data}, StateName,
#state{data_tag = Protocol} = State0) ->
- case next_tls_record(Data, State0) of
+ case next_dtls_record(Data, State0) of
{Record, State} ->
next_event(StateName, Record, State);
#alert{} = Alert ->
ssl_connection:handle_normal_shutdown(Alert, StateName, State0),
{stop, {shutdown, own_alert}}
- end;
+ end;
handle_info({CloseTag, Socket}, StateName,
#state{socket = Socket, close_tag = CloseTag,
negotiated_version = Version} = State) ->
@@ -380,23 +491,26 @@ handle_common_event(internal, #alert{} = Alert, StateName,
ssl_connection:handle_own_alert(Alert, Version, StateName, State);
%%% DTLS record protocol level handshake messages
-handle_common_event(internal, #ssl_tls{type = ?HANDSHAKE} = Record,
+handle_common_event(internal, #ssl_tls{type = ?HANDSHAKE,
+ fragment = Data},
StateName,
- #state{protocol_buffers =
- #protocol_buffers{dtls_packets = Packets0,
- dtls_fragment_state = HsState0} = Buffers,
+ #state{protocol_buffers = Buffers0,
negotiated_version = Version} = State0) ->
try
- {Packets1, HsState} = dtls_handshake:get_dtls_handshake(Record, HsState0),
- State =
- State0#state{protocol_buffers =
- Buffers#protocol_buffers{dtls_fragment_state = HsState}},
- Events = dtls_handshake_events(Packets0 ++ Packets1),
- case StateName of
- connection ->
- ssl_connection:hibernate_after(StateName, State, Events);
- _ ->
- {next_state, StateName, State, Events}
+ case dtls_handshake:get_dtls_handshake(Version, Data, Buffers0) of
+ {more_data, Buffers} ->
+ {Record, State} = next_record(State0#state{protocol_buffers = Buffers}),
+ next_event(StateName, Record, State);
+ {Packets, Buffers} ->
+ State = State0#state{protocol_buffers = Buffers},
+ Events = dtls_handshake_events(Packets),
+ case StateName of
+ connection ->
+ ssl_connection:hibernate_after(StateName, State, Events);
+ _ ->
+ {next_state, StateName,
+ State#state{unprocessed_handshake_events = unprocessed_events(Events)}, Events}
+ end
end
catch throw:#alert{} = Alert ->
ssl_connection:handle_own_alert(Alert, Version, StateName, State0)
@@ -420,6 +534,10 @@ handle_common_event(internal, #ssl_tls{type = ?ALERT, fragment = EncAlerts}, Sta
handle_common_event(internal, #ssl_tls{type = _Unknown}, StateName, State) ->
{next_state, StateName, State}.
+send(Transport, {_, {{_,_}, _} = Socket}, Data) ->
+ send(Transport, Socket, Data);
+send(Transport, Socket, Data) ->
+ dtls_socket:send(Transport, Socket, Data).
%%--------------------------------------------------------------------
%% Description:This function is called by a gen_fsm when it is about
%% to terminate. It should be the opposite of Module:init/1 and do any
@@ -442,96 +560,56 @@ format_status(Type, Data) ->
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
+handle_client_hello(#client_hello{client_version = ClientVersion} = Hello,
+ #state{connection_states = ConnectionStates0,
+ port = Port, session = #session{own_certificate = Cert} = Session0,
+ renegotiation = {Renegotiation, _},
+ session_cache = Cache,
+ session_cache_cb = CacheCb,
+ negotiated_protocol = CurrentProtocol,
+ key_algorithm = KeyExAlg,
+ ssl_options = SslOpts} = State0) ->
+
+ case dtls_handshake:hello(Hello, SslOpts, {Port, Session0, Cache, CacheCb,
+ ConnectionStates0, Cert, KeyExAlg}, Renegotiation) of
+ #alert{} = Alert ->
+ ssl_connection:handle_own_alert(Alert, ClientVersion, hello, State0);
+ {Version, {Type, Session},
+ ConnectionStates, Protocol0, ServerHelloExt, HashSign} ->
+ Protocol = case Protocol0 of
+ undefined -> CurrentProtocol;
+ _ -> Protocol0
+ end,
-dtls_handshake_events([]) ->
- throw(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, malformed_handshake));
-dtls_handshake_events(Packets) ->
- lists:map(fun(Packet) ->
- {next_event, internal, {handshake, Packet}}
- end, Packets).
-
-
-encode_handshake(Handshake, Version, ConnectionStates0, Hist0) ->
- {Seq, ConnectionStates} = sequence(ConnectionStates0),
- {EncHandshake, Frag} = dtls_handshake:encode_handshake(Handshake, Version, Seq),
- %% DTLS does not have an equivalent version to SSLv2. So v2 hello compatibility
- %% will always be false
- Hist = ssl_handshake:update_handshake_history(Hist0, EncHandshake, false),
- {Frag, ConnectionStates, Hist}.
-
-encode_change_cipher(#change_cipher_spec{}, Version, ConnectionStates) ->
- dtls_record:encode_change_cipher_spec(Version, ConnectionStates).
+ State = prepare_flight(State0#state{connection_states = ConnectionStates,
+ negotiated_version = Version,
+ hashsign_algorithm = HashSign,
+ session = Session,
+ negotiated_protocol = Protocol}),
+
+ ssl_connection:hello(internal, {common_client_hello, Type, ServerHelloExt},
+ State, ?MODULE)
+ end.
-encode_handshake_flight(Flight, ConnectionStates) ->
- MSS = 1400,
- encode_handshake_records(Flight, ConnectionStates, MSS, init_pack_records()).
+encode_handshake_flight(Flight, Version, MaxFragmentSize, Epoch, ConnectionStates) ->
+ Fragments = lists:map(fun(Handshake) ->
+ dtls_handshake:fragment_handshake(Handshake, MaxFragmentSize)
+ end, Flight),
+ dtls_record:encode_handshake(Fragments, Version, Epoch, ConnectionStates).
-encode_handshake_records([], CS, _MSS, Recs) ->
- {finish_pack_records(Recs), CS};
+encode_change_cipher(#change_cipher_spec{}, Version, Epoch, ConnectionStates) ->
+ dtls_record:encode_change_cipher_spec(Version, Epoch, ConnectionStates).
-encode_handshake_records([{Version, _Epoch, Frag = #change_cipher_spec{}}|Tail], ConnectionStates0, MSS, Recs0) ->
- {Encoded, ConnectionStates} =
- encode_change_cipher(Frag, Version, ConnectionStates0),
- Recs = append_pack_records([Encoded], MSS, Recs0),
- encode_handshake_records(Tail, ConnectionStates, MSS, Recs);
-
-encode_handshake_records([{Version, Epoch, {MsgType, MsgSeq, Bin}}|Tail], CS0, MSS, Recs0 = {Buf0, _}) ->
- Space = MSS - iolist_size(Buf0),
- Len = byte_size(Bin),
- {Encoded, CS} =
- encode_handshake_record(Version, Epoch, Space, MsgType, MsgSeq, Len, Bin, 0, MSS, [], CS0),
- Recs = append_pack_records(Encoded, MSS, Recs0),
- encode_handshake_records(Tail, CS, MSS, Recs).
-
-%% TODO: move to dtls_handshake????
-encode_handshake_record(_Version, _Epoch, _Space, _MsgType, _MsgSeq, _Len, <<>>, _Offset, _MRS, Encoded, CS)
- when length(Encoded) > 0 ->
- %% make sure we encode at least one segment (for empty messages like Server Hello Done
- {lists:reverse(Encoded), CS};
-
-encode_handshake_record(Version, Epoch, Space, MsgType, MsgSeq, Len, Bin,
- Offset, MRS, Encoded0, CS0) ->
- MaxFragmentLen = Space - 25,
- {BinFragment, Rest} =
- case Bin of
- <<BinFragment0:MaxFragmentLen/bytes, Rest0/binary>> ->
- {BinFragment0, Rest0};
- _ ->
- {Bin, <<>>}
- end,
- FragLength = byte_size(BinFragment),
- Frag = [MsgType, ?uint24(Len), ?uint16(MsgSeq), ?uint24(Offset), ?uint24(FragLength), BinFragment],
- %% TODO Real solution, now avoid dialyzer error {Encoded, CS} = ssl_record:encode_handshake({Epoch, Frag}, Version, CS0),
- {Encoded, CS} = ssl_record:encode_handshake(Frag, Version, CS0),
- encode_handshake_record(Version, Epoch, MRS, MsgType, MsgSeq, Len, Rest, Offset + FragLength, MRS, [Encoded|Encoded0], CS).
-
-init_pack_records() ->
- {[], []}.
-
-append_pack_records([], MSS, Recs = {Buf0, Acc0}) ->
- Remaining = MSS - iolist_size(Buf0),
- if Remaining < 12 ->
- {[], [lists:reverse(Buf0)|Acc0]};
- true ->
- Recs
- end;
-append_pack_records([Head|Tail], MSS, {Buf0, Acc0}) ->
- TotLen = iolist_size(Buf0) + iolist_size(Head),
- if TotLen > MSS ->
- append_pack_records(Tail, MSS, {[Head], [lists:reverse(Buf0)|Acc0]});
- true ->
- append_pack_records(Tail, MSS, {[Head|Buf0], Acc0})
- end.
+encode_data(Data, Version, ConnectionStates0)->
+ dtls_record:encode_data(Data, Version, ConnectionStates0).
-finish_pack_records({[], Acc}) ->
- lists:reverse(Acc);
-finish_pack_records({Buf, Acc}) ->
- lists:reverse([lists:reverse(Buf)|Acc]).
+encode_alert(#alert{} = Alert, Version, ConnectionStates) ->
+ dtls_record:encode_alert_record(Alert, Version, ConnectionStates).
decode_alerts(Bin) ->
ssl_alert:decode(Bin).
-initial_state(Role, Host, Port, Socket, {SSLOptions, SocketOptions}, User,
+initial_state(Role, Host, Port, Socket, {SSLOptions, SocketOptions, _}, User,
{CbModule, DataTag, CloseTag, ErrorTag}) ->
#ssl_options{beast_mitigation = BeastMitigation} = SSLOptions,
ConnectionStates = dtls_record:init_connection_states(Role, BeastMitigation),
@@ -566,10 +644,11 @@ initial_state(Role, Host, Port, Socket, {SSLOptions, SocketOptions}, User,
renegotiation = {false, first},
allow_renegotiate = SSLOptions#ssl_options.client_renegotiation,
start_or_recv_from = undefined,
- protocol_cb = ?MODULE
+ protocol_cb = ?MODULE,
+ flight_buffer = new_flight()
}.
-next_tls_record(Data, #state{protocol_buffers = #protocol_buffers{
+next_dtls_record(Data, #state{protocol_buffers = #protocol_buffers{
dtls_record_buffer = Buf0,
dtls_cipher_texts = CT0} = Buffers} = State0) ->
case dtls_record:get_dtls_records(Data, Buf0) of
@@ -578,14 +657,15 @@ next_tls_record(Data, #state{protocol_buffers = #protocol_buffers{
next_record(State0#state{protocol_buffers =
Buffers#protocol_buffers{dtls_record_buffer = Buf1,
dtls_cipher_texts = CT1}});
-
#alert{} = Alert ->
Alert
- end.
+ end.
-next_record(#state{%%flight = #flight{state = finished},
- protocol_buffers =
- #protocol_buffers{dtls_packets = [], dtls_cipher_texts = [CT | Rest]}
+next_record(#state{unprocessed_handshake_events = N} = State) when N > 0 ->
+ {no_record, State#state{unprocessed_handshake_events = N-1}};
+
+next_record(#state{protocol_buffers =
+ #protocol_buffers{dtls_cipher_texts = [CT | Rest]}
= Buffers,
connection_states = ConnStates0} = State) ->
case dtls_record:decode_cipher_text(CT, ConnStates0) of
@@ -596,9 +676,15 @@ next_record(#state{%%flight = #flight{state = finished},
#alert{} = Alert ->
{Alert, State}
end;
-next_record(#state{socket = Socket,
- transport_cb = Transport} = State) -> %% when FlightState =/= finished
- ssl_socket:setopts(Transport, Socket, [{active,once}]),
+next_record(#state{role = server,
+ socket = {Listener, {Client, _}},
+ transport_cb = gen_udp} = State) ->
+ dtls_udp_listener:active_once(Listener, Client, self()),
+ {no_record, State};
+next_record(#state{role = client,
+ socket = {_Server, Socket},
+ transport_cb = Transport} = State) ->
+ dtls_socket:setopts(Transport, Socket, [{active,once}]),
{no_record, State};
next_record(State) ->
{no_record, State}.
@@ -624,75 +710,89 @@ passive_receive(State0 = #state{user_data_buffer = Buffer}, StateName) ->
next_event(StateName, Record, State) ->
next_event(StateName, Record, State, []).
-next_event(connection = StateName, no_record, State0, Actions) ->
+next_event(connection = StateName, no_record,
+ #state{connection_states = #{current_read := #{epoch := CurrentEpoch}}} = State0, Actions) ->
case next_record_if_active(State0) of
{no_record, State} ->
ssl_connection:hibernate_after(StateName, State, Actions);
- {#ssl_tls{} = Record, State} ->
+ {#ssl_tls{epoch = CurrentEpoch} = Record, State} ->
{next_state, StateName, State, [{next_event, internal, {protocol_record, Record}} | Actions]};
+ {#ssl_tls{epoch = Epoch,
+ type = ?HANDSHAKE,
+ version = _Version}, State1} = _Record when Epoch == CurrentEpoch-1 ->
+ State = send_handshake_flight(State1, Epoch),
+ {next_state, StateName, State, Actions};
+ {#ssl_tls{epoch = _Epoch,
+ version = _Version}, State} ->
+ %% TODO maybe buffer later epoch
+ {next_state, StateName, State, Actions};
{#alert{} = Alert, State} ->
{next_state, StateName, State, [{next_event, internal, Alert} | Actions]}
end;
-next_event(StateName, Record, State, Actions) ->
+next_event(StateName, Record,
+ #state{connection_states = #{current_read := #{epoch := CurrentEpoch}}} = State, Actions) ->
case Record of
no_record ->
{next_state, StateName, State, Actions};
- #ssl_tls{} = Record ->
- {next_state, StateName, State, [{next_event, internal, {protocol_record, Record}} | Actions]};
+ #ssl_tls{epoch = CurrentEpoch,
+ version = Version} = Record ->
+ {next_state, StateName,
+ dtls_version(StateName, Version, State),
+ [{next_event, internal, {protocol_record, Record}} | Actions]};
+ #ssl_tls{epoch = _Epoch,
+ version = _Version} = _Record ->
+ %% TODO maybe buffer later epoch
+ {next_state, StateName, State, Actions};
#alert{} = Alert ->
{next_state, StateName, State, [{next_event, internal, Alert} | Actions]}
end.
-%% TODO This generates dialyzer warnings, has to be handled differently.
-%% handle_packet(Address, Port, Packet) ->
-%% try dtls_record:get_dtls_records(Packet, <<>>) of
-%% %% expect client hello
-%% {[#ssl_tls{type = ?HANDSHAKE, version = {254, _}} = Record], <<>>} ->
-%% handle_dtls_client_hello(Address, Port, Record);
-%% _Other ->
-%% {error, not_dtls}
-%% catch
-%% _Class:_Error ->
-%% {error, not_dtls}
-%% end.
-
-%% handle_dtls_client_hello(Address, Port,
-%% #ssl_tls{epoch = Epoch, sequence_number = Seq,
-%% version = Version} = Record) ->
-%% {[{Hello, _}], _} =
-%% dtls_handshake:get_dtls_handshake(Record,
-%% dtls_handshake:dtls_handshake_new_flight(undefined)),
-%% #client_hello{client_version = {Major, Minor},
-%% random = Random,
-%% session_id = SessionId,
-%% cipher_suites = CipherSuites,
-%% compression_methods = CompressionMethods} = Hello,
-%% CookieData = [address_to_bin(Address, Port),
-%% <<?BYTE(Major), ?BYTE(Minor)>>,
-%% Random, SessionId, CipherSuites, CompressionMethods],
-%% Cookie = crypto:hmac(sha, <<"secret">>, CookieData),
-
-%% case Hello of
-%% #client_hello{cookie = Cookie} ->
-%% accept;
-
-%% _ ->
-%% %% generate HelloVerifyRequest
-%% {RequestFragment, _} = dtls_handshake:encode_handshake(
-%% dtls_handshake:hello_verify_request(Cookie),
-%% Version, 0),
-%% HelloVerifyRequest =
-%% dtls_record:encode_tls_cipher_text(?HANDSHAKE, Version, Epoch, Seq, RequestFragment),
-%% {reply, HelloVerifyRequest}
-%% end.
-
-%% address_to_bin({A,B,C,D}, Port) ->
-%% <<0:80,16#ffff:16,A,B,C,D,Port:16>>;
-%% address_to_bin({A,B,C,D,E,F,G,H}, Port) ->
-%% <<A:16,B:16,C:16,D:16,E:16,F:16,G:16,H:16,Port:16>>.
-
-sequence(#{write_msg_seq := Seq} = ConnectionState) ->
- {Seq, ConnectionState#{write_msg_seq => Seq + 1}}.
+dtls_version(hello, Version, #state{role = server} = State) ->
+ State#state{negotiated_version = Version}; %%Inital version
+dtls_version(_,_, State) ->
+ State.
+
+prepare_flight(#state{flight_buffer = Flight,
+ connection_states = ConnectionStates0,
+ protocol_buffers =
+ #protocol_buffers{} = Buffers} = State) ->
+ ConnectionStates = dtls_record:save_current_connection_state(ConnectionStates0, write),
+ State#state{flight_buffer = next_flight(Flight),
+ connection_states = ConnectionStates,
+ protocol_buffers = Buffers#protocol_buffers{
+ dtls_handshake_next_fragments = [],
+ dtls_handshake_later_fragments = []}}.
+new_flight() ->
+ #{next_sequence => 0,
+ handshakes => [],
+ change_cipher_spec => undefined,
+ handshakes_after_change_cipher_spec => []}.
+
+next_flight(Flight) ->
+ Flight#{handshakes => [],
+ change_cipher_spec => undefined,
+ handshakes_after_change_cipher_spec => []}.
+
+
+start_flight(#state{transport_cb = gen_udp,
+ flight_state = {retransmit_timer, Timeout}} = State) ->
+ Ref = erlang:make_ref(),
+ _ = erlang:send_after(Timeout, self(), {Ref, flight_retransmission_timeout}),
+ State#state{flight_state = {waiting, Ref, new_timeout(Timeout)}};
+
+start_flight(State) ->
+ %% No retransmision needed i.e DTLS over SCTP
+ State#state{flight_state = reliable}.
+
+new_timeout(N) when N =< 30 ->
+ N * 2;
+new_timeout(_) ->
+ 60.
+
+dtls_handshake_events(Packets) ->
+ lists:map(fun(Packet) ->
+ {next_event, internal, {handshake, Packet}}
+ end, Packets).
renegotiate(#state{role = client} = State, Actions) ->
%% Handle same way as if server requested
@@ -722,3 +822,27 @@ handle_alerts([Alert | Alerts], {next_state, StateName, State}) ->
handle_alerts(Alerts, ssl_connection:handle_alert(Alert, StateName, State));
handle_alerts([Alert | Alerts], {next_state, StateName, State, _Actions}) ->
handle_alerts(Alerts, ssl_connection:handle_alert(Alert, StateName, State)).
+
+retransmit_epoch(StateName, #state{connection_states = ConnectionStates}) ->
+ #{epoch := Epoch} =
+ ssl_record:current_connection_state(ConnectionStates, write),
+ case StateName of
+ connection ->
+ Epoch-1;
+ _ ->
+ Epoch
+ end.
+
+update_handshake_history(#hello_verify_request{}, _, Hist) ->
+ Hist;
+update_handshake_history(_, Handshake, Hist) ->
+ %% DTLS never needs option "v2_hello_compatible" to be true
+ ssl_handshake:update_handshake_history(Hist, iolist_to_binary(Handshake), false).
+
+unprocessed_events(Events) ->
+ %% The first handshake event will be processed immediately
+ %% as it is entered first in the event queue and
+ %% when it is processed there will be length(Events)-1
+ %% handshake events left to process before we should
+ %% process more TLS-records received on the socket.
+ erlang:length(Events)-1.
diff --git a/lib/ssl/src/dtls_connection.hrl b/lib/ssl/src/dtls_connection.hrl
index ee3daa3c14..3dd78235d0 100644
--- a/lib/ssl/src/dtls_connection.hrl
+++ b/lib/ssl/src/dtls_connection.hrl
@@ -29,20 +29,14 @@
-include("ssl_connection.hrl").
-record(protocol_buffers, {
- dtls_packets = [], %%::[binary()], % Not yet handled decode ssl/tls packets.
- dtls_record_buffer = <<>>, %%:: binary(), % Buffer of incomplete records
- dtls_fragment_state, %%:: [], % DTLS fragments
- dtls_handshake_buffer = <<>>, %%:: binary(), % Buffer of incomplete handshakes
- dtls_cipher_texts = [], %%:: [binary()],
- dtls_cipher_texts_next %%:: [binary()] % Received for Epoch not yet active
+ dtls_record_buffer = <<>>, %% Buffer of incomplete records
+ dtls_handshake_next_seq = 0,
+ dtls_flight_last,
+ dtls_handshake_next_fragments = [], %% Fragments of the next handshake message
+ dtls_handshake_later_fragments = [], %% Fragments of handsake messages come after the one in next buffer
+ dtls_cipher_texts = [] %%:: [binary()],
}).
--record(flight, {
- last_retransmit,
- last_read_seq,
- msl_timer,
- state,
- buffer % buffer of not yet ACKed TLS records
- }).
+-define(INITIAL_RETRANSMIT_TIMEOUT, 1000). %1 sec
-endif. % -ifdef(dtls_connection).
diff --git a/lib/ssl/src/dtls_connection_sup.erl b/lib/ssl/src/dtls_connection_sup.erl
index dc7601a684..7d7be5743d 100644
--- a/lib/ssl/src/dtls_connection_sup.erl
+++ b/lib/ssl/src/dtls_connection_sup.erl
@@ -60,7 +60,7 @@ init(_O) ->
StartFunc = {dtls_connection, start_link, []},
Restart = temporary, % E.g. should not be restarted
Shutdown = 4000,
- Modules = [dtls_connection],
+ Modules = [dtls_connection, ssl_connection],
Type = worker,
ChildSpec = {Name, StartFunc, Restart, Shutdown, Type, Modules},
diff --git a/lib/ssl/src/dtls_handshake.erl b/lib/ssl/src/dtls_handshake.erl
index c6535d5928..af3708ddb7 100644
--- a/lib/ssl/src/dtls_handshake.erl
+++ b/lib/ssl/src/dtls_handshake.erl
@@ -18,15 +18,15 @@
%% %CopyrightEnd%
-module(dtls_handshake).
+-include("dtls_connection.hrl").
-include("dtls_handshake.hrl").
-include("dtls_record.hrl").
-include("ssl_internal.hrl").
-include("ssl_alert.hrl").
--export([client_hello/8, client_hello/9, hello/4,
- hello_verify_request/1, get_dtls_handshake/2,
- dtls_handshake_new_flight/1, dtls_handshake_new_epoch/1,
- encode_handshake/3]).
+-export([client_hello/8, client_hello/9, cookie/4, hello/4,
+ hello_verify_request/2, get_dtls_handshake/3, fragment_handshake/2,
+ handshake_bin/2, encode_handshake/3]).
-type dtls_handshake() :: #client_hello{} | #hello_verify_request{} |
ssl_handshake:ssl_handshake().
@@ -62,9 +62,10 @@ client_hello(Host, Port, Cookie, ConnectionStates,
Version = dtls_record:highest_protocol_version(Versions),
Pending = ssl_record:pending_connection_state(ConnectionStates, read),
SecParams = maps:get(security_parameters, Pending),
- CipherSuites = ssl_handshake:available_suites(UserSuites, Version),
+ TLSVersion = dtls_v1:corresponding_tls_version(Version),
+ CipherSuites = ssl_handshake:available_suites(UserSuites, TLSVersion),
- Extensions = ssl_handshake:client_hello_extensions(Host, dtls_v1:corresponding_tls_version(Version), CipherSuites,
+ Extensions = ssl_handshake:client_hello_extensions(Host, TLSVersion, CipherSuites,
SslOpts, ConnectionStates, Renegotiation),
Id = ssl_session:client_id({Host, Port, SslOpts}, Cache, CacheCb, OwnCert),
@@ -96,72 +97,51 @@ hello(#client_hello{client_version = ClientVersion} = Hello,
#ssl_options{versions = Versions} = SslOpts,
Info, Renegotiation) ->
Version = ssl_handshake:select_version(dtls_record, ClientVersion, Versions),
- %%
- %% TODO: handle Cipher Fallback
- %%
handle_client_hello(Version, Hello, SslOpts, Info, Renegotiation).
--spec hello_verify_request(binary()) -> #hello_verify_request{}.
+cookie(Key, Address, Port, #client_hello{client_version = {Major, Minor},
+ random = Random,
+ session_id = SessionId,
+ cipher_suites = CipherSuites,
+ compression_methods = CompressionMethods}) ->
+ CookieData = [address_to_bin(Address, Port),
+ <<?BYTE(Major), ?BYTE(Minor)>>,
+ Random, SessionId, CipherSuites, CompressionMethods],
+ crypto:hmac(sha, Key, CookieData).
+
+-spec hello_verify_request(binary(), dtls_record:dtls_version()) -> #hello_verify_request{}.
%%
%% Description: Creates a hello verify request message sent by server to
%% verify client
%%--------------------------------------------------------------------
-hello_verify_request(Cookie) ->
- %% TODO: DTLS Versions?????
- #hello_verify_request{protocol_version = {254, 255}, cookie = Cookie}.
+hello_verify_request(Cookie, Version) ->
+ #hello_verify_request{protocol_version = Version, cookie = Cookie}.
%%--------------------------------------------------------------------
-%% %%--------------------------------------------------------------------
-encode_handshake(Handshake, Version, MsgSeq) ->
+encode_handshake(Handshake, Version, Seq) ->
{MsgType, Bin} = enc_handshake(Handshake, Version),
Len = byte_size(Bin),
- Enc = [MsgType, ?uint24(Len), ?uint16(MsgSeq), ?uint24(0), ?uint24(Len), Bin],
- Frag = {MsgType, MsgSeq, Bin},
- {Enc, Frag}.
+ [MsgType, ?uint24(Len), ?uint16(Seq), ?uint24(0), ?uint24(Len), Bin].
-%%--------------------------------------------------------------------
--spec get_dtls_handshake(#ssl_tls{}, #dtls_hs_state{} | undefined) ->
- {[dtls_handshake()], #dtls_hs_state{}} | {retransmit, #dtls_hs_state{}}.
-%%
-%% Description: Given a DTLS state and new data from ssl_record, collects
-%% and returns it as a list of handshake messages, also returns a new
-%% DTLS state
-%%--------------------------------------------------------------------
-get_dtls_handshake(Records, undefined) ->
- HsState = #dtls_hs_state{highest_record_seq = 0,
- starting_read_seq = 0,
- fragments = gb_trees:empty(),
- completed = []},
- get_dtls_handshake(Records, HsState);
-get_dtls_handshake(Records, HsState0) when is_list(Records) ->
- HsState1 = lists:foldr(fun get_dtls_handshake_aux/2, HsState0, Records),
- get_dtls_handshake_completed(HsState1);
-get_dtls_handshake(Record, HsState0) when is_record(Record, ssl_tls) ->
- HsState1 = get_dtls_handshake_aux(Record, HsState0),
- get_dtls_handshake_completed(HsState1).
+fragment_handshake(Bin, _) when is_binary(Bin)->
+ %% This is the change_cipher_spec not a "real handshake" but part of the flight
+ Bin;
+fragment_handshake([MsgType, Len, Seq, _, Len, Bin], Size) ->
+ Bins = bin_fragments(Bin, Size),
+ handshake_fragments(MsgType, Seq, Len, Bins, []).
+handshake_bin([Type, Length, Data], Seq) ->
+ handshake_bin(Type, Length, Seq, Data).
+
%%--------------------------------------------------------------------
--spec dtls_handshake_new_epoch(#dtls_hs_state{}) -> #dtls_hs_state{}.
+-spec get_dtls_handshake(dtls_record:dtls_version(), binary(), #protocol_buffers{}) ->
+ {[{dtls_handshake(), binary()}], #protocol_buffers{}} | {more_data, #protocol_buffers{}}.
%%
-%% Description: Reset the DTLS decoder state for a new Epoch
+%% Description: ...
%%--------------------------------------------------------------------
-%% dtls_handshake_new_epoch(<<>>) ->
-%% dtls_hs_state_init();
-dtls_handshake_new_epoch(HsState) ->
- HsState#dtls_hs_state{highest_record_seq = 0,
- starting_read_seq = HsState#dtls_hs_state.current_read_seq,
- fragments = gb_trees:empty(), completed = []}.
-
-%--------------------------------------------------------------------
--spec dtls_handshake_new_flight(integer() | undefined) -> #dtls_hs_state{}.
-%
-% Description: Init the DTLS decoder state for a new Flight
-dtls_handshake_new_flight(ExpectedReadReq) ->
- #dtls_hs_state{current_read_seq = ExpectedReadReq,
- highest_record_seq = 0,
- starting_read_seq = 0,
- fragments = gb_trees:empty(), completed = []}.
+get_dtls_handshake(Version, Fragment, ProtocolBuffers) ->
+ handle_fragments(Version, Fragment, ProtocolBuffers, []).
%%--------------------------------------------------------------------
%%% Internal functions
@@ -170,27 +150,29 @@ handle_client_hello(Version, #client_hello{session_id = SugesstedId,
cipher_suites = CipherSuites,
compression_methods = Compressions,
random = Random,
- extensions = #hello_extensions{elliptic_curves = Curves,
- signature_algs = ClientHashSigns} = HelloExt},
+ extensions =
+ #hello_extensions{elliptic_curves = Curves,
+ signature_algs = ClientHashSigns} = HelloExt},
#ssl_options{versions = Versions,
signature_algs = SupportedHashSigns} = SslOpts,
{Port, Session0, Cache, CacheCb, ConnectionStates0, Cert, _}, Renegotiation) ->
case dtls_record:is_acceptable_version(Version, Versions) of
true ->
+ TLSVersion = dtls_v1:corresponding_tls_version(Version),
AvailableHashSigns = ssl_handshake:available_signature_algs(
- ClientHashSigns, SupportedHashSigns, Cert,
- dtls_v1:corresponding_tls_version(Version)),
- ECCCurve = ssl_handshake:select_curve(Curves, ssl_handshake:supported_ecc(Version)),
+ ClientHashSigns, SupportedHashSigns, Cert,TLSVersion),
+ ECCCurve = ssl_handshake:select_curve(Curves, ssl_handshake:supported_ecc(TLSVersion)),
{Type, #session{cipher_suite = CipherSuite} = Session1}
= ssl_handshake:select_session(SugesstedId, CipherSuites, AvailableHashSigns, Compressions,
- Port, Session0#session{ecc = ECCCurve}, Version,
+ Port, Session0#session{ecc = ECCCurve}, TLSVersion,
SslOpts, Cache, CacheCb, Cert),
case CipherSuite of
no_suite ->
?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY);
_ ->
{KeyExAlg,_,_,_} = ssl_cipher:suite_definition(CipherSuite),
- case ssl_handshake:select_hashsign(ClientHashSigns, Cert, KeyExAlg, SupportedHashSigns, Version) of
+ case ssl_handshake:select_hashsign(ClientHashSigns, Cert, KeyExAlg,
+ SupportedHashSigns, TLSVersion) of
#alert{} = Alert ->
Alert;
HashSign ->
@@ -228,214 +210,15 @@ handle_server_hello_extensions(Version, SessionId, Random, CipherSuite,
{Version, SessionId, ConnectionStates, ProtoExt, Protocol}
end.
-get_dtls_handshake_completed(HsState = #dtls_hs_state{completed = Completed}) ->
- {lists:reverse(Completed), HsState#dtls_hs_state{completed = []}}.
-
-get_dtls_handshake_aux(#ssl_tls{version = Version,
- sequence_number = SeqNo,
- fragment = Data}, HsState) ->
- get_dtls_handshake_aux(Version, SeqNo, Data, HsState).
-
-get_dtls_handshake_aux(Version, SeqNo,
- <<?BYTE(Type), ?UINT24(Length),
- ?UINT16(MessageSeq),
- ?UINT24(FragmentOffset), ?UINT24(FragmentLength),
- Body:FragmentLength/binary, Rest/binary>>,
- HsState0) ->
- case reassemble_dtls_fragment(SeqNo, Type, Length, MessageSeq,
- FragmentOffset, FragmentLength,
- Body, HsState0) of
- {HsState1, HighestSeqNo, MsgBody} ->
- HsState2 = dec_dtls_fragment(Version, HighestSeqNo, Type, Length, MessageSeq, MsgBody, HsState1),
- HsState3 = process_dtls_fragments(Version, HsState2),
- get_dtls_handshake_aux(Version, SeqNo, Rest, HsState3);
-
- HsState2 ->
- HsState3 = process_dtls_fragments(Version, HsState2),
- get_dtls_handshake_aux(Version, SeqNo, Rest, HsState3)
- end;
-
-get_dtls_handshake_aux(_Version, _SeqNo, <<>>, HsState) ->
- HsState.
-
-dec_dtls_fragment(Version, SeqNo, Type, Length, MessageSeq, MsgBody,
- HsState = #dtls_hs_state{highest_record_seq = HighestSeqNo, completed = Acc}) ->
- Raw = <<?BYTE(Type), ?UINT24(Length), ?UINT16(MessageSeq), ?UINT24(0), ?UINT24(Length), MsgBody/binary>>,
- H = decode_handshake(Version, Type, MsgBody),
- HsState#dtls_hs_state{completed = [{H,Raw}|Acc], highest_record_seq = erlang:max(HighestSeqNo, SeqNo)}.
-
-process_dtls_fragments(Version,
- HsState0 = #dtls_hs_state{current_read_seq = CurrentReadSeq,
- fragments = Fragments0}) ->
- case gb_trees:is_empty(Fragments0) of
- true ->
- HsState0;
- _ ->
- case gb_trees:smallest(Fragments0) of
- {CurrentReadSeq, {SeqNo, Type, Length, CurrentReadSeq, {Length, [{0, Length}], MsgBody}}} ->
- HsState1 = dtls_hs_state_process_seq(HsState0),
- HsState2 = dec_dtls_fragment(Version, SeqNo, Type, Length, CurrentReadSeq, MsgBody, HsState1),
- process_dtls_fragments(Version, HsState2);
- _ ->
- HsState0
- end
- end.
-
-dtls_hs_state_process_seq(HsState0 = #dtls_hs_state{current_read_seq = CurrentReadSeq,
- fragments = Fragments0}) ->
- Fragments1 = gb_trees:delete_any(CurrentReadSeq, Fragments0),
- HsState0#dtls_hs_state{current_read_seq = CurrentReadSeq + 1,
- fragments = Fragments1}.
-
-dtls_hs_state_add_fragment(MessageSeq, Fragment, HsState0 = #dtls_hs_state{fragments = Fragments0}) ->
- Fragments1 = gb_trees:enter(MessageSeq, Fragment, Fragments0),
- HsState0#dtls_hs_state{fragments = Fragments1}.
-
-reassemble_dtls_fragment(SeqNo, Type, Length, MessageSeq, 0, Length,
- Body, HsState0 = #dtls_hs_state{current_read_seq = undefined})
- when Type == ?CLIENT_HELLO;
- Type == ?SERVER_HELLO;
- Type == ?HELLO_VERIFY_REQUEST ->
- %% First message, should be client hello
- %% return the current message and set the next expected Sequence
- %%
- %% Note: this could (should?) be restricted further, ClientHello and
- %% HelloVerifyRequest have to have message_seq = 0, ServerHello
- %% can have a message_seq of 0 or 1
- %%
- {HsState0#dtls_hs_state{current_read_seq = MessageSeq + 1}, SeqNo, Body};
-
-reassemble_dtls_fragment(_SeqNo, _Type, Length, _MessageSeq, _, Length,
- _Body, HsState = #dtls_hs_state{current_read_seq = undefined}) ->
- %% not what we expected, drop it
- HsState;
-
-reassemble_dtls_fragment(SeqNo, _Type, Length, MessageSeq, 0, Length,
- Body, HsState0 =
- #dtls_hs_state{starting_read_seq = StartingReadSeq})
- when MessageSeq < StartingReadSeq ->
- %% this has to be the start of a new flight, let it through
- %%
- %% Note: this could (should?) be restricted further, the first message of a
- %% new flight has to have message_seq = 0
- %%
- HsState = dtls_hs_state_process_seq(HsState0),
- {HsState, SeqNo, Body};
-
-reassemble_dtls_fragment(_SeqNo, _Type, Length, MessageSeq, 0, Length,
- _Body, HsState = #dtls_hs_state{current_read_seq = CurrentReadSeq})
- when MessageSeq < CurrentReadSeq ->
- HsState;
-
-reassemble_dtls_fragment(SeqNo, _Type, Length, MessageSeq, 0, Length,
- Body, HsState0 = #dtls_hs_state{current_read_seq = MessageSeq}) ->
- %% Message fully contained and it's the current seq
- HsState1 = dtls_hs_state_process_seq(HsState0),
- {HsState1, SeqNo, Body};
-
-reassemble_dtls_fragment(SeqNo, Type, Length, MessageSeq, 0, Length,
- Body, HsState) ->
- %% Message fully contained and it's the NOT the current seq -> buffer
- Fragment = {SeqNo, Type, Length, MessageSeq,
- dtls_fragment_init(Length, 0, Length, Body)},
- dtls_hs_state_add_fragment(MessageSeq, Fragment, HsState);
-
-reassemble_dtls_fragment(_SeqNo, _Type, Length, MessageSeq, FragmentOffset, FragmentLength,
- _Body,
- HsState = #dtls_hs_state{current_read_seq = CurrentReadSeq})
- when FragmentOffset + FragmentLength == Length andalso MessageSeq == (CurrentReadSeq - 1) ->
- {retransmit, HsState};
-
-reassemble_dtls_fragment(_SeqNo, _Type, _Length, MessageSeq, _FragmentOffset, _FragmentLength,
- _Body,
- HsState = #dtls_hs_state{current_read_seq = CurrentReadSeq})
- when MessageSeq < CurrentReadSeq ->
- HsState;
-
-reassemble_dtls_fragment(SeqNo, Type, Length, MessageSeq,
- FragmentOffset, FragmentLength,
- Body,
- HsState = #dtls_hs_state{fragments = Fragments0}) ->
- case gb_trees:lookup(MessageSeq, Fragments0) of
- {value, Fragment} ->
- dtls_fragment_reassemble(SeqNo, Type, Length, MessageSeq,
- FragmentOffset, FragmentLength,
- Body, Fragment, HsState);
- none ->
- dtls_fragment_start(SeqNo, Type, Length, MessageSeq,
- FragmentOffset, FragmentLength,
- Body, HsState)
- end.
-dtls_fragment_start(SeqNo, Type, Length, MessageSeq,
- FragmentOffset, FragmentLength,
- Body, HsState = #dtls_hs_state{fragments = Fragments0}) ->
- Fragment = {SeqNo, Type, Length, MessageSeq,
- dtls_fragment_init(Length, FragmentOffset, FragmentLength, Body)},
- Fragments1 = gb_trees:insert(MessageSeq, Fragment, Fragments0),
- HsState#dtls_hs_state{fragments = Fragments1}.
-
-dtls_fragment_reassemble(SeqNo, Type, Length, MessageSeq,
- FragmentOffset, FragmentLength,
- Body,
- {LastSeqNo, Type, Length, MessageSeq, FragBuffer0},
- HsState = #dtls_hs_state{fragments = Fragments0}) ->
- FragBuffer1 = dtls_fragment_add(FragBuffer0, FragmentOffset, FragmentLength, Body),
- Fragment = {erlang:max(SeqNo, LastSeqNo), Type, Length, MessageSeq, FragBuffer1},
- Fragments1 = gb_trees:enter(MessageSeq, Fragment, Fragments0),
- HsState#dtls_hs_state{fragments = Fragments1};
-
-%% Type, Length or Seq mismatch, drop everything...
-%% Note: the RFC is not clear on how to handle this...
-dtls_fragment_reassemble(_SeqNo, _Type, _Length, MessageSeq,
- _FragmentOffset, _FragmentLength, _Body, _Fragment,
- HsState = #dtls_hs_state{fragments = Fragments0}) ->
- Fragments1 = gb_trees:delete_any(MessageSeq, Fragments0),
- HsState#dtls_hs_state{fragments = Fragments1}.
-
-dtls_fragment_add({Length, FragmentList0, Bin0}, FragmentOffset, FragmentLength, Body) ->
- Bin1 = dtls_fragment_bin_add(FragmentOffset, FragmentLength, Body, Bin0),
- FragmentList1 = add_fragment(FragmentList0, {FragmentOffset, FragmentLength}),
- {Length, FragmentList1, Bin1}.
-
-dtls_fragment_init(Length, 0, Length, Body) ->
- {Length, [{0, Length}], Body};
-dtls_fragment_init(Length, FragmentOffset, FragmentLength, Body) ->
- Bin = dtls_fragment_bin_add(FragmentOffset, FragmentLength, Body, <<0:(Length*8)>>),
- {Length, [{FragmentOffset, FragmentOffset + FragmentLength}], Bin}.
-
-dtls_fragment_bin_add(FragmentOffset, FragmentLength, Add, Buffer) ->
- <<First:FragmentOffset/bytes, _:FragmentLength/bytes, Rest/binary>> = Buffer,
- <<First/binary, Add/binary, Rest/binary>>.
-
-merge_fragment_list([], Fragment, Acc) ->
- lists:reverse([Fragment|Acc]);
-
-merge_fragment_list([H = {_, HEnd}|Rest], Frag = {FStart, _}, Acc)
- when FStart > HEnd ->
- merge_fragment_list(Rest, Frag, [H|Acc]);
-
-merge_fragment_list(Rest = [{HStart, _HEnd}|_], Frag = {_FStart, FEnd}, Acc)
- when FEnd < HStart ->
- lists:reverse(Acc) ++ [Frag|Rest];
-
-merge_fragment_list([{HStart, HEnd}|Rest], _Frag = {FStart, FEnd}, Acc)
- when
- FStart =< HEnd orelse FEnd >= HStart ->
- Start = erlang:min(HStart, FStart),
- End = erlang:max(HEnd, FEnd),
- NewFrag = {Start, End},
- merge_fragment_list(Rest, NewFrag, Acc).
-
-add_fragment(List, {FragmentOffset, FragmentLength}) ->
- merge_fragment_list(List, {FragmentOffset, FragmentOffset + FragmentLength}, []).
+%%%%%%% Encodeing %%%%%%%%%%%%%
enc_handshake(#hello_verify_request{protocol_version = {Major, Minor},
cookie = Cookie}, _Version) ->
- CookieLength = byte_size(Cookie),
+ CookieLength = byte_size(Cookie),
{?HELLO_VERIFY_REQUEST, <<?BYTE(Major), ?BYTE(Minor),
?BYTE(CookieLength),
- Cookie/binary>>};
+ Cookie:CookieLength/binary>>};
enc_handshake(#hello_request{}, _Version) ->
{?HELLO_REQUEST, <<>>};
@@ -459,38 +242,246 @@ enc_handshake(#client_hello{client_version = {Major, Minor},
?BYTE(CookieLength), Cookie/binary,
?UINT16(CsLength), BinCipherSuites/binary,
?BYTE(CmLength), BinCompMethods/binary, ExtensionsBin/binary>>};
+
+enc_handshake(#server_hello{} = HandshakeMsg, Version) ->
+ {Type, <<?BYTE(Major), ?BYTE(Minor), Rest/binary>>} =
+ ssl_handshake:encode_handshake(HandshakeMsg, Version),
+ {DTLSMajor, DTLSMinor} = dtls_v1:corresponding_dtls_version({Major, Minor}),
+ {Type, <<?BYTE(DTLSMajor), ?BYTE(DTLSMinor), Rest/binary>>};
+
enc_handshake(HandshakeMsg, Version) ->
ssl_handshake:encode_handshake(HandshakeMsg, Version).
-decode_handshake(_Version, ?CLIENT_HELLO, <<?BYTE(Major), ?BYTE(Minor), Random:32/binary,
+bin_fragments(Bin, Size) ->
+ bin_fragments(Bin, size(Bin), Size, 0, []).
+
+bin_fragments(Bin, BinSize, FragSize, Offset, Fragments) ->
+ case (BinSize - Offset - FragSize) > 0 of
+ true ->
+ Frag = binary:part(Bin, {Offset, FragSize}),
+ bin_fragments(Bin, BinSize, FragSize, Offset + FragSize, [{Frag, Offset} | Fragments]);
+ false ->
+ Frag = binary:part(Bin, {Offset, BinSize-Offset}),
+ lists:reverse([{Frag, Offset} | Fragments])
+ end.
+
+handshake_fragments(_, _, _, [], Acc) ->
+ lists:reverse(Acc);
+handshake_fragments(MsgType, Seq, Len, [{Bin, Offset} | Bins], Acc) ->
+ FragLen = size(Bin),
+ handshake_fragments(MsgType, Seq, Len, Bins,
+ [<<?BYTE(MsgType), Len/binary, Seq/binary, ?UINT24(Offset),
+ ?UINT24(FragLen), Bin/binary>> | Acc]).
+
+address_to_bin({A,B,C,D}, Port) ->
+ <<0:80,16#ffff:16,A,B,C,D,Port:16>>;
+address_to_bin({A,B,C,D,E,F,G,H}, Port) ->
+ <<A:16,B:16,C:16,D:16,E:16,F:16,G:16,H:16,Port:16>>.
+
+%%%%%%% Decodeing %%%%%%%%%%%%%
+
+handle_fragments(Version, FragmentData, Buffers0, Acc) ->
+ Fragments = decode_handshake_fragments(FragmentData),
+ do_handle_fragments(Version, Fragments, Buffers0, Acc).
+
+do_handle_fragments(_, [], Buffers, Acc) ->
+ {lists:reverse(Acc), Buffers};
+do_handle_fragments(Version, [Fragment | Fragments], Buffers0, Acc) ->
+ case reassemble(Version, Fragment, Buffers0) of
+ {more_data, _} = More when Acc == []->
+ More;
+ {more_data, Buffers} when Fragments == [] ->
+ {lists:reverse(Acc), Buffers};
+ {more_data, Buffers} ->
+ do_handle_fragments(Version, Fragments, Buffers, Acc);
+ {HsPacket, Buffers} ->
+ do_handle_fragments(Version, Fragments, Buffers, [HsPacket | Acc])
+ end.
+
+decode_handshake(Version, <<?BYTE(Type), Bin/binary>>) ->
+ decode_handshake(Version, Type, Bin).
+
+decode_handshake(_, ?HELLO_REQUEST, <<>>) ->
+ #hello_request{};
+decode_handshake(_Version, ?CLIENT_HELLO, <<?UINT24(_), ?UINT16(_),
+ ?UINT24(_), ?UINT24(_),
+ ?BYTE(Major), ?BYTE(Minor), Random:32/binary,
?BYTE(SID_length), Session_ID:SID_length/binary,
- ?BYTE(Cookie_length), Cookie:Cookie_length/binary,
+ ?BYTE(CookieLength), Cookie:CookieLength/binary,
?UINT16(Cs_length), CipherSuites:Cs_length/binary,
?BYTE(Cm_length), Comp_methods:Cm_length/binary,
Extensions/binary>>) ->
- DecodedExtensions = ssl_handshake:decode_hello_extensions(Extensions),
-
+ DecodedExtensions = ssl_handshake:decode_hello_extensions({client, Extensions}),
+
#client_hello{
client_version = {Major,Minor},
random = Random,
- session_id = Session_ID,
cookie = Cookie,
+ session_id = Session_ID,
cipher_suites = ssl_handshake:decode_suites('2_bytes', CipherSuites),
compression_methods = Comp_methods,
extensions = DecodedExtensions
- };
+ };
+
+decode_handshake(_Version, ?HELLO_VERIFY_REQUEST, <<?UINT24(_), ?UINT16(_),
+ ?UINT24(_), ?UINT24(_),
+ ?BYTE(Major), ?BYTE(Minor),
+ ?BYTE(CookieLength),
+ Cookie:CookieLength/binary>>) ->
+ #hello_verify_request{protocol_version = {Major, Minor},
+ cookie = Cookie};
+
+decode_handshake(Version, Tag, <<?UINT24(_), ?UINT16(_),
+ ?UINT24(_), ?UINT24(_), Msg/binary>>) ->
+ %% DTLS specifics stripped
+ decode_tls_thandshake(Version, Tag, Msg).
+
+decode_tls_thandshake(Version, Tag, Msg) ->
+ TLSVersion = dtls_v1:corresponding_tls_version(Version),
+ ssl_handshake:decode_handshake(TLSVersion, Tag, Msg).
+
+decode_handshake_fragments(<<>>) ->
+ [<<>>];
+decode_handshake_fragments(<<?BYTE(Type), ?UINT24(Length),
+ ?UINT16(MessageSeq),
+ ?UINT24(FragmentOffset), ?UINT24(FragmentLength),
+ Fragment:FragmentLength/binary, Rest/binary>>) ->
+ [#handshake_fragment{type = Type,
+ length = Length,
+ message_seq = MessageSeq,
+ fragment_offset = FragmentOffset,
+ fragment_length = FragmentLength,
+ fragment = Fragment} | decode_handshake_fragments(Rest)].
+
+reassemble(Version, #handshake_fragment{message_seq = Seq} = Fragment,
+ #protocol_buffers{dtls_handshake_next_seq = Seq,
+ dtls_handshake_next_fragments = Fragments0,
+ dtls_handshake_later_fragments = LaterFragments0} =
+ Buffers0)->
+ case reassemble_fragments(Fragment, Fragments0) of
+ {more_data, Fragments} ->
+ {more_data, Buffers0#protocol_buffers{dtls_handshake_next_fragments = Fragments}};
+ {raw, RawHandshake} ->
+ Handshake = decode_handshake(Version, RawHandshake),
+ {NextFragments, LaterFragments} = next_fragments(LaterFragments0),
+ {{Handshake, RawHandshake}, Buffers0#protocol_buffers{dtls_handshake_next_seq = Seq + 1,
+ dtls_handshake_next_fragments = NextFragments,
+ dtls_handshake_later_fragments = LaterFragments}}
+ end;
+reassemble(_, #handshake_fragment{message_seq = FragSeq} = Fragment,
+ #protocol_buffers{dtls_handshake_next_seq = Seq,
+ dtls_handshake_later_fragments = LaterFragments} = Buffers0) when FragSeq > Seq->
+ {more_data,
+ Buffers0#protocol_buffers{dtls_handshake_later_fragments = [Fragment | LaterFragments]}};
+reassemble(_, _, Buffers) ->
+ %% Disregard fragments FragSeq < Seq
+ {more_data, Buffers}.
+
+reassemble_fragments(Current, Fragments0) ->
+ [Frag1 | Frags] = lists:keysort(#handshake_fragment.fragment_offset, [Current | Fragments0]),
+ [Fragment | _] = Fragments = merge_fragment(Frag1, Frags),
+ case is_complete_handshake(Fragment) of
+ true ->
+ {raw, handshake_bin(Fragment)};
+ false ->
+ {more_data, Fragments}
+ end.
-decode_handshake(_Version, ?HELLO_VERIFY_REQUEST, <<?BYTE(Major), ?BYTE(Minor),
- ?BYTE(CookieLength), Cookie:CookieLength/binary>>) ->
+merge_fragment(Frag0, []) ->
+ [Frag0];
+merge_fragment(Frag0, [Frag1 | Rest]) ->
+ case merge_fragments(Frag0, Frag1) of
+ [_|_] = Frags ->
+ Frags ++ Rest;
+ Frag ->
+ merge_fragment(Frag, Rest)
+ end.
- #hello_verify_request{
- protocol_version = {Major,Minor},
- cookie = Cookie};
-decode_handshake(Version, Tag, Msg) ->
- ssl_handshake:decode_handshake(Version, Tag, Msg).
+is_complete_handshake(#handshake_fragment{length = Length, fragment_length = Length}) ->
+ true;
+is_complete_handshake(_) ->
+ false.
+
+next_fragments(LaterFragments) ->
+ case lists:keysort(#handshake_fragment.message_seq, LaterFragments) of
+ [] ->
+ {[], []};
+ [#handshake_fragment{message_seq = Seq} | _] = Fragments ->
+ split_frags(Fragments, Seq, [])
+ end.
-%% address_to_bin({A,B,C,D}, Port) ->
-%% <<0:80,16#ffff:16,A,B,C,D,Port:16>>;
-%% address_to_bin({A,B,C,D,E,F,G,H}, Port) ->
-%% <<A:16,B:16,C:16,D:16,E:16,F:16,G:16,H:16,Port:16>>.
+split_frags([#handshake_fragment{message_seq = Seq} = Frag | Rest], Seq, Acc) ->
+ split_frags(Rest, Seq, [Frag | Acc]);
+split_frags(Frags, _, Acc) ->
+ {lists:reverse(Acc), Frags}.
+
+
+%% Duplicate
+merge_fragments(#handshake_fragment{
+ fragment_offset = PreviousOffSet,
+ fragment_length = PreviousLen,
+ fragment = PreviousData
+ } = Previous,
+ #handshake_fragment{
+ fragment_offset = PreviousOffSet,
+ fragment_length = PreviousLen,
+ fragment = PreviousData}) ->
+ Previous;
+
+%% Lager fragment save new data
+merge_fragments(#handshake_fragment{
+ fragment_offset = PreviousOffSet,
+ fragment_length = PreviousLen,
+ fragment = PreviousData
+ } = Previous,
+ #handshake_fragment{
+ fragment_offset = PreviousOffSet,
+ fragment_length = CurrentLen,
+ fragment = CurrentData}) when CurrentLen > PreviousLen ->
+ NewLength = CurrentLen - PreviousLen,
+ <<_:PreviousLen/binary, NewData/binary>> = CurrentData,
+ Previous#handshake_fragment{
+ fragment_length = PreviousLen + NewLength,
+ fragment = <<PreviousData/binary, NewData/binary>>
+ };
+
+%% Smaller fragment
+merge_fragments(#handshake_fragment{
+ fragment_offset = PreviousOffSet,
+ fragment_length = PreviousLen
+ } = Previous,
+ #handshake_fragment{
+ fragment_offset = PreviousOffSet,
+ fragment_length = CurrentLen}) when CurrentLen < PreviousLen ->
+ Previous;
+%% Next fragment
+merge_fragments(#handshake_fragment{
+ fragment_offset = PreviousOffSet,
+ fragment_length = PreviousLen,
+ fragment = PreviousData
+ } = Previous,
+ #handshake_fragment{
+ fragment_offset = CurrentOffSet,
+ fragment_length = CurrentLen,
+ fragment = CurrentData}) when PreviousOffSet + PreviousLen == CurrentOffSet->
+ Previous#handshake_fragment{
+ fragment_length = PreviousLen + CurrentLen,
+ fragment = <<PreviousData/binary, CurrentData/binary>>};
+%% No merge there is a gap
+merge_fragments(Previous, Current) ->
+ [Previous, Current].
+
+handshake_bin(#handshake_fragment{
+ type = Type,
+ length = Len,
+ message_seq = Seq,
+ fragment_length = Len,
+ fragment_offset = 0,
+ fragment = Fragment}) ->
+ handshake_bin(Type, Len, Seq, Fragment).
+
+handshake_bin(Type, Length, Seq, FragmentData) ->
+ <<?BYTE(Type), ?UINT24(Length),
+ ?UINT16(Seq), ?UINT24(0), ?UINT24(Length),
+ FragmentData:Length/binary>>.
diff --git a/lib/ssl/src/dtls_handshake.hrl b/lib/ssl/src/dtls_handshake.hrl
index 0298fd3105..0a980c5f31 100644
--- a/lib/ssl/src/dtls_handshake.hrl
+++ b/lib/ssl/src/dtls_handshake.hrl
@@ -46,12 +46,13 @@
cookie
}).
--record(dtls_hs_state,
- {current_read_seq,
- starting_read_seq,
- highest_record_seq,
- fragments,
- completed
- }).
+-record(handshake_fragment, {
+ type,
+ length,
+ message_seq,
+ fragment_offset,
+ fragment_length,
+ fragment
+ }).
-endif. % -ifdef(dtls_handshake).
diff --git a/lib/ssl/src/dtls_record.erl b/lib/ssl/src/dtls_record.erl
index 8a6e2d315c..2b42ddf9b9 100644
--- a/lib/ssl/src/dtls_record.erl
+++ b/lib/ssl/src/dtls_record.erl
@@ -36,7 +36,9 @@
-export([decode_cipher_text/2]).
%% Encoding
--export([encode_plain_text/4, encode_tls_cipher_text/5, encode_change_cipher_spec/2]).
+-export([encode_handshake/4, encode_alert_record/3,
+ encode_change_cipher_spec/3, encode_data/3]).
+-export([encode_plain_text/5]).
%% Protocol version handling
-export([protocol_version/1, lowest_protocol_version/1, lowest_protocol_version/2,
@@ -44,9 +46,9 @@
is_higher/2, supported_protocol_versions/0,
is_acceptable_version/2]).
-%% DTLS Epoch handling
--export([init_connection_state_seq/2, current_connection_state_epoch/2,
- set_connection_state_by_epoch/3, connection_state_by_epoch/3]).
+-export([save_current_connection_state/2, next_epoch/2]).
+
+-export([init_connection_state_seq/2, current_connection_state_epoch/2]).
-export_type([dtls_version/0, dtls_atom_version/0]).
@@ -68,16 +70,64 @@
%%--------------------------------------------------------------------
init_connection_states(Role, BeastMitigation) ->
ConnectionEnd = ssl_record:record_protocol_role(Role),
- Current = initial_connection_state(ConnectionEnd, BeastMitigation),
- Pending = ssl_record:empty_connection_state(ConnectionEnd, BeastMitigation),
- #{write_msg_seq => 0,
- prvious_read => undefined,
+ Initial = initial_connection_state(ConnectionEnd, BeastMitigation),
+ Current = Initial#{epoch := 0},
+ InitialPending = ssl_record:empty_connection_state(ConnectionEnd, BeastMitigation),
+ Pending = InitialPending#{epoch => undefined},
+ #{saved_read => Current,
current_read => Current,
pending_read => Pending,
- prvious_write => undefined,
+ saved_write => Current,
current_write => Current,
pending_write => Pending}.
-
+
+%%--------------------------------------------------------------------
+-spec save_current_connection_state(ssl_record:connection_states(), read | write) ->
+ ssl_record:connection_states().
+%%
+%% Description: Returns the instance of the connection_state map
+%% where the current read|write state has been copied to the save state.
+%%--------------------------------------------------------------------
+save_current_connection_state(#{current_read := Current} = States, read) ->
+ States#{saved_read := Current};
+
+save_current_connection_state(#{current_write := Current} = States, write) ->
+ States#{saved_write := Current}.
+
+next_epoch(#{pending_read := Pending,
+ current_read := #{epoch := Epoch}} = States, read) ->
+ States#{pending_read := Pending#{epoch := Epoch + 1}};
+
+next_epoch(#{pending_write := Pending,
+ current_write := #{epoch := Epoch}} = States, write) ->
+ States#{pending_write := Pending#{epoch := Epoch + 1}}.
+
+get_connection_state_by_epoch(Epoch, #{current_write := #{epoch := Epoch} = Current},
+ write) ->
+ Current;
+get_connection_state_by_epoch(Epoch, #{saved_write := #{epoch := Epoch} = Saved},
+ write) ->
+ Saved;
+get_connection_state_by_epoch(Epoch, #{current_read := #{epoch := Epoch} = Current},
+ read) ->
+ Current;
+get_connection_state_by_epoch(Epoch, #{saved_read := #{epoch := Epoch} = Saved},
+ read) ->
+ Saved.
+
+set_connection_state_by_epoch(WriteState, Epoch, #{current_write := #{epoch := Epoch}} = States,
+ write) ->
+ States#{current_write := WriteState};
+set_connection_state_by_epoch(WriteState, Epoch, #{saved_write := #{epoch := Epoch}} = States,
+ write) ->
+ States#{saved_write := WriteState};
+set_connection_state_by_epoch(ReadState, Epoch, #{current_read := #{epoch := Epoch}} = States,
+ read) ->
+ States#{current_read := ReadState};
+set_connection_state_by_epoch(ReadState, Epoch, #{saved_read := #{epoch := Epoch}} = States,
+ read) ->
+ States#{saved_read := ReadState}.
+
%%--------------------------------------------------------------------
-spec get_dtls_records(binary(), binary()) -> {[binary()], binary()} | #alert{}.
%%
@@ -140,98 +190,57 @@ get_dtls_records_aux(Data, Acc) ->
?ALERT_REC(?FATAL, ?UNEXPECTED_MESSAGE)
end.
-encode_plain_text(Type, Version, Data,
- #{current_write :=
- #{epoch := Epoch,
- sequence_number := Seq,
- compression_state := CompS0,
- security_parameters :=
- #security_parameters{
- cipher_type = ?AEAD,
- compression_algorithm = CompAlg}
- }= WriteState0} = ConnectionStates) ->
- {Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
- WriteState1 = WriteState0#{compression_state => CompS1},
- AAD = calc_aad(Type, Version, Epoch, Seq),
- {CipherFragment, WriteState} = ssl_record:cipher_aead(dtls_v1:corresponding_tls_version(Version),
- Comp, WriteState1, AAD),
- CipherText = encode_tls_cipher_text(Type, Version, Epoch, Seq, CipherFragment),
- {CipherText, ConnectionStates#{current_write => WriteState#{sequence_number => Seq +1}}};
-
-encode_plain_text(Type, Version, Data,
- #{current_write :=
- #{epoch := Epoch,
- sequence_number := Seq,
- compression_state := CompS0,
- security_parameters :=
- #security_parameters{compression_algorithm = CompAlg}
- }= WriteState0} = ConnectionStates) ->
- {Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
- WriteState1 = WriteState0#{compression_state => CompS1},
- MacHash = calc_mac_hash(WriteState1, Type, Version, Epoch, Seq, Comp),
- {CipherFragment, WriteState} = ssl_record:cipher(dtls_v1:corresponding_tls_version(Version),
- Comp, WriteState1, MacHash),
- CipherText = encode_tls_cipher_text(Type, Version, Epoch, Seq, CipherFragment),
- {CipherText, ConnectionStates#{current_write => WriteState#{sequence_number => Seq +1}}}.
+%%--------------------------------------------------------------------
+-spec encode_handshake(iolist(), dtls_version(), integer(), ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
+%
+%% Description: Encodes a handshake message to send on the ssl-socket.
+%%--------------------------------------------------------------------
+encode_handshake(Frag, Version, Epoch, ConnectionStates) ->
+ encode_plain_text(?HANDSHAKE, Version, Epoch, Frag, ConnectionStates).
-decode_cipher_text(#ssl_tls{type = Type, version = Version,
- epoch = Epoch,
- sequence_number = Seq,
- fragment = CipherFragment} = CipherText,
- #{current_read :=
- #{compression_state := CompressionS0,
- security_parameters :=
- #security_parameters{
- cipher_type = ?AEAD,
- compression_algorithm = CompAlg}
- } = ReadState0} = ConnnectionStates0) ->
- AAD = calc_aad(Type, Version, Epoch, Seq),
- case ssl_record:decipher_aead(dtls_v1:corresponding_tls_version(Version),
- CipherFragment, ReadState0, AAD) of
- {PlainFragment, ReadState1} ->
- {Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
- PlainFragment, CompressionS0),
- ConnnectionStates = ConnnectionStates0#{
- current_read => ReadState1#{
- compression_state => CompressionS1}},
- {CipherText#ssl_tls{fragment = Plain}, ConnnectionStates};
- #alert{} = Alert ->
- Alert
- end;
-decode_cipher_text(#ssl_tls{type = Type, version = Version,
- epoch = Epoch,
- sequence_number = Seq,
- fragment = CipherFragment} = CipherText,
- #{current_read :=
- #{compression_state := CompressionS0,
- security_parameters :=
- #security_parameters{
- compression_algorithm = CompAlg}
- } = ReadState0}= ConnnectionStates0) ->
- {PlainFragment, Mac, ReadState1} = ssl_record:decipher(dtls_v1:corresponding_tls_version(Version),
- CipherFragment, ReadState0, true),
- MacHash = calc_mac_hash(ReadState1, Type, Version, Epoch, Seq, PlainFragment),
- case ssl_record:is_correct_mac(Mac, MacHash) of
- true ->
- {Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
- PlainFragment, CompressionS0),
- ConnnectionStates = ConnnectionStates0#{
- current_read => ReadState1#{
- compression_state => CompressionS1}},
- {CipherText#ssl_tls{fragment = Plain}, ConnnectionStates};
- false ->
- ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC)
- end.
+%%--------------------------------------------------------------------
+-spec encode_alert_record(#alert{}, dtls_version(), ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
+%%
+%% Description: Encodes an alert message to send on the ssl-socket.
+%%--------------------------------------------------------------------
+encode_alert_record(#alert{level = Level, description = Description},
+ Version, ConnectionStates) ->
+ #{epoch := Epoch} = ssl_record:current_connection_state(ConnectionStates, write),
+ encode_plain_text(?ALERT, Version, Epoch, <<?BYTE(Level), ?BYTE(Description)>>,
+ ConnectionStates).
%%--------------------------------------------------------------------
--spec encode_change_cipher_spec(dtls_version(), ssl_record:connection_states()) ->
+-spec encode_change_cipher_spec(dtls_version(), integer(), ssl_record:connection_states()) ->
{iolist(), ssl_record:connection_states()}.
%%
%% Description: Encodes a change_cipher_spec-message to send on the ssl socket.
%%--------------------------------------------------------------------
-encode_change_cipher_spec(Version, ConnectionStates) ->
- encode_plain_text(?CHANGE_CIPHER_SPEC, Version, <<1:8>>, ConnectionStates).
+encode_change_cipher_spec(Version, Epoch, ConnectionStates) ->
+ encode_plain_text(?CHANGE_CIPHER_SPEC, Version, Epoch, ?byte(?CHANGE_CIPHER_SPEC_PROTO), ConnectionStates).
+
+%%--------------------------------------------------------------------
+-spec encode_data(binary(), dtls_version(), ssl_record:connection_states()) ->
+ {iolist(),ssl_record:connection_states()}.
+%%
+%% Description: Encodes data to send on the ssl-socket.
+%%--------------------------------------------------------------------
+encode_data(Data, Version, ConnectionStates) ->
+ #{epoch := Epoch} = ssl_record:current_connection_state(ConnectionStates, write),
+ encode_plain_text(?APPLICATION_DATA, Version, Epoch, Data, ConnectionStates).
+
+encode_plain_text(Type, Version, Epoch, Data, ConnectionStates) ->
+ Write0 = get_connection_state_by_epoch(Epoch, ConnectionStates, write),
+ {CipherFragment, Write1} = encode_plain_text(Type, Version, Data, Write0),
+ {CipherText, Write} = encode_dtls_cipher_text(Type, Version, CipherFragment, Write1),
+ {CipherText, set_connection_state_by_epoch(Write, Epoch, ConnectionStates, write)}.
+
+
+decode_cipher_text(#ssl_tls{epoch = Epoch} = CipherText, ConnnectionStates0) ->
+ ReadState = get_connection_state_by_epoch(Epoch, ConnnectionStates0, read),
+ decode_cipher_text(CipherText, ReadState, ConnnectionStates0).
%%--------------------------------------------------------------------
-spec protocol_version(dtls_atom_version() | dtls_version()) ->
@@ -373,12 +382,11 @@ is_acceptable_version(Version, Versions) ->
%% This is only valid for DTLS in the first client_hello
%%--------------------------------------------------------------------
init_connection_state_seq({254, _},
- #{current_read := #{epoch := 0} = Read,
- current_write := #{epoch := 0} = Write} = CS0) ->
- Seq = maps:get(sequence_number, Read),
- CS0#{current_write => Write#{sequence_number => Seq}};
-init_connection_state_seq(_, CS) ->
- CS.
+ #{current_read := #{epoch := 0, sequence_number := Seq},
+ current_write := #{epoch := 0} = Write} = ConnnectionStates0) ->
+ ConnnectionStates0#{current_write => Write#{sequence_number => Seq}};
+init_connection_state_seq(_, ConnnectionStates) ->
+ ConnnectionStates.
%%--------------------------------------------------------
-spec current_connection_state_epoch(ssl_record:connection_states(), read | write) ->
@@ -387,49 +395,12 @@ init_connection_state_seq(_, CS) ->
%% Description: Returns the epoch the connection_state record
%% that is currently defined as the current conection state.
%%--------------------------------------------------------------------
-current_connection_state_epoch(#{current_read := Current},
+current_connection_state_epoch(#{current_read := #{epoch := Epoch}},
read) ->
- maps:get(epoch, Current);
-current_connection_state_epoch(#{current_write := Current},
+ Epoch;
+current_connection_state_epoch(#{current_write := #{epoch := Epoch}},
write) ->
- maps:get(epoch, Current).
-
-%%--------------------------------------------------------------------
-
--spec connection_state_by_epoch(ssl_record:connection_states(), integer(), read | write) ->
- ssl_record:connection_state().
-%%
-%% Description: Returns the instance of the connection_state record
-%% that is defined by the Epoch.
-%%--------------------------------------------------------------------
-connection_state_by_epoch(#{current_read := #{epoch := Epoch}} = CS, Epoch, read) ->
- CS;
-connection_state_by_epoch(#{pending_read := #{epoch := Epoch}} = CS, Epoch, read) ->
- CS;
-connection_state_by_epoch(#{current_write := #{epoch := Epoch}} = CS, Epoch, write) ->
- CS;
-connection_state_by_epoch(#{pending_write := #{epoch := Epoch}} = CS, Epoch, write) ->
- CS.
-%%--------------------------------------------------------------------
--spec set_connection_state_by_epoch(ssl_record:connection_states(),
- ssl_record:connection_state(), read | write)
- -> ssl_record:connection_states().
-%%
-%% Description: Returns the instance of the connection_state record
-%% that is defined by the Epoch.
-%%--------------------------------------------------------------------
-set_connection_state_by_epoch(#{current_read := #{epoch := Epoch}} = ConnectionStates0,
- NewCS = #{epoch := Epoch}, read) ->
- ConnectionStates0#{current_read => NewCS};
-set_connection_state_by_epoch(#{pending_read := #{epoch := Epoch}} = ConnectionStates0,
- NewCS = #{epoch := Epoch}, read) ->
- ConnectionStates0#{pending_read => NewCS};
-set_connection_state_by_epoch(#{current_write := #{epoch := Epoch}} = ConnectionStates0,
- NewCS = #{epoch := Epoch}, write) ->
- ConnectionStates0#{current_write => NewCS};
-set_connection_state_by_epoch(#{pending_write := #{epoch := Epoch}} = ConnectionStates0,
-NewCS = #{epoch := Epoch}, write) ->
- ConnectionStates0#{pending_write => NewCS}.
+ Epoch.
%%--------------------------------------------------------------------
%%% Internal functions
@@ -437,8 +408,8 @@ NewCS = #{epoch := Epoch}, write) ->
initial_connection_state(ConnectionEnd, BeastMitigation) ->
#{security_parameters =>
ssl_record:initial_security_params(ConnectionEnd),
- epoch => 0,
- sequence_number => 1,
+ epoch => undefined,
+ sequence_number => 0,
beast_mitigation => BeastMitigation,
compression_state => undefined,
cipher_state => undefined,
@@ -458,14 +429,85 @@ highest_list_protocol_version(Ver, []) ->
highest_list_protocol_version(Ver1, [Ver2 | Rest]) ->
highest_list_protocol_version(highest_protocol_version(Ver1, Ver2), Rest).
-encode_tls_cipher_text(Type, {MajVer, MinVer}, Epoch, Seq, Fragment) ->
+encode_dtls_cipher_text(Type, {MajVer, MinVer}, Fragment,
+ #{epoch := Epoch, sequence_number := Seq} = WriteState) ->
Length = erlang:iolist_size(Fragment),
- [<<?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer), ?UINT16(Epoch),
- ?UINT48(Seq), ?UINT16(Length)>>, Fragment].
+ {[<<?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer), ?UINT16(Epoch),
+ ?UINT48(Seq), ?UINT16(Length)>>, Fragment],
+ WriteState#{sequence_number => Seq + 1}}.
+
+encode_plain_text(Type, Version, Data, #{compression_state := CompS0,
+ epoch := Epoch,
+ sequence_number := Seq,
+ security_parameters :=
+ #security_parameters{
+ cipher_type = ?AEAD,
+ compression_algorithm = CompAlg}
+ } = WriteState0) ->
+ {Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
+ WriteState1 = WriteState0#{compression_state => CompS1},
+ AAD = calc_aad(Type, Version, Epoch, Seq),
+ ssl_record:cipher_aead(dtls_v1:corresponding_tls_version(Version), Comp, WriteState1, AAD);
+encode_plain_text(Type, Version, Data, #{compression_state := CompS0,
+ epoch := Epoch,
+ sequence_number := Seq,
+ security_parameters :=
+ #security_parameters{compression_algorithm = CompAlg}
+ }= WriteState0) ->
+ {Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
+ WriteState1 = WriteState0#{compression_state => CompS1},
+ MacHash = calc_mac_hash(Type, Version, WriteState1, Epoch, Seq, Comp),
+ ssl_record:cipher(dtls_v1:corresponding_tls_version(Version), Comp, WriteState1, MacHash).
+
+decode_cipher_text(#ssl_tls{type = Type, version = Version,
+ epoch = Epoch,
+ sequence_number = Seq,
+ fragment = CipherFragment} = CipherText,
+ #{compression_state := CompressionS0,
+ security_parameters :=
+ #security_parameters{
+ cipher_type = ?AEAD,
+ compression_algorithm = CompAlg}} = ReadState0,
+ ConnnectionStates0) ->
+ AAD = calc_aad(Type, Version, Epoch, Seq),
+ case ssl_record:decipher_aead(dtls_v1:corresponding_tls_version(Version),
+ CipherFragment, ReadState0, AAD) of
+ {PlainFragment, ReadState1} ->
+ {Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
+ PlainFragment, CompressionS0),
+ ReadState = ReadState1#{compression_state => CompressionS1},
+ ConnnectionStates = set_connection_state_by_epoch(ReadState, Epoch, ConnnectionStates0, read),
+ {CipherText#ssl_tls{fragment = Plain}, ConnnectionStates};
+ #alert{} = Alert ->
+ Alert
+ end;
+decode_cipher_text(#ssl_tls{type = Type, version = Version,
+ epoch = Epoch,
+ sequence_number = Seq,
+ fragment = CipherFragment} = CipherText,
+ #{compression_state := CompressionS0,
+ security_parameters :=
+ #security_parameters{
+ compression_algorithm = CompAlg}} = ReadState0,
+ ConnnectionStates0) ->
+ {PlainFragment, Mac, ReadState1} = ssl_record:decipher(dtls_v1:corresponding_tls_version(Version),
+ CipherFragment, ReadState0, true),
+ MacHash = calc_mac_hash(Type, Version, ReadState1, Epoch, Seq, PlainFragment),
+ case ssl_record:is_correct_mac(Mac, MacHash) of
+ true ->
+ {Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
+ PlainFragment, CompressionS0),
+
+ ReadState = ReadState1#{compression_state => CompressionS1},
+ ConnnectionStates = set_connection_state_by_epoch(ReadState, Epoch, ConnnectionStates0, read),
+ {CipherText#ssl_tls{fragment = Plain}, ConnnectionStates};
+ false ->
+ ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC)
+ end.
-calc_mac_hash(#{mac_secret := MacSecret,
- security_parameters := #security_parameters{mac_algorithm = MacAlg}},
- Type, Version, Epoch, SeqNo, Fragment) ->
+calc_mac_hash(Type, Version, #{mac_secret := MacSecret,
+ security_parameters := #security_parameters{mac_algorithm = MacAlg}},
+ Epoch, SeqNo, Fragment) ->
Length = erlang:iolist_size(Fragment),
NewSeq = (Epoch bsl 48) + SeqNo,
mac_hash(Version, MacAlg, MacSecret, NewSeq, Type,
diff --git a/lib/ssl/src/dtls_record.hrl b/lib/ssl/src/dtls_record.hrl
index b9f84cbe7f..373481c3f8 100644
--- a/lib/ssl/src/dtls_record.hrl
+++ b/lib/ssl/src/dtls_record.hrl
@@ -34,11 +34,10 @@
-record(ssl_tls, {
type,
version,
- epoch,
- sequence_number,
- offset,
- length,
- fragment
+ %%length,
+ fragment,
+ epoch,
+ sequence_number
}).
-endif. % -ifdef(dtls_record).
diff --git a/lib/ssl/src/dtls_socket.erl b/lib/ssl/src/dtls_socket.erl
new file mode 100644
index 0000000000..570b3ae83a
--- /dev/null
+++ b/lib/ssl/src/dtls_socket.erl
@@ -0,0 +1,148 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2016-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(dtls_socket).
+
+-include("ssl_internal.hrl").
+-include("ssl_api.hrl").
+
+-export([send/3, listen/3, accept/3, connect/4, socket/4, setopts/3, getopts/3, getstat/3,
+ peername/2, sockname/2, port/2, close/2]).
+-export([emulated_options/0, internal_inet_values/0, default_inet_values/0, default_cb_info/0]).
+
+send(Transport, {{IP,Port},Socket}, Data) ->
+ Transport:send(Socket, IP, Port, Data).
+
+listen(gen_udp = Transport, Port, #config{transport_info = {Transport, _, _, _},
+ ssl = SslOpts,
+ emulated = EmOpts,
+ inet_user = Options} = Config) ->
+
+
+ case dtls_udp_sup:start_child([Port, emulated_socket_options(EmOpts, #socket_options{}),
+ Options ++ internal_inet_values(), SslOpts]) of
+ {ok, Pid} ->
+ {ok, #sslsocket{pid = {udp, Config#config{udp_handler = {Pid, Port}}}}};
+ Err = {error, _} ->
+ Err
+ end.
+
+accept(udp, #config{transport_info = {Transport = gen_udp,_,_,_},
+ connection_cb = ConnectionCb,
+ udp_handler = {Listner, _}}, _Timeout) ->
+ case dtls_udp_listener:accept(Listner, self()) of
+ {ok, Pid, Socket} ->
+ {ok, socket(Pid, Transport, {Listner, Socket}, ConnectionCb)};
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+connect(Address, Port, #config{transport_info = {Transport, _, _, _} = CbInfo,
+ connection_cb = ConnectionCb,
+ ssl = SslOpts,
+ emulated = EmOpts,
+ inet_ssl = SocketOpts}, Timeout) ->
+ case Transport:open(0, SocketOpts ++ internal_inet_values()) of
+ {ok, Socket} ->
+ ssl_connection:connect(ConnectionCb, Address, Port, {{Address, Port},Socket},
+ {SslOpts,
+ emulated_socket_options(EmOpts, #socket_options{}), undefined},
+ self(), CbInfo, Timeout);
+ {error, _} = Error->
+ Error
+ end.
+
+close(gen_udp, {_Client, _Socket}) ->
+ ok.
+
+socket(Pid, Transport, Socket, ConnectionCb) ->
+ #sslsocket{pid = Pid,
+ %% "The name "fd" is keept for backwards compatibility
+ fd = {Transport, Socket, ConnectionCb}}.
+
+%% Vad göra med emulerade
+setopts(gen_udp, #sslsocket{pid = {Socket, _}}, Options) ->
+ {SockOpts, _} = tls_socket:split_options(Options),
+ inet:setopts(Socket, SockOpts);
+setopts(_, #sslsocket{pid = {ListenSocket, #config{transport_info = {Transport,_,_,_}}}}, Options) ->
+ {SockOpts, _} = tls_socket:split_options(Options),
+ Transport:setopts(ListenSocket, SockOpts);
+%%% Following clauses will not be called for emulated options, they are handled in the connection process
+setopts(gen_udp, Socket, Options) ->
+ inet:setopts(Socket, Options);
+setopts(Transport, Socket, Options) ->
+ Transport:setopts(Socket, Options).
+
+getopts(gen_udp, #sslsocket{pid = {Socket, #config{emulated = EmOpts}}}, Options) ->
+ {SockOptNames, EmulatedOptNames} = tls_socket:split_options(Options),
+ EmulatedOpts = get_emulated_opts(EmOpts, EmulatedOptNames),
+ SocketOpts = tls_socket:get_socket_opts(Socket, SockOptNames, inet),
+ {ok, EmulatedOpts ++ SocketOpts};
+getopts(Transport, #sslsocket{pid = {ListenSocket, #config{emulated = EmOpts}}}, Options) ->
+ {SockOptNames, EmulatedOptNames} = tls_socket:split_options(Options),
+ EmulatedOpts = get_emulated_opts(EmOpts, EmulatedOptNames),
+ SocketOpts = tls_socket:get_socket_opts(ListenSocket, SockOptNames, Transport),
+ {ok, EmulatedOpts ++ SocketOpts};
+%%% Following clauses will not be called for emulated options, they are handled in the connection process
+getopts(gen_udp, {_,Socket}, Options) ->
+ inet:getopts(Socket, Options);
+getopts(Transport, Socket, Options) ->
+ Transport:getopts(Socket, Options).
+getstat(gen_udp, {_,Socket}, Options) ->
+ inet:getstat(Socket, Options);
+getstat(Transport, Socket, Options) ->
+ Transport:getstat(Socket, Options).
+peername(gen_udp, {_, {Client, _Socket}}) ->
+ {ok, Client};
+peername(Transport, Socket) ->
+ Transport:peername(Socket).
+sockname(gen_udp, {_,Socket}) ->
+ inet:sockname(Socket);
+sockname(Transport, Socket) ->
+ Transport:sockname(Socket).
+
+port(gen_udp, {_,Socket}) ->
+ inet:port(Socket);
+port(Transport, Socket) ->
+ Transport:port(Socket).
+
+emulated_options() ->
+ [mode, active, packet, packet_size].
+
+internal_inet_values() ->
+ [{active, false}, {mode,binary}].
+
+default_inet_values() ->
+ [{active, true}, {mode, list}].
+
+default_cb_info() ->
+ {gen_udp, udp, udp_closed, udp_error}.
+
+get_emulated_opts(EmOpts, EmOptNames) ->
+ lists:map(fun(Name) -> {value, Value} = lists:keysearch(Name, 1, EmOpts),
+ Value end,
+ EmOptNames).
+
+emulated_socket_options(InetValues, #socket_options{
+ mode = Mode,
+ active = Active}) ->
+ #socket_options{
+ mode = proplists:get_value(mode, InetValues, Mode),
+ active = proplists:get_value(active, InetValues, Active)
+ }.
diff --git a/lib/ssl/src/dtls_udp_listener.erl b/lib/ssl/src/dtls_udp_listener.erl
new file mode 100644
index 0000000000..b7f115582e
--- /dev/null
+++ b/lib/ssl/src/dtls_udp_listener.erl
@@ -0,0 +1,205 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2016-2016. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+
+-module(dtls_udp_listener).
+
+-behaviour(gen_server).
+
+%% API
+-export([start_link/4, active_once/3, accept/2, sockname/1]).
+
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
+
+-record(state,
+ {port,
+ listner,
+ dtls_options,
+ emulated_options,
+ dtls_msq_queues = kv_new(),
+ clients = set_new(),
+ dtls_processes = kv_new(),
+ accepters = queue:new(),
+ first
+ }).
+
+%%%===================================================================
+%%% API
+%%%===================================================================
+
+start_link(Port, EmOpts, InetOptions, DTLSOptions) ->
+ gen_server:start_link(?MODULE, [Port, EmOpts, InetOptions, DTLSOptions], []).
+
+active_once(UDPConnection, Client, Pid) ->
+ gen_server:cast(UDPConnection, {active_once, Client, Pid}).
+
+accept(UDPConnection, Accepter) ->
+ gen_server:call(UDPConnection, {accept, Accepter}, infinity).
+
+sockname(UDPConnection) ->
+ gen_server:call(UDPConnection, sockname, infinity).
+
+%%%===================================================================
+%%% gen_server callbacks
+%%%===================================================================
+
+init([Port, EmOpts, InetOptions, DTLSOptions]) ->
+ try
+ {ok, Socket} = gen_udp:open(Port, InetOptions),
+ {ok, #state{port = Port,
+ first = true,
+ dtls_options = DTLSOptions,
+ emulated_options = EmOpts,
+ listner = Socket}}
+ catch _:_ ->
+ {error, closed}
+ end.
+
+handle_call({accept, Accepter}, From, #state{first = true,
+ accepters = Accepters,
+ listner = Socket} = State0) ->
+ next_datagram(Socket),
+ State = State0#state{first = false,
+ accepters = queue:in({Accepter, From}, Accepters)},
+ {noreply, State};
+
+handle_call({accept, Accepter}, From, #state{accepters = Accepters} = State0) ->
+ State = State0#state{accepters = queue:in({Accepter, From}, Accepters)},
+ {noreply, State};
+handle_call(sockname, _, #state{listner = Socket} = State) ->
+ Reply = inet:sockname(Socket),
+ {reply, Reply, State}.
+
+handle_cast({active_once, Client, Pid}, State0) ->
+ State = handle_active_once(Client, Pid, State0),
+ {noreply, State}.
+
+handle_info({udp, Socket, IP, InPortNo, _} = Msg, #state{listner = Socket} = State0) ->
+ State = handle_datagram({IP, InPortNo}, Msg, State0),
+ next_datagram(Socket),
+ {noreply, State};
+
+handle_info({'DOWN', _, process, Pid, _}, #state{clients = Clients,
+ dtls_processes = Processes0} = State) ->
+ Client = kv_get(Pid, Processes0),
+ Processes = kv_delete(Pid, Processes0),
+ {noreply, State#state{clients = set_delete(Client, Clients),
+ dtls_processes = Processes}}.
+
+terminate(_Reason, _State) ->
+ ok.
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%%===================================================================
+%%% Internal functions
+%%%===================================================================
+handle_datagram(Client, Msg, #state{clients = Clients,
+ accepters = AcceptorsQueue0} = State) ->
+ case set_is_member(Client, Clients) of
+ false ->
+ case queue:out(AcceptorsQueue0) of
+ {{value, {UserPid, From}}, AcceptorsQueue} ->
+ setup_new_connection(UserPid, From, Client, Msg,
+ State#state{accepters = AcceptorsQueue});
+ {empty, _} ->
+ %% Drop packet client will resend
+ State
+ end;
+ true ->
+ dispatch(Client, Msg, State)
+ end.
+
+dispatch(Client, Msg, #state{dtls_msq_queues = MsgQueues} = State) ->
+ case kv_lookup(Client, MsgQueues) of
+ {value, Queue0} ->
+ case queue:out(Queue0) of
+ {{value, Pid}, Queue} when is_pid(Pid) ->
+ Pid ! Msg,
+ State#state{dtls_msq_queues =
+ kv_update(Client, Queue, MsgQueues)};
+ {{value, _}, Queue} ->
+ State#state{dtls_msq_queues =
+ kv_update(Client, queue:in(Msg, Queue), MsgQueues)};
+ {empty, Queue} ->
+ State#state{dtls_msq_queues =
+ kv_update(Client, queue:in(Msg, Queue), MsgQueues)}
+ end
+ end.
+next_datagram(Socket) ->
+ inet:setopts(Socket, [{active, once}]).
+
+handle_active_once(Client, Pid, #state{dtls_msq_queues = MsgQueues} = State0) ->
+ Queue0 = kv_get(Client, MsgQueues),
+ case queue:out(Queue0) of
+ {{value, Pid}, _} when is_pid(Pid) ->
+ State0;
+ {{value, Msg}, Queue} ->
+ Pid ! Msg,
+ State0#state{dtls_msq_queues = kv_update(Client, Queue, MsgQueues)};
+ {empty, Queue0} ->
+ State0#state{dtls_msq_queues = kv_update(Client, queue:in(Pid, Queue0), MsgQueues)}
+ end.
+
+setup_new_connection(User, From, Client, Msg, #state{dtls_processes = Processes,
+ clients = Clients,
+ dtls_msq_queues = MsgQueues,
+ dtls_options = DTLSOpts,
+ port = Port,
+ listner = Socket,
+ emulated_options = EmOpts} = State) ->
+ ConnArgs = [server, "localhost", Port, {self(), {Client, Socket}},
+ {DTLSOpts, EmOpts, udp_listner}, User, dtls_socket:default_cb_info()],
+ case dtls_connection_sup:start_child(ConnArgs) of
+ {ok, Pid} ->
+ erlang:monitor(process, Pid),
+ gen_server:reply(From, {ok, Pid, {Client, Socket}}),
+ Pid ! Msg,
+ State#state{clients = set_insert(Client, Clients),
+ dtls_msq_queues = kv_insert(Client, queue:new(), MsgQueues),
+ dtls_processes = kv_insert(Pid, Client, Processes)};
+ {error, Reason} ->
+ gen_server:reply(From, {error, Reason}),
+ State
+ end.
+kv_update(Key, Value, Store) ->
+ gb_trees:update(Key, Value, Store).
+kv_lookup(Key, Store) ->
+ gb_trees:lookup(Key, Store).
+kv_insert(Key, Value, Store) ->
+ gb_trees:insert(Key, Value, Store).
+kv_get(Key, Store) ->
+ gb_trees:get(Key, Store).
+kv_delete(Key, Store) ->
+ gb_trees:delete(Key, Store).
+kv_new() ->
+ gb_trees:empty().
+
+set_new() ->
+ gb_sets:empty().
+set_insert(Item, Set) ->
+ gb_sets:insert(Item, Set).
+set_delete(Item, Set) ->
+ gb_sets:delete(Item, Set).
+set_is_member(Item, Set) ->
+ gb_sets:is_member(Item, Set).
diff --git a/lib/ssl/src/dtls_udp_sup.erl b/lib/ssl/src/dtls_udp_sup.erl
new file mode 100644
index 0000000000..197882e92f
--- /dev/null
+++ b/lib/ssl/src/dtls_udp_sup.erl
@@ -0,0 +1,62 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2016-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: Supervisor for a procsses dispatching upd datagrams to
+%% correct DTLS handler
+%%----------------------------------------------------------------------
+-module(dtls_udp_sup).
+
+-behaviour(supervisor).
+
+%% API
+-export([start_link/0]).
+-export([start_child/1]).
+
+%% Supervisor callback
+-export([init/1]).
+
+%%%=========================================================================
+%%% API
+%%%=========================================================================
+start_link() ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+start_child(Args) ->
+ supervisor:start_child(?MODULE, Args).
+
+%%%=========================================================================
+%%% Supervisor callback
+%%%=========================================================================
+init(_O) ->
+ RestartStrategy = simple_one_for_one,
+ MaxR = 0,
+ MaxT = 3600,
+
+ Name = undefined, % As simple_one_for_one is used.
+ StartFunc = {dtls_udp_listener, start_link, []},
+ Restart = temporary, % E.g. should not be restarted
+ Shutdown = 4000,
+ Modules = [dtls_udp_listener],
+ Type = worker,
+
+ ChildSpec = {Name, StartFunc, Restart, Shutdown, Type, Modules},
+ {ok, {{RestartStrategy, MaxR, MaxT}, [ChildSpec]}}.
diff --git a/lib/ssl/src/dtls_v1.erl b/lib/ssl/src/dtls_v1.erl
index 8c03bda513..ffd3e4b833 100644
--- a/lib/ssl/src/dtls_v1.erl
+++ b/lib/ssl/src/dtls_v1.erl
@@ -21,7 +21,7 @@
-include("ssl_cipher.hrl").
--export([suites/1, mac_hash/7, ecc_curves/1, corresponding_tls_version/1]).
+-export([suites/1, mac_hash/7, ecc_curves/1, corresponding_tls_version/1, corresponding_dtls_version/1]).
-spec suites(Minor:: 253|255) -> [ssl_cipher:cipher_suite()].
@@ -29,7 +29,7 @@ suites(Minor) ->
tls_v1:suites(corresponding_minor_tls_version(Minor)).
mac_hash(Version, MacAlg, MacSecret, SeqNo, Type, Length, Fragment) ->
- tls_v1:mac_hash(MacAlg, MacSecret, SeqNo, Type, corresponding_tls_version(Version),
+ tls_v1:mac_hash(MacAlg, MacSecret, SeqNo, Type, Version,
Length, Fragment).
ecc_curves({_Major, Minor}) ->
@@ -42,3 +42,11 @@ corresponding_minor_tls_version(255) ->
2;
corresponding_minor_tls_version(253) ->
3.
+
+corresponding_dtls_version({3, Minor}) ->
+ {254, corresponding_minor_dtls_version(Minor)}.
+
+corresponding_minor_dtls_version(2) ->
+ 255;
+corresponding_minor_dtls_version(3) ->
+ 253.
diff --git a/lib/ssl/src/ssl.app.src b/lib/ssl/src/ssl.app.src
index 00b0513891..9c5d795848 100644
--- a/lib/ssl/src/ssl.app.src
+++ b/lib/ssl/src/ssl.app.src
@@ -6,6 +6,7 @@
tls_connection,
tls_handshake,
tls_record,
+ tls_socket,
tls_v1,
ssl_v3,
ssl_v2,
@@ -13,7 +14,10 @@
dtls_connection,
dtls_handshake,
dtls_record,
+ dtls_socket,
dtls_v1,
+ dtls_udp_listener,
+ dtls_udp_sup,
%% API
ssl, %% Main API
tls, %% TLS specific
@@ -27,7 +31,6 @@
ssl_cipher,
ssl_srp_primes,
ssl_alert,
- ssl_socket,
ssl_listen_tracker_sup,
%% Erlang Distribution over SSL/TLS
inet_tls_dist,
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index 27b753af2e..c72ee44a95 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]).
@@ -101,33 +101,27 @@ connect(Socket, SslOptions0, Timeout) when is_port(Socket),
(is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) ->
{Transport,_,_,_} = proplists:get_value(cb_info, SslOptions0,
{gen_tcp, tcp, tcp_closed, tcp_error}),
- EmulatedOptions = ssl_socket:emulated_options(),
- {ok, SocketValues} = ssl_socket:getopts(Transport, Socket, EmulatedOptions),
+ EmulatedOptions = tls_socket:emulated_options(),
+ {ok, SocketValues} = tls_socket:getopts(Transport, Socket, EmulatedOptions),
try handle_options(SslOptions0 ++ SocketValues, client) of
- {ok, #config{transport_info = CbInfo, ssl = SslOptions, emulated = EmOpts,
- connection_cb = ConnectionCb}} ->
-
- ok = ssl_socket:setopts(Transport, Socket, ssl_socket:internal_inet_values()),
- case ssl_socket:peername(Transport, Socket) of
- {ok, {Address, Port}} ->
- ssl_connection:connect(ConnectionCb, Address, Port, Socket,
- {SslOptions, emulated_socket_options(EmOpts, #socket_options{}), undefined},
- self(), CbInfo, Timeout);
- {error, Error} ->
- {error, Error}
- end
+ {ok, Config} ->
+ tls_socket:upgrade(Socket, Config, Timeout)
catch
_:{error, Reason} ->
{error, Reason}
end;
-
connect(Host, Port, Options) ->
connect(Host, Port, Options, infinity).
connect(Host, Port, Options, Timeout) when (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) ->
- try handle_options(Options, client) of
- {ok, Config} ->
- do_connect(Host,Port,Config,Timeout)
+ try
+ {ok, Config} = handle_options(Options, client),
+ case Config#config.connection_cb of
+ tls_connection ->
+ tls_socket:connect(Host,Port,Config,Timeout);
+ dtls_connection ->
+ dtls_socket:connect(Host,Port,Config,Timeout)
+ end
catch
throw:Error ->
Error
@@ -144,17 +138,7 @@ listen(_Port, []) ->
listen(Port, Options0) ->
try
{ok, Config} = handle_options(Options0, server),
- ConnectionCb = connection_cb(Options0),
- #config{transport_info = {Transport, _, _, _}, inet_user = Options, connection_cb = ConnectionCb,
- ssl = SslOpts, emulated = EmOpts} = Config,
- case Transport:listen(Port, Options) of
- {ok, ListenSocket} ->
- ok = ssl_socket:setopts(Transport, ListenSocket, ssl_socket:internal_inet_values()),
- {ok, Tracker} = ssl_socket:inherit_tracker(ListenSocket, EmOpts, SslOpts),
- {ok, #sslsocket{pid = {ListenSocket, Config#config{emulated = Tracker}}}};
- Err = {error, _} ->
- Err
- end
+ do_listen(Port, Config, connection_cb(Options0))
catch
Error = {error, _} ->
Error
@@ -171,27 +155,15 @@ transport_accept(ListenSocket) ->
transport_accept(ListenSocket, infinity).
transport_accept(#sslsocket{pid = {ListenSocket,
- #config{transport_info = {Transport,_,_, _} =CbInfo,
- connection_cb = ConnectionCb,
- ssl = SslOpts,
- emulated = Tracker}}}, Timeout) when (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) ->
- case Transport:accept(ListenSocket, Timeout) of
- {ok, Socket} ->
- {ok, EmOpts} = ssl_socket:get_emulated_opts(Tracker),
- {ok, Port} = ssl_socket:port(Transport, Socket),
- ConnArgs = [server, "localhost", Port, Socket,
- {SslOpts, emulated_socket_options(EmOpts, #socket_options{}), Tracker}, self(), CbInfo],
- ConnectionSup = connection_sup(ConnectionCb),
- case ConnectionSup:start_child(ConnArgs) of
- {ok, Pid} ->
- ssl_connection:socket_control(ConnectionCb, Socket, Pid, Transport, Tracker);
- {error, Reason} ->
- {error, Reason}
- end;
- {error, Reason} ->
- {error, Reason}
+ #config{connection_cb = ConnectionCb} = Config}}, Timeout)
+ when (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) ->
+ case ConnectionCb of
+ tls_connection ->
+ tls_socket:accept(ListenSocket, Config, Timeout);
+ dtls_connection ->
+ dtls_socket:accept(ListenSocket, Config, Timeout)
end.
-
+
%%--------------------------------------------------------------------
-spec ssl_accept(#sslsocket{}) -> ok | {error, reason()}.
-spec ssl_accept(#sslsocket{} | port(), timeout()| [ssl_option()
@@ -214,13 +186,14 @@ ssl_accept(ListenSocket, SslOptions) when is_port(ListenSocket) ->
ssl_accept(ListenSocket, SslOptions, infinity).
ssl_accept(#sslsocket{} = Socket, [], Timeout) when (is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity)->
- ssl_accept(#sslsocket{} = Socket, Timeout);
+ ssl_accept(Socket, Timeout);
ssl_accept(#sslsocket{fd = {_, _, _, Tracker}} = Socket, SslOpts0, Timeout) when
(is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity)->
try
- {ok, EmOpts, InheritedSslOpts} = ssl_socket:get_all_opts(Tracker),
+ {ok, EmOpts, InheritedSslOpts} = tls_socket:get_all_opts(Tracker),
SslOpts = handle_options(SslOpts0, InheritedSslOpts),
- ssl_connection:handshake(Socket, {SslOpts, emulated_socket_options(EmOpts, #socket_options{})}, Timeout)
+ ssl_connection:handshake(Socket, {SslOpts,
+ tls_socket:emulated_socket_options(EmOpts, #socket_options{})}, Timeout)
catch
Error = {error, _Reason} -> Error
end;
@@ -228,15 +201,16 @@ ssl_accept(Socket, SslOptions, Timeout) when is_port(Socket),
(is_integer(Timeout) andalso Timeout >= 0) or (Timeout == infinity) ->
{Transport,_,_,_} =
proplists:get_value(cb_info, SslOptions, {gen_tcp, tcp, tcp_closed, tcp_error}),
- EmulatedOptions = ssl_socket:emulated_options(),
- {ok, SocketValues} = ssl_socket:getopts(Transport, Socket, EmulatedOptions),
+ EmulatedOptions = tls_socket:emulated_options(),
+ {ok, SocketValues} = tls_socket:getopts(Transport, Socket, EmulatedOptions),
ConnetionCb = connection_cb(SslOptions),
try handle_options(SslOptions ++ SocketValues, server) of
{ok, #config{transport_info = CbInfo, ssl = SslOpts, emulated = EmOpts}} ->
- ok = ssl_socket:setopts(Transport, Socket, ssl_socket:internal_inet_values()),
- {ok, Port} = ssl_socket:port(Transport, Socket),
+ ok = tls_socket:setopts(Transport, Socket, tls_socket:internal_inet_values()),
+ {ok, Port} = tls_socket:port(Transport, Socket),
ssl_connection:ssl_accept(ConnetionCb, Port, Socket,
- {SslOpts, emulated_socket_options(EmOpts, #socket_options{}), undefined},
+ {SslOpts,
+ tls_socket:emulated_socket_options(EmOpts, #socket_options{}), undefined},
self(), CbInfo, Timeout)
catch
Error = {error, _Reason} -> Error
@@ -275,6 +249,8 @@ close(#sslsocket{pid = {ListenSocket, #config{transport_info={Transport,_, _, _}
%%--------------------------------------------------------------------
send(#sslsocket{pid = Pid}, Data) when is_pid(Pid) ->
ssl_connection:send(Pid, Data);
+send(#sslsocket{pid = {_, #config{transport_info={gen_udp, _, _, _}}}}, _) ->
+ {error,enotconn}; %% Emulate connection behaviour
send(#sslsocket{pid = {ListenSocket, #config{transport_info={Transport, _, _, _}}}}, Data) ->
Transport:send(ListenSocket, Data). %% {error,enotconn}
@@ -358,9 +334,9 @@ connection_info(#sslsocket{} = SSLSocket) ->
%% Description: same as inet:peername/1.
%%--------------------------------------------------------------------
peername(#sslsocket{pid = Pid, fd = {Transport, Socket, _, _}}) when is_pid(Pid)->
- ssl_socket:peername(Transport, Socket);
+ tls_socket:peername(Transport, Socket);
peername(#sslsocket{pid = {ListenSocket, #config{transport_info = {Transport,_,_,_}}}}) ->
- ssl_socket:peername(Transport, ListenSocket). %% Will return {error, enotconn}
+ tls_socket:peername(Transport, ListenSocket). %% Will return {error, enotconn}
%%--------------------------------------------------------------------
-spec peercert(#sslsocket{}) ->{ok, DerCert::binary()} | {error, reason()}.
@@ -420,6 +396,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()}.
%%
@@ -429,7 +432,7 @@ getopts(#sslsocket{pid = Pid}, OptionTags) when is_pid(Pid), is_list(OptionTags)
ssl_connection:get_opts(Pid, OptionTags);
getopts(#sslsocket{pid = {_, #config{transport_info = {Transport,_,_,_}}}} = ListenSocket,
OptionTags) when is_list(OptionTags) ->
- try ssl_socket:getopts(Transport, ListenSocket, OptionTags) of
+ try tls_socket:getopts(Transport, ListenSocket, OptionTags) of
{ok, _} = Result ->
Result;
{error, InetError} ->
@@ -457,7 +460,7 @@ setopts(#sslsocket{pid = Pid}, Options0) when is_pid(Pid), is_list(Options0) ->
end;
setopts(#sslsocket{pid = {_, #config{transport_info = {Transport,_,_,_}}}} = ListenSocket, Options) when is_list(Options) ->
- try ssl_socket:setopts(Transport, ListenSocket, Options) of
+ try tls_socket:setopts(Transport, ListenSocket, Options) of
ok ->
ok;
{error, InetError} ->
@@ -490,10 +493,10 @@ getstat(Socket) ->
%% Description: Get one or more statistic options for a socket.
%%--------------------------------------------------------------------
getstat(#sslsocket{pid = {Listen, #config{transport_info = {Transport, _, _, _}}}}, Options) when is_port(Listen), is_list(Options) ->
- ssl_socket:getstat(Transport, Listen, Options);
+ tls_socket:getstat(Transport, Listen, Options);
getstat(#sslsocket{pid = Pid, fd = {Transport, Socket, _, _}}, Options) when is_pid(Pid), is_list(Options) ->
- ssl_socket:getstat(Transport, Socket, Options).
+ tls_socket:getstat(Transport, Socket, Options).
%%---------------------------------------------------------------
-spec shutdown(#sslsocket{}, read | write | read_write) -> ok | {error, reason()}.
@@ -512,10 +515,13 @@ shutdown(#sslsocket{pid = Pid}, How) ->
%% Description: Same as inet:sockname/1
%%--------------------------------------------------------------------
sockname(#sslsocket{pid = {Listen, #config{transport_info = {Transport, _, _, _}}}}) when is_port(Listen) ->
- ssl_socket:sockname(Transport, Listen);
-
+ tls_socket:sockname(Transport, Listen);
+sockname(#sslsocket{pid = {udp, #config{udp_handler = {Pid, _}}}}) ->
+ dtls_udp_listener:sockname(Pid);
+sockname(#sslsocket{pid = Pid, fd = {gen_udp= Transport, Socket, _, _}}) when is_pid(Pid) ->
+ dtls_socket:sockname(Transport, Socket);
sockname(#sslsocket{pid = Pid, fd = {Transport, Socket, _, _}}) when is_pid(Pid) ->
- ssl_socket:sockname(Transport, Socket).
+ tls_socket:sockname(Transport, Socket).
%%---------------------------------------------------------------
-spec session_info(#sslsocket{}) -> {ok, list()} | {error, reason()}.
@@ -625,28 +631,15 @@ available_suites(all) ->
Version = tls_record:highest_protocol_version([]),
ssl_cipher:filter_suites(ssl_cipher:all_suites(Version)).
-do_connect(Address, Port,
- #config{transport_info = CbInfo, inet_user = UserOpts, ssl = SslOpts,
- emulated = EmOpts, inet_ssl = SocketOpts, connection_cb = ConnetionCb},
- Timeout) ->
- {Transport, _, _, _} = CbInfo,
- try Transport:connect(Address, Port, SocketOpts, Timeout) of
- {ok, Socket} ->
- ssl_connection:connect(ConnetionCb, Address, Port, Socket,
- {SslOpts, emulated_socket_options(EmOpts, #socket_options{}), undefined},
- self(), CbInfo, Timeout);
- {error, Reason} ->
- {error, Reason}
- catch
- exit:{function_clause, _} ->
- {error, {options, {cb_info, CbInfo}}};
- exit:badarg ->
- {error, {options, {socket_options, UserOpts}}};
- exit:{badarg, _} ->
- {error, {options, {socket_options, UserOpts}}}
- end.
+do_listen(Port, #config{transport_info = {Transport, _, _, _}} = Config, tls_connection) ->
+ tls_socket:listen(Transport, Port, Config);
+do_listen(Port, #config{transport_info = {Transport, _, _, _}} = Config, dtls_connection) ->
+ dtls_socket:listen(Transport, Port, Config).
+
%% 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),
@@ -703,6 +696,8 @@ handle_options(Opts0, Role) ->
[RecordCb:protocol_version(Vsn) || Vsn <- Vsns]
end,
+ Protocol = proplists:get_value(protocol, Opts, tls),
+
SSLOptions = #ssl_options{
versions = Versions,
verify = validate_option(verify, Verify),
@@ -725,10 +720,12 @@ 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)),
- RecordCb:highest_protocol_version(Versions)),
+ tls_version(RecordCb:highest_protocol_version(Versions))),
%% Server side option
reuse_session = handle_option(reuse_session, Opts, ReuseSessionFun),
reuse_sessions = handle_option(reuse_sessions, Opts, true),
@@ -755,7 +752,10 @@ handle_options(Opts0, Role) ->
honor_cipher_order = handle_option(honor_cipher_order, Opts,
default_option_role(server, false, Role),
server, Role),
- protocol = proplists:get_value(protocol, Opts, tls),
+ honor_ecc_order = handle_option(honor_ecc_order, Opts,
+ default_option_role(server, false, Role),
+ server, Role),
+ protocol = Protocol,
padding_check = proplists:get_value(padding_check, Opts, true),
beast_mitigation = handle_option(beast_mitigation, Opts, one_n_minus_one),
fallback = handle_option(fallback, Opts,
@@ -768,7 +768,7 @@ handle_options(Opts0, Role) ->
v2_hello_compatible = handle_option(v2_hello_compatible, Opts, false)
},
- CbInfo = proplists:get_value(cb_info, Opts, {gen_tcp, tcp, tcp_closed, tcp_error}),
+ CbInfo = proplists:get_value(cb_info, Opts, default_cb_info(Protocol)),
SslOptions = [protocol, versions, verify, verify_fun, partial_chain,
fail_if_no_peer_cert, verify_client_once,
depth, cert, certfile, key, keyfile,
@@ -780,13 +780,13 @@ 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)
end, Opts, SslOptions),
- {Sock, Emulated} = emulated_options(SockOpts),
+ {Sock, Emulated} = emulated_options(Protocol, SockOpts),
ConnetionCb = connection_cb(Opts),
{ok, #config{ssl = SSLOptions, emulated = Emulated, inet_ssl = Sock,
@@ -1010,6 +1010,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) ->
@@ -1103,8 +1105,13 @@ ca_cert_default(verify_peer, {Fun,_}, _) when is_function(Fun) ->
%% some trusted certs.
ca_cert_default(verify_peer, undefined, _) ->
"".
-emulated_options(Opts) ->
- emulated_options(Opts, ssl_socket:internal_inet_values(), ssl_socket:default_inet_values()).
+emulated_options(Protocol, Opts) ->
+ case Protocol of
+ tls ->
+ emulated_options(Opts, tls_socket:internal_inet_values(), tls_socket:default_inet_values());
+ dtls ->
+ emulated_options(Opts, dtls_socket:internal_inet_values(), dtls_socket:default_inet_values())
+ end.
emulated_options([{mode, Value} = Opt |Opts], Inet, Emulated) ->
validate_inet_option(mode, Value),
@@ -1164,6 +1171,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])).
@@ -1237,11 +1252,6 @@ record_cb(dtls) ->
record_cb(Opts) ->
record_cb(proplists:get_value(protocol, Opts, tls)).
-connection_sup(tls_connection) ->
- tls_connection_sup;
-connection_sup(dtls_connection) ->
- dtls_connection_sup.
-
binary_filename(FileName) ->
Enc = file:native_name_encoding(),
unicode:characters_to_binary(FileName, unicode, Enc).
@@ -1260,20 +1270,6 @@ assert_proplist([inet6 | Rest]) ->
assert_proplist([Value | _]) ->
throw({option_not_a_key_value_tuple, Value}).
-emulated_socket_options(InetValues, #socket_options{
- mode = Mode,
- header = Header,
- active = Active,
- packet = Packet,
- packet_size = Size}) ->
- #socket_options{
- mode = proplists:get_value(mode, InetValues, Mode),
- header = proplists:get_value(header, InetValues, Header),
- active = proplists:get_value(active, InetValues, Active),
- packet = proplists:get_value(packet, InetValues, Packet),
- packet_size = proplists:get_value(packet_size, InetValues, Size)
- }.
-
new_ssl_options([], #ssl_options{} = Opts, _) ->
Opts;
new_ssl_options([{verify_client_once, Value} | Rest], #ssl_options{} = Opts, RecordCB) ->
@@ -1334,11 +1330,19 @@ 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 =
handle_hashsigns_option(Value,
- RecordCB:highest_protocol_version())},
+ tls_version(RecordCB:highest_protocol_version()))},
RecordCB);
new_ssl_options([{Key, Value} | _Rest], #ssl_options{}, _) ->
@@ -1402,3 +1406,8 @@ default_option_role(Role, Value, Role) ->
Value;
default_option_role(_,_,_) ->
undefined.
+
+default_cb_info(tls) ->
+ {gen_tcp, tcp, tcp_closed, tcp_error};
+default_cb_info(dtls) ->
+ {gen_udp, udp, udp_closed, udp_error}.
diff --git a/lib/ssl/src/ssl_alert.erl b/lib/ssl/src/ssl_alert.erl
index 05dfb4c1b3..7b1603df6e 100644
--- a/lib/ssl/src/ssl_alert.erl
+++ b/lib/ssl/src/ssl_alert.erl
@@ -32,22 +32,13 @@
-include("ssl_record.hrl").
-include("ssl_internal.hrl").
--export([encode/3, decode/1, alert_txt/1, reason_code/2]).
+-export([decode/1, alert_txt/1, reason_code/2]).
%%====================================================================
%% Internal application API
%%====================================================================
%%--------------------------------------------------------------------
--spec encode(#alert{}, ssl_record:ssl_version(), ssl_record:connection_states()) ->
- {iolist(), ssl_record:connection_states()}.
-%%
-%% Description: Encodes an alert
-%%--------------------------------------------------------------------
-encode(#alert{} = Alert, Version, ConnectionStates) ->
- ssl_record:encode_alert_record(Alert, Version, ConnectionStates).
-
-%%--------------------------------------------------------------------
-spec decode(binary()) -> [#alert{}] | #alert{}.
%%
%% Description: Decode alert(s), will return a singel own alert if peer
diff --git a/lib/ssl/src/ssl_cipher.erl b/lib/ssl/src/ssl_cipher.erl
index 605bbd859a..32fec03b8e 100644
--- a/lib/ssl/src/ssl_cipher.erl
+++ b/lib/ssl/src/ssl_cipher.erl
@@ -40,7 +40,7 @@
ec_keyed_suites/0, anonymous_suites/1, psk_suites/1, srp_suites/0,
rc4_suites/1, des_suites/1, openssl_suite/1, openssl_suite_name/1, filter/2, filter_suites/1,
hash_algorithm/1, sign_algorithm/1, is_acceptable_hash/2, is_fallback/1,
- random_bytes/1]).
+ random_bytes/1, calc_aad/3, calc_mac_hash/4]).
-export_type([cipher_suite/0,
erl_cipher_suite/0, openssl_cipher_suite/0,
@@ -311,7 +311,9 @@ aead_decipher(Type, #cipher_state{key = Key, iv = IV} = CipherState,
suites({3, 0}) ->
ssl_v3:suites();
suites({3, N}) ->
- tls_v1:suites(N).
+ tls_v1:suites(N);
+suites(Version) ->
+ suites(dtls_v1:corresponding_tls_version(Version)).
all_suites(Version) ->
suites(Version)
@@ -1525,9 +1527,32 @@ is_fallback(CipherSuites)->
random_bytes(N) ->
crypto:strong_rand_bytes(N).
+calc_aad(Type, {MajVer, MinVer},
+ #{sequence_number := SeqNo}) ->
+ <<SeqNo:64/integer, ?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer)>>.
+
+calc_mac_hash(Type, Version,
+ PlainFragment, #{sequence_number := SeqNo,
+ mac_secret := MacSecret,
+ security_parameters:=
+ SecPars}) ->
+ Length = erlang:iolist_size(PlainFragment),
+ mac_hash(Version, SecPars#security_parameters.mac_algorithm,
+ MacSecret, SeqNo, Type,
+ Length, PlainFragment).
+
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
+mac_hash({_,_}, ?NULL, _MacSecret, _SeqNo, _Type,
+ _Length, _Fragment) ->
+ <<>>;
+mac_hash({3, 0}, MacAlg, MacSecret, SeqNo, Type, Length, Fragment) ->
+ ssl_v3:mac_hash(MacAlg, MacSecret, SeqNo, Type, Length, Fragment);
+mac_hash({3, N} = Version, MacAlg, MacSecret, SeqNo, Type, Length, Fragment)
+ when N =:= 1; N =:= 2; N =:= 3 ->
+ tls_v1:mac_hash(MacAlg, MacSecret, SeqNo, Type, Version,
+ Length, Fragment).
bulk_cipher_algorithm(null) ->
?NULL;
diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl
index 08fca76123..6e7c8c5ddd 100644
--- a/lib/ssl/src/ssl_connection.erl
+++ b/lib/ssl/src/ssl_connection.erl
@@ -44,7 +44,7 @@
-export([send/2, recv/3, close/2, shutdown/2,
new_user/2, get_opts/2, set_opts/2, session_info/1,
peer_certificate/1, renegotiation/1, negotiated_protocol/1, prf/5,
- connection_information/1
+ connection_information/1, handle_common_event/5
]).
%% General gen_statem state functions with extra callback argument
@@ -71,7 +71,8 @@
%%====================================================================
%%--------------------------------------------------------------------
-spec connect(tls_connection | dtls_connection,
- host(), inet:port_number(), port(),
+ host(), inet:port_number(),
+ port() | {tuple(), port()}, %% TLS | DTLS
{#ssl_options{}, #socket_options{},
%% Tracker only needed on server side
undefined},
@@ -145,14 +146,24 @@ socket_control(Connection, Socket, Pid, Transport) ->
-spec socket_control(tls_connection | dtls_connection, port(), pid(), atom(), pid()| undefined) ->
{ok, #sslsocket{}} | {error, reason()}.
%%--------------------------------------------------------------------
-socket_control(Connection, Socket, Pid, Transport, ListenTracker) ->
+socket_control(Connection, Socket, Pid, Transport, udp_listner) ->
+ %% dtls listner process must have the socket control
+ {ok, dtls_socket:socket(Pid, Transport, Socket, Connection)};
+
+socket_control(tls_connection = Connection, Socket, Pid, Transport, ListenTracker) ->
+ case Transport:controlling_process(Socket, Pid) of
+ ok ->
+ {ok, tls_socket:socket(Pid, Transport, Socket, Connection, ListenTracker)};
+ {error, Reason} ->
+ {error, Reason}
+ end;
+socket_control(dtls_connection = Connection, {_, Socket}, Pid, Transport, ListenTracker) ->
case Transport:controlling_process(Socket, Pid) of
ok ->
- {ok, ssl_socket:socket(Pid, Transport, Socket, Connection, ListenTracker)};
+ {ok, tls_socket:socket(Pid, Transport, Socket, Connection, ListenTracker)};
{error, Reason} ->
{error, Reason}
end.
-
%%--------------------------------------------------------------------
-spec send(pid(), iodata()) -> ok | {error, reason()}.
%%
@@ -461,7 +472,7 @@ certify(internal, #certificate{asn1_certificates = []},
#state{role = server, negotiated_version = Version,
ssl_options = #ssl_options{verify = verify_peer,
fail_if_no_peer_cert = true}} =
- State, _Connection) ->
+ State, _) ->
Alert = ?ALERT_REC(?FATAL,?HANDSHAKE_FAILURE),
handle_own_alert(Alert, Version, certify, State);
@@ -478,7 +489,7 @@ certify(internal, #certificate{},
#state{role = server,
negotiated_version = Version,
ssl_options = #ssl_options{verify = verify_none}} =
- State, _Connection) ->
+ State, _) ->
Alert = ?ALERT_REC(?FATAL,?UNEXPECTED_MESSAGE, unrequested_certificate),
handle_own_alert(Alert, Version, certify, State);
@@ -788,7 +799,7 @@ connection(Type, Msg, State, Connection) ->
downgrade(internal, #alert{description = ?CLOSE_NOTIFY},
#state{transport_cb = Transport, socket = Socket,
downgrade = {Pid, From}} = State, _) ->
- ssl_socket:setopts(Transport, Socket, [{active, false}, {packet, 0}, {mode, binary}]),
+ tls_socket:setopts(Transport, Socket, [{active, false}, {packet, 0}, {mode, binary}]),
Transport:controlling_process(Socket, Pid),
gen_statem:reply(From, {ok, Socket}),
{stop, normal, State};
@@ -819,7 +830,7 @@ handle_common_event(internal, {handshake, {Handshake, Raw}}, StateName,
%% a client_hello, which needs to be determined by the connection callback.
%% In other cases this is a noop
State = handle_sni_extension(PossibleSNI, State0),
- HsHist = ssl_handshake:update_handshake_history(Hs0, Raw, V2HComp),
+ HsHist = ssl_handshake:update_handshake_history(Hs0, iolist_to_binary(Raw), V2HComp),
{next_state, StateName, State#state{tls_handshake_history = HsHist},
[{next_event, internal, Handshake}]};
handle_common_event(internal, {protocol_record, TLSorDTLSRecord}, StateName, State, Connection) ->
@@ -864,13 +875,13 @@ handle_call({shutdown, How0}, From, _,
#state{transport_cb = Transport,
negotiated_version = Version,
connection_states = ConnectionStates,
- socket = Socket}, _) ->
+ socket = Socket}, Connection) ->
case How0 of
How when How == write; How == both ->
Alert = ?ALERT_REC(?WARNING, ?CLOSE_NOTIFY),
{BinMsg, _} =
- ssl_alert:encode(Alert, Version, ConnectionStates),
- Transport:send(Socket, BinMsg);
+ Connection:encode_alert(Alert, Version, ConnectionStates),
+ Connection:send(Transport, Socket, BinMsg);
_ ->
ok
end,
@@ -1025,8 +1036,8 @@ terminate(Reason, connection, #state{negotiated_version = Version,
transport_cb = Transport, socket = Socket
} = State) ->
handle_trusted_certs_db(State),
- {BinAlert, ConnectionStates} = terminate_alert(Reason, Version, ConnectionStates0),
- Transport:send(Socket, BinAlert),
+ {BinAlert, ConnectionStates} = terminate_alert(Reason, Version, ConnectionStates0, Connection),
+ Connection:send(Transport, Socket, BinAlert),
Connection:close(Reason, Socket, Transport, ConnectionStates, Check);
terminate(Reason, _StateName, #state{transport_cb = Transport, protocol_cb = Connection,
@@ -1079,8 +1090,8 @@ write_application_data(Data0, From,
Connection:renegotiate(State#state{renegotiation = {true, internal}},
[{next_event, {call, From}, {application_data, Data0}}]);
false ->
- {Msgs, ConnectionStates} = ssl_record:encode_data(Data, Version, ConnectionStates0),
- Result = Transport:send(Socket, Msgs),
+ {Msgs, ConnectionStates} = Connection:encode_data(Data, Version, ConnectionStates0),
+ Result = Connection:send(Transport, Socket, Msgs),
ssl_connection:hibernate_after(connection, State#state{connection_states = ConnectionStates},
[{reply, From, Result}])
end.
@@ -1172,14 +1183,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 +1761,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{
@@ -1903,7 +1924,7 @@ get_socket_opts(Transport, Socket, [active | Tags], SockOpts, Acc) ->
get_socket_opts(Transport, Socket, Tags, SockOpts,
[{active, SockOpts#socket_options.active} | Acc]);
get_socket_opts(Transport, Socket, [Tag | Tags], SockOpts, Acc) ->
- try ssl_socket:getopts(Transport, Socket, [Tag]) of
+ try tls_socket:getopts(Transport, Socket, [Tag]) of
{ok, [Opt]} ->
get_socket_opts(Transport, Socket, Tags, SockOpts, [Opt | Acc]);
{error, Error} ->
@@ -1919,7 +1940,7 @@ set_socket_opts(_,_, [], SockOpts, []) ->
{ok, SockOpts};
set_socket_opts(Transport, Socket, [], SockOpts, Other) ->
%% Set non emulated options
- try ssl_socket:setopts(Transport, Socket, Other) of
+ try tls_socket:setopts(Transport, Socket, Other) of
ok ->
{ok, SockOpts};
{error, InetError} ->
@@ -1985,17 +2006,17 @@ hibernate_after(connection = StateName,
hibernate_after(StateName, State, Actions) ->
{next_state, StateName, State, Actions}.
-terminate_alert(normal, Version, ConnectionStates) ->
- ssl_alert:encode(?ALERT_REC(?WARNING, ?CLOSE_NOTIFY),
+terminate_alert(normal, Version, ConnectionStates, Connection) ->
+ Connection:encode_alert(?ALERT_REC(?WARNING, ?CLOSE_NOTIFY),
Version, ConnectionStates);
-terminate_alert({Reason, _}, Version, ConnectionStates) when Reason == close;
- Reason == shutdown ->
- ssl_alert:encode(?ALERT_REC(?WARNING, ?CLOSE_NOTIFY),
+terminate_alert({Reason, _}, Version, ConnectionStates, Connection) when Reason == close;
+ Reason == shutdown ->
+ Connection:encode_alert(?ALERT_REC(?WARNING, ?CLOSE_NOTIFY),
Version, ConnectionStates);
-terminate_alert(_, Version, ConnectionStates) ->
- {BinAlert, _} = ssl_alert:encode(?ALERT_REC(?FATAL, ?INTERNAL_ERROR),
- Version, ConnectionStates),
+terminate_alert(_, Version, ConnectionStates, Connection) ->
+ {BinAlert, _} = Connection:encode_alert(?ALERT_REC(?FATAL, ?INTERNAL_ERROR),
+ Version, ConnectionStates),
BinAlert.
handle_trusted_certs_db(#state{ssl_options =
@@ -2275,7 +2296,7 @@ format_reply(_, _,#socket_options{active = false, mode = Mode, packet = Packet,
{ok, do_format_reply(Mode, Packet, Header, Data)};
format_reply(Transport, Socket, #socket_options{active = _, mode = Mode, packet = Packet,
header = Header}, Data, Tracker, Connection) ->
- {ssl, ssl_socket:socket(self(), Transport, Socket, Connection, Tracker),
+ {ssl, tls_socket:socket(self(), Transport, Socket, Connection, Tracker),
do_format_reply(Mode, Packet, Header, Data)}.
deliver_packet_error(Transport, Socket, SO= #socket_options{active = Active}, Data, Pid, From, Tracker, Connection) ->
@@ -2284,7 +2305,7 @@ deliver_packet_error(Transport, Socket, SO= #socket_options{active = Active}, Da
format_packet_error(_, _,#socket_options{active = false, mode = Mode}, Data, _, _) ->
{error, {invalid_packet, do_format_reply(Mode, raw, 0, Data)}};
format_packet_error(Transport, Socket, #socket_options{active = _, mode = Mode}, Data, Tracker, Connection) ->
- {ssl_error, ssl_socket:socket(self(), Transport, Socket, Connection, Tracker),
+ {ssl_error, tls_socket:socket(self(), Transport, Socket, Connection, Tracker),
{invalid_packet, do_format_reply(Mode, raw, 0, Data)}}.
do_format_reply(binary, _, N, Data) when N > 0 -> % Header mode
@@ -2339,11 +2360,11 @@ alert_user(Transport, Tracker, Socket, Active, Pid, From, Alert, Role, Connectio
case ssl_alert:reason_code(Alert, Role) of
closed ->
send_or_reply(Active, Pid, From,
- {ssl_closed, ssl_socket:socket(self(),
+ {ssl_closed, tls_socket:socket(self(),
Transport, Socket, Connection, Tracker)});
ReasonCode ->
send_or_reply(Active, Pid, From,
- {ssl_error, ssl_socket:socket(self(),
+ {ssl_error, tls_socket:socket(self(),
Transport, Socket, Connection, Tracker), ReasonCode})
end.
@@ -2356,12 +2377,13 @@ log_alert(false, _, _) ->
handle_own_alert(Alert, Version, StateName,
#state{transport_cb = Transport,
socket = Socket,
+ protocol_cb = Connection,
connection_states = ConnectionStates,
ssl_options = SslOpts} = State) ->
try %% Try to tell the other side
{BinMsg, _} =
- ssl_alert:encode(Alert, Version, ConnectionStates),
- Transport:send(Socket, BinMsg)
+ Connection:encode_alert(Alert, Version, ConnectionStates),
+ Connection:send(Transport, Socket, BinMsg)
catch _:_ -> %% Can crash if we are in a uninitialized state
ignore
end,
diff --git a/lib/ssl/src/ssl_connection.hrl b/lib/ssl/src/ssl_connection.hrl
index fca3e11894..2027652a7f 100644
--- a/lib/ssl/src/ssl_connection.hrl
+++ b/lib/ssl/src/ssl_connection.hrl
@@ -43,7 +43,7 @@
error_tag :: atom(), % ex tcp_error
host :: string() | inet:ip_address(),
port :: integer(),
- socket :: port(),
+ socket :: port() | tuple(), %% TODO: dtls socket
ssl_options :: #ssl_options{},
socket_options :: #socket_options{},
connection_states :: ssl_record:connection_states() | secret_printout(),
@@ -81,17 +81,18 @@
allow_renegotiate = true ::boolean(),
expecting_next_protocol_negotiation = false ::boolean(),
expecting_finished = false ::boolean(),
- negotiated_protocol = undefined :: undefined | binary(),
+ next_protocol = undefined :: undefined | binary(),
+ negotiated_protocol,
tracker :: pid() | 'undefined', %% Tracker process for listen socket
sni_hostname = undefined,
downgrade,
- flight_buffer = [] :: list() %% Buffer of TLS/DTLS records, used during the TLS handshake
- %% to when possible pack more than on TLS record into the
- %% underlaying packet format. Introduced by DTLS - RFC 4347.
- %% The mecahnism is also usefull in TLS although we do not
- %% need to worry about packet loss in TLS.
+ flight_buffer = [] :: list() | map(), %% Buffer of TLS/DTLS records, used during the TLS handshake
+ %% to when possible pack more than on TLS record into the
+ %% underlaying packet format. Introduced by DTLS - RFC 4347.
+ %% The mecahnism is also usefull in TLS although we do not
+ %% need to worry about packet loss in TLS. In DTLS we need to track DTLS handshake seqnr
+ flight_state = reliable %% reliable | {retransmit, integer()}| {waiting, ref(), integer()} - last two is used in DTLS over udp.
}).
-
-define(DEFAULT_DIFFIE_HELLMAN_PARAMS,
#'DHParameter'{prime = ?DEFAULT_DIFFIE_HELLMAN_PRIME,
base = ?DEFAULT_DIFFIE_HELLMAN_GENERATOR}).
diff --git a/lib/ssl/src/ssl_dist_sup.erl b/lib/ssl/src/ssl_dist_sup.erl
index a6eb1be1f6..d47cd76bf5 100644
--- a/lib/ssl/src/ssl_dist_sup.erl
+++ b/lib/ssl/src/ssl_dist_sup.erl
@@ -85,10 +85,10 @@ proxy_server_child_spec() ->
{Name, StartFunc, Restart, Shutdown, Type, Modules}.
listen_options_tracker_child_spec() ->
- Name = ssl_socket_dist,
+ Name = tls_socket_dist,
StartFunc = {ssl_listen_tracker_sup, start_link_dist, []},
Restart = permanent,
Shutdown = 4000,
- Modules = [ssl_socket],
+ Modules = [tls_socket],
Type = supervisor,
{Name, StartFunc, Restart, Shutdown, Type, Modules}.
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..cbfcaa46a0 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()
}).
@@ -154,7 +156,8 @@
-record(config, {ssl, %% SSL parameters
inet_user, %% User set inet options
- emulated, %% Emulated option list or "inherit_tracker" pid
+ emulated, %% Emulated option list or "inherit_tracker" pid
+ udp_handler,
inet_ssl, %% inet options for internal ssl socket
transport_info, %% Callback info
connection_cb
diff --git a/lib/ssl/src/ssl_listen_tracker_sup.erl b/lib/ssl/src/ssl_listen_tracker_sup.erl
index 7f685a2ead..f7e97bcb76 100644
--- a/lib/ssl/src/ssl_listen_tracker_sup.erl
+++ b/lib/ssl/src/ssl_listen_tracker_sup.erl
@@ -57,10 +57,10 @@ init(_O) ->
MaxT = 3600,
Name = undefined, % As simple_one_for_one is used.
- StartFunc = {ssl_socket, start_link, []},
+ StartFunc = {tls_socket, start_link, []},
Restart = temporary, % E.g. should not be restarted
Shutdown = 4000,
- Modules = [ssl_socket],
+ Modules = [tls_socket],
Type = worker,
ChildSpec = {Name, StartFunc, Restart, Shutdown, Type, Modules},
diff --git a/lib/ssl/src/ssl_record.erl b/lib/ssl/src/ssl_record.erl
index 71cd0279f3..b10069c3cb 100644
--- a/lib/ssl/src/ssl_record.erl
+++ b/lib/ssl/src/ssl_record.erl
@@ -41,10 +41,6 @@
set_server_verify_data/3,
empty_connection_state/2, initial_connection_state/2, record_protocol_role/1]).
-%% Encoding records
--export([encode_handshake/3, encode_alert_record/3,
- encode_change_cipher_spec/2, encode_data/3]).
-
%% Compression
-export([compress/3, uncompress/3, compressions/0]).
@@ -52,6 +48,9 @@
-export([cipher/4, decipher/4, is_correct_mac/2,
cipher_aead/4, decipher_aead/4]).
+%% Encoding
+-export([encode_plain_text/4]).
+
-export_type([ssl_version/0, ssl_atom_version/0, connection_states/0, connection_state/0]).
-type ssl_version() :: {integer(), integer()}.
@@ -272,70 +271,26 @@ set_pending_cipher_state(#{pending_read := Read,
pending_read => Read#{cipher_state => ServerState},
pending_write => Write#{cipher_state => ClientState}}.
-
-%%--------------------------------------------------------------------
--spec encode_handshake(iolist(), ssl_version(), connection_states()) ->
- {iolist(), connection_states()}.
-%%
-%% Description: Encodes a handshake message to send on the ssl-socket.
-%%--------------------------------------------------------------------
-encode_handshake(Frag, Version,
- #{current_write :=
- #{beast_mitigation := BeastMitigation,
- security_parameters :=
- #security_parameters{bulk_cipher_algorithm = BCA}}} =
- ConnectionStates)
- when is_list(Frag) ->
- case iolist_size(Frag) of
- N when N > ?MAX_PLAIN_TEXT_LENGTH ->
- Data = split_bin(iolist_to_binary(Frag), ?MAX_PLAIN_TEXT_LENGTH, Version, BCA, BeastMitigation),
- encode_iolist(?HANDSHAKE, Data, Version, ConnectionStates);
- _ ->
- encode_plain_text(?HANDSHAKE, Version, Frag, ConnectionStates)
- end;
-%% TODO: this is a workarround for DTLS
-%%
-%% DTLS need to select the connection write state based on Epoch it wants to
-%% send this fragment in. That Epoch does not nessarily has to be the same
-%% as the current_write epoch.
-%% The right solution might be to pass the WriteState instead of the ConnectionStates,
-%% however, this will require substantion API changes.
-encode_handshake(Frag, Version, ConnectionStates) ->
- encode_plain_text(?HANDSHAKE, Version, Frag, ConnectionStates).
-
-%%--------------------------------------------------------------------
--spec encode_alert_record(#alert{}, ssl_version(), connection_states()) ->
- {iolist(), connection_states()}.
-%%
-%% Description: Encodes an alert message to send on the ssl-socket.
-%%--------------------------------------------------------------------
-encode_alert_record(#alert{level = Level, description = Description},
- Version, ConnectionStates) ->
- encode_plain_text(?ALERT, Version, <<?BYTE(Level), ?BYTE(Description)>>,
- ConnectionStates).
-
-%%--------------------------------------------------------------------
--spec encode_change_cipher_spec(ssl_version(), connection_states()) ->
- {iolist(), connection_states()}.
-%%
-%% Description: Encodes a change_cipher_spec-message to send on the ssl socket.
-%%--------------------------------------------------------------------
-encode_change_cipher_spec(Version, ConnectionStates) ->
- encode_plain_text(?CHANGE_CIPHER_SPEC, Version, <<1:8>>, ConnectionStates).
-
-%%--------------------------------------------------------------------
--spec encode_data(binary(), ssl_version(), connection_states()) ->
- {iolist(), connection_states()}.
-%%
-%% Description: Encodes data to send on the ssl-socket.
-%%--------------------------------------------------------------------
-encode_data(Frag, Version,
- #{current_write := #{beast_mitigation := BeastMitigation,
- security_parameters :=
- #security_parameters{bulk_cipher_algorithm = BCA}}} =
- ConnectionStates) ->
- Data = split_bin(Frag, ?MAX_PLAIN_TEXT_LENGTH, Version, BCA, BeastMitigation),
- encode_iolist(?APPLICATION_DATA, Data, Version, ConnectionStates).
+encode_plain_text(Type, Version, Data, #{compression_state := CompS0,
+ security_parameters :=
+ #security_parameters{
+ cipher_type = ?AEAD,
+ compression_algorithm = CompAlg}
+ } = WriteState0) ->
+ {Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
+ WriteState1 = WriteState0#{compression_state => CompS1},
+ AAD = ssl_cipher:calc_aad(Type, Version, WriteState1),
+ ssl_record:cipher_aead(Version, Comp, WriteState1, AAD);
+encode_plain_text(Type, Version, Data, #{compression_state := CompS0,
+ security_parameters :=
+ #security_parameters{compression_algorithm = CompAlg}
+ }= WriteState0) ->
+ {Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
+ WriteState1 = WriteState0#{compression_state => CompS1},
+ MacHash = ssl_cipher:calc_mac_hash(Type, Version, Comp, WriteState1),
+ ssl_record:cipher(Version, Comp, WriteState1, MacHash);
+encode_plain_text(_,_,_,CS) ->
+ exit({cs, CS}).
uncompress(?NULL, Data, CS) ->
{Data, CS}.
@@ -451,11 +406,6 @@ random() ->
Random_28_bytes = ssl_cipher:random_bytes(28),
<<?UINT32(Secs_since_1970), Random_28_bytes/binary>>.
-%% dtls_next_epoch(#connection_state{epoch = undefined}) -> %% SSL/TLS
-%% undefined;
-%% dtls_next_epoch(#connection_state{epoch = Epoch}) -> %% DTLS
-%% Epoch + 1.
-
is_correct_mac(Mac, Mac) ->
true;
is_correct_mac(_M,_H) ->
@@ -484,47 +434,3 @@ initial_security_params(ConnectionEnd) ->
compression_algorithm = ?NULL},
ssl_cipher:security_parameters(?TLS_NULL_WITH_NULL_NULL, SecParams).
-
-encode_plain_text(Type, Version, Data, ConnectionStates) ->
- RecordCB = protocol_module(Version),
- RecordCB:encode_plain_text(Type, Version, Data, ConnectionStates).
-
-encode_iolist(Type, Data, Version, ConnectionStates0) ->
- RecordCB = protocol_module(Version),
- {ConnectionStates, EncodedMsg} =
- lists:foldl(fun(Text, {CS0, Encoded}) ->
- {Enc, CS1} =
- RecordCB:encode_plain_text(Type, Version, Text, CS0),
- {CS1, [Enc | Encoded]}
- end, {ConnectionStates0, []}, Data),
- {lists:reverse(EncodedMsg), ConnectionStates}.
-
-%% 1/n-1 splitting countermeasure Rizzo/Duong-Beast, RC4 chiphers are
-%% not vulnerable to this attack.
-split_bin(<<FirstByte:8, Rest/binary>>, ChunkSize, Version, BCA, one_n_minus_one) when
- BCA =/= ?RC4 andalso ({3, 1} == Version orelse
- {3, 0} == Version) ->
- do_split_bin(Rest, ChunkSize, [[FirstByte]]);
-%% 0/n splitting countermeasure for clients that are incompatible with 1/n-1
-%% splitting.
-split_bin(Bin, ChunkSize, Version, BCA, zero_n) when
- BCA =/= ?RC4 andalso ({3, 1} == Version orelse
- {3, 0} == Version) ->
- do_split_bin(Bin, ChunkSize, [[<<>>]]);
-split_bin(Bin, ChunkSize, _, _, _) ->
- do_split_bin(Bin, ChunkSize, []).
-
-do_split_bin(<<>>, _, Acc) ->
- lists:reverse(Acc);
-do_split_bin(Bin, ChunkSize, Acc) ->
- case Bin of
- <<Chunk:ChunkSize/binary, Rest/binary>> ->
- do_split_bin(Rest, ChunkSize, [Chunk | Acc]);
- _ ->
- lists:reverse(Acc, [Bin])
- end.
-
-protocol_module({3, _}) ->
- tls_record;
-protocol_module({254, _}) ->
- dtls_record.
diff --git a/lib/ssl/src/ssl_sup.erl b/lib/ssl/src/ssl_sup.erl
index ba20f65f44..8245801139 100644
--- a/lib/ssl/src/ssl_sup.erl
+++ b/lib/ssl/src/ssl_sup.erl
@@ -46,14 +46,17 @@ start_link() ->
init([]) ->
SessionCertManager = session_and_cert_manager_child_spec(),
TLSConnetionManager = tls_connection_manager_child_spec(),
- %% Not supported yet
- %%DTLSConnetionManager = dtls_connection_manager_child_spec(),
- %% Handles emulated options so that they inherited by the accept socket, even when setopts is performed on
- %% the listen socket
+ %% Handles emulated options so that they inherited by the accept
+ %% socket, even when setopts is performed on the listen socket
ListenOptionsTracker = listen_options_tracker_child_spec(),
+
+ DTLSConnetionManager = dtls_connection_manager_child_spec(),
+ DTLSUdpListeners = dtls_udp_listeners_spec(),
+
{ok, {{one_for_all, 10, 3600}, [SessionCertManager, TLSConnetionManager,
- %%DTLSConnetionManager,
- ListenOptionsTracker]}}.
+ ListenOptionsTracker,
+ DTLSConnetionManager, DTLSUdpListeners
+ ]}}.
manager_opts() ->
@@ -94,24 +97,32 @@ tls_connection_manager_child_spec() ->
Type = supervisor,
{Name, StartFunc, Restart, Shutdown, Type, Modules}.
-%% dtls_connection_manager_child_spec() ->
-%% Name = dtls_connection,
-%% StartFunc = {dtls_connection_sup, start_link, []},
-%% Restart = permanent,
-%% Shutdown = 4000,
-%% Modules = [dtls_connection, ssl_connection],
-%% Type = supervisor,
-%% {Name, StartFunc, Restart, Shutdown, Type, Modules}.
+dtls_connection_manager_child_spec() ->
+ Name = dtls_connection,
+ StartFunc = {dtls_connection_sup, start_link, []},
+ Restart = permanent,
+ Shutdown = 4000,
+ Modules = [dtls_connection_sup],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
listen_options_tracker_child_spec() ->
- Name = ssl_socket,
+ Name = tls_socket,
StartFunc = {ssl_listen_tracker_sup, start_link, []},
Restart = permanent,
Shutdown = 4000,
- Modules = [ssl_socket],
+ Modules = [tls_socket],
Type = supervisor,
{Name, StartFunc, Restart, Shutdown, Type, Modules}.
+dtls_udp_listeners_spec() ->
+ Name = dtls_udp_listener,
+ StartFunc = {dtls_udp_sup, start_link, []},
+ Restart = permanent,
+ Shutdown = 4000,
+ Modules = [],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
session_cb_init_args() ->
case application:get_env(ssl, session_cb_init_args) of
diff --git a/lib/ssl/src/tls_connection.erl b/lib/ssl/src/tls_connection.erl
index 932bb139c1..32991d3079 100644
--- a/lib/ssl/src/tls_connection.erl
+++ b/lib/ssl/src/tls_connection.erl
@@ -45,6 +45,8 @@
%% Setup
-export([start_fsm/8, start_link/7, init/1]).
+-export([encode_data/3, encode_alert/3]).
+
%% State transition handling
-export([next_record/1, next_event/3]).
@@ -57,7 +59,7 @@
-export([send_alert/2, close/5]).
%% Data handling
--export([passive_receive/2, next_record_if_active/1, handle_common_event/4]).
+-export([passive_receive/2, next_record_if_active/1, handle_common_event/4, send/3]).
%% gen_statem state functions
-export([init/3, error/3, downgrade/3, %% Initiation and take down states
@@ -114,7 +116,7 @@ queue_handshake(Handshake, #state{negotiated_version = Version,
send_handshake_flight(#state{socket = Socket,
transport_cb = Transport,
flight_buffer = Flight} = State0) ->
- Transport:send(Socket, Flight),
+ send(Transport, Socket, Flight),
State0#state{flight_buffer = []}.
queue_change_cipher(Msg, #state{negotiated_version = Version,
@@ -130,8 +132,8 @@ send_alert(Alert, #state{negotiated_version = Version,
transport_cb = Transport,
connection_states = ConnectionStates0} = State0) ->
{BinMsg, ConnectionStates} =
- ssl_alert:encode(Alert, Version, ConnectionStates0),
- Transport:send(Socket, BinMsg),
+ encode_alert(Alert, Version, ConnectionStates0),
+ send(Transport, Socket, BinMsg),
State0#state{connection_states = ConnectionStates}.
reinit_handshake_data(State) ->
@@ -149,6 +151,18 @@ select_sni_extension(#client_hello{extensions = HelloExtensions}) ->
select_sni_extension(_) ->
undefined.
+encode_data(Data, Version, ConnectionStates0)->
+ tls_record:encode_data(Data, Version, ConnectionStates0).
+
+%%--------------------------------------------------------------------
+-spec encode_alert(#alert{}, ssl_record:ssl_version(), ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
+%%
+%% Description: Encodes an alert
+%%--------------------------------------------------------------------
+encode_alert(#alert{} = Alert, Version, ConnectionStates) ->
+ tls_record:encode_alert_record(Alert, Version, ConnectionStates).
+
%%====================================================================
%% tls_connection_sup API
%%====================================================================
@@ -205,7 +219,7 @@ init({call, From}, {start, Timeout},
Handshake0 = ssl_handshake:init_handshake_history(),
{BinMsg, ConnectionStates, Handshake} =
encode_handshake(Hello, HelloVersion, ConnectionStates0, Handshake0, V2HComp),
- Transport:send(Socket, BinMsg),
+ send(Transport, Socket, BinMsg),
State1 = State0#state{connection_states = ConnectionStates,
negotiated_version = Version, %% Requested version
session =
@@ -450,6 +464,9 @@ handle_common_event(internal, #ssl_tls{type = ?ALERT, fragment = EncAlerts}, Sta
handle_common_event(internal, #ssl_tls{type = _Unknown}, StateName, State) ->
{next_state, StateName, State}.
+send(Transport, Socket, Data) ->
+ tls_socket:send(Transport, Socket, Data).
+
%%--------------------------------------------------------------------
%% gen_statem callbacks
%%--------------------------------------------------------------------
@@ -476,11 +493,11 @@ encode_handshake(Handshake, Version, ConnectionStates0, Hist0, V2HComp) ->
Frag = tls_handshake:encode_handshake(Handshake, Version),
Hist = ssl_handshake:update_handshake_history(Hist0, Frag, V2HComp),
{Encoded, ConnectionStates} =
- ssl_record:encode_handshake(Frag, Version, ConnectionStates0),
+ tls_record:encode_handshake(Frag, Version, ConnectionStates0),
{Encoded, ConnectionStates, Hist}.
encode_change_cipher(#change_cipher_spec{}, Version, ConnectionStates) ->
- ssl_record:encode_change_cipher_spec(Version, ConnectionStates).
+ tls_record:encode_change_cipher_spec(Version, ConnectionStates).
decode_alerts(Bin) ->
ssl_alert:decode(Bin).
@@ -553,7 +570,7 @@ next_record(#state{protocol_buffers =
next_record(#state{protocol_buffers = #protocol_buffers{tls_packets = [], tls_cipher_texts = []},
socket = Socket,
transport_cb = Transport} = State) ->
- ssl_socket:setopts(Transport, Socket, [{active,once}]),
+ tls_socket:setopts(Transport, Socket, [{active,once}]),
{no_record, State};
next_record(State) ->
{no_record, State}.
@@ -622,8 +639,8 @@ renegotiate(#state{role = server,
Frag = tls_handshake:encode_handshake(HelloRequest, Version),
Hs0 = ssl_handshake:init_handshake_history(),
{BinMsg, ConnectionStates} =
- ssl_record:encode_handshake(Frag, Version, ConnectionStates0),
- Transport:send(Socket, BinMsg),
+ tls_record:encode_handshake(Frag, Version, ConnectionStates0),
+ send(Transport, Socket, BinMsg),
State1 = State0#state{connection_states =
ConnectionStates,
tls_handshake_history = Hs0},
@@ -642,7 +659,7 @@ handle_alerts([Alert | Alerts], {next_state, StateName, State, _Actions}) ->
%% User closes or recursive call!
close({close, Timeout}, Socket, Transport = gen_tcp, _,_) ->
- ssl_socket:setopts(Transport, Socket, [{active, false}]),
+ tls_socket:setopts(Transport, Socket, [{active, false}]),
Transport:shutdown(Socket, write),
_ = Transport:recv(Socket, 0, Timeout),
ok;
@@ -684,7 +701,7 @@ gen_handshake(GenConnection, StateName, Type, Event,
Result
catch
_:_ ->
- ssl_connection:handle_own_alert(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE,
+ ssl_connection:handle_own_alert(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE,
malformed_handshake_data),
Version, StateName, State)
end.
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_record.erl b/lib/ssl/src/tls_record.erl
index 5331dd1303..aa8a2aa334 100644
--- a/lib/ssl/src/tls_record.erl
+++ b/lib/ssl/src/tls_record.erl
@@ -34,10 +34,9 @@
%% Handling of incoming data
-export([get_tls_records/2, init_connection_states/2]).
-%% Decoding
--export([decode_cipher_text/3]).
-
-%% Encoding
+%% Encoding TLS records
+-export([encode_handshake/3, encode_alert_record/3,
+ encode_change_cipher_spec/2, encode_data/3]).
-export([encode_plain_text/4]).
%% Protocol version handling
@@ -46,6 +45,9 @@
is_higher/2, supported_protocol_versions/0,
is_acceptable_version/1, is_acceptable_version/2]).
+%% Decoding
+-export([decode_cipher_text/3]).
+
-export_type([tls_version/0, tls_atom_version/0]).
-type tls_version() :: ssl_record:ssl_version().
@@ -85,152 +87,61 @@ get_tls_records(Data, <<>>) ->
get_tls_records(Data, Buffer) ->
get_tls_records_aux(list_to_binary([Buffer, Data]), []).
-get_tls_records_aux(<<?BYTE(?APPLICATION_DATA),?BYTE(MajVer),?BYTE(MinVer),
- ?UINT16(Length), Data:Length/binary, Rest/binary>>,
- Acc) ->
- get_tls_records_aux(Rest, [#ssl_tls{type = ?APPLICATION_DATA,
- version = {MajVer, MinVer},
- fragment = Data} | Acc]);
-get_tls_records_aux(<<?BYTE(?HANDSHAKE),?BYTE(MajVer),?BYTE(MinVer),
- ?UINT16(Length),
- Data:Length/binary, Rest/binary>>, Acc) ->
- get_tls_records_aux(Rest, [#ssl_tls{type = ?HANDSHAKE,
- version = {MajVer, MinVer},
- fragment = Data} | Acc]);
-get_tls_records_aux(<<?BYTE(?ALERT),?BYTE(MajVer),?BYTE(MinVer),
- ?UINT16(Length), Data:Length/binary,
- Rest/binary>>, Acc) ->
- get_tls_records_aux(Rest, [#ssl_tls{type = ?ALERT,
- version = {MajVer, MinVer},
- fragment = Data} | Acc]);
-get_tls_records_aux(<<?BYTE(?CHANGE_CIPHER_SPEC),?BYTE(MajVer),?BYTE(MinVer),
- ?UINT16(Length), Data:Length/binary, Rest/binary>>,
- Acc) ->
- get_tls_records_aux(Rest, [#ssl_tls{type = ?CHANGE_CIPHER_SPEC,
- version = {MajVer, MinVer},
- fragment = Data} | Acc]);
-%% Matches an ssl v2 client hello message.
-%% The server must be able to receive such messages, from clients that
-%% are willing to use ssl v3 or higher, but have ssl v2 compatibility.
-get_tls_records_aux(<<1:1, Length0:15, Data0:Length0/binary, Rest/binary>>,
- Acc) ->
- case Data0 of
- <<?BYTE(?CLIENT_HELLO), ?BYTE(MajVer), ?BYTE(MinVer), _/binary>> ->
- Length = Length0-1,
- <<?BYTE(_), Data1:Length/binary>> = Data0,
- Data = <<?BYTE(?CLIENT_HELLO), ?UINT24(Length), Data1/binary>>,
- get_tls_records_aux(Rest, [#ssl_tls{type = ?HANDSHAKE,
- version = {MajVer, MinVer},
- fragment = Data} | Acc]);
- _ ->
- ?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE)
-
- end;
-
-get_tls_records_aux(<<0:1, _CT:7, ?BYTE(_MajVer), ?BYTE(_MinVer),
- ?UINT16(Length), _/binary>>,
- _Acc) when Length > ?MAX_CIPHER_TEXT_LENGTH ->
- ?ALERT_REC(?FATAL, ?RECORD_OVERFLOW);
-
-get_tls_records_aux(<<1:1, Length0:15, _/binary>>,_Acc)
- when Length0 > ?MAX_CIPHER_TEXT_LENGTH ->
- ?ALERT_REC(?FATAL, ?RECORD_OVERFLOW);
+%%--------------------------------------------------------------------
+-spec encode_handshake(iolist(), tls_version(), ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
+%
+%% Description: Encodes a handshake message to send on the ssl-socket.
+%%--------------------------------------------------------------------
+encode_handshake(Frag, Version,
+ #{current_write :=
+ #{beast_mitigation := BeastMitigation,
+ security_parameters :=
+ #security_parameters{bulk_cipher_algorithm = BCA}}} =
+ ConnectionStates) ->
+ case iolist_size(Frag) of
+ N when N > ?MAX_PLAIN_TEXT_LENGTH ->
+ Data = split_bin(iolist_to_binary(Frag), ?MAX_PLAIN_TEXT_LENGTH, Version, BCA, BeastMitigation),
+ encode_iolist(?HANDSHAKE, Data, Version, ConnectionStates);
+ _ ->
+ encode_plain_text(?HANDSHAKE, Version, Frag, ConnectionStates)
+ end.
-get_tls_records_aux(Data, Acc) ->
- case size(Data) =< ?MAX_CIPHER_TEXT_LENGTH + ?INITIAL_BYTES of
- true ->
- {lists:reverse(Acc), Data};
- false ->
- ?ALERT_REC(?FATAL, ?UNEXPECTED_MESSAGE)
- end.
+%%--------------------------------------------------------------------
+-spec encode_alert_record(#alert{}, tls_version(), ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
+%%
+%% Description: Encodes an alert message to send on the ssl-socket.
+%%--------------------------------------------------------------------
+encode_alert_record(#alert{level = Level, description = Description},
+ Version, ConnectionStates) ->
+ encode_plain_text(?ALERT, Version, <<?BYTE(Level), ?BYTE(Description)>>,
+ ConnectionStates).
-encode_plain_text(Type, Version, Data,
- #{current_write :=
- #{sequence_number := Seq,
- compression_state := CompS0,
- security_parameters :=
- #security_parameters{
- cipher_type = ?AEAD,
- compression_algorithm = CompAlg}
- }= WriteState0} = ConnectionStates) ->
- {Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
- WriteState1 = WriteState0#{compression_state => CompS1},
- AAD = calc_aad(Type, Version, WriteState1),
- {CipherFragment, WriteState} = ssl_record:cipher_aead(Version, Comp, WriteState1, AAD),
- CipherText = encode_tls_cipher_text(Type, Version, CipherFragment),
- {CipherText, ConnectionStates#{current_write => WriteState#{sequence_number => Seq +1}}};
-
-encode_plain_text(Type, Version, Data,
- #{current_write :=
- #{sequence_number := Seq,
- compression_state := CompS0,
- security_parameters :=
- #security_parameters{compression_algorithm = CompAlg}
- }= WriteState0} = ConnectionStates) ->
- {Comp, CompS1} = ssl_record:compress(CompAlg, Data, CompS0),
- WriteState1 = WriteState0#{compression_state => CompS1},
- MacHash = calc_mac_hash(Type, Version, Comp, WriteState1),
- {CipherFragment, WriteState} = ssl_record:cipher(Version, Comp, WriteState1, MacHash),
- CipherText = encode_tls_cipher_text(Type, Version, CipherFragment),
- {CipherText, ConnectionStates#{current_write => WriteState#{sequence_number => Seq +1}}};
-encode_plain_text(_,_,_, CS) ->
- exit({cs, CS}).
+%%--------------------------------------------------------------------
+-spec encode_change_cipher_spec(tls_version(), ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
+%%
+%% Description: Encodes a change_cipher_spec-message to send on the ssl socket.
+%%--------------------------------------------------------------------
+encode_change_cipher_spec(Version, ConnectionStates) ->
+ encode_plain_text(?CHANGE_CIPHER_SPEC, Version, ?byte(?CHANGE_CIPHER_SPEC_PROTO), ConnectionStates).
%%--------------------------------------------------------------------
--spec decode_cipher_text(#ssl_tls{}, ssl_record:connection_states(), boolean()) ->
- {#ssl_tls{}, ssl_record:connection_states()}| #alert{}.
+-spec encode_data(binary(), tls_version(), ssl_record:connection_states()) ->
+ {iolist(), ssl_record:connection_states()}.
%%
-%% Description: Decode cipher text
+%% Description: Encodes data to send on the ssl-socket.
%%--------------------------------------------------------------------
-decode_cipher_text(#ssl_tls{type = Type, version = Version,
- fragment = CipherFragment} = CipherText,
- #{current_read :=
- #{compression_state := CompressionS0,
- sequence_number := Seq,
- security_parameters :=
- #security_parameters{
- cipher_type = ?AEAD,
- compression_algorithm = CompAlg}
- } = ReadState0} = ConnnectionStates0, _) ->
- AAD = calc_aad(Type, Version, ReadState0),
- case ssl_record:decipher_aead(Version, CipherFragment, ReadState0, AAD) of
- {PlainFragment, ReadState1} ->
- {Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
- PlainFragment, CompressionS0),
- ConnnectionStates = ConnnectionStates0#{
- current_read => ReadState1#{sequence_number => Seq + 1,
- compression_state => CompressionS1}},
- {CipherText#ssl_tls{fragment = Plain}, ConnnectionStates};
- #alert{} = Alert ->
- Alert
- end;
+encode_data(Frag, Version,
+ #{current_write := #{beast_mitigation := BeastMitigation,
+ security_parameters :=
+ #security_parameters{bulk_cipher_algorithm = BCA}}} =
+ ConnectionStates) ->
+ Data = split_bin(Frag, ?MAX_PLAIN_TEXT_LENGTH, Version, BCA, BeastMitigation),
+ encode_iolist(?APPLICATION_DATA, Data, Version, ConnectionStates).
+
-decode_cipher_text(#ssl_tls{type = Type, version = Version,
- fragment = CipherFragment} = CipherText,
- #{current_read :=
- #{compression_state := CompressionS0,
- sequence_number := Seq,
- security_parameters :=
- #security_parameters{compression_algorithm = CompAlg}
- } = ReadState0} = ConnnectionStates0, PaddingCheck) ->
- case ssl_record:decipher(Version, CipherFragment, ReadState0, PaddingCheck) of
- {PlainFragment, Mac, ReadState1} ->
- MacHash = calc_mac_hash(Type, Version, PlainFragment, ReadState1),
- case ssl_record:is_correct_mac(Mac, MacHash) of
- true ->
- {Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
- PlainFragment, CompressionS0),
- ConnnectionStates = ConnnectionStates0#{
- current_read => ReadState1#{
- sequence_number => Seq + 1,
- compression_state => CompressionS1}},
- {CipherText#ssl_tls{fragment = Plain}, ConnnectionStates};
- false ->
- ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC)
- end;
- #alert{} = Alert ->
- Alert
- end.
%%--------------------------------------------------------------------
-spec protocol_version(tls_atom_version() | tls_version()) ->
tls_version() | tls_atom_version().
@@ -401,6 +312,70 @@ initial_connection_state(ConnectionEnd, BeastMitigation) ->
server_verify_data => undefined
}.
+get_tls_records_aux(<<?BYTE(?APPLICATION_DATA),?BYTE(MajVer),?BYTE(MinVer),
+ ?UINT16(Length), Data:Length/binary, Rest/binary>>,
+ Acc) ->
+ get_tls_records_aux(Rest, [#ssl_tls{type = ?APPLICATION_DATA,
+ version = {MajVer, MinVer},
+ fragment = Data} | Acc]);
+get_tls_records_aux(<<?BYTE(?HANDSHAKE),?BYTE(MajVer),?BYTE(MinVer),
+ ?UINT16(Length),
+ Data:Length/binary, Rest/binary>>, Acc) ->
+ get_tls_records_aux(Rest, [#ssl_tls{type = ?HANDSHAKE,
+ version = {MajVer, MinVer},
+ fragment = Data} | Acc]);
+get_tls_records_aux(<<?BYTE(?ALERT),?BYTE(MajVer),?BYTE(MinVer),
+ ?UINT16(Length), Data:Length/binary,
+ Rest/binary>>, Acc) ->
+ get_tls_records_aux(Rest, [#ssl_tls{type = ?ALERT,
+ version = {MajVer, MinVer},
+ fragment = Data} | Acc]);
+get_tls_records_aux(<<?BYTE(?CHANGE_CIPHER_SPEC),?BYTE(MajVer),?BYTE(MinVer),
+ ?UINT16(Length), Data:Length/binary, Rest/binary>>,
+ Acc) ->
+ get_tls_records_aux(Rest, [#ssl_tls{type = ?CHANGE_CIPHER_SPEC,
+ version = {MajVer, MinVer},
+ fragment = Data} | Acc]);
+%% Matches an ssl v2 client hello message.
+%% The server must be able to receive such messages, from clients that
+%% are willing to use ssl v3 or higher, but have ssl v2 compatibility.
+get_tls_records_aux(<<1:1, Length0:15, Data0:Length0/binary, Rest/binary>>,
+ Acc) ->
+ case Data0 of
+ <<?BYTE(?CLIENT_HELLO), ?BYTE(MajVer), ?BYTE(MinVer), _/binary>> ->
+ Length = Length0-1,
+ <<?BYTE(_), Data1:Length/binary>> = Data0,
+ Data = <<?BYTE(?CLIENT_HELLO), ?UINT24(Length), Data1/binary>>,
+ get_tls_records_aux(Rest, [#ssl_tls{type = ?HANDSHAKE,
+ version = {MajVer, MinVer},
+ fragment = Data} | Acc]);
+ _ ->
+ ?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE)
+
+ end;
+
+get_tls_records_aux(<<0:1, _CT:7, ?BYTE(_MajVer), ?BYTE(_MinVer),
+ ?UINT16(Length), _/binary>>,
+ _Acc) when Length > ?MAX_CIPHER_TEXT_LENGTH ->
+ ?ALERT_REC(?FATAL, ?RECORD_OVERFLOW);
+
+get_tls_records_aux(<<1:1, Length0:15, _/binary>>,_Acc)
+ when Length0 > ?MAX_CIPHER_TEXT_LENGTH ->
+ ?ALERT_REC(?FATAL, ?RECORD_OVERFLOW);
+
+get_tls_records_aux(Data, Acc) ->
+ case size(Data) =< ?MAX_CIPHER_TEXT_LENGTH + ?INITIAL_BYTES of
+ true ->
+ {lists:reverse(Acc), Data};
+ false ->
+ ?ALERT_REC(?FATAL, ?UNEXPECTED_MESSAGE)
+ end.
+
+encode_plain_text(Type, Version, Data, #{current_write := Write0} = ConnectionStates) ->
+ {CipherFragment, Write1} = ssl_record:encode_plain_text(Type, Version, Data, Write0),
+ {CipherText, Write} = encode_tls_cipher_text(Type, Version, CipherFragment, Write1),
+ {CipherText, ConnectionStates#{current_write => Write}}.
+
lowest_list_protocol_version(Ver, []) ->
Ver;
lowest_list_protocol_version(Ver1, [Ver2 | Rest]) ->
@@ -411,20 +386,10 @@ highest_list_protocol_version(Ver, []) ->
highest_list_protocol_version(Ver1, [Ver2 | Rest]) ->
highest_list_protocol_version(highest_protocol_version(Ver1, Ver2), Rest).
-encode_tls_cipher_text(Type, {MajVer, MinVer}, Fragment) ->
+encode_tls_cipher_text(Type, {MajVer, MinVer}, Fragment, #{sequence_number := Seq} = Write) ->
Length = erlang:iolist_size(Fragment),
- [<<?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer), ?UINT16(Length)>>, Fragment].
-
-
-mac_hash({_,_}, ?NULL, _MacSecret, _SeqNo, _Type,
- _Length, _Fragment) ->
- <<>>;
-mac_hash({3, 0}, MacAlg, MacSecret, SeqNo, Type, Length, Fragment) ->
- ssl_v3:mac_hash(MacAlg, MacSecret, SeqNo, Type, Length, Fragment);
-mac_hash({3, N} = Version, MacAlg, MacSecret, SeqNo, Type, Length, Fragment)
- when N =:= 1; N =:= 2; N =:= 3 ->
- tls_v1:mac_hash(MacAlg, MacSecret, SeqNo, Type, Version,
- Length, Fragment).
+ {[<<?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer), ?UINT16(Length)>>, Fragment],
+ Write#{sequence_number => Seq +1}}.
highest_protocol_version() ->
highest_protocol_version(supported_protocol_versions()).
@@ -432,21 +397,96 @@ highest_protocol_version() ->
lowest_protocol_version() ->
lowest_protocol_version(supported_protocol_versions()).
-
sufficient_tlsv1_2_crypto_support() ->
CryptoSupport = crypto:supports(),
proplists:get_bool(sha256, proplists:get_value(hashs, CryptoSupport)).
-calc_mac_hash(Type, Version,
- PlainFragment, #{sequence_number := SeqNo,
- mac_secret := MacSecret,
- security_parameters:=
- SecPars}) ->
- Length = erlang:iolist_size(PlainFragment),
- mac_hash(Version, SecPars#security_parameters.mac_algorithm,
- MacSecret, SeqNo, Type,
- Length, PlainFragment).
-
-calc_aad(Type, {MajVer, MinVer},
- #{sequence_number := SeqNo}) ->
- <<SeqNo:64/integer, ?BYTE(Type), ?BYTE(MajVer), ?BYTE(MinVer)>>.
+encode_iolist(Type, Data, Version, ConnectionStates0) ->
+ {ConnectionStates, EncodedMsg} =
+ lists:foldl(fun(Text, {CS0, Encoded}) ->
+ {Enc, CS1} =
+ encode_plain_text(Type, Version, Text, CS0),
+ {CS1, [Enc | Encoded]}
+ end, {ConnectionStates0, []}, Data),
+ {lists:reverse(EncodedMsg), ConnectionStates}.
+
+%% 1/n-1 splitting countermeasure Rizzo/Duong-Beast, RC4 chiphers are
+%% not vulnerable to this attack.
+split_bin(<<FirstByte:8, Rest/binary>>, ChunkSize, Version, BCA, one_n_minus_one) when
+ BCA =/= ?RC4 andalso ({3, 1} == Version orelse
+ {3, 0} == Version) ->
+ do_split_bin(Rest, ChunkSize, [[FirstByte]]);
+%% 0/n splitting countermeasure for clients that are incompatible with 1/n-1
+%% splitting.
+split_bin(Bin, ChunkSize, Version, BCA, zero_n) when
+ BCA =/= ?RC4 andalso ({3, 1} == Version orelse
+ {3, 0} == Version) ->
+ do_split_bin(Bin, ChunkSize, [[<<>>]]);
+split_bin(Bin, ChunkSize, _, _, _) ->
+ do_split_bin(Bin, ChunkSize, []).
+
+do_split_bin(<<>>, _, Acc) ->
+ lists:reverse(Acc);
+do_split_bin(Bin, ChunkSize, Acc) ->
+ case Bin of
+ <<Chunk:ChunkSize/binary, Rest/binary>> ->
+ do_split_bin(Rest, ChunkSize, [Chunk | Acc]);
+ _ ->
+ lists:reverse(Acc, [Bin])
+ end.
+
+%%--------------------------------------------------------------------
+-spec decode_cipher_text(#ssl_tls{}, ssl_record:connection_states(), boolean()) ->
+ {#ssl_tls{}, ssl_record:connection_states()}| #alert{}.
+%%
+%% Description: Decode cipher text
+%%--------------------------------------------------------------------
+decode_cipher_text(#ssl_tls{type = Type, version = Version,
+ fragment = CipherFragment} = CipherText,
+ #{current_read :=
+ #{compression_state := CompressionS0,
+ sequence_number := Seq,
+ security_parameters :=
+ #security_parameters{
+ cipher_type = ?AEAD,
+ compression_algorithm = CompAlg}
+ } = ReadState0} = ConnnectionStates0, _) ->
+ AAD = ssl_cipher:calc_aad(Type, Version, ReadState0),
+ case ssl_record:decipher_aead(Version, CipherFragment, ReadState0, AAD) of
+ {PlainFragment, ReadState1} ->
+ {Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
+ PlainFragment, CompressionS0),
+ ConnnectionStates = ConnnectionStates0#{
+ current_read => ReadState1#{sequence_number => Seq + 1,
+ compression_state => CompressionS1}},
+ {CipherText#ssl_tls{fragment = Plain}, ConnnectionStates};
+ #alert{} = Alert ->
+ Alert
+ end;
+
+decode_cipher_text(#ssl_tls{type = Type, version = Version,
+ fragment = CipherFragment} = CipherText,
+ #{current_read :=
+ #{compression_state := CompressionS0,
+ sequence_number := Seq,
+ security_parameters :=
+ #security_parameters{compression_algorithm = CompAlg}
+ } = ReadState0} = ConnnectionStates0, PaddingCheck) ->
+ case ssl_record:decipher(Version, CipherFragment, ReadState0, PaddingCheck) of
+ {PlainFragment, Mac, ReadState1} ->
+ MacHash = ssl_cipher:calc_mac_hash(Type, Version, PlainFragment, ReadState1),
+ case ssl_record:is_correct_mac(Mac, MacHash) of
+ true ->
+ {Plain, CompressionS1} = ssl_record:uncompress(CompAlg,
+ PlainFragment, CompressionS0),
+ ConnnectionStates = ConnnectionStates0#{
+ current_read => ReadState1#{
+ sequence_number => Seq + 1,
+ compression_state => CompressionS1}},
+ {CipherText#ssl_tls{fragment = Plain}, ConnnectionStates};
+ false ->
+ ?ALERT_REC(?FATAL, ?BAD_RECORD_MAC)
+ end;
+ #alert{} = Alert ->
+ Alert
+ end.
diff --git a/lib/ssl/src/ssl_socket.erl b/lib/ssl/src/tls_socket.erl
index b2aea2ba9c..e76d9c100a 100644
--- a/lib/ssl/src/ssl_socket.erl
+++ b/lib/ssl/src/tls_socket.erl
@@ -17,16 +17,19 @@
%%
%% %CopyrightEnd%
%%
--module(ssl_socket).
+-module(tls_socket).
-behaviour(gen_server).
-include("ssl_internal.hrl").
-include("ssl_api.hrl").
--export([socket/5, setopts/3, getopts/3, getstat/3, peername/2, sockname/2, port/2]).
+-export([send/3, listen/3, accept/3, socket/5, connect/4, upgrade/3,
+ setopts/3, getopts/3, getstat/3, peername/2, sockname/2, port/2]).
+-export([split_options/1, get_socket_opts/3]).
-export([emulated_options/0, internal_inet_values/0, default_inet_values/0,
- init/1, start_link/3, terminate/2, inherit_tracker/3, get_emulated_opts/1,
+ init/1, start_link/3, terminate/2, inherit_tracker/3,
+ emulated_socket_options/2, get_emulated_opts/1,
set_emulated_opts/2, get_all_opts/1, handle_call/3, handle_cast/2,
handle_info/2, code_change/3]).
@@ -39,6 +42,76 @@
%%--------------------------------------------------------------------
%%% Internal API
%%--------------------------------------------------------------------
+send(Transport, Socket, Data) ->
+ Transport:send(Socket, Data).
+
+listen(Transport, Port, #config{transport_info = {Transport, _, _, _},
+ inet_user = Options,
+ ssl = SslOpts, emulated = EmOpts} = Config) ->
+ case Transport:listen(Port, Options ++ internal_inet_values()) of
+ {ok, ListenSocket} ->
+ {ok, Tracker} = inherit_tracker(ListenSocket, EmOpts, SslOpts),
+ {ok, #sslsocket{pid = {ListenSocket, Config#config{emulated = Tracker}}}};
+ Err = {error, _} ->
+ Err
+ end.
+
+accept(ListenSocket, #config{transport_info = {Transport,_,_,_} = CbInfo,
+ connection_cb = ConnectionCb,
+ ssl = SslOpts,
+ emulated = Tracker}, Timeout) ->
+ case Transport:accept(ListenSocket, Timeout) of
+ {ok, Socket} ->
+ {ok, EmOpts} = get_emulated_opts(Tracker),
+ {ok, Port} = tls_socket:port(Transport, Socket),
+ ConnArgs = [server, "localhost", Port, Socket,
+ {SslOpts, emulated_socket_options(EmOpts, #socket_options{}), Tracker}, self(), CbInfo],
+ case tls_connection_sup:start_child(ConnArgs) of
+ {ok, Pid} ->
+ ssl_connection:socket_control(ConnectionCb, Socket, Pid, Transport, Tracker);
+ {error, Reason} ->
+ {error, Reason}
+ end;
+ {error, Reason} ->
+ {error, Reason}
+ end.
+
+upgrade(Socket, #config{transport_info = {Transport,_,_,_}= CbInfo,
+ ssl = SslOptions,
+ emulated = EmOpts, connection_cb = ConnectionCb}, Timeout) ->
+ ok = setopts(Transport, Socket, tls_socket:internal_inet_values()),
+ case peername(Transport, Socket) of
+ {ok, {Address, Port}} ->
+ ssl_connection:connect(ConnectionCb, Address, Port, Socket,
+ {SslOptions,
+ emulated_socket_options(EmOpts, #socket_options{}), undefined},
+ self(), CbInfo, Timeout);
+ {error, Error} ->
+ {error, Error}
+ end.
+
+connect(Address, Port,
+ #config{transport_info = CbInfo, inet_user = UserOpts, ssl = SslOpts,
+ emulated = EmOpts, inet_ssl = SocketOpts, connection_cb = ConnetionCb},
+ Timeout) ->
+ {Transport, _, _, _} = CbInfo,
+ try Transport:connect(Address, Port, SocketOpts, Timeout) of
+ {ok, Socket} ->
+ ssl_connection:connect(ConnetionCb, Address, Port, Socket,
+ {SslOpts,
+ emulated_socket_options(EmOpts, #socket_options{}), undefined},
+ self(), CbInfo, Timeout);
+ {error, Reason} ->
+ {error, Reason}
+ catch
+ exit:{function_clause, _} ->
+ {error, {options, {cb_info, CbInfo}}};
+ exit:badarg ->
+ {error, {options, {socket_options, UserOpts}}};
+ exit:{badarg, _} ->
+ {error, {options, {socket_options, UserOpts}}}
+ end.
+
socket(Pid, Transport, Socket, ConnectionCb, Tracker) ->
#sslsocket{pid = Pid,
%% "The name "fd" is keept for backwards compatibility
@@ -241,3 +314,17 @@ get_emulated_opts(TrackerPid, EmOptNames) ->
lists:map(fun(Name) -> {value, Value} = lists:keysearch(Name, 1, EmOpts),
Value end,
EmOptNames).
+
+emulated_socket_options(InetValues, #socket_options{
+ mode = Mode,
+ header = Header,
+ active = Active,
+ packet = Packet,
+ packet_size = Size}) ->
+ #socket_options{
+ mode = proplists:get_value(mode, InetValues, Mode),
+ header = proplists:get_value(header, InetValues, Header),
+ active = proplists:get_value(active, InetValues, Active),
+ packet = proplists:get_value(packet, InetValues, Packet),
+ packet_size = proplists:get_value(packet_size, InetValues, Size)
+ }.
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..f779765b18 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,8 +387,35 @@ basic_test(ClientCert, ClientKey, ClientCA, ServerCert, ServerKey, ServerCA, Con
check_result(Server, SType, Client, CType),
close(Server, Client).
-start_client(openssl, Port, PeerCA, OwnCa, Cert, Key, _Config) ->
- CA = new_openssl_ca("openssl_client_ca", PeerCA, OwnCa),
+
+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) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ CA = new_openssl_ca(filename:join(PrivDir, "openssl_client_ca.pem"), PeerCA, OwnCa),
Version = tls_record:protocol_version(tls_record:highest_protocol_version([])),
Exe = "openssl",
Args = ["s_client", "-verify", "2", "-port", integer_to_list(Port),
@@ -257,7 +427,8 @@ start_client(openssl, Port, PeerCA, OwnCa, Cert, Key, _Config) ->
true = port_command(OpenSslPort, "Hello world"),
OpenSslPort;
start_client(erlang, Port, PeerCA, OwnCa, Cert, Key, Config) ->
- CA = new_ca("erlang_client_ca", PeerCA, OwnCa),
+ PrivDir = proplists:get_value(priv_dir, Config),
+ CA = new_ca(filename:join(PrivDir,"erlang_client_ca.pem"), PeerCA, OwnCa),
{ClientNode, _, Hostname} = ssl_test_lib:run_where(Config),
ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
{host, Hostname},
@@ -267,8 +438,36 @@ start_client(erlang, Port, PeerCA, OwnCa, Cert, Key, Config) ->
{cacertfile, CA},
{certfile, Cert}, {keyfile, Key}]}]).
-start_server(openssl, PeerCA, OwnCa, Cert, Key, _Config) ->
- CA = new_openssl_ca("openssl_server_ca", PeerCA, OwnCa),
+
+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) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ CA = new_openssl_ca(filename:join(PrivDir,"openssl_server_ca.pem"), PeerCA, OwnCa),
Port = ssl_test_lib:inet_port(node()),
Version = tls_record:protocol_version(tls_record:highest_protocol_version([])),
Exe = "openssl",
@@ -279,7 +478,8 @@ start_server(openssl, PeerCA, OwnCa, Cert, Key, _Config) ->
true = port_command(OpenSslPort, "Hello world"),
{OpenSslPort, Port};
start_server(erlang, PeerCA, OwnCa, Cert, Key, Config) ->
- CA = new_ca("erlang_server_ca", PeerCA, OwnCa),
+ PrivDir = proplists:get_value(priv_dir, Config),
+ CA = new_ca(filename:join(PrivDir,"erlang_server_ca.pem"), PeerCA, OwnCa),
{_, ServerNode, _} = ssl_test_lib:run_where(Config),
Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
{from, self()},
@@ -290,17 +490,42 @@ 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),
+ PrivDir = proplists:get_value(priv_dir, Config),
+ CA = new_ca(filename:join(PrivDir, "erlang_server_ca.pem"), PeerCA, OwnCa),
{_, ServerNode, _} = ssl_test_lib:run_where(Config),
Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
- {from, self()},
- {mfa, {ssl_test_lib,
- send_recv_result_active,
- []}},
- {options,
- [{verify, verify_peer}, {cacertfile, CA},
- {certfile, Cert}, {key, Key}]}]),
+ {from, self()},
+ {mfa, {ssl_test_lib,
+ send_recv_result_active,
+ []}},
+ {options,
+ [{verify, verify_peer}, {cacertfile, CA},
+ {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) ->
@@ -350,15 +575,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 1be43c56c4..52c1af5b4c 100644
--- a/lib/ssl/test/ssl_basic_SUITE.erl
+++ b/lib/ssl/test/ssl_basic_SUITE.erl
@@ -52,7 +52,7 @@ all() ->
{group, options},
{group, options_tls},
{group, session},
- %%{group, 'dtlsv1.2'},
+ {group, 'dtlsv1.2'},
%%{group, 'dtlsv1'},
{group, 'tlsv1.2'},
{group, 'tlsv1.1'},
@@ -66,6 +66,7 @@ groups() ->
{options, [], options_tests()},
{options_tls, [], options_tests_tls()},
%%{'dtlsv1.2', [], all_versions_groups()},
+ {'dtlsv1.2', [], [connection_information]},
%%{'dtlsv1', [], all_versions_groups()},
{'tlsv1.2', [], all_versions_groups() ++ tls_versions_groups() ++ [conf_signature_algs, no_common_signature_algs]},
{'tlsv1.1', [], all_versions_groups() ++ tls_versions_groups()},
@@ -150,6 +151,7 @@ api_tests() ->
peercert_with_client_cert,
sockname,
versions,
+ eccs,
controlling_process,
getstat,
close_with_timeout,
@@ -456,6 +458,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}),
@@ -1504,6 +1515,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,""}].
@@ -2164,7 +2194,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).
%%-------------------------------------------------------------------
@@ -2305,7 +2335,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).
%%--------------------------------------------------------------------
@@ -2323,7 +2353,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).
%%--------------------------------------------------------------------
@@ -3634,9 +3664,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, []}).
@@ -3644,9 +3675,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, []}).
@@ -3654,9 +3686,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, []}).
@@ -4407,7 +4440,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),
@@ -4698,3 +4731,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_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl
index 942e68967a..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 -----------------------------------
diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl
index cab22a60a8..9632103696 100644
--- a/lib/ssl/test/ssl_test_lib.erl
+++ b/lib/ssl/test/ssl_test_lib.erl
@@ -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),
@@ -1174,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/ssl/vsn.mk b/lib/ssl/vsn.mk
index 59732c7926..2cdb825d75 100644
--- a/lib/ssl/vsn.mk
+++ b/lib/ssl/vsn.mk
@@ -1 +1 @@
-SSL_VSN = 8.0.3
+SSL_VSN = 8.1
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> &lt; 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 &lt; 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/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/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/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/syntax_tools/src/epp_dodger.erl b/lib/syntax_tools/src/epp_dodger.erl
index 39c522fd11..43e42d8195 100644
--- a/lib/syntax_tools/src/epp_dodger.erl
+++ b/lib/syntax_tools/src/epp_dodger.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 2001-2006 Richard Carlsson
diff --git a/lib/syntax_tools/src/erl_comment_scan.erl b/lib/syntax_tools/src/erl_comment_scan.erl
index b5ac564146..8d0e2a10a3 100644
--- a/lib/syntax_tools/src/erl_comment_scan.erl
+++ b/lib/syntax_tools/src/erl_comment_scan.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% =====================================================================
diff --git a/lib/syntax_tools/src/erl_prettypr.erl b/lib/syntax_tools/src/erl_prettypr.erl
index df0d78031c..6c812aaa6c 100644
--- a/lib/syntax_tools/src/erl_prettypr.erl
+++ b/lib/syntax_tools/src/erl_prettypr.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 1997-2006 Richard Carlsson
diff --git a/lib/syntax_tools/src/erl_recomment.erl b/lib/syntax_tools/src/erl_recomment.erl
index 1d23034991..a774b898e8 100644
--- a/lib/syntax_tools/src/erl_recomment.erl
+++ b/lib/syntax_tools/src/erl_recomment.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 1997-2006 Richard Carlsson
diff --git a/lib/syntax_tools/src/erl_syntax.erl b/lib/syntax_tools/src/erl_syntax.erl
index ee42e56172..b856a5d1dd 100644
--- a/lib/syntax_tools/src/erl_syntax.erl
+++ b/lib/syntax_tools/src/erl_syntax.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 1997-2006 Richard Carlsson
diff --git a/lib/syntax_tools/src/erl_syntax_lib.erl b/lib/syntax_tools/src/erl_syntax_lib.erl
index 5aecf5d774..aae6755639 100644
--- a/lib/syntax_tools/src/erl_syntax_lib.erl
+++ b/lib/syntax_tools/src/erl_syntax_lib.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 1997-2006 Richard Carlsson
diff --git a/lib/syntax_tools/src/erl_tidy.erl b/lib/syntax_tools/src/erl_tidy.erl
index 9e273dfb84..2e0ee209f8 100644
--- a/lib/syntax_tools/src/erl_tidy.erl
+++ b/lib/syntax_tools/src/erl_tidy.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 1999-2014 Richard Carlsson
diff --git a/lib/syntax_tools/src/igor.erl b/lib/syntax_tools/src/igor.erl
index 943250e5cd..4d18f7abcf 100644
--- a/lib/syntax_tools/src/igor.erl
+++ b/lib/syntax_tools/src/igor.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 1998-2014 Richard Carlsson
diff --git a/lib/syntax_tools/src/prettypr.erl b/lib/syntax_tools/src/prettypr.erl
index 1b5ba6b05a..5156af667b 100644
--- a/lib/syntax_tools/src/prettypr.erl
+++ b/lib/syntax_tools/src/prettypr.erl
@@ -11,7 +11,7 @@
%%
%% You should have received a copy of the GNU Lesser General Public
%% License along with this library; if not, write to the Free Software
-%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
%% USA
%%
%% @copyright 2000-2006 Richard Carlsson
diff --git a/lib/tools/emacs/Makefile b/lib/tools/emacs/Makefile
index e1b195ef97..35c93ba4ed 100644
--- a/lib/tools/emacs/Makefile
+++ b/lib/tools/emacs/Makefile
@@ -38,6 +38,7 @@ MAN_FILES= \
tags.3
EMACS_FILES= \
+ erldoc \
erlang-skels \
erlang-skels-old \
erlang_appwiz \
diff --git a/lib/tools/emacs/erlang-edoc.el b/lib/tools/emacs/erlang-edoc.el
index 034036ad04..2801aa8ae7 100644
--- a/lib/tools/emacs/erlang-edoc.el
+++ b/lib/tools/emacs/erlang-edoc.el
@@ -78,7 +78,7 @@
'(("^%+\\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)
+ ("^%+\\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)))
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 f9a6d24b2c..160057e179 100644
--- a/lib/tools/emacs/erlang-start.el
+++ b/lib/tools/emacs/erlang-start.el
@@ -78,9 +78,23 @@
(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 67e88bac30..39c6065ce4 100644
--- a/lib/tools/emacs/erlang.el
+++ b/lib/tools/emacs/erlang.el
@@ -59,7 +59,7 @@
;; erlang-patches@erlang.org
;; 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.
@@ -95,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.")
@@ -123,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
@@ -174,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))))
@@ -479,6 +479,11 @@ To activate the workaround, place the following in your `~/.emacs' file:
"*Indentation of Erlang calls/clauses within blocks.")
(put 'erlang-indent-level 'safe-local-variable 'integerp)
+(defvar erlang-icr-indent nil
+ "*Indentation of Erlang if/case/receive/ patterns. `nil' means
+ keeping default behavior. When non-nil, indent to th column of
+ if/case/receive.")
+
(defvar erlang-indent-guard 2
"*Indentation of Erlang guards.")
(put 'erlang-indent-guard 'safe-local-variable 'integerp)
@@ -562,35 +567,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.
@@ -609,13 +614,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"
@@ -634,7 +639,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"
@@ -657,7 +662,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
@@ -680,7 +685,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"
@@ -726,7 +731,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)))
@@ -846,7 +851,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
@@ -1001,8 +1006,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)
@@ -1014,7 +1019,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)
@@ -1068,7 +1073,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
@@ -1090,7 +1095,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
@@ -1102,8 +1107,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
@@ -1117,7 +1122,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
@@ -1135,7 +1140,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
@@ -1155,18 +1160,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
@@ -1175,27 +1180,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'.")
@@ -1206,8 +1211,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))
@@ -1216,8 +1221,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.")
@@ -1240,32 +1245,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)
@@ -1273,10 +1278,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)
@@ -1337,17 +1342,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 ()
@@ -1355,7 +1360,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 ()
@@ -1393,7 +1398,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.
@@ -1440,6 +1445,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)))
@@ -1452,35 +1462,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))
@@ -1490,12 +1500,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))
@@ -1554,9 +1564,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)
@@ -1565,23 +1575,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
@@ -1590,11 +1600,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.
@@ -1608,8 +1618,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 "'"))))))
@@ -1655,17 +1665,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)))
@@ -1757,57 +1767,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)))
@@ -1815,30 +1825,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,
@@ -1847,15 +1857,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)))
@@ -1870,13 +1880,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)))))
@@ -1911,27 +1921,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)
@@ -1952,16 +1962,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)))
@@ -1969,7 +1979,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))
@@ -1983,28 +1993,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
@@ -2018,32 +2028,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)))
@@ -2052,11 +2062,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)
@@ -2069,33 +2079,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))))
@@ -2117,55 +2127,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
@@ -2183,14 +2193,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)))
@@ -2198,17 +2208,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)
@@ -2222,25 +2232,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 ()
@@ -2283,43 +2293,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)
@@ -2352,12 +2362,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))))
@@ -2366,25 +2376,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:
@@ -2397,23 +2407,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))))
@@ -2421,33 +2431,33 @@ 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))
@@ -2459,11 +2469,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))
@@ -2477,39 +2487,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))
@@ -2531,7 +2541,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))))
@@ -2540,7 +2550,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))))
@@ -2555,11 +2565,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))
@@ -2574,25 +2584,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))
@@ -2602,230 +2612,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)
@@ -2854,49 +2864,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
@@ -2907,156 +2917,160 @@ 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))))))
- )
- ((and (eq (car stack-top) '||) (looking-at "\\(]\\|>>\\)[^_a-zA-Z0-9]"))
- (nth 2 (car (cdr stack))))
+ (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 (and erlang-icr-indent
+ (looking-at "\\(if\\|case\\|receive\\)[^_a-zA-Z0-9]"))
+ (+ (nth 2 stack-top) erlang-icr-indent)
+ (if (looking-at "\\(case\\|receive\\)[^_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))))
;; 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 (+ erlang-indent-level (if (not erlang-icr-indent)
+ erlang-indent-level
+ erlang-icr-indent)))))
+ (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."
@@ -3066,21 +3080,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'.
@@ -3099,51 +3113,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)
@@ -3152,20 +3166,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?"
@@ -3178,14 +3192,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
@@ -3213,18 +3227,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.
@@ -3270,22 +3284,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)
@@ -3293,19 +3307,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))
@@ -3321,35 +3335,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
@@ -3363,18 +3377,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)))
@@ -3383,7 +3397,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)))))
@@ -3398,54 +3412,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)
@@ -3464,22 +3478,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 ()
@@ -3489,12 +3503,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)))
@@ -3517,18 +3531,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)
@@ -3548,7 +3562,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)))
@@ -3569,30 +3583,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)))
@@ -3604,14 +3618,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 ()
@@ -3622,30 +3636,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)
@@ -3657,12 +3671,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 ()
@@ -3671,9 +3685,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)))))
@@ -3681,33 +3695,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.
@@ -3719,15 +3733,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 ()
@@ -3744,37 +3758,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)))
@@ -3785,11 +3799,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)))
@@ -3797,9 +3811,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)
@@ -3869,30 +3883,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)
@@ -3918,13 +3932,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)
@@ -3932,20 +3946,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)
@@ -3961,12 +3975,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)
@@ -3974,12 +3988,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)
@@ -3989,48 +4003,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)
@@ -4041,17 +4055,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)
@@ -4060,13 +4074,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.
@@ -4086,22 +4100,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)
@@ -4116,30 +4130,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)
@@ -4164,14 +4178,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)
@@ -4182,11 +4196,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)
@@ -4200,7 +4214,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 ()
@@ -4209,7 +4223,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 ()
@@ -4221,22 +4235,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))))
@@ -4247,11 +4261,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)))
@@ -4276,13 +4290,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 ()
@@ -4301,9 +4315,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:
@@ -4354,11 +4368,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)
@@ -4383,11 +4397,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)
@@ -4400,11 +4414,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'.
@@ -4423,31 +4437,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)))
@@ -4455,13 +4469,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.
@@ -4470,7 +4484,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))))
@@ -4482,9 +4496,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
@@ -4503,78 +4517,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.
+
-
@@ -4591,18 +4605,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
@@ -4629,21 +4643,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 ()
@@ -4653,23 +4667,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))
@@ -4697,13 +4711,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
@@ -4712,11 +4726,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 ()
@@ -4725,14 +4739,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 ()
@@ -4761,10 +4775,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.
;;;
@@ -4810,18 +4824,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 ()
@@ -4845,9 +4859,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
@@ -4857,22 +4871,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))))
@@ -4973,7 +4987,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))))))
@@ -5215,28 +5229,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))
@@ -5246,9 +5260,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]))))
@@ -5264,7 +5278,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)))
@@ -5338,8 +5352,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
@@ -5366,16 +5380,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))
@@ -5407,22 +5421,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))
@@ -5439,8 +5453,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 ()
@@ -5448,21 +5462,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.
@@ -5471,12 +5485,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")
@@ -5493,10 +5507,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)
@@ -5509,21 +5523,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)))
@@ -5532,17 +5546,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.
@@ -5550,15 +5564,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)
@@ -5581,18 +5595,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
@@ -5606,7 +5620,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)
@@ -5618,96 +5632,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) ".")
@@ -5753,11 +5767,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)
@@ -5783,22 +5797,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)
@@ -5835,44 +5849,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.
@@ -5884,7 +5898,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.
;;
@@ -5903,7 +5917,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)
@@ -5918,12 +5932,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)))
@@ -5936,6 +5950,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 <dan.gudmundsson@ericsson.com>
%%%-------------------------------------------------------------------
-%% 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 <dan.gudmundsson@ericsson.com>
%%%-------------------------------------------------------------------
-%% 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 b/lib/wx/api_gen/gl_gen.erl
index 54635bdd2e..7e3766a43b 100644
--- a/lib/wx/api_gen/gl_gen.erl
+++ b/lib/wx/api_gen/gl_gen.erl
@@ -354,6 +354,7 @@ handle_arg_opt({single,Opt},P=#arg{type=T}) -> P#arg{type=T#type{single=Opt}};
handle_arg_opt({base,{Opt, Sz}}, P=#arg{type=T}) -> P#arg{type=T#type{base=Opt, size=Sz}};
handle_arg_opt({base,Opt}, P=#arg{type=T}) -> P#arg{type=T#type{base=Opt}};
handle_arg_opt({c_only,Opt},P) -> P#arg{where=c, alt=Opt};
+handle_arg_opt(list_binary, P) -> P#arg{alt=list_binary};
handle_arg_opt(string, P=#arg{type=T}) -> P#arg{type=T#type{base=string}};
handle_arg_opt({string,Max,Sz}, P=#arg{type=T}) ->
P#arg{type=T#type{base=string, size={Max,Sz}}}.
@@ -588,7 +589,7 @@ lookup(Name,[_|R],Def) ->
lookup(Name,R,Def);
lookup(_,[], Def) -> Def.
-setup_idx_binary(Name,Ext,_Opts) ->
+setup_idx_binary(Name,Ext, Opts) ->
FuncName = Name ++ Ext,
Func = #func{params=Args} = get(FuncName),
Id = next_id(function),
@@ -607,8 +608,7 @@ setup_idx_binary(Name,Ext,_Opts) ->
ok;
(_) -> ok
end, Args),
-
- case setup_idx_binary(Args, []) of
+ case setup_idx_binary_1(Args, []) of
ignore ->
put(FuncName, Func#func{id=Id}),
Name++Ext;
@@ -624,30 +624,41 @@ setup_idx_binary(Name,Ext,_Opts) ->
[FuncName,Extra]
end.
-setup_idx_binary([A=#arg{in=true,type=T=#type{base=idx_binary}}|R], Acc) ->
+setup_idx_binary_1([A=#arg{in=true,type=T=#type{base=idx_binary}}|R], Acc) ->
A1 = A#arg{type=T#type{base=guard_int,size=4}},
A2 = A#arg{type=T#type{base=binary}},
Head = reverse(Acc),
- case setup_idx_binary(R, []) of
+ case setup_idx_binary_1(R, []) of
ignore ->
{bin, Head ++ [A1|R], Head ++ [A2|R]};
{bin, R1,R2} ->
{bin, Head ++ [A1|R1], Head ++ [A2|R2]}
end;
-setup_idx_binary([A=#arg{in=true,type=T=#type{single={tuple,matrix}}}|R], Acc) ->
+setup_idx_binary_1([A=#arg{in=true,type=T=#type{base=int,size=4},alt=list_binary}|R], Acc) ->
+ A1 = A#arg{type=T#type{base=guard_int}},
+ A2 = A#arg{type=T#type{base=binary}},
+ Head = reverse(Acc),
+ case setup_idx_binary_1(R, []) of
+ ignore ->
+ {bin, Head ++ [A1|R], Head ++ [A2|R]};
+ {bin, R1,R2} ->
+ {bin, Head ++ [A1|R1], Head ++ [A2|R2]}
+ end;
+
+setup_idx_binary_1([A=#arg{in=true,type=T=#type{single={tuple,matrix}}}|R], Acc) ->
A1 = A#arg{type=T#type{single={tuple, matrix12}}},
A2 = A#arg{type=T#type{single={tuple, 16}}},
Head = reverse(Acc),
- case setup_idx_binary(R, []) of
+ case setup_idx_binary_1(R, []) of
ignore ->
{matrix, Head ++ [A1|R], Head ++ [A2|R]};
{matrix, R1,R2} ->
{matrix, Head ++ [A1|R1], Head ++ [A2|R2]}
end;
-setup_idx_binary([H|R],Acc) ->
- setup_idx_binary(R,[H|Acc]);
-setup_idx_binary([],_) -> ignore.
-
+setup_idx_binary_1([H|R],Acc) ->
+ setup_idx_binary_1(R,[H|Acc]);
+setup_idx_binary_1([],_) -> ignore.
+
is_equal(F1=#func{type=T1,params=A1},F2=#func{type=T2,params=A2}) ->
Equal = is_equal_type(T1,T2) andalso is_equal_args(A1,A2),
case Equal of
diff --git a/lib/wx/api_gen/gl_gen_c.erl b/lib/wx/api_gen/gl_gen_c.erl
index c6d4f3a520..53c194a315 100644
--- a/lib/wx/api_gen/gl_gen_c.erl
+++ b/lib/wx/api_gen/gl_gen_c.erl
@@ -123,20 +123,14 @@ declare_var(A=#arg{name=N,in=false,type=#type{name=T,base=B,single={list,Sz}}})
when is_number(Sz) ->
w(" ~s ~s[~p] = {~s};~n", [T,N,Sz,args(fun zero/1,",",lists:duplicate(Sz,B))]),
A;
-declare_var(A=#arg{name=N,in=false,type=#type{name=T,base=string,size={Max,_}, single=Single}}) ->
+declare_var(A=#arg{name=N,in=false,type=#type{name=T,base=string,size={Max,_}}}) ->
case is_integer(Max) of
- true ->
+ true ->
w(" ~s ~s[~p];~n", [T,N,Max]);
false ->
- %% w(" ~s ~s[*~s];~n", [T,N,Max]),
- w(" ~s *~s;~n", [T,N]),
+ w(" ~s *~s;~n", [T,N]),
w(" ~s = (~s *) driver_alloc(sizeof(~s) * *~s);~n", [N,T,T,Max]),
- store_free(N)
- %% case Single of
- %% {list, _, _} ->
- %% w(" ~s *~s_p = ~s;~n", [T,N,N]);
- %% _ -> ok
- %% end
+ store_free(N)
end,
A;
declare_var(A=#arg{name=N,in=false,type=#type{base=binary,size={MaxSz, _}}}) ->
@@ -163,9 +157,9 @@ declare_var(A=#arg{name=N,in=false,
type=#type{name=T,base=B,by_val=false,single=true}}) ->
w(" ~s ~s[1] = {~s};~n", [T,N,zero(B)]),
A;
-declare_var(A=#arg{where=c, type=#type{name=T}, alt={size,Var}}) ->
+declare_var(A=#arg{where=c, type=#type{name=T}, alt={size,Var}}) ->
w(" ~s ~s_size = bins_sz[~p];~n", [T, Var, get(bin_count)]),
- A;
+ A;
declare_var(A=#arg{where=_}) ->
A.
@@ -194,9 +188,16 @@ decode_arg(P=#arg{where=erl},A) -> {P,A};
decode_arg(P=#arg{where=c},A) -> {P,A};
decode_arg(P=#arg{in=false},A) -> {P,A};
-decode_arg(P=#arg{name=Name,type=#type{name=Type,base=binary}},A0) ->
+decode_arg(P=#arg{name=Name,alt=Alt,type=#type{name=Type,base=binary}},A0) ->
w(" ~s *~s = (~s *) bins[~p];~n", [Type,Name,Type,next_id(bin_count)]),
- {P, A0};
+ case Alt of
+ list_binary ->
+ A = align(4, A0),
+ w(" int * ~sLen = (int *) bp; bp += 4; (void) ~sLen;~n", [Name, Name]),
+ {P, A};
+ _ ->
+ {P, A0}
+ end;
decode_arg(P=#arg{name=Name,type=#type{name=Type,base=memory}},A0) ->
w(" ~s *~s = (~s *) bins[~p];~n", [Type,Name,Type,next_id(bin_count)]),
{P, A0};
@@ -217,7 +218,7 @@ decode_arg(P=#arg{name=Name,type=#type{size=Sz,single=list,name=Type}},A0) ->
A = align(max([Sz,4]),A0),
w(" int * ~sLen = (int *) bp; bp += ~p;~n", [Name, max([4,Sz])]),
w(" ~s * ~s = (~s *) bp; ", [Type,Name,Type]),
- w(" bp += (8-((*~sLen*~p+~p)%8))%8;~n", [Name,Sz,A]),
+ w(" bp += *~sLen*~p + (8-((*~sLen*~p+~p)%8))%8;~n", [Name,Sz,Name,Sz,A]),
{P, 0};
decode_arg(P=#arg{name=Name,type=#type{size=TSz,name=Type,single={tuple,undefined}}},A0) ->
A = align(TSz,A0),
diff --git a/lib/wx/api_gen/gl_gen_erl.erl b/lib/wx/api_gen/gl_gen_erl.erl
index 1be8d775be..3ad14825dd 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", []),
@@ -492,6 +496,8 @@ doc_arg_type2(#type{base=string, single=list}) ->
"iolist()";
doc_arg_type2(T=#type{single={tuple,Sz}}) ->
"{" ++ args(fun doc_arg_type3/1, ",", lists:duplicate(Sz,T)) ++ "}";
+doc_arg_type2(#type{base=guard_int, single=list}) ->
+ "[integer()]|mem()";
doc_arg_type2(T=#type{single=list}) ->
"[" ++ doc_arg_type3(T) ++ "]";
doc_arg_type2(T=#type{single={list, _Max}}) ->
@@ -512,7 +518,9 @@ doc_arg_type3(#type{base=binary}) -> "binary()";
doc_arg_type3(#type{base=memory}) -> "mem()".
guard_test(As) ->
- Str = args(fun(#arg{name=N,type=#type{base=guard_int}}) ->
+ Str = args(fun(#arg{name=N,type=#type{base=guard_int, single=list}}) ->
+ " is_list("++erl_arg_name(N)++")";
+ (#arg{name=N,type=#type{base=guard_int}}) ->
" is_integer("++erl_arg_name(N)++")";
(_) ->
skip
@@ -522,6 +530,13 @@ guard_test(As) ->
Other -> " when " ++ Other
end.
+pre_marshal([#arg{name=N,in=true, type=#type{base=binary, single=list}=T, alt=list_binary}=A|R]) ->
+ w(" send_bin(~s),~n", [erl_arg_name(N)]),
+ w(" ~sLen = byte_size(if is_binary(~s) -> ~s; is_tuple(~s) -> element(2, ~s) end) div 4,~n",
+ [erl_arg_name(N),erl_arg_name(N), erl_arg_name(N), erl_arg_name(N), erl_arg_name(N)]),
+ Type = T#type{base=int, by_val=true, single=true, ref=undefined},
+ Arg=A#arg{name=N++"Len", where=both, type=Type},
+ [Arg|pre_marshal(R)];
pre_marshal([#arg{name=N,in=true,type=#type{base=binary}}|R]) ->
w(" send_bin(~s),~n", [erl_arg_name(N)]),
pre_marshal(R);
@@ -530,8 +545,18 @@ pre_marshal([#arg{name=N,type=#type{base=memory}}|R]) ->
pre_marshal(R);
pre_marshal([A=#arg{name=N,type=#type{base=string,single=list}}|R]) ->
%% With null terminations
- w(" ~sTemp = list_to_binary([[Str|[0]] || Str <- ~s ]),~n",
+ w(" ~sTemp = list_to_binary([[Str|[0]] || Str <- ~s ]),~n",
[erl_arg_name(N), erl_arg_name(N)]),
+ w(" ~sLen = length(~s),~n",[erl_arg_name(N), erl_arg_name(N)]),
+ [A|pre_marshal(R)];
+pre_marshal([A=#arg{name=N,type=#type{base=string,single=true,ref={pointer,1}}}|R]) ->
+ w(" ~sLen = length(~s),~n",[erl_arg_name(N), erl_arg_name(N)]),
+ [A|pre_marshal(R)];
+pre_marshal([A=#arg{name=N,type=#type{single=list}}|R]) ->
+ w(" ~sLen = length(~s),~n",[erl_arg_name(N), erl_arg_name(N)]),
+ [A|pre_marshal(R)];
+pre_marshal([A=#arg{name=N,type=#type{single={tuple_list,_}}}|R]) ->
+ w(" ~sLen = length(~s),~n",[erl_arg_name(N), erl_arg_name(N)]),
[A|pre_marshal(R)];
pre_marshal([A|R]) ->
[A|pre_marshal(R)];
@@ -583,9 +608,9 @@ marshal_arg(#type{size=BSz,name=Type,single={tuple,matrix12}},Name,A0) ->
align(BSz,16,A0,All);
marshal_arg(#type{size=Sz,name=Type,base=Base,single=list},Name,A0)
- when Base =:= float; Base =:= int ->
+ when Base =:= float; Base =:= int; Base =:= guard_int ->
KeepA = case Sz of 8 -> "0:32,"; _ -> "" end,
- Str0 = "(length("++Name++")):?GLuint,"++KeepA++"\n"
+ Str0 = Name++"Len:?GLuint,"++KeepA++"\n"
" (<< <<C:?"++Type++">> || C <- "++Name++">>)/binary",
{Str,Align} = align(max([Sz,4]),A0,Str0),
align_after(Sz,Align,0,1,Name,Str);
@@ -606,7 +631,7 @@ marshal_arg(#type{base=string,single=true,ref={pointer,1}},Name,A0) ->
marshal_arg(#type{base=string,single=list,ref={pointer,2}},Name,A0) ->
Str0 =
- "(length("++Name++")):?GLuint,"
+ Name++"Len:?GLuint,"
"(size("++Name ++ "Temp)):?GLuint,"
"(" ++ Name ++ "Temp)/binary",
{Str,A} = align(4,A0,Str0),
@@ -620,7 +645,7 @@ marshal_arg(#type{size=Sz,name=Type,single={tuple_list,TSz}},Name,A0) ->
TBin = args(fun(ElName) -> ElName ++ ":?" ++ Type end, ",", Names),
KeepA = case Sz of 8 -> "0:32,"; 4 -> "" end,
- Str0 = "(length("++Name++")):?GLuint,"++KeepA++"\n"
+ Str0 = Name++"Len:?GLuint,"++KeepA++"\n"
" (<< <<"++TBin++">> || {"++TTup++"} <- "++Name++">>)/binary",
align(Sz,A0,Str0);
@@ -656,19 +681,19 @@ align(8,_,7,Str) -> {"0:8," ++Str, 0}.
align_after(8,0,_Add,_Multiplier,_Name,Str) -> {Str,0};
align_after(4,0,Add,Mult,Name,Str) ->
Extra = extra_align(Add,Mult),
- Align = ",0:(((length("++Name++")"++Extra++") rem 2)*32)",
+ Align = ",0:((("++Name++"Len"++Extra++") rem 2)*32)",
{Str ++ Align,0};
align_after(4,4,Add,Mult,Name,Str) ->
Extra = extra_align(Add,Mult),
- Align = ",0:(((1+length("++Name++")"++Extra++") rem 2)*32)",
+ Align = ",0:(((1+"++Name++"Len"++Extra++") rem 2)*32)",
{Str ++ Align,0};
align_after(2,A,Add,Mult,Name,Str) when (A rem 2) =:= 0 ->
Extra = extra_align(A+Add*2,Mult),
- Align = ",0:((8-((length("++Name++")*2"++Extra++") rem 8)) rem 8)",
+ Align = ",0:((8-(("++Name++"Len*2"++Extra++") rem 8)) rem 8)",
{Str ++ Align,0};
align_after(1,A,Add,Mult,Name,Str) ->
Extra = extra_align(A+Add,Mult),
- Align = ",0:((8-((length("++Name++")"++Extra++") rem 8)) rem 8)",
+ Align = ",0:((8-(("++Name++"Len"++Extra++") rem 8)) rem 8)",
{Str ++ Align,0};
align_after(Sz,A,Add,Mult,Name,Str) ->
io:format("~p ~p with ~p ~p ~s~n, ~p", [Sz,A,Add,Mult,Name,Str]),
diff --git a/lib/wx/api_gen/glapi.conf b/lib/wx/api_gen/glapi.conf
index 59fa8f7727..57f30a3f7e 100644
--- a/lib/wx/api_gen/glapi.conf
+++ b/lib/wx/api_gen/glapi.conf
@@ -181,9 +181,9 @@
{"glLoadTransposeMatrix", {"m", {single,{tuple,matrix}}}}.
{"glMultTransposeMatrix", {"m",{single,{tuple,matrix}}}}.
-{"glMultiDrawArrays", [{"first", [in,{single,list}]},
- {"count", [in,{single,list}]},
- {"primcount", {c_only, {length,"first"}}}]}.
+{"glMultiDrawArrays", [{"first", [in,{single,list}, list_binary]},
+ {"count", [in,{single,list}, list_binary]},
+ {"primcount", {c_only, {length,"count"}}}]}.
{"glGenQueries", {"ids", {single,{list, "n", "n"}}}}.
{"glGetQueryiv", {"params", {single, true}}}.
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_cpp.erl b/lib/wx/api_gen/wx_gen_cpp.erl
index 0a0b1f9209..d4b6db8153 100644
--- a/lib/wx/api_gen/wx_gen_cpp.erl
+++ b/lib/wx/api_gen/wx_gen_cpp.erl
@@ -1316,7 +1316,8 @@ encode_events(Evs) ->
w(" } else {~n"),
w(" send_res = rt.send();~n"),
w(" if(cb->skip) event->Skip();~n"),
- w(" if(app->recurse_level < 1) {~n"),
+ #class{id=MouseId} = lists:keyfind("wxMouseEvent", #class.name, Evs),
+ w(" if(app->recurse_level < 1 && Etype->cID != ~p) {~n", [MouseId]),
w(" app->recurse_level++;~n"),
w(" app->dispatch_cmds();~n"),
w(" app->recurse_level--;~n"),
diff --git a/lib/wx/api_gen/wxapi.conf b/lib/wx/api_gen/wxapi.conf
index 4300ffe734..a0dfa61dd1 100644
--- a/lib/wx/api_gen/wxapi.conf
+++ b/lib/wx/api_gen/wxapi.conf
@@ -155,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,
diff --git a/lib/wx/c_src/gen/gl_funcs.cpp b/lib/wx/c_src/gen/gl_funcs.cpp
index 4dd3ad44ef..bc8d5bbdca 100644
--- a/lib/wx/c_src/gen/gl_funcs.cpp
+++ b/lib/wx/c_src/gen/gl_funcs.cpp
@@ -815,7 +815,7 @@ case 5107: { // glCallList
}; break;
case 5108: { // glCallLists
int * listsLen = (int *) bp; bp += 4;
- GLuint * lists = (GLuint *) bp; bp += (8-((*listsLen*4+4)%8))%8;
+ GLuint * lists = (GLuint *) bp; bp += *listsLen*4 + (8-((*listsLen*4+4)%8))%8;
weglCallLists(*listsLen,GL_UNSIGNED_INT,lists);
}; break;
case 5109: { // glListBase
@@ -1866,7 +1866,7 @@ case 5271: { // glGenTextures
}; break;
case 5272: { // glDeleteTextures
int * texturesLen = (int *) bp; bp += 4;
- GLuint * textures = (GLuint *) bp; bp += (8-((*texturesLen*4+4)%8))%8;
+ GLuint * textures = (GLuint *) bp; bp += *texturesLen*4 + (8-((*texturesLen*4+4)%8))%8;
weglDeleteTextures(*texturesLen,textures);
}; break;
case 5273: { // glBindTexture
@@ -1876,14 +1876,14 @@ case 5273: { // glBindTexture
}; break;
case 5274: { // glPrioritizeTextures
int * texturesLen = (int *) bp; bp += 4;
- GLuint * textures = (GLuint *) bp; bp += (8-((*texturesLen*4+4)%8))%8;
+ GLuint * textures = (GLuint *) bp; bp += *texturesLen*4 + (8-((*texturesLen*4+4)%8))%8;
int * prioritiesLen = (int *) bp; bp += 4;
- GLclampf * priorities = (GLclampf *) bp; bp += (8-((*prioritiesLen*4+4)%8))%8;
+ GLclampf * priorities = (GLclampf *) bp; bp += *prioritiesLen*4 + (8-((*prioritiesLen*4+4)%8))%8;
weglPrioritizeTextures(*texturesLen,textures,priorities);
}; break;
case 5275: { // glAreTexturesResident
int * texturesLen = (int *) bp; bp += 4;
- GLuint * textures = (GLuint *) bp; bp += (8-((*texturesLen*4+4)%8))%8;
+ GLuint * textures = (GLuint *) bp; bp += *texturesLen*4 + (8-((*texturesLen*4+4)%8))%8;
GLboolean *residences;
residences = (GLboolean *) driver_alloc(sizeof(GLboolean) * *texturesLen);
GLboolean result = weglAreTexturesResident(*texturesLen,textures,residences);
@@ -2921,132 +2921,140 @@ case 5394: { // glBlendFuncSeparate
case 5395: { // glMultiDrawArrays
GLenum *mode = (GLenum *) bp; bp += 4;
int * firstLen = (int *) bp; bp += 4;
- GLint * first = (GLint *) bp; bp += (8-((*firstLen*4+0)%8))%8;
+ GLint * first = (GLint *) bp; bp += *firstLen*4 + (8-((*firstLen*4+0)%8))%8;
int * countLen = (int *) bp; bp += 4;
- GLsizei * count = (GLsizei *) bp; bp += (8-((*countLen*4+4)%8))%8;
- weglMultiDrawArrays(*mode,first,count,*firstLen);
+ GLsizei * count = (GLsizei *) bp; bp += *countLen*4 + (8-((*countLen*4+4)%8))%8;
+ weglMultiDrawArrays(*mode,first,count,*countLen);
}; break;
-case 5396: { // glPointParameterf
+case 5396: { // glMultiDrawArrays
+ GLenum *mode = (GLenum *) bp; bp += 4;
+ GLint *first = (GLint *) bins[0];
+ int * firstLen = (int *) bp; bp += 4; (void) firstLen;
+ GLsizei *count = (GLsizei *) bins[1];
+ int * countLen = (int *) bp; bp += 4; (void) countLen;
+ weglMultiDrawArrays(*mode,first,count,*countLen);
+}; break;
+case 5397: { // glPointParameterf
GLenum *pname = (GLenum *) bp; bp += 4;
GLfloat *param = (GLfloat *) bp; bp += 4;
weglPointParameterf(*pname,*param);
}; break;
-case 5397: { // glPointParameterfv
+case 5398: { // glPointParameterfv
GLenum *pname = (GLenum *) bp; bp += 4;
int *paramsLen = (int *) bp; bp += 4;
GLfloat *params = (GLfloat *) bp; bp += *paramsLen*4+((*paramsLen)+0)%2*4;
weglPointParameterfv(*pname,params);
}; break;
-case 5398: { // glPointParameteri
+case 5399: { // glPointParameteri
GLenum *pname = (GLenum *) bp; bp += 4;
GLint *param = (GLint *) bp; bp += 4;
weglPointParameteri(*pname,*param);
}; break;
-case 5399: { // glPointParameteriv
+case 5400: { // glPointParameteriv
GLenum *pname = (GLenum *) bp; bp += 4;
int *paramsLen = (int *) bp; bp += 4;
GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+0)%2*4;
weglPointParameteriv(*pname,params);
}; break;
-case 5400: { // glFogCoordfv
+case 5401: { // glFogCoordfv
GLfloat *coord = (GLfloat *) bp; bp += 4;
weglFogCoordfv(coord);
}; break;
-case 5401: { // glFogCoorddv
+case 5402: { // glFogCoorddv
GLdouble *coord = (GLdouble *) bp; bp += 8;
weglFogCoorddv(coord);
}; break;
-case 5402: { // glFogCoordPointer
+case 5403: { // glFogCoordPointer
GLenum *type = (GLenum *) bp; bp += 4;
GLsizei *stride = (GLsizei *) bp; bp += 4;
GLvoid *pointer = (GLvoid *) (ErlDrvSInt) * (int *) bp; bp += 4;
weglFogCoordPointer(*type,*stride,pointer);
}; break;
-case 5403: { // glFogCoordPointer
+case 5404: { // glFogCoordPointer
GLenum *type = (GLenum *) bp; bp += 4;
GLsizei *stride = (GLsizei *) bp; bp += 4;
GLvoid *pointer = (GLvoid *) bins[0];
weglFogCoordPointer(*type,*stride,pointer);
}; break;
-case 5404: { // glSecondaryColor3bv
+case 5405: { // glSecondaryColor3bv
GLbyte *v = (GLbyte *) bp; bp += 1;
weglSecondaryColor3bv(v);
}; break;
-case 5405: { // glSecondaryColor3dv
+case 5406: { // glSecondaryColor3dv
GLdouble *v = (GLdouble *) bp; bp += 8;
weglSecondaryColor3dv(v);
}; break;
-case 5406: { // glSecondaryColor3fv
+case 5407: { // glSecondaryColor3fv
GLfloat *v = (GLfloat *) bp; bp += 4;
weglSecondaryColor3fv(v);
}; break;
-case 5407: { // glSecondaryColor3iv
+case 5408: { // glSecondaryColor3iv
GLint *v = (GLint *) bp; bp += 4;
weglSecondaryColor3iv(v);
}; break;
-case 5408: { // glSecondaryColor3sv
+case 5409: { // glSecondaryColor3sv
GLshort *v = (GLshort *) bp; bp += 2;
weglSecondaryColor3sv(v);
}; break;
-case 5409: { // glSecondaryColor3ubv
+case 5410: { // glSecondaryColor3ubv
GLubyte *v = (GLubyte *) bp; bp += 1;
weglSecondaryColor3ubv(v);
}; break;
-case 5410: { // glSecondaryColor3uiv
+case 5411: { // glSecondaryColor3uiv
GLuint *v = (GLuint *) bp; bp += 4;
weglSecondaryColor3uiv(v);
}; break;
-case 5411: { // glSecondaryColor3usv
+case 5412: { // glSecondaryColor3usv
GLushort *v = (GLushort *) bp; bp += 2;
weglSecondaryColor3usv(v);
}; break;
-case 5412: { // glSecondaryColorPointer
+case 5413: { // glSecondaryColorPointer
GLint *size = (GLint *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
GLsizei *stride = (GLsizei *) bp; bp += 4;
GLvoid *pointer = (GLvoid *) (ErlDrvSInt) * (int *) bp; bp += 4;
weglSecondaryColorPointer(*size,*type,*stride,pointer);
}; break;
-case 5413: { // glSecondaryColorPointer
+case 5414: { // glSecondaryColorPointer
GLint *size = (GLint *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
GLsizei *stride = (GLsizei *) bp; bp += 4;
GLvoid *pointer = (GLvoid *) bins[0];
weglSecondaryColorPointer(*size,*type,*stride,pointer);
}; break;
-case 5414: { // glWindowPos2dv
+case 5415: { // glWindowPos2dv
GLdouble *v = (GLdouble *) bp; bp += 8;
weglWindowPos2dv(v);
}; break;
-case 5415: { // glWindowPos2fv
+case 5416: { // glWindowPos2fv
GLfloat *v = (GLfloat *) bp; bp += 4;
weglWindowPos2fv(v);
}; break;
-case 5416: { // glWindowPos2iv
+case 5417: { // glWindowPos2iv
GLint *v = (GLint *) bp; bp += 4;
weglWindowPos2iv(v);
}; break;
-case 5417: { // glWindowPos2sv
+case 5418: { // glWindowPos2sv
GLshort *v = (GLshort *) bp; bp += 2;
weglWindowPos2sv(v);
}; break;
-case 5418: { // glWindowPos3dv
+case 5419: { // glWindowPos3dv
GLdouble *v = (GLdouble *) bp; bp += 8;
weglWindowPos3dv(v);
}; break;
-case 5419: { // glWindowPos3fv
+case 5420: { // glWindowPos3fv
GLfloat *v = (GLfloat *) bp; bp += 4;
weglWindowPos3fv(v);
}; break;
-case 5420: { // glWindowPos3iv
+case 5421: { // glWindowPos3iv
GLint *v = (GLint *) bp; bp += 4;
weglWindowPos3iv(v);
}; break;
-case 5421: { // glWindowPos3sv
+case 5422: { // glWindowPos3sv
GLshort *v = (GLshort *) bp; bp += 2;
weglWindowPos3sv(v);
}; break;
-case 5422: { // glGenQueries
+case 5423: { // glGenQueries
GLsizei *n = (GLsizei *) bp; bp += 4;
GLuint *ids;
ids = (GLuint *) driver_alloc(sizeof(GLuint) * *n);
@@ -3062,12 +3070,12 @@ case 5422: { // glGenQueries
driver_free(rt);
driver_free(ids);
}; break;
-case 5423: { // glDeleteQueries
+case 5424: { // glDeleteQueries
int * idsLen = (int *) bp; bp += 4;
- GLuint * ids = (GLuint *) bp; bp += (8-((*idsLen*4+4)%8))%8;
+ GLuint * ids = (GLuint *) bp; bp += *idsLen*4 + (8-((*idsLen*4+4)%8))%8;
weglDeleteQueries(*idsLen,ids);
}; break;
-case 5424: { // glIsQuery
+case 5425: { // glIsQuery
GLuint *id = (GLuint *) bp; bp += 4;
GLboolean result = weglIsQuery(*id);
int AP = 0; ErlDrvTermData rt[6];
@@ -3076,16 +3084,16 @@ case 5424: { // glIsQuery
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5425: { // glBeginQuery
+case 5426: { // glBeginQuery
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *id = (GLuint *) bp; bp += 4;
weglBeginQuery(*target,*id);
}; break;
-case 5426: { // glEndQuery
+case 5427: { // glEndQuery
GLenum *target = (GLenum *) bp; bp += 4;
weglEndQuery(*target);
}; break;
-case 5427: { // glGetQueryiv
+case 5428: { // glGetQueryiv
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[1] = {0};
@@ -3096,7 +3104,7 @@ case 5427: { // glGetQueryiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5428: { // glGetQueryObjectiv
+case 5429: { // glGetQueryObjectiv
GLuint *id = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[1] = {0};
@@ -3107,7 +3115,7 @@ case 5428: { // glGetQueryObjectiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5429: { // glGetQueryObjectuiv
+case 5430: { // glGetQueryObjectuiv
GLuint *id = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLuint params[1] = {0};
@@ -3118,17 +3126,17 @@ case 5429: { // glGetQueryObjectuiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5430: { // glBindBuffer
+case 5431: { // glBindBuffer
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *buffer = (GLuint *) bp; bp += 4;
weglBindBuffer(*target,*buffer);
}; break;
-case 5431: { // glDeleteBuffers
+case 5432: { // glDeleteBuffers
int * buffersLen = (int *) bp; bp += 4;
- GLuint * buffers = (GLuint *) bp; bp += (8-((*buffersLen*4+4)%8))%8;
+ GLuint * buffers = (GLuint *) bp; bp += *buffersLen*4 + (8-((*buffersLen*4+4)%8))%8;
weglDeleteBuffers(*buffersLen,buffers);
}; break;
-case 5432: { // glGenBuffers
+case 5433: { // glGenBuffers
GLsizei *n = (GLsizei *) bp; bp += 4;
GLuint *buffers;
buffers = (GLuint *) driver_alloc(sizeof(GLuint) * *n);
@@ -3144,7 +3152,7 @@ case 5432: { // glGenBuffers
driver_free(rt);
driver_free(buffers);
}; break;
-case 5433: { // glIsBuffer
+case 5434: { // glIsBuffer
GLuint *buffer = (GLuint *) bp; bp += 4;
GLboolean result = weglIsBuffer(*buffer);
int AP = 0; ErlDrvTermData rt[6];
@@ -3153,7 +3161,7 @@ case 5433: { // glIsBuffer
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5434: { // glBufferData
+case 5435: { // glBufferData
GLenum *target = (GLenum *) bp; bp += 4;
bp += 4;
GLsizeiptr size = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8;
@@ -3161,7 +3169,7 @@ case 5434: { // glBufferData
GLenum *usage = (GLenum *) bp; bp += 4;
weglBufferData(*target,size,data,*usage);
}; break;
-case 5435: { // glBufferData
+case 5436: { // glBufferData
GLenum *target = (GLenum *) bp; bp += 4;
bp += 4;
GLsizeiptr size = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8;
@@ -3169,7 +3177,7 @@ case 5435: { // glBufferData
GLenum *usage = (GLenum *) bp; bp += 4;
weglBufferData(*target,size,data,*usage);
}; break;
-case 5436: { // glBufferSubData
+case 5437: { // glBufferSubData
GLenum *target = (GLenum *) bp; bp += 4;
bp += 4;
GLintptr offset = (GLintptr) * (GLuint64EXT *) bp; bp += 8;
@@ -3177,7 +3185,7 @@ case 5436: { // glBufferSubData
GLvoid *data = (GLvoid *) (ErlDrvSInt) * (int *) bp; bp += 4;
weglBufferSubData(*target,offset,size,data);
}; break;
-case 5437: { // glBufferSubData
+case 5438: { // glBufferSubData
GLenum *target = (GLenum *) bp; bp += 4;
bp += 4;
GLintptr offset = (GLintptr) * (GLuint64EXT *) bp; bp += 8;
@@ -3185,7 +3193,7 @@ case 5437: { // glBufferSubData
GLvoid *data = (GLvoid *) bins[0];
weglBufferSubData(*target,offset,size,data);
}; break;
-case 5438: { // glGetBufferSubData
+case 5439: { // glGetBufferSubData
GLenum *target = (GLenum *) bp; bp += 4;
bp += 4;
GLintptr offset = (GLintptr) * (GLuint64EXT *) bp; bp += 8;
@@ -3198,7 +3206,7 @@ case 5438: { // glGetBufferSubData
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5439: { // glGetBufferParameteriv
+case 5440: { // glGetBufferParameteriv
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[1] = {0};
@@ -3209,52 +3217,52 @@ case 5439: { // glGetBufferParameteriv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5440: { // glBlendEquationSeparate
+case 5441: { // glBlendEquationSeparate
GLenum *modeRGB = (GLenum *) bp; bp += 4;
GLenum *modeAlpha = (GLenum *) bp; bp += 4;
weglBlendEquationSeparate(*modeRGB,*modeAlpha);
}; break;
-case 5441: { // glDrawBuffers
+case 5442: { // glDrawBuffers
int * bufsLen = (int *) bp; bp += 4;
- GLenum * bufs = (GLenum *) bp; bp += (8-((*bufsLen*4+4)%8))%8;
+ GLenum * bufs = (GLenum *) bp; bp += *bufsLen*4 + (8-((*bufsLen*4+4)%8))%8;
weglDrawBuffers(*bufsLen,bufs);
}; break;
-case 5442: { // glStencilOpSeparate
+case 5443: { // glStencilOpSeparate
GLenum *face = (GLenum *) bp; bp += 4;
GLenum *sfail = (GLenum *) bp; bp += 4;
GLenum *dpfail = (GLenum *) bp; bp += 4;
GLenum *dppass = (GLenum *) bp; bp += 4;
weglStencilOpSeparate(*face,*sfail,*dpfail,*dppass);
}; break;
-case 5443: { // glStencilFuncSeparate
+case 5444: { // glStencilFuncSeparate
GLenum *face = (GLenum *) bp; bp += 4;
GLenum *func = (GLenum *) bp; bp += 4;
GLint *ref = (GLint *) bp; bp += 4;
GLuint *mask = (GLuint *) bp; bp += 4;
weglStencilFuncSeparate(*face,*func,*ref,*mask);
}; break;
-case 5444: { // glStencilMaskSeparate
+case 5445: { // glStencilMaskSeparate
GLenum *face = (GLenum *) bp; bp += 4;
GLuint *mask = (GLuint *) bp; bp += 4;
weglStencilMaskSeparate(*face,*mask);
}; break;
-case 5445: { // glAttachShader
+case 5446: { // glAttachShader
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *shader = (GLuint *) bp; bp += 4;
weglAttachShader(*program,*shader);
}; break;
-case 5446: { // glBindAttribLocation
+case 5447: { // glBindAttribLocation
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+0)%8))%8);
weglBindAttribLocation(*program,*index,name);
}; break;
-case 5447: { // glCompileShader
+case 5448: { // glCompileShader
GLuint *shader = (GLuint *) bp; bp += 4;
weglCompileShader(*shader);
}; break;
-case 5448: { // glCreateProgram
+case 5449: { // glCreateProgram
GLuint result = weglCreateProgram();
int AP = 0; ErlDrvTermData rt[6];
rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_egl_result_");
@@ -3262,7 +3270,7 @@ case 5448: { // glCreateProgram
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5449: { // glCreateShader
+case 5450: { // glCreateShader
GLenum *type = (GLenum *) bp; bp += 4;
GLuint result = weglCreateShader(*type);
int AP = 0; ErlDrvTermData rt[6];
@@ -3271,28 +3279,28 @@ case 5449: { // glCreateShader
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5450: { // glDeleteProgram
+case 5451: { // glDeleteProgram
GLuint *program = (GLuint *) bp; bp += 4;
weglDeleteProgram(*program);
}; break;
-case 5451: { // glDeleteShader
+case 5452: { // glDeleteShader
GLuint *shader = (GLuint *) bp; bp += 4;
weglDeleteShader(*shader);
}; break;
-case 5452: { // glDetachShader
+case 5453: { // glDetachShader
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *shader = (GLuint *) bp; bp += 4;
weglDetachShader(*program,*shader);
}; break;
-case 5453: { // glDisableVertexAttribArray
+case 5454: { // glDisableVertexAttribArray
GLuint *index = (GLuint *) bp; bp += 4;
weglDisableVertexAttribArray(*index);
}; break;
-case 5454: { // glEnableVertexAttribArray
+case 5455: { // glEnableVertexAttribArray
GLuint *index = (GLuint *) bp; bp += 4;
weglEnableVertexAttribArray(*index);
}; break;
-case 5455: { // glGetActiveAttrib
+case 5456: { // glGetActiveAttrib
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
@@ -3312,7 +3320,7 @@ case 5455: { // glGetActiveAttrib
driver_send_term(port,caller,rt,AP);
driver_free(name);
}; break;
-case 5456: { // glGetActiveUniform
+case 5457: { // glGetActiveUniform
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
@@ -3332,7 +3340,7 @@ case 5456: { // glGetActiveUniform
driver_send_term(port,caller,rt,AP);
driver_free(name);
}; break;
-case 5457: { // glGetAttachedShaders
+case 5458: { // glGetAttachedShaders
GLuint *program = (GLuint *) bp; bp += 4;
GLsizei *maxCount = (GLsizei *) bp; bp += 4;
GLsizei count[1] = {0};
@@ -3350,7 +3358,7 @@ case 5457: { // glGetAttachedShaders
driver_free(rt);
driver_free(obj);
}; break;
-case 5458: { // glGetAttribLocation
+case 5459: { // glGetAttribLocation
GLuint *program = (GLuint *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+4)%8))%8);
@@ -3361,7 +3369,7 @@ case 5458: { // glGetAttribLocation
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5459: { // glGetProgramiv
+case 5460: { // glGetProgramiv
GLuint *program = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[1] = {0};
@@ -3372,7 +3380,7 @@ case 5459: { // glGetProgramiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5460: { // glGetProgramInfoLog
+case 5461: { // glGetProgramInfoLog
GLuint *program = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
GLsizei length[1] = {0};
@@ -3386,7 +3394,7 @@ case 5460: { // glGetProgramInfoLog
driver_send_term(port,caller,rt,AP);
driver_free(infoLog);
}; break;
-case 5461: { // glGetShaderiv
+case 5462: { // glGetShaderiv
GLuint *shader = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[1] = {0};
@@ -3397,7 +3405,7 @@ case 5461: { // glGetShaderiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5462: { // glGetShaderInfoLog
+case 5463: { // glGetShaderInfoLog
GLuint *shader = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
GLsizei length[1] = {0};
@@ -3411,7 +3419,7 @@ case 5462: { // glGetShaderInfoLog
driver_send_term(port,caller,rt,AP);
driver_free(infoLog);
}; break;
-case 5463: { // glGetShaderSource
+case 5464: { // glGetShaderSource
GLuint *shader = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
GLsizei length[1] = {0};
@@ -3425,7 +3433,7 @@ case 5463: { // glGetShaderSource
driver_send_term(port,caller,rt,AP);
driver_free(source);
}; break;
-case 5464: { // glGetUniformLocation
+case 5465: { // glGetUniformLocation
GLuint *program = (GLuint *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+4)%8))%8);
@@ -3436,7 +3444,7 @@ case 5464: { // glGetUniformLocation
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5465: { // glGetUniformfv
+case 5466: { // glGetUniformfv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLfloat params[16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
@@ -3465,7 +3473,7 @@ case 5465: { // glGetUniformfv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5466: { // glGetUniformiv
+case 5467: { // glGetUniformiv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLint params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@@ -3493,7 +3501,7 @@ case 5466: { // glGetUniformiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5467: { // glGetVertexAttribdv
+case 5468: { // glGetVertexAttribdv
GLuint *index = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLdouble params[4] = {0.0,0.0,0.0,0.0};
@@ -3509,7 +3517,7 @@ case 5467: { // glGetVertexAttribdv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5468: { // glGetVertexAttribfv
+case 5469: { // glGetVertexAttribfv
GLuint *index = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLfloat params[4] = {0.0,0.0,0.0,0.0};
@@ -3526,7 +3534,7 @@ case 5468: { // glGetVertexAttribfv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5469: { // glGetVertexAttribiv
+case 5470: { // glGetVertexAttribiv
GLuint *index = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[4] = {0,0,0,0};
@@ -3542,7 +3550,7 @@ case 5469: { // glGetVertexAttribiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5470: { // glIsProgram
+case 5471: { // glIsProgram
GLuint *program = (GLuint *) bp; bp += 4;
GLboolean result = weglIsProgram(*program);
int AP = 0; ErlDrvTermData rt[6];
@@ -3551,7 +3559,7 @@ case 5470: { // glIsProgram
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5471: { // glIsShader
+case 5472: { // glIsShader
GLuint *shader = (GLuint *) bp; bp += 4;
GLboolean result = weglIsShader(*shader);
int AP = 0; ErlDrvTermData rt[6];
@@ -3560,11 +3568,11 @@ case 5471: { // glIsShader
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5472: { // glLinkProgram
+case 5473: { // glLinkProgram
GLuint *program = (GLuint *) bp; bp += 4;
weglLinkProgram(*program);
}; break;
-case 5473: { // glShaderSource
+case 5474: { // glShaderSource
GLuint *shader = (GLuint *) bp; bp += 4;
int * stringLen = (int *) bp; bp += 4;
int * stringTotSize = (int *) bp; bp += 4;
@@ -3576,29 +3584,29 @@ case 5473: { // glShaderSource
weglShaderSource(*shader,*stringLen,(const GLchar **) string,NULL);
driver_free(string);
}; break;
-case 5474: { // glUseProgram
+case 5475: { // glUseProgram
GLuint *program = (GLuint *) bp; bp += 4;
weglUseProgram(*program);
}; break;
-case 5475: { // glUniform1f
+case 5476: { // glUniform1f
GLint *location = (GLint *) bp; bp += 4;
GLfloat *v0 = (GLfloat *) bp; bp += 4;
weglUniform1f(*location,*v0);
}; break;
-case 5476: { // glUniform2f
+case 5477: { // glUniform2f
GLint *location = (GLint *) bp; bp += 4;
GLfloat *v0 = (GLfloat *) bp; bp += 4;
GLfloat *v1 = (GLfloat *) bp; bp += 4;
weglUniform2f(*location,*v0,*v1);
}; break;
-case 5477: { // glUniform3f
+case 5478: { // glUniform3f
GLint *location = (GLint *) bp; bp += 4;
GLfloat *v0 = (GLfloat *) bp; bp += 4;
GLfloat *v1 = (GLfloat *) bp; bp += 4;
GLfloat *v2 = (GLfloat *) bp; bp += 4;
weglUniform3f(*location,*v0,*v1,*v2);
}; break;
-case 5478: { // glUniform4f
+case 5479: { // glUniform4f
GLint *location = (GLint *) bp; bp += 4;
GLfloat *v0 = (GLfloat *) bp; bp += 4;
GLfloat *v1 = (GLfloat *) bp; bp += 4;
@@ -3606,25 +3614,25 @@ case 5478: { // glUniform4f
GLfloat *v3 = (GLfloat *) bp; bp += 4;
weglUniform4f(*location,*v0,*v1,*v2,*v3);
}; break;
-case 5479: { // glUniform1i
+case 5480: { // glUniform1i
GLint *location = (GLint *) bp; bp += 4;
GLint *v0 = (GLint *) bp; bp += 4;
weglUniform1i(*location,*v0);
}; break;
-case 5480: { // glUniform2i
+case 5481: { // glUniform2i
GLint *location = (GLint *) bp; bp += 4;
GLint *v0 = (GLint *) bp; bp += 4;
GLint *v1 = (GLint *) bp; bp += 4;
weglUniform2i(*location,*v0,*v1);
}; break;
-case 5481: { // glUniform3i
+case 5482: { // glUniform3i
GLint *location = (GLint *) bp; bp += 4;
GLint *v0 = (GLint *) bp; bp += 4;
GLint *v1 = (GLint *) bp; bp += 4;
GLint *v2 = (GLint *) bp; bp += 4;
weglUniform3i(*location,*v0,*v1,*v2);
}; break;
-case 5482: { // glUniform4i
+case 5483: { // glUniform4i
GLint *location = (GLint *) bp; bp += 4;
GLint *v0 = (GLint *) bp; bp += 4;
GLint *v1 = (GLint *) bp; bp += 4;
@@ -3632,55 +3640,55 @@ case 5482: { // glUniform4i
GLint *v3 = (GLint *) bp; bp += 4;
weglUniform4i(*location,*v0,*v1,*v2,*v3);
}; break;
-case 5483: { // glUniform1fv
+case 5484: { // glUniform1fv
GLint *location = (GLint *) bp; bp += 4;
int * valueLen = (int *) bp; bp += 4;
- GLfloat * value = (GLfloat *) bp; bp += (8-((*valueLen*4+0)%8))%8;
+ GLfloat * value = (GLfloat *) bp; bp += *valueLen*4 + (8-((*valueLen*4+0)%8))%8;
weglUniform1fv(*location,*valueLen,value);
}; break;
-case 5484: { // glUniform2fv
+case 5485: { // glUniform2fv
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLfloat * value = (GLfloat *) bp; bp += *valueLen*8;
weglUniform2fv(*location,*valueLen,value);
}; break;
-case 5485: { // glUniform3fv
+case 5486: { // glUniform3fv
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLfloat * value = (GLfloat *) bp; bp += *valueLen*12;
weglUniform3fv(*location,*valueLen,value);
}; break;
-case 5486: { // glUniform4fv
+case 5487: { // glUniform4fv
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLfloat * value = (GLfloat *) bp; bp += *valueLen*16;
weglUniform4fv(*location,*valueLen,value);
}; break;
-case 5487: { // glUniform1iv
+case 5488: { // glUniform1iv
GLint *location = (GLint *) bp; bp += 4;
int * valueLen = (int *) bp; bp += 4;
- GLint * value = (GLint *) bp; bp += (8-((*valueLen*4+0)%8))%8;
+ GLint * value = (GLint *) bp; bp += *valueLen*4 + (8-((*valueLen*4+0)%8))%8;
weglUniform1iv(*location,*valueLen,value);
}; break;
-case 5488: { // glUniform2iv
+case 5489: { // glUniform2iv
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLint * value = (GLint *) bp; bp += *valueLen*8;
weglUniform2iv(*location,*valueLen,value);
}; break;
-case 5489: { // glUniform3iv
+case 5490: { // glUniform3iv
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLint * value = (GLint *) bp; bp += *valueLen*12;
weglUniform3iv(*location,*valueLen,value);
}; break;
-case 5490: { // glUniform4iv
+case 5491: { // glUniform4iv
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLint * value = (GLint *) bp; bp += *valueLen*16;
weglUniform4iv(*location,*valueLen,value);
}; break;
-case 5491: { // glUniformMatrix2fv
+case 5492: { // glUniformMatrix2fv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -3688,7 +3696,7 @@ case 5491: { // glUniformMatrix2fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*16;
weglUniformMatrix2fv(*location,*valueLen,*transpose,value);
}; break;
-case 5492: { // glUniformMatrix3fv
+case 5493: { // glUniformMatrix3fv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -3696,7 +3704,7 @@ case 5492: { // glUniformMatrix3fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*36;
weglUniformMatrix3fv(*location,*valueLen,*transpose,value);
}; break;
-case 5493: { // glUniformMatrix4fv
+case 5494: { // glUniformMatrix4fv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -3704,130 +3712,130 @@ case 5493: { // glUniformMatrix4fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*64;
weglUniformMatrix4fv(*location,*valueLen,*transpose,value);
}; break;
-case 5494: { // glValidateProgram
+case 5495: { // glValidateProgram
GLuint *program = (GLuint *) bp; bp += 4;
weglValidateProgram(*program);
}; break;
-case 5495: { // glVertexAttrib1dv
+case 5496: { // glVertexAttrib1dv
GLuint *index = (GLuint *) bp; bp += 4;
bp += 4;
GLdouble *v = (GLdouble *) bp; bp += 8;
weglVertexAttrib1dv(*index,v);
}; break;
-case 5496: { // glVertexAttrib1fv
+case 5497: { // glVertexAttrib1fv
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat *v = (GLfloat *) bp; bp += 4;
weglVertexAttrib1fv(*index,v);
}; break;
-case 5497: { // glVertexAttrib1sv
+case 5498: { // glVertexAttrib1sv
GLuint *index = (GLuint *) bp; bp += 4;
GLshort *v = (GLshort *) bp; bp += 2;
weglVertexAttrib1sv(*index,v);
}; break;
-case 5498: { // glVertexAttrib2dv
+case 5499: { // glVertexAttrib2dv
GLuint *index = (GLuint *) bp; bp += 4;
bp += 4;
GLdouble *v = (GLdouble *) bp; bp += 8;
weglVertexAttrib2dv(*index,v);
}; break;
-case 5499: { // glVertexAttrib2fv
+case 5500: { // glVertexAttrib2fv
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat *v = (GLfloat *) bp; bp += 4;
weglVertexAttrib2fv(*index,v);
}; break;
-case 5500: { // glVertexAttrib2sv
+case 5501: { // glVertexAttrib2sv
GLuint *index = (GLuint *) bp; bp += 4;
GLshort *v = (GLshort *) bp; bp += 2;
weglVertexAttrib2sv(*index,v);
}; break;
-case 5501: { // glVertexAttrib3dv
+case 5502: { // glVertexAttrib3dv
GLuint *index = (GLuint *) bp; bp += 4;
bp += 4;
GLdouble *v = (GLdouble *) bp; bp += 8;
weglVertexAttrib3dv(*index,v);
}; break;
-case 5502: { // glVertexAttrib3fv
+case 5503: { // glVertexAttrib3fv
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat *v = (GLfloat *) bp; bp += 4;
weglVertexAttrib3fv(*index,v);
}; break;
-case 5503: { // glVertexAttrib3sv
+case 5504: { // glVertexAttrib3sv
GLuint *index = (GLuint *) bp; bp += 4;
GLshort *v = (GLshort *) bp; bp += 2;
weglVertexAttrib3sv(*index,v);
}; break;
-case 5504: { // glVertexAttrib4Nbv
+case 5505: { // glVertexAttrib4Nbv
GLuint *index = (GLuint *) bp; bp += 4;
GLbyte * v = (GLbyte *) bp; bp += 4;
weglVertexAttrib4Nbv(*index,v);
}; break;
-case 5505: { // glVertexAttrib4Niv
+case 5506: { // glVertexAttrib4Niv
GLuint *index = (GLuint *) bp; bp += 4;
GLint * v = (GLint *) bp; bp += 16;
weglVertexAttrib4Niv(*index,v);
}; break;
-case 5506: { // glVertexAttrib4Nsv
+case 5507: { // glVertexAttrib4Nsv
GLuint *index = (GLuint *) bp; bp += 4;
GLshort * v = (GLshort *) bp; bp += 8;
weglVertexAttrib4Nsv(*index,v);
}; break;
-case 5507: { // glVertexAttrib4Nubv
+case 5508: { // glVertexAttrib4Nubv
GLuint *index = (GLuint *) bp; bp += 4;
GLubyte * v = (GLubyte *) bp; bp += 4;
weglVertexAttrib4Nubv(*index,v);
}; break;
-case 5508: { // glVertexAttrib4Nuiv
+case 5509: { // glVertexAttrib4Nuiv
GLuint *index = (GLuint *) bp; bp += 4;
GLuint * v = (GLuint *) bp; bp += 16;
weglVertexAttrib4Nuiv(*index,v);
}; break;
-case 5509: { // glVertexAttrib4Nusv
+case 5510: { // glVertexAttrib4Nusv
GLuint *index = (GLuint *) bp; bp += 4;
GLushort * v = (GLushort *) bp; bp += 8;
weglVertexAttrib4Nusv(*index,v);
}; break;
-case 5510: { // glVertexAttrib4bv
+case 5511: { // glVertexAttrib4bv
GLuint *index = (GLuint *) bp; bp += 4;
GLbyte * v = (GLbyte *) bp; bp += 4;
weglVertexAttrib4bv(*index,v);
}; break;
-case 5511: { // glVertexAttrib4dv
+case 5512: { // glVertexAttrib4dv
GLuint *index = (GLuint *) bp; bp += 4;
bp += 4;
GLdouble * v = (GLdouble *) bp; bp += 32;
weglVertexAttrib4dv(*index,v);
}; break;
-case 5512: { // glVertexAttrib4fv
+case 5513: { // glVertexAttrib4fv
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat * v = (GLfloat *) bp; bp += 16;
weglVertexAttrib4fv(*index,v);
}; break;
-case 5513: { // glVertexAttrib4iv
+case 5514: { // glVertexAttrib4iv
GLuint *index = (GLuint *) bp; bp += 4;
GLint * v = (GLint *) bp; bp += 16;
weglVertexAttrib4iv(*index,v);
}; break;
-case 5514: { // glVertexAttrib4sv
+case 5515: { // glVertexAttrib4sv
GLuint *index = (GLuint *) bp; bp += 4;
GLshort * v = (GLshort *) bp; bp += 8;
weglVertexAttrib4sv(*index,v);
}; break;
-case 5515: { // glVertexAttrib4ubv
+case 5516: { // glVertexAttrib4ubv
GLuint *index = (GLuint *) bp; bp += 4;
GLubyte * v = (GLubyte *) bp; bp += 4;
weglVertexAttrib4ubv(*index,v);
}; break;
-case 5516: { // glVertexAttrib4uiv
+case 5517: { // glVertexAttrib4uiv
GLuint *index = (GLuint *) bp; bp += 4;
GLuint * v = (GLuint *) bp; bp += 16;
weglVertexAttrib4uiv(*index,v);
}; break;
-case 5517: { // glVertexAttrib4usv
+case 5518: { // glVertexAttrib4usv
GLuint *index = (GLuint *) bp; bp += 4;
GLushort * v = (GLushort *) bp; bp += 8;
weglVertexAttrib4usv(*index,v);
}; break;
-case 5518: { // glVertexAttribPointer
+case 5519: { // glVertexAttribPointer
GLuint *index = (GLuint *) bp; bp += 4;
GLint *size = (GLint *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -3837,7 +3845,7 @@ case 5518: { // glVertexAttribPointer
GLvoid *pointer = (GLvoid *) (ErlDrvSInt) * (int *) bp; bp += 4;
weglVertexAttribPointer(*index,*size,*type,*normalized,*stride,pointer);
}; break;
-case 5519: { // glVertexAttribPointer
+case 5520: { // glVertexAttribPointer
GLuint *index = (GLuint *) bp; bp += 4;
GLint *size = (GLint *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -3847,7 +3855,7 @@ case 5519: { // glVertexAttribPointer
GLvoid *pointer = (GLvoid *) bins[0];
weglVertexAttribPointer(*index,*size,*type,*normalized,*stride,pointer);
}; break;
-case 5520: { // glUniformMatrix2x3fv
+case 5521: { // glUniformMatrix2x3fv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -3855,7 +3863,7 @@ case 5520: { // glUniformMatrix2x3fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*24;
weglUniformMatrix2x3fv(*location,*valueLen,*transpose,value);
}; break;
-case 5521: { // glUniformMatrix3x2fv
+case 5522: { // glUniformMatrix3x2fv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -3863,7 +3871,7 @@ case 5521: { // glUniformMatrix3x2fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*24;
weglUniformMatrix3x2fv(*location,*valueLen,*transpose,value);
}; break;
-case 5522: { // glUniformMatrix2x4fv
+case 5523: { // glUniformMatrix2x4fv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -3871,7 +3879,7 @@ case 5522: { // glUniformMatrix2x4fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*32;
weglUniformMatrix2x4fv(*location,*valueLen,*transpose,value);
}; break;
-case 5523: { // glUniformMatrix4x2fv
+case 5524: { // glUniformMatrix4x2fv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -3879,7 +3887,7 @@ case 5523: { // glUniformMatrix4x2fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*32;
weglUniformMatrix4x2fv(*location,*valueLen,*transpose,value);
}; break;
-case 5524: { // glUniformMatrix3x4fv
+case 5525: { // glUniformMatrix3x4fv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -3887,7 +3895,7 @@ case 5524: { // glUniformMatrix3x4fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*48;
weglUniformMatrix3x4fv(*location,*valueLen,*transpose,value);
}; break;
-case 5525: { // glUniformMatrix4x3fv
+case 5526: { // glUniformMatrix4x3fv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -3895,7 +3903,7 @@ case 5525: { // glUniformMatrix4x3fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*48;
weglUniformMatrix4x3fv(*location,*valueLen,*transpose,value);
}; break;
-case 5526: { // glColorMaski
+case 5527: { // glColorMaski
GLuint *index = (GLuint *) bp; bp += 4;
GLboolean *r = (GLboolean *) bp; bp += 1;
GLboolean *g = (GLboolean *) bp; bp += 1;
@@ -3903,7 +3911,7 @@ case 5526: { // glColorMaski
GLboolean *a = (GLboolean *) bp; bp += 1;
weglColorMaski(*index,*r,*g,*b,*a);
}; break;
-case 5527: { // glGetBooleani_v
+case 5528: { // glGetBooleani_v
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLboolean data[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@@ -3931,7 +3939,7 @@ case 5527: { // glGetBooleani_v
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5528: { // glGetIntegeri_v
+case 5529: { // glGetIntegeri_v
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLint data[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@@ -3959,17 +3967,17 @@ case 5528: { // glGetIntegeri_v
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5529: { // glEnablei
+case 5530: { // glEnablei
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
weglEnablei(*target,*index);
}; break;
-case 5530: { // glDisablei
+case 5531: { // glDisablei
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
weglDisablei(*target,*index);
}; break;
-case 5531: { // glIsEnabledi
+case 5532: { // glIsEnabledi
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLboolean result = weglIsEnabledi(*target,*index);
@@ -3979,14 +3987,14 @@ case 5531: { // glIsEnabledi
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5532: { // glBeginTransformFeedback
+case 5533: { // glBeginTransformFeedback
GLenum *primitiveMode = (GLenum *) bp; bp += 4;
weglBeginTransformFeedback(*primitiveMode);
}; break;
-case 5533: { // glEndTransformFeedback
+case 5534: { // glEndTransformFeedback
weglEndTransformFeedback();
}; break;
-case 5534: { // glBindBufferRange
+case 5535: { // glBindBufferRange
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLuint *buffer = (GLuint *) bp; bp += 4;
@@ -3995,13 +4003,13 @@ case 5534: { // glBindBufferRange
GLsizeiptr size = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8;
weglBindBufferRange(*target,*index,*buffer,offset,size);
}; break;
-case 5535: { // glBindBufferBase
+case 5536: { // glBindBufferBase
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLuint *buffer = (GLuint *) bp; bp += 4;
weglBindBufferBase(*target,*index,*buffer);
}; break;
-case 5536: { // glTransformFeedbackVaryings
+case 5537: { // glTransformFeedbackVaryings
GLuint *program = (GLuint *) bp; bp += 4;
int * varyingsLen = (int *) bp; bp += 4;
int * varyingsTotSize = (int *) bp; bp += 4;
@@ -4014,7 +4022,7 @@ case 5536: { // glTransformFeedbackVaryings
weglTransformFeedbackVaryings(*program,*varyingsLen,(const GLchar **) varyings,*bufferMode);
driver_free(varyings);
}; break;
-case 5537: { // glGetTransformFeedbackVarying
+case 5538: { // glGetTransformFeedbackVarying
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
@@ -4034,20 +4042,20 @@ case 5537: { // glGetTransformFeedbackVarying
driver_send_term(port,caller,rt,AP);
driver_free(name);
}; break;
-case 5538: { // glClampColor
+case 5539: { // glClampColor
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *clamp = (GLenum *) bp; bp += 4;
weglClampColor(*target,*clamp);
}; break;
-case 5539: { // glBeginConditionalRender
+case 5540: { // glBeginConditionalRender
GLuint *id = (GLuint *) bp; bp += 4;
GLenum *mode = (GLenum *) bp; bp += 4;
weglBeginConditionalRender(*id,*mode);
}; break;
-case 5540: { // glEndConditionalRender
+case 5541: { // glEndConditionalRender
weglEndConditionalRender();
}; break;
-case 5541: { // glVertexAttribIPointer
+case 5542: { // glVertexAttribIPointer
GLuint *index = (GLuint *) bp; bp += 4;
GLint *size = (GLint *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -4055,7 +4063,7 @@ case 5541: { // glVertexAttribIPointer
GLvoid *pointer = (GLvoid *) (ErlDrvSInt) * (int *) bp; bp += 4;
weglVertexAttribIPointer(*index,*size,*type,*stride,pointer);
}; break;
-case 5542: { // glVertexAttribIPointer
+case 5543: { // glVertexAttribIPointer
GLuint *index = (GLuint *) bp; bp += 4;
GLint *size = (GLint *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -4063,7 +4071,7 @@ case 5542: { // glVertexAttribIPointer
GLvoid *pointer = (GLvoid *) bins[0];
weglVertexAttribIPointer(*index,*size,*type,*stride,pointer);
}; break;
-case 5543: { // glGetVertexAttribIiv
+case 5544: { // glGetVertexAttribIiv
GLuint *index = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[4] = {0,0,0,0};
@@ -4079,7 +4087,7 @@ case 5543: { // glGetVertexAttribIiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5544: { // glGetVertexAttribIuiv
+case 5545: { // glGetVertexAttribIuiv
GLuint *index = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLuint params[4] = {0,0,0,0};
@@ -4095,67 +4103,67 @@ case 5544: { // glGetVertexAttribIuiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5545: { // glVertexAttribI1iv
+case 5546: { // glVertexAttribI1iv
GLuint *index = (GLuint *) bp; bp += 4;
GLint *v = (GLint *) bp; bp += 4;
weglVertexAttribI1iv(*index,v);
}; break;
-case 5546: { // glVertexAttribI2iv
+case 5547: { // glVertexAttribI2iv
GLuint *index = (GLuint *) bp; bp += 4;
GLint *v = (GLint *) bp; bp += 4;
weglVertexAttribI2iv(*index,v);
}; break;
-case 5547: { // glVertexAttribI3iv
+case 5548: { // glVertexAttribI3iv
GLuint *index = (GLuint *) bp; bp += 4;
GLint *v = (GLint *) bp; bp += 4;
weglVertexAttribI3iv(*index,v);
}; break;
-case 5548: { // glVertexAttribI4iv
+case 5549: { // glVertexAttribI4iv
GLuint *index = (GLuint *) bp; bp += 4;
GLint * v = (GLint *) bp; bp += 16;
weglVertexAttribI4iv(*index,v);
}; break;
-case 5549: { // glVertexAttribI1uiv
+case 5550: { // glVertexAttribI1uiv
GLuint *index = (GLuint *) bp; bp += 4;
GLuint *v = (GLuint *) bp; bp += 4;
weglVertexAttribI1uiv(*index,v);
}; break;
-case 5550: { // glVertexAttribI2uiv
+case 5551: { // glVertexAttribI2uiv
GLuint *index = (GLuint *) bp; bp += 4;
GLuint *v = (GLuint *) bp; bp += 4;
weglVertexAttribI2uiv(*index,v);
}; break;
-case 5551: { // glVertexAttribI3uiv
+case 5552: { // glVertexAttribI3uiv
GLuint *index = (GLuint *) bp; bp += 4;
GLuint *v = (GLuint *) bp; bp += 4;
weglVertexAttribI3uiv(*index,v);
}; break;
-case 5552: { // glVertexAttribI4uiv
+case 5553: { // glVertexAttribI4uiv
GLuint *index = (GLuint *) bp; bp += 4;
GLuint * v = (GLuint *) bp; bp += 16;
weglVertexAttribI4uiv(*index,v);
}; break;
-case 5553: { // glVertexAttribI4bv
+case 5554: { // glVertexAttribI4bv
GLuint *index = (GLuint *) bp; bp += 4;
GLbyte * v = (GLbyte *) bp; bp += 4;
weglVertexAttribI4bv(*index,v);
}; break;
-case 5554: { // glVertexAttribI4sv
+case 5555: { // glVertexAttribI4sv
GLuint *index = (GLuint *) bp; bp += 4;
GLshort * v = (GLshort *) bp; bp += 8;
weglVertexAttribI4sv(*index,v);
}; break;
-case 5555: { // glVertexAttribI4ubv
+case 5556: { // glVertexAttribI4ubv
GLuint *index = (GLuint *) bp; bp += 4;
GLubyte * v = (GLubyte *) bp; bp += 4;
weglVertexAttribI4ubv(*index,v);
}; break;
-case 5556: { // glVertexAttribI4usv
+case 5557: { // glVertexAttribI4usv
GLuint *index = (GLuint *) bp; bp += 4;
GLushort * v = (GLushort *) bp; bp += 8;
weglVertexAttribI4usv(*index,v);
}; break;
-case 5557: { // glGetUniformuiv
+case 5558: { // glGetUniformuiv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLuint params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@@ -4183,14 +4191,14 @@ case 5557: { // glGetUniformuiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5558: { // glBindFragDataLocation
+case 5559: { // glBindFragDataLocation
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *color = (GLuint *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+0)%8))%8);
weglBindFragDataLocation(*program,*color,name);
}; break;
-case 5559: { // glGetFragDataLocation
+case 5560: { // glGetFragDataLocation
GLuint *program = (GLuint *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+4)%8))%8);
@@ -4201,25 +4209,25 @@ case 5559: { // glGetFragDataLocation
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5560: { // glUniform1ui
+case 5561: { // glUniform1ui
GLint *location = (GLint *) bp; bp += 4;
GLuint *v0 = (GLuint *) bp; bp += 4;
weglUniform1ui(*location,*v0);
}; break;
-case 5561: { // glUniform2ui
+case 5562: { // glUniform2ui
GLint *location = (GLint *) bp; bp += 4;
GLuint *v0 = (GLuint *) bp; bp += 4;
GLuint *v1 = (GLuint *) bp; bp += 4;
weglUniform2ui(*location,*v0,*v1);
}; break;
-case 5562: { // glUniform3ui
+case 5563: { // glUniform3ui
GLint *location = (GLint *) bp; bp += 4;
GLuint *v0 = (GLuint *) bp; bp += 4;
GLuint *v1 = (GLuint *) bp; bp += 4;
GLuint *v2 = (GLuint *) bp; bp += 4;
weglUniform3ui(*location,*v0,*v1,*v2);
}; break;
-case 5563: { // glUniform4ui
+case 5564: { // glUniform4ui
GLint *location = (GLint *) bp; bp += 4;
GLuint *v0 = (GLuint *) bp; bp += 4;
GLuint *v1 = (GLuint *) bp; bp += 4;
@@ -4227,45 +4235,45 @@ case 5563: { // glUniform4ui
GLuint *v3 = (GLuint *) bp; bp += 4;
weglUniform4ui(*location,*v0,*v1,*v2,*v3);
}; break;
-case 5564: { // glUniform1uiv
+case 5565: { // glUniform1uiv
GLint *location = (GLint *) bp; bp += 4;
int * valueLen = (int *) bp; bp += 4;
- GLuint * value = (GLuint *) bp; bp += (8-((*valueLen*4+0)%8))%8;
+ GLuint * value = (GLuint *) bp; bp += *valueLen*4 + (8-((*valueLen*4+0)%8))%8;
weglUniform1uiv(*location,*valueLen,value);
}; break;
-case 5565: { // glUniform2uiv
+case 5566: { // glUniform2uiv
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLuint * value = (GLuint *) bp; bp += *valueLen*8;
weglUniform2uiv(*location,*valueLen,value);
}; break;
-case 5566: { // glUniform3uiv
+case 5567: { // glUniform3uiv
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLuint * value = (GLuint *) bp; bp += *valueLen*12;
weglUniform3uiv(*location,*valueLen,value);
}; break;
-case 5567: { // glUniform4uiv
+case 5568: { // glUniform4uiv
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLuint * value = (GLuint *) bp; bp += *valueLen*16;
weglUniform4uiv(*location,*valueLen,value);
}; break;
-case 5568: { // glTexParameterIiv
+case 5569: { // glTexParameterIiv
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
int *paramsLen = (int *) bp; bp += 4;
GLint *params = (GLint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4;
weglTexParameterIiv(*target,*pname,params);
}; break;
-case 5569: { // glTexParameterIuiv
+case 5570: { // glTexParameterIuiv
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
int *paramsLen = (int *) bp; bp += 4;
GLuint *params = (GLuint *) bp; bp += *paramsLen*4+((*paramsLen)+1)%2*4;
weglTexParameterIuiv(*target,*pname,params);
}; break;
-case 5570: { // glGetTexParameterIiv
+case 5571: { // glGetTexParameterIiv
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[4] = {0,0,0,0};
@@ -4281,7 +4289,7 @@ case 5570: { // glGetTexParameterIiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5571: { // glGetTexParameterIuiv
+case 5572: { // glGetTexParameterIuiv
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLuint params[4] = {0,0,0,0};
@@ -4297,35 +4305,35 @@ case 5571: { // glGetTexParameterIuiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5572: { // glClearBufferiv
+case 5573: { // glClearBufferiv
GLenum *buffer = (GLenum *) bp; bp += 4;
GLint *drawbuffer = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLint *value = (GLint *) bp; bp += *valueLen*4+((*valueLen)+1)%2*4;
weglClearBufferiv(*buffer,*drawbuffer,value);
}; break;
-case 5573: { // glClearBufferuiv
+case 5574: { // glClearBufferuiv
GLenum *buffer = (GLenum *) bp; bp += 4;
GLint *drawbuffer = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLuint *value = (GLuint *) bp; bp += *valueLen*4+((*valueLen)+1)%2*4;
weglClearBufferuiv(*buffer,*drawbuffer,value);
}; break;
-case 5574: { // glClearBufferfv
+case 5575: { // glClearBufferfv
GLenum *buffer = (GLenum *) bp; bp += 4;
GLint *drawbuffer = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLfloat *value = (GLfloat *) bp; bp += *valueLen*4+((*valueLen)+1)%2*4;
weglClearBufferfv(*buffer,*drawbuffer,value);
}; break;
-case 5575: { // glClearBufferfi
+case 5576: { // glClearBufferfi
GLenum *buffer = (GLenum *) bp; bp += 4;
GLint *drawbuffer = (GLint *) bp; bp += 4;
GLfloat *depth = (GLfloat *) bp; bp += 4;
GLint *stencil = (GLint *) bp; bp += 4;
weglClearBufferfi(*buffer,*drawbuffer,*depth,*stencil);
}; break;
-case 5576: { // glGetStringi
+case 5577: { // glGetStringi
GLenum *name = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
const GLubyte * result = weglGetStringi(*name,*index);
@@ -4335,14 +4343,14 @@ case 5576: { // glGetStringi
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5577: { // glDrawArraysInstanced
+case 5578: { // glDrawArraysInstanced
GLenum *mode = (GLenum *) bp; bp += 4;
GLint *first = (GLint *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLsizei *primcount = (GLsizei *) bp; bp += 4;
weglDrawArraysInstanced(*mode,*first,*count,*primcount);
}; break;
-case 5578: { // glDrawElementsInstanced
+case 5579: { // glDrawElementsInstanced
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -4350,7 +4358,7 @@ case 5578: { // glDrawElementsInstanced
GLsizei *primcount = (GLsizei *) bp; bp += 4;
weglDrawElementsInstanced(*mode,*count,*type,indices,*primcount);
}; break;
-case 5579: { // glDrawElementsInstanced
+case 5580: { // glDrawElementsInstanced
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -4358,17 +4366,17 @@ case 5579: { // glDrawElementsInstanced
GLsizei *primcount = (GLsizei *) bp; bp += 4;
weglDrawElementsInstanced(*mode,*count,*type,indices,*primcount);
}; break;
-case 5580: { // glTexBuffer
+case 5581: { // glTexBuffer
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *internalformat = (GLenum *) bp; bp += 4;
GLuint *buffer = (GLuint *) bp; bp += 4;
weglTexBuffer(*target,*internalformat,*buffer);
}; break;
-case 5581: { // glPrimitiveRestartIndex
+case 5582: { // glPrimitiveRestartIndex
GLuint *index = (GLuint *) bp; bp += 4;
weglPrimitiveRestartIndex(*index);
}; break;
-case 5582: { // glGetInteger64i_v
+case 5583: { // glGetInteger64i_v
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLint64 data[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@@ -4396,7 +4404,7 @@ case 5582: { // glGetInteger64i_v
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5583: { // glGetBufferParameteri64v
+case 5584: { // glGetBufferParameteri64v
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint64 params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@@ -4424,40 +4432,40 @@ case 5583: { // glGetBufferParameteri64v
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5584: { // glFramebufferTexture
+case 5585: { // glFramebufferTexture
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *attachment = (GLenum *) bp; bp += 4;
GLuint *texture = (GLuint *) bp; bp += 4;
GLint *level = (GLint *) bp; bp += 4;
weglFramebufferTexture(*target,*attachment,*texture,*level);
}; break;
-case 5585: { // glVertexAttribDivisor
+case 5586: { // glVertexAttribDivisor
GLuint *index = (GLuint *) bp; bp += 4;
GLuint *divisor = (GLuint *) bp; bp += 4;
weglVertexAttribDivisor(*index,*divisor);
}; break;
-case 5586: { // glMinSampleShading
+case 5587: { // glMinSampleShading
GLclampf *value = (GLclampf *) bp; bp += 4;
weglMinSampleShading(*value);
}; break;
-case 5587: { // glBlendEquationi
+case 5588: { // glBlendEquationi
GLuint *buf = (GLuint *) bp; bp += 4;
GLenum *mode = (GLenum *) bp; bp += 4;
weglBlendEquationi(*buf,*mode);
}; break;
-case 5588: { // glBlendEquationSeparatei
+case 5589: { // glBlendEquationSeparatei
GLuint *buf = (GLuint *) bp; bp += 4;
GLenum *modeRGB = (GLenum *) bp; bp += 4;
GLenum *modeAlpha = (GLenum *) bp; bp += 4;
weglBlendEquationSeparatei(*buf,*modeRGB,*modeAlpha);
}; break;
-case 5589: { // glBlendFunci
+case 5590: { // glBlendFunci
GLuint *buf = (GLuint *) bp; bp += 4;
GLenum *src = (GLenum *) bp; bp += 4;
GLenum *dst = (GLenum *) bp; bp += 4;
weglBlendFunci(*buf,*src,*dst);
}; break;
-case 5590: { // glBlendFuncSeparatei
+case 5591: { // glBlendFuncSeparatei
GLuint *buf = (GLuint *) bp; bp += 4;
GLenum *srcRGB = (GLenum *) bp; bp += 4;
GLenum *dstRGB = (GLenum *) bp; bp += 4;
@@ -4465,103 +4473,103 @@ case 5590: { // glBlendFuncSeparatei
GLenum *dstAlpha = (GLenum *) bp; bp += 4;
weglBlendFuncSeparatei(*buf,*srcRGB,*dstRGB,*srcAlpha,*dstAlpha);
}; break;
-case 5591: { // glLoadTransposeMatrixfARB
+case 5592: { // glLoadTransposeMatrixfARB
GLfloat * m = (GLfloat *) bp; bp += 64;
weglLoadTransposeMatrixfARB(m);
}; break;
-case 5592: { // glLoadTransposeMatrixdARB
+case 5593: { // glLoadTransposeMatrixdARB
GLdouble * m = (GLdouble *) bp; bp += 128;
weglLoadTransposeMatrixdARB(m);
}; break;
-case 5593: { // glMultTransposeMatrixfARB
+case 5594: { // glMultTransposeMatrixfARB
GLfloat * m = (GLfloat *) bp; bp += 64;
weglMultTransposeMatrixfARB(m);
}; break;
-case 5594: { // glMultTransposeMatrixdARB
+case 5595: { // glMultTransposeMatrixdARB
GLdouble * m = (GLdouble *) bp; bp += 128;
weglMultTransposeMatrixdARB(m);
}; break;
-case 5595: { // glWeightbvARB
+case 5596: { // glWeightbvARB
int * weightsLen = (int *) bp; bp += 4;
- GLbyte * weights = (GLbyte *) bp; bp += (8-((*weightsLen*1+4)%8))%8;
+ GLbyte * weights = (GLbyte *) bp; bp += *weightsLen*1 + (8-((*weightsLen*1+4)%8))%8;
weglWeightbvARB(*weightsLen,weights);
}; break;
-case 5596: { // glWeightsvARB
+case 5597: { // glWeightsvARB
int * weightsLen = (int *) bp; bp += 4;
- GLshort * weights = (GLshort *) bp; bp += (8-((*weightsLen*2+4)%8))%8;
+ GLshort * weights = (GLshort *) bp; bp += *weightsLen*2 + (8-((*weightsLen*2+4)%8))%8;
weglWeightsvARB(*weightsLen,weights);
}; break;
-case 5597: { // glWeightivARB
+case 5598: { // glWeightivARB
int * weightsLen = (int *) bp; bp += 4;
- GLint * weights = (GLint *) bp; bp += (8-((*weightsLen*4+4)%8))%8;
+ GLint * weights = (GLint *) bp; bp += *weightsLen*4 + (8-((*weightsLen*4+4)%8))%8;
weglWeightivARB(*weightsLen,weights);
}; break;
-case 5598: { // glWeightfvARB
+case 5599: { // glWeightfvARB
int * weightsLen = (int *) bp; bp += 4;
- GLfloat * weights = (GLfloat *) bp; bp += (8-((*weightsLen*4+4)%8))%8;
+ GLfloat * weights = (GLfloat *) bp; bp += *weightsLen*4 + (8-((*weightsLen*4+4)%8))%8;
weglWeightfvARB(*weightsLen,weights);
}; break;
-case 5599: { // glWeightdvARB
+case 5600: { // glWeightdvARB
int * weightsLen = (int *) bp; bp += 8;
- GLdouble * weights = (GLdouble *) bp; bp += (8-((*weightsLen*8+0)%8))%8;
+ GLdouble * weights = (GLdouble *) bp; bp += *weightsLen*8 + (8-((*weightsLen*8+0)%8))%8;
weglWeightdvARB(*weightsLen,weights);
}; break;
-case 5600: { // glWeightubvARB
+case 5601: { // glWeightubvARB
int * weightsLen = (int *) bp; bp += 4;
- GLubyte * weights = (GLubyte *) bp; bp += (8-((*weightsLen*1+4)%8))%8;
+ GLubyte * weights = (GLubyte *) bp; bp += *weightsLen*1 + (8-((*weightsLen*1+4)%8))%8;
weglWeightubvARB(*weightsLen,weights);
}; break;
-case 5601: { // glWeightusvARB
+case 5602: { // glWeightusvARB
int * weightsLen = (int *) bp; bp += 4;
- GLushort * weights = (GLushort *) bp; bp += (8-((*weightsLen*2+4)%8))%8;
+ GLushort * weights = (GLushort *) bp; bp += *weightsLen*2 + (8-((*weightsLen*2+4)%8))%8;
weglWeightusvARB(*weightsLen,weights);
}; break;
-case 5602: { // glWeightuivARB
+case 5603: { // glWeightuivARB
int * weightsLen = (int *) bp; bp += 4;
- GLuint * weights = (GLuint *) bp; bp += (8-((*weightsLen*4+4)%8))%8;
+ GLuint * weights = (GLuint *) bp; bp += *weightsLen*4 + (8-((*weightsLen*4+4)%8))%8;
weglWeightuivARB(*weightsLen,weights);
}; break;
-case 5603: { // glVertexBlendARB
+case 5604: { // glVertexBlendARB
GLint *count = (GLint *) bp; bp += 4;
weglVertexBlendARB(*count);
}; break;
-case 5604: { // glCurrentPaletteMatrixARB
+case 5605: { // glCurrentPaletteMatrixARB
GLint *index = (GLint *) bp; bp += 4;
weglCurrentPaletteMatrixARB(*index);
}; break;
-case 5605: { // glMatrixIndexubvARB
+case 5606: { // glMatrixIndexubvARB
int * indicesLen = (int *) bp; bp += 4;
- GLubyte * indices = (GLubyte *) bp; bp += (8-((*indicesLen*1+4)%8))%8;
+ GLubyte * indices = (GLubyte *) bp; bp += *indicesLen*1 + (8-((*indicesLen*1+4)%8))%8;
weglMatrixIndexubvARB(*indicesLen,indices);
}; break;
-case 5606: { // glMatrixIndexusvARB
+case 5607: { // glMatrixIndexusvARB
int * indicesLen = (int *) bp; bp += 4;
- GLushort * indices = (GLushort *) bp; bp += (8-((*indicesLen*2+4)%8))%8;
+ GLushort * indices = (GLushort *) bp; bp += *indicesLen*2 + (8-((*indicesLen*2+4)%8))%8;
weglMatrixIndexusvARB(*indicesLen,indices);
}; break;
-case 5607: { // glMatrixIndexuivARB
+case 5608: { // glMatrixIndexuivARB
int * indicesLen = (int *) bp; bp += 4;
- GLuint * indices = (GLuint *) bp; bp += (8-((*indicesLen*4+4)%8))%8;
+ GLuint * indices = (GLuint *) bp; bp += *indicesLen*4 + (8-((*indicesLen*4+4)%8))%8;
weglMatrixIndexuivARB(*indicesLen,indices);
}; break;
-case 5608: { // glProgramStringARB
+case 5609: { // glProgramStringARB
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *format = (GLenum *) bp; bp += 4;
GLvoid *string = (GLvoid *) bp;
int stringLen[1] = {(int)strlen((char *)string)}; bp += stringLen[0]+1+((8-((1+stringLen[0]+0)%8))%8);
weglProgramStringARB(*target,*format,*stringLen,string);
}; break;
-case 5609: { // glBindProgramARB
+case 5610: { // glBindProgramARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *program = (GLuint *) bp; bp += 4;
weglBindProgramARB(*target,*program);
}; break;
-case 5610: { // glDeleteProgramsARB
+case 5611: { // glDeleteProgramsARB
int * programsLen = (int *) bp; bp += 4;
- GLuint * programs = (GLuint *) bp; bp += (8-((*programsLen*4+4)%8))%8;
+ GLuint * programs = (GLuint *) bp; bp += *programsLen*4 + (8-((*programsLen*4+4)%8))%8;
weglDeleteProgramsARB(*programsLen,programs);
}; break;
-case 5611: { // glGenProgramsARB
+case 5612: { // glGenProgramsARB
GLsizei *n = (GLsizei *) bp; bp += 4;
GLuint *programs;
programs = (GLuint *) driver_alloc(sizeof(GLuint) * *n);
@@ -4577,7 +4585,7 @@ case 5611: { // glGenProgramsARB
driver_free(rt);
driver_free(programs);
}; break;
-case 5612: { // glProgramEnvParameter4dARB
+case 5613: { // glProgramEnvParameter4dARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLdouble *x = (GLdouble *) bp; bp += 8;
@@ -4586,13 +4594,13 @@ case 5612: { // glProgramEnvParameter4dARB
GLdouble *w = (GLdouble *) bp; bp += 8;
weglProgramEnvParameter4dARB(*target,*index,*x,*y,*z,*w);
}; break;
-case 5613: { // glProgramEnvParameter4dvARB
+case 5614: { // glProgramEnvParameter4dvARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLdouble * params = (GLdouble *) bp; bp += 32;
weglProgramEnvParameter4dvARB(*target,*index,params);
}; break;
-case 5614: { // glProgramEnvParameter4fARB
+case 5615: { // glProgramEnvParameter4fARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat *x = (GLfloat *) bp; bp += 4;
@@ -4601,13 +4609,13 @@ case 5614: { // glProgramEnvParameter4fARB
GLfloat *w = (GLfloat *) bp; bp += 4;
weglProgramEnvParameter4fARB(*target,*index,*x,*y,*z,*w);
}; break;
-case 5615: { // glProgramEnvParameter4fvARB
+case 5616: { // glProgramEnvParameter4fvARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat * params = (GLfloat *) bp; bp += 16;
weglProgramEnvParameter4fvARB(*target,*index,params);
}; break;
-case 5616: { // glProgramLocalParameter4dARB
+case 5617: { // glProgramLocalParameter4dARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLdouble *x = (GLdouble *) bp; bp += 8;
@@ -4616,13 +4624,13 @@ case 5616: { // glProgramLocalParameter4dARB
GLdouble *w = (GLdouble *) bp; bp += 8;
weglProgramLocalParameter4dARB(*target,*index,*x,*y,*z,*w);
}; break;
-case 5617: { // glProgramLocalParameter4dvARB
+case 5618: { // glProgramLocalParameter4dvARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLdouble * params = (GLdouble *) bp; bp += 32;
weglProgramLocalParameter4dvARB(*target,*index,params);
}; break;
-case 5618: { // glProgramLocalParameter4fARB
+case 5619: { // glProgramLocalParameter4fARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat *x = (GLfloat *) bp; bp += 4;
@@ -4631,13 +4639,13 @@ case 5618: { // glProgramLocalParameter4fARB
GLfloat *w = (GLfloat *) bp; bp += 4;
weglProgramLocalParameter4fARB(*target,*index,*x,*y,*z,*w);
}; break;
-case 5619: { // glProgramLocalParameter4fvARB
+case 5620: { // glProgramLocalParameter4fvARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat * params = (GLfloat *) bp; bp += 16;
weglProgramLocalParameter4fvARB(*target,*index,params);
}; break;
-case 5620: { // glGetProgramEnvParameterdvARB
+case 5621: { // glGetProgramEnvParameterdvARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLdouble params[4] = {0.0,0.0,0.0,0.0};
@@ -4653,7 +4661,7 @@ case 5620: { // glGetProgramEnvParameterdvARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5621: { // glGetProgramEnvParameterfvARB
+case 5622: { // glGetProgramEnvParameterfvARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat params[4] = {0.0,0.0,0.0,0.0};
@@ -4670,7 +4678,7 @@ case 5621: { // glGetProgramEnvParameterfvARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5622: { // glGetProgramLocalParameterdvARB
+case 5623: { // glGetProgramLocalParameterdvARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLdouble params[4] = {0.0,0.0,0.0,0.0};
@@ -4686,7 +4694,7 @@ case 5622: { // glGetProgramLocalParameterdvARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5623: { // glGetProgramLocalParameterfvARB
+case 5624: { // glGetProgramLocalParameterfvARB
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat params[4] = {0.0,0.0,0.0,0.0};
@@ -4703,7 +4711,7 @@ case 5623: { // glGetProgramLocalParameterfvARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5624: { // glGetProgramStringARB
+case 5625: { // glGetProgramStringARB
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLvoid *string = (GLvoid *) bins[0];
@@ -4714,7 +4722,7 @@ case 5624: { // glGetProgramStringARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5625: { // glGetBufferParameterivARB
+case 5626: { // glGetBufferParameterivARB
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@@ -4742,11 +4750,11 @@ case 5625: { // glGetBufferParameterivARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5626: { // glDeleteObjectARB
+case 5627: { // glDeleteObjectARB
GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
weglDeleteObjectARB(obj);
}; break;
-case 5627: { // glGetHandleARB
+case 5628: { // glGetHandleARB
GLenum *pname = (GLenum *) bp; bp += 4;
GLhandleARB result = weglGetHandleARB(*pname);
int AP = 0; ErlDrvTermData rt[6];
@@ -4755,12 +4763,12 @@ case 5627: { // glGetHandleARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5628: { // glDetachObjectARB
+case 5629: { // glDetachObjectARB
GLhandleARB containerObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLhandleARB attachedObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
weglDetachObjectARB(containerObj,attachedObj);
}; break;
-case 5629: { // glCreateShaderObjectARB
+case 5630: { // glCreateShaderObjectARB
GLenum *shaderType = (GLenum *) bp; bp += 4;
GLhandleARB result = weglCreateShaderObjectARB(*shaderType);
int AP = 0; ErlDrvTermData rt[6];
@@ -4769,7 +4777,7 @@ case 5629: { // glCreateShaderObjectARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5630: { // glShaderSourceARB
+case 5631: { // glShaderSourceARB
GLhandleARB shaderObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
int * stringLen = (int *) bp; bp += 4;
int * stringTotSize = (int *) bp; bp += 4;
@@ -4781,11 +4789,11 @@ case 5630: { // glShaderSourceARB
weglShaderSourceARB(shaderObj,*stringLen,(const GLchar **) string,NULL);
driver_free(string);
}; break;
-case 5631: { // glCompileShaderARB
+case 5632: { // glCompileShaderARB
GLhandleARB shaderObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
weglCompileShaderARB(shaderObj);
}; break;
-case 5632: { // glCreateProgramObjectARB
+case 5633: { // glCreateProgramObjectARB
GLhandleARB result = weglCreateProgramObjectARB();
int AP = 0; ErlDrvTermData rt[6];
rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_egl_result_");
@@ -4793,24 +4801,24 @@ case 5632: { // glCreateProgramObjectARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5633: { // glAttachObjectARB
+case 5634: { // glAttachObjectARB
GLhandleARB containerObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
weglAttachObjectARB(containerObj,obj);
}; break;
-case 5634: { // glLinkProgramARB
+case 5635: { // glLinkProgramARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
weglLinkProgramARB(programObj);
}; break;
-case 5635: { // glUseProgramObjectARB
+case 5636: { // glUseProgramObjectARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
weglUseProgramObjectARB(programObj);
}; break;
-case 5636: { // glValidateProgramARB
+case 5637: { // glValidateProgramARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
weglValidateProgramARB(programObj);
}; break;
-case 5637: { // glGetObjectParameterfvARB
+case 5638: { // glGetObjectParameterfvARB
GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLenum *pname = (GLenum *) bp; bp += 4;
GLfloat params[1] = {0.0};
@@ -4822,7 +4830,7 @@ case 5637: { // glGetObjectParameterfvARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5638: { // glGetObjectParameterivARB
+case 5639: { // glGetObjectParameterivARB
GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[1] = {0};
@@ -4833,7 +4841,7 @@ case 5638: { // glGetObjectParameterivARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5639: { // glGetInfoLogARB
+case 5640: { // glGetInfoLogARB
GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLsizei *maxLength = (GLsizei *) bp; bp += 4;
GLsizei length[1] = {0};
@@ -4847,7 +4855,7 @@ case 5639: { // glGetInfoLogARB
driver_send_term(port,caller,rt,AP);
driver_free(infoLog);
}; break;
-case 5640: { // glGetAttachedObjectsARB
+case 5641: { // glGetAttachedObjectsARB
GLhandleARB containerObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLsizei *maxCount = (GLsizei *) bp; bp += 4;
GLsizei count[1] = {0};
@@ -4865,7 +4873,7 @@ case 5640: { // glGetAttachedObjectsARB
driver_free(rt);
driver_free(obj);
}; break;
-case 5641: { // glGetUniformLocationARB
+case 5642: { // glGetUniformLocationARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+0)%8))%8);
@@ -4876,7 +4884,7 @@ case 5641: { // glGetUniformLocationARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5642: { // glGetActiveUniformARB
+case 5643: { // glGetActiveUniformARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLuint *index = (GLuint *) bp; bp += 4;
GLsizei *maxLength = (GLsizei *) bp; bp += 4;
@@ -4896,7 +4904,7 @@ case 5642: { // glGetActiveUniformARB
driver_send_term(port,caller,rt,AP);
driver_free(name);
}; break;
-case 5643: { // glGetUniformfvARB
+case 5644: { // glGetUniformfvARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLint *location = (GLint *) bp; bp += 4;
GLfloat params[16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
@@ -4925,7 +4933,7 @@ case 5643: { // glGetUniformfvARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5644: { // glGetUniformivARB
+case 5645: { // glGetUniformivARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLint *location = (GLint *) bp; bp += 4;
GLint params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@@ -4953,7 +4961,7 @@ case 5644: { // glGetUniformivARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5645: { // glGetShaderSourceARB
+case 5646: { // glGetShaderSourceARB
GLhandleARB obj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLsizei *maxLength = (GLsizei *) bp; bp += 4;
GLsizei length[1] = {0};
@@ -4967,14 +4975,14 @@ case 5645: { // glGetShaderSourceARB
driver_send_term(port,caller,rt,AP);
driver_free(source);
}; break;
-case 5646: { // glBindAttribLocationARB
+case 5647: { // glBindAttribLocationARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLuint *index = (GLuint *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+4)%8))%8);
weglBindAttribLocationARB(programObj,*index,name);
}; break;
-case 5647: { // glGetActiveAttribARB
+case 5648: { // glGetActiveAttribARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLuint *index = (GLuint *) bp; bp += 4;
GLsizei *maxLength = (GLsizei *) bp; bp += 4;
@@ -4994,7 +5002,7 @@ case 5647: { // glGetActiveAttribARB
driver_send_term(port,caller,rt,AP);
driver_free(name);
}; break;
-case 5648: { // glGetAttribLocationARB
+case 5649: { // glGetAttribLocationARB
GLhandleARB programObj = (GLhandleARB) * (GLuint64EXT *) bp; bp += 8;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+0)%8))%8);
@@ -5005,7 +5013,7 @@ case 5648: { // glGetAttribLocationARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5649: { // glIsRenderbuffer
+case 5650: { // glIsRenderbuffer
GLuint *renderbuffer = (GLuint *) bp; bp += 4;
GLboolean result = weglIsRenderbuffer(*renderbuffer);
int AP = 0; ErlDrvTermData rt[6];
@@ -5014,17 +5022,17 @@ case 5649: { // glIsRenderbuffer
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5650: { // glBindRenderbuffer
+case 5651: { // glBindRenderbuffer
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *renderbuffer = (GLuint *) bp; bp += 4;
weglBindRenderbuffer(*target,*renderbuffer);
}; break;
-case 5651: { // glDeleteRenderbuffers
+case 5652: { // glDeleteRenderbuffers
int * renderbuffersLen = (int *) bp; bp += 4;
- GLuint * renderbuffers = (GLuint *) bp; bp += (8-((*renderbuffersLen*4+4)%8))%8;
+ GLuint * renderbuffers = (GLuint *) bp; bp += *renderbuffersLen*4 + (8-((*renderbuffersLen*4+4)%8))%8;
weglDeleteRenderbuffers(*renderbuffersLen,renderbuffers);
}; break;
-case 5652: { // glGenRenderbuffers
+case 5653: { // glGenRenderbuffers
GLsizei *n = (GLsizei *) bp; bp += 4;
GLuint *renderbuffers;
renderbuffers = (GLuint *) driver_alloc(sizeof(GLuint) * *n);
@@ -5040,14 +5048,14 @@ case 5652: { // glGenRenderbuffers
driver_free(rt);
driver_free(renderbuffers);
}; break;
-case 5653: { // glRenderbufferStorage
+case 5654: { // glRenderbufferStorage
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *internalformat = (GLenum *) bp; bp += 4;
GLsizei *width = (GLsizei *) bp; bp += 4;
GLsizei *height = (GLsizei *) bp; bp += 4;
weglRenderbufferStorage(*target,*internalformat,*width,*height);
}; break;
-case 5654: { // glGetRenderbufferParameteriv
+case 5655: { // glGetRenderbufferParameteriv
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[1] = {0};
@@ -5058,7 +5066,7 @@ case 5654: { // glGetRenderbufferParameteriv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5655: { // glIsFramebuffer
+case 5656: { // glIsFramebuffer
GLuint *framebuffer = (GLuint *) bp; bp += 4;
GLboolean result = weglIsFramebuffer(*framebuffer);
int AP = 0; ErlDrvTermData rt[6];
@@ -5067,17 +5075,17 @@ case 5655: { // glIsFramebuffer
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5656: { // glBindFramebuffer
+case 5657: { // glBindFramebuffer
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *framebuffer = (GLuint *) bp; bp += 4;
weglBindFramebuffer(*target,*framebuffer);
}; break;
-case 5657: { // glDeleteFramebuffers
+case 5658: { // glDeleteFramebuffers
int * framebuffersLen = (int *) bp; bp += 4;
- GLuint * framebuffers = (GLuint *) bp; bp += (8-((*framebuffersLen*4+4)%8))%8;
+ GLuint * framebuffers = (GLuint *) bp; bp += *framebuffersLen*4 + (8-((*framebuffersLen*4+4)%8))%8;
weglDeleteFramebuffers(*framebuffersLen,framebuffers);
}; break;
-case 5658: { // glGenFramebuffers
+case 5659: { // glGenFramebuffers
GLsizei *n = (GLsizei *) bp; bp += 4;
GLuint *framebuffers;
framebuffers = (GLuint *) driver_alloc(sizeof(GLuint) * *n);
@@ -5093,7 +5101,7 @@ case 5658: { // glGenFramebuffers
driver_free(rt);
driver_free(framebuffers);
}; break;
-case 5659: { // glCheckFramebufferStatus
+case 5660: { // glCheckFramebufferStatus
GLenum *target = (GLenum *) bp; bp += 4;
GLenum result = weglCheckFramebufferStatus(*target);
int AP = 0; ErlDrvTermData rt[6];
@@ -5102,7 +5110,7 @@ case 5659: { // glCheckFramebufferStatus
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5660: { // glFramebufferTexture1D
+case 5661: { // glFramebufferTexture1D
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *attachment = (GLenum *) bp; bp += 4;
GLenum *textarget = (GLenum *) bp; bp += 4;
@@ -5110,7 +5118,7 @@ case 5660: { // glFramebufferTexture1D
GLint *level = (GLint *) bp; bp += 4;
weglFramebufferTexture1D(*target,*attachment,*textarget,*texture,*level);
}; break;
-case 5661: { // glFramebufferTexture2D
+case 5662: { // glFramebufferTexture2D
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *attachment = (GLenum *) bp; bp += 4;
GLenum *textarget = (GLenum *) bp; bp += 4;
@@ -5118,7 +5126,7 @@ case 5661: { // glFramebufferTexture2D
GLint *level = (GLint *) bp; bp += 4;
weglFramebufferTexture2D(*target,*attachment,*textarget,*texture,*level);
}; break;
-case 5662: { // glFramebufferTexture3D
+case 5663: { // glFramebufferTexture3D
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *attachment = (GLenum *) bp; bp += 4;
GLenum *textarget = (GLenum *) bp; bp += 4;
@@ -5127,14 +5135,14 @@ case 5662: { // glFramebufferTexture3D
GLint *zoffset = (GLint *) bp; bp += 4;
weglFramebufferTexture3D(*target,*attachment,*textarget,*texture,*level,*zoffset);
}; break;
-case 5663: { // glFramebufferRenderbuffer
+case 5664: { // glFramebufferRenderbuffer
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *attachment = (GLenum *) bp; bp += 4;
GLenum *renderbuffertarget = (GLenum *) bp; bp += 4;
GLuint *renderbuffer = (GLuint *) bp; bp += 4;
weglFramebufferRenderbuffer(*target,*attachment,*renderbuffertarget,*renderbuffer);
}; break;
-case 5664: { // glGetFramebufferAttachmentParameteriv
+case 5665: { // glGetFramebufferAttachmentParameteriv
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *attachment = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
@@ -5146,11 +5154,11 @@ case 5664: { // glGetFramebufferAttachmentParameteriv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5665: { // glGenerateMipmap
+case 5666: { // glGenerateMipmap
GLenum *target = (GLenum *) bp; bp += 4;
weglGenerateMipmap(*target);
}; break;
-case 5666: { // glBlitFramebuffer
+case 5667: { // glBlitFramebuffer
GLint *srcX0 = (GLint *) bp; bp += 4;
GLint *srcY0 = (GLint *) bp; bp += 4;
GLint *srcX1 = (GLint *) bp; bp += 4;
@@ -5163,7 +5171,7 @@ case 5666: { // glBlitFramebuffer
GLenum *filter = (GLenum *) bp; bp += 4;
weglBlitFramebuffer(*srcX0,*srcY0,*srcX1,*srcY1,*dstX0,*dstY0,*dstX1,*dstY1,*mask,*filter);
}; break;
-case 5667: { // glRenderbufferStorageMultisample
+case 5668: { // glRenderbufferStorageMultisample
GLenum *target = (GLenum *) bp; bp += 4;
GLsizei *samples = (GLsizei *) bp; bp += 4;
GLenum *internalformat = (GLenum *) bp; bp += 4;
@@ -5171,7 +5179,7 @@ case 5667: { // glRenderbufferStorageMultisample
GLsizei *height = (GLsizei *) bp; bp += 4;
weglRenderbufferStorageMultisample(*target,*samples,*internalformat,*width,*height);
}; break;
-case 5668: { // glFramebufferTextureLayer
+case 5669: { // glFramebufferTextureLayer
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *attachment = (GLenum *) bp; bp += 4;
GLuint *texture = (GLuint *) bp; bp += 4;
@@ -5179,7 +5187,7 @@ case 5668: { // glFramebufferTextureLayer
GLint *layer = (GLint *) bp; bp += 4;
weglFramebufferTextureLayer(*target,*attachment,*texture,*level,*layer);
}; break;
-case 5669: { // glFramebufferTextureFaceARB
+case 5670: { // glFramebufferTextureFaceARB
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *attachment = (GLenum *) bp; bp += 4;
GLuint *texture = (GLuint *) bp; bp += 4;
@@ -5187,23 +5195,23 @@ case 5669: { // glFramebufferTextureFaceARB
GLenum *face = (GLenum *) bp; bp += 4;
weglFramebufferTextureFaceARB(*target,*attachment,*texture,*level,*face);
}; break;
-case 5670: { // glFlushMappedBufferRange
+case 5671: { // glFlushMappedBufferRange
GLenum *target = (GLenum *) bp; bp += 4;
bp += 4;
GLintptr offset = (GLintptr) * (GLuint64EXT *) bp; bp += 8;
GLsizeiptr length = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8;
weglFlushMappedBufferRange(*target,offset,length);
}; break;
-case 5671: { // glBindVertexArray
+case 5672: { // glBindVertexArray
GLuint *array = (GLuint *) bp; bp += 4;
weglBindVertexArray(*array);
}; break;
-case 5672: { // glDeleteVertexArrays
+case 5673: { // glDeleteVertexArrays
int * arraysLen = (int *) bp; bp += 4;
- GLuint * arrays = (GLuint *) bp; bp += (8-((*arraysLen*4+4)%8))%8;
+ GLuint * arrays = (GLuint *) bp; bp += *arraysLen*4 + (8-((*arraysLen*4+4)%8))%8;
weglDeleteVertexArrays(*arraysLen,arrays);
}; break;
-case 5673: { // glGenVertexArrays
+case 5674: { // glGenVertexArrays
GLsizei *n = (GLsizei *) bp; bp += 4;
GLuint *arrays;
arrays = (GLuint *) driver_alloc(sizeof(GLuint) * *n);
@@ -5219,7 +5227,7 @@ case 5673: { // glGenVertexArrays
driver_free(rt);
driver_free(arrays);
}; break;
-case 5674: { // glIsVertexArray
+case 5675: { // glIsVertexArray
GLuint *array = (GLuint *) bp; bp += 4;
GLboolean result = weglIsVertexArray(*array);
int AP = 0; ErlDrvTermData rt[6];
@@ -5228,7 +5236,7 @@ case 5674: { // glIsVertexArray
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5675: { // glGetUniformIndices
+case 5676: { // glGetUniformIndices
GLuint *program = (GLuint *) bp; bp += 4;
int * uniformNamesLen = (int *) bp; bp += 4;
int * uniformNamesTotSize = (int *) bp; bp += 4;
@@ -5252,10 +5260,10 @@ case 5675: { // glGetUniformIndices
driver_free(uniformIndices);
driver_free(uniformNames);
}; break;
-case 5676: { // glGetActiveUniformsiv
+case 5677: { // glGetActiveUniformsiv
GLuint *program = (GLuint *) bp; bp += 4;
int * uniformIndicesLen = (int *) bp; bp += 4;
- GLuint * uniformIndices = (GLuint *) bp; bp += (8-((*uniformIndicesLen*4+0)%8))%8;
+ GLuint * uniformIndices = (GLuint *) bp; bp += *uniformIndicesLen*4 + (8-((*uniformIndicesLen*4+0)%8))%8;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint *params;
params = (GLint *) driver_alloc(sizeof(GLint) * *uniformIndicesLen);
@@ -5271,7 +5279,7 @@ case 5676: { // glGetActiveUniformsiv
driver_free(rt);
driver_free(params);
}; break;
-case 5677: { // glGetActiveUniformName
+case 5678: { // glGetActiveUniformName
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *uniformIndex = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
@@ -5286,7 +5294,7 @@ case 5677: { // glGetActiveUniformName
driver_send_term(port,caller,rt,AP);
driver_free(uniformName);
}; break;
-case 5678: { // glGetUniformBlockIndex
+case 5679: { // glGetUniformBlockIndex
GLuint *program = (GLuint *) bp; bp += 4;
GLchar *uniformBlockName = (GLchar *) bp;
int uniformBlockNameLen[1] = {(int)strlen((char *)uniformBlockName)}; bp += uniformBlockNameLen[0]+1+((8-((1+uniformBlockNameLen[0]+4)%8))%8);
@@ -5297,7 +5305,7 @@ case 5678: { // glGetUniformBlockIndex
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5679: { // glGetActiveUniformBlockiv
+case 5680: { // glGetActiveUniformBlockiv
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *uniformBlockIndex = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
@@ -5309,7 +5317,7 @@ case 5679: { // glGetActiveUniformBlockiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5680: { // glGetActiveUniformBlockName
+case 5681: { // glGetActiveUniformBlockName
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *uniformBlockIndex = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
@@ -5324,13 +5332,13 @@ case 5680: { // glGetActiveUniformBlockName
driver_send_term(port,caller,rt,AP);
driver_free(uniformBlockName);
}; break;
-case 5681: { // glUniformBlockBinding
+case 5682: { // glUniformBlockBinding
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *uniformBlockIndex = (GLuint *) bp; bp += 4;
GLuint *uniformBlockBinding = (GLuint *) bp; bp += 4;
weglUniformBlockBinding(*program,*uniformBlockIndex,*uniformBlockBinding);
}; break;
-case 5682: { // glCopyBufferSubData
+case 5683: { // glCopyBufferSubData
GLenum *readTarget = (GLenum *) bp; bp += 4;
GLenum *writeTarget = (GLenum *) bp; bp += 4;
GLintptr readOffset = (GLintptr) * (GLuint64EXT *) bp; bp += 8;
@@ -5338,7 +5346,7 @@ case 5682: { // glCopyBufferSubData
GLsizeiptr size = (GLsizeiptr) * (GLuint64EXT *) bp; bp += 8;
weglCopyBufferSubData(*readTarget,*writeTarget,readOffset,writeOffset,size);
}; break;
-case 5683: { // glDrawElementsBaseVertex
+case 5684: { // glDrawElementsBaseVertex
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -5346,7 +5354,7 @@ case 5683: { // glDrawElementsBaseVertex
GLint *basevertex = (GLint *) bp; bp += 4;
weglDrawElementsBaseVertex(*mode,*count,*type,indices,*basevertex);
}; break;
-case 5684: { // glDrawElementsBaseVertex
+case 5685: { // glDrawElementsBaseVertex
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -5354,7 +5362,7 @@ case 5684: { // glDrawElementsBaseVertex
GLint *basevertex = (GLint *) bp; bp += 4;
weglDrawElementsBaseVertex(*mode,*count,*type,indices,*basevertex);
}; break;
-case 5685: { // glDrawRangeElementsBaseVertex
+case 5686: { // glDrawRangeElementsBaseVertex
GLenum *mode = (GLenum *) bp; bp += 4;
GLuint *start = (GLuint *) bp; bp += 4;
GLuint *end = (GLuint *) bp; bp += 4;
@@ -5364,7 +5372,7 @@ case 5685: { // glDrawRangeElementsBaseVertex
GLint *basevertex = (GLint *) bp; bp += 4;
weglDrawRangeElementsBaseVertex(*mode,*start,*end,*count,*type,indices,*basevertex);
}; break;
-case 5686: { // glDrawRangeElementsBaseVertex
+case 5687: { // glDrawRangeElementsBaseVertex
GLenum *mode = (GLenum *) bp; bp += 4;
GLuint *start = (GLuint *) bp; bp += 4;
GLuint *end = (GLuint *) bp; bp += 4;
@@ -5374,7 +5382,7 @@ case 5686: { // glDrawRangeElementsBaseVertex
GLint *basevertex = (GLint *) bp; bp += 4;
weglDrawRangeElementsBaseVertex(*mode,*start,*end,*count,*type,indices,*basevertex);
}; break;
-case 5687: { // glDrawElementsInstancedBaseVertex
+case 5688: { // glDrawElementsInstancedBaseVertex
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -5383,7 +5391,7 @@ case 5687: { // glDrawElementsInstancedBaseVertex
GLint *basevertex = (GLint *) bp; bp += 4;
weglDrawElementsInstancedBaseVertex(*mode,*count,*type,indices,*primcount,*basevertex);
}; break;
-case 5688: { // glDrawElementsInstancedBaseVertex
+case 5689: { // glDrawElementsInstancedBaseVertex
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -5392,11 +5400,11 @@ case 5688: { // glDrawElementsInstancedBaseVertex
GLint *basevertex = (GLint *) bp; bp += 4;
weglDrawElementsInstancedBaseVertex(*mode,*count,*type,indices,*primcount,*basevertex);
}; break;
-case 5689: { // glProvokingVertex
+case 5690: { // glProvokingVertex
GLenum *mode = (GLenum *) bp; bp += 4;
weglProvokingVertex(*mode);
}; break;
-case 5690: { // glFenceSync
+case 5691: { // glFenceSync
GLenum *condition = (GLenum *) bp; bp += 4;
GLbitfield *flags = (GLbitfield *) bp; bp += 4;
GLsync result = weglFenceSync(*condition,*flags);
@@ -5406,7 +5414,7 @@ case 5690: { // glFenceSync
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5691: { // glIsSync
+case 5692: { // glIsSync
GLsync sync = (GLsync) * (GLuint64EXT *) bp; bp += 8;
GLboolean result = weglIsSync(sync);
int AP = 0; ErlDrvTermData rt[6];
@@ -5415,11 +5423,11 @@ case 5691: { // glIsSync
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5692: { // glDeleteSync
+case 5693: { // glDeleteSync
GLsync sync = (GLsync) * (GLuint64EXT *) bp; bp += 8;
weglDeleteSync(sync);
}; break;
-case 5693: { // glClientWaitSync
+case 5694: { // glClientWaitSync
GLsync sync = (GLsync) * (GLuint64EXT *) bp; bp += 8;
GLbitfield *flags = (GLbitfield *) bp; bp += 4;
bp += 4;
@@ -5431,14 +5439,14 @@ case 5693: { // glClientWaitSync
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5694: { // glWaitSync
+case 5695: { // glWaitSync
GLsync sync = (GLsync) * (GLuint64EXT *) bp; bp += 8;
GLbitfield *flags = (GLbitfield *) bp; bp += 4;
bp += 4;
GLuint64 timeout = (GLuint64) * (GLuint64EXT *) bp; bp += 8;
weglWaitSync(sync,*flags,timeout);
}; break;
-case 5695: { // glGetInteger64v
+case 5696: { // glGetInteger64v
GLenum *pname = (GLenum *) bp; bp += 4;
GLint64 params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
weglGetInteger64v(*pname,params);
@@ -5465,7 +5473,7 @@ case 5695: { // glGetInteger64v
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5696: { // glGetSynciv
+case 5697: { // glGetSynciv
GLsync sync = (GLsync) * (GLuint64EXT *) bp; bp += 8;
GLenum *pname = (GLenum *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
@@ -5484,7 +5492,7 @@ case 5696: { // glGetSynciv
driver_free(rt);
driver_free(values);
}; break;
-case 5697: { // glTexImage2DMultisample
+case 5698: { // glTexImage2DMultisample
GLenum *target = (GLenum *) bp; bp += 4;
GLsizei *samples = (GLsizei *) bp; bp += 4;
GLint *internalformat = (GLint *) bp; bp += 4;
@@ -5493,7 +5501,7 @@ case 5697: { // glTexImage2DMultisample
GLboolean *fixedsamplelocations = (GLboolean *) bp; bp += 1;
weglTexImage2DMultisample(*target,*samples,*internalformat,*width,*height,*fixedsamplelocations);
}; break;
-case 5698: { // glTexImage3DMultisample
+case 5699: { // glTexImage3DMultisample
GLenum *target = (GLenum *) bp; bp += 4;
GLsizei *samples = (GLsizei *) bp; bp += 4;
GLint *internalformat = (GLint *) bp; bp += 4;
@@ -5503,7 +5511,7 @@ case 5698: { // glTexImage3DMultisample
GLboolean *fixedsamplelocations = (GLboolean *) bp; bp += 1;
weglTexImage3DMultisample(*target,*samples,*internalformat,*width,*height,*depth,*fixedsamplelocations);
}; break;
-case 5699: { // glGetMultisamplefv
+case 5700: { // glGetMultisamplefv
GLenum *pname = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat val[2] = {0.0,0.0};
@@ -5518,12 +5526,12 @@ case 5699: { // glGetMultisamplefv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5700: { // glSampleMaski
+case 5701: { // glSampleMaski
GLuint *index = (GLuint *) bp; bp += 4;
GLbitfield *mask = (GLbitfield *) bp; bp += 4;
weglSampleMaski(*index,*mask);
}; break;
-case 5701: { // glNamedStringARB
+case 5702: { // glNamedStringARB
GLenum *type = (GLenum *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+4)%8))%8);
@@ -5531,12 +5539,12 @@ case 5701: { // glNamedStringARB
int stringLen[1] = {(int)strlen((char *)string)}; bp += stringLen[0]+1+((8-((1+stringLen[0]+0)%8))%8);
weglNamedStringARB(*type,*nameLen,name,*stringLen,string);
}; break;
-case 5702: { // glDeleteNamedStringARB
+case 5703: { // glDeleteNamedStringARB
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+0)%8))%8);
weglDeleteNamedStringARB(*nameLen,name);
}; break;
-case 5703: { // glCompileShaderIncludeARB
+case 5704: { // glCompileShaderIncludeARB
GLuint *shader = (GLuint *) bp; bp += 4;
int * pathLen = (int *) bp; bp += 4;
int * pathTotSize = (int *) bp; bp += 4;
@@ -5548,7 +5556,7 @@ case 5703: { // glCompileShaderIncludeARB
weglCompileShaderIncludeARB(*shader,*pathLen,(const GLchar **) path,NULL);
driver_free(path);
}; break;
-case 5704: { // glIsNamedStringARB
+case 5705: { // glIsNamedStringARB
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+0)%8))%8);
GLboolean result = weglIsNamedStringARB(*nameLen,name);
@@ -5558,7 +5566,7 @@ case 5704: { // glIsNamedStringARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5705: { // glGetNamedStringARB
+case 5706: { // glGetNamedStringARB
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+0)%8))%8);
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
@@ -5573,7 +5581,7 @@ case 5705: { // glGetNamedStringARB
driver_send_term(port,caller,rt,AP);
driver_free(string);
}; break;
-case 5706: { // glGetNamedStringivARB
+case 5707: { // glGetNamedStringivARB
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+0)%8))%8);
GLenum *pname = (GLenum *) bp; bp += 4;
@@ -5585,7 +5593,7 @@ case 5706: { // glGetNamedStringivARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5707: { // glBindFragDataLocationIndexed
+case 5708: { // glBindFragDataLocationIndexed
GLuint *program = (GLuint *) bp; bp += 4;
GLuint *colorNumber = (GLuint *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
@@ -5593,7 +5601,7 @@ case 5707: { // glBindFragDataLocationIndexed
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+4)%8))%8);
weglBindFragDataLocationIndexed(*program,*colorNumber,*index,name);
}; break;
-case 5708: { // glGetFragDataIndex
+case 5709: { // glGetFragDataIndex
GLuint *program = (GLuint *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
int nameLen[1] = {(int)strlen((char *)name)}; bp += nameLen[0]+1+((8-((1+nameLen[0]+4)%8))%8);
@@ -5604,7 +5612,7 @@ case 5708: { // glGetFragDataIndex
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5709: { // glGenSamplers
+case 5710: { // glGenSamplers
GLsizei *count = (GLsizei *) bp; bp += 4;
GLuint *samplers;
samplers = (GLuint *) driver_alloc(sizeof(GLuint) * *count);
@@ -5620,12 +5628,12 @@ case 5709: { // glGenSamplers
driver_free(rt);
driver_free(samplers);
}; break;
-case 5710: { // glDeleteSamplers
+case 5711: { // glDeleteSamplers
int * samplersLen = (int *) bp; bp += 4;
- GLuint * samplers = (GLuint *) bp; bp += (8-((*samplersLen*4+4)%8))%8;
+ GLuint * samplers = (GLuint *) bp; bp += *samplersLen*4 + (8-((*samplersLen*4+4)%8))%8;
weglDeleteSamplers(*samplersLen,samplers);
}; break;
-case 5711: { // glIsSampler
+case 5712: { // glIsSampler
GLuint *sampler = (GLuint *) bp; bp += 4;
GLboolean result = weglIsSampler(*sampler);
int AP = 0; ErlDrvTermData rt[6];
@@ -5634,52 +5642,52 @@ case 5711: { // glIsSampler
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5712: { // glBindSampler
+case 5713: { // glBindSampler
GLuint *unit = (GLuint *) bp; bp += 4;
GLuint *sampler = (GLuint *) bp; bp += 4;
weglBindSampler(*unit,*sampler);
}; break;
-case 5713: { // glSamplerParameteri
+case 5714: { // glSamplerParameteri
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint *param = (GLint *) bp; bp += 4;
weglSamplerParameteri(*sampler,*pname,*param);
}; break;
-case 5714: { // glSamplerParameteriv
+case 5715: { // glSamplerParameteriv
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
int * paramLen = (int *) bp; bp += 4;
- GLint * param = (GLint *) bp; bp += (8-((*paramLen*4+4)%8))%8;
+ GLint * param = (GLint *) bp; bp += *paramLen*4 + (8-((*paramLen*4+4)%8))%8;
weglSamplerParameteriv(*sampler,*pname,param);
}; break;
-case 5715: { // glSamplerParameterf
+case 5716: { // glSamplerParameterf
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLfloat *param = (GLfloat *) bp; bp += 4;
weglSamplerParameterf(*sampler,*pname,*param);
}; break;
-case 5716: { // glSamplerParameterfv
+case 5717: { // glSamplerParameterfv
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
int * paramLen = (int *) bp; bp += 4;
- GLfloat * param = (GLfloat *) bp; bp += (8-((*paramLen*4+4)%8))%8;
+ GLfloat * param = (GLfloat *) bp; bp += *paramLen*4 + (8-((*paramLen*4+4)%8))%8;
weglSamplerParameterfv(*sampler,*pname,param);
}; break;
-case 5717: { // glSamplerParameterIiv
+case 5718: { // glSamplerParameterIiv
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
int * paramLen = (int *) bp; bp += 4;
- GLint * param = (GLint *) bp; bp += (8-((*paramLen*4+4)%8))%8;
+ GLint * param = (GLint *) bp; bp += *paramLen*4 + (8-((*paramLen*4+4)%8))%8;
weglSamplerParameterIiv(*sampler,*pname,param);
}; break;
-case 5718: { // glSamplerParameterIuiv
+case 5719: { // glSamplerParameterIuiv
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
int * paramLen = (int *) bp; bp += 4;
- GLuint * param = (GLuint *) bp; bp += (8-((*paramLen*4+4)%8))%8;
+ GLuint * param = (GLuint *) bp; bp += *paramLen*4 + (8-((*paramLen*4+4)%8))%8;
weglSamplerParameterIuiv(*sampler,*pname,param);
}; break;
-case 5719: { // glGetSamplerParameteriv
+case 5720: { // glGetSamplerParameteriv
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[4] = {0,0,0,0};
@@ -5695,7 +5703,7 @@ case 5719: { // glGetSamplerParameteriv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5720: { // glGetSamplerParameterIiv
+case 5721: { // glGetSamplerParameterIiv
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[4] = {0,0,0,0};
@@ -5711,7 +5719,7 @@ case 5720: { // glGetSamplerParameterIiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5721: { // glGetSamplerParameterfv
+case 5722: { // glGetSamplerParameterfv
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLfloat params[4] = {0.0,0.0,0.0,0.0};
@@ -5728,7 +5736,7 @@ case 5721: { // glGetSamplerParameterfv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5722: { // glGetSamplerParameterIuiv
+case 5723: { // glGetSamplerParameterIuiv
GLuint *sampler = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLuint params[4] = {0,0,0,0};
@@ -5744,12 +5752,12 @@ case 5722: { // glGetSamplerParameterIuiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5723: { // glQueryCounter
+case 5724: { // glQueryCounter
GLuint *id = (GLuint *) bp; bp += 4;
GLenum *target = (GLenum *) bp; bp += 4;
weglQueryCounter(*id,*target);
}; break;
-case 5724: { // glGetQueryObjecti64v
+case 5725: { // glGetQueryObjecti64v
GLuint *id = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint64 params[1] = {0};
@@ -5760,7 +5768,7 @@ case 5724: { // glGetQueryObjecti64v
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5725: { // glGetQueryObjectui64v
+case 5726: { // glGetQueryObjectui64v
GLuint *id = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLuint64 params[1] = {0};
@@ -5771,42 +5779,42 @@ case 5725: { // glGetQueryObjectui64v
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5726: { // glDrawArraysIndirect
+case 5727: { // glDrawArraysIndirect
GLenum *mode = (GLenum *) bp; bp += 4;
GLvoid *indirect = (GLvoid *) (ErlDrvSInt) * (int *) bp; bp += 4;
weglDrawArraysIndirect(*mode,indirect);
}; break;
-case 5727: { // glDrawArraysIndirect
+case 5728: { // glDrawArraysIndirect
GLenum *mode = (GLenum *) bp; bp += 4;
GLvoid *indirect = (GLvoid *) bins[0];
weglDrawArraysIndirect(*mode,indirect);
}; break;
-case 5728: { // glDrawElementsIndirect
+case 5729: { // glDrawElementsIndirect
GLenum *mode = (GLenum *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
GLvoid *indirect = (GLvoid *) (ErlDrvSInt) * (int *) bp; bp += 4;
weglDrawElementsIndirect(*mode,*type,indirect);
}; break;
-case 5729: { // glDrawElementsIndirect
+case 5730: { // glDrawElementsIndirect
GLenum *mode = (GLenum *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
GLvoid *indirect = (GLvoid *) bins[0];
weglDrawElementsIndirect(*mode,*type,indirect);
}; break;
-case 5730: { // glUniform1d
+case 5731: { // glUniform1d
GLint *location = (GLint *) bp; bp += 4;
bp += 4;
GLdouble *x = (GLdouble *) bp; bp += 8;
weglUniform1d(*location,*x);
}; break;
-case 5731: { // glUniform2d
+case 5732: { // glUniform2d
GLint *location = (GLint *) bp; bp += 4;
bp += 4;
GLdouble *x = (GLdouble *) bp; bp += 8;
GLdouble *y = (GLdouble *) bp; bp += 8;
weglUniform2d(*location,*x,*y);
}; break;
-case 5732: { // glUniform3d
+case 5733: { // glUniform3d
GLint *location = (GLint *) bp; bp += 4;
bp += 4;
GLdouble *x = (GLdouble *) bp; bp += 8;
@@ -5814,7 +5822,7 @@ case 5732: { // glUniform3d
GLdouble *z = (GLdouble *) bp; bp += 8;
weglUniform3d(*location,*x,*y,*z);
}; break;
-case 5733: { // glUniform4d
+case 5734: { // glUniform4d
GLint *location = (GLint *) bp; bp += 4;
bp += 4;
GLdouble *x = (GLdouble *) bp; bp += 8;
@@ -5823,35 +5831,35 @@ case 5733: { // glUniform4d
GLdouble *w = (GLdouble *) bp; bp += 8;
weglUniform4d(*location,*x,*y,*z,*w);
}; break;
-case 5734: { // glUniform1dv
+case 5735: { // glUniform1dv
GLint *location = (GLint *) bp; bp += 4;
bp += 4;
int * valueLen = (int *) bp; bp += 8;
- GLdouble * value = (GLdouble *) bp; bp += (8-((*valueLen*8+0)%8))%8;
+ GLdouble * value = (GLdouble *) bp; bp += *valueLen*8 + (8-((*valueLen*8+0)%8))%8;
weglUniform1dv(*location,*valueLen,value);
}; break;
-case 5735: { // glUniform2dv
+case 5736: { // glUniform2dv
GLint *location = (GLint *) bp; bp += 4;
bp += 4;
int *valueLen = (int *) bp; bp += 8;
GLdouble * value = (GLdouble *) bp; bp += *valueLen*16;
weglUniform2dv(*location,*valueLen,value);
}; break;
-case 5736: { // glUniform3dv
+case 5737: { // glUniform3dv
GLint *location = (GLint *) bp; bp += 4;
bp += 4;
int *valueLen = (int *) bp; bp += 8;
GLdouble * value = (GLdouble *) bp; bp += *valueLen*24;
weglUniform3dv(*location,*valueLen,value);
}; break;
-case 5737: { // glUniform4dv
+case 5738: { // glUniform4dv
GLint *location = (GLint *) bp; bp += 4;
bp += 4;
int *valueLen = (int *) bp; bp += 8;
GLdouble * value = (GLdouble *) bp; bp += *valueLen*32;
weglUniform4dv(*location,*valueLen,value);
}; break;
-case 5738: { // glUniformMatrix2dv
+case 5739: { // glUniformMatrix2dv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -5859,7 +5867,7 @@ case 5738: { // glUniformMatrix2dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*32;
weglUniformMatrix2dv(*location,*valueLen,*transpose,value);
}; break;
-case 5739: { // glUniformMatrix3dv
+case 5740: { // glUniformMatrix3dv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -5867,7 +5875,7 @@ case 5739: { // glUniformMatrix3dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*72;
weglUniformMatrix3dv(*location,*valueLen,*transpose,value);
}; break;
-case 5740: { // glUniformMatrix4dv
+case 5741: { // glUniformMatrix4dv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -5875,7 +5883,7 @@ case 5740: { // glUniformMatrix4dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*128;
weglUniformMatrix4dv(*location,*valueLen,*transpose,value);
}; break;
-case 5741: { // glUniformMatrix2x3dv
+case 5742: { // glUniformMatrix2x3dv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -5883,7 +5891,7 @@ case 5741: { // glUniformMatrix2x3dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*48;
weglUniformMatrix2x3dv(*location,*valueLen,*transpose,value);
}; break;
-case 5742: { // glUniformMatrix2x4dv
+case 5743: { // glUniformMatrix2x4dv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -5891,7 +5899,7 @@ case 5742: { // glUniformMatrix2x4dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*64;
weglUniformMatrix2x4dv(*location,*valueLen,*transpose,value);
}; break;
-case 5743: { // glUniformMatrix3x2dv
+case 5744: { // glUniformMatrix3x2dv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -5899,7 +5907,7 @@ case 5743: { // glUniformMatrix3x2dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*48;
weglUniformMatrix3x2dv(*location,*valueLen,*transpose,value);
}; break;
-case 5744: { // glUniformMatrix3x4dv
+case 5745: { // glUniformMatrix3x4dv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -5907,7 +5915,7 @@ case 5744: { // glUniformMatrix3x4dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*96;
weglUniformMatrix3x4dv(*location,*valueLen,*transpose,value);
}; break;
-case 5745: { // glUniformMatrix4x2dv
+case 5746: { // glUniformMatrix4x2dv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -5915,7 +5923,7 @@ case 5745: { // glUniformMatrix4x2dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*64;
weglUniformMatrix4x2dv(*location,*valueLen,*transpose,value);
}; break;
-case 5746: { // glUniformMatrix4x3dv
+case 5747: { // glUniformMatrix4x3dv
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
bp += 3;
@@ -5923,7 +5931,7 @@ case 5746: { // glUniformMatrix4x3dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*96;
weglUniformMatrix4x3dv(*location,*valueLen,*transpose,value);
}; break;
-case 5747: { // glGetUniformdv
+case 5748: { // glGetUniformdv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLdouble params[16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
@@ -5951,7 +5959,7 @@ case 5747: { // glGetUniformdv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5748: { // glGetSubroutineUniformLocation
+case 5749: { // glGetSubroutineUniformLocation
GLuint *program = (GLuint *) bp; bp += 4;
GLenum *shadertype = (GLenum *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
@@ -5963,7 +5971,7 @@ case 5748: { // glGetSubroutineUniformLocation
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5749: { // glGetSubroutineIndex
+case 5750: { // glGetSubroutineIndex
GLuint *program = (GLuint *) bp; bp += 4;
GLenum *shadertype = (GLenum *) bp; bp += 4;
GLchar *name = (GLchar *) bp;
@@ -5975,7 +5983,7 @@ case 5749: { // glGetSubroutineIndex
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5750: { // glGetActiveSubroutineUniformName
+case 5751: { // glGetActiveSubroutineUniformName
GLuint *program = (GLuint *) bp; bp += 4;
GLenum *shadertype = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
@@ -5991,7 +5999,7 @@ case 5750: { // glGetActiveSubroutineUniformName
driver_send_term(port,caller,rt,AP);
driver_free(name);
}; break;
-case 5751: { // glGetActiveSubroutineName
+case 5752: { // glGetActiveSubroutineName
GLuint *program = (GLuint *) bp; bp += 4;
GLenum *shadertype = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
@@ -6007,13 +6015,13 @@ case 5751: { // glGetActiveSubroutineName
driver_send_term(port,caller,rt,AP);
driver_free(name);
}; break;
-case 5752: { // glUniformSubroutinesuiv
+case 5753: { // glUniformSubroutinesuiv
GLenum *shadertype = (GLenum *) bp; bp += 4;
int * indicesLen = (int *) bp; bp += 4;
- GLuint * indices = (GLuint *) bp; bp += (8-((*indicesLen*4+0)%8))%8;
+ GLuint * indices = (GLuint *) bp; bp += *indicesLen*4 + (8-((*indicesLen*4+0)%8))%8;
weglUniformSubroutinesuiv(*shadertype,*indicesLen,indices);
}; break;
-case 5753: { // glGetUniformSubroutineuiv
+case 5754: { // glGetUniformSubroutineuiv
GLenum *shadertype = (GLenum *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLuint params[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@@ -6041,7 +6049,7 @@ case 5753: { // glGetUniformSubroutineuiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5754: { // glGetProgramStageiv
+case 5755: { // glGetProgramStageiv
GLuint *program = (GLuint *) bp; bp += 4;
GLenum *shadertype = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
@@ -6053,28 +6061,28 @@ case 5754: { // glGetProgramStageiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5755: { // glPatchParameteri
+case 5756: { // glPatchParameteri
GLenum *pname = (GLenum *) bp; bp += 4;
GLint *value = (GLint *) bp; bp += 4;
weglPatchParameteri(*pname,*value);
}; break;
-case 5756: { // glPatchParameterfv
+case 5757: { // glPatchParameterfv
GLenum *pname = (GLenum *) bp; bp += 4;
int * valuesLen = (int *) bp; bp += 4;
- GLfloat * values = (GLfloat *) bp; bp += (8-((*valuesLen*4+0)%8))%8;
+ GLfloat * values = (GLfloat *) bp; bp += *valuesLen*4 + (8-((*valuesLen*4+0)%8))%8;
weglPatchParameterfv(*pname,values);
}; break;
-case 5757: { // glBindTransformFeedback
+case 5758: { // glBindTransformFeedback
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *id = (GLuint *) bp; bp += 4;
weglBindTransformFeedback(*target,*id);
}; break;
-case 5758: { // glDeleteTransformFeedbacks
+case 5759: { // glDeleteTransformFeedbacks
int * idsLen = (int *) bp; bp += 4;
- GLuint * ids = (GLuint *) bp; bp += (8-((*idsLen*4+4)%8))%8;
+ GLuint * ids = (GLuint *) bp; bp += *idsLen*4 + (8-((*idsLen*4+4)%8))%8;
weglDeleteTransformFeedbacks(*idsLen,ids);
}; break;
-case 5759: { // glGenTransformFeedbacks
+case 5760: { // glGenTransformFeedbacks
GLsizei *n = (GLsizei *) bp; bp += 4;
GLuint *ids;
ids = (GLuint *) driver_alloc(sizeof(GLuint) * *n);
@@ -6090,7 +6098,7 @@ case 5759: { // glGenTransformFeedbacks
driver_free(rt);
driver_free(ids);
}; break;
-case 5760: { // glIsTransformFeedback
+case 5761: { // glIsTransformFeedback
GLuint *id = (GLuint *) bp; bp += 4;
GLboolean result = weglIsTransformFeedback(*id);
int AP = 0; ErlDrvTermData rt[6];
@@ -6099,35 +6107,35 @@ case 5760: { // glIsTransformFeedback
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5761: { // glPauseTransformFeedback
+case 5762: { // glPauseTransformFeedback
weglPauseTransformFeedback();
}; break;
-case 5762: { // glResumeTransformFeedback
+case 5763: { // glResumeTransformFeedback
weglResumeTransformFeedback();
}; break;
-case 5763: { // glDrawTransformFeedback
+case 5764: { // glDrawTransformFeedback
GLenum *mode = (GLenum *) bp; bp += 4;
GLuint *id = (GLuint *) bp; bp += 4;
weglDrawTransformFeedback(*mode,*id);
}; break;
-case 5764: { // glDrawTransformFeedbackStream
+case 5765: { // glDrawTransformFeedbackStream
GLenum *mode = (GLenum *) bp; bp += 4;
GLuint *id = (GLuint *) bp; bp += 4;
GLuint *stream = (GLuint *) bp; bp += 4;
weglDrawTransformFeedbackStream(*mode,*id,*stream);
}; break;
-case 5765: { // glBeginQueryIndexed
+case 5766: { // glBeginQueryIndexed
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLuint *id = (GLuint *) bp; bp += 4;
weglBeginQueryIndexed(*target,*index,*id);
}; break;
-case 5766: { // glEndQueryIndexed
+case 5767: { // glEndQueryIndexed
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
weglEndQueryIndexed(*target,*index);
}; break;
-case 5767: { // glGetQueryIndexediv
+case 5768: { // glGetQueryIndexediv
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
@@ -6139,18 +6147,18 @@ case 5767: { // glGetQueryIndexediv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5768: { // glReleaseShaderCompiler
+case 5769: { // glReleaseShaderCompiler
weglReleaseShaderCompiler();
}; break;
-case 5769: { // glShaderBinary
+case 5770: { // glShaderBinary
int * shadersLen = (int *) bp; bp += 4;
- GLuint * shaders = (GLuint *) bp; bp += (8-((*shadersLen*4+4)%8))%8;
+ GLuint * shaders = (GLuint *) bp; bp += *shadersLen*4 + (8-((*shadersLen*4+4)%8))%8;
GLenum *binaryformat = (GLenum *) bp; bp += 4;
GLvoid *binary = (GLvoid *) bins[0];
GLsizei binary_size = bins_sz[0];
weglShaderBinary(*shadersLen,shaders,*binaryformat,binary,binary_size);
}; break;
-case 5770: { // glGetShaderPrecisionFormat
+case 5771: { // glGetShaderPrecisionFormat
GLenum *shadertype = (GLenum *) bp; bp += 4;
GLenum *precisiontype = (GLenum *) bp; bp += 4;
GLint range[2] = {0,0};
@@ -6167,16 +6175,16 @@ case 5770: { // glGetShaderPrecisionFormat
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5771: { // glDepthRangef
+case 5772: { // glDepthRangef
GLclampf *n = (GLclampf *) bp; bp += 4;
GLclampf *f = (GLclampf *) bp; bp += 4;
weglDepthRangef(*n,*f);
}; break;
-case 5772: { // glClearDepthf
+case 5773: { // glClearDepthf
GLclampf *d = (GLclampf *) bp; bp += 4;
weglClearDepthf(*d);
}; break;
-case 5773: { // glGetProgramBinary
+case 5774: { // glGetProgramBinary
GLuint *program = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
GLsizei length[1] = {0};
@@ -6192,31 +6200,31 @@ case 5773: { // glGetProgramBinary
driver_send_term(port,caller,rt,AP);
driver_free_binary(binary);
}; break;
-case 5774: { // glProgramBinary
+case 5775: { // glProgramBinary
GLuint *program = (GLuint *) bp; bp += 4;
GLenum *binaryFormat = (GLenum *) bp; bp += 4;
GLvoid *binary = (GLvoid *) bins[0];
GLsizei binary_size = bins_sz[0];
weglProgramBinary(*program,*binaryFormat,binary,binary_size);
}; break;
-case 5775: { // glProgramParameteri
+case 5776: { // glProgramParameteri
GLuint *program = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint *value = (GLint *) bp; bp += 4;
weglProgramParameteri(*program,*pname,*value);
}; break;
-case 5776: { // glUseProgramStages
+case 5777: { // glUseProgramStages
GLuint *pipeline = (GLuint *) bp; bp += 4;
GLbitfield *stages = (GLbitfield *) bp; bp += 4;
GLuint *program = (GLuint *) bp; bp += 4;
weglUseProgramStages(*pipeline,*stages,*program);
}; break;
-case 5777: { // glActiveShaderProgram
+case 5778: { // glActiveShaderProgram
GLuint *pipeline = (GLuint *) bp; bp += 4;
GLuint *program = (GLuint *) bp; bp += 4;
weglActiveShaderProgram(*pipeline,*program);
}; break;
-case 5778: { // glCreateShaderProgramv
+case 5779: { // glCreateShaderProgramv
GLenum *type = (GLenum *) bp; bp += 4;
int * stringsLen = (int *) bp; bp += 4;
int * stringsTotSize = (int *) bp; bp += 4;
@@ -6233,16 +6241,16 @@ case 5778: { // glCreateShaderProgramv
driver_send_term(port,caller,rt,AP);
driver_free(strings);
}; break;
-case 5779: { // glBindProgramPipeline
+case 5780: { // glBindProgramPipeline
GLuint *pipeline = (GLuint *) bp; bp += 4;
weglBindProgramPipeline(*pipeline);
}; break;
-case 5780: { // glDeleteProgramPipelines
+case 5781: { // glDeleteProgramPipelines
int * pipelinesLen = (int *) bp; bp += 4;
- GLuint * pipelines = (GLuint *) bp; bp += (8-((*pipelinesLen*4+4)%8))%8;
+ GLuint * pipelines = (GLuint *) bp; bp += *pipelinesLen*4 + (8-((*pipelinesLen*4+4)%8))%8;
weglDeleteProgramPipelines(*pipelinesLen,pipelines);
}; break;
-case 5781: { // glGenProgramPipelines
+case 5782: { // glGenProgramPipelines
GLsizei *n = (GLsizei *) bp; bp += 4;
GLuint *pipelines;
pipelines = (GLuint *) driver_alloc(sizeof(GLuint) * *n);
@@ -6258,7 +6266,7 @@ case 5781: { // glGenProgramPipelines
driver_free(rt);
driver_free(pipelines);
}; break;
-case 5782: { // glIsProgramPipeline
+case 5783: { // glIsProgramPipeline
GLuint *pipeline = (GLuint *) bp; bp += 4;
GLboolean result = weglIsProgramPipeline(*pipeline);
int AP = 0; ErlDrvTermData rt[6];
@@ -6267,7 +6275,7 @@ case 5782: { // glIsProgramPipeline
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5783: { // glGetProgramPipelineiv
+case 5784: { // glGetProgramPipelineiv
GLuint *pipeline = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLint params[1] = {0};
@@ -6278,115 +6286,115 @@ case 5783: { // glGetProgramPipelineiv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5784: { // glProgramUniform1i
+case 5785: { // glProgramUniform1i
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLint *v0 = (GLint *) bp; bp += 4;
weglProgramUniform1i(*program,*location,*v0);
}; break;
-case 5785: { // glProgramUniform1iv
+case 5786: { // glProgramUniform1iv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int * valueLen = (int *) bp; bp += 4;
- GLint * value = (GLint *) bp; bp += (8-((*valueLen*4+4)%8))%8;
+ GLint * value = (GLint *) bp; bp += *valueLen*4 + (8-((*valueLen*4+4)%8))%8;
weglProgramUniform1iv(*program,*location,*valueLen,value);
}; break;
-case 5786: { // glProgramUniform1f
+case 5787: { // glProgramUniform1f
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLfloat *v0 = (GLfloat *) bp; bp += 4;
weglProgramUniform1f(*program,*location,*v0);
}; break;
-case 5787: { // glProgramUniform1fv
+case 5788: { // glProgramUniform1fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int * valueLen = (int *) bp; bp += 4;
- GLfloat * value = (GLfloat *) bp; bp += (8-((*valueLen*4+4)%8))%8;
+ GLfloat * value = (GLfloat *) bp; bp += *valueLen*4 + (8-((*valueLen*4+4)%8))%8;
weglProgramUniform1fv(*program,*location,*valueLen,value);
}; break;
-case 5788: { // glProgramUniform1d
+case 5789: { // glProgramUniform1d
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLdouble *v0 = (GLdouble *) bp; bp += 8;
weglProgramUniform1d(*program,*location,*v0);
}; break;
-case 5789: { // glProgramUniform1dv
+case 5790: { // glProgramUniform1dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int * valueLen = (int *) bp; bp += 8;
- GLdouble * value = (GLdouble *) bp; bp += (8-((*valueLen*8+0)%8))%8;
+ GLdouble * value = (GLdouble *) bp; bp += *valueLen*8 + (8-((*valueLen*8+0)%8))%8;
weglProgramUniform1dv(*program,*location,*valueLen,value);
}; break;
-case 5790: { // glProgramUniform1ui
+case 5791: { // glProgramUniform1ui
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLuint *v0 = (GLuint *) bp; bp += 4;
weglProgramUniform1ui(*program,*location,*v0);
}; break;
-case 5791: { // glProgramUniform1uiv
+case 5792: { // glProgramUniform1uiv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int * valueLen = (int *) bp; bp += 4;
- GLuint * value = (GLuint *) bp; bp += (8-((*valueLen*4+4)%8))%8;
+ GLuint * value = (GLuint *) bp; bp += *valueLen*4 + (8-((*valueLen*4+4)%8))%8;
weglProgramUniform1uiv(*program,*location,*valueLen,value);
}; break;
-case 5792: { // glProgramUniform2i
+case 5793: { // glProgramUniform2i
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLint *v0 = (GLint *) bp; bp += 4;
GLint *v1 = (GLint *) bp; bp += 4;
weglProgramUniform2i(*program,*location,*v0,*v1);
}; break;
-case 5793: { // glProgramUniform2iv
+case 5794: { // glProgramUniform2iv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLint * value = (GLint *) bp; bp += *valueLen*8;
weglProgramUniform2iv(*program,*location,*valueLen,value);
}; break;
-case 5794: { // glProgramUniform2f
+case 5795: { // glProgramUniform2f
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLfloat *v0 = (GLfloat *) bp; bp += 4;
GLfloat *v1 = (GLfloat *) bp; bp += 4;
weglProgramUniform2f(*program,*location,*v0,*v1);
}; break;
-case 5795: { // glProgramUniform2fv
+case 5796: { // glProgramUniform2fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLfloat * value = (GLfloat *) bp; bp += *valueLen*8;
weglProgramUniform2fv(*program,*location,*valueLen,value);
}; break;
-case 5796: { // glProgramUniform2d
+case 5797: { // glProgramUniform2d
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLdouble *v0 = (GLdouble *) bp; bp += 8;
GLdouble *v1 = (GLdouble *) bp; bp += 8;
weglProgramUniform2d(*program,*location,*v0,*v1);
}; break;
-case 5797: { // glProgramUniform2dv
+case 5798: { // glProgramUniform2dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 8;
GLdouble * value = (GLdouble *) bp; bp += *valueLen*16;
weglProgramUniform2dv(*program,*location,*valueLen,value);
}; break;
-case 5798: { // glProgramUniform2ui
+case 5799: { // glProgramUniform2ui
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLuint *v0 = (GLuint *) bp; bp += 4;
GLuint *v1 = (GLuint *) bp; bp += 4;
weglProgramUniform2ui(*program,*location,*v0,*v1);
}; break;
-case 5799: { // glProgramUniform2uiv
+case 5800: { // glProgramUniform2uiv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLuint * value = (GLuint *) bp; bp += *valueLen*8;
weglProgramUniform2uiv(*program,*location,*valueLen,value);
}; break;
-case 5800: { // glProgramUniform3i
+case 5801: { // glProgramUniform3i
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLint *v0 = (GLint *) bp; bp += 4;
@@ -6394,14 +6402,14 @@ case 5800: { // glProgramUniform3i
GLint *v2 = (GLint *) bp; bp += 4;
weglProgramUniform3i(*program,*location,*v0,*v1,*v2);
}; break;
-case 5801: { // glProgramUniform3iv
+case 5802: { // glProgramUniform3iv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLint * value = (GLint *) bp; bp += *valueLen*12;
weglProgramUniform3iv(*program,*location,*valueLen,value);
}; break;
-case 5802: { // glProgramUniform3f
+case 5803: { // glProgramUniform3f
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLfloat *v0 = (GLfloat *) bp; bp += 4;
@@ -6409,14 +6417,14 @@ case 5802: { // glProgramUniform3f
GLfloat *v2 = (GLfloat *) bp; bp += 4;
weglProgramUniform3f(*program,*location,*v0,*v1,*v2);
}; break;
-case 5803: { // glProgramUniform3fv
+case 5804: { // glProgramUniform3fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLfloat * value = (GLfloat *) bp; bp += *valueLen*12;
weglProgramUniform3fv(*program,*location,*valueLen,value);
}; break;
-case 5804: { // glProgramUniform3d
+case 5805: { // glProgramUniform3d
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLdouble *v0 = (GLdouble *) bp; bp += 8;
@@ -6424,14 +6432,14 @@ case 5804: { // glProgramUniform3d
GLdouble *v2 = (GLdouble *) bp; bp += 8;
weglProgramUniform3d(*program,*location,*v0,*v1,*v2);
}; break;
-case 5805: { // glProgramUniform3dv
+case 5806: { // glProgramUniform3dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 8;
GLdouble * value = (GLdouble *) bp; bp += *valueLen*24;
weglProgramUniform3dv(*program,*location,*valueLen,value);
}; break;
-case 5806: { // glProgramUniform3ui
+case 5807: { // glProgramUniform3ui
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLuint *v0 = (GLuint *) bp; bp += 4;
@@ -6439,14 +6447,14 @@ case 5806: { // glProgramUniform3ui
GLuint *v2 = (GLuint *) bp; bp += 4;
weglProgramUniform3ui(*program,*location,*v0,*v1,*v2);
}; break;
-case 5807: { // glProgramUniform3uiv
+case 5808: { // glProgramUniform3uiv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLuint * value = (GLuint *) bp; bp += *valueLen*12;
weglProgramUniform3uiv(*program,*location,*valueLen,value);
}; break;
-case 5808: { // glProgramUniform4i
+case 5809: { // glProgramUniform4i
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLint *v0 = (GLint *) bp; bp += 4;
@@ -6455,14 +6463,14 @@ case 5808: { // glProgramUniform4i
GLint *v3 = (GLint *) bp; bp += 4;
weglProgramUniform4i(*program,*location,*v0,*v1,*v2,*v3);
}; break;
-case 5809: { // glProgramUniform4iv
+case 5810: { // glProgramUniform4iv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLint * value = (GLint *) bp; bp += *valueLen*16;
weglProgramUniform4iv(*program,*location,*valueLen,value);
}; break;
-case 5810: { // glProgramUniform4f
+case 5811: { // glProgramUniform4f
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLfloat *v0 = (GLfloat *) bp; bp += 4;
@@ -6471,14 +6479,14 @@ case 5810: { // glProgramUniform4f
GLfloat *v3 = (GLfloat *) bp; bp += 4;
weglProgramUniform4f(*program,*location,*v0,*v1,*v2,*v3);
}; break;
-case 5811: { // glProgramUniform4fv
+case 5812: { // glProgramUniform4fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLfloat * value = (GLfloat *) bp; bp += *valueLen*16;
weglProgramUniform4fv(*program,*location,*valueLen,value);
}; break;
-case 5812: { // glProgramUniform4d
+case 5813: { // glProgramUniform4d
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLdouble *v0 = (GLdouble *) bp; bp += 8;
@@ -6487,14 +6495,14 @@ case 5812: { // glProgramUniform4d
GLdouble *v3 = (GLdouble *) bp; bp += 8;
weglProgramUniform4d(*program,*location,*v0,*v1,*v2,*v3);
}; break;
-case 5813: { // glProgramUniform4dv
+case 5814: { // glProgramUniform4dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 8;
GLdouble * value = (GLdouble *) bp; bp += *valueLen*32;
weglProgramUniform4dv(*program,*location,*valueLen,value);
}; break;
-case 5814: { // glProgramUniform4ui
+case 5815: { // glProgramUniform4ui
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLuint *v0 = (GLuint *) bp; bp += 4;
@@ -6503,14 +6511,14 @@ case 5814: { // glProgramUniform4ui
GLuint *v3 = (GLuint *) bp; bp += 4;
weglProgramUniform4ui(*program,*location,*v0,*v1,*v2,*v3);
}; break;
-case 5815: { // glProgramUniform4uiv
+case 5816: { // glProgramUniform4uiv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
int *valueLen = (int *) bp; bp += 4;
GLuint * value = (GLuint *) bp; bp += *valueLen*16;
weglProgramUniform4uiv(*program,*location,*valueLen,value);
}; break;
-case 5816: { // glProgramUniformMatrix2fv
+case 5817: { // glProgramUniformMatrix2fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6519,7 +6527,7 @@ case 5816: { // glProgramUniformMatrix2fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*16;
weglProgramUniformMatrix2fv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5817: { // glProgramUniformMatrix3fv
+case 5818: { // glProgramUniformMatrix3fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6528,7 +6536,7 @@ case 5817: { // glProgramUniformMatrix3fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*36;
weglProgramUniformMatrix3fv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5818: { // glProgramUniformMatrix4fv
+case 5819: { // glProgramUniformMatrix4fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6537,7 +6545,7 @@ case 5818: { // glProgramUniformMatrix4fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*64;
weglProgramUniformMatrix4fv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5819: { // glProgramUniformMatrix2dv
+case 5820: { // glProgramUniformMatrix2dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6546,7 +6554,7 @@ case 5819: { // glProgramUniformMatrix2dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*32;
weglProgramUniformMatrix2dv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5820: { // glProgramUniformMatrix3dv
+case 5821: { // glProgramUniformMatrix3dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6555,7 +6563,7 @@ case 5820: { // glProgramUniformMatrix3dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*72;
weglProgramUniformMatrix3dv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5821: { // glProgramUniformMatrix4dv
+case 5822: { // glProgramUniformMatrix4dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6564,7 +6572,7 @@ case 5821: { // glProgramUniformMatrix4dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*128;
weglProgramUniformMatrix4dv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5822: { // glProgramUniformMatrix2x3fv
+case 5823: { // glProgramUniformMatrix2x3fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6573,7 +6581,7 @@ case 5822: { // glProgramUniformMatrix2x3fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*24;
weglProgramUniformMatrix2x3fv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5823: { // glProgramUniformMatrix3x2fv
+case 5824: { // glProgramUniformMatrix3x2fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6582,7 +6590,7 @@ case 5823: { // glProgramUniformMatrix3x2fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*24;
weglProgramUniformMatrix3x2fv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5824: { // glProgramUniformMatrix2x4fv
+case 5825: { // glProgramUniformMatrix2x4fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6591,7 +6599,7 @@ case 5824: { // glProgramUniformMatrix2x4fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*32;
weglProgramUniformMatrix2x4fv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5825: { // glProgramUniformMatrix4x2fv
+case 5826: { // glProgramUniformMatrix4x2fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6600,7 +6608,7 @@ case 5825: { // glProgramUniformMatrix4x2fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*32;
weglProgramUniformMatrix4x2fv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5826: { // glProgramUniformMatrix3x4fv
+case 5827: { // glProgramUniformMatrix3x4fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6609,7 +6617,7 @@ case 5826: { // glProgramUniformMatrix3x4fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*48;
weglProgramUniformMatrix3x4fv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5827: { // glProgramUniformMatrix4x3fv
+case 5828: { // glProgramUniformMatrix4x3fv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6618,7 +6626,7 @@ case 5827: { // glProgramUniformMatrix4x3fv
GLfloat * value = (GLfloat *) bp; bp += *valueLen*48;
weglProgramUniformMatrix4x3fv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5828: { // glProgramUniformMatrix2x3dv
+case 5829: { // glProgramUniformMatrix2x3dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6627,7 +6635,7 @@ case 5828: { // glProgramUniformMatrix2x3dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*48;
weglProgramUniformMatrix2x3dv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5829: { // glProgramUniformMatrix3x2dv
+case 5830: { // glProgramUniformMatrix3x2dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6636,7 +6644,7 @@ case 5829: { // glProgramUniformMatrix3x2dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*48;
weglProgramUniformMatrix3x2dv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5830: { // glProgramUniformMatrix2x4dv
+case 5831: { // glProgramUniformMatrix2x4dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6645,7 +6653,7 @@ case 5830: { // glProgramUniformMatrix2x4dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*64;
weglProgramUniformMatrix2x4dv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5831: { // glProgramUniformMatrix4x2dv
+case 5832: { // glProgramUniformMatrix4x2dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6654,7 +6662,7 @@ case 5831: { // glProgramUniformMatrix4x2dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*64;
weglProgramUniformMatrix4x2dv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5832: { // glProgramUniformMatrix3x4dv
+case 5833: { // glProgramUniformMatrix3x4dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6663,7 +6671,7 @@ case 5832: { // glProgramUniformMatrix3x4dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*96;
weglProgramUniformMatrix3x4dv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5833: { // glProgramUniformMatrix4x3dv
+case 5834: { // glProgramUniformMatrix4x3dv
GLuint *program = (GLuint *) bp; bp += 4;
GLint *location = (GLint *) bp; bp += 4;
GLboolean *transpose = (GLboolean *) bp; bp += 1;
@@ -6672,11 +6680,11 @@ case 5833: { // glProgramUniformMatrix4x3dv
GLdouble * value = (GLdouble *) bp; bp += *valueLen*96;
weglProgramUniformMatrix4x3dv(*program,*location,*valueLen,*transpose,value);
}; break;
-case 5834: { // glValidateProgramPipeline
+case 5835: { // glValidateProgramPipeline
GLuint *pipeline = (GLuint *) bp; bp += 4;
weglValidateProgramPipeline(*pipeline);
}; break;
-case 5835: { // glGetProgramPipelineInfoLog
+case 5836: { // glGetProgramPipelineInfoLog
GLuint *pipeline = (GLuint *) bp; bp += 4;
GLsizei *bufSize = (GLsizei *) bp; bp += 4;
GLsizei length[1] = {0};
@@ -6690,31 +6698,31 @@ case 5835: { // glGetProgramPipelineInfoLog
driver_send_term(port,caller,rt,AP);
driver_free(infoLog);
}; break;
-case 5836: { // glVertexAttribL1dv
+case 5837: { // glVertexAttribL1dv
GLuint *index = (GLuint *) bp; bp += 4;
bp += 4;
GLdouble *v = (GLdouble *) bp; bp += 8;
weglVertexAttribL1dv(*index,v);
}; break;
-case 5837: { // glVertexAttribL2dv
+case 5838: { // glVertexAttribL2dv
GLuint *index = (GLuint *) bp; bp += 4;
bp += 4;
GLdouble *v = (GLdouble *) bp; bp += 8;
weglVertexAttribL2dv(*index,v);
}; break;
-case 5838: { // glVertexAttribL3dv
+case 5839: { // glVertexAttribL3dv
GLuint *index = (GLuint *) bp; bp += 4;
bp += 4;
GLdouble *v = (GLdouble *) bp; bp += 8;
weglVertexAttribL3dv(*index,v);
}; break;
-case 5839: { // glVertexAttribL4dv
+case 5840: { // glVertexAttribL4dv
GLuint *index = (GLuint *) bp; bp += 4;
bp += 4;
GLdouble *v = (GLdouble *) bp; bp += 8;
weglVertexAttribL4dv(*index,v);
}; break;
-case 5840: { // glVertexAttribLPointer
+case 5841: { // glVertexAttribLPointer
GLuint *index = (GLuint *) bp; bp += 4;
GLint *size = (GLint *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -6722,7 +6730,7 @@ case 5840: { // glVertexAttribLPointer
GLvoid *pointer = (GLvoid *) (ErlDrvSInt) * (int *) bp; bp += 4;
weglVertexAttribLPointer(*index,*size,*type,*stride,pointer);
}; break;
-case 5841: { // glVertexAttribLPointer
+case 5842: { // glVertexAttribLPointer
GLuint *index = (GLuint *) bp; bp += 4;
GLint *size = (GLint *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -6730,7 +6738,7 @@ case 5841: { // glVertexAttribLPointer
GLvoid *pointer = (GLvoid *) bins[0];
weglVertexAttribLPointer(*index,*size,*type,*stride,pointer);
}; break;
-case 5842: { // glGetVertexAttribLdv
+case 5843: { // glGetVertexAttribLdv
GLuint *index = (GLuint *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
GLdouble params[4] = {0.0,0.0,0.0,0.0};
@@ -6746,13 +6754,13 @@ case 5842: { // glGetVertexAttribLdv
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5843: { // glViewportArrayv
+case 5844: { // glViewportArrayv
GLuint *first = (GLuint *) bp; bp += 4;
int *vLen = (int *) bp; bp += 4;
GLfloat * v = (GLfloat *) bp; bp += *vLen*16;
weglViewportArrayv(*first,*vLen,v);
}; break;
-case 5844: { // glViewportIndexedf
+case 5845: { // glViewportIndexedf
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat *x = (GLfloat *) bp; bp += 4;
GLfloat *y = (GLfloat *) bp; bp += 4;
@@ -6760,18 +6768,18 @@ case 5844: { // glViewportIndexedf
GLfloat *h = (GLfloat *) bp; bp += 4;
weglViewportIndexedf(*index,*x,*y,*w,*h);
}; break;
-case 5845: { // glViewportIndexedfv
+case 5846: { // glViewportIndexedfv
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat * v = (GLfloat *) bp; bp += 16;
weglViewportIndexedfv(*index,v);
}; break;
-case 5846: { // glScissorArrayv
+case 5847: { // glScissorArrayv
GLuint *first = (GLuint *) bp; bp += 4;
int *vLen = (int *) bp; bp += 4;
GLint * v = (GLint *) bp; bp += *vLen*16;
weglScissorArrayv(*first,*vLen,v);
}; break;
-case 5847: { // glScissorIndexed
+case 5848: { // glScissorIndexed
GLuint *index = (GLuint *) bp; bp += 4;
GLint *left = (GLint *) bp; bp += 4;
GLint *bottom = (GLint *) bp; bp += 4;
@@ -6779,26 +6787,26 @@ case 5847: { // glScissorIndexed
GLsizei *height = (GLsizei *) bp; bp += 4;
weglScissorIndexed(*index,*left,*bottom,*width,*height);
}; break;
-case 5848: { // glScissorIndexedv
+case 5849: { // glScissorIndexedv
GLuint *index = (GLuint *) bp; bp += 4;
GLint * v = (GLint *) bp; bp += 16;
weglScissorIndexedv(*index,v);
}; break;
-case 5849: { // glDepthRangeArrayv
+case 5850: { // glDepthRangeArrayv
GLuint *first = (GLuint *) bp; bp += 4;
bp += 4;
int *vLen = (int *) bp; bp += 8;
GLclampd * v = (GLclampd *) bp; bp += *vLen*16;
weglDepthRangeArrayv(*first,*vLen,v);
}; break;
-case 5850: { // glDepthRangeIndexed
+case 5851: { // glDepthRangeIndexed
GLuint *index = (GLuint *) bp; bp += 4;
bp += 4;
GLclampd *n = (GLclampd *) bp; bp += 8;
GLclampd *f = (GLclampd *) bp; bp += 8;
weglDepthRangeIndexed(*index,*n,*f);
}; break;
-case 5851: { // glGetFloati_v
+case 5852: { // glGetFloati_v
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLfloat data[16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
@@ -6827,7 +6835,7 @@ case 5851: { // glGetFloati_v
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5852: { // glGetDoublei_v
+case 5853: { // glGetDoublei_v
GLenum *target = (GLenum *) bp; bp += 4;
GLuint *index = (GLuint *) bp; bp += 4;
GLdouble data[16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
@@ -6855,16 +6863,16 @@ case 5852: { // glGetDoublei_v
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5853: { // glDebugMessageControlARB
+case 5854: { // glDebugMessageControlARB
GLenum *source = (GLenum *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
GLenum *severity = (GLenum *) bp; bp += 4;
int * idsLen = (int *) bp; bp += 4;
- GLuint * ids = (GLuint *) bp; bp += (8-((*idsLen*4+0)%8))%8;
+ GLuint * ids = (GLuint *) bp; bp += *idsLen*4 + (8-((*idsLen*4+0)%8))%8;
GLboolean *enabled = (GLboolean *) bp; bp += 1;
weglDebugMessageControlARB(*source,*type,*severity,*idsLen,ids,*enabled);
}; break;
-case 5854: { // glDebugMessageInsertARB
+case 5855: { // glDebugMessageInsertARB
GLenum *source = (GLenum *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
GLuint *id = (GLuint *) bp; bp += 4;
@@ -6873,7 +6881,7 @@ case 5854: { // glDebugMessageInsertARB
int bufLen[1] = {(int)strlen((char *)buf)}; bp += bufLen[0]+1+((8-((1+bufLen[0]+0)%8))%8);
weglDebugMessageInsertARB(*source,*type,*id,*severity,*bufLen,buf);
}; break;
-case 5855: { // glGetDebugMessageLogARB
+case 5856: { // glGetDebugMessageLogARB
GLuint *count = (GLuint *) bp; bp += 4;
GLsizei *bufsize = (GLsizei *) bp; bp += 4;
GLenum *sources;
@@ -6920,7 +6928,7 @@ case 5855: { // glGetDebugMessageLogARB
driver_free(types);
driver_free(sources);
}; break;
-case 5856: { // glGetGraphicsResetStatusARB
+case 5857: { // glGetGraphicsResetStatusARB
GLenum result = weglGetGraphicsResetStatusARB();
int AP = 0; ErlDrvTermData rt[6];
rt[AP++]=ERL_DRV_ATOM; rt[AP++]=driver_mk_atom((char *) "_egl_result_");
@@ -6928,7 +6936,7 @@ case 5856: { // glGetGraphicsResetStatusARB
rt[AP++] = ERL_DRV_TUPLE; rt[AP++] = 2;
driver_send_term(port,caller,rt,AP);
}; break;
-case 5857: { // glDrawArraysInstancedBaseInstance
+case 5858: { // glDrawArraysInstancedBaseInstance
GLenum *mode = (GLenum *) bp; bp += 4;
GLint *first = (GLint *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
@@ -6936,7 +6944,7 @@ case 5857: { // glDrawArraysInstancedBaseInstance
GLuint *baseinstance = (GLuint *) bp; bp += 4;
weglDrawArraysInstancedBaseInstance(*mode,*first,*count,*primcount,*baseinstance);
}; break;
-case 5858: { // glDrawElementsInstancedBaseInstance
+case 5859: { // glDrawElementsInstancedBaseInstance
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -6945,7 +6953,7 @@ case 5858: { // glDrawElementsInstancedBaseInstance
GLuint *baseinstance = (GLuint *) bp; bp += 4;
weglDrawElementsInstancedBaseInstance(*mode,*count,*type,indices,*primcount,*baseinstance);
}; break;
-case 5859: { // glDrawElementsInstancedBaseInstance
+case 5860: { // glDrawElementsInstancedBaseInstance
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -6954,7 +6962,7 @@ case 5859: { // glDrawElementsInstancedBaseInstance
GLuint *baseinstance = (GLuint *) bp; bp += 4;
weglDrawElementsInstancedBaseInstance(*mode,*count,*type,indices,*primcount,*baseinstance);
}; break;
-case 5860: { // glDrawElementsInstancedBaseVertexBaseInstance
+case 5861: { // glDrawElementsInstancedBaseVertexBaseInstance
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -6964,7 +6972,7 @@ case 5860: { // glDrawElementsInstancedBaseVertexBaseInstance
GLuint *baseinstance = (GLuint *) bp; bp += 4;
weglDrawElementsInstancedBaseVertexBaseInstance(*mode,*count,*type,indices,*primcount,*basevertex,*baseinstance);
}; break;
-case 5861: { // glDrawElementsInstancedBaseVertexBaseInstance
+case 5862: { // glDrawElementsInstancedBaseVertexBaseInstance
GLenum *mode = (GLenum *) bp; bp += 4;
GLsizei *count = (GLsizei *) bp; bp += 4;
GLenum *type = (GLenum *) bp; bp += 4;
@@ -6974,20 +6982,20 @@ case 5861: { // glDrawElementsInstancedBaseVertexBaseInstance
GLuint *baseinstance = (GLuint *) bp; bp += 4;
weglDrawElementsInstancedBaseVertexBaseInstance(*mode,*count,*type,indices,*primcount,*basevertex,*baseinstance);
}; break;
-case 5862: { // glDrawTransformFeedbackInstanced
+case 5863: { // glDrawTransformFeedbackInstanced
GLenum *mode = (GLenum *) bp; bp += 4;
GLuint *id = (GLuint *) bp; bp += 4;
GLsizei *primcount = (GLsizei *) bp; bp += 4;
weglDrawTransformFeedbackInstanced(*mode,*id,*primcount);
}; break;
-case 5863: { // glDrawTransformFeedbackStreamInstanced
+case 5864: { // glDrawTransformFeedbackStreamInstanced
GLenum *mode = (GLenum *) bp; bp += 4;
GLuint *id = (GLuint *) bp; bp += 4;
GLuint *stream = (GLuint *) bp; bp += 4;
GLsizei *primcount = (GLsizei *) bp; bp += 4;
weglDrawTransformFeedbackStreamInstanced(*mode,*id,*stream,*primcount);
}; break;
-case 5864: { // glGetInternalformativ
+case 5865: { // glGetInternalformativ
GLenum *target = (GLenum *) bp; bp += 4;
GLenum *internalformat = (GLenum *) bp; bp += 4;
GLenum *pname = (GLenum *) bp; bp += 4;
@@ -7006,7 +7014,7 @@ case 5864: { // glGetInternalformativ
driver_free(rt);
driver_free(params);
}; break;
-case 5865: { // glBindImageTexture
+case 5866: { // glBindImageTexture
GLuint *unit = (GLuint *) bp; bp += 4;
GLuint *texture = (GLuint *) bp; bp += 4;
GLint *level = (GLint *) bp; bp += 4;
@@ -7017,18 +7025,18 @@ case 5865: { // glBindImageTexture
GLenum *format = (GLenum *) bp; bp += 4;
weglBindImageTexture(*unit,*texture,*level,*layered,*layer,*access,*format);
}; break;
-case 5866: { // glMemoryBarrier
+case 5867: { // glMemoryBarrier
GLbitfield *barriers = (GLbitfield *) bp; bp += 4;
weglMemoryBarrier(*barriers);
}; break;
-case 5867: { // glTexStorage1D
+case 5868: { // glTexStorage1D
GLenum *target = (GLenum *) bp; bp += 4;
GLsizei *levels = (GLsizei *) bp; bp += 4;
GLenum *internalformat = (GLenum *) bp; bp += 4;
GLsizei *width = (GLsizei *) bp; bp += 4;
weglTexStorage1D(*target,*levels,*internalformat,*width);
}; break;
-case 5868: { // glTexStorage2D
+case 5869: { // glTexStorage2D
GLenum *target = (GLenum *) bp; bp += 4;
GLsizei *levels = (GLsizei *) bp; bp += 4;
GLenum *internalformat = (GLenum *) bp; bp += 4;
@@ -7036,7 +7044,7 @@ case 5868: { // glTexStorage2D
GLsizei *height = (GLsizei *) bp; bp += 4;
weglTexStorage2D(*target,*levels,*internalformat,*width,*height);
}; break;
-case 5869: { // glTexStorage3D
+case 5870: { // glTexStorage3D
GLenum *target = (GLenum *) bp; bp += 4;
GLsizei *levels = (GLsizei *) bp; bp += 4;
GLenum *internalformat = (GLenum *) bp; bp += 4;
@@ -7045,12 +7053,12 @@ case 5869: { // glTexStorage3D
GLsizei *depth = (GLsizei *) bp; bp += 4;
weglTexStorage3D(*target,*levels,*internalformat,*width,*height,*depth);
}; break;
-case 5870: { // glDepthBoundsEXT
+case 5871: { // glDepthBoundsEXT
GLclampd *zmin = (GLclampd *) bp; bp += 8;
GLclampd *zmax = (GLclampd *) bp; bp += 8;
weglDepthBoundsEXT(*zmin,*zmax);
}; break;
-case 5871: { // glStencilClearTagEXT
+case 5872: { // glStencilClearTagEXT
GLsizei *stencilTagBits = (GLsizei *) bp; bp += 4;
GLuint *stencilClearTag = (GLuint *) bp; bp += 4;
weglStencilClearTagEXT(*stencilTagBits,*stencilClearTag);
diff --git a/lib/wx/c_src/gen/wxe_events.cpp b/lib/wx/c_src/gen/wxe_events.cpp
index b6d3c2db18..01787c8a64 100644
--- a/lib/wx/c_src/gen/wxe_events.cpp
+++ b/lib/wx/c_src/gen/wxe_events.cpp
@@ -910,7 +910,7 @@ case 238: {// wxDropFilesEvent
} else {
send_res = rt.send();
if(cb->skip) event->Skip();
- if(app->recurse_level < 1) {
+ if(app->recurse_level < 1 && Etype->cID != 168) {
app->recurse_level++;
app->dispatch_cmds();
app->recurse_level--;
diff --git a/lib/wx/c_src/gen/wxe_funcs.cpp b/lib/wx/c_src/gen/wxe_funcs.cpp
index 927528fb32..5425e9f3cb 100644
--- a/lib/wx/c_src/gen/wxe_funcs.cpp
+++ b/lib/wx/c_src/gen/wxe_funcs.cpp
@@ -1716,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);
diff --git a/lib/wx/c_src/gen/wxe_macros.h b/lib/wx/c_src/gen/wxe_macros.h
index 61bf15eb05..f44fa57053 100644
--- a/lib/wx/c_src/gen/wxe_macros.h
+++ b/lib/wx/c_src/gen/wxe_macros.h
@@ -246,3184 +246,3185 @@
#define wxWindow_CanSetTransparent 286
#define wxWindow_IsDoubleBuffered 287
#define wxWindow_SetDoubleBuffered 288
-#define wxTopLevelWindow_GetIcon 289
-#define wxTopLevelWindow_GetIcons 290
-#define wxTopLevelWindow_GetTitle 291
-#define wxTopLevelWindow_IsActive 292
-#define wxTopLevelWindow_Iconize 293
-#define wxTopLevelWindow_IsFullScreen 294
-#define wxTopLevelWindow_IsIconized 295
-#define wxTopLevelWindow_IsMaximized 296
-#define wxTopLevelWindow_Maximize 297
-#define wxTopLevelWindow_RequestUserAttention 298
-#define wxTopLevelWindow_SetIcon 299
-#define wxTopLevelWindow_SetIcons 300
-#define wxTopLevelWindow_CenterOnScreen 301
-#define wxTopLevelWindow_CentreOnScreen 302
-#define wxTopLevelWindow_SetShape 304
-#define wxTopLevelWindow_SetTitle 305
-#define wxTopLevelWindow_ShowFullScreen 306
-#define wxFrame_new_4 308
-#define wxFrame_new_0 309
-#define wxFrame_destruct 311
-#define wxFrame_Create 312
-#define wxFrame_CreateStatusBar 313
-#define wxFrame_CreateToolBar 314
-#define wxFrame_GetClientAreaOrigin 315
-#define wxFrame_GetMenuBar 316
-#define wxFrame_GetStatusBar 317
-#define wxFrame_GetStatusBarPane 318
-#define wxFrame_GetToolBar 319
-#define wxFrame_ProcessCommand 320
-#define wxFrame_SendSizeEvent 321
-#define wxFrame_SetMenuBar 322
-#define wxFrame_SetStatusBar 323
-#define wxFrame_SetStatusBarPane 324
-#define wxFrame_SetStatusText 325
-#define wxFrame_SetStatusWidths 326
-#define wxFrame_SetToolBar 327
-#define wxMiniFrame_new_0 328
-#define wxMiniFrame_new_4 329
-#define wxMiniFrame_Create 330
-#define wxMiniFrame_destroy 331
-#define wxSplashScreen_new_0 332
-#define wxSplashScreen_new_6 333
-#define wxSplashScreen_destruct 334
-#define wxSplashScreen_GetSplashStyle 335
-#define wxSplashScreen_GetTimeout 336
-#define wxPanel_new_0 337
-#define wxPanel_new_6 338
-#define wxPanel_new_2 339
-#define wxPanel_destruct 340
-#define wxPanel_InitDialog 341
-#define wxPanel_SetFocusIgnoringChildren 342
-#define wxScrolledWindow_new_0 343
-#define wxScrolledWindow_new_2 344
-#define wxScrolledWindow_destruct 345
-#define wxScrolledWindow_CalcScrolledPosition_4 346
-#define wxScrolledWindow_CalcScrolledPosition_1 347
-#define wxScrolledWindow_CalcUnscrolledPosition_4 348
-#define wxScrolledWindow_CalcUnscrolledPosition_1 349
-#define wxScrolledWindow_EnableScrolling 350
-#define wxScrolledWindow_GetScrollPixelsPerUnit 351
-#define wxScrolledWindow_GetViewStart 352
-#define wxScrolledWindow_DoPrepareDC 353
-#define wxScrolledWindow_PrepareDC 354
-#define wxScrolledWindow_Scroll 355
-#define wxScrolledWindow_SetScrollbars 356
-#define wxScrolledWindow_SetScrollRate 357
-#define wxScrolledWindow_SetTargetWindow 358
-#define wxSashWindow_new_0 359
-#define wxSashWindow_new_2 360
-#define wxSashWindow_destruct 361
-#define wxSashWindow_GetSashVisible 362
-#define wxSashWindow_GetMaximumSizeX 363
-#define wxSashWindow_GetMaximumSizeY 364
-#define wxSashWindow_GetMinimumSizeX 365
-#define wxSashWindow_GetMinimumSizeY 366
-#define wxSashWindow_SetMaximumSizeX 367
-#define wxSashWindow_SetMaximumSizeY 368
-#define wxSashWindow_SetMinimumSizeX 369
-#define wxSashWindow_SetMinimumSizeY 370
-#define wxSashWindow_SetSashVisible 371
-#define wxSashLayoutWindow_new_0 372
-#define wxSashLayoutWindow_new_2 373
-#define wxSashLayoutWindow_Create 374
-#define wxSashLayoutWindow_GetAlignment 375
-#define wxSashLayoutWindow_GetOrientation 376
-#define wxSashLayoutWindow_SetAlignment 377
-#define wxSashLayoutWindow_SetDefaultSize 378
-#define wxSashLayoutWindow_SetOrientation 379
-#define wxSashLayoutWindow_destroy 380
-#define wxGrid_new_0 381
-#define wxGrid_new_3 382
-#define wxGrid_new_4 383
-#define wxGrid_destruct 384
-#define wxGrid_AppendCols 385
-#define wxGrid_AppendRows 386
-#define wxGrid_AutoSize 387
-#define wxGrid_AutoSizeColumn 388
-#define wxGrid_AutoSizeColumns 389
-#define wxGrid_AutoSizeRow 390
-#define wxGrid_AutoSizeRows 391
-#define wxGrid_BeginBatch 392
-#define wxGrid_BlockToDeviceRect 393
-#define wxGrid_CanDragColSize 394
-#define wxGrid_CanDragRowSize 395
-#define wxGrid_CanDragGridSize 396
-#define wxGrid_CanEnableCellControl 397
-#define wxGrid_CellToRect_2 398
-#define wxGrid_CellToRect_1 399
-#define wxGrid_ClearGrid 400
-#define wxGrid_ClearSelection 401
-#define wxGrid_CreateGrid 402
-#define wxGrid_DeleteCols 403
-#define wxGrid_DeleteRows 404
-#define wxGrid_DisableCellEditControl 405
-#define wxGrid_DisableDragColSize 406
-#define wxGrid_DisableDragGridSize 407
-#define wxGrid_DisableDragRowSize 408
-#define wxGrid_EnableCellEditControl 409
-#define wxGrid_EnableDragColSize 410
-#define wxGrid_EnableDragGridSize 411
-#define wxGrid_EnableDragRowSize 412
-#define wxGrid_EnableEditing 413
-#define wxGrid_EnableGridLines 414
-#define wxGrid_EndBatch 415
-#define wxGrid_Fit 416
-#define wxGrid_ForceRefresh 417
-#define wxGrid_GetBatchCount 418
-#define wxGrid_GetCellAlignment 419
-#define wxGrid_GetCellBackgroundColour 420
-#define wxGrid_GetCellEditor 421
-#define wxGrid_GetCellFont 422
-#define wxGrid_GetCellRenderer 423
-#define wxGrid_GetCellTextColour 424
-#define wxGrid_GetCellValue_2 425
-#define wxGrid_GetCellValue_1 426
-#define wxGrid_GetColLabelAlignment 427
-#define wxGrid_GetColLabelSize 428
-#define wxGrid_GetColLabelValue 429
-#define wxGrid_GetColMinimalAcceptableWidth 430
-#define wxGrid_GetDefaultCellAlignment 431
-#define wxGrid_GetDefaultCellBackgroundColour 432
-#define wxGrid_GetDefaultCellFont 433
-#define wxGrid_GetDefaultCellTextColour 434
-#define wxGrid_GetDefaultColLabelSize 435
-#define wxGrid_GetDefaultColSize 436
-#define wxGrid_GetDefaultEditor 437
-#define wxGrid_GetDefaultEditorForCell_2 438
-#define wxGrid_GetDefaultEditorForCell_1 439
-#define wxGrid_GetDefaultEditorForType 440
-#define wxGrid_GetDefaultRenderer 441
-#define wxGrid_GetDefaultRendererForCell 442
-#define wxGrid_GetDefaultRendererForType 443
-#define wxGrid_GetDefaultRowLabelSize 444
-#define wxGrid_GetDefaultRowSize 445
-#define wxGrid_GetGridCursorCol 446
-#define wxGrid_GetGridCursorRow 447
-#define wxGrid_GetGridLineColour 448
-#define wxGrid_GridLinesEnabled 449
-#define wxGrid_GetLabelBackgroundColour 450
-#define wxGrid_GetLabelFont 451
-#define wxGrid_GetLabelTextColour 452
-#define wxGrid_GetNumberCols 453
-#define wxGrid_GetNumberRows 454
-#define wxGrid_GetOrCreateCellAttr 455
-#define wxGrid_GetRowMinimalAcceptableHeight 456
-#define wxGrid_GetRowLabelAlignment 457
-#define wxGrid_GetRowLabelSize 458
-#define wxGrid_GetRowLabelValue 459
-#define wxGrid_GetRowSize 460
-#define wxGrid_GetScrollLineX 461
-#define wxGrid_GetScrollLineY 462
-#define wxGrid_GetSelectedCells 463
-#define wxGrid_GetSelectedCols 464
-#define wxGrid_GetSelectedRows 465
-#define wxGrid_GetSelectionBackground 466
-#define wxGrid_GetSelectionBlockTopLeft 467
-#define wxGrid_GetSelectionBlockBottomRight 468
-#define wxGrid_GetSelectionForeground 469
-#define wxGrid_GetViewWidth 470
-#define wxGrid_GetGridWindow 471
-#define wxGrid_GetGridRowLabelWindow 472
-#define wxGrid_GetGridColLabelWindow 473
-#define wxGrid_GetGridCornerLabelWindow 474
-#define wxGrid_HideCellEditControl 475
-#define wxGrid_InsertCols 476
-#define wxGrid_InsertRows 477
-#define wxGrid_IsCellEditControlEnabled 478
-#define wxGrid_IsCurrentCellReadOnly 479
-#define wxGrid_IsEditable 480
-#define wxGrid_IsInSelection_2 481
-#define wxGrid_IsInSelection_1 482
-#define wxGrid_IsReadOnly 483
-#define wxGrid_IsSelection 484
-#define wxGrid_IsVisible_3 485
-#define wxGrid_IsVisible_2 486
-#define wxGrid_MakeCellVisible_2 487
-#define wxGrid_MakeCellVisible_1 488
-#define wxGrid_MoveCursorDown 489
-#define wxGrid_MoveCursorLeft 490
-#define wxGrid_MoveCursorRight 491
-#define wxGrid_MoveCursorUp 492
-#define wxGrid_MoveCursorDownBlock 493
-#define wxGrid_MoveCursorLeftBlock 494
-#define wxGrid_MoveCursorRightBlock 495
-#define wxGrid_MoveCursorUpBlock 496
-#define wxGrid_MovePageDown 497
-#define wxGrid_MovePageUp 498
-#define wxGrid_RegisterDataType 499
-#define wxGrid_SaveEditControlValue 500
-#define wxGrid_SelectAll 501
-#define wxGrid_SelectBlock_5 502
-#define wxGrid_SelectBlock_3 503
-#define wxGrid_SelectCol 504
-#define wxGrid_SelectRow 505
-#define wxGrid_SetCellAlignment_4 506
-#define wxGrid_SetCellAlignment_3 507
-#define wxGrid_SetCellAlignment_1 508
-#define wxGrid_SetCellBackgroundColour_3_0 509
-#define wxGrid_SetCellBackgroundColour_1 510
-#define wxGrid_SetCellBackgroundColour_3_1 511
-#define wxGrid_SetCellEditor 512
-#define wxGrid_SetCellFont 513
-#define wxGrid_SetCellRenderer 514
-#define wxGrid_SetCellTextColour_3_0 515
-#define wxGrid_SetCellTextColour_3_1 516
-#define wxGrid_SetCellTextColour_1 517
-#define wxGrid_SetCellValue_3_0 518
-#define wxGrid_SetCellValue_2 519
-#define wxGrid_SetCellValue_3_1 520
-#define wxGrid_SetColAttr 521
-#define wxGrid_SetColFormatBool 522
-#define wxGrid_SetColFormatNumber 523
-#define wxGrid_SetColFormatFloat 524
-#define wxGrid_SetColFormatCustom 525
-#define wxGrid_SetColLabelAlignment 526
-#define wxGrid_SetColLabelSize 527
-#define wxGrid_SetColLabelValue 528
-#define wxGrid_SetColMinimalWidth 529
-#define wxGrid_SetColMinimalAcceptableWidth 530
-#define wxGrid_SetColSize 531
-#define wxGrid_SetDefaultCellAlignment 532
-#define wxGrid_SetDefaultCellBackgroundColour 533
-#define wxGrid_SetDefaultCellFont 534
-#define wxGrid_SetDefaultCellTextColour 535
-#define wxGrid_SetDefaultEditor 536
-#define wxGrid_SetDefaultRenderer 537
-#define wxGrid_SetDefaultColSize 538
-#define wxGrid_SetDefaultRowSize 539
-#define wxGrid_SetGridCursor 540
-#define wxGrid_SetGridLineColour 541
-#define wxGrid_SetLabelBackgroundColour 542
-#define wxGrid_SetLabelFont 543
-#define wxGrid_SetLabelTextColour 544
-#define wxGrid_SetMargins 545
-#define wxGrid_SetReadOnly 546
-#define wxGrid_SetRowAttr 547
-#define wxGrid_SetRowLabelAlignment 548
-#define wxGrid_SetRowLabelSize 549
-#define wxGrid_SetRowLabelValue 550
-#define wxGrid_SetRowMinimalHeight 551
-#define wxGrid_SetRowMinimalAcceptableHeight 552
-#define wxGrid_SetRowSize 553
-#define wxGrid_SetScrollLineX 554
-#define wxGrid_SetScrollLineY 555
-#define wxGrid_SetSelectionBackground 556
-#define wxGrid_SetSelectionForeground 557
-#define wxGrid_SetSelectionMode 558
-#define wxGrid_ShowCellEditControl 559
-#define wxGrid_XToCol 560
-#define wxGrid_XToEdgeOfCol 561
-#define wxGrid_YToEdgeOfRow 562
-#define wxGrid_YToRow 563
-#define wxGridCellRenderer_Draw 564
-#define wxGridCellRenderer_GetBestSize 565
-#define wxGridCellEditor_Create 566
-#define wxGridCellEditor_IsCreated 567
-#define wxGridCellEditor_SetSize 568
-#define wxGridCellEditor_Show 569
-#define wxGridCellEditor_PaintBackground 570
-#define wxGridCellEditor_BeginEdit 571
-#define wxGridCellEditor_EndEdit 572
-#define wxGridCellEditor_Reset 573
-#define wxGridCellEditor_StartingKey 574
-#define wxGridCellEditor_StartingClick 575
-#define wxGridCellEditor_HandleReturn 576
-#define wxGridCellBoolRenderer_new 577
-#define wxGridCellBoolRenderer_destroy 578
-#define wxGridCellBoolEditor_new 579
-#define wxGridCellBoolEditor_IsTrueValue 580
-#define wxGridCellBoolEditor_UseStringValues 581
-#define wxGridCellBoolEditor_destroy 582
-#define wxGridCellFloatRenderer_new 583
-#define wxGridCellFloatRenderer_GetPrecision 584
-#define wxGridCellFloatRenderer_GetWidth 585
-#define wxGridCellFloatRenderer_SetParameters 586
-#define wxGridCellFloatRenderer_SetPrecision 587
-#define wxGridCellFloatRenderer_SetWidth 588
-#define wxGridCellFloatRenderer_destroy 589
-#define wxGridCellFloatEditor_new 590
-#define wxGridCellFloatEditor_SetParameters 591
-#define wxGridCellFloatEditor_destroy 592
-#define wxGridCellStringRenderer_new 593
-#define wxGridCellStringRenderer_destroy 594
-#define wxGridCellTextEditor_new 595
-#define wxGridCellTextEditor_SetParameters 596
-#define wxGridCellTextEditor_destroy 597
-#define wxGridCellChoiceEditor_new 599
-#define wxGridCellChoiceEditor_SetParameters 600
-#define wxGridCellChoiceEditor_destroy 601
-#define wxGridCellNumberRenderer_new 602
-#define wxGridCellNumberRenderer_destroy 603
-#define wxGridCellNumberEditor_new 604
-#define wxGridCellNumberEditor_GetValue 605
-#define wxGridCellNumberEditor_SetParameters 606
-#define wxGridCellNumberEditor_destroy 607
-#define wxGridCellAttr_SetTextColour 608
-#define wxGridCellAttr_SetBackgroundColour 609
-#define wxGridCellAttr_SetFont 610
-#define wxGridCellAttr_SetAlignment 611
-#define wxGridCellAttr_SetReadOnly 612
-#define wxGridCellAttr_SetRenderer 613
-#define wxGridCellAttr_SetEditor 614
-#define wxGridCellAttr_HasTextColour 615
-#define wxGridCellAttr_HasBackgroundColour 616
-#define wxGridCellAttr_HasFont 617
-#define wxGridCellAttr_HasAlignment 618
-#define wxGridCellAttr_HasRenderer 619
-#define wxGridCellAttr_HasEditor 620
-#define wxGridCellAttr_GetTextColour 621
-#define wxGridCellAttr_GetBackgroundColour 622
-#define wxGridCellAttr_GetFont 623
-#define wxGridCellAttr_GetAlignment 624
-#define wxGridCellAttr_GetRenderer 625
-#define wxGridCellAttr_GetEditor 626
-#define wxGridCellAttr_IsReadOnly 627
-#define wxGridCellAttr_SetDefAttr 628
-#define wxDC_Blit 629
-#define wxDC_CalcBoundingBox 630
-#define wxDC_Clear 631
-#define wxDC_ComputeScaleAndOrigin 632
-#define wxDC_CrossHair 633
-#define wxDC_DestroyClippingRegion 634
-#define wxDC_DeviceToLogicalX 635
-#define wxDC_DeviceToLogicalXRel 636
-#define wxDC_DeviceToLogicalY 637
-#define wxDC_DeviceToLogicalYRel 638
-#define wxDC_DrawArc 639
-#define wxDC_DrawBitmap 640
-#define wxDC_DrawCheckMark 641
-#define wxDC_DrawCircle 642
-#define wxDC_DrawEllipse_2 644
-#define wxDC_DrawEllipse_1 645
-#define wxDC_DrawEllipticArc 646
-#define wxDC_DrawIcon 647
-#define wxDC_DrawLabel 648
-#define wxDC_DrawLine 649
-#define wxDC_DrawLines 650
-#define wxDC_DrawPolygon 652
-#define wxDC_DrawPoint 654
-#define wxDC_DrawRectangle_2 656
-#define wxDC_DrawRectangle_1 657
-#define wxDC_DrawRotatedText 658
-#define wxDC_DrawRoundedRectangle_3 660
-#define wxDC_DrawRoundedRectangle_2 661
-#define wxDC_DrawText 662
-#define wxDC_EndDoc 663
-#define wxDC_EndPage 664
-#define wxDC_FloodFill 665
-#define wxDC_GetBackground 666
-#define wxDC_GetBackgroundMode 667
-#define wxDC_GetBrush 668
-#define wxDC_GetCharHeight 669
-#define wxDC_GetCharWidth 670
-#define wxDC_GetClippingBox 671
-#define wxDC_GetFont 673
-#define wxDC_GetLayoutDirection 674
-#define wxDC_GetLogicalFunction 675
-#define wxDC_GetMapMode 676
-#define wxDC_GetMultiLineTextExtent_4 677
-#define wxDC_GetMultiLineTextExtent_1 678
-#define wxDC_GetPartialTextExtents 679
-#define wxDC_GetPen 680
-#define wxDC_GetPixel 681
-#define wxDC_GetPPI 682
-#define wxDC_GetSize 684
-#define wxDC_GetSizeMM 686
-#define wxDC_GetTextBackground 687
-#define wxDC_GetTextExtent_4 688
-#define wxDC_GetTextExtent_1 689
-#define wxDC_GetTextForeground 691
-#define wxDC_GetUserScale 692
-#define wxDC_GradientFillConcentric_3 693
-#define wxDC_GradientFillConcentric_4 694
-#define wxDC_GradientFillLinear 695
-#define wxDC_LogicalToDeviceX 696
-#define wxDC_LogicalToDeviceXRel 697
-#define wxDC_LogicalToDeviceY 698
-#define wxDC_LogicalToDeviceYRel 699
-#define wxDC_MaxX 700
-#define wxDC_MaxY 701
-#define wxDC_MinX 702
-#define wxDC_MinY 703
-#define wxDC_IsOk 704
-#define wxDC_ResetBoundingBox 705
-#define wxDC_SetAxisOrientation 706
-#define wxDC_SetBackground 707
-#define wxDC_SetBackgroundMode 708
-#define wxDC_SetBrush 709
-#define wxDC_SetClippingRegion_2 711
-#define wxDC_SetClippingRegion_1_1 712
-#define wxDC_SetClippingRegion_1_0 713
-#define wxDC_SetDeviceOrigin 714
-#define wxDC_SetFont 715
-#define wxDC_SetLayoutDirection 716
-#define wxDC_SetLogicalFunction 717
-#define wxDC_SetMapMode 718
-#define wxDC_SetPalette 719
-#define wxDC_SetPen 720
-#define wxDC_SetTextBackground 721
-#define wxDC_SetTextForeground 722
-#define wxDC_SetUserScale 723
-#define wxDC_StartDoc 724
-#define wxDC_StartPage 725
-#define wxMirrorDC_new 726
-#define wxMirrorDC_destroy 727
-#define wxScreenDC_new 728
-#define wxScreenDC_destruct 729
-#define wxPostScriptDC_new_0 730
-#define wxPostScriptDC_new_1 731
-#define wxPostScriptDC_destruct 732
-#define wxPostScriptDC_SetResolution 733
-#define wxPostScriptDC_GetResolution 734
-#define wxWindowDC_new_0 735
-#define wxWindowDC_new_1 736
-#define wxWindowDC_destruct 737
-#define wxClientDC_new_0 738
-#define wxClientDC_new_1 739
-#define wxClientDC_destroy 740
-#define wxPaintDC_new_0 741
-#define wxPaintDC_new_1 742
-#define wxPaintDC_destroy 743
-#define wxMemoryDC_new_1_0 745
-#define wxMemoryDC_new_1_1 746
-#define wxMemoryDC_new_0 747
-#define wxMemoryDC_destruct 749
-#define wxMemoryDC_SelectObject 750
-#define wxMemoryDC_SelectObjectAsSource 751
-#define wxBufferedDC_new_0 752
-#define wxBufferedDC_new_2 753
-#define wxBufferedDC_new_3 754
-#define wxBufferedDC_destruct 755
-#define wxBufferedDC_Init_2 756
-#define wxBufferedDC_Init_3 757
-#define wxBufferedPaintDC_new_3 758
-#define wxBufferedPaintDC_new_2 759
-#define wxBufferedPaintDC_destruct 760
-#define wxGraphicsObject_destruct 761
-#define wxGraphicsObject_GetRenderer 762
-#define wxGraphicsObject_IsNull 763
-#define wxGraphicsContext_destruct 764
-#define wxGraphicsContext_Create_1_1 765
-#define wxGraphicsContext_Create_1_0 766
-#define wxGraphicsContext_Create_0 767
-#define wxGraphicsContext_CreatePen 768
-#define wxGraphicsContext_CreateBrush 769
-#define wxGraphicsContext_CreateRadialGradientBrush 770
-#define wxGraphicsContext_CreateLinearGradientBrush 771
-#define wxGraphicsContext_CreateFont 772
-#define wxGraphicsContext_CreateMatrix 773
-#define wxGraphicsContext_CreatePath 774
-#define wxGraphicsContext_Clip_1 775
-#define wxGraphicsContext_Clip_4 776
-#define wxGraphicsContext_ResetClip 777
-#define wxGraphicsContext_DrawBitmap 778
-#define wxGraphicsContext_DrawEllipse 779
-#define wxGraphicsContext_DrawIcon 780
-#define wxGraphicsContext_DrawLines 781
-#define wxGraphicsContext_DrawPath 782
-#define wxGraphicsContext_DrawRectangle 783
-#define wxGraphicsContext_DrawRoundedRectangle 784
-#define wxGraphicsContext_DrawText_3 785
-#define wxGraphicsContext_DrawText_4_0 786
-#define wxGraphicsContext_DrawText_4_1 787
-#define wxGraphicsContext_DrawText_5 788
-#define wxGraphicsContext_FillPath 789
-#define wxGraphicsContext_StrokePath 790
-#define wxGraphicsContext_GetPartialTextExtents 791
-#define wxGraphicsContext_GetTextExtent 792
-#define wxGraphicsContext_Rotate 793
-#define wxGraphicsContext_Scale 794
-#define wxGraphicsContext_Translate 795
-#define wxGraphicsContext_GetTransform 796
-#define wxGraphicsContext_SetTransform 797
-#define wxGraphicsContext_ConcatTransform 798
-#define wxGraphicsContext_SetBrush_1_1 799
-#define wxGraphicsContext_SetBrush_1_0 800
-#define wxGraphicsContext_SetFont_1 801
-#define wxGraphicsContext_SetFont_2 802
-#define wxGraphicsContext_SetPen_1_0 803
-#define wxGraphicsContext_SetPen_1_1 804
-#define wxGraphicsContext_StrokeLine 805
-#define wxGraphicsContext_StrokeLines 806
-#define wxGraphicsMatrix_Concat 808
-#define wxGraphicsMatrix_Get 810
-#define wxGraphicsMatrix_Invert 811
-#define wxGraphicsMatrix_IsEqual 812
-#define wxGraphicsMatrix_IsIdentity 814
-#define wxGraphicsMatrix_Rotate 815
-#define wxGraphicsMatrix_Scale 816
-#define wxGraphicsMatrix_Translate 817
-#define wxGraphicsMatrix_Set 818
-#define wxGraphicsMatrix_TransformPoint 819
-#define wxGraphicsMatrix_TransformDistance 820
-#define wxGraphicsPath_MoveToPoint_2 821
-#define wxGraphicsPath_MoveToPoint_1 822
-#define wxGraphicsPath_AddArc_6 823
-#define wxGraphicsPath_AddArc_5 824
-#define wxGraphicsPath_AddArcToPoint 825
-#define wxGraphicsPath_AddCircle 826
-#define wxGraphicsPath_AddCurveToPoint_6 827
-#define wxGraphicsPath_AddCurveToPoint_3 828
-#define wxGraphicsPath_AddEllipse 829
-#define wxGraphicsPath_AddLineToPoint_2 830
-#define wxGraphicsPath_AddLineToPoint_1 831
-#define wxGraphicsPath_AddPath 832
-#define wxGraphicsPath_AddQuadCurveToPoint 833
-#define wxGraphicsPath_AddRectangle 834
-#define wxGraphicsPath_AddRoundedRectangle 835
-#define wxGraphicsPath_CloseSubpath 836
-#define wxGraphicsPath_Contains_3 837
-#define wxGraphicsPath_Contains_2 838
-#define wxGraphicsPath_GetBox 840
-#define wxGraphicsPath_GetCurrentPoint 842
-#define wxGraphicsPath_Transform 843
-#define wxGraphicsRenderer_GetDefaultRenderer 844
-#define wxGraphicsRenderer_CreateContext_1_1 845
-#define wxGraphicsRenderer_CreateContext_1_0 846
-#define wxGraphicsRenderer_CreatePen 847
-#define wxGraphicsRenderer_CreateBrush 848
-#define wxGraphicsRenderer_CreateLinearGradientBrush 849
-#define wxGraphicsRenderer_CreateRadialGradientBrush 850
-#define wxGraphicsRenderer_CreateFont 851
-#define wxGraphicsRenderer_CreateMatrix 852
-#define wxGraphicsRenderer_CreatePath 853
-#define wxMenuBar_new_1 855
-#define wxMenuBar_new_0 857
-#define wxMenuBar_destruct 859
-#define wxMenuBar_Append 860
-#define wxMenuBar_Check 861
-#define wxMenuBar_Enable_2 862
-#define wxMenuBar_Enable_1 863
-#define wxMenuBar_EnableTop 864
-#define wxMenuBar_FindMenu 865
-#define wxMenuBar_FindMenuItem 866
-#define wxMenuBar_FindItem 867
-#define wxMenuBar_GetHelpString 868
-#define wxMenuBar_GetLabel_1 869
-#define wxMenuBar_GetLabel_0 870
-#define wxMenuBar_GetLabelTop 871
-#define wxMenuBar_GetMenu 872
-#define wxMenuBar_GetMenuCount 873
-#define wxMenuBar_Insert 874
-#define wxMenuBar_IsChecked 875
-#define wxMenuBar_IsEnabled_1 876
-#define wxMenuBar_IsEnabled_0 877
-#define wxMenuBar_Remove 878
-#define wxMenuBar_Replace 879
-#define wxMenuBar_SetHelpString 880
-#define wxMenuBar_SetLabel_2 881
-#define wxMenuBar_SetLabel_1 882
-#define wxMenuBar_SetLabelTop 883
-#define wxControl_GetLabel 884
-#define wxControl_SetLabel 885
-#define wxControlWithItems_Append_1 886
-#define wxControlWithItems_Append_2 887
-#define wxControlWithItems_appendStrings_1 888
-#define wxControlWithItems_Clear 889
-#define wxControlWithItems_Delete 890
-#define wxControlWithItems_FindString 891
-#define wxControlWithItems_getClientData 892
-#define wxControlWithItems_setClientData 893
-#define wxControlWithItems_GetCount 894
-#define wxControlWithItems_GetSelection 895
-#define wxControlWithItems_GetString 896
-#define wxControlWithItems_GetStringSelection 897
-#define wxControlWithItems_Insert_2 898
-#define wxControlWithItems_Insert_3 899
-#define wxControlWithItems_IsEmpty 900
-#define wxControlWithItems_Select 901
-#define wxControlWithItems_SetSelection 902
-#define wxControlWithItems_SetString 903
-#define wxControlWithItems_SetStringSelection 904
-#define wxMenu_new_2 907
-#define wxMenu_new_1 908
-#define wxMenu_destruct 910
-#define wxMenu_Append_3 911
-#define wxMenu_Append_1 912
-#define wxMenu_Append_4_0 913
-#define wxMenu_Append_4_1 914
-#define wxMenu_AppendCheckItem 915
-#define wxMenu_AppendRadioItem 916
-#define wxMenu_AppendSeparator 917
-#define wxMenu_Break 918
-#define wxMenu_Check 919
-#define wxMenu_Delete_1_0 920
-#define wxMenu_Delete_1_1 921
-#define wxMenu_Destroy_1_0 922
-#define wxMenu_Destroy_1_1 923
-#define wxMenu_Enable 924
-#define wxMenu_FindItem_1 925
-#define wxMenu_FindItem_2 926
-#define wxMenu_FindItemByPosition 927
-#define wxMenu_GetHelpString 928
-#define wxMenu_GetLabel 929
-#define wxMenu_GetMenuItemCount 930
-#define wxMenu_GetMenuItems 931
-#define wxMenu_GetTitle 933
-#define wxMenu_Insert_2 934
-#define wxMenu_Insert_3 935
-#define wxMenu_Insert_5_1 936
-#define wxMenu_Insert_5_0 937
-#define wxMenu_InsertCheckItem 938
-#define wxMenu_InsertRadioItem 939
-#define wxMenu_InsertSeparator 940
-#define wxMenu_IsChecked 941
-#define wxMenu_IsEnabled 942
-#define wxMenu_Prepend_1 943
-#define wxMenu_Prepend_2 944
-#define wxMenu_Prepend_4_1 945
-#define wxMenu_Prepend_4_0 946
-#define wxMenu_PrependCheckItem 947
-#define wxMenu_PrependRadioItem 948
-#define wxMenu_PrependSeparator 949
-#define wxMenu_Remove_1_0 950
-#define wxMenu_Remove_1_1 951
-#define wxMenu_SetHelpString 952
-#define wxMenu_SetLabel 953
-#define wxMenu_SetTitle 954
-#define wxMenuItem_new 955
-#define wxMenuItem_destruct 957
-#define wxMenuItem_Check 958
-#define wxMenuItem_Enable 959
-#define wxMenuItem_GetBitmap 960
-#define wxMenuItem_GetHelp 961
-#define wxMenuItem_GetId 962
-#define wxMenuItem_GetKind 963
-#define wxMenuItem_GetLabel 964
-#define wxMenuItem_GetLabelFromText 965
-#define wxMenuItem_GetMenu 966
-#define wxMenuItem_GetText 967
-#define wxMenuItem_GetSubMenu 968
-#define wxMenuItem_IsCheckable 969
-#define wxMenuItem_IsChecked 970
-#define wxMenuItem_IsEnabled 971
-#define wxMenuItem_IsSeparator 972
-#define wxMenuItem_IsSubMenu 973
-#define wxMenuItem_SetBitmap 974
-#define wxMenuItem_SetHelp 975
-#define wxMenuItem_SetMenu 976
-#define wxMenuItem_SetSubMenu 977
-#define wxMenuItem_SetText 978
-#define wxToolBar_AddControl 979
-#define wxToolBar_AddSeparator 980
-#define wxToolBar_AddTool_5 981
-#define wxToolBar_AddTool_4_0 982
-#define wxToolBar_AddTool_1 983
-#define wxToolBar_AddTool_4_1 984
-#define wxToolBar_AddTool_3 985
-#define wxToolBar_AddTool_6 986
-#define wxToolBar_AddCheckTool 987
-#define wxToolBar_AddRadioTool 988
-#define wxToolBar_AddStretchableSpace 989
-#define wxToolBar_InsertStretchableSpace 990
-#define wxToolBar_DeleteTool 991
-#define wxToolBar_DeleteToolByPos 992
-#define wxToolBar_EnableTool 993
-#define wxToolBar_FindById 994
-#define wxToolBar_FindControl 995
-#define wxToolBar_FindToolForPosition 996
-#define wxToolBar_GetToolSize 997
-#define wxToolBar_GetToolBitmapSize 998
-#define wxToolBar_GetMargins 999
-#define wxToolBar_GetToolEnabled 1000
-#define wxToolBar_GetToolLongHelp 1001
-#define wxToolBar_GetToolPacking 1002
-#define wxToolBar_GetToolPos 1003
-#define wxToolBar_GetToolSeparation 1004
-#define wxToolBar_GetToolShortHelp 1005
-#define wxToolBar_GetToolState 1006
-#define wxToolBar_InsertControl 1007
-#define wxToolBar_InsertSeparator 1008
-#define wxToolBar_InsertTool_5 1009
-#define wxToolBar_InsertTool_2 1010
-#define wxToolBar_InsertTool_4 1011
-#define wxToolBar_Realize 1012
-#define wxToolBar_RemoveTool 1013
-#define wxToolBar_SetMargins 1014
-#define wxToolBar_SetToolBitmapSize 1015
-#define wxToolBar_SetToolLongHelp 1016
-#define wxToolBar_SetToolPacking 1017
-#define wxToolBar_SetToolShortHelp 1018
-#define wxToolBar_SetToolSeparation 1019
-#define wxToolBar_ToggleTool 1020
-#define wxStatusBar_new_0 1022
-#define wxStatusBar_new_2 1023
-#define wxStatusBar_destruct 1025
-#define wxStatusBar_Create 1026
-#define wxStatusBar_GetFieldRect 1027
-#define wxStatusBar_GetFieldsCount 1028
-#define wxStatusBar_GetStatusText 1029
-#define wxStatusBar_PopStatusText 1030
-#define wxStatusBar_PushStatusText 1031
-#define wxStatusBar_SetFieldsCount 1032
-#define wxStatusBar_SetMinHeight 1033
-#define wxStatusBar_SetStatusText 1034
-#define wxStatusBar_SetStatusWidths 1035
-#define wxStatusBar_SetStatusStyles 1036
-#define wxBitmap_new_0 1037
-#define wxBitmap_new_3 1038
-#define wxBitmap_new_4 1039
-#define wxBitmap_new_2_0 1040
-#define wxBitmap_new_2_1 1041
-#define wxBitmap_destruct 1042
-#define wxBitmap_ConvertToImage 1043
-#define wxBitmap_CopyFromIcon 1044
-#define wxBitmap_Create 1045
-#define wxBitmap_GetDepth 1046
-#define wxBitmap_GetHeight 1047
-#define wxBitmap_GetPalette 1048
-#define wxBitmap_GetMask 1049
-#define wxBitmap_GetWidth 1050
-#define wxBitmap_GetSubBitmap 1051
-#define wxBitmap_LoadFile 1052
-#define wxBitmap_Ok 1053
-#define wxBitmap_SaveFile 1054
-#define wxBitmap_SetDepth 1055
-#define wxBitmap_SetHeight 1056
-#define wxBitmap_SetMask 1057
-#define wxBitmap_SetPalette 1058
-#define wxBitmap_SetWidth 1059
-#define wxIcon_new_0 1060
-#define wxIcon_new_2 1061
-#define wxIcon_new_1 1062
-#define wxIcon_CopyFromBitmap 1063
-#define wxIcon_destroy 1064
-#define wxIconBundle_new_0 1065
-#define wxIconBundle_new_2 1066
-#define wxIconBundle_new_1_0 1067
-#define wxIconBundle_new_1_1 1068
-#define wxIconBundle_destruct 1069
-#define wxIconBundle_AddIcon_2 1070
-#define wxIconBundle_AddIcon_1 1071
-#define wxIconBundle_GetIcon_1_1 1072
-#define wxIconBundle_GetIcon_1_0 1073
-#define wxCursor_new_0 1074
-#define wxCursor_new_1_0 1075
-#define wxCursor_new_1_1 1076
-#define wxCursor_new_4 1077
-#define wxCursor_destruct 1078
-#define wxCursor_Ok 1079
-#define wxMask_new_0 1080
-#define wxMask_new_2_1 1081
-#define wxMask_new_2_0 1082
-#define wxMask_new_1 1083
-#define wxMask_destruct 1084
-#define wxMask_Create_2_1 1085
-#define wxMask_Create_2_0 1086
-#define wxMask_Create_1 1087
-#define wxImage_new_0 1088
-#define wxImage_new_3_0 1089
-#define wxImage_new_4 1090
-#define wxImage_new_5 1091
-#define wxImage_new_2 1092
-#define wxImage_new_3_1 1093
-#define wxImage_Blur 1094
-#define wxImage_BlurHorizontal 1095
-#define wxImage_BlurVertical 1096
-#define wxImage_ConvertAlphaToMask 1097
-#define wxImage_ConvertToGreyscale 1098
-#define wxImage_ConvertToMono 1099
-#define wxImage_Copy 1100
-#define wxImage_Create_3 1101
-#define wxImage_Create_4 1102
-#define wxImage_Create_5 1103
-#define wxImage_Destroy 1104
-#define wxImage_FindFirstUnusedColour 1105
-#define wxImage_GetImageExtWildcard 1106
-#define wxImage_GetAlpha_2 1107
-#define wxImage_GetAlpha_0 1108
-#define wxImage_GetBlue 1109
-#define wxImage_GetData 1110
-#define wxImage_GetGreen 1111
-#define wxImage_GetImageCount 1112
-#define wxImage_GetHeight 1113
-#define wxImage_GetMaskBlue 1114
-#define wxImage_GetMaskGreen 1115
-#define wxImage_GetMaskRed 1116
-#define wxImage_GetOrFindMaskColour 1117
-#define wxImage_GetPalette 1118
-#define wxImage_GetRed 1119
-#define wxImage_GetSubImage 1120
-#define wxImage_GetWidth 1121
-#define wxImage_HasAlpha 1122
-#define wxImage_HasMask 1123
-#define wxImage_GetOption 1124
-#define wxImage_GetOptionInt 1125
-#define wxImage_HasOption 1126
-#define wxImage_InitAlpha 1127
-#define wxImage_InitStandardHandlers 1128
-#define wxImage_IsTransparent 1129
-#define wxImage_LoadFile_2 1130
-#define wxImage_LoadFile_3 1131
-#define wxImage_Ok 1132
-#define wxImage_RemoveHandler 1133
-#define wxImage_Mirror 1134
-#define wxImage_Replace 1135
-#define wxImage_Rescale 1136
-#define wxImage_Resize 1137
-#define wxImage_Rotate 1138
-#define wxImage_RotateHue 1139
-#define wxImage_Rotate90 1140
-#define wxImage_SaveFile_1 1141
-#define wxImage_SaveFile_2_0 1142
-#define wxImage_SaveFile_2_1 1143
-#define wxImage_Scale 1144
-#define wxImage_Size 1145
-#define wxImage_SetAlpha_3 1146
-#define wxImage_SetAlpha_2 1147
-#define wxImage_SetData_2 1148
-#define wxImage_SetData_4 1149
-#define wxImage_SetMask 1150
-#define wxImage_SetMaskColour 1151
-#define wxImage_SetMaskFromImage 1152
-#define wxImage_SetOption_2_1 1153
-#define wxImage_SetOption_2_0 1154
-#define wxImage_SetPalette 1155
-#define wxImage_SetRGB_5 1156
-#define wxImage_SetRGB_4 1157
-#define wxImage_destroy 1158
-#define wxBrush_new_0 1159
-#define wxBrush_new_2 1160
-#define wxBrush_new_1 1161
-#define wxBrush_destruct 1163
-#define wxBrush_GetColour 1164
-#define wxBrush_GetStipple 1165
-#define wxBrush_GetStyle 1166
-#define wxBrush_IsHatch 1167
-#define wxBrush_IsOk 1168
-#define wxBrush_SetColour_1 1169
-#define wxBrush_SetColour_3 1170
-#define wxBrush_SetStipple 1171
-#define wxBrush_SetStyle 1172
-#define wxPen_new_0 1173
-#define wxPen_new_2 1174
-#define wxPen_destruct 1175
-#define wxPen_GetCap 1176
-#define wxPen_GetColour 1177
-#define wxPen_GetJoin 1178
-#define wxPen_GetStyle 1179
-#define wxPen_GetWidth 1180
-#define wxPen_IsOk 1181
-#define wxPen_SetCap 1182
-#define wxPen_SetColour_1 1183
-#define wxPen_SetColour_3 1184
-#define wxPen_SetJoin 1185
-#define wxPen_SetStyle 1186
-#define wxPen_SetWidth 1187
-#define wxRegion_new_0 1188
-#define wxRegion_new_4 1189
-#define wxRegion_new_2 1190
-#define wxRegion_new_1_1 1191
-#define wxRegion_new_1_0 1193
-#define wxRegion_destruct 1195
-#define wxRegion_Clear 1196
-#define wxRegion_Contains_2 1197
-#define wxRegion_Contains_1_0 1198
-#define wxRegion_Contains_4 1199
-#define wxRegion_Contains_1_1 1200
-#define wxRegion_ConvertToBitmap 1201
-#define wxRegion_GetBox 1202
-#define wxRegion_Intersect_4 1203
-#define wxRegion_Intersect_1_1 1204
-#define wxRegion_Intersect_1_0 1205
-#define wxRegion_IsEmpty 1206
-#define wxRegion_Subtract_4 1207
-#define wxRegion_Subtract_1_1 1208
-#define wxRegion_Subtract_1_0 1209
-#define wxRegion_Offset_2 1210
-#define wxRegion_Offset_1 1211
-#define wxRegion_Union_4 1212
-#define wxRegion_Union_1_2 1213
-#define wxRegion_Union_1_1 1214
-#define wxRegion_Union_1_0 1215
-#define wxRegion_Union_3 1216
-#define wxRegion_Xor_4 1217
-#define wxRegion_Xor_1_1 1218
-#define wxRegion_Xor_1_0 1219
-#define wxAcceleratorTable_new_0 1220
-#define wxAcceleratorTable_new_2 1221
-#define wxAcceleratorTable_destruct 1222
-#define wxAcceleratorTable_Ok 1223
-#define wxAcceleratorEntry_new_1_0 1224
-#define wxAcceleratorEntry_new_1_1 1225
-#define wxAcceleratorEntry_GetCommand 1226
-#define wxAcceleratorEntry_GetFlags 1227
-#define wxAcceleratorEntry_GetKeyCode 1228
-#define wxAcceleratorEntry_Set 1229
-#define wxAcceleratorEntry_destroy 1230
-#define wxCaret_new_3 1235
-#define wxCaret_new_2 1236
-#define wxCaret_destruct 1238
-#define wxCaret_Create_3 1239
-#define wxCaret_Create_2 1240
-#define wxCaret_GetBlinkTime 1241
-#define wxCaret_GetPosition 1243
-#define wxCaret_GetSize 1245
-#define wxCaret_GetWindow 1246
-#define wxCaret_Hide 1247
-#define wxCaret_IsOk 1248
-#define wxCaret_IsVisible 1249
-#define wxCaret_Move_2 1250
-#define wxCaret_Move_1 1251
-#define wxCaret_SetBlinkTime 1252
-#define wxCaret_SetSize_2 1253
-#define wxCaret_SetSize_1 1254
-#define wxCaret_Show 1255
-#define wxSizer_Add_2_1 1256
-#define wxSizer_Add_2_0 1257
-#define wxSizer_Add_3 1258
-#define wxSizer_Add_2_3 1259
-#define wxSizer_Add_2_2 1260
-#define wxSizer_AddSpacer 1261
-#define wxSizer_AddStretchSpacer 1262
-#define wxSizer_CalcMin 1263
-#define wxSizer_Clear 1264
-#define wxSizer_Detach_1_2 1265
-#define wxSizer_Detach_1_1 1266
-#define wxSizer_Detach_1_0 1267
-#define wxSizer_Fit 1268
-#define wxSizer_FitInside 1269
-#define wxSizer_GetChildren 1270
-#define wxSizer_GetItem_2_1 1271
-#define wxSizer_GetItem_2_0 1272
-#define wxSizer_GetItem_1 1273
-#define wxSizer_GetSize 1274
-#define wxSizer_GetPosition 1275
-#define wxSizer_GetMinSize 1276
-#define wxSizer_Hide_2_0 1277
-#define wxSizer_Hide_2_1 1278
-#define wxSizer_Hide_1 1279
-#define wxSizer_Insert_3_1 1280
-#define wxSizer_Insert_3_0 1281
-#define wxSizer_Insert_4 1282
-#define wxSizer_Insert_3_3 1283
-#define wxSizer_Insert_3_2 1284
-#define wxSizer_Insert_2 1285
-#define wxSizer_InsertSpacer 1286
-#define wxSizer_InsertStretchSpacer 1287
-#define wxSizer_IsShown_1_2 1288
-#define wxSizer_IsShown_1_1 1289
-#define wxSizer_IsShown_1_0 1290
-#define wxSizer_Layout 1291
-#define wxSizer_Prepend_2_1 1292
-#define wxSizer_Prepend_2_0 1293
-#define wxSizer_Prepend_3 1294
-#define wxSizer_Prepend_2_3 1295
-#define wxSizer_Prepend_2_2 1296
-#define wxSizer_Prepend_1 1297
-#define wxSizer_PrependSpacer 1298
-#define wxSizer_PrependStretchSpacer 1299
-#define wxSizer_RecalcSizes 1300
-#define wxSizer_Remove_1_1 1301
-#define wxSizer_Remove_1_0 1302
-#define wxSizer_Replace_3_1 1303
-#define wxSizer_Replace_3_0 1304
-#define wxSizer_Replace_2 1305
-#define wxSizer_SetDimension 1306
-#define wxSizer_SetMinSize_2 1307
-#define wxSizer_SetMinSize_1 1308
-#define wxSizer_SetItemMinSize_3_2 1309
-#define wxSizer_SetItemMinSize_2_2 1310
-#define wxSizer_SetItemMinSize_3_1 1311
-#define wxSizer_SetItemMinSize_2_1 1312
-#define wxSizer_SetItemMinSize_3_0 1313
-#define wxSizer_SetItemMinSize_2_0 1314
-#define wxSizer_SetSizeHints 1315
-#define wxSizer_SetVirtualSizeHints 1316
-#define wxSizer_Show_2_2 1317
-#define wxSizer_Show_2_1 1318
-#define wxSizer_Show_2_0 1319
-#define wxSizer_Show_1 1320
-#define wxSizerFlags_new 1321
-#define wxSizerFlags_Align 1322
-#define wxSizerFlags_Border_2 1323
-#define wxSizerFlags_Border_1 1324
-#define wxSizerFlags_Center 1325
-#define wxSizerFlags_Centre 1326
-#define wxSizerFlags_Expand 1327
-#define wxSizerFlags_Left 1328
-#define wxSizerFlags_Proportion 1329
-#define wxSizerFlags_Right 1330
-#define wxSizerFlags_destroy 1331
-#define wxSizerItem_new_5_1 1332
-#define wxSizerItem_new_2_1 1333
-#define wxSizerItem_new_5_0 1334
-#define wxSizerItem_new_2_0 1335
-#define wxSizerItem_new_6 1336
-#define wxSizerItem_new_3 1337
-#define wxSizerItem_new_0 1338
-#define wxSizerItem_destruct 1339
-#define wxSizerItem_CalcMin 1340
-#define wxSizerItem_DeleteWindows 1341
-#define wxSizerItem_DetachSizer 1342
-#define wxSizerItem_GetBorder 1343
-#define wxSizerItem_GetFlag 1344
-#define wxSizerItem_GetMinSize 1345
-#define wxSizerItem_GetPosition 1346
-#define wxSizerItem_GetProportion 1347
-#define wxSizerItem_GetRatio 1348
-#define wxSizerItem_GetRect 1349
-#define wxSizerItem_GetSize 1350
-#define wxSizerItem_GetSizer 1351
-#define wxSizerItem_GetSpacer 1352
-#define wxSizerItem_GetUserData 1353
-#define wxSizerItem_GetWindow 1354
-#define wxSizerItem_IsSizer 1355
-#define wxSizerItem_IsShown 1356
-#define wxSizerItem_IsSpacer 1357
-#define wxSizerItem_IsWindow 1358
-#define wxSizerItem_SetBorder 1359
-#define wxSizerItem_SetDimension 1360
-#define wxSizerItem_SetFlag 1361
-#define wxSizerItem_SetInitSize 1362
-#define wxSizerItem_SetMinSize_1 1363
-#define wxSizerItem_SetMinSize_2 1364
-#define wxSizerItem_SetProportion 1365
-#define wxSizerItem_SetRatio_2 1366
-#define wxSizerItem_SetRatio_1_1 1367
-#define wxSizerItem_SetRatio_1_0 1368
-#define wxSizerItem_SetSizer 1369
-#define wxSizerItem_SetSpacer_1 1370
-#define wxSizerItem_SetSpacer_2 1371
-#define wxSizerItem_SetWindow 1372
-#define wxSizerItem_Show 1373
-#define wxBoxSizer_new 1374
-#define wxBoxSizer_GetOrientation 1375
-#define wxBoxSizer_destroy 1376
-#define wxStaticBoxSizer_new_2 1377
-#define wxStaticBoxSizer_new_3 1378
-#define wxStaticBoxSizer_GetStaticBox 1379
-#define wxStaticBoxSizer_destroy 1380
-#define wxGridSizer_new_4 1381
-#define wxGridSizer_new_2 1382
-#define wxGridSizer_GetCols 1383
-#define wxGridSizer_GetHGap 1384
-#define wxGridSizer_GetRows 1385
-#define wxGridSizer_GetVGap 1386
-#define wxGridSizer_SetCols 1387
-#define wxGridSizer_SetHGap 1388
-#define wxGridSizer_SetRows 1389
-#define wxGridSizer_SetVGap 1390
-#define wxGridSizer_destroy 1391
-#define wxFlexGridSizer_new_4 1392
-#define wxFlexGridSizer_new_2 1393
-#define wxFlexGridSizer_AddGrowableCol 1394
-#define wxFlexGridSizer_AddGrowableRow 1395
-#define wxFlexGridSizer_GetFlexibleDirection 1396
-#define wxFlexGridSizer_GetNonFlexibleGrowMode 1397
-#define wxFlexGridSizer_RemoveGrowableCol 1398
-#define wxFlexGridSizer_RemoveGrowableRow 1399
-#define wxFlexGridSizer_SetFlexibleDirection 1400
-#define wxFlexGridSizer_SetNonFlexibleGrowMode 1401
-#define wxFlexGridSizer_destroy 1402
-#define wxGridBagSizer_new 1403
-#define wxGridBagSizer_Add_3_2 1404
-#define wxGridBagSizer_Add_3_1 1405
-#define wxGridBagSizer_Add_4 1406
-#define wxGridBagSizer_Add_1_0 1407
-#define wxGridBagSizer_Add_2_1 1408
-#define wxGridBagSizer_Add_2_0 1409
-#define wxGridBagSizer_Add_3_0 1410
-#define wxGridBagSizer_Add_1_1 1411
-#define wxGridBagSizer_CalcMin 1412
-#define wxGridBagSizer_CheckForIntersection_2 1413
-#define wxGridBagSizer_CheckForIntersection_3 1414
-#define wxGridBagSizer_FindItem_1_1 1415
-#define wxGridBagSizer_FindItem_1_0 1416
-#define wxGridBagSizer_FindItemAtPoint 1417
-#define wxGridBagSizer_FindItemAtPosition 1418
-#define wxGridBagSizer_FindItemWithData 1419
-#define wxGridBagSizer_GetCellSize 1420
-#define wxGridBagSizer_GetEmptyCellSize 1421
-#define wxGridBagSizer_GetItemPosition_1_2 1422
-#define wxGridBagSizer_GetItemPosition_1_1 1423
-#define wxGridBagSizer_GetItemPosition_1_0 1424
-#define wxGridBagSizer_GetItemSpan_1_2 1425
-#define wxGridBagSizer_GetItemSpan_1_1 1426
-#define wxGridBagSizer_GetItemSpan_1_0 1427
-#define wxGridBagSizer_SetEmptyCellSize 1428
-#define wxGridBagSizer_SetItemPosition_2_2 1429
-#define wxGridBagSizer_SetItemPosition_2_1 1430
-#define wxGridBagSizer_SetItemPosition_2_0 1431
-#define wxGridBagSizer_SetItemSpan_2_2 1432
-#define wxGridBagSizer_SetItemSpan_2_1 1433
-#define wxGridBagSizer_SetItemSpan_2_0 1434
-#define wxGridBagSizer_destroy 1435
-#define wxStdDialogButtonSizer_new 1436
-#define wxStdDialogButtonSizer_AddButton 1437
-#define wxStdDialogButtonSizer_Realize 1438
-#define wxStdDialogButtonSizer_SetAffirmativeButton 1439
-#define wxStdDialogButtonSizer_SetCancelButton 1440
-#define wxStdDialogButtonSizer_SetNegativeButton 1441
-#define wxStdDialogButtonSizer_destroy 1442
-#define wxFont_new_0 1443
-#define wxFont_new_1 1444
-#define wxFont_new_5 1445
-#define wxFont_destruct 1447
-#define wxFont_IsFixedWidth 1448
-#define wxFont_GetDefaultEncoding 1449
-#define wxFont_GetFaceName 1450
-#define wxFont_GetFamily 1451
-#define wxFont_GetNativeFontInfoDesc 1452
-#define wxFont_GetNativeFontInfoUserDesc 1453
-#define wxFont_GetPointSize 1454
-#define wxFont_GetStyle 1455
-#define wxFont_GetUnderlined 1456
-#define wxFont_GetWeight 1457
-#define wxFont_Ok 1458
-#define wxFont_SetDefaultEncoding 1459
-#define wxFont_SetFaceName 1460
-#define wxFont_SetFamily 1461
-#define wxFont_SetPointSize 1462
-#define wxFont_SetStyle 1463
-#define wxFont_SetUnderlined 1464
-#define wxFont_SetWeight 1465
-#define wxToolTip_Enable 1466
-#define wxToolTip_SetDelay 1467
-#define wxToolTip_new 1468
-#define wxToolTip_SetTip 1469
-#define wxToolTip_GetTip 1470
-#define wxToolTip_GetWindow 1471
-#define wxToolTip_destroy 1472
-#define wxButton_new_3 1474
-#define wxButton_new_0 1475
-#define wxButton_destruct 1476
-#define wxButton_Create 1477
-#define wxButton_GetDefaultSize 1478
-#define wxButton_SetDefault 1479
-#define wxButton_SetLabel 1480
-#define wxBitmapButton_new_4 1482
-#define wxBitmapButton_new_0 1483
-#define wxBitmapButton_Create 1484
-#define wxBitmapButton_GetBitmapDisabled 1485
-#define wxBitmapButton_GetBitmapFocus 1487
-#define wxBitmapButton_GetBitmapLabel 1489
-#define wxBitmapButton_GetBitmapSelected 1491
-#define wxBitmapButton_SetBitmapDisabled 1493
-#define wxBitmapButton_SetBitmapFocus 1494
-#define wxBitmapButton_SetBitmapLabel 1495
-#define wxBitmapButton_SetBitmapSelected 1496
-#define wxBitmapButton_destroy 1497
-#define wxToggleButton_new_0 1498
-#define wxToggleButton_new_4 1499
-#define wxToggleButton_Create 1500
-#define wxToggleButton_GetValue 1501
-#define wxToggleButton_SetValue 1502
-#define wxToggleButton_destroy 1503
-#define wxCalendarCtrl_new_0 1504
-#define wxCalendarCtrl_new_3 1505
-#define wxCalendarCtrl_Create 1506
-#define wxCalendarCtrl_destruct 1507
-#define wxCalendarCtrl_SetDate 1508
-#define wxCalendarCtrl_GetDate 1509
-#define wxCalendarCtrl_EnableYearChange 1510
-#define wxCalendarCtrl_EnableMonthChange 1511
-#define wxCalendarCtrl_EnableHolidayDisplay 1512
-#define wxCalendarCtrl_SetHeaderColours 1513
-#define wxCalendarCtrl_GetHeaderColourFg 1514
-#define wxCalendarCtrl_GetHeaderColourBg 1515
-#define wxCalendarCtrl_SetHighlightColours 1516
-#define wxCalendarCtrl_GetHighlightColourFg 1517
-#define wxCalendarCtrl_GetHighlightColourBg 1518
-#define wxCalendarCtrl_SetHolidayColours 1519
-#define wxCalendarCtrl_GetHolidayColourFg 1520
-#define wxCalendarCtrl_GetHolidayColourBg 1521
-#define wxCalendarCtrl_GetAttr 1522
-#define wxCalendarCtrl_SetAttr 1523
-#define wxCalendarCtrl_SetHoliday 1524
-#define wxCalendarCtrl_ResetAttr 1525
-#define wxCalendarCtrl_HitTest 1526
-#define wxCalendarDateAttr_new_0 1527
-#define wxCalendarDateAttr_new_2_1 1528
-#define wxCalendarDateAttr_new_2_0 1529
-#define wxCalendarDateAttr_SetTextColour 1530
-#define wxCalendarDateAttr_SetBackgroundColour 1531
-#define wxCalendarDateAttr_SetBorderColour 1532
-#define wxCalendarDateAttr_SetFont 1533
-#define wxCalendarDateAttr_SetBorder 1534
-#define wxCalendarDateAttr_SetHoliday 1535
-#define wxCalendarDateAttr_HasTextColour 1536
-#define wxCalendarDateAttr_HasBackgroundColour 1537
-#define wxCalendarDateAttr_HasBorderColour 1538
-#define wxCalendarDateAttr_HasFont 1539
-#define wxCalendarDateAttr_HasBorder 1540
-#define wxCalendarDateAttr_IsHoliday 1541
-#define wxCalendarDateAttr_GetTextColour 1542
-#define wxCalendarDateAttr_GetBackgroundColour 1543
-#define wxCalendarDateAttr_GetBorderColour 1544
-#define wxCalendarDateAttr_GetFont 1545
-#define wxCalendarDateAttr_GetBorder 1546
-#define wxCalendarDateAttr_destroy 1547
-#define wxCheckBox_new_4 1549
-#define wxCheckBox_new_0 1550
-#define wxCheckBox_Create 1551
-#define wxCheckBox_GetValue 1552
-#define wxCheckBox_Get3StateValue 1553
-#define wxCheckBox_Is3rdStateAllowedForUser 1554
-#define wxCheckBox_Is3State 1555
-#define wxCheckBox_IsChecked 1556
-#define wxCheckBox_SetValue 1557
-#define wxCheckBox_Set3StateValue 1558
-#define wxCheckBox_destroy 1559
-#define wxCheckListBox_new_0 1560
-#define wxCheckListBox_new_3 1562
-#define wxCheckListBox_Check 1563
-#define wxCheckListBox_IsChecked 1564
-#define wxCheckListBox_destroy 1565
-#define wxChoice_new_3 1568
-#define wxChoice_new_0 1569
-#define wxChoice_destruct 1571
-#define wxChoice_Create 1573
-#define wxChoice_Delete 1574
-#define wxChoice_GetColumns 1575
-#define wxChoice_SetColumns 1576
-#define wxComboBox_new_0 1577
-#define wxComboBox_new_3 1579
-#define wxComboBox_destruct 1580
-#define wxComboBox_Create 1582
-#define wxComboBox_CanCopy 1583
-#define wxComboBox_CanCut 1584
-#define wxComboBox_CanPaste 1585
-#define wxComboBox_CanRedo 1586
-#define wxComboBox_CanUndo 1587
-#define wxComboBox_Copy 1588
-#define wxComboBox_Cut 1589
-#define wxComboBox_GetInsertionPoint 1590
-#define wxComboBox_GetLastPosition 1591
-#define wxComboBox_GetValue 1592
-#define wxComboBox_Paste 1593
-#define wxComboBox_Redo 1594
-#define wxComboBox_Replace 1595
-#define wxComboBox_Remove 1596
-#define wxComboBox_SetInsertionPoint 1597
-#define wxComboBox_SetInsertionPointEnd 1598
-#define wxComboBox_SetSelection_1 1599
-#define wxComboBox_SetSelection_2 1600
-#define wxComboBox_SetValue 1601
-#define wxComboBox_Undo 1602
-#define wxGauge_new_0 1603
-#define wxGauge_new_4 1604
-#define wxGauge_Create 1605
-#define wxGauge_GetRange 1606
-#define wxGauge_GetValue 1607
-#define wxGauge_IsVertical 1608
-#define wxGauge_SetRange 1609
-#define wxGauge_SetValue 1610
-#define wxGauge_Pulse 1611
-#define wxGauge_destroy 1612
-#define wxGenericDirCtrl_new_0 1613
-#define wxGenericDirCtrl_new_2 1614
-#define wxGenericDirCtrl_destruct 1615
-#define wxGenericDirCtrl_Create 1616
-#define wxGenericDirCtrl_Init 1617
-#define wxGenericDirCtrl_CollapseTree 1618
-#define wxGenericDirCtrl_ExpandPath 1619
-#define wxGenericDirCtrl_GetDefaultPath 1620
-#define wxGenericDirCtrl_GetPath 1621
-#define wxGenericDirCtrl_GetFilePath 1622
-#define wxGenericDirCtrl_GetFilter 1623
-#define wxGenericDirCtrl_GetFilterIndex 1624
-#define wxGenericDirCtrl_GetRootId 1625
-#define wxGenericDirCtrl_GetTreeCtrl 1626
-#define wxGenericDirCtrl_ReCreateTree 1627
-#define wxGenericDirCtrl_SetDefaultPath 1628
-#define wxGenericDirCtrl_SetFilter 1629
-#define wxGenericDirCtrl_SetFilterIndex 1630
-#define wxGenericDirCtrl_SetPath 1631
-#define wxStaticBox_new_4 1633
-#define wxStaticBox_new_0 1634
-#define wxStaticBox_Create 1635
-#define wxStaticBox_destroy 1636
-#define wxStaticLine_new_2 1638
-#define wxStaticLine_new_0 1639
-#define wxStaticLine_Create 1640
-#define wxStaticLine_IsVertical 1641
-#define wxStaticLine_GetDefaultSize 1642
-#define wxStaticLine_destroy 1643
-#define wxListBox_new_3 1646
-#define wxListBox_new_0 1647
-#define wxListBox_destruct 1649
-#define wxListBox_Create 1651
-#define wxListBox_Deselect 1652
-#define wxListBox_GetSelections 1653
-#define wxListBox_InsertItems 1654
-#define wxListBox_IsSelected 1655
-#define wxListBox_Set 1656
-#define wxListBox_HitTest 1657
-#define wxListBox_SetFirstItem_1_0 1658
-#define wxListBox_SetFirstItem_1_1 1659
-#define wxListCtrl_new_0 1660
-#define wxListCtrl_new_2 1661
-#define wxListCtrl_Arrange 1662
-#define wxListCtrl_AssignImageList 1663
-#define wxListCtrl_ClearAll 1664
-#define wxListCtrl_Create 1665
-#define wxListCtrl_DeleteAllItems 1666
-#define wxListCtrl_DeleteColumn 1667
-#define wxListCtrl_DeleteItem 1668
-#define wxListCtrl_EditLabel 1669
-#define wxListCtrl_EnsureVisible 1670
-#define wxListCtrl_FindItem_3_0 1671
-#define wxListCtrl_FindItem_3_1 1672
-#define wxListCtrl_GetColumn 1673
-#define wxListCtrl_GetColumnCount 1674
-#define wxListCtrl_GetColumnWidth 1675
-#define wxListCtrl_GetCountPerPage 1676
-#define wxListCtrl_GetEditControl 1677
-#define wxListCtrl_GetImageList 1678
-#define wxListCtrl_GetItem 1679
-#define wxListCtrl_GetItemBackgroundColour 1680
-#define wxListCtrl_GetItemCount 1681
-#define wxListCtrl_GetItemData 1682
-#define wxListCtrl_GetItemFont 1683
-#define wxListCtrl_GetItemPosition 1684
-#define wxListCtrl_GetItemRect 1685
-#define wxListCtrl_GetItemSpacing 1686
-#define wxListCtrl_GetItemState 1687
-#define wxListCtrl_GetItemText 1688
-#define wxListCtrl_GetItemTextColour 1689
-#define wxListCtrl_GetNextItem 1690
-#define wxListCtrl_GetSelectedItemCount 1691
-#define wxListCtrl_GetTextColour 1692
-#define wxListCtrl_GetTopItem 1693
-#define wxListCtrl_GetViewRect 1694
-#define wxListCtrl_HitTest 1695
-#define wxListCtrl_InsertColumn_2 1696
-#define wxListCtrl_InsertColumn_3 1697
-#define wxListCtrl_InsertItem_1 1698
-#define wxListCtrl_InsertItem_2_1 1699
-#define wxListCtrl_InsertItem_2_0 1700
-#define wxListCtrl_InsertItem_3 1701
-#define wxListCtrl_RefreshItem 1702
-#define wxListCtrl_RefreshItems 1703
-#define wxListCtrl_ScrollList 1704
-#define wxListCtrl_SetBackgroundColour 1705
-#define wxListCtrl_SetColumn 1706
-#define wxListCtrl_SetColumnWidth 1707
-#define wxListCtrl_SetImageList 1708
-#define wxListCtrl_SetItem_1 1709
-#define wxListCtrl_SetItem_4 1710
-#define wxListCtrl_SetItemBackgroundColour 1711
-#define wxListCtrl_SetItemCount 1712
-#define wxListCtrl_SetItemData 1713
-#define wxListCtrl_SetItemFont 1714
-#define wxListCtrl_SetItemImage 1715
-#define wxListCtrl_SetItemColumnImage 1716
-#define wxListCtrl_SetItemPosition 1717
-#define wxListCtrl_SetItemState 1718
-#define wxListCtrl_SetItemText 1719
-#define wxListCtrl_SetItemTextColour 1720
-#define wxListCtrl_SetSingleStyle 1721
-#define wxListCtrl_SetTextColour 1722
-#define wxListCtrl_SetWindowStyleFlag 1723
-#define wxListCtrl_SortItems 1724
-#define wxListCtrl_destroy 1725
-#define wxListView_ClearColumnImage 1726
-#define wxListView_Focus 1727
-#define wxListView_GetFirstSelected 1728
-#define wxListView_GetFocusedItem 1729
-#define wxListView_GetNextSelected 1730
-#define wxListView_IsSelected 1731
-#define wxListView_Select 1732
-#define wxListView_SetColumnImage 1733
-#define wxListItem_new_0 1734
-#define wxListItem_new_1 1735
-#define wxListItem_destruct 1736
-#define wxListItem_Clear 1737
-#define wxListItem_GetAlign 1738
-#define wxListItem_GetBackgroundColour 1739
-#define wxListItem_GetColumn 1740
-#define wxListItem_GetFont 1741
-#define wxListItem_GetId 1742
-#define wxListItem_GetImage 1743
-#define wxListItem_GetMask 1744
-#define wxListItem_GetState 1745
-#define wxListItem_GetText 1746
-#define wxListItem_GetTextColour 1747
-#define wxListItem_GetWidth 1748
-#define wxListItem_SetAlign 1749
-#define wxListItem_SetBackgroundColour 1750
-#define wxListItem_SetColumn 1751
-#define wxListItem_SetFont 1752
-#define wxListItem_SetId 1753
-#define wxListItem_SetImage 1754
-#define wxListItem_SetMask 1755
-#define wxListItem_SetState 1756
-#define wxListItem_SetStateMask 1757
-#define wxListItem_SetText 1758
-#define wxListItem_SetTextColour 1759
-#define wxListItem_SetWidth 1760
-#define wxListItemAttr_new_0 1761
-#define wxListItemAttr_new_3 1762
-#define wxListItemAttr_GetBackgroundColour 1763
-#define wxListItemAttr_GetFont 1764
-#define wxListItemAttr_GetTextColour 1765
-#define wxListItemAttr_HasBackgroundColour 1766
-#define wxListItemAttr_HasFont 1767
-#define wxListItemAttr_HasTextColour 1768
-#define wxListItemAttr_SetBackgroundColour 1769
-#define wxListItemAttr_SetFont 1770
-#define wxListItemAttr_SetTextColour 1771
-#define wxListItemAttr_destroy 1772
-#define wxImageList_new_0 1773
-#define wxImageList_new_3 1774
-#define wxImageList_Add_1 1775
-#define wxImageList_Add_2_0 1776
-#define wxImageList_Add_2_1 1777
-#define wxImageList_Create 1778
-#define wxImageList_Draw 1780
-#define wxImageList_GetBitmap 1781
-#define wxImageList_GetIcon 1782
-#define wxImageList_GetImageCount 1783
-#define wxImageList_GetSize 1784
-#define wxImageList_Remove 1785
-#define wxImageList_RemoveAll 1786
-#define wxImageList_Replace_2 1787
-#define wxImageList_Replace_3 1788
-#define wxImageList_destroy 1789
-#define wxTextAttr_new_0 1790
-#define wxTextAttr_new_2 1791
-#define wxTextAttr_GetAlignment 1792
-#define wxTextAttr_GetBackgroundColour 1793
-#define wxTextAttr_GetFont 1794
-#define wxTextAttr_GetLeftIndent 1795
-#define wxTextAttr_GetLeftSubIndent 1796
-#define wxTextAttr_GetRightIndent 1797
-#define wxTextAttr_GetTabs 1798
-#define wxTextAttr_GetTextColour 1799
-#define wxTextAttr_HasBackgroundColour 1800
-#define wxTextAttr_HasFont 1801
-#define wxTextAttr_HasTextColour 1802
-#define wxTextAttr_GetFlags 1803
-#define wxTextAttr_IsDefault 1804
-#define wxTextAttr_SetAlignment 1805
-#define wxTextAttr_SetBackgroundColour 1806
-#define wxTextAttr_SetFlags 1807
-#define wxTextAttr_SetFont 1808
-#define wxTextAttr_SetLeftIndent 1809
-#define wxTextAttr_SetRightIndent 1810
-#define wxTextAttr_SetTabs 1811
-#define wxTextAttr_SetTextColour 1812
-#define wxTextAttr_destroy 1813
-#define wxTextCtrl_new_3 1815
-#define wxTextCtrl_new_0 1816
-#define wxTextCtrl_destruct 1818
-#define wxTextCtrl_AppendText 1819
-#define wxTextCtrl_CanCopy 1820
-#define wxTextCtrl_CanCut 1821
-#define wxTextCtrl_CanPaste 1822
-#define wxTextCtrl_CanRedo 1823
-#define wxTextCtrl_CanUndo 1824
-#define wxTextCtrl_Clear 1825
-#define wxTextCtrl_Copy 1826
-#define wxTextCtrl_Create 1827
-#define wxTextCtrl_Cut 1828
-#define wxTextCtrl_DiscardEdits 1829
-#define wxTextCtrl_ChangeValue 1830
-#define wxTextCtrl_EmulateKeyPress 1831
-#define wxTextCtrl_GetDefaultStyle 1832
-#define wxTextCtrl_GetInsertionPoint 1833
-#define wxTextCtrl_GetLastPosition 1834
-#define wxTextCtrl_GetLineLength 1835
-#define wxTextCtrl_GetLineText 1836
-#define wxTextCtrl_GetNumberOfLines 1837
-#define wxTextCtrl_GetRange 1838
-#define wxTextCtrl_GetSelection 1839
-#define wxTextCtrl_GetStringSelection 1840
-#define wxTextCtrl_GetStyle 1841
-#define wxTextCtrl_GetValue 1842
-#define wxTextCtrl_IsEditable 1843
-#define wxTextCtrl_IsModified 1844
-#define wxTextCtrl_IsMultiLine 1845
-#define wxTextCtrl_IsSingleLine 1846
-#define wxTextCtrl_LoadFile 1847
-#define wxTextCtrl_MarkDirty 1848
-#define wxTextCtrl_Paste 1849
-#define wxTextCtrl_PositionToXY 1850
-#define wxTextCtrl_Redo 1851
-#define wxTextCtrl_Remove 1852
-#define wxTextCtrl_Replace 1853
-#define wxTextCtrl_SaveFile 1854
-#define wxTextCtrl_SetDefaultStyle 1855
-#define wxTextCtrl_SetEditable 1856
-#define wxTextCtrl_SetInsertionPoint 1857
-#define wxTextCtrl_SetInsertionPointEnd 1858
-#define wxTextCtrl_SetMaxLength 1860
-#define wxTextCtrl_SetSelection 1861
-#define wxTextCtrl_SetStyle 1862
-#define wxTextCtrl_SetValue 1863
-#define wxTextCtrl_ShowPosition 1864
-#define wxTextCtrl_Undo 1865
-#define wxTextCtrl_WriteText 1866
-#define wxTextCtrl_XYToPosition 1867
-#define wxNotebook_new_0 1870
-#define wxNotebook_new_3 1871
-#define wxNotebook_destruct 1872
-#define wxNotebook_AddPage 1873
-#define wxNotebook_AdvanceSelection 1874
-#define wxNotebook_AssignImageList 1875
-#define wxNotebook_Create 1876
-#define wxNotebook_DeleteAllPages 1877
-#define wxNotebook_DeletePage 1878
-#define wxNotebook_RemovePage 1879
-#define wxNotebook_GetCurrentPage 1880
-#define wxNotebook_GetImageList 1881
-#define wxNotebook_GetPage 1883
-#define wxNotebook_GetPageCount 1884
-#define wxNotebook_GetPageImage 1885
-#define wxNotebook_GetPageText 1886
-#define wxNotebook_GetRowCount 1887
-#define wxNotebook_GetSelection 1888
-#define wxNotebook_GetThemeBackgroundColour 1889
-#define wxNotebook_HitTest 1891
-#define wxNotebook_InsertPage 1893
-#define wxNotebook_SetImageList 1894
-#define wxNotebook_SetPadding 1895
-#define wxNotebook_SetPageSize 1896
-#define wxNotebook_SetPageImage 1897
-#define wxNotebook_SetPageText 1898
-#define wxNotebook_SetSelection 1899
-#define wxNotebook_ChangeSelection 1900
-#define wxChoicebook_new_0 1901
-#define wxChoicebook_new_3 1902
-#define wxChoicebook_AddPage 1903
-#define wxChoicebook_AdvanceSelection 1904
-#define wxChoicebook_AssignImageList 1905
-#define wxChoicebook_Create 1906
-#define wxChoicebook_DeleteAllPages 1907
-#define wxChoicebook_DeletePage 1908
-#define wxChoicebook_RemovePage 1909
-#define wxChoicebook_GetCurrentPage 1910
-#define wxChoicebook_GetImageList 1911
-#define wxChoicebook_GetPage 1913
-#define wxChoicebook_GetPageCount 1914
-#define wxChoicebook_GetPageImage 1915
-#define wxChoicebook_GetPageText 1916
-#define wxChoicebook_GetSelection 1917
-#define wxChoicebook_HitTest 1918
-#define wxChoicebook_InsertPage 1919
-#define wxChoicebook_SetImageList 1920
-#define wxChoicebook_SetPageSize 1921
-#define wxChoicebook_SetPageImage 1922
-#define wxChoicebook_SetPageText 1923
-#define wxChoicebook_SetSelection 1924
-#define wxChoicebook_ChangeSelection 1925
-#define wxChoicebook_destroy 1926
-#define wxToolbook_new_0 1927
-#define wxToolbook_new_3 1928
-#define wxToolbook_AddPage 1929
-#define wxToolbook_AdvanceSelection 1930
-#define wxToolbook_AssignImageList 1931
-#define wxToolbook_Create 1932
-#define wxToolbook_DeleteAllPages 1933
-#define wxToolbook_DeletePage 1934
-#define wxToolbook_RemovePage 1935
-#define wxToolbook_GetCurrentPage 1936
-#define wxToolbook_GetImageList 1937
-#define wxToolbook_GetPage 1939
-#define wxToolbook_GetPageCount 1940
-#define wxToolbook_GetPageImage 1941
-#define wxToolbook_GetPageText 1942
-#define wxToolbook_GetSelection 1943
-#define wxToolbook_HitTest 1945
-#define wxToolbook_InsertPage 1946
-#define wxToolbook_SetImageList 1947
-#define wxToolbook_SetPageSize 1948
-#define wxToolbook_SetPageImage 1949
-#define wxToolbook_SetPageText 1950
-#define wxToolbook_SetSelection 1951
-#define wxToolbook_ChangeSelection 1952
-#define wxToolbook_destroy 1953
-#define wxListbook_new_0 1954
-#define wxListbook_new_3 1955
-#define wxListbook_AddPage 1956
-#define wxListbook_AdvanceSelection 1957
-#define wxListbook_AssignImageList 1958
-#define wxListbook_Create 1959
-#define wxListbook_DeleteAllPages 1960
-#define wxListbook_DeletePage 1961
-#define wxListbook_RemovePage 1962
-#define wxListbook_GetCurrentPage 1963
-#define wxListbook_GetImageList 1964
-#define wxListbook_GetPage 1966
-#define wxListbook_GetPageCount 1967
-#define wxListbook_GetPageImage 1968
-#define wxListbook_GetPageText 1969
-#define wxListbook_GetSelection 1970
-#define wxListbook_HitTest 1972
-#define wxListbook_InsertPage 1973
-#define wxListbook_SetImageList 1974
-#define wxListbook_SetPageSize 1975
-#define wxListbook_SetPageImage 1976
-#define wxListbook_SetPageText 1977
-#define wxListbook_SetSelection 1978
-#define wxListbook_ChangeSelection 1979
-#define wxListbook_destroy 1980
-#define wxTreebook_new_0 1981
-#define wxTreebook_new_3 1982
-#define wxTreebook_AddPage 1983
-#define wxTreebook_AdvanceSelection 1984
-#define wxTreebook_AssignImageList 1985
-#define wxTreebook_Create 1986
-#define wxTreebook_DeleteAllPages 1987
-#define wxTreebook_DeletePage 1988
-#define wxTreebook_RemovePage 1989
-#define wxTreebook_GetCurrentPage 1990
-#define wxTreebook_GetImageList 1991
-#define wxTreebook_GetPage 1993
-#define wxTreebook_GetPageCount 1994
-#define wxTreebook_GetPageImage 1995
-#define wxTreebook_GetPageText 1996
-#define wxTreebook_GetSelection 1997
-#define wxTreebook_ExpandNode 1998
-#define wxTreebook_IsNodeExpanded 1999
-#define wxTreebook_HitTest 2001
-#define wxTreebook_InsertPage 2002
-#define wxTreebook_InsertSubPage 2003
-#define wxTreebook_SetImageList 2004
-#define wxTreebook_SetPageSize 2005
-#define wxTreebook_SetPageImage 2006
-#define wxTreebook_SetPageText 2007
-#define wxTreebook_SetSelection 2008
-#define wxTreebook_ChangeSelection 2009
-#define wxTreebook_destroy 2010
-#define wxTreeCtrl_new_2 2013
-#define wxTreeCtrl_new_0 2014
-#define wxTreeCtrl_destruct 2016
-#define wxTreeCtrl_AddRoot 2017
-#define wxTreeCtrl_AppendItem 2018
-#define wxTreeCtrl_AssignImageList 2019
-#define wxTreeCtrl_AssignStateImageList 2020
-#define wxTreeCtrl_Collapse 2021
-#define wxTreeCtrl_CollapseAndReset 2022
-#define wxTreeCtrl_Create 2023
-#define wxTreeCtrl_Delete 2024
-#define wxTreeCtrl_DeleteAllItems 2025
-#define wxTreeCtrl_DeleteChildren 2026
-#define wxTreeCtrl_EditLabel 2027
-#define wxTreeCtrl_EnsureVisible 2028
-#define wxTreeCtrl_Expand 2029
-#define wxTreeCtrl_GetBoundingRect 2030
-#define wxTreeCtrl_GetChildrenCount 2032
-#define wxTreeCtrl_GetCount 2033
-#define wxTreeCtrl_GetEditControl 2034
-#define wxTreeCtrl_GetFirstChild 2035
-#define wxTreeCtrl_GetNextChild 2036
-#define wxTreeCtrl_GetFirstVisibleItem 2037
-#define wxTreeCtrl_GetImageList 2038
-#define wxTreeCtrl_GetIndent 2039
-#define wxTreeCtrl_GetItemBackgroundColour 2040
-#define wxTreeCtrl_GetItemData 2041
-#define wxTreeCtrl_GetItemFont 2042
-#define wxTreeCtrl_GetItemImage_1 2043
-#define wxTreeCtrl_GetItemImage_2 2044
-#define wxTreeCtrl_GetItemText 2045
-#define wxTreeCtrl_GetItemTextColour 2046
-#define wxTreeCtrl_GetLastChild 2047
-#define wxTreeCtrl_GetNextSibling 2048
-#define wxTreeCtrl_GetNextVisible 2049
-#define wxTreeCtrl_GetItemParent 2050
-#define wxTreeCtrl_GetPrevSibling 2051
-#define wxTreeCtrl_GetPrevVisible 2052
-#define wxTreeCtrl_GetRootItem 2053
-#define wxTreeCtrl_GetSelection 2054
-#define wxTreeCtrl_GetSelections 2055
-#define wxTreeCtrl_GetStateImageList 2056
-#define wxTreeCtrl_HitTest 2057
-#define wxTreeCtrl_InsertItem 2059
-#define wxTreeCtrl_IsBold 2060
-#define wxTreeCtrl_IsExpanded 2061
-#define wxTreeCtrl_IsSelected 2062
-#define wxTreeCtrl_IsVisible 2063
-#define wxTreeCtrl_ItemHasChildren 2064
-#define wxTreeCtrl_IsTreeItemIdOk 2065
-#define wxTreeCtrl_PrependItem 2066
-#define wxTreeCtrl_ScrollTo 2067
-#define wxTreeCtrl_SelectItem_1 2068
-#define wxTreeCtrl_SelectItem_2 2069
-#define wxTreeCtrl_SetIndent 2070
-#define wxTreeCtrl_SetImageList 2071
-#define wxTreeCtrl_SetItemBackgroundColour 2072
-#define wxTreeCtrl_SetItemBold 2073
-#define wxTreeCtrl_SetItemData 2074
-#define wxTreeCtrl_SetItemDropHighlight 2075
-#define wxTreeCtrl_SetItemFont 2076
-#define wxTreeCtrl_SetItemHasChildren 2077
-#define wxTreeCtrl_SetItemImage_2 2078
-#define wxTreeCtrl_SetItemImage_3 2079
-#define wxTreeCtrl_SetItemText 2080
-#define wxTreeCtrl_SetItemTextColour 2081
-#define wxTreeCtrl_SetStateImageList 2082
-#define wxTreeCtrl_SetWindowStyle 2083
-#define wxTreeCtrl_SortChildren 2084
-#define wxTreeCtrl_Toggle 2085
-#define wxTreeCtrl_ToggleItemSelection 2086
-#define wxTreeCtrl_Unselect 2087
-#define wxTreeCtrl_UnselectAll 2088
-#define wxTreeCtrl_UnselectItem 2089
-#define wxScrollBar_new_0 2090
-#define wxScrollBar_new_3 2091
-#define wxScrollBar_destruct 2092
-#define wxScrollBar_Create 2093
-#define wxScrollBar_GetRange 2094
-#define wxScrollBar_GetPageSize 2095
-#define wxScrollBar_GetThumbPosition 2096
-#define wxScrollBar_GetThumbSize 2097
-#define wxScrollBar_SetThumbPosition 2098
-#define wxScrollBar_SetScrollbar 2099
-#define wxSpinButton_new_2 2101
-#define wxSpinButton_new_0 2102
-#define wxSpinButton_Create 2103
-#define wxSpinButton_GetMax 2104
-#define wxSpinButton_GetMin 2105
-#define wxSpinButton_GetValue 2106
-#define wxSpinButton_SetRange 2107
-#define wxSpinButton_SetValue 2108
-#define wxSpinButton_destroy 2109
-#define wxSpinCtrl_new_0 2110
-#define wxSpinCtrl_new_2 2111
-#define wxSpinCtrl_Create 2113
-#define wxSpinCtrl_SetValue_1_1 2116
-#define wxSpinCtrl_SetValue_1_0 2117
-#define wxSpinCtrl_GetValue 2119
-#define wxSpinCtrl_SetRange 2121
-#define wxSpinCtrl_SetSelection 2122
-#define wxSpinCtrl_GetMin 2124
-#define wxSpinCtrl_GetMax 2126
-#define wxSpinCtrl_destroy 2127
-#define wxStaticText_new_0 2128
-#define wxStaticText_new_4 2129
-#define wxStaticText_Create 2130
-#define wxStaticText_GetLabel 2131
-#define wxStaticText_SetLabel 2132
-#define wxStaticText_Wrap 2133
-#define wxStaticText_destroy 2134
-#define wxStaticBitmap_new_0 2135
-#define wxStaticBitmap_new_4 2136
-#define wxStaticBitmap_Create 2137
-#define wxStaticBitmap_GetBitmap 2138
-#define wxStaticBitmap_SetBitmap 2139
-#define wxStaticBitmap_destroy 2140
-#define wxRadioBox_new 2141
-#define wxRadioBox_destruct 2143
-#define wxRadioBox_Create 2144
-#define wxRadioBox_Enable_2 2145
-#define wxRadioBox_Enable_1 2146
-#define wxRadioBox_GetSelection 2147
-#define wxRadioBox_GetString 2148
-#define wxRadioBox_SetSelection 2149
-#define wxRadioBox_Show_2 2150
-#define wxRadioBox_Show_1 2151
-#define wxRadioBox_GetColumnCount 2152
-#define wxRadioBox_GetItemHelpText 2153
-#define wxRadioBox_GetItemToolTip 2154
-#define wxRadioBox_GetItemFromPoint 2156
-#define wxRadioBox_GetRowCount 2157
-#define wxRadioBox_IsItemEnabled 2158
-#define wxRadioBox_IsItemShown 2159
-#define wxRadioBox_SetItemHelpText 2160
-#define wxRadioBox_SetItemToolTip 2161
-#define wxRadioButton_new_0 2162
-#define wxRadioButton_new_4 2163
-#define wxRadioButton_Create 2164
-#define wxRadioButton_GetValue 2165
-#define wxRadioButton_SetValue 2166
-#define wxRadioButton_destroy 2167
-#define wxSlider_new_6 2169
-#define wxSlider_new_0 2170
-#define wxSlider_Create 2171
-#define wxSlider_GetLineSize 2172
-#define wxSlider_GetMax 2173
-#define wxSlider_GetMin 2174
-#define wxSlider_GetPageSize 2175
-#define wxSlider_GetThumbLength 2176
-#define wxSlider_GetValue 2177
-#define wxSlider_SetLineSize 2178
-#define wxSlider_SetPageSize 2179
-#define wxSlider_SetRange 2180
-#define wxSlider_SetThumbLength 2181
-#define wxSlider_SetValue 2182
-#define wxSlider_destroy 2183
-#define wxDialog_new_4 2185
-#define wxDialog_new_0 2186
-#define wxDialog_destruct 2188
-#define wxDialog_Create 2189
-#define wxDialog_CreateButtonSizer 2190
-#define wxDialog_CreateStdDialogButtonSizer 2191
-#define wxDialog_EndModal 2192
-#define wxDialog_GetAffirmativeId 2193
-#define wxDialog_GetReturnCode 2194
-#define wxDialog_IsModal 2195
-#define wxDialog_SetAffirmativeId 2196
-#define wxDialog_SetReturnCode 2197
-#define wxDialog_Show 2198
-#define wxDialog_ShowModal 2199
-#define wxColourDialog_new_0 2200
-#define wxColourDialog_new_2 2201
-#define wxColourDialog_destruct 2202
-#define wxColourDialog_Create 2203
-#define wxColourDialog_GetColourData 2204
-#define wxColourData_new_0 2205
-#define wxColourData_new_1 2206
-#define wxColourData_destruct 2207
-#define wxColourData_GetChooseFull 2208
-#define wxColourData_GetColour 2209
-#define wxColourData_GetCustomColour 2211
-#define wxColourData_SetChooseFull 2212
-#define wxColourData_SetColour 2213
-#define wxColourData_SetCustomColour 2214
-#define wxPalette_new_0 2215
-#define wxPalette_new_4 2216
-#define wxPalette_destruct 2218
-#define wxPalette_Create 2219
-#define wxPalette_GetColoursCount 2220
-#define wxPalette_GetPixel 2221
-#define wxPalette_GetRGB 2222
-#define wxPalette_IsOk 2223
-#define wxDirDialog_new 2227
-#define wxDirDialog_destruct 2228
-#define wxDirDialog_GetPath 2229
-#define wxDirDialog_GetMessage 2230
-#define wxDirDialog_SetMessage 2231
-#define wxDirDialog_SetPath 2232
-#define wxFileDialog_new 2236
-#define wxFileDialog_destruct 2237
-#define wxFileDialog_GetDirectory 2238
-#define wxFileDialog_GetFilename 2239
-#define wxFileDialog_GetFilenames 2240
-#define wxFileDialog_GetFilterIndex 2241
-#define wxFileDialog_GetMessage 2242
-#define wxFileDialog_GetPath 2243
-#define wxFileDialog_GetPaths 2244
-#define wxFileDialog_GetWildcard 2245
-#define wxFileDialog_SetDirectory 2246
-#define wxFileDialog_SetFilename 2247
-#define wxFileDialog_SetFilterIndex 2248
-#define wxFileDialog_SetMessage 2249
-#define wxFileDialog_SetPath 2250
-#define wxFileDialog_SetWildcard 2251
-#define wxPickerBase_SetInternalMargin 2252
-#define wxPickerBase_GetInternalMargin 2253
-#define wxPickerBase_SetTextCtrlProportion 2254
-#define wxPickerBase_SetPickerCtrlProportion 2255
-#define wxPickerBase_GetTextCtrlProportion 2256
-#define wxPickerBase_GetPickerCtrlProportion 2257
-#define wxPickerBase_HasTextCtrl 2258
-#define wxPickerBase_GetTextCtrl 2259
-#define wxPickerBase_IsTextCtrlGrowable 2260
-#define wxPickerBase_SetPickerCtrlGrowable 2261
-#define wxPickerBase_SetTextCtrlGrowable 2262
-#define wxPickerBase_IsPickerCtrlGrowable 2263
-#define wxFilePickerCtrl_new_0 2264
-#define wxFilePickerCtrl_new_3 2265
-#define wxFilePickerCtrl_Create 2266
-#define wxFilePickerCtrl_GetPath 2267
-#define wxFilePickerCtrl_SetPath 2268
-#define wxFilePickerCtrl_destroy 2269
-#define wxDirPickerCtrl_new_0 2270
-#define wxDirPickerCtrl_new_3 2271
-#define wxDirPickerCtrl_Create 2272
-#define wxDirPickerCtrl_GetPath 2273
-#define wxDirPickerCtrl_SetPath 2274
-#define wxDirPickerCtrl_destroy 2275
-#define wxColourPickerCtrl_new_0 2276
-#define wxColourPickerCtrl_new_3 2277
-#define wxColourPickerCtrl_Create 2278
-#define wxColourPickerCtrl_GetColour 2279
-#define wxColourPickerCtrl_SetColour_1_1 2280
-#define wxColourPickerCtrl_SetColour_1_0 2281
-#define wxColourPickerCtrl_destroy 2282
-#define wxDatePickerCtrl_new_0 2283
-#define wxDatePickerCtrl_new_3 2284
-#define wxDatePickerCtrl_GetRange 2285
-#define wxDatePickerCtrl_GetValue 2286
-#define wxDatePickerCtrl_SetRange 2287
-#define wxDatePickerCtrl_SetValue 2288
-#define wxDatePickerCtrl_destroy 2289
-#define wxFontPickerCtrl_new_0 2290
-#define wxFontPickerCtrl_new_3 2291
-#define wxFontPickerCtrl_Create 2292
-#define wxFontPickerCtrl_GetSelectedFont 2293
-#define wxFontPickerCtrl_SetSelectedFont 2294
-#define wxFontPickerCtrl_GetMaxPointSize 2295
-#define wxFontPickerCtrl_SetMaxPointSize 2296
-#define wxFontPickerCtrl_destroy 2297
-#define wxFindReplaceDialog_new_0 2300
-#define wxFindReplaceDialog_new_4 2301
-#define wxFindReplaceDialog_destruct 2302
-#define wxFindReplaceDialog_Create 2303
-#define wxFindReplaceDialog_GetData 2304
-#define wxFindReplaceData_new_0 2305
-#define wxFindReplaceData_new_1 2306
-#define wxFindReplaceData_GetFindString 2307
-#define wxFindReplaceData_GetReplaceString 2308
-#define wxFindReplaceData_GetFlags 2309
-#define wxFindReplaceData_SetFlags 2310
-#define wxFindReplaceData_SetFindString 2311
-#define wxFindReplaceData_SetReplaceString 2312
-#define wxFindReplaceData_destroy 2313
-#define wxMultiChoiceDialog_new_0 2314
-#define wxMultiChoiceDialog_new_5 2316
-#define wxMultiChoiceDialog_GetSelections 2317
-#define wxMultiChoiceDialog_SetSelections 2318
-#define wxMultiChoiceDialog_destroy 2319
-#define wxSingleChoiceDialog_new_0 2320
-#define wxSingleChoiceDialog_new_5 2322
-#define wxSingleChoiceDialog_GetSelection 2323
-#define wxSingleChoiceDialog_GetStringSelection 2324
-#define wxSingleChoiceDialog_SetSelection 2325
-#define wxSingleChoiceDialog_destroy 2326
-#define wxTextEntryDialog_new 2327
-#define wxTextEntryDialog_GetValue 2328
-#define wxTextEntryDialog_SetValue 2329
-#define wxTextEntryDialog_destroy 2330
-#define wxPasswordEntryDialog_new 2331
-#define wxPasswordEntryDialog_destroy 2332
-#define wxFontData_new_0 2333
-#define wxFontData_new_1 2334
-#define wxFontData_destruct 2335
-#define wxFontData_EnableEffects 2336
-#define wxFontData_GetAllowSymbols 2337
-#define wxFontData_GetColour 2338
-#define wxFontData_GetChosenFont 2339
-#define wxFontData_GetEnableEffects 2340
-#define wxFontData_GetInitialFont 2341
-#define wxFontData_GetShowHelp 2342
-#define wxFontData_SetAllowSymbols 2343
-#define wxFontData_SetChosenFont 2344
-#define wxFontData_SetColour 2345
-#define wxFontData_SetInitialFont 2346
-#define wxFontData_SetRange 2347
-#define wxFontData_SetShowHelp 2348
-#define wxFontDialog_new_0 2352
-#define wxFontDialog_new_2 2354
-#define wxFontDialog_Create 2356
-#define wxFontDialog_GetFontData 2357
-#define wxFontDialog_destroy 2359
-#define wxProgressDialog_new 2360
-#define wxProgressDialog_destruct 2361
-#define wxProgressDialog_Resume 2362
-#define wxProgressDialog_Update_2 2363
-#define wxProgressDialog_Update_0 2364
-#define wxMessageDialog_new 2365
-#define wxMessageDialog_destruct 2366
-#define wxPageSetupDialog_new 2367
-#define wxPageSetupDialog_destruct 2368
-#define wxPageSetupDialog_GetPageSetupData 2369
-#define wxPageSetupDialog_ShowModal 2370
-#define wxPageSetupDialogData_new_0 2371
-#define wxPageSetupDialogData_new_1_0 2372
-#define wxPageSetupDialogData_new_1_1 2373
-#define wxPageSetupDialogData_destruct 2374
-#define wxPageSetupDialogData_EnableHelp 2375
-#define wxPageSetupDialogData_EnableMargins 2376
-#define wxPageSetupDialogData_EnableOrientation 2377
-#define wxPageSetupDialogData_EnablePaper 2378
-#define wxPageSetupDialogData_EnablePrinter 2379
-#define wxPageSetupDialogData_GetDefaultMinMargins 2380
-#define wxPageSetupDialogData_GetEnableMargins 2381
-#define wxPageSetupDialogData_GetEnableOrientation 2382
-#define wxPageSetupDialogData_GetEnablePaper 2383
-#define wxPageSetupDialogData_GetEnablePrinter 2384
-#define wxPageSetupDialogData_GetEnableHelp 2385
-#define wxPageSetupDialogData_GetDefaultInfo 2386
-#define wxPageSetupDialogData_GetMarginTopLeft 2387
-#define wxPageSetupDialogData_GetMarginBottomRight 2388
-#define wxPageSetupDialogData_GetMinMarginTopLeft 2389
-#define wxPageSetupDialogData_GetMinMarginBottomRight 2390
-#define wxPageSetupDialogData_GetPaperId 2391
-#define wxPageSetupDialogData_GetPaperSize 2392
-#define wxPageSetupDialogData_GetPrintData 2394
-#define wxPageSetupDialogData_IsOk 2395
-#define wxPageSetupDialogData_SetDefaultInfo 2396
-#define wxPageSetupDialogData_SetDefaultMinMargins 2397
-#define wxPageSetupDialogData_SetMarginTopLeft 2398
-#define wxPageSetupDialogData_SetMarginBottomRight 2399
-#define wxPageSetupDialogData_SetMinMarginTopLeft 2400
-#define wxPageSetupDialogData_SetMinMarginBottomRight 2401
-#define wxPageSetupDialogData_SetPaperId 2402
-#define wxPageSetupDialogData_SetPaperSize_1_1 2403
-#define wxPageSetupDialogData_SetPaperSize_1_0 2404
-#define wxPageSetupDialogData_SetPrintData 2405
-#define wxPrintDialog_new_2_0 2406
-#define wxPrintDialog_new_2_1 2407
-#define wxPrintDialog_destruct 2408
-#define wxPrintDialog_GetPrintDialogData 2409
-#define wxPrintDialog_GetPrintDC 2410
-#define wxPrintDialogData_new_0 2411
-#define wxPrintDialogData_new_1_1 2412
-#define wxPrintDialogData_new_1_0 2413
-#define wxPrintDialogData_destruct 2414
-#define wxPrintDialogData_EnableHelp 2415
-#define wxPrintDialogData_EnablePageNumbers 2416
-#define wxPrintDialogData_EnablePrintToFile 2417
-#define wxPrintDialogData_EnableSelection 2418
-#define wxPrintDialogData_GetAllPages 2419
-#define wxPrintDialogData_GetCollate 2420
-#define wxPrintDialogData_GetFromPage 2421
-#define wxPrintDialogData_GetMaxPage 2422
-#define wxPrintDialogData_GetMinPage 2423
-#define wxPrintDialogData_GetNoCopies 2424
-#define wxPrintDialogData_GetPrintData 2425
-#define wxPrintDialogData_GetPrintToFile 2426
-#define wxPrintDialogData_GetSelection 2427
-#define wxPrintDialogData_GetToPage 2428
-#define wxPrintDialogData_IsOk 2429
-#define wxPrintDialogData_SetCollate 2430
-#define wxPrintDialogData_SetFromPage 2431
-#define wxPrintDialogData_SetMaxPage 2432
-#define wxPrintDialogData_SetMinPage 2433
-#define wxPrintDialogData_SetNoCopies 2434
-#define wxPrintDialogData_SetPrintData 2435
-#define wxPrintDialogData_SetPrintToFile 2436
-#define wxPrintDialogData_SetSelection 2437
-#define wxPrintDialogData_SetToPage 2438
-#define wxPrintData_new_0 2439
-#define wxPrintData_new_1 2440
-#define wxPrintData_destruct 2441
-#define wxPrintData_GetCollate 2442
-#define wxPrintData_GetBin 2443
-#define wxPrintData_GetColour 2444
-#define wxPrintData_GetDuplex 2445
-#define wxPrintData_GetNoCopies 2446
-#define wxPrintData_GetOrientation 2447
-#define wxPrintData_GetPaperId 2448
-#define wxPrintData_GetPrinterName 2449
-#define wxPrintData_GetQuality 2450
-#define wxPrintData_IsOk 2451
-#define wxPrintData_SetBin 2452
-#define wxPrintData_SetCollate 2453
-#define wxPrintData_SetColour 2454
-#define wxPrintData_SetDuplex 2455
-#define wxPrintData_SetNoCopies 2456
-#define wxPrintData_SetOrientation 2457
-#define wxPrintData_SetPaperId 2458
-#define wxPrintData_SetPrinterName 2459
-#define wxPrintData_SetQuality 2460
-#define wxPrintPreview_new_2 2463
-#define wxPrintPreview_new_3 2464
-#define wxPrintPreview_destruct 2466
-#define wxPrintPreview_GetCanvas 2467
-#define wxPrintPreview_GetCurrentPage 2468
-#define wxPrintPreview_GetFrame 2469
-#define wxPrintPreview_GetMaxPage 2470
-#define wxPrintPreview_GetMinPage 2471
-#define wxPrintPreview_GetPrintout 2472
-#define wxPrintPreview_GetPrintoutForPrinting 2473
-#define wxPrintPreview_IsOk 2474
-#define wxPrintPreview_PaintPage 2475
-#define wxPrintPreview_Print 2476
-#define wxPrintPreview_RenderPage 2477
-#define wxPrintPreview_SetCanvas 2478
-#define wxPrintPreview_SetCurrentPage 2479
-#define wxPrintPreview_SetFrame 2480
-#define wxPrintPreview_SetPrintout 2481
-#define wxPrintPreview_SetZoom 2482
-#define wxPreviewFrame_new 2483
-#define wxPreviewFrame_destruct 2484
-#define wxPreviewFrame_CreateControlBar 2485
-#define wxPreviewFrame_CreateCanvas 2486
-#define wxPreviewFrame_Initialize 2487
-#define wxPreviewFrame_OnCloseWindow 2488
-#define wxPreviewControlBar_new 2489
-#define wxPreviewControlBar_destruct 2490
-#define wxPreviewControlBar_CreateButtons 2491
-#define wxPreviewControlBar_GetPrintPreview 2492
-#define wxPreviewControlBar_GetZoomControl 2493
-#define wxPreviewControlBar_SetZoomControl 2494
-#define wxPrinter_new 2496
-#define wxPrinter_CreateAbortWindow 2497
-#define wxPrinter_GetAbort 2498
-#define wxPrinter_GetLastError 2499
-#define wxPrinter_GetPrintDialogData 2500
-#define wxPrinter_Print 2501
-#define wxPrinter_PrintDialog 2502
-#define wxPrinter_ReportError 2503
-#define wxPrinter_Setup 2504
-#define wxPrinter_destroy 2505
-#define wxXmlResource_new_1 2506
-#define wxXmlResource_new_2 2507
-#define wxXmlResource_destruct 2508
-#define wxXmlResource_AttachUnknownControl 2509
-#define wxXmlResource_ClearHandlers 2510
-#define wxXmlResource_CompareVersion 2511
-#define wxXmlResource_Get 2512
-#define wxXmlResource_GetFlags 2513
-#define wxXmlResource_GetVersion 2514
-#define wxXmlResource_GetXRCID 2515
-#define wxXmlResource_InitAllHandlers 2516
-#define wxXmlResource_Load 2517
-#define wxXmlResource_LoadBitmap 2518
-#define wxXmlResource_LoadDialog_2 2519
-#define wxXmlResource_LoadDialog_3 2520
-#define wxXmlResource_LoadFrame_2 2521
-#define wxXmlResource_LoadFrame_3 2522
-#define wxXmlResource_LoadIcon 2523
-#define wxXmlResource_LoadMenu 2524
-#define wxXmlResource_LoadMenuBar_2 2525
-#define wxXmlResource_LoadMenuBar_1 2526
-#define wxXmlResource_LoadPanel_2 2527
-#define wxXmlResource_LoadPanel_3 2528
-#define wxXmlResource_LoadToolBar 2529
-#define wxXmlResource_Set 2530
-#define wxXmlResource_SetFlags 2531
-#define wxXmlResource_Unload 2532
-#define wxXmlResource_xrcctrl 2533
-#define wxHtmlEasyPrinting_new 2534
-#define wxHtmlEasyPrinting_destruct 2535
-#define wxHtmlEasyPrinting_GetPrintData 2536
-#define wxHtmlEasyPrinting_GetPageSetupData 2537
-#define wxHtmlEasyPrinting_PreviewFile 2538
-#define wxHtmlEasyPrinting_PreviewText 2539
-#define wxHtmlEasyPrinting_PrintFile 2540
-#define wxHtmlEasyPrinting_PrintText 2541
-#define wxHtmlEasyPrinting_PageSetup 2542
-#define wxHtmlEasyPrinting_SetFonts 2543
-#define wxHtmlEasyPrinting_SetHeader 2544
-#define wxHtmlEasyPrinting_SetFooter 2545
-#define wxGLCanvas_new_2 2547
-#define wxGLCanvas_new_3_1 2548
-#define wxGLCanvas_new_3_0 2549
-#define wxGLCanvas_GetContext 2550
-#define wxGLCanvas_SetCurrent 2552
-#define wxGLCanvas_SwapBuffers 2553
-#define wxGLCanvas_destroy 2554
-#define wxAuiManager_new 2555
-#define wxAuiManager_destruct 2556
-#define wxAuiManager_AddPane_2_1 2557
-#define wxAuiManager_AddPane_3 2558
-#define wxAuiManager_AddPane_2_0 2559
-#define wxAuiManager_DetachPane 2560
-#define wxAuiManager_GetAllPanes 2561
-#define wxAuiManager_GetArtProvider 2562
-#define wxAuiManager_GetDockSizeConstraint 2563
-#define wxAuiManager_GetFlags 2564
-#define wxAuiManager_GetManagedWindow 2565
-#define wxAuiManager_GetManager 2566
-#define wxAuiManager_GetPane_1_1 2567
-#define wxAuiManager_GetPane_1_0 2568
-#define wxAuiManager_HideHint 2569
-#define wxAuiManager_InsertPane 2570
-#define wxAuiManager_LoadPaneInfo 2571
-#define wxAuiManager_LoadPerspective 2572
-#define wxAuiManager_SavePaneInfo 2573
-#define wxAuiManager_SavePerspective 2574
-#define wxAuiManager_SetArtProvider 2575
-#define wxAuiManager_SetDockSizeConstraint 2576
-#define wxAuiManager_SetFlags 2577
-#define wxAuiManager_SetManagedWindow 2578
-#define wxAuiManager_ShowHint 2579
-#define wxAuiManager_UnInit 2580
-#define wxAuiManager_Update 2581
-#define wxAuiPaneInfo_new_0 2582
-#define wxAuiPaneInfo_new_1 2583
-#define wxAuiPaneInfo_destruct 2584
-#define wxAuiPaneInfo_BestSize_1 2585
-#define wxAuiPaneInfo_BestSize_2 2586
-#define wxAuiPaneInfo_Bottom 2587
-#define wxAuiPaneInfo_BottomDockable 2588
-#define wxAuiPaneInfo_Caption 2589
-#define wxAuiPaneInfo_CaptionVisible 2590
-#define wxAuiPaneInfo_Centre 2591
-#define wxAuiPaneInfo_CentrePane 2592
-#define wxAuiPaneInfo_CloseButton 2593
-#define wxAuiPaneInfo_DefaultPane 2594
-#define wxAuiPaneInfo_DestroyOnClose 2595
-#define wxAuiPaneInfo_Direction 2596
-#define wxAuiPaneInfo_Dock 2597
-#define wxAuiPaneInfo_Dockable 2598
-#define wxAuiPaneInfo_Fixed 2599
-#define wxAuiPaneInfo_Float 2600
-#define wxAuiPaneInfo_Floatable 2601
-#define wxAuiPaneInfo_FloatingPosition_1 2602
-#define wxAuiPaneInfo_FloatingPosition_2 2603
-#define wxAuiPaneInfo_FloatingSize_1 2604
-#define wxAuiPaneInfo_FloatingSize_2 2605
-#define wxAuiPaneInfo_Gripper 2606
-#define wxAuiPaneInfo_GripperTop 2607
-#define wxAuiPaneInfo_HasBorder 2608
-#define wxAuiPaneInfo_HasCaption 2609
-#define wxAuiPaneInfo_HasCloseButton 2610
-#define wxAuiPaneInfo_HasFlag 2611
-#define wxAuiPaneInfo_HasGripper 2612
-#define wxAuiPaneInfo_HasGripperTop 2613
-#define wxAuiPaneInfo_HasMaximizeButton 2614
-#define wxAuiPaneInfo_HasMinimizeButton 2615
-#define wxAuiPaneInfo_HasPinButton 2616
-#define wxAuiPaneInfo_Hide 2617
-#define wxAuiPaneInfo_IsBottomDockable 2618
-#define wxAuiPaneInfo_IsDocked 2619
-#define wxAuiPaneInfo_IsFixed 2620
-#define wxAuiPaneInfo_IsFloatable 2621
-#define wxAuiPaneInfo_IsFloating 2622
-#define wxAuiPaneInfo_IsLeftDockable 2623
-#define wxAuiPaneInfo_IsMovable 2624
-#define wxAuiPaneInfo_IsOk 2625
-#define wxAuiPaneInfo_IsResizable 2626
-#define wxAuiPaneInfo_IsRightDockable 2627
-#define wxAuiPaneInfo_IsShown 2628
-#define wxAuiPaneInfo_IsToolbar 2629
-#define wxAuiPaneInfo_IsTopDockable 2630
-#define wxAuiPaneInfo_Layer 2631
-#define wxAuiPaneInfo_Left 2632
-#define wxAuiPaneInfo_LeftDockable 2633
-#define wxAuiPaneInfo_MaxSize_1 2634
-#define wxAuiPaneInfo_MaxSize_2 2635
-#define wxAuiPaneInfo_MaximizeButton 2636
-#define wxAuiPaneInfo_MinSize_1 2637
-#define wxAuiPaneInfo_MinSize_2 2638
-#define wxAuiPaneInfo_MinimizeButton 2639
-#define wxAuiPaneInfo_Movable 2640
-#define wxAuiPaneInfo_Name 2641
-#define wxAuiPaneInfo_PaneBorder 2642
-#define wxAuiPaneInfo_PinButton 2643
-#define wxAuiPaneInfo_Position 2644
-#define wxAuiPaneInfo_Resizable 2645
-#define wxAuiPaneInfo_Right 2646
-#define wxAuiPaneInfo_RightDockable 2647
-#define wxAuiPaneInfo_Row 2648
-#define wxAuiPaneInfo_SafeSet 2649
-#define wxAuiPaneInfo_SetFlag 2650
-#define wxAuiPaneInfo_Show 2651
-#define wxAuiPaneInfo_ToolbarPane 2652
-#define wxAuiPaneInfo_Top 2653
-#define wxAuiPaneInfo_TopDockable 2654
-#define wxAuiPaneInfo_Window 2655
-#define wxAuiPaneInfo_GetWindow 2656
-#define wxAuiPaneInfo_GetFrame 2657
-#define wxAuiPaneInfo_GetDirection 2658
-#define wxAuiPaneInfo_GetLayer 2659
-#define wxAuiPaneInfo_GetRow 2660
-#define wxAuiPaneInfo_GetPosition 2661
-#define wxAuiPaneInfo_GetFloatingPosition 2662
-#define wxAuiPaneInfo_GetFloatingSize 2663
-#define wxAuiNotebook_new_0 2664
-#define wxAuiNotebook_new_2 2665
-#define wxAuiNotebook_AddPage 2666
-#define wxAuiNotebook_Create 2667
-#define wxAuiNotebook_DeletePage 2668
-#define wxAuiNotebook_GetArtProvider 2669
-#define wxAuiNotebook_GetPage 2670
-#define wxAuiNotebook_GetPageBitmap 2671
-#define wxAuiNotebook_GetPageCount 2672
-#define wxAuiNotebook_GetPageIndex 2673
-#define wxAuiNotebook_GetPageText 2674
-#define wxAuiNotebook_GetSelection 2675
-#define wxAuiNotebook_InsertPage 2676
-#define wxAuiNotebook_RemovePage 2677
-#define wxAuiNotebook_SetArtProvider 2678
-#define wxAuiNotebook_SetFont 2679
-#define wxAuiNotebook_SetPageBitmap 2680
-#define wxAuiNotebook_SetPageText 2681
-#define wxAuiNotebook_SetSelection 2682
-#define wxAuiNotebook_SetTabCtrlHeight 2683
-#define wxAuiNotebook_SetUniformBitmapSize 2684
-#define wxAuiNotebook_destroy 2685
-#define wxAuiTabArt_SetFlags 2686
-#define wxAuiTabArt_SetMeasuringFont 2687
-#define wxAuiTabArt_SetNormalFont 2688
-#define wxAuiTabArt_SetSelectedFont 2689
-#define wxAuiTabArt_SetColour 2690
-#define wxAuiTabArt_SetActiveColour 2691
-#define wxAuiDockArt_GetColour 2692
-#define wxAuiDockArt_GetFont 2693
-#define wxAuiDockArt_GetMetric 2694
-#define wxAuiDockArt_SetColour 2695
-#define wxAuiDockArt_SetFont 2696
-#define wxAuiDockArt_SetMetric 2697
-#define wxAuiSimpleTabArt_new 2698
-#define wxAuiSimpleTabArt_destroy 2699
-#define wxMDIParentFrame_new_0 2700
-#define wxMDIParentFrame_new_4 2701
-#define wxMDIParentFrame_destruct 2702
-#define wxMDIParentFrame_ActivateNext 2703
-#define wxMDIParentFrame_ActivatePrevious 2704
-#define wxMDIParentFrame_ArrangeIcons 2705
-#define wxMDIParentFrame_Cascade 2706
-#define wxMDIParentFrame_Create 2707
-#define wxMDIParentFrame_GetActiveChild 2708
-#define wxMDIParentFrame_GetClientWindow 2709
-#define wxMDIParentFrame_Tile 2710
-#define wxMDIChildFrame_new_0 2711
-#define wxMDIChildFrame_new_4 2712
-#define wxMDIChildFrame_destruct 2713
-#define wxMDIChildFrame_Activate 2714
-#define wxMDIChildFrame_Create 2715
-#define wxMDIChildFrame_Maximize 2716
-#define wxMDIChildFrame_Restore 2717
-#define wxMDIClientWindow_new_0 2718
-#define wxMDIClientWindow_new_2 2719
-#define wxMDIClientWindow_destruct 2720
-#define wxMDIClientWindow_CreateClient 2721
-#define wxLayoutAlgorithm_new 2722
-#define wxLayoutAlgorithm_LayoutFrame 2723
-#define wxLayoutAlgorithm_LayoutMDIFrame 2724
-#define wxLayoutAlgorithm_LayoutWindow 2725
-#define wxLayoutAlgorithm_destroy 2726
-#define wxEvent_GetId 2727
-#define wxEvent_GetSkipped 2728
-#define wxEvent_GetTimestamp 2729
-#define wxEvent_IsCommandEvent 2730
-#define wxEvent_ResumePropagation 2731
-#define wxEvent_ShouldPropagate 2732
-#define wxEvent_Skip 2733
-#define wxEvent_StopPropagation 2734
-#define wxCommandEvent_getClientData 2735
-#define wxCommandEvent_GetExtraLong 2736
-#define wxCommandEvent_GetInt 2737
-#define wxCommandEvent_GetSelection 2738
-#define wxCommandEvent_GetString 2739
-#define wxCommandEvent_IsChecked 2740
-#define wxCommandEvent_IsSelection 2741
-#define wxCommandEvent_SetInt 2742
-#define wxCommandEvent_SetString 2743
-#define wxScrollEvent_GetOrientation 2744
-#define wxScrollEvent_GetPosition 2745
-#define wxScrollWinEvent_GetOrientation 2746
-#define wxScrollWinEvent_GetPosition 2747
-#define wxMouseEvent_AltDown 2748
-#define wxMouseEvent_Button 2749
-#define wxMouseEvent_ButtonDClick 2750
-#define wxMouseEvent_ButtonDown 2751
-#define wxMouseEvent_ButtonUp 2752
-#define wxMouseEvent_CmdDown 2753
-#define wxMouseEvent_ControlDown 2754
-#define wxMouseEvent_Dragging 2755
-#define wxMouseEvent_Entering 2756
-#define wxMouseEvent_GetButton 2757
-#define wxMouseEvent_GetPosition 2760
-#define wxMouseEvent_GetLogicalPosition 2761
-#define wxMouseEvent_GetLinesPerAction 2762
-#define wxMouseEvent_GetWheelRotation 2763
-#define wxMouseEvent_GetWheelDelta 2764
-#define wxMouseEvent_GetX 2765
-#define wxMouseEvent_GetY 2766
-#define wxMouseEvent_IsButton 2767
-#define wxMouseEvent_IsPageScroll 2768
-#define wxMouseEvent_Leaving 2769
-#define wxMouseEvent_LeftDClick 2770
-#define wxMouseEvent_LeftDown 2771
-#define wxMouseEvent_LeftIsDown 2772
-#define wxMouseEvent_LeftUp 2773
-#define wxMouseEvent_MetaDown 2774
-#define wxMouseEvent_MiddleDClick 2775
-#define wxMouseEvent_MiddleDown 2776
-#define wxMouseEvent_MiddleIsDown 2777
-#define wxMouseEvent_MiddleUp 2778
-#define wxMouseEvent_Moving 2779
-#define wxMouseEvent_RightDClick 2780
-#define wxMouseEvent_RightDown 2781
-#define wxMouseEvent_RightIsDown 2782
-#define wxMouseEvent_RightUp 2783
-#define wxMouseEvent_ShiftDown 2784
-#define wxSetCursorEvent_GetCursor 2785
-#define wxSetCursorEvent_GetX 2786
-#define wxSetCursorEvent_GetY 2787
-#define wxSetCursorEvent_HasCursor 2788
-#define wxSetCursorEvent_SetCursor 2789
-#define wxKeyEvent_AltDown 2790
-#define wxKeyEvent_CmdDown 2791
-#define wxKeyEvent_ControlDown 2792
-#define wxKeyEvent_GetKeyCode 2793
-#define wxKeyEvent_GetModifiers 2794
-#define wxKeyEvent_GetPosition 2797
-#define wxKeyEvent_GetRawKeyCode 2798
-#define wxKeyEvent_GetRawKeyFlags 2799
-#define wxKeyEvent_GetUnicodeKey 2800
-#define wxKeyEvent_GetX 2801
-#define wxKeyEvent_GetY 2802
-#define wxKeyEvent_HasModifiers 2803
-#define wxKeyEvent_MetaDown 2804
-#define wxKeyEvent_ShiftDown 2805
-#define wxSizeEvent_GetSize 2806
-#define wxMoveEvent_GetPosition 2807
-#define wxEraseEvent_GetDC 2808
-#define wxFocusEvent_GetWindow 2809
-#define wxChildFocusEvent_GetWindow 2810
-#define wxMenuEvent_GetMenu 2811
-#define wxMenuEvent_GetMenuId 2812
-#define wxMenuEvent_IsPopup 2813
-#define wxCloseEvent_CanVeto 2814
-#define wxCloseEvent_GetLoggingOff 2815
-#define wxCloseEvent_SetCanVeto 2816
-#define wxCloseEvent_SetLoggingOff 2817
-#define wxCloseEvent_Veto 2818
-#define wxShowEvent_SetShow 2819
-#define wxShowEvent_GetShow 2820
-#define wxIconizeEvent_Iconized 2821
-#define wxJoystickEvent_ButtonDown 2822
-#define wxJoystickEvent_ButtonIsDown 2823
-#define wxJoystickEvent_ButtonUp 2824
-#define wxJoystickEvent_GetButtonChange 2825
-#define wxJoystickEvent_GetButtonState 2826
-#define wxJoystickEvent_GetJoystick 2827
-#define wxJoystickEvent_GetPosition 2828
-#define wxJoystickEvent_GetZPosition 2829
-#define wxJoystickEvent_IsButton 2830
-#define wxJoystickEvent_IsMove 2831
-#define wxJoystickEvent_IsZMove 2832
-#define wxUpdateUIEvent_CanUpdate 2833
-#define wxUpdateUIEvent_Check 2834
-#define wxUpdateUIEvent_Enable 2835
-#define wxUpdateUIEvent_Show 2836
-#define wxUpdateUIEvent_GetChecked 2837
-#define wxUpdateUIEvent_GetEnabled 2838
-#define wxUpdateUIEvent_GetShown 2839
-#define wxUpdateUIEvent_GetSetChecked 2840
-#define wxUpdateUIEvent_GetSetEnabled 2841
-#define wxUpdateUIEvent_GetSetShown 2842
-#define wxUpdateUIEvent_GetSetText 2843
-#define wxUpdateUIEvent_GetText 2844
-#define wxUpdateUIEvent_GetMode 2845
-#define wxUpdateUIEvent_GetUpdateInterval 2846
-#define wxUpdateUIEvent_ResetUpdateTime 2847
-#define wxUpdateUIEvent_SetMode 2848
-#define wxUpdateUIEvent_SetText 2849
-#define wxUpdateUIEvent_SetUpdateInterval 2850
-#define wxMouseCaptureChangedEvent_GetCapturedWindow 2851
-#define wxPaletteChangedEvent_SetChangedWindow 2852
-#define wxPaletteChangedEvent_GetChangedWindow 2853
-#define wxQueryNewPaletteEvent_SetPaletteRealized 2854
-#define wxQueryNewPaletteEvent_GetPaletteRealized 2855
-#define wxNavigationKeyEvent_GetDirection 2856
-#define wxNavigationKeyEvent_SetDirection 2857
-#define wxNavigationKeyEvent_IsWindowChange 2858
-#define wxNavigationKeyEvent_SetWindowChange 2859
-#define wxNavigationKeyEvent_IsFromTab 2860
-#define wxNavigationKeyEvent_SetFromTab 2861
-#define wxNavigationKeyEvent_GetCurrentFocus 2862
-#define wxNavigationKeyEvent_SetCurrentFocus 2863
-#define wxHelpEvent_GetOrigin 2864
-#define wxHelpEvent_GetPosition 2865
-#define wxHelpEvent_SetOrigin 2866
-#define wxHelpEvent_SetPosition 2867
-#define wxContextMenuEvent_GetPosition 2868
-#define wxContextMenuEvent_SetPosition 2869
-#define wxIdleEvent_CanSend 2870
-#define wxIdleEvent_GetMode 2871
-#define wxIdleEvent_RequestMore 2872
-#define wxIdleEvent_MoreRequested 2873
-#define wxIdleEvent_SetMode 2874
-#define wxGridEvent_AltDown 2875
-#define wxGridEvent_ControlDown 2876
-#define wxGridEvent_GetCol 2877
-#define wxGridEvent_GetPosition 2878
-#define wxGridEvent_GetRow 2879
-#define wxGridEvent_MetaDown 2880
-#define wxGridEvent_Selecting 2881
-#define wxGridEvent_ShiftDown 2882
-#define wxNotifyEvent_Allow 2883
-#define wxNotifyEvent_IsAllowed 2884
-#define wxNotifyEvent_Veto 2885
-#define wxSashEvent_GetEdge 2886
-#define wxSashEvent_GetDragRect 2887
-#define wxSashEvent_GetDragStatus 2888
-#define wxListEvent_GetCacheFrom 2889
-#define wxListEvent_GetCacheTo 2890
-#define wxListEvent_GetKeyCode 2891
-#define wxListEvent_GetIndex 2892
-#define wxListEvent_GetColumn 2893
-#define wxListEvent_GetPoint 2894
-#define wxListEvent_GetLabel 2895
-#define wxListEvent_GetText 2896
-#define wxListEvent_GetImage 2897
-#define wxListEvent_GetData 2898
-#define wxListEvent_GetMask 2899
-#define wxListEvent_GetItem 2900
-#define wxListEvent_IsEditCancelled 2901
-#define wxDateEvent_GetDate 2902
-#define wxCalendarEvent_GetWeekDay 2903
-#define wxFileDirPickerEvent_GetPath 2904
-#define wxColourPickerEvent_GetColour 2905
-#define wxFontPickerEvent_GetFont 2906
-#define wxStyledTextEvent_GetPosition 2907
-#define wxStyledTextEvent_GetKey 2908
-#define wxStyledTextEvent_GetModifiers 2909
-#define wxStyledTextEvent_GetModificationType 2910
-#define wxStyledTextEvent_GetText 2911
-#define wxStyledTextEvent_GetLength 2912
-#define wxStyledTextEvent_GetLinesAdded 2913
-#define wxStyledTextEvent_GetLine 2914
-#define wxStyledTextEvent_GetFoldLevelNow 2915
-#define wxStyledTextEvent_GetFoldLevelPrev 2916
-#define wxStyledTextEvent_GetMargin 2917
-#define wxStyledTextEvent_GetMessage 2918
-#define wxStyledTextEvent_GetWParam 2919
-#define wxStyledTextEvent_GetLParam 2920
-#define wxStyledTextEvent_GetListType 2921
-#define wxStyledTextEvent_GetX 2922
-#define wxStyledTextEvent_GetY 2923
-#define wxStyledTextEvent_GetDragText 2924
-#define wxStyledTextEvent_GetDragAllowMove 2925
-#define wxStyledTextEvent_GetDragResult 2926
-#define wxStyledTextEvent_GetShift 2927
-#define wxStyledTextEvent_GetControl 2928
-#define wxStyledTextEvent_GetAlt 2929
-#define utils_wxGetKeyState 2930
-#define utils_wxGetMousePosition 2931
-#define utils_wxGetMouseState 2932
-#define utils_wxSetDetectableAutoRepeat 2933
-#define utils_wxBell 2934
-#define utils_wxFindMenuItemId 2935
-#define utils_wxGenericFindWindowAtPoint 2936
-#define utils_wxFindWindowAtPoint 2937
-#define utils_wxBeginBusyCursor 2938
-#define utils_wxEndBusyCursor 2939
-#define utils_wxIsBusy 2940
-#define utils_wxShutdown 2941
-#define utils_wxShell 2942
-#define utils_wxLaunchDefaultBrowser 2943
-#define utils_wxGetEmailAddress 2944
-#define utils_wxGetUserId 2945
-#define utils_wxGetHomeDir 2946
-#define utils_wxNewId 2947
-#define utils_wxRegisterId 2948
-#define utils_wxGetCurrentId 2949
-#define utils_wxGetOsDescription 2950
-#define utils_wxIsPlatformLittleEndian 2951
-#define utils_wxIsPlatform64Bit 2952
-#define gdicmn_wxDisplaySize 2953
-#define gdicmn_wxSetCursor 2954
-#define wxPrintout_new 2955
-#define wxPrintout_destruct 2956
-#define wxPrintout_GetDC 2957
-#define wxPrintout_GetPageSizeMM 2958
-#define wxPrintout_GetPageSizePixels 2959
-#define wxPrintout_GetPaperRectPixels 2960
-#define wxPrintout_GetPPIPrinter 2961
-#define wxPrintout_GetPPIScreen 2962
-#define wxPrintout_GetTitle 2963
-#define wxPrintout_IsPreview 2964
-#define wxPrintout_FitThisSizeToPaper 2965
-#define wxPrintout_FitThisSizeToPage 2966
-#define wxPrintout_FitThisSizeToPageMargins 2967
-#define wxPrintout_MapScreenSizeToPaper 2968
-#define wxPrintout_MapScreenSizeToPage 2969
-#define wxPrintout_MapScreenSizeToPageMargins 2970
-#define wxPrintout_MapScreenSizeToDevice 2971
-#define wxPrintout_GetLogicalPaperRect 2972
-#define wxPrintout_GetLogicalPageRect 2973
-#define wxPrintout_GetLogicalPageMarginsRect 2974
-#define wxPrintout_SetLogicalOrigin 2975
-#define wxPrintout_OffsetLogicalOrigin 2976
-#define wxStyledTextCtrl_new_2 2977
-#define wxStyledTextCtrl_new_0 2978
-#define wxStyledTextCtrl_destruct 2979
-#define wxStyledTextCtrl_Create 2980
-#define wxStyledTextCtrl_AddText 2981
-#define wxStyledTextCtrl_AddStyledText 2982
-#define wxStyledTextCtrl_InsertText 2983
-#define wxStyledTextCtrl_ClearAll 2984
-#define wxStyledTextCtrl_ClearDocumentStyle 2985
-#define wxStyledTextCtrl_GetLength 2986
-#define wxStyledTextCtrl_GetCharAt 2987
-#define wxStyledTextCtrl_GetCurrentPos 2988
-#define wxStyledTextCtrl_GetAnchor 2989
-#define wxStyledTextCtrl_GetStyleAt 2990
-#define wxStyledTextCtrl_Redo 2991
-#define wxStyledTextCtrl_SetUndoCollection 2992
-#define wxStyledTextCtrl_SelectAll 2993
-#define wxStyledTextCtrl_SetSavePoint 2994
-#define wxStyledTextCtrl_GetStyledText 2995
-#define wxStyledTextCtrl_CanRedo 2996
-#define wxStyledTextCtrl_MarkerLineFromHandle 2997
-#define wxStyledTextCtrl_MarkerDeleteHandle 2998
-#define wxStyledTextCtrl_GetUndoCollection 2999
-#define wxStyledTextCtrl_GetViewWhiteSpace 3000
-#define wxStyledTextCtrl_SetViewWhiteSpace 3001
-#define wxStyledTextCtrl_PositionFromPoint 3002
-#define wxStyledTextCtrl_PositionFromPointClose 3003
-#define wxStyledTextCtrl_GotoLine 3004
-#define wxStyledTextCtrl_GotoPos 3005
-#define wxStyledTextCtrl_SetAnchor 3006
-#define wxStyledTextCtrl_GetCurLine 3007
-#define wxStyledTextCtrl_GetEndStyled 3008
-#define wxStyledTextCtrl_ConvertEOLs 3009
-#define wxStyledTextCtrl_GetEOLMode 3010
-#define wxStyledTextCtrl_SetEOLMode 3011
-#define wxStyledTextCtrl_StartStyling 3012
-#define wxStyledTextCtrl_SetStyling 3013
-#define wxStyledTextCtrl_GetBufferedDraw 3014
-#define wxStyledTextCtrl_SetBufferedDraw 3015
-#define wxStyledTextCtrl_SetTabWidth 3016
-#define wxStyledTextCtrl_GetTabWidth 3017
-#define wxStyledTextCtrl_SetCodePage 3018
-#define wxStyledTextCtrl_MarkerDefine 3019
-#define wxStyledTextCtrl_MarkerSetForeground 3020
-#define wxStyledTextCtrl_MarkerSetBackground 3021
-#define wxStyledTextCtrl_MarkerAdd 3022
-#define wxStyledTextCtrl_MarkerDelete 3023
-#define wxStyledTextCtrl_MarkerDeleteAll 3024
-#define wxStyledTextCtrl_MarkerGet 3025
-#define wxStyledTextCtrl_MarkerNext 3026
-#define wxStyledTextCtrl_MarkerPrevious 3027
-#define wxStyledTextCtrl_MarkerDefineBitmap 3028
-#define wxStyledTextCtrl_MarkerAddSet 3029
-#define wxStyledTextCtrl_MarkerSetAlpha 3030
-#define wxStyledTextCtrl_SetMarginType 3031
-#define wxStyledTextCtrl_GetMarginType 3032
-#define wxStyledTextCtrl_SetMarginWidth 3033
-#define wxStyledTextCtrl_GetMarginWidth 3034
-#define wxStyledTextCtrl_SetMarginMask 3035
-#define wxStyledTextCtrl_GetMarginMask 3036
-#define wxStyledTextCtrl_SetMarginSensitive 3037
-#define wxStyledTextCtrl_GetMarginSensitive 3038
-#define wxStyledTextCtrl_StyleClearAll 3039
-#define wxStyledTextCtrl_StyleSetForeground 3040
-#define wxStyledTextCtrl_StyleSetBackground 3041
-#define wxStyledTextCtrl_StyleSetBold 3042
-#define wxStyledTextCtrl_StyleSetItalic 3043
-#define wxStyledTextCtrl_StyleSetSize 3044
-#define wxStyledTextCtrl_StyleSetFaceName 3045
-#define wxStyledTextCtrl_StyleSetEOLFilled 3046
-#define wxStyledTextCtrl_StyleResetDefault 3047
-#define wxStyledTextCtrl_StyleSetUnderline 3048
-#define wxStyledTextCtrl_StyleSetCase 3049
-#define wxStyledTextCtrl_StyleSetHotSpot 3050
-#define wxStyledTextCtrl_SetSelForeground 3051
-#define wxStyledTextCtrl_SetSelBackground 3052
-#define wxStyledTextCtrl_GetSelAlpha 3053
-#define wxStyledTextCtrl_SetSelAlpha 3054
-#define wxStyledTextCtrl_SetCaretForeground 3055
-#define wxStyledTextCtrl_CmdKeyAssign 3056
-#define wxStyledTextCtrl_CmdKeyClear 3057
-#define wxStyledTextCtrl_CmdKeyClearAll 3058
-#define wxStyledTextCtrl_SetStyleBytes 3059
-#define wxStyledTextCtrl_StyleSetVisible 3060
-#define wxStyledTextCtrl_GetCaretPeriod 3061
-#define wxStyledTextCtrl_SetCaretPeriod 3062
-#define wxStyledTextCtrl_SetWordChars 3063
-#define wxStyledTextCtrl_BeginUndoAction 3064
-#define wxStyledTextCtrl_EndUndoAction 3065
-#define wxStyledTextCtrl_IndicatorSetStyle 3066
-#define wxStyledTextCtrl_IndicatorGetStyle 3067
-#define wxStyledTextCtrl_IndicatorSetForeground 3068
-#define wxStyledTextCtrl_IndicatorGetForeground 3069
-#define wxStyledTextCtrl_SetWhitespaceForeground 3070
-#define wxStyledTextCtrl_SetWhitespaceBackground 3071
-#define wxStyledTextCtrl_GetStyleBits 3072
-#define wxStyledTextCtrl_SetLineState 3073
-#define wxStyledTextCtrl_GetLineState 3074
-#define wxStyledTextCtrl_GetMaxLineState 3075
-#define wxStyledTextCtrl_GetCaretLineVisible 3076
-#define wxStyledTextCtrl_SetCaretLineVisible 3077
-#define wxStyledTextCtrl_GetCaretLineBackground 3078
-#define wxStyledTextCtrl_SetCaretLineBackground 3079
-#define wxStyledTextCtrl_AutoCompShow 3080
-#define wxStyledTextCtrl_AutoCompCancel 3081
-#define wxStyledTextCtrl_AutoCompActive 3082
-#define wxStyledTextCtrl_AutoCompPosStart 3083
-#define wxStyledTextCtrl_AutoCompComplete 3084
-#define wxStyledTextCtrl_AutoCompStops 3085
-#define wxStyledTextCtrl_AutoCompSetSeparator 3086
-#define wxStyledTextCtrl_AutoCompGetSeparator 3087
-#define wxStyledTextCtrl_AutoCompSelect 3088
-#define wxStyledTextCtrl_AutoCompSetCancelAtStart 3089
-#define wxStyledTextCtrl_AutoCompGetCancelAtStart 3090
-#define wxStyledTextCtrl_AutoCompSetFillUps 3091
-#define wxStyledTextCtrl_AutoCompSetChooseSingle 3092
-#define wxStyledTextCtrl_AutoCompGetChooseSingle 3093
-#define wxStyledTextCtrl_AutoCompSetIgnoreCase 3094
-#define wxStyledTextCtrl_AutoCompGetIgnoreCase 3095
-#define wxStyledTextCtrl_UserListShow 3096
-#define wxStyledTextCtrl_AutoCompSetAutoHide 3097
-#define wxStyledTextCtrl_AutoCompGetAutoHide 3098
-#define wxStyledTextCtrl_AutoCompSetDropRestOfWord 3099
-#define wxStyledTextCtrl_AutoCompGetDropRestOfWord 3100
-#define wxStyledTextCtrl_RegisterImage 3101
-#define wxStyledTextCtrl_ClearRegisteredImages 3102
-#define wxStyledTextCtrl_AutoCompGetTypeSeparator 3103
-#define wxStyledTextCtrl_AutoCompSetTypeSeparator 3104
-#define wxStyledTextCtrl_AutoCompSetMaxWidth 3105
-#define wxStyledTextCtrl_AutoCompGetMaxWidth 3106
-#define wxStyledTextCtrl_AutoCompSetMaxHeight 3107
-#define wxStyledTextCtrl_AutoCompGetMaxHeight 3108
-#define wxStyledTextCtrl_SetIndent 3109
-#define wxStyledTextCtrl_GetIndent 3110
-#define wxStyledTextCtrl_SetUseTabs 3111
-#define wxStyledTextCtrl_GetUseTabs 3112
-#define wxStyledTextCtrl_SetLineIndentation 3113
-#define wxStyledTextCtrl_GetLineIndentation 3114
-#define wxStyledTextCtrl_GetLineIndentPosition 3115
-#define wxStyledTextCtrl_GetColumn 3116
-#define wxStyledTextCtrl_SetUseHorizontalScrollBar 3117
-#define wxStyledTextCtrl_GetUseHorizontalScrollBar 3118
-#define wxStyledTextCtrl_SetIndentationGuides 3119
-#define wxStyledTextCtrl_GetIndentationGuides 3120
-#define wxStyledTextCtrl_SetHighlightGuide 3121
-#define wxStyledTextCtrl_GetHighlightGuide 3122
-#define wxStyledTextCtrl_GetLineEndPosition 3123
-#define wxStyledTextCtrl_GetCodePage 3124
-#define wxStyledTextCtrl_GetCaretForeground 3125
-#define wxStyledTextCtrl_GetReadOnly 3126
-#define wxStyledTextCtrl_SetCurrentPos 3127
-#define wxStyledTextCtrl_SetSelectionStart 3128
-#define wxStyledTextCtrl_GetSelectionStart 3129
-#define wxStyledTextCtrl_SetSelectionEnd 3130
-#define wxStyledTextCtrl_GetSelectionEnd 3131
-#define wxStyledTextCtrl_SetPrintMagnification 3132
-#define wxStyledTextCtrl_GetPrintMagnification 3133
-#define wxStyledTextCtrl_SetPrintColourMode 3134
-#define wxStyledTextCtrl_GetPrintColourMode 3135
-#define wxStyledTextCtrl_FindText 3136
-#define wxStyledTextCtrl_FormatRange 3137
-#define wxStyledTextCtrl_GetFirstVisibleLine 3138
-#define wxStyledTextCtrl_GetLine 3139
-#define wxStyledTextCtrl_GetLineCount 3140
-#define wxStyledTextCtrl_SetMarginLeft 3141
-#define wxStyledTextCtrl_GetMarginLeft 3142
-#define wxStyledTextCtrl_SetMarginRight 3143
-#define wxStyledTextCtrl_GetMarginRight 3144
-#define wxStyledTextCtrl_GetModify 3145
-#define wxStyledTextCtrl_SetSelection 3146
-#define wxStyledTextCtrl_GetSelectedText 3147
-#define wxStyledTextCtrl_GetTextRange 3148
-#define wxStyledTextCtrl_HideSelection 3149
-#define wxStyledTextCtrl_LineFromPosition 3150
-#define wxStyledTextCtrl_PositionFromLine 3151
-#define wxStyledTextCtrl_LineScroll 3152
-#define wxStyledTextCtrl_EnsureCaretVisible 3153
-#define wxStyledTextCtrl_ReplaceSelection 3154
-#define wxStyledTextCtrl_SetReadOnly 3155
-#define wxStyledTextCtrl_CanPaste 3156
-#define wxStyledTextCtrl_CanUndo 3157
-#define wxStyledTextCtrl_EmptyUndoBuffer 3158
-#define wxStyledTextCtrl_Undo 3159
-#define wxStyledTextCtrl_Cut 3160
-#define wxStyledTextCtrl_Copy 3161
-#define wxStyledTextCtrl_Paste 3162
-#define wxStyledTextCtrl_Clear 3163
-#define wxStyledTextCtrl_SetText 3164
-#define wxStyledTextCtrl_GetText 3165
-#define wxStyledTextCtrl_GetTextLength 3166
-#define wxStyledTextCtrl_GetOvertype 3167
-#define wxStyledTextCtrl_SetCaretWidth 3168
-#define wxStyledTextCtrl_GetCaretWidth 3169
-#define wxStyledTextCtrl_SetTargetStart 3170
-#define wxStyledTextCtrl_GetTargetStart 3171
-#define wxStyledTextCtrl_SetTargetEnd 3172
-#define wxStyledTextCtrl_GetTargetEnd 3173
-#define wxStyledTextCtrl_ReplaceTarget 3174
-#define wxStyledTextCtrl_SearchInTarget 3175
-#define wxStyledTextCtrl_SetSearchFlags 3176
-#define wxStyledTextCtrl_GetSearchFlags 3177
-#define wxStyledTextCtrl_CallTipShow 3178
-#define wxStyledTextCtrl_CallTipCancel 3179
-#define wxStyledTextCtrl_CallTipActive 3180
-#define wxStyledTextCtrl_CallTipPosAtStart 3181
-#define wxStyledTextCtrl_CallTipSetHighlight 3182
-#define wxStyledTextCtrl_CallTipSetBackground 3183
-#define wxStyledTextCtrl_CallTipSetForeground 3184
-#define wxStyledTextCtrl_CallTipSetForegroundHighlight 3185
-#define wxStyledTextCtrl_CallTipUseStyle 3186
-#define wxStyledTextCtrl_VisibleFromDocLine 3187
-#define wxStyledTextCtrl_DocLineFromVisible 3188
-#define wxStyledTextCtrl_WrapCount 3189
-#define wxStyledTextCtrl_SetFoldLevel 3190
-#define wxStyledTextCtrl_GetFoldLevel 3191
-#define wxStyledTextCtrl_GetLastChild 3192
-#define wxStyledTextCtrl_GetFoldParent 3193
-#define wxStyledTextCtrl_ShowLines 3194
-#define wxStyledTextCtrl_HideLines 3195
-#define wxStyledTextCtrl_GetLineVisible 3196
-#define wxStyledTextCtrl_SetFoldExpanded 3197
-#define wxStyledTextCtrl_GetFoldExpanded 3198
-#define wxStyledTextCtrl_ToggleFold 3199
-#define wxStyledTextCtrl_EnsureVisible 3200
-#define wxStyledTextCtrl_SetFoldFlags 3201
-#define wxStyledTextCtrl_EnsureVisibleEnforcePolicy 3202
-#define wxStyledTextCtrl_SetTabIndents 3203
-#define wxStyledTextCtrl_GetTabIndents 3204
-#define wxStyledTextCtrl_SetBackSpaceUnIndents 3205
-#define wxStyledTextCtrl_GetBackSpaceUnIndents 3206
-#define wxStyledTextCtrl_SetMouseDwellTime 3207
-#define wxStyledTextCtrl_GetMouseDwellTime 3208
-#define wxStyledTextCtrl_WordStartPosition 3209
-#define wxStyledTextCtrl_WordEndPosition 3210
-#define wxStyledTextCtrl_SetWrapMode 3211
-#define wxStyledTextCtrl_GetWrapMode 3212
-#define wxStyledTextCtrl_SetWrapVisualFlags 3213
-#define wxStyledTextCtrl_GetWrapVisualFlags 3214
-#define wxStyledTextCtrl_SetWrapVisualFlagsLocation 3215
-#define wxStyledTextCtrl_GetWrapVisualFlagsLocation 3216
-#define wxStyledTextCtrl_SetWrapStartIndent 3217
-#define wxStyledTextCtrl_GetWrapStartIndent 3218
-#define wxStyledTextCtrl_SetLayoutCache 3219
-#define wxStyledTextCtrl_GetLayoutCache 3220
-#define wxStyledTextCtrl_SetScrollWidth 3221
-#define wxStyledTextCtrl_GetScrollWidth 3222
-#define wxStyledTextCtrl_TextWidth 3223
-#define wxStyledTextCtrl_GetEndAtLastLine 3224
-#define wxStyledTextCtrl_TextHeight 3225
-#define wxStyledTextCtrl_SetUseVerticalScrollBar 3226
-#define wxStyledTextCtrl_GetUseVerticalScrollBar 3227
-#define wxStyledTextCtrl_AppendText 3228
-#define wxStyledTextCtrl_GetTwoPhaseDraw 3229
-#define wxStyledTextCtrl_SetTwoPhaseDraw 3230
-#define wxStyledTextCtrl_TargetFromSelection 3231
-#define wxStyledTextCtrl_LinesJoin 3232
-#define wxStyledTextCtrl_LinesSplit 3233
-#define wxStyledTextCtrl_SetFoldMarginColour 3234
-#define wxStyledTextCtrl_SetFoldMarginHiColour 3235
-#define wxStyledTextCtrl_LineDown 3236
-#define wxStyledTextCtrl_LineDownExtend 3237
-#define wxStyledTextCtrl_LineUp 3238
-#define wxStyledTextCtrl_LineUpExtend 3239
-#define wxStyledTextCtrl_CharLeft 3240
-#define wxStyledTextCtrl_CharLeftExtend 3241
-#define wxStyledTextCtrl_CharRight 3242
-#define wxStyledTextCtrl_CharRightExtend 3243
-#define wxStyledTextCtrl_WordLeft 3244
-#define wxStyledTextCtrl_WordLeftExtend 3245
-#define wxStyledTextCtrl_WordRight 3246
-#define wxStyledTextCtrl_WordRightExtend 3247
-#define wxStyledTextCtrl_Home 3248
-#define wxStyledTextCtrl_HomeExtend 3249
-#define wxStyledTextCtrl_LineEnd 3250
-#define wxStyledTextCtrl_LineEndExtend 3251
-#define wxStyledTextCtrl_DocumentStart 3252
-#define wxStyledTextCtrl_DocumentStartExtend 3253
-#define wxStyledTextCtrl_DocumentEnd 3254
-#define wxStyledTextCtrl_DocumentEndExtend 3255
-#define wxStyledTextCtrl_PageUp 3256
-#define wxStyledTextCtrl_PageUpExtend 3257
-#define wxStyledTextCtrl_PageDown 3258
-#define wxStyledTextCtrl_PageDownExtend 3259
-#define wxStyledTextCtrl_EditToggleOvertype 3260
-#define wxStyledTextCtrl_Cancel 3261
-#define wxStyledTextCtrl_DeleteBack 3262
-#define wxStyledTextCtrl_Tab 3263
-#define wxStyledTextCtrl_BackTab 3264
-#define wxStyledTextCtrl_NewLine 3265
-#define wxStyledTextCtrl_FormFeed 3266
-#define wxStyledTextCtrl_VCHome 3267
-#define wxStyledTextCtrl_VCHomeExtend 3268
-#define wxStyledTextCtrl_ZoomIn 3269
-#define wxStyledTextCtrl_ZoomOut 3270
-#define wxStyledTextCtrl_DelWordLeft 3271
-#define wxStyledTextCtrl_DelWordRight 3272
-#define wxStyledTextCtrl_LineCut 3273
-#define wxStyledTextCtrl_LineDelete 3274
-#define wxStyledTextCtrl_LineTranspose 3275
-#define wxStyledTextCtrl_LineDuplicate 3276
-#define wxStyledTextCtrl_LowerCase 3277
-#define wxStyledTextCtrl_UpperCase 3278
-#define wxStyledTextCtrl_LineScrollDown 3279
-#define wxStyledTextCtrl_LineScrollUp 3280
-#define wxStyledTextCtrl_DeleteBackNotLine 3281
-#define wxStyledTextCtrl_HomeDisplay 3282
-#define wxStyledTextCtrl_HomeDisplayExtend 3283
-#define wxStyledTextCtrl_LineEndDisplay 3284
-#define wxStyledTextCtrl_LineEndDisplayExtend 3285
-#define wxStyledTextCtrl_HomeWrapExtend 3286
-#define wxStyledTextCtrl_LineEndWrap 3287
-#define wxStyledTextCtrl_LineEndWrapExtend 3288
-#define wxStyledTextCtrl_VCHomeWrap 3289
-#define wxStyledTextCtrl_VCHomeWrapExtend 3290
-#define wxStyledTextCtrl_LineCopy 3291
-#define wxStyledTextCtrl_MoveCaretInsideView 3292
-#define wxStyledTextCtrl_LineLength 3293
-#define wxStyledTextCtrl_BraceHighlight 3294
-#define wxStyledTextCtrl_BraceBadLight 3295
-#define wxStyledTextCtrl_BraceMatch 3296
-#define wxStyledTextCtrl_GetViewEOL 3297
-#define wxStyledTextCtrl_SetViewEOL 3298
-#define wxStyledTextCtrl_SetModEventMask 3299
-#define wxStyledTextCtrl_GetEdgeColumn 3300
-#define wxStyledTextCtrl_SetEdgeColumn 3301
-#define wxStyledTextCtrl_SetEdgeMode 3302
-#define wxStyledTextCtrl_GetEdgeMode 3303
-#define wxStyledTextCtrl_GetEdgeColour 3304
-#define wxStyledTextCtrl_SetEdgeColour 3305
-#define wxStyledTextCtrl_SearchAnchor 3306
-#define wxStyledTextCtrl_SearchNext 3307
-#define wxStyledTextCtrl_SearchPrev 3308
-#define wxStyledTextCtrl_LinesOnScreen 3309
-#define wxStyledTextCtrl_UsePopUp 3310
-#define wxStyledTextCtrl_SelectionIsRectangle 3311
-#define wxStyledTextCtrl_SetZoom 3312
-#define wxStyledTextCtrl_GetZoom 3313
-#define wxStyledTextCtrl_GetModEventMask 3314
-#define wxStyledTextCtrl_SetSTCFocus 3315
-#define wxStyledTextCtrl_GetSTCFocus 3316
-#define wxStyledTextCtrl_SetStatus 3317
-#define wxStyledTextCtrl_GetStatus 3318
-#define wxStyledTextCtrl_SetMouseDownCaptures 3319
-#define wxStyledTextCtrl_GetMouseDownCaptures 3320
-#define wxStyledTextCtrl_SetSTCCursor 3321
-#define wxStyledTextCtrl_GetSTCCursor 3322
-#define wxStyledTextCtrl_SetControlCharSymbol 3323
-#define wxStyledTextCtrl_GetControlCharSymbol 3324
-#define wxStyledTextCtrl_WordPartLeft 3325
-#define wxStyledTextCtrl_WordPartLeftExtend 3326
-#define wxStyledTextCtrl_WordPartRight 3327
-#define wxStyledTextCtrl_WordPartRightExtend 3328
-#define wxStyledTextCtrl_SetVisiblePolicy 3329
-#define wxStyledTextCtrl_DelLineLeft 3330
-#define wxStyledTextCtrl_DelLineRight 3331
-#define wxStyledTextCtrl_GetXOffset 3332
-#define wxStyledTextCtrl_ChooseCaretX 3333
-#define wxStyledTextCtrl_SetXCaretPolicy 3334
-#define wxStyledTextCtrl_SetYCaretPolicy 3335
-#define wxStyledTextCtrl_GetPrintWrapMode 3336
-#define wxStyledTextCtrl_SetHotspotActiveForeground 3337
-#define wxStyledTextCtrl_SetHotspotActiveBackground 3338
-#define wxStyledTextCtrl_SetHotspotActiveUnderline 3339
-#define wxStyledTextCtrl_SetHotspotSingleLine 3340
-#define wxStyledTextCtrl_ParaDownExtend 3341
-#define wxStyledTextCtrl_ParaUp 3342
-#define wxStyledTextCtrl_ParaUpExtend 3343
-#define wxStyledTextCtrl_PositionBefore 3344
-#define wxStyledTextCtrl_PositionAfter 3345
-#define wxStyledTextCtrl_CopyRange 3346
-#define wxStyledTextCtrl_CopyText 3347
-#define wxStyledTextCtrl_SetSelectionMode 3348
-#define wxStyledTextCtrl_GetSelectionMode 3349
-#define wxStyledTextCtrl_LineDownRectExtend 3350
-#define wxStyledTextCtrl_LineUpRectExtend 3351
-#define wxStyledTextCtrl_CharLeftRectExtend 3352
-#define wxStyledTextCtrl_CharRightRectExtend 3353
-#define wxStyledTextCtrl_HomeRectExtend 3354
-#define wxStyledTextCtrl_VCHomeRectExtend 3355
-#define wxStyledTextCtrl_LineEndRectExtend 3356
-#define wxStyledTextCtrl_PageUpRectExtend 3357
-#define wxStyledTextCtrl_PageDownRectExtend 3358
-#define wxStyledTextCtrl_StutteredPageUp 3359
-#define wxStyledTextCtrl_StutteredPageUpExtend 3360
-#define wxStyledTextCtrl_StutteredPageDown 3361
-#define wxStyledTextCtrl_StutteredPageDownExtend 3362
-#define wxStyledTextCtrl_WordLeftEnd 3363
-#define wxStyledTextCtrl_WordLeftEndExtend 3364
-#define wxStyledTextCtrl_WordRightEnd 3365
-#define wxStyledTextCtrl_WordRightEndExtend 3366
-#define wxStyledTextCtrl_SetWhitespaceChars 3367
-#define wxStyledTextCtrl_SetCharsDefault 3368
-#define wxStyledTextCtrl_AutoCompGetCurrent 3369
-#define wxStyledTextCtrl_Allocate 3370
-#define wxStyledTextCtrl_FindColumn 3371
-#define wxStyledTextCtrl_GetCaretSticky 3372
-#define wxStyledTextCtrl_SetCaretSticky 3373
-#define wxStyledTextCtrl_ToggleCaretSticky 3374
-#define wxStyledTextCtrl_SetPasteConvertEndings 3375
-#define wxStyledTextCtrl_GetPasteConvertEndings 3376
-#define wxStyledTextCtrl_SelectionDuplicate 3377
-#define wxStyledTextCtrl_SetCaretLineBackAlpha 3378
-#define wxStyledTextCtrl_GetCaretLineBackAlpha 3379
-#define wxStyledTextCtrl_StartRecord 3380
-#define wxStyledTextCtrl_StopRecord 3381
-#define wxStyledTextCtrl_SetLexer 3382
-#define wxStyledTextCtrl_GetLexer 3383
-#define wxStyledTextCtrl_Colourise 3384
-#define wxStyledTextCtrl_SetProperty 3385
-#define wxStyledTextCtrl_SetKeyWords 3386
-#define wxStyledTextCtrl_SetLexerLanguage 3387
-#define wxStyledTextCtrl_GetProperty 3388
-#define wxStyledTextCtrl_GetStyleBitsNeeded 3389
-#define wxStyledTextCtrl_GetCurrentLine 3390
-#define wxStyledTextCtrl_StyleSetSpec 3391
-#define wxStyledTextCtrl_StyleSetFont 3392
-#define wxStyledTextCtrl_StyleSetFontAttr 3393
-#define wxStyledTextCtrl_StyleSetCharacterSet 3394
-#define wxStyledTextCtrl_StyleSetFontEncoding 3395
-#define wxStyledTextCtrl_CmdKeyExecute 3396
-#define wxStyledTextCtrl_SetMargins 3397
-#define wxStyledTextCtrl_GetSelection 3398
-#define wxStyledTextCtrl_PointFromPosition 3399
-#define wxStyledTextCtrl_ScrollToLine 3400
-#define wxStyledTextCtrl_ScrollToColumn 3401
-#define wxStyledTextCtrl_SetVScrollBar 3402
-#define wxStyledTextCtrl_SetHScrollBar 3403
-#define wxStyledTextCtrl_GetLastKeydownProcessed 3404
-#define wxStyledTextCtrl_SetLastKeydownProcessed 3405
-#define wxStyledTextCtrl_SaveFile 3406
-#define wxStyledTextCtrl_LoadFile 3407
-#define wxStyledTextCtrl_DoDragOver 3408
-#define wxStyledTextCtrl_DoDropText 3409
-#define wxStyledTextCtrl_GetUseAntiAliasing 3410
-#define wxStyledTextCtrl_AddTextRaw 3411
-#define wxStyledTextCtrl_InsertTextRaw 3412
-#define wxStyledTextCtrl_GetCurLineRaw 3413
-#define wxStyledTextCtrl_GetLineRaw 3414
-#define wxStyledTextCtrl_GetSelectedTextRaw 3415
-#define wxStyledTextCtrl_GetTextRangeRaw 3416
-#define wxStyledTextCtrl_SetTextRaw 3417
-#define wxStyledTextCtrl_GetTextRaw 3418
-#define wxStyledTextCtrl_AppendTextRaw 3419
-#define wxArtProvider_GetBitmap 3420
-#define wxArtProvider_GetIcon 3421
-#define wxTreeEvent_GetKeyCode 3422
-#define wxTreeEvent_GetItem 3423
-#define wxTreeEvent_GetKeyEvent 3424
-#define wxTreeEvent_GetLabel 3425
-#define wxTreeEvent_GetOldItem 3426
-#define wxTreeEvent_GetPoint 3427
-#define wxTreeEvent_IsEditCancelled 3428
-#define wxTreeEvent_SetToolTip 3429
-#define wxNotebookEvent_GetOldSelection 3430
-#define wxNotebookEvent_GetSelection 3431
-#define wxNotebookEvent_SetOldSelection 3432
-#define wxNotebookEvent_SetSelection 3433
-#define wxFileDataObject_new 3434
-#define wxFileDataObject_AddFile 3435
-#define wxFileDataObject_GetFilenames 3436
-#define wxFileDataObject_destroy 3437
-#define wxTextDataObject_new 3438
-#define wxTextDataObject_GetTextLength 3439
-#define wxTextDataObject_GetText 3440
-#define wxTextDataObject_SetText 3441
-#define wxTextDataObject_destroy 3442
-#define wxBitmapDataObject_new_1_1 3443
-#define wxBitmapDataObject_new_1_0 3444
-#define wxBitmapDataObject_GetBitmap 3445
-#define wxBitmapDataObject_SetBitmap 3446
-#define wxBitmapDataObject_destroy 3447
-#define wxClipboard_new 3449
-#define wxClipboard_destruct 3450
-#define wxClipboard_AddData 3451
-#define wxClipboard_Clear 3452
-#define wxClipboard_Close 3453
-#define wxClipboard_Flush 3454
-#define wxClipboard_GetData 3455
-#define wxClipboard_IsOpened 3456
-#define wxClipboard_Open 3457
-#define wxClipboard_SetData 3458
-#define wxClipboard_UsePrimarySelection 3460
-#define wxClipboard_IsSupported 3461
-#define wxClipboard_Get 3462
-#define wxSpinEvent_GetPosition 3463
-#define wxSpinEvent_SetPosition 3464
-#define wxSplitterWindow_new_0 3465
-#define wxSplitterWindow_new_2 3466
-#define wxSplitterWindow_destruct 3467
-#define wxSplitterWindow_Create 3468
-#define wxSplitterWindow_GetMinimumPaneSize 3469
-#define wxSplitterWindow_GetSashGravity 3470
-#define wxSplitterWindow_GetSashPosition 3471
-#define wxSplitterWindow_GetSplitMode 3472
-#define wxSplitterWindow_GetWindow1 3473
-#define wxSplitterWindow_GetWindow2 3474
-#define wxSplitterWindow_Initialize 3475
-#define wxSplitterWindow_IsSplit 3476
-#define wxSplitterWindow_ReplaceWindow 3477
-#define wxSplitterWindow_SetSashGravity 3478
-#define wxSplitterWindow_SetSashPosition 3479
-#define wxSplitterWindow_SetSashSize 3480
-#define wxSplitterWindow_SetMinimumPaneSize 3481
-#define wxSplitterWindow_SetSplitMode 3482
-#define wxSplitterWindow_SplitHorizontally 3483
-#define wxSplitterWindow_SplitVertically 3484
-#define wxSplitterWindow_Unsplit 3485
-#define wxSplitterWindow_UpdateSize 3486
-#define wxSplitterEvent_GetSashPosition 3487
-#define wxSplitterEvent_GetX 3488
-#define wxSplitterEvent_GetY 3489
-#define wxSplitterEvent_GetWindowBeingRemoved 3490
-#define wxSplitterEvent_SetSashPosition 3491
-#define wxHtmlWindow_new_0 3492
-#define wxHtmlWindow_new_2 3493
-#define wxHtmlWindow_AppendToPage 3494
-#define wxHtmlWindow_GetOpenedAnchor 3495
-#define wxHtmlWindow_GetOpenedPage 3496
-#define wxHtmlWindow_GetOpenedPageTitle 3497
-#define wxHtmlWindow_GetRelatedFrame 3498
-#define wxHtmlWindow_HistoryBack 3499
-#define wxHtmlWindow_HistoryCanBack 3500
-#define wxHtmlWindow_HistoryCanForward 3501
-#define wxHtmlWindow_HistoryClear 3502
-#define wxHtmlWindow_HistoryForward 3503
-#define wxHtmlWindow_LoadFile 3504
-#define wxHtmlWindow_LoadPage 3505
-#define wxHtmlWindow_SelectAll 3506
-#define wxHtmlWindow_SelectionToText 3507
-#define wxHtmlWindow_SelectLine 3508
-#define wxHtmlWindow_SelectWord 3509
-#define wxHtmlWindow_SetBorders 3510
-#define wxHtmlWindow_SetFonts 3511
-#define wxHtmlWindow_SetPage 3512
-#define wxHtmlWindow_SetRelatedFrame 3513
-#define wxHtmlWindow_SetRelatedStatusBar 3514
-#define wxHtmlWindow_ToText 3515
-#define wxHtmlWindow_destroy 3516
-#define wxHtmlLinkEvent_GetLinkInfo 3517
-#define wxSystemSettings_GetColour 3518
-#define wxSystemSettings_GetFont 3519
-#define wxSystemSettings_GetMetric 3520
-#define wxSystemSettings_GetScreenType 3521
-#define wxSystemOptions_GetOption 3522
-#define wxSystemOptions_GetOptionInt 3523
-#define wxSystemOptions_HasOption 3524
-#define wxSystemOptions_IsFalse 3525
-#define wxSystemOptions_SetOption_2_1 3526
-#define wxSystemOptions_SetOption_2_0 3527
-#define wxAuiNotebookEvent_SetSelection 3528
-#define wxAuiNotebookEvent_GetSelection 3529
-#define wxAuiNotebookEvent_SetOldSelection 3530
-#define wxAuiNotebookEvent_GetOldSelection 3531
-#define wxAuiNotebookEvent_SetDragSource 3532
-#define wxAuiNotebookEvent_GetDragSource 3533
-#define wxAuiManagerEvent_SetManager 3534
-#define wxAuiManagerEvent_GetManager 3535
-#define wxAuiManagerEvent_SetPane 3536
-#define wxAuiManagerEvent_GetPane 3537
-#define wxAuiManagerEvent_SetButton 3538
-#define wxAuiManagerEvent_GetButton 3539
-#define wxAuiManagerEvent_SetDC 3540
-#define wxAuiManagerEvent_GetDC 3541
-#define wxAuiManagerEvent_Veto 3542
-#define wxAuiManagerEvent_GetVeto 3543
-#define wxAuiManagerEvent_SetCanVeto 3544
-#define wxAuiManagerEvent_CanVeto 3545
-#define wxLogNull_new 3546
-#define wxLogNull_destroy 3547
-#define wxTaskBarIcon_new 3548
-#define wxTaskBarIcon_destruct 3549
-#define wxTaskBarIcon_PopupMenu 3550
-#define wxTaskBarIcon_RemoveIcon 3551
-#define wxTaskBarIcon_SetIcon 3552
-#define wxLocale_new_0 3553
-#define wxLocale_new_2 3555
-#define wxLocale_destruct 3556
-#define wxLocale_Init 3558
-#define wxLocale_AddCatalog_1 3559
-#define wxLocale_AddCatalog_3 3560
-#define wxLocale_AddCatalogLookupPathPrefix 3561
-#define wxLocale_GetCanonicalName 3562
-#define wxLocale_GetLanguage 3563
-#define wxLocale_GetLanguageName 3564
-#define wxLocale_GetLocale 3565
-#define wxLocale_GetName 3566
-#define wxLocale_GetString_2 3567
-#define wxLocale_GetString_4 3568
-#define wxLocale_GetHeaderValue 3569
-#define wxLocale_GetSysName 3570
-#define wxLocale_GetSystemEncoding 3571
-#define wxLocale_GetSystemEncodingName 3572
-#define wxLocale_GetSystemLanguage 3573
-#define wxLocale_IsLoaded 3574
-#define wxLocale_IsOk 3575
-#define wxActivateEvent_GetActive 3576
-#define wxPopupWindow_new_2 3578
-#define wxPopupWindow_new_0 3579
-#define wxPopupWindow_destruct 3581
-#define wxPopupWindow_Create 3582
-#define wxPopupWindow_Position 3583
-#define wxPopupTransientWindow_new_0 3584
-#define wxPopupTransientWindow_new_2 3585
-#define wxPopupTransientWindow_destruct 3586
-#define wxPopupTransientWindow_Popup 3587
-#define wxPopupTransientWindow_Dismiss 3588
-#define wxOverlay_new 3589
-#define wxOverlay_destruct 3590
-#define wxOverlay_Reset 3591
-#define wxDCOverlay_new_6 3592
-#define wxDCOverlay_new_2 3593
-#define wxDCOverlay_destruct 3594
-#define wxDCOverlay_Clear 3595
-#define wxDropFilesEvent_GetPosition 3596
-#define wxDropFilesEvent_GetNumberOfFiles 3597
-#define wxDropFilesEvent_GetFiles 3598
+#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/include/wx.hrl b/lib/wx/include/wx.hrl
index 8dbfe0c30f..a14cc89cee 100644
--- a/lib/wx/include/wx.hrl
+++ b/lib/wx/include/wx.hrl
@@ -4092,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..4a178ea1e4 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) ->
@@ -2949,8 +2953,9 @@ callList(List) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCallLists.xml">external</a> documentation.
-spec callLists(Lists) -> 'ok' when Lists :: [integer()].
callLists(Lists) ->
- cast(5108, <<(length(Lists)):?GLuint,
- (<< <<C:?GLuint>> || C <- Lists>>)/binary,0:(((1+length(Lists)) rem 2)*32)>>).
+ ListsLen = length(Lists),
+ cast(5108, <<ListsLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Lists>>)/binary,0:(((1+ListsLen) rem 2)*32)>>).
%% @doc set the display-list base for
%%
@@ -6945,8 +6950,9 @@ genTextures(N) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteTextures.xml">external</a> documentation.
-spec deleteTextures(Textures) -> 'ok' when Textures :: [integer()].
deleteTextures(Textures) ->
- cast(5272, <<(length(Textures)):?GLuint,
- (<< <<C:?GLuint>> || C <- Textures>>)/binary,0:(((1+length(Textures)) rem 2)*32)>>).
+ TexturesLen = length(Textures),
+ cast(5272, <<TexturesLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Textures>>)/binary,0:(((1+TexturesLen) rem 2)*32)>>).
%% @doc Bind a named texture to a texturing target
%%
@@ -7026,9 +7032,11 @@ bindTexture(Target,Texture) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glPrioritizeTextures.xml">external</a> documentation.
-spec prioritizeTextures(Textures, Priorities) -> 'ok' when Textures :: [integer()],Priorities :: [clamp()].
prioritizeTextures(Textures,Priorities) ->
- cast(5274, <<(length(Textures)):?GLuint,
- (<< <<C:?GLuint>> || C <- Textures>>)/binary,0:(((1+length(Textures)) rem 2)*32),(length(Priorities)):?GLuint,
- (<< <<C:?GLclampf>> || C <- Priorities>>)/binary,0:(((1+length(Priorities)) rem 2)*32)>>).
+ TexturesLen = length(Textures),
+ PrioritiesLen = length(Priorities),
+ cast(5274, <<TexturesLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Textures>>)/binary,0:(((1+TexturesLen) rem 2)*32),PrioritiesLen:?GLuint,
+ (<< <<C:?GLclampf>> || C <- Priorities>>)/binary,0:(((1+PrioritiesLen) rem 2)*32)>>).
%% @doc Determine if textures are loaded in texture memory
%%
@@ -7052,8 +7060,9 @@ prioritizeTextures(Textures,Priorities) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glAreTexturesResident.xml">external</a> documentation.
-spec areTexturesResident(Textures) -> {0|1,Residences :: [0|1]} when Textures :: [integer()].
areTexturesResident(Textures) ->
- call(5275, <<(length(Textures)):?GLuint,
- (<< <<C:?GLuint>> || C <- Textures>>)/binary,0:(((1+length(Textures)) rem 2)*32)>>).
+ TexturesLen = length(Textures),
+ call(5275, <<TexturesLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Textures>>)/binary,0:(((1+TexturesLen) rem 2)*32)>>).
%% @doc Determine if a name corresponds to a texture
%%
@@ -9650,11 +9659,19 @@ blendFuncSeparate(SfactorRGB,DfactorRGB,SfactorAlpha,DfactorAlpha) ->
%%
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glMultiDrawArrays.xml">external</a> documentation.
--spec multiDrawArrays(Mode, First, Count) -> 'ok' when Mode :: enum(),First :: [integer()],Count :: [integer()].
+-spec multiDrawArrays(Mode, First, Count) -> 'ok' when Mode :: enum(),First :: [integer()]|mem(),Count :: [integer()]|mem().
+multiDrawArrays(Mode,First,Count) when is_list(First), is_list(Count) ->
+ FirstLen = length(First),
+ CountLen = length(Count),
+ cast(5395, <<Mode:?GLenum,FirstLen:?GLuint,
+ (<< <<C:?GLint>> || C <- First>>)/binary,0:(((FirstLen) rem 2)*32),CountLen:?GLuint,
+ (<< <<C:?GLsizei>> || C <- Count>>)/binary,0:(((1+CountLen) rem 2)*32)>>);
multiDrawArrays(Mode,First,Count) ->
- cast(5395, <<Mode:?GLenum,(length(First)):?GLuint,
- (<< <<C:?GLint>> || C <- First>>)/binary,0:(((length(First)) rem 2)*32),(length(Count)):?GLuint,
- (<< <<C:?GLsizei>> || C <- Count>>)/binary,0:(((1+length(Count)) rem 2)*32)>>).
+ send_bin(First),
+ FirstLen = byte_size(if is_binary(First) -> First; is_tuple(First) -> element(2, First) end) div 4,
+ send_bin(Count),
+ CountLen = byte_size(if is_binary(Count) -> Count; is_tuple(Count) -> element(2, Count) end) div 4,
+ cast(5396, <<Mode:?GLenum,FirstLen:?GLint,CountLen:?GLsizei>>).
%% @doc Specify point parameters
%%
@@ -9671,26 +9688,26 @@ multiDrawArrays(Mode,First,Count) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glPointParameter.xml">external</a> documentation.
-spec pointParameterf(Pname, Param) -> 'ok' when Pname :: enum(),Param :: float().
pointParameterf(Pname,Param) ->
- cast(5396, <<Pname:?GLenum,Param:?GLfloat>>).
+ cast(5397, <<Pname:?GLenum,Param:?GLfloat>>).
%% @doc
%% See {@link pointParameterf/2}
-spec pointParameterfv(Pname, Params) -> 'ok' when Pname :: enum(),Params :: tuple().
pointParameterfv(Pname,Params) ->
- cast(5397, <<Pname:?GLenum,(size(Params)):?GLuint,
+ cast(5398, <<Pname:?GLenum,(size(Params)):?GLuint,
(<< <<C:?GLfloat>> ||C <- tuple_to_list(Params)>>)/binary,0:(((0+size(Params)) rem 2)*32)>>).
%% @doc
%% See {@link pointParameterf/2}
-spec pointParameteri(Pname, Param) -> 'ok' when Pname :: enum(),Param :: integer().
pointParameteri(Pname,Param) ->
- cast(5398, <<Pname:?GLenum,Param:?GLint>>).
+ cast(5399, <<Pname:?GLenum,Param:?GLint>>).
%% @doc
%% See {@link pointParameterf/2}
-spec pointParameteriv(Pname, Params) -> 'ok' when Pname :: enum(),Params :: tuple().
pointParameteriv(Pname,Params) ->
- cast(5399, <<Pname:?GLenum,(size(Params)):?GLuint,
+ cast(5400, <<Pname:?GLenum,(size(Params)):?GLuint,
(<< <<C:?GLint>> ||C <- tuple_to_list(Params)>>)/binary,0:(((0+size(Params)) rem 2)*32)>>).
%% @doc Set the current fog coordinates
@@ -9702,7 +9719,7 @@ pointParameteriv(Pname,Params) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glFogCoord.xml">external</a> documentation.
-spec fogCoordf(Coord) -> 'ok' when Coord :: float().
fogCoordf(Coord) ->
- cast(5400, <<Coord:?GLfloat>>).
+ cast(5401, <<Coord:?GLfloat>>).
%% @equiv fogCoordf(Coord)
-spec fogCoordfv(Coord) -> 'ok' when Coord :: {Coord :: float()}.
@@ -9712,7 +9729,7 @@ fogCoordfv({Coord}) -> fogCoordf(Coord).
%% See {@link fogCoordf/1}
-spec fogCoordd(Coord) -> 'ok' when Coord :: float().
fogCoordd(Coord) ->
- cast(5401, <<Coord:?GLdouble>>).
+ cast(5402, <<Coord:?GLdouble>>).
%% @equiv fogCoordd(Coord)
-spec fogCoorddv(Coord) -> 'ok' when Coord :: {Coord :: float()}.
@@ -9743,10 +9760,10 @@ fogCoorddv({Coord}) -> fogCoordd(Coord).
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glFogCoordPointer.xml">external</a> documentation.
-spec fogCoordPointer(Type, Stride, Pointer) -> 'ok' when Type :: enum(),Stride :: integer(),Pointer :: offset()|mem().
fogCoordPointer(Type,Stride,Pointer) when is_integer(Pointer) ->
- cast(5402, <<Type:?GLenum,Stride:?GLsizei,Pointer:?GLuint>>);
+ cast(5403, <<Type:?GLenum,Stride:?GLsizei,Pointer:?GLuint>>);
fogCoordPointer(Type,Stride,Pointer) ->
send_bin(Pointer),
- cast(5403, <<Type:?GLenum,Stride:?GLsizei>>).
+ cast(5404, <<Type:?GLenum,Stride:?GLsizei>>).
%% @doc Set the current secondary color
%%
@@ -9780,7 +9797,7 @@ fogCoordPointer(Type,Stride,Pointer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColor.xml">external</a> documentation.
-spec secondaryColor3b(Red, Green, Blue) -> 'ok' when Red :: integer(),Green :: integer(),Blue :: integer().
secondaryColor3b(Red,Green,Blue) ->
- cast(5404, <<Red:?GLbyte,Green:?GLbyte,Blue:?GLbyte>>).
+ cast(5405, <<Red:?GLbyte,Green:?GLbyte,Blue:?GLbyte>>).
%% @equiv secondaryColor3b(Red,Green,Blue)
-spec secondaryColor3bv(V) -> 'ok' when V :: {Red :: integer(),Green :: integer(),Blue :: integer()}.
@@ -9790,7 +9807,7 @@ secondaryColor3bv({Red,Green,Blue}) -> secondaryColor3b(Red,Green,Blue).
%% See {@link secondaryColor3b/3}
-spec secondaryColor3d(Red, Green, Blue) -> 'ok' when Red :: float(),Green :: float(),Blue :: float().
secondaryColor3d(Red,Green,Blue) ->
- cast(5405, <<Red:?GLdouble,Green:?GLdouble,Blue:?GLdouble>>).
+ cast(5406, <<Red:?GLdouble,Green:?GLdouble,Blue:?GLdouble>>).
%% @equiv secondaryColor3d(Red,Green,Blue)
-spec secondaryColor3dv(V) -> 'ok' when V :: {Red :: float(),Green :: float(),Blue :: float()}.
@@ -9800,7 +9817,7 @@ secondaryColor3dv({Red,Green,Blue}) -> secondaryColor3d(Red,Green,Blue).
%% See {@link secondaryColor3b/3}
-spec secondaryColor3f(Red, Green, Blue) -> 'ok' when Red :: float(),Green :: float(),Blue :: float().
secondaryColor3f(Red,Green,Blue) ->
- cast(5406, <<Red:?GLfloat,Green:?GLfloat,Blue:?GLfloat>>).
+ cast(5407, <<Red:?GLfloat,Green:?GLfloat,Blue:?GLfloat>>).
%% @equiv secondaryColor3f(Red,Green,Blue)
-spec secondaryColor3fv(V) -> 'ok' when V :: {Red :: float(),Green :: float(),Blue :: float()}.
@@ -9810,7 +9827,7 @@ secondaryColor3fv({Red,Green,Blue}) -> secondaryColor3f(Red,Green,Blue).
%% See {@link secondaryColor3b/3}
-spec secondaryColor3i(Red, Green, Blue) -> 'ok' when Red :: integer(),Green :: integer(),Blue :: integer().
secondaryColor3i(Red,Green,Blue) ->
- cast(5407, <<Red:?GLint,Green:?GLint,Blue:?GLint>>).
+ cast(5408, <<Red:?GLint,Green:?GLint,Blue:?GLint>>).
%% @equiv secondaryColor3i(Red,Green,Blue)
-spec secondaryColor3iv(V) -> 'ok' when V :: {Red :: integer(),Green :: integer(),Blue :: integer()}.
@@ -9820,7 +9837,7 @@ secondaryColor3iv({Red,Green,Blue}) -> secondaryColor3i(Red,Green,Blue).
%% See {@link secondaryColor3b/3}
-spec secondaryColor3s(Red, Green, Blue) -> 'ok' when Red :: integer(),Green :: integer(),Blue :: integer().
secondaryColor3s(Red,Green,Blue) ->
- cast(5408, <<Red:?GLshort,Green:?GLshort,Blue:?GLshort>>).
+ cast(5409, <<Red:?GLshort,Green:?GLshort,Blue:?GLshort>>).
%% @equiv secondaryColor3s(Red,Green,Blue)
-spec secondaryColor3sv(V) -> 'ok' when V :: {Red :: integer(),Green :: integer(),Blue :: integer()}.
@@ -9830,7 +9847,7 @@ secondaryColor3sv({Red,Green,Blue}) -> secondaryColor3s(Red,Green,Blue).
%% See {@link secondaryColor3b/3}
-spec secondaryColor3ub(Red, Green, Blue) -> 'ok' when Red :: integer(),Green :: integer(),Blue :: integer().
secondaryColor3ub(Red,Green,Blue) ->
- cast(5409, <<Red:?GLubyte,Green:?GLubyte,Blue:?GLubyte>>).
+ cast(5410, <<Red:?GLubyte,Green:?GLubyte,Blue:?GLubyte>>).
%% @equiv secondaryColor3ub(Red,Green,Blue)
-spec secondaryColor3ubv(V) -> 'ok' when V :: {Red :: integer(),Green :: integer(),Blue :: integer()}.
@@ -9840,7 +9857,7 @@ secondaryColor3ubv({Red,Green,Blue}) -> secondaryColor3ub(Red,Green,Blue).
%% See {@link secondaryColor3b/3}
-spec secondaryColor3ui(Red, Green, Blue) -> 'ok' when Red :: integer(),Green :: integer(),Blue :: integer().
secondaryColor3ui(Red,Green,Blue) ->
- cast(5410, <<Red:?GLuint,Green:?GLuint,Blue:?GLuint>>).
+ cast(5411, <<Red:?GLuint,Green:?GLuint,Blue:?GLuint>>).
%% @equiv secondaryColor3ui(Red,Green,Blue)
-spec secondaryColor3uiv(V) -> 'ok' when V :: {Red :: integer(),Green :: integer(),Blue :: integer()}.
@@ -9850,7 +9867,7 @@ secondaryColor3uiv({Red,Green,Blue}) -> secondaryColor3ui(Red,Green,Blue).
%% See {@link secondaryColor3b/3}
-spec secondaryColor3us(Red, Green, Blue) -> 'ok' when Red :: integer(),Green :: integer(),Blue :: integer().
secondaryColor3us(Red,Green,Blue) ->
- cast(5411, <<Red:?GLushort,Green:?GLushort,Blue:?GLushort>>).
+ cast(5412, <<Red:?GLushort,Green:?GLushort,Blue:?GLushort>>).
%% @equiv secondaryColor3us(Red,Green,Blue)
-spec secondaryColor3usv(V) -> 'ok' when V :: {Red :: integer(),Green :: integer(),Blue :: integer()}.
@@ -9883,10 +9900,10 @@ secondaryColor3usv({Red,Green,Blue}) -> secondaryColor3us(Red,Green,Blue).
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glSecondaryColorPointer.xml">external</a> documentation.
-spec secondaryColorPointer(Size, Type, Stride, Pointer) -> 'ok' when Size :: integer(),Type :: enum(),Stride :: integer(),Pointer :: offset()|mem().
secondaryColorPointer(Size,Type,Stride,Pointer) when is_integer(Pointer) ->
- cast(5412, <<Size:?GLint,Type:?GLenum,Stride:?GLsizei,Pointer:?GLuint>>);
+ cast(5413, <<Size:?GLint,Type:?GLenum,Stride:?GLsizei,Pointer:?GLuint>>);
secondaryColorPointer(Size,Type,Stride,Pointer) ->
send_bin(Pointer),
- cast(5413, <<Size:?GLint,Type:?GLenum,Stride:?GLsizei>>).
+ cast(5414, <<Size:?GLint,Type:?GLenum,Stride:?GLsizei>>).
%% @doc Specify the raster position in window coordinates for pixel operations
%%
@@ -9929,7 +9946,7 @@ secondaryColorPointer(Size,Type,Stride,Pointer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWindowPos.xml">external</a> documentation.
-spec windowPos2d(X, Y) -> 'ok' when X :: float(),Y :: float().
windowPos2d(X,Y) ->
- cast(5414, <<X:?GLdouble,Y:?GLdouble>>).
+ cast(5415, <<X:?GLdouble,Y:?GLdouble>>).
%% @equiv windowPos2d(X,Y)
-spec windowPos2dv(V) -> 'ok' when V :: {X :: float(),Y :: float()}.
@@ -9939,7 +9956,7 @@ windowPos2dv({X,Y}) -> windowPos2d(X,Y).
%% See {@link windowPos2d/2}
-spec windowPos2f(X, Y) -> 'ok' when X :: float(),Y :: float().
windowPos2f(X,Y) ->
- cast(5415, <<X:?GLfloat,Y:?GLfloat>>).
+ cast(5416, <<X:?GLfloat,Y:?GLfloat>>).
%% @equiv windowPos2f(X,Y)
-spec windowPos2fv(V) -> 'ok' when V :: {X :: float(),Y :: float()}.
@@ -9949,7 +9966,7 @@ windowPos2fv({X,Y}) -> windowPos2f(X,Y).
%% See {@link windowPos2d/2}
-spec windowPos2i(X, Y) -> 'ok' when X :: integer(),Y :: integer().
windowPos2i(X,Y) ->
- cast(5416, <<X:?GLint,Y:?GLint>>).
+ cast(5417, <<X:?GLint,Y:?GLint>>).
%% @equiv windowPos2i(X,Y)
-spec windowPos2iv(V) -> 'ok' when V :: {X :: integer(),Y :: integer()}.
@@ -9959,7 +9976,7 @@ windowPos2iv({X,Y}) -> windowPos2i(X,Y).
%% See {@link windowPos2d/2}
-spec windowPos2s(X, Y) -> 'ok' when X :: integer(),Y :: integer().
windowPos2s(X,Y) ->
- cast(5417, <<X:?GLshort,Y:?GLshort>>).
+ cast(5418, <<X:?GLshort,Y:?GLshort>>).
%% @equiv windowPos2s(X,Y)
-spec windowPos2sv(V) -> 'ok' when V :: {X :: integer(),Y :: integer()}.
@@ -9969,7 +9986,7 @@ windowPos2sv({X,Y}) -> windowPos2s(X,Y).
%% See {@link windowPos2d/2}
-spec windowPos3d(X, Y, Z) -> 'ok' when X :: float(),Y :: float(),Z :: float().
windowPos3d(X,Y,Z) ->
- cast(5418, <<X:?GLdouble,Y:?GLdouble,Z:?GLdouble>>).
+ cast(5419, <<X:?GLdouble,Y:?GLdouble,Z:?GLdouble>>).
%% @equiv windowPos3d(X,Y,Z)
-spec windowPos3dv(V) -> 'ok' when V :: {X :: float(),Y :: float(),Z :: float()}.
@@ -9979,7 +9996,7 @@ windowPos3dv({X,Y,Z}) -> windowPos3d(X,Y,Z).
%% See {@link windowPos2d/2}
-spec windowPos3f(X, Y, Z) -> 'ok' when X :: float(),Y :: float(),Z :: float().
windowPos3f(X,Y,Z) ->
- cast(5419, <<X:?GLfloat,Y:?GLfloat,Z:?GLfloat>>).
+ cast(5420, <<X:?GLfloat,Y:?GLfloat,Z:?GLfloat>>).
%% @equiv windowPos3f(X,Y,Z)
-spec windowPos3fv(V) -> 'ok' when V :: {X :: float(),Y :: float(),Z :: float()}.
@@ -9989,7 +10006,7 @@ windowPos3fv({X,Y,Z}) -> windowPos3f(X,Y,Z).
%% See {@link windowPos2d/2}
-spec windowPos3i(X, Y, Z) -> 'ok' when X :: integer(),Y :: integer(),Z :: integer().
windowPos3i(X,Y,Z) ->
- cast(5420, <<X:?GLint,Y:?GLint,Z:?GLint>>).
+ cast(5421, <<X:?GLint,Y:?GLint,Z:?GLint>>).
%% @equiv windowPos3i(X,Y,Z)
-spec windowPos3iv(V) -> 'ok' when V :: {X :: integer(),Y :: integer(),Z :: integer()}.
@@ -9999,7 +10016,7 @@ windowPos3iv({X,Y,Z}) -> windowPos3i(X,Y,Z).
%% See {@link windowPos2d/2}
-spec windowPos3s(X, Y, Z) -> 'ok' when X :: integer(),Y :: integer(),Z :: integer().
windowPos3s(X,Y,Z) ->
- cast(5421, <<X:?GLshort,Y:?GLshort,Z:?GLshort>>).
+ cast(5422, <<X:?GLshort,Y:?GLshort,Z:?GLshort>>).
%% @equiv windowPos3s(X,Y,Z)
-spec windowPos3sv(V) -> 'ok' when V :: {X :: integer(),Y :: integer(),Z :: integer()}.
@@ -10020,7 +10037,7 @@ windowPos3sv({X,Y,Z}) -> windowPos3s(X,Y,Z).
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenQueries.xml">external</a> documentation.
-spec genQueries(N) -> [integer()] when N :: integer().
genQueries(N) ->
- call(5422, <<N:?GLsizei>>).
+ call(5423, <<N:?GLsizei>>).
%% @doc Delete named query objects
%%
@@ -10034,8 +10051,9 @@ genQueries(N) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteQueries.xml">external</a> documentation.
-spec deleteQueries(Ids) -> 'ok' when Ids :: [integer()].
deleteQueries(Ids) ->
- cast(5423, <<(length(Ids)):?GLuint,
- (<< <<C:?GLuint>> || C <- Ids>>)/binary,0:(((1+length(Ids)) rem 2)*32)>>).
+ IdsLen = length(Ids),
+ cast(5424, <<IdsLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Ids>>)/binary,0:(((1+IdsLen) rem 2)*32)>>).
%% @doc Determine if a name corresponds to a query object
%%
@@ -10049,7 +10067,7 @@ deleteQueries(Ids) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsQuery.xml">external</a> documentation.
-spec isQuery(Id) -> 0|1 when Id :: integer().
isQuery(Id) ->
- call(5424, <<Id:?GLuint>>).
+ call(5425, <<Id:?GLuint>>).
%% @doc Delimit the boundaries of a query object
%%
@@ -10116,20 +10134,20 @@ isQuery(Id) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBeginQuery.xml">external</a> documentation.
-spec beginQuery(Target, Id) -> 'ok' when Target :: enum(),Id :: integer().
beginQuery(Target,Id) ->
- cast(5425, <<Target:?GLenum,Id:?GLuint>>).
+ cast(5426, <<Target:?GLenum,Id:?GLuint>>).
%% @doc
%% See {@link beginQuery/2}
-spec endQuery(Target) -> 'ok' when Target :: enum().
endQuery(Target) ->
- cast(5426, <<Target:?GLenum>>).
+ cast(5427, <<Target:?GLenum>>).
%% @doc glGetQuery
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetQuery.xml">external</a> documentation.
-spec getQueryiv(Target, Pname) -> integer() when Target :: enum(),Pname :: enum().
getQueryiv(Target,Pname) ->
- call(5427, <<Target:?GLenum,Pname:?GLenum>>).
+ call(5428, <<Target:?GLenum,Pname:?GLenum>>).
%% @doc Return parameters of a query object
%%
@@ -10149,13 +10167,13 @@ getQueryiv(Target,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetQueryObject.xml">external</a> documentation.
-spec getQueryObjectiv(Id, Pname) -> integer() when Id :: integer(),Pname :: enum().
getQueryObjectiv(Id,Pname) ->
- call(5428, <<Id:?GLuint,Pname:?GLenum>>).
+ call(5429, <<Id:?GLuint,Pname:?GLenum>>).
%% @doc
%% See {@link getQueryObjectiv/2}
-spec getQueryObjectuiv(Id, Pname) -> integer() when Id :: integer(),Pname :: enum().
getQueryObjectuiv(Id,Pname) ->
- call(5429, <<Id:?GLuint,Pname:?GLenum>>).
+ call(5430, <<Id:?GLuint,Pname:?GLenum>>).
%% @doc Bind a named buffer object
%%
@@ -10238,7 +10256,7 @@ getQueryObjectuiv(Id,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindBuffer.xml">external</a> documentation.
-spec bindBuffer(Target, Buffer) -> 'ok' when Target :: enum(),Buffer :: integer().
bindBuffer(Target,Buffer) ->
- cast(5430, <<Target:?GLenum,Buffer:?GLuint>>).
+ cast(5431, <<Target:?GLenum,Buffer:?GLuint>>).
%% @doc Delete named buffer objects
%%
@@ -10253,8 +10271,9 @@ bindBuffer(Target,Buffer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteBuffers.xml">external</a> documentation.
-spec deleteBuffers(Buffers) -> 'ok' when Buffers :: [integer()].
deleteBuffers(Buffers) ->
- cast(5431, <<(length(Buffers)):?GLuint,
- (<< <<C:?GLuint>> || C <- Buffers>>)/binary,0:(((1+length(Buffers)) rem 2)*32)>>).
+ BuffersLen = length(Buffers),
+ cast(5432, <<BuffersLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Buffers>>)/binary,0:(((1+BuffersLen) rem 2)*32)>>).
%% @doc Generate buffer object names
%%
@@ -10272,7 +10291,7 @@ deleteBuffers(Buffers) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenBuffers.xml">external</a> documentation.
-spec genBuffers(N) -> [integer()] when N :: integer().
genBuffers(N) ->
- call(5432, <<N:?GLsizei>>).
+ call(5433, <<N:?GLsizei>>).
%% @doc Determine if a name corresponds to a buffer object
%%
@@ -10287,7 +10306,7 @@ genBuffers(N) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsBuffer.xml">external</a> documentation.
-spec isBuffer(Buffer) -> 0|1 when Buffer :: integer().
isBuffer(Buffer) ->
- call(5433, <<Buffer:?GLuint>>).
+ call(5434, <<Buffer:?GLuint>>).
%% @doc Creates and initializes a buffer object's data store
%%
@@ -10325,10 +10344,10 @@ isBuffer(Buffer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBufferData.xml">external</a> documentation.
-spec bufferData(Target, Size, Data, Usage) -> 'ok' when Target :: enum(),Size :: integer(),Data :: offset()|mem(),Usage :: enum().
bufferData(Target,Size,Data,Usage) when is_integer(Data) ->
- cast(5434, <<Target:?GLenum,0:32,Size:?GLsizeiptr,Data:?GLuint,Usage:?GLenum>>);
+ cast(5435, <<Target:?GLenum,0:32,Size:?GLsizeiptr,Data:?GLuint,Usage:?GLenum>>);
bufferData(Target,Size,Data,Usage) ->
send_bin(Data),
- cast(5435, <<Target:?GLenum,0:32,Size:?GLsizeiptr,Usage:?GLenum>>).
+ cast(5436, <<Target:?GLenum,0:32,Size:?GLsizeiptr,Usage:?GLenum>>).
%% @doc Updates a subset of a buffer object's data store
%%
@@ -10341,10 +10360,10 @@ bufferData(Target,Size,Data,Usage) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBufferSubData.xml">external</a> documentation.
-spec bufferSubData(Target, Offset, Size, Data) -> 'ok' when Target :: enum(),Offset :: integer(),Size :: integer(),Data :: offset()|mem().
bufferSubData(Target,Offset,Size,Data) when is_integer(Data) ->
- cast(5436, <<Target:?GLenum,0:32,Offset:?GLintptr,Size:?GLsizeiptr,Data:?GLuint>>);
+ cast(5437, <<Target:?GLenum,0:32,Offset:?GLintptr,Size:?GLsizeiptr,Data:?GLuint>>);
bufferSubData(Target,Offset,Size,Data) ->
send_bin(Data),
- cast(5437, <<Target:?GLenum,0:32,Offset:?GLintptr,Size:?GLsizeiptr>>).
+ cast(5438, <<Target:?GLenum,0:32,Offset:?GLintptr,Size:?GLsizeiptr>>).
%% @doc Returns a subset of a buffer object's data store
%%
@@ -10358,7 +10377,7 @@ bufferSubData(Target,Offset,Size,Data) ->
-spec getBufferSubData(Target, Offset, Size, Data) -> 'ok' when Target :: enum(),Offset :: integer(),Size :: integer(),Data :: mem().
getBufferSubData(Target,Offset,Size,Data) ->
send_bin(Data),
- call(5438, <<Target:?GLenum,0:32,Offset:?GLintptr,Size:?GLsizeiptr>>).
+ call(5439, <<Target:?GLenum,0:32,Offset:?GLintptr,Size:?GLsizeiptr>>).
%% @doc Return parameters of a buffer object
%%
@@ -10382,7 +10401,7 @@ getBufferSubData(Target,Offset,Size,Data) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetBufferParameteriv.xml">external</a> documentation.
-spec getBufferParameteriv(Target, Pname) -> integer() when Target :: enum(),Pname :: enum().
getBufferParameteriv(Target,Pname) ->
- call(5439, <<Target:?GLenum,Pname:?GLenum>>).
+ call(5440, <<Target:?GLenum,Pname:?GLenum>>).
%% @doc Set the RGB blend equation and the alpha blend equation separately
%%
@@ -10424,7 +10443,7 @@ getBufferParameteriv(Target,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBlendEquationSeparate.xml">external</a> documentation.
-spec blendEquationSeparate(ModeRGB, ModeAlpha) -> 'ok' when ModeRGB :: enum(),ModeAlpha :: enum().
blendEquationSeparate(ModeRGB,ModeAlpha) ->
- cast(5440, <<ModeRGB:?GLenum,ModeAlpha:?GLenum>>).
+ cast(5441, <<ModeRGB:?GLenum,ModeAlpha:?GLenum>>).
%% @doc Specifies a list of color buffers to be drawn into
%%
@@ -10464,8 +10483,9 @@ blendEquationSeparate(ModeRGB,ModeAlpha) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawBuffers.xml">external</a> documentation.
-spec drawBuffers(Bufs) -> 'ok' when Bufs :: [enum()].
drawBuffers(Bufs) ->
- cast(5441, <<(length(Bufs)):?GLuint,
- (<< <<C:?GLenum>> || C <- Bufs>>)/binary,0:(((1+length(Bufs)) rem 2)*32)>>).
+ BufsLen = length(Bufs),
+ cast(5442, <<BufsLen:?GLuint,
+ (<< <<C:?GLenum>> || C <- Bufs>>)/binary,0:(((1+BufsLen) rem 2)*32)>>).
%% @doc Set front and/or back stencil test actions
%%
@@ -10526,7 +10546,7 @@ drawBuffers(Bufs) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glStencilOpSeparate.xml">external</a> documentation.
-spec stencilOpSeparate(Face, Sfail, Dpfail, Dppass) -> 'ok' when Face :: enum(),Sfail :: enum(),Dpfail :: enum(),Dppass :: enum().
stencilOpSeparate(Face,Sfail,Dpfail,Dppass) ->
- cast(5442, <<Face:?GLenum,Sfail:?GLenum,Dpfail:?GLenum,Dppass:?GLenum>>).
+ cast(5443, <<Face:?GLenum,Sfail:?GLenum,Dpfail:?GLenum,Dppass:?GLenum>>).
%% @doc Set front and/or back function and reference value for stencil testing
%%
@@ -10589,7 +10609,7 @@ stencilOpSeparate(Face,Sfail,Dpfail,Dppass) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glStencilFuncSeparate.xml">external</a> documentation.
-spec stencilFuncSeparate(Face, Func, Ref, Mask) -> 'ok' when Face :: enum(),Func :: enum(),Ref :: integer(),Mask :: integer().
stencilFuncSeparate(Face,Func,Ref,Mask) ->
- cast(5443, <<Face:?GLenum,Func:?GLenum,Ref:?GLint,Mask:?GLuint>>).
+ cast(5444, <<Face:?GLenum,Func:?GLenum,Ref:?GLint,Mask:?GLuint>>).
%% @doc Control the front and/or back writing of individual bits in the stencil planes
%%
@@ -10607,7 +10627,7 @@ stencilFuncSeparate(Face,Func,Ref,Mask) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glStencilMaskSeparate.xml">external</a> documentation.
-spec stencilMaskSeparate(Face, Mask) -> 'ok' when Face :: enum(),Mask :: integer().
stencilMaskSeparate(Face,Mask) ->
- cast(5444, <<Face:?GLenum,Mask:?GLuint>>).
+ cast(5445, <<Face:?GLenum,Mask:?GLuint>>).
%% @doc Attaches a shader object to a program object
%%
@@ -10631,7 +10651,7 @@ stencilMaskSeparate(Face,Mask) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glAttachShader.xml">external</a> documentation.
-spec attachShader(Program, Shader) -> 'ok' when Program :: integer(),Shader :: integer().
attachShader(Program,Shader) ->
- cast(5445, <<Program:?GLuint,Shader:?GLuint>>).
+ cast(5446, <<Program:?GLuint,Shader:?GLuint>>).
%% @doc Associates a generic vertex attribute index with a named attribute variable
%%
@@ -10668,7 +10688,8 @@ attachShader(Program,Shader) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml">external</a> documentation.
-spec bindAttribLocation(Program, Index, Name) -> 'ok' when Program :: integer(),Index :: integer(),Name :: string().
bindAttribLocation(Program,Index,Name) ->
- cast(5446, <<Program:?GLuint,Index:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ cast(5447, <<Program:?GLuint,Index:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8)>>).
%% @doc Compiles a shader object
%%
@@ -10688,7 +10709,7 @@ bindAttribLocation(Program,Index,Name) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCompileShader.xml">external</a> documentation.
-spec compileShader(Shader) -> 'ok' when Shader :: integer().
compileShader(Shader) ->
- cast(5447, <<Shader:?GLuint>>).
+ cast(5448, <<Shader:?GLuint>>).
%% @doc Creates a program object
%%
@@ -10711,7 +10732,7 @@ compileShader(Shader) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCreateProgram.xml">external</a> documentation.
-spec createProgram() -> integer().
createProgram() ->
- call(5448, <<>>).
+ call(5449, <<>>).
%% @doc Creates a shader object
%%
@@ -10734,7 +10755,7 @@ createProgram() ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCreateShader.xml">external</a> documentation.
-spec createShader(Type) -> integer() when Type :: enum().
createShader(Type) ->
- call(5449, <<Type:?GLenum>>).
+ call(5450, <<Type:?GLenum>>).
%% @doc Deletes a program object
%%
@@ -10755,7 +10776,7 @@ createShader(Type) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml">external</a> documentation.
-spec deleteProgram(Program) -> 'ok' when Program :: integer().
deleteProgram(Program) ->
- cast(5450, <<Program:?GLuint>>).
+ cast(5451, <<Program:?GLuint>>).
%% @doc Deletes a shader object
%%
@@ -10774,7 +10795,7 @@ deleteProgram(Program) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteShader.xml">external</a> documentation.
-spec deleteShader(Shader) -> 'ok' when Shader :: integer().
deleteShader(Shader) ->
- cast(5451, <<Shader:?GLuint>>).
+ cast(5452, <<Shader:?GLuint>>).
%% @doc Detaches a shader object from a program object to which it is attached
%%
@@ -10789,7 +10810,7 @@ deleteShader(Shader) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDetachShader.xml">external</a> documentation.
-spec detachShader(Program, Shader) -> 'ok' when Program :: integer(),Shader :: integer().
detachShader(Program,Shader) ->
- cast(5452, <<Program:?GLuint,Shader:?GLuint>>).
+ cast(5453, <<Program:?GLuint,Shader:?GLuint>>).
%% @doc Enable or disable a generic vertex attribute array
%%
@@ -10804,13 +10825,13 @@ detachShader(Program,Shader) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml">external</a> documentation.
-spec disableVertexAttribArray(Index) -> 'ok' when Index :: integer().
disableVertexAttribArray(Index) ->
- cast(5453, <<Index:?GLuint>>).
+ cast(5454, <<Index:?GLuint>>).
%% @doc
%% See {@link disableVertexAttribArray/1}
-spec enableVertexAttribArray(Index) -> 'ok' when Index :: integer().
enableVertexAttribArray(Index) ->
- cast(5454, <<Index:?GLuint>>).
+ cast(5455, <<Index:?GLuint>>).
%% @doc Returns information about an active attribute variable for the specified program object
%%
@@ -10868,7 +10889,7 @@ enableVertexAttribArray(Index) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveAttrib.xml">external</a> documentation.
-spec getActiveAttrib(Program, Index, BufSize) -> {Size :: integer(),Type :: enum(),Name :: string()} when Program :: integer(),Index :: integer(),BufSize :: integer().
getActiveAttrib(Program,Index,BufSize) ->
- call(5455, <<Program:?GLuint,Index:?GLuint,BufSize:?GLsizei>>).
+ call(5456, <<Program:?GLuint,Index:?GLuint,BufSize:?GLsizei>>).
%% @doc Returns information about an active uniform variable for the specified program object
%%
@@ -11015,7 +11036,7 @@ getActiveAttrib(Program,Index,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveUniform.xml">external</a> documentation.
-spec getActiveUniform(Program, Index, BufSize) -> {Size :: integer(),Type :: enum(),Name :: string()} when Program :: integer(),Index :: integer(),BufSize :: integer().
getActiveUniform(Program,Index,BufSize) ->
- call(5456, <<Program:?GLuint,Index:?GLuint,BufSize:?GLsizei>>).
+ call(5457, <<Program:?GLuint,Index:?GLuint,BufSize:?GLsizei>>).
%% @doc Returns the handles of the shader objects attached to a program object
%%
@@ -11035,7 +11056,7 @@ getActiveUniform(Program,Index,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetAttachedShaders.xml">external</a> documentation.
-spec getAttachedShaders(Program, MaxCount) -> [integer()] when Program :: integer(),MaxCount :: integer().
getAttachedShaders(Program,MaxCount) ->
- call(5457, <<Program:?GLuint,MaxCount:?GLsizei>>).
+ call(5458, <<Program:?GLuint,MaxCount:?GLsizei>>).
%% @doc Returns the location of an attribute variable
%%
@@ -11059,7 +11080,8 @@ getAttachedShaders(Program,MaxCount) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml">external</a> documentation.
-spec getAttribLocation(Program, Name) -> integer() when Program :: integer(),Name :: string().
getAttribLocation(Program,Name) ->
- call(5458, <<Program:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 5) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ call(5459, <<Program:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 5) rem 8)) rem 8)>>).
%% @doc Returns a parameter from a program object
%%
@@ -11130,7 +11152,7 @@ getAttribLocation(Program,Name) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgram.xml">external</a> documentation.
-spec getProgramiv(Program, Pname) -> integer() when Program :: integer(),Pname :: enum().
getProgramiv(Program,Pname) ->
- call(5459, <<Program:?GLuint,Pname:?GLenum>>).
+ call(5460, <<Program:?GLuint,Pname:?GLenum>>).
%% @doc Returns the information log for a program object
%%
@@ -11155,7 +11177,7 @@ getProgramiv(Program,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramInfoLog.xml">external</a> documentation.
-spec getProgramInfoLog(Program, BufSize) -> string() when Program :: integer(),BufSize :: integer().
getProgramInfoLog(Program,BufSize) ->
- call(5460, <<Program:?GLuint,BufSize:?GLsizei>>).
+ call(5461, <<Program:?GLuint,BufSize:?GLsizei>>).
%% @doc Returns a parameter from a shader object
%%
@@ -11186,7 +11208,7 @@ getProgramInfoLog(Program,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetShader.xml">external</a> documentation.
-spec getShaderiv(Shader, Pname) -> integer() when Shader :: integer(),Pname :: enum().
getShaderiv(Shader,Pname) ->
- call(5461, <<Shader:?GLuint,Pname:?GLenum>>).
+ call(5462, <<Shader:?GLuint,Pname:?GLenum>>).
%% @doc Returns the information log for a shader object
%%
@@ -11209,7 +11231,7 @@ getShaderiv(Shader,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetShaderInfoLog.xml">external</a> documentation.
-spec getShaderInfoLog(Shader, BufSize) -> string() when Shader :: integer(),BufSize :: integer().
getShaderInfoLog(Shader,BufSize) ->
- call(5462, <<Shader:?GLuint,BufSize:?GLsizei>>).
+ call(5463, <<Shader:?GLuint,BufSize:?GLsizei>>).
%% @doc Returns the source code string from a shader object
%%
@@ -11229,7 +11251,7 @@ getShaderInfoLog(Shader,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetShaderSource.xml">external</a> documentation.
-spec getShaderSource(Shader, BufSize) -> string() when Shader :: integer(),BufSize :: integer().
getShaderSource(Shader,BufSize) ->
- call(5463, <<Shader:?GLuint,BufSize:?GLsizei>>).
+ call(5464, <<Shader:?GLuint,BufSize:?GLsizei>>).
%% @doc Returns the location of a uniform variable
%%
@@ -11262,7 +11284,8 @@ getShaderSource(Shader,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml">external</a> documentation.
-spec getUniformLocation(Program, Name) -> integer() when Program :: integer(),Name :: string().
getUniformLocation(Program,Name) ->
- call(5464, <<Program:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 5) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ call(5465, <<Program:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 5) rem 8)) rem 8)>>).
%% @doc Returns the value of a uniform variable
%%
@@ -11288,13 +11311,13 @@ getUniformLocation(Program,Name) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetUniform.xml">external</a> documentation.
-spec getUniformfv(Program, Location) -> matrix() when Program :: integer(),Location :: integer().
getUniformfv(Program,Location) ->
- call(5465, <<Program:?GLuint,Location:?GLint>>).
+ call(5466, <<Program:?GLuint,Location:?GLint>>).
%% @doc
%% See {@link getUniformfv/2}
-spec getUniformiv(Program, Location) -> {integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer()} when Program :: integer(),Location :: integer().
getUniformiv(Program,Location) ->
- call(5466, <<Program:?GLuint,Location:?GLint>>).
+ call(5467, <<Program:?GLuint,Location:?GLint>>).
%% @doc Return a generic vertex attribute parameter
%%
@@ -11361,19 +11384,19 @@ getUniformiv(Program,Location) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetVertexAttrib.xml">external</a> documentation.
-spec getVertexAttribdv(Index, Pname) -> {float(),float(),float(),float()} when Index :: integer(),Pname :: enum().
getVertexAttribdv(Index,Pname) ->
- call(5467, <<Index:?GLuint,Pname:?GLenum>>).
+ call(5468, <<Index:?GLuint,Pname:?GLenum>>).
%% @doc
%% See {@link getVertexAttribdv/2}
-spec getVertexAttribfv(Index, Pname) -> {float(),float(),float(),float()} when Index :: integer(),Pname :: enum().
getVertexAttribfv(Index,Pname) ->
- call(5468, <<Index:?GLuint,Pname:?GLenum>>).
+ call(5469, <<Index:?GLuint,Pname:?GLenum>>).
%% @doc
%% See {@link getVertexAttribdv/2}
-spec getVertexAttribiv(Index, Pname) -> {integer(),integer(),integer(),integer()} when Index :: integer(),Pname :: enum().
getVertexAttribiv(Index,Pname) ->
- call(5469, <<Index:?GLuint,Pname:?GLenum>>).
+ call(5470, <<Index:?GLuint,Pname:?GLenum>>).
%% @doc Determines if a name corresponds to a program object
%%
@@ -11385,7 +11408,7 @@ getVertexAttribiv(Index,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsProgram.xml">external</a> documentation.
-spec isProgram(Program) -> 0|1 when Program :: integer().
isProgram(Program) ->
- call(5470, <<Program:?GLuint>>).
+ call(5471, <<Program:?GLuint>>).
%% @doc Determines if a name corresponds to a shader object
%%
@@ -11397,7 +11420,7 @@ isProgram(Program) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsShader.xml">external</a> documentation.
-spec isShader(Shader) -> 0|1 when Shader :: integer().
isShader(Shader) ->
- call(5471, <<Shader:?GLuint>>).
+ call(5472, <<Shader:?GLuint>>).
%% @doc Links a program object
%%
@@ -11517,7 +11540,7 @@ isShader(Shader) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glLinkProgram.xml">external</a> documentation.
-spec linkProgram(Program) -> 'ok' when Program :: integer().
linkProgram(Program) ->
- cast(5472, <<Program:?GLuint>>).
+ cast(5473, <<Program:?GLuint>>).
%% @doc Replaces the source code in a shader object
%%
@@ -11535,8 +11558,9 @@ linkProgram(Program) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glShaderSource.xml">external</a> documentation.
-spec shaderSource(Shader, String) -> 'ok' when Shader :: integer(),String :: iolist().
shaderSource(Shader,String) ->
- StringTemp = list_to_binary([[Str|[0]] || Str <- String ]),
- cast(5473, <<Shader:?GLuint,(length(String)):?GLuint,(size(StringTemp)):?GLuint,(StringTemp)/binary,0:((8-((size(StringTemp)+0) rem 8)) rem 8)>>).
+ StringTemp = list_to_binary([[Str|[0]] || Str <- String ]),
+ StringLen = length(String),
+ cast(5474, <<Shader:?GLuint,StringLen:?GLuint,(size(StringTemp)):?GLuint,(StringTemp)/binary,0:((8-((size(StringTemp)+0) rem 8)) rem 8)>>).
%% @doc Installs a program object as part of current rendering state
%%
@@ -11577,7 +11601,7 @@ shaderSource(Shader,String) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glUseProgram.xml">external</a> documentation.
-spec useProgram(Program) -> 'ok' when Program :: integer().
useProgram(Program) ->
- cast(5474, <<Program:?GLuint>>).
+ cast(5475, <<Program:?GLuint>>).
%% @doc Specify the value of a uniform variable for the current program object
%%
@@ -11645,125 +11669,136 @@ useProgram(Program) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glUniform.xml">external</a> documentation.
-spec uniform1f(Location, V0) -> 'ok' when Location :: integer(),V0 :: float().
uniform1f(Location,V0) ->
- cast(5475, <<Location:?GLint,V0:?GLfloat>>).
+ cast(5476, <<Location:?GLint,V0:?GLfloat>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform2f(Location, V0, V1) -> 'ok' when Location :: integer(),V0 :: float(),V1 :: float().
uniform2f(Location,V0,V1) ->
- cast(5476, <<Location:?GLint,V0:?GLfloat,V1:?GLfloat>>).
+ cast(5477, <<Location:?GLint,V0:?GLfloat,V1:?GLfloat>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform3f(Location, V0, V1, V2) -> 'ok' when Location :: integer(),V0 :: float(),V1 :: float(),V2 :: float().
uniform3f(Location,V0,V1,V2) ->
- cast(5477, <<Location:?GLint,V0:?GLfloat,V1:?GLfloat,V2:?GLfloat>>).
+ cast(5478, <<Location:?GLint,V0:?GLfloat,V1:?GLfloat,V2:?GLfloat>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform4f(Location, V0, V1, V2, V3) -> 'ok' when Location :: integer(),V0 :: float(),V1 :: float(),V2 :: float(),V3 :: float().
uniform4f(Location,V0,V1,V2,V3) ->
- cast(5478, <<Location:?GLint,V0:?GLfloat,V1:?GLfloat,V2:?GLfloat,V3:?GLfloat>>).
+ cast(5479, <<Location:?GLint,V0:?GLfloat,V1:?GLfloat,V2:?GLfloat,V3:?GLfloat>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform1i(Location, V0) -> 'ok' when Location :: integer(),V0 :: integer().
uniform1i(Location,V0) ->
- cast(5479, <<Location:?GLint,V0:?GLint>>).
+ cast(5480, <<Location:?GLint,V0:?GLint>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform2i(Location, V0, V1) -> 'ok' when Location :: integer(),V0 :: integer(),V1 :: integer().
uniform2i(Location,V0,V1) ->
- cast(5480, <<Location:?GLint,V0:?GLint,V1:?GLint>>).
+ cast(5481, <<Location:?GLint,V0:?GLint,V1:?GLint>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform3i(Location, V0, V1, V2) -> 'ok' when Location :: integer(),V0 :: integer(),V1 :: integer(),V2 :: integer().
uniform3i(Location,V0,V1,V2) ->
- cast(5481, <<Location:?GLint,V0:?GLint,V1:?GLint,V2:?GLint>>).
+ cast(5482, <<Location:?GLint,V0:?GLint,V1:?GLint,V2:?GLint>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform4i(Location, V0, V1, V2, V3) -> 'ok' when Location :: integer(),V0 :: integer(),V1 :: integer(),V2 :: integer(),V3 :: integer().
uniform4i(Location,V0,V1,V2,V3) ->
- cast(5482, <<Location:?GLint,V0:?GLint,V1:?GLint,V2:?GLint,V3:?GLint>>).
+ cast(5483, <<Location:?GLint,V0:?GLint,V1:?GLint,V2:?GLint,V3:?GLint>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform1fv(Location, Value) -> 'ok' when Location :: integer(),Value :: [float()].
uniform1fv(Location,Value) ->
- cast(5483, <<Location:?GLint,(length(Value)):?GLuint,
- (<< <<C:?GLfloat>> || C <- Value>>)/binary,0:(((length(Value)) rem 2)*32)>>).
+ ValueLen = length(Value),
+ cast(5484, <<Location:?GLint,ValueLen:?GLuint,
+ (<< <<C:?GLfloat>> || C <- Value>>)/binary,0:(((ValueLen) rem 2)*32)>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform2fv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{float(),float()}].
uniform2fv(Location,Value) ->
- cast(5484, <<Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5485, <<Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat>> || {V1,V2} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform3fv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{float(),float(),float()}].
uniform3fv(Location,Value) ->
- cast(5485, <<Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5486, <<Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat>> || {V1,V2,V3} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform4fv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{float(),float(),float(),float()}].
uniform4fv(Location,Value) ->
- cast(5486, <<Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5487, <<Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform1iv(Location, Value) -> 'ok' when Location :: integer(),Value :: [integer()].
uniform1iv(Location,Value) ->
- cast(5487, <<Location:?GLint,(length(Value)):?GLuint,
- (<< <<C:?GLint>> || C <- Value>>)/binary,0:(((length(Value)) rem 2)*32)>>).
+ ValueLen = length(Value),
+ cast(5488, <<Location:?GLint,ValueLen:?GLuint,
+ (<< <<C:?GLint>> || C <- Value>>)/binary,0:(((ValueLen) rem 2)*32)>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform2iv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{integer(),integer()}].
uniform2iv(Location,Value) ->
- cast(5488, <<Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5489, <<Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLint,V2:?GLint>> || {V1,V2} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform3iv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{integer(),integer(),integer()}].
uniform3iv(Location,Value) ->
- cast(5489, <<Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5490, <<Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLint,V2:?GLint,V3:?GLint>> || {V1,V2,V3} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform4iv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{integer(),integer(),integer(),integer()}].
uniform4iv(Location,Value) ->
- cast(5490, <<Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5491, <<Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLint,V2:?GLint,V3:?GLint,V4:?GLint>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix2fv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float()}].
uniformMatrix2fv(Location,Transpose,Value) ->
- cast(5491, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5492, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix3fv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix3fv(Location,Transpose,Value) ->
- cast(5492, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5493, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat,V9:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix4fv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix4fv(Location,Transpose,Value) ->
- cast(5493, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5494, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat,V9:?GLfloat,V10:?GLfloat,V11:?GLfloat,V12:?GLfloat,V13:?GLfloat,V14:?GLfloat,V15:?GLfloat,V16:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16} <- Value>>)/binary>>).
%% @doc Validates a program object
@@ -11791,7 +11826,7 @@ uniformMatrix4fv(Location,Transpose,Value) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glValidateProgram.xml">external</a> documentation.
-spec validateProgram(Program) -> 'ok' when Program :: integer().
validateProgram(Program) ->
- cast(5494, <<Program:?GLuint>>).
+ cast(5495, <<Program:?GLuint>>).
%% @doc Specifies the value of a generic vertex attribute
%%
@@ -11866,7 +11901,7 @@ validateProgram(Program) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttrib.xml">external</a> documentation.
-spec vertexAttrib1d(Index, X) -> 'ok' when Index :: integer(),X :: float().
vertexAttrib1d(Index,X) ->
- cast(5495, <<Index:?GLuint,0:32,X:?GLdouble>>).
+ cast(5496, <<Index:?GLuint,0:32,X:?GLdouble>>).
%% @equiv vertexAttrib1d(Index,X)
-spec vertexAttrib1dv(Index :: integer(),V) -> 'ok' when V :: {X :: float()}.
@@ -11876,7 +11911,7 @@ vertexAttrib1dv(Index,{X}) -> vertexAttrib1d(Index,X).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib1f(Index, X) -> 'ok' when Index :: integer(),X :: float().
vertexAttrib1f(Index,X) ->
- cast(5496, <<Index:?GLuint,X:?GLfloat>>).
+ cast(5497, <<Index:?GLuint,X:?GLfloat>>).
%% @equiv vertexAttrib1f(Index,X)
-spec vertexAttrib1fv(Index :: integer(),V) -> 'ok' when V :: {X :: float()}.
@@ -11886,7 +11921,7 @@ vertexAttrib1fv(Index,{X}) -> vertexAttrib1f(Index,X).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib1s(Index, X) -> 'ok' when Index :: integer(),X :: integer().
vertexAttrib1s(Index,X) ->
- cast(5497, <<Index:?GLuint,X:?GLshort>>).
+ cast(5498, <<Index:?GLuint,X:?GLshort>>).
%% @equiv vertexAttrib1s(Index,X)
-spec vertexAttrib1sv(Index :: integer(),V) -> 'ok' when V :: {X :: integer()}.
@@ -11896,7 +11931,7 @@ vertexAttrib1sv(Index,{X}) -> vertexAttrib1s(Index,X).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib2d(Index, X, Y) -> 'ok' when Index :: integer(),X :: float(),Y :: float().
vertexAttrib2d(Index,X,Y) ->
- cast(5498, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble>>).
+ cast(5499, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble>>).
%% @equiv vertexAttrib2d(Index,X,Y)
-spec vertexAttrib2dv(Index :: integer(),V) -> 'ok' when V :: {X :: float(),Y :: float()}.
@@ -11906,7 +11941,7 @@ vertexAttrib2dv(Index,{X,Y}) -> vertexAttrib2d(Index,X,Y).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib2f(Index, X, Y) -> 'ok' when Index :: integer(),X :: float(),Y :: float().
vertexAttrib2f(Index,X,Y) ->
- cast(5499, <<Index:?GLuint,X:?GLfloat,Y:?GLfloat>>).
+ cast(5500, <<Index:?GLuint,X:?GLfloat,Y:?GLfloat>>).
%% @equiv vertexAttrib2f(Index,X,Y)
-spec vertexAttrib2fv(Index :: integer(),V) -> 'ok' when V :: {X :: float(),Y :: float()}.
@@ -11916,7 +11951,7 @@ vertexAttrib2fv(Index,{X,Y}) -> vertexAttrib2f(Index,X,Y).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib2s(Index, X, Y) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer().
vertexAttrib2s(Index,X,Y) ->
- cast(5500, <<Index:?GLuint,X:?GLshort,Y:?GLshort>>).
+ cast(5501, <<Index:?GLuint,X:?GLshort,Y:?GLshort>>).
%% @equiv vertexAttrib2s(Index,X,Y)
-spec vertexAttrib2sv(Index :: integer(),V) -> 'ok' when V :: {X :: integer(),Y :: integer()}.
@@ -11926,7 +11961,7 @@ vertexAttrib2sv(Index,{X,Y}) -> vertexAttrib2s(Index,X,Y).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib3d(Index, X, Y, Z) -> 'ok' when Index :: integer(),X :: float(),Y :: float(),Z :: float().
vertexAttrib3d(Index,X,Y,Z) ->
- cast(5501, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble>>).
+ cast(5502, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble>>).
%% @equiv vertexAttrib3d(Index,X,Y,Z)
-spec vertexAttrib3dv(Index :: integer(),V) -> 'ok' when V :: {X :: float(),Y :: float(),Z :: float()}.
@@ -11936,7 +11971,7 @@ vertexAttrib3dv(Index,{X,Y,Z}) -> vertexAttrib3d(Index,X,Y,Z).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib3f(Index, X, Y, Z) -> 'ok' when Index :: integer(),X :: float(),Y :: float(),Z :: float().
vertexAttrib3f(Index,X,Y,Z) ->
- cast(5502, <<Index:?GLuint,X:?GLfloat,Y:?GLfloat,Z:?GLfloat>>).
+ cast(5503, <<Index:?GLuint,X:?GLfloat,Y:?GLfloat,Z:?GLfloat>>).
%% @equiv vertexAttrib3f(Index,X,Y,Z)
-spec vertexAttrib3fv(Index :: integer(),V) -> 'ok' when V :: {X :: float(),Y :: float(),Z :: float()}.
@@ -11946,7 +11981,7 @@ vertexAttrib3fv(Index,{X,Y,Z}) -> vertexAttrib3f(Index,X,Y,Z).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib3s(Index, X, Y, Z) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer(),Z :: integer().
vertexAttrib3s(Index,X,Y,Z) ->
- cast(5503, <<Index:?GLuint,X:?GLshort,Y:?GLshort,Z:?GLshort>>).
+ cast(5504, <<Index:?GLuint,X:?GLshort,Y:?GLshort,Z:?GLshort>>).
%% @equiv vertexAttrib3s(Index,X,Y,Z)
-spec vertexAttrib3sv(Index :: integer(),V) -> 'ok' when V :: {X :: integer(),Y :: integer(),Z :: integer()}.
@@ -11956,25 +11991,25 @@ vertexAttrib3sv(Index,{X,Y,Z}) -> vertexAttrib3s(Index,X,Y,Z).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4Nbv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4Nbv(Index,{V1,V2,V3,V4}) ->
- cast(5504, <<Index:?GLuint,V1:?GLbyte,V2:?GLbyte,V3:?GLbyte,V4:?GLbyte>>).
+ cast(5505, <<Index:?GLuint,V1:?GLbyte,V2:?GLbyte,V3:?GLbyte,V4:?GLbyte>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4Niv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4Niv(Index,{V1,V2,V3,V4}) ->
- cast(5505, <<Index:?GLuint,V1:?GLint,V2:?GLint,V3:?GLint,V4:?GLint>>).
+ cast(5506, <<Index:?GLuint,V1:?GLint,V2:?GLint,V3:?GLint,V4:?GLint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4Nsv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4Nsv(Index,{V1,V2,V3,V4}) ->
- cast(5506, <<Index:?GLuint,V1:?GLshort,V2:?GLshort,V3:?GLshort,V4:?GLshort>>).
+ cast(5507, <<Index:?GLuint,V1:?GLshort,V2:?GLshort,V3:?GLshort,V4:?GLshort>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4Nub(Index, X, Y, Z, W) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer(),Z :: integer(),W :: integer().
vertexAttrib4Nub(Index,X,Y,Z,W) ->
- cast(5507, <<Index:?GLuint,X:?GLubyte,Y:?GLubyte,Z:?GLubyte,W:?GLubyte>>).
+ cast(5508, <<Index:?GLuint,X:?GLubyte,Y:?GLubyte,Z:?GLubyte,W:?GLubyte>>).
%% @equiv vertexAttrib4Nub(Index,X,Y,Z,W)
-spec vertexAttrib4Nubv(Index :: integer(),V) -> 'ok' when V :: {X :: integer(),Y :: integer(),Z :: integer(),W :: integer()}.
@@ -11984,25 +12019,25 @@ vertexAttrib4Nubv(Index,{X,Y,Z,W}) -> vertexAttrib4Nub(Index,X,Y,Z,W).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4Nuiv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4Nuiv(Index,{V1,V2,V3,V4}) ->
- cast(5508, <<Index:?GLuint,V1:?GLuint,V2:?GLuint,V3:?GLuint,V4:?GLuint>>).
+ cast(5509, <<Index:?GLuint,V1:?GLuint,V2:?GLuint,V3:?GLuint,V4:?GLuint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4Nusv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4Nusv(Index,{V1,V2,V3,V4}) ->
- cast(5509, <<Index:?GLuint,V1:?GLushort,V2:?GLushort,V3:?GLushort,V4:?GLushort>>).
+ cast(5510, <<Index:?GLuint,V1:?GLushort,V2:?GLushort,V3:?GLushort,V4:?GLushort>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4bv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4bv(Index,{V1,V2,V3,V4}) ->
- cast(5510, <<Index:?GLuint,V1:?GLbyte,V2:?GLbyte,V3:?GLbyte,V4:?GLbyte>>).
+ cast(5511, <<Index:?GLuint,V1:?GLbyte,V2:?GLbyte,V3:?GLbyte,V4:?GLbyte>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4d(Index, X, Y, Z, W) -> 'ok' when Index :: integer(),X :: float(),Y :: float(),Z :: float(),W :: float().
vertexAttrib4d(Index,X,Y,Z,W) ->
- cast(5511, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
+ cast(5512, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
%% @equiv vertexAttrib4d(Index,X,Y,Z,W)
-spec vertexAttrib4dv(Index :: integer(),V) -> 'ok' when V :: {X :: float(),Y :: float(),Z :: float(),W :: float()}.
@@ -12012,7 +12047,7 @@ vertexAttrib4dv(Index,{X,Y,Z,W}) -> vertexAttrib4d(Index,X,Y,Z,W).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4f(Index, X, Y, Z, W) -> 'ok' when Index :: integer(),X :: float(),Y :: float(),Z :: float(),W :: float().
vertexAttrib4f(Index,X,Y,Z,W) ->
- cast(5512, <<Index:?GLuint,X:?GLfloat,Y:?GLfloat,Z:?GLfloat,W:?GLfloat>>).
+ cast(5513, <<Index:?GLuint,X:?GLfloat,Y:?GLfloat,Z:?GLfloat,W:?GLfloat>>).
%% @equiv vertexAttrib4f(Index,X,Y,Z,W)
-spec vertexAttrib4fv(Index :: integer(),V) -> 'ok' when V :: {X :: float(),Y :: float(),Z :: float(),W :: float()}.
@@ -12022,13 +12057,13 @@ vertexAttrib4fv(Index,{X,Y,Z,W}) -> vertexAttrib4f(Index,X,Y,Z,W).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4iv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4iv(Index,{V1,V2,V3,V4}) ->
- cast(5513, <<Index:?GLuint,V1:?GLint,V2:?GLint,V3:?GLint,V4:?GLint>>).
+ cast(5514, <<Index:?GLuint,V1:?GLint,V2:?GLint,V3:?GLint,V4:?GLint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4s(Index, X, Y, Z, W) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer(),Z :: integer(),W :: integer().
vertexAttrib4s(Index,X,Y,Z,W) ->
- cast(5514, <<Index:?GLuint,X:?GLshort,Y:?GLshort,Z:?GLshort,W:?GLshort>>).
+ cast(5515, <<Index:?GLuint,X:?GLshort,Y:?GLshort,Z:?GLshort,W:?GLshort>>).
%% @equiv vertexAttrib4s(Index,X,Y,Z,W)
-spec vertexAttrib4sv(Index :: integer(),V) -> 'ok' when V :: {X :: integer(),Y :: integer(),Z :: integer(),W :: integer()}.
@@ -12038,19 +12073,19 @@ vertexAttrib4sv(Index,{X,Y,Z,W}) -> vertexAttrib4s(Index,X,Y,Z,W).
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4ubv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4ubv(Index,{V1,V2,V3,V4}) ->
- cast(5515, <<Index:?GLuint,V1:?GLubyte,V2:?GLubyte,V3:?GLubyte,V4:?GLubyte>>).
+ cast(5516, <<Index:?GLuint,V1:?GLubyte,V2:?GLubyte,V3:?GLubyte,V4:?GLubyte>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4uiv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4uiv(Index,{V1,V2,V3,V4}) ->
- cast(5516, <<Index:?GLuint,V1:?GLuint,V2:?GLuint,V3:?GLuint,V4:?GLuint>>).
+ cast(5517, <<Index:?GLuint,V1:?GLuint,V2:?GLuint,V3:?GLuint,V4:?GLuint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttrib4usv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttrib4usv(Index,{V1,V2,V3,V4}) ->
- cast(5517, <<Index:?GLuint,V1:?GLushort,V2:?GLushort,V3:?GLushort,V4:?GLushort>>).
+ cast(5518, <<Index:?GLuint,V1:?GLushort,V2:?GLushort,V3:?GLushort,V4:?GLushort>>).
%% @doc Define an array of generic vertex attribute data
%%
@@ -12094,51 +12129,57 @@ vertexAttrib4usv(Index,{V1,V2,V3,V4}) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml">external</a> documentation.
-spec vertexAttribPointer(Index, Size, Type, Normalized, Stride, Pointer) -> 'ok' when Index :: integer(),Size :: integer(),Type :: enum(),Normalized :: 0|1,Stride :: integer(),Pointer :: offset()|mem().
vertexAttribPointer(Index,Size,Type,Normalized,Stride,Pointer) when is_integer(Pointer) ->
- cast(5518, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Normalized:?GLboolean,0:24,Stride:?GLsizei,Pointer:?GLuint>>);
+ cast(5519, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Normalized:?GLboolean,0:24,Stride:?GLsizei,Pointer:?GLuint>>);
vertexAttribPointer(Index,Size,Type,Normalized,Stride,Pointer) ->
send_bin(Pointer),
- cast(5519, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Normalized:?GLboolean,0:24,Stride:?GLsizei>>).
+ cast(5520, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Normalized:?GLboolean,0:24,Stride:?GLsizei>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix2x3fv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float()}].
uniformMatrix2x3fv(Location,Transpose,Value) ->
- cast(5520, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5521, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat>> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix3x2fv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float()}].
uniformMatrix3x2fv(Location,Transpose,Value) ->
- cast(5521, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5522, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat>> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix2x4fv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix2x4fv(Location,Transpose,Value) ->
- cast(5522, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5523, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix4x2fv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix4x2fv(Location,Transpose,Value) ->
- cast(5523, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5524, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix3x4fv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix3x4fv(Location,Transpose,Value) ->
- cast(5524, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5525, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat,V9:?GLfloat,V10:?GLfloat,V11:?GLfloat,V12:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix4x3fv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix4x3fv(Location,Transpose,Value) ->
- cast(5525, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5526, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat,V9:?GLfloat,V10:?GLfloat,V11:?GLfloat,V12:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>).
%% @doc glColorMaski
@@ -12146,39 +12187,39 @@ uniformMatrix4x3fv(Location,Transpose,Value) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glColorMaski.xml">external</a> documentation.
-spec colorMaski(Index, R, G, B, A) -> 'ok' when Index :: integer(),R :: 0|1,G :: 0|1,B :: 0|1,A :: 0|1.
colorMaski(Index,R,G,B,A) ->
- cast(5526, <<Index:?GLuint,R:?GLboolean,G:?GLboolean,B:?GLboolean,A:?GLboolean>>).
+ cast(5527, <<Index:?GLuint,R:?GLboolean,G:?GLboolean,B:?GLboolean,A:?GLboolean>>).
%% @doc
%% See {@link getBooleanv/1}
-spec getBooleani_v(Target, Index) -> [0|1] when Target :: enum(),Index :: integer().
getBooleani_v(Target,Index) ->
- call(5527, <<Target:?GLenum,Index:?GLuint>>).
+ call(5528, <<Target:?GLenum,Index:?GLuint>>).
%% @doc
%% See {@link getBooleanv/1}
-spec getIntegeri_v(Target, Index) -> [integer()] when Target :: enum(),Index :: integer().
getIntegeri_v(Target,Index) ->
- call(5528, <<Target:?GLenum,Index:?GLuint>>).
+ call(5529, <<Target:?GLenum,Index:?GLuint>>).
%% @doc
%% See {@link enable/1}
-spec enablei(Target, Index) -> 'ok' when Target :: enum(),Index :: integer().
enablei(Target,Index) ->
- cast(5529, <<Target:?GLenum,Index:?GLuint>>).
+ cast(5530, <<Target:?GLenum,Index:?GLuint>>).
%% @doc glEnablei
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glEnablei.xml">external</a> documentation.
-spec disablei(Target, Index) -> 'ok' when Target :: enum(),Index :: integer().
disablei(Target,Index) ->
- cast(5530, <<Target:?GLenum,Index:?GLuint>>).
+ cast(5531, <<Target:?GLenum,Index:?GLuint>>).
%% @doc glIsEnabledi
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsEnabledi.xml">external</a> documentation.
-spec isEnabledi(Target, Index) -> 0|1 when Target :: enum(),Index :: integer().
isEnabledi(Target,Index) ->
- call(5531, <<Target:?GLenum,Index:?GLuint>>).
+ call(5532, <<Target:?GLenum,Index:?GLuint>>).
%% @doc Start transform feedback operation
%%
@@ -12206,13 +12247,13 @@ isEnabledi(Target,Index) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBeginTransformFeedback.xml">external</a> documentation.
-spec beginTransformFeedback(PrimitiveMode) -> 'ok' when PrimitiveMode :: enum().
beginTransformFeedback(PrimitiveMode) ->
- cast(5532, <<PrimitiveMode:?GLenum>>).
+ cast(5533, <<PrimitiveMode:?GLenum>>).
%% @doc
%% See {@link beginTransformFeedback/1}
-spec endTransformFeedback() -> 'ok'.
endTransformFeedback() ->
- cast(5533, <<>>).
+ cast(5534, <<>>).
%% @doc Bind a range within a buffer object to an indexed buffer target
%%
@@ -12231,7 +12272,7 @@ endTransformFeedback() ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindBufferRange.xml">external</a> documentation.
-spec bindBufferRange(Target, Index, Buffer, Offset, Size) -> 'ok' when Target :: enum(),Index :: integer(),Buffer :: integer(),Offset :: integer(),Size :: integer().
bindBufferRange(Target,Index,Buffer,Offset,Size) ->
- cast(5534, <<Target:?GLenum,Index:?GLuint,Buffer:?GLuint,0:32,Offset:?GLintptr,Size:?GLsizeiptr>>).
+ cast(5535, <<Target:?GLenum,Index:?GLuint,Buffer:?GLuint,0:32,Offset:?GLintptr,Size:?GLsizeiptr>>).
%% @doc Bind a buffer object to an indexed buffer target
%%
@@ -12246,7 +12287,7 @@ bindBufferRange(Target,Index,Buffer,Offset,Size) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindBufferBase.xml">external</a> documentation.
-spec bindBufferBase(Target, Index, Buffer) -> 'ok' when Target :: enum(),Index :: integer(),Buffer :: integer().
bindBufferBase(Target,Index,Buffer) ->
- cast(5535, <<Target:?GLenum,Index:?GLuint,Buffer:?GLuint>>).
+ cast(5536, <<Target:?GLenum,Index:?GLuint,Buffer:?GLuint>>).
%% @doc Specify values to record in transform feedback buffers
%%
@@ -12284,8 +12325,9 @@ bindBufferBase(Target,Index,Buffer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glTransformFeedbackVaryings.xml">external</a> documentation.
-spec transformFeedbackVaryings(Program, Varyings, BufferMode) -> 'ok' when Program :: integer(),Varyings :: iolist(),BufferMode :: enum().
transformFeedbackVaryings(Program,Varyings,BufferMode) ->
- VaryingsTemp = list_to_binary([[Str|[0]] || Str <- Varyings ]),
- cast(5536, <<Program:?GLuint,(length(Varyings)):?GLuint,(size(VaryingsTemp)):?GLuint,(VaryingsTemp)/binary,0:((8-((size(VaryingsTemp)+0) rem 8)) rem 8),BufferMode:?GLenum>>).
+ VaryingsTemp = list_to_binary([[Str|[0]] || Str <- Varyings ]),
+ VaryingsLen = length(Varyings),
+ cast(5537, <<Program:?GLuint,VaryingsLen:?GLuint,(size(VaryingsTemp)):?GLuint,(VaryingsTemp)/binary,0:((8-((size(VaryingsTemp)+0) rem 8)) rem 8),BufferMode:?GLenum>>).
%% @doc Retrieve information about varying variables selected for transform feedback
%%
@@ -12318,7 +12360,7 @@ transformFeedbackVaryings(Program,Varyings,BufferMode) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetTransformFeedbackVarying.xml">external</a> documentation.
-spec getTransformFeedbackVarying(Program, Index, BufSize) -> {Size :: integer(),Type :: enum(),Name :: string()} when Program :: integer(),Index :: integer(),BufSize :: integer().
getTransformFeedbackVarying(Program,Index,BufSize) ->
- call(5537, <<Program:?GLuint,Index:?GLuint,BufSize:?GLsizei>>).
+ call(5538, <<Program:?GLuint,Index:?GLuint,BufSize:?GLsizei>>).
%% @doc specify whether data read via
%%
@@ -12333,7 +12375,7 @@ getTransformFeedbackVarying(Program,Index,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glClampColor.xml">external</a> documentation.
-spec clampColor(Target, Clamp) -> 'ok' when Target :: enum(),Clamp :: enum().
clampColor(Target,Clamp) ->
- cast(5538, <<Target:?GLenum,Clamp:?GLenum>>).
+ cast(5539, <<Target:?GLenum,Clamp:?GLenum>>).
%% @doc Start conditional rendering
%%
@@ -12365,84 +12407,84 @@ clampColor(Target,Clamp) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBeginConditionalRender.xml">external</a> documentation.
-spec beginConditionalRender(Id, Mode) -> 'ok' when Id :: integer(),Mode :: enum().
beginConditionalRender(Id,Mode) ->
- cast(5539, <<Id:?GLuint,Mode:?GLenum>>).
+ cast(5540, <<Id:?GLuint,Mode:?GLenum>>).
%% @doc
%% See {@link beginConditionalRender/2}
-spec endConditionalRender() -> 'ok'.
endConditionalRender() ->
- cast(5540, <<>>).
+ cast(5541, <<>>).
%% @doc glVertexAttribIPointer
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribIPointer.xml">external</a> documentation.
-spec vertexAttribIPointer(Index, Size, Type, Stride, Pointer) -> 'ok' when Index :: integer(),Size :: integer(),Type :: enum(),Stride :: integer(),Pointer :: offset()|mem().
vertexAttribIPointer(Index,Size,Type,Stride,Pointer) when is_integer(Pointer) ->
- cast(5541, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Stride:?GLsizei,Pointer:?GLuint>>);
+ cast(5542, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Stride:?GLsizei,Pointer:?GLuint>>);
vertexAttribIPointer(Index,Size,Type,Stride,Pointer) ->
send_bin(Pointer),
- cast(5542, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Stride:?GLsizei>>).
+ cast(5543, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Stride:?GLsizei>>).
%% @doc
%% See {@link getVertexAttribdv/2}
-spec getVertexAttribIiv(Index, Pname) -> {integer(),integer(),integer(),integer()} when Index :: integer(),Pname :: enum().
getVertexAttribIiv(Index,Pname) ->
- call(5543, <<Index:?GLuint,Pname:?GLenum>>).
+ call(5544, <<Index:?GLuint,Pname:?GLenum>>).
%% @doc glGetVertexAttribI
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetVertexAttribI.xml">external</a> documentation.
-spec getVertexAttribIuiv(Index, Pname) -> {integer(),integer(),integer(),integer()} when Index :: integer(),Pname :: enum().
getVertexAttribIuiv(Index,Pname) ->
- call(5544, <<Index:?GLuint,Pname:?GLenum>>).
+ call(5545, <<Index:?GLuint,Pname:?GLenum>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI1i(Index, X) -> 'ok' when Index :: integer(),X :: integer().
vertexAttribI1i(Index,X) ->
- cast(5545, <<Index:?GLuint,X:?GLint>>).
+ cast(5546, <<Index:?GLuint,X:?GLint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI2i(Index, X, Y) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer().
vertexAttribI2i(Index,X,Y) ->
- cast(5546, <<Index:?GLuint,X:?GLint,Y:?GLint>>).
+ cast(5547, <<Index:?GLuint,X:?GLint,Y:?GLint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI3i(Index, X, Y, Z) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer(),Z :: integer().
vertexAttribI3i(Index,X,Y,Z) ->
- cast(5547, <<Index:?GLuint,X:?GLint,Y:?GLint,Z:?GLint>>).
+ cast(5548, <<Index:?GLuint,X:?GLint,Y:?GLint,Z:?GLint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI4i(Index, X, Y, Z, W) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer(),Z :: integer(),W :: integer().
vertexAttribI4i(Index,X,Y,Z,W) ->
- cast(5548, <<Index:?GLuint,X:?GLint,Y:?GLint,Z:?GLint,W:?GLint>>).
+ cast(5549, <<Index:?GLuint,X:?GLint,Y:?GLint,Z:?GLint,W:?GLint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI1ui(Index, X) -> 'ok' when Index :: integer(),X :: integer().
vertexAttribI1ui(Index,X) ->
- cast(5549, <<Index:?GLuint,X:?GLuint>>).
+ cast(5550, <<Index:?GLuint,X:?GLuint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI2ui(Index, X, Y) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer().
vertexAttribI2ui(Index,X,Y) ->
- cast(5550, <<Index:?GLuint,X:?GLuint,Y:?GLuint>>).
+ cast(5551, <<Index:?GLuint,X:?GLuint,Y:?GLuint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI3ui(Index, X, Y, Z) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer(),Z :: integer().
vertexAttribI3ui(Index,X,Y,Z) ->
- cast(5551, <<Index:?GLuint,X:?GLuint,Y:?GLuint,Z:?GLuint>>).
+ cast(5552, <<Index:?GLuint,X:?GLuint,Y:?GLuint,Z:?GLuint>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI4ui(Index, X, Y, Z, W) -> 'ok' when Index :: integer(),X :: integer(),Y :: integer(),Z :: integer(),W :: integer().
vertexAttribI4ui(Index,X,Y,Z,W) ->
- cast(5552, <<Index:?GLuint,X:?GLuint,Y:?GLuint,Z:?GLuint,W:?GLuint>>).
+ cast(5553, <<Index:?GLuint,X:?GLuint,Y:?GLuint,Z:?GLuint,W:?GLuint>>).
%% @equiv vertexAttribI1i(Index,X)
-spec vertexAttribI1iv(Index :: integer(),V) -> 'ok' when V :: {X :: integer()}.
@@ -12480,31 +12522,31 @@ vertexAttribI4uiv(Index,{X,Y,Z,W}) -> vertexAttribI4ui(Index,X,Y,Z,W).
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI4bv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttribI4bv(Index,{V1,V2,V3,V4}) ->
- cast(5553, <<Index:?GLuint,V1:?GLbyte,V2:?GLbyte,V3:?GLbyte,V4:?GLbyte>>).
+ cast(5554, <<Index:?GLuint,V1:?GLbyte,V2:?GLbyte,V3:?GLbyte,V4:?GLbyte>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI4sv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttribI4sv(Index,{V1,V2,V3,V4}) ->
- cast(5554, <<Index:?GLuint,V1:?GLshort,V2:?GLshort,V3:?GLshort,V4:?GLshort>>).
+ cast(5555, <<Index:?GLuint,V1:?GLshort,V2:?GLshort,V3:?GLshort,V4:?GLshort>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI4ubv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttribI4ubv(Index,{V1,V2,V3,V4}) ->
- cast(5555, <<Index:?GLuint,V1:?GLubyte,V2:?GLubyte,V3:?GLubyte,V4:?GLubyte>>).
+ cast(5556, <<Index:?GLuint,V1:?GLubyte,V2:?GLubyte,V3:?GLubyte,V4:?GLubyte>>).
%% @doc
%% See {@link vertexAttrib1d/2}
-spec vertexAttribI4usv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
vertexAttribI4usv(Index,{V1,V2,V3,V4}) ->
- cast(5556, <<Index:?GLuint,V1:?GLushort,V2:?GLushort,V3:?GLushort,V4:?GLushort>>).
+ cast(5557, <<Index:?GLuint,V1:?GLushort,V2:?GLushort,V3:?GLushort,V4:?GLushort>>).
%% @doc
%% See {@link getUniformfv/2}
-spec getUniformuiv(Program, Location) -> {integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer()} when Program :: integer(),Location :: integer().
getUniformuiv(Program,Location) ->
- call(5557, <<Program:?GLuint,Location:?GLint>>).
+ call(5558, <<Program:?GLuint,Location:?GLint>>).
%% @doc Bind a user-defined varying out variable to a fragment shader color number
%%
@@ -12531,7 +12573,8 @@ getUniformuiv(Program,Location) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindFragDataLocation.xml">external</a> documentation.
-spec bindFragDataLocation(Program, Color, Name) -> 'ok' when Program :: integer(),Color :: integer(),Name :: string().
bindFragDataLocation(Program,Color,Name) ->
- cast(5558, <<Program:?GLuint,Color:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ cast(5559, <<Program:?GLuint,Color:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8)>>).
%% @doc Query the bindings of color numbers to user-defined varying out variables
%%
@@ -12544,65 +12587,70 @@ bindFragDataLocation(Program,Color,Name) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetFragDataLocation.xml">external</a> documentation.
-spec getFragDataLocation(Program, Name) -> integer() when Program :: integer(),Name :: string().
getFragDataLocation(Program,Name) ->
- call(5559, <<Program:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 5) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ call(5560, <<Program:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 5) rem 8)) rem 8)>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform1ui(Location, V0) -> 'ok' when Location :: integer(),V0 :: integer().
uniform1ui(Location,V0) ->
- cast(5560, <<Location:?GLint,V0:?GLuint>>).
+ cast(5561, <<Location:?GLint,V0:?GLuint>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform2ui(Location, V0, V1) -> 'ok' when Location :: integer(),V0 :: integer(),V1 :: integer().
uniform2ui(Location,V0,V1) ->
- cast(5561, <<Location:?GLint,V0:?GLuint,V1:?GLuint>>).
+ cast(5562, <<Location:?GLint,V0:?GLuint,V1:?GLuint>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform3ui(Location, V0, V1, V2) -> 'ok' when Location :: integer(),V0 :: integer(),V1 :: integer(),V2 :: integer().
uniform3ui(Location,V0,V1,V2) ->
- cast(5562, <<Location:?GLint,V0:?GLuint,V1:?GLuint,V2:?GLuint>>).
+ cast(5563, <<Location:?GLint,V0:?GLuint,V1:?GLuint,V2:?GLuint>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform4ui(Location, V0, V1, V2, V3) -> 'ok' when Location :: integer(),V0 :: integer(),V1 :: integer(),V2 :: integer(),V3 :: integer().
uniform4ui(Location,V0,V1,V2,V3) ->
- cast(5563, <<Location:?GLint,V0:?GLuint,V1:?GLuint,V2:?GLuint,V3:?GLuint>>).
+ cast(5564, <<Location:?GLint,V0:?GLuint,V1:?GLuint,V2:?GLuint,V3:?GLuint>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform1uiv(Location, Value) -> 'ok' when Location :: integer(),Value :: [integer()].
uniform1uiv(Location,Value) ->
- cast(5564, <<Location:?GLint,(length(Value)):?GLuint,
- (<< <<C:?GLuint>> || C <- Value>>)/binary,0:(((length(Value)) rem 2)*32)>>).
+ ValueLen = length(Value),
+ cast(5565, <<Location:?GLint,ValueLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Value>>)/binary,0:(((ValueLen) rem 2)*32)>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform2uiv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{integer(),integer()}].
uniform2uiv(Location,Value) ->
- cast(5565, <<Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5566, <<Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLuint,V2:?GLuint>> || {V1,V2} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform3uiv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{integer(),integer(),integer()}].
uniform3uiv(Location,Value) ->
- cast(5566, <<Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5567, <<Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLuint,V2:?GLuint,V3:?GLuint>> || {V1,V2,V3} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform4uiv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{integer(),integer(),integer(),integer()}].
uniform4uiv(Location,Value) ->
- cast(5567, <<Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5568, <<Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLuint,V2:?GLuint,V3:?GLuint,V4:?GLuint>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link texParameterf/3}
-spec texParameterIiv(Target, Pname, Params) -> 'ok' when Target :: enum(),Pname :: enum(),Params :: tuple().
texParameterIiv(Target,Pname,Params) ->
- cast(5568, <<Target:?GLenum,Pname:?GLenum,(size(Params)):?GLuint,
+ cast(5569, <<Target:?GLenum,Pname:?GLenum,(size(Params)):?GLuint,
(<< <<C:?GLint>> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>).
%% @doc glTexParameterI
@@ -12610,21 +12658,21 @@ texParameterIiv(Target,Pname,Params) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glTexParameterI.xml">external</a> documentation.
-spec texParameterIuiv(Target, Pname, Params) -> 'ok' when Target :: enum(),Pname :: enum(),Params :: tuple().
texParameterIuiv(Target,Pname,Params) ->
- cast(5569, <<Target:?GLenum,Pname:?GLenum,(size(Params)):?GLuint,
+ cast(5570, <<Target:?GLenum,Pname:?GLenum,(size(Params)):?GLuint,
(<< <<C:?GLuint>> ||C <- tuple_to_list(Params)>>)/binary,0:(((1+size(Params)) rem 2)*32)>>).
%% @doc
%% See {@link getTexParameterfv/2}
-spec getTexParameterIiv(Target, Pname) -> {integer(),integer(),integer(),integer()} when Target :: enum(),Pname :: enum().
getTexParameterIiv(Target,Pname) ->
- call(5570, <<Target:?GLenum,Pname:?GLenum>>).
+ call(5571, <<Target:?GLenum,Pname:?GLenum>>).
%% @doc glGetTexParameterI
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetTexParameterI.xml">external</a> documentation.
-spec getTexParameterIuiv(Target, Pname) -> {integer(),integer(),integer(),integer()} when Target :: enum(),Pname :: enum().
getTexParameterIuiv(Target,Pname) ->
- call(5571, <<Target:?GLenum,Pname:?GLenum>>).
+ call(5572, <<Target:?GLenum,Pname:?GLenum>>).
%% @doc Clear individual buffers of the currently bound draw framebuffer
%%
@@ -12657,21 +12705,21 @@ getTexParameterIuiv(Target,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glClearBuffer.xml">external</a> documentation.
-spec clearBufferiv(Buffer, Drawbuffer, Value) -> 'ok' when Buffer :: enum(),Drawbuffer :: integer(),Value :: tuple().
clearBufferiv(Buffer,Drawbuffer,Value) ->
- cast(5572, <<Buffer:?GLenum,Drawbuffer:?GLint,(size(Value)):?GLuint,
+ cast(5573, <<Buffer:?GLenum,Drawbuffer:?GLint,(size(Value)):?GLuint,
(<< <<C:?GLint>> ||C <- tuple_to_list(Value)>>)/binary,0:(((1+size(Value)) rem 2)*32)>>).
%% @doc
%% See {@link clearBufferiv/3}
-spec clearBufferuiv(Buffer, Drawbuffer, Value) -> 'ok' when Buffer :: enum(),Drawbuffer :: integer(),Value :: tuple().
clearBufferuiv(Buffer,Drawbuffer,Value) ->
- cast(5573, <<Buffer:?GLenum,Drawbuffer:?GLint,(size(Value)):?GLuint,
+ cast(5574, <<Buffer:?GLenum,Drawbuffer:?GLint,(size(Value)):?GLuint,
(<< <<C:?GLuint>> ||C <- tuple_to_list(Value)>>)/binary,0:(((1+size(Value)) rem 2)*32)>>).
%% @doc
%% See {@link clearBufferiv/3}
-spec clearBufferfv(Buffer, Drawbuffer, Value) -> 'ok' when Buffer :: enum(),Drawbuffer :: integer(),Value :: tuple().
clearBufferfv(Buffer,Drawbuffer,Value) ->
- cast(5574, <<Buffer:?GLenum,Drawbuffer:?GLint,(size(Value)):?GLuint,
+ cast(5575, <<Buffer:?GLenum,Drawbuffer:?GLint,(size(Value)):?GLuint,
(<< <<C:?GLfloat>> ||C <- tuple_to_list(Value)>>)/binary,0:(((1+size(Value)) rem 2)*32)>>).
%% @doc glClearBufferfi
@@ -12679,30 +12727,30 @@ clearBufferfv(Buffer,Drawbuffer,Value) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glClearBufferfi.xml">external</a> documentation.
-spec clearBufferfi(Buffer, Drawbuffer, Depth, Stencil) -> 'ok' when Buffer :: enum(),Drawbuffer :: integer(),Depth :: float(),Stencil :: integer().
clearBufferfi(Buffer,Drawbuffer,Depth,Stencil) ->
- cast(5575, <<Buffer:?GLenum,Drawbuffer:?GLint,Depth:?GLfloat,Stencil:?GLint>>).
+ cast(5576, <<Buffer:?GLenum,Drawbuffer:?GLint,Depth:?GLfloat,Stencil:?GLint>>).
%% @doc
%% See {@link getString/1}
-spec getStringi(Name, Index) -> string() when Name :: enum(),Index :: integer().
getStringi(Name,Index) ->
- call(5576, <<Name:?GLenum,Index:?GLuint>>).
+ call(5577, <<Name:?GLenum,Index:?GLuint>>).
%% @doc glDrawArraysInstance
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawArraysInstance.xml">external</a> documentation.
-spec drawArraysInstanced(Mode, First, Count, Primcount) -> 'ok' when Mode :: enum(),First :: integer(),Count :: integer(),Primcount :: integer().
drawArraysInstanced(Mode,First,Count,Primcount) ->
- cast(5577, <<Mode:?GLenum,First:?GLint,Count:?GLsizei,Primcount:?GLsizei>>).
+ cast(5578, <<Mode:?GLenum,First:?GLint,Count:?GLsizei,Primcount:?GLsizei>>).
%% @doc glDrawElementsInstance
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawElementsInstance.xml">external</a> documentation.
-spec drawElementsInstanced(Mode, Count, Type, Indices, Primcount) -> 'ok' when Mode :: enum(),Count :: integer(),Type :: enum(),Indices :: offset()|mem(),Primcount :: integer().
drawElementsInstanced(Mode,Count,Type,Indices,Primcount) when is_integer(Indices) ->
- cast(5578, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Primcount:?GLsizei>>);
+ cast(5579, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Primcount:?GLsizei>>);
drawElementsInstanced(Mode,Count,Type,Indices,Primcount) ->
send_bin(Indices),
- cast(5579, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Primcount:?GLsizei>>).
+ cast(5580, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Primcount:?GLsizei>>).
%% @doc Attach the storage for a buffer object to the active buffer texture
%%
@@ -12770,7 +12818,7 @@ drawElementsInstanced(Mode,Count,Type,Indices,Primcount) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glTexBuffer.xml">external</a> documentation.
-spec texBuffer(Target, Internalformat, Buffer) -> 'ok' when Target :: enum(),Internalformat :: enum(),Buffer :: integer().
texBuffer(Target,Internalformat,Buffer) ->
- cast(5580, <<Target:?GLenum,Internalformat:?GLenum,Buffer:?GLuint>>).
+ cast(5581, <<Target:?GLenum,Internalformat:?GLenum,Buffer:?GLuint>>).
%% @doc Specify the primitive restart index
%%
@@ -12792,20 +12840,20 @@ texBuffer(Target,Internalformat,Buffer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glPrimitiveRestartIndex.xml">external</a> documentation.
-spec primitiveRestartIndex(Index) -> 'ok' when Index :: integer().
primitiveRestartIndex(Index) ->
- cast(5581, <<Index:?GLuint>>).
+ cast(5582, <<Index:?GLuint>>).
%% @doc
%% See {@link getBooleanv/1}
-spec getInteger64i_v(Target, Index) -> [integer()] when Target :: enum(),Index :: integer().
getInteger64i_v(Target,Index) ->
- call(5582, <<Target:?GLenum,Index:?GLuint>>).
+ call(5583, <<Target:?GLenum,Index:?GLuint>>).
%% @doc glGetBufferParameteri64v
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetBufferParameteri64v.xml">external</a> documentation.
-spec getBufferParameteri64v(Target, Pname) -> [integer()] when Target :: enum(),Pname :: enum().
getBufferParameteri64v(Target,Pname) ->
- call(5583, <<Target:?GLenum,Pname:?GLenum>>).
+ call(5584, <<Target:?GLenum,Pname:?GLenum>>).
%% @doc Attach a level of a texture object as a logical buffer to the currently bound framebuffer object
%%
@@ -12862,7 +12910,7 @@ getBufferParameteri64v(Target,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glFramebufferTexture.xml">external</a> documentation.
-spec framebufferTexture(Target, Attachment, Texture, Level) -> 'ok' when Target :: enum(),Attachment :: enum(),Texture :: integer(),Level :: integer().
framebufferTexture(Target,Attachment,Texture,Level) ->
- cast(5584, <<Target:?GLenum,Attachment:?GLenum,Texture:?GLuint,Level:?GLint>>).
+ cast(5585, <<Target:?GLenum,Attachment:?GLenum,Texture:?GLuint,Level:?GLint>>).
%% @doc Modify the rate at which generic vertex attributes advance during instanced rendering
%%
@@ -12878,7 +12926,7 @@ framebufferTexture(Target,Attachment,Texture,Level) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribDivisor.xml">external</a> documentation.
-spec vertexAttribDivisor(Index, Divisor) -> 'ok' when Index :: integer(),Divisor :: integer().
vertexAttribDivisor(Index,Divisor) ->
- cast(5585, <<Index:?GLuint,Divisor:?GLuint>>).
+ cast(5586, <<Index:?GLuint,Divisor:?GLuint>>).
%% @doc Specifies minimum rate at which sample shaing takes place
%%
@@ -12899,107 +12947,112 @@ vertexAttribDivisor(Index,Divisor) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glMinSampleShading.xml">external</a> documentation.
-spec minSampleShading(Value) -> 'ok' when Value :: clamp().
minSampleShading(Value) ->
- cast(5586, <<Value:?GLclampf>>).
+ cast(5587, <<Value:?GLclampf>>).
%% @doc
%% See {@link blendEquation/1}
-spec blendEquationi(Buf, Mode) -> 'ok' when Buf :: integer(),Mode :: enum().
blendEquationi(Buf,Mode) ->
- cast(5587, <<Buf:?GLuint,Mode:?GLenum>>).
+ cast(5588, <<Buf:?GLuint,Mode:?GLenum>>).
%% @doc
%% See {@link blendEquationSeparate/2}
-spec blendEquationSeparatei(Buf, ModeRGB, ModeAlpha) -> 'ok' when Buf :: integer(),ModeRGB :: enum(),ModeAlpha :: enum().
blendEquationSeparatei(Buf,ModeRGB,ModeAlpha) ->
- cast(5588, <<Buf:?GLuint,ModeRGB:?GLenum,ModeAlpha:?GLenum>>).
+ cast(5589, <<Buf:?GLuint,ModeRGB:?GLenum,ModeAlpha:?GLenum>>).
%% @doc glBlendFunci
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBlendFunci.xml">external</a> documentation.
-spec blendFunci(Buf, Src, Dst) -> 'ok' when Buf :: integer(),Src :: enum(),Dst :: enum().
blendFunci(Buf,Src,Dst) ->
- cast(5589, <<Buf:?GLuint,Src:?GLenum,Dst:?GLenum>>).
+ cast(5590, <<Buf:?GLuint,Src:?GLenum,Dst:?GLenum>>).
%% @doc
%% See {@link blendFuncSeparate/4}
-spec blendFuncSeparatei(Buf, SrcRGB, DstRGB, SrcAlpha, DstAlpha) -> 'ok' when Buf :: integer(),SrcRGB :: enum(),DstRGB :: enum(),SrcAlpha :: enum(),DstAlpha :: enum().
blendFuncSeparatei(Buf,SrcRGB,DstRGB,SrcAlpha,DstAlpha) ->
- cast(5590, <<Buf:?GLuint,SrcRGB:?GLenum,DstRGB:?GLenum,SrcAlpha:?GLenum,DstAlpha:?GLenum>>).
+ cast(5591, <<Buf:?GLuint,SrcRGB:?GLenum,DstRGB:?GLenum,SrcAlpha:?GLenum,DstAlpha:?GLenum>>).
%% @doc glLoadTransposeMatrixARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glLoadTransposeMatrixARB.xml">external</a> documentation.
-spec loadTransposeMatrixfARB(M) -> 'ok' when M :: matrix().
loadTransposeMatrixfARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) ->
- cast(5591, <<M1:?GLfloat,M2:?GLfloat,M3:?GLfloat,M4:?GLfloat,M5:?GLfloat,M6:?GLfloat,M7:?GLfloat,M8:?GLfloat,M9:?GLfloat,M10:?GLfloat,M11:?GLfloat,M12:?GLfloat,M13:?GLfloat,M14:?GLfloat,M15:?GLfloat,M16:?GLfloat>>);
+ cast(5592, <<M1:?GLfloat,M2:?GLfloat,M3:?GLfloat,M4:?GLfloat,M5:?GLfloat,M6:?GLfloat,M7:?GLfloat,M8:?GLfloat,M9:?GLfloat,M10:?GLfloat,M11:?GLfloat,M12:?GLfloat,M13:?GLfloat,M14:?GLfloat,M15:?GLfloat,M16:?GLfloat>>);
loadTransposeMatrixfARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) ->
- cast(5591, <<M1:?GLfloat,M2:?GLfloat,M3:?GLfloat,0:?GLfloat,M4:?GLfloat,M5:?GLfloat,M6:?GLfloat,0:?GLfloat,M7:?GLfloat,M8:?GLfloat,M9:?GLfloat,0:?GLfloat,M10:?GLfloat,M11:?GLfloat,M12:?GLfloat,1:?GLfloat>>).
+ cast(5592, <<M1:?GLfloat,M2:?GLfloat,M3:?GLfloat,0:?GLfloat,M4:?GLfloat,M5:?GLfloat,M6:?GLfloat,0:?GLfloat,M7:?GLfloat,M8:?GLfloat,M9:?GLfloat,0:?GLfloat,M10:?GLfloat,M11:?GLfloat,M12:?GLfloat,1:?GLfloat>>).
%% @doc glLoadTransposeMatrixARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glLoadTransposeMatrixARB.xml">external</a> documentation.
-spec loadTransposeMatrixdARB(M) -> 'ok' when M :: matrix().
loadTransposeMatrixdARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) ->
- cast(5592, <<M1:?GLdouble,M2:?GLdouble,M3:?GLdouble,M4:?GLdouble,M5:?GLdouble,M6:?GLdouble,M7:?GLdouble,M8:?GLdouble,M9:?GLdouble,M10:?GLdouble,M11:?GLdouble,M12:?GLdouble,M13:?GLdouble,M14:?GLdouble,M15:?GLdouble,M16:?GLdouble>>);
+ cast(5593, <<M1:?GLdouble,M2:?GLdouble,M3:?GLdouble,M4:?GLdouble,M5:?GLdouble,M6:?GLdouble,M7:?GLdouble,M8:?GLdouble,M9:?GLdouble,M10:?GLdouble,M11:?GLdouble,M12:?GLdouble,M13:?GLdouble,M14:?GLdouble,M15:?GLdouble,M16:?GLdouble>>);
loadTransposeMatrixdARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) ->
- cast(5592, <<M1:?GLdouble,M2:?GLdouble,M3:?GLdouble,0:?GLdouble,M4:?GLdouble,M5:?GLdouble,M6:?GLdouble,0:?GLdouble,M7:?GLdouble,M8:?GLdouble,M9:?GLdouble,0:?GLdouble,M10:?GLdouble,M11:?GLdouble,M12:?GLdouble,1:?GLdouble>>).
+ cast(5593, <<M1:?GLdouble,M2:?GLdouble,M3:?GLdouble,0:?GLdouble,M4:?GLdouble,M5:?GLdouble,M6:?GLdouble,0:?GLdouble,M7:?GLdouble,M8:?GLdouble,M9:?GLdouble,0:?GLdouble,M10:?GLdouble,M11:?GLdouble,M12:?GLdouble,1:?GLdouble>>).
%% @doc glMultTransposeMatrixARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glMultTransposeMatrixARB.xml">external</a> documentation.
-spec multTransposeMatrixfARB(M) -> 'ok' when M :: matrix().
multTransposeMatrixfARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) ->
- cast(5593, <<M1:?GLfloat,M2:?GLfloat,M3:?GLfloat,M4:?GLfloat,M5:?GLfloat,M6:?GLfloat,M7:?GLfloat,M8:?GLfloat,M9:?GLfloat,M10:?GLfloat,M11:?GLfloat,M12:?GLfloat,M13:?GLfloat,M14:?GLfloat,M15:?GLfloat,M16:?GLfloat>>);
+ cast(5594, <<M1:?GLfloat,M2:?GLfloat,M3:?GLfloat,M4:?GLfloat,M5:?GLfloat,M6:?GLfloat,M7:?GLfloat,M8:?GLfloat,M9:?GLfloat,M10:?GLfloat,M11:?GLfloat,M12:?GLfloat,M13:?GLfloat,M14:?GLfloat,M15:?GLfloat,M16:?GLfloat>>);
multTransposeMatrixfARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) ->
- cast(5593, <<M1:?GLfloat,M2:?GLfloat,M3:?GLfloat,0:?GLfloat,M4:?GLfloat,M5:?GLfloat,M6:?GLfloat,0:?GLfloat,M7:?GLfloat,M8:?GLfloat,M9:?GLfloat,0:?GLfloat,M10:?GLfloat,M11:?GLfloat,M12:?GLfloat,1:?GLfloat>>).
+ cast(5594, <<M1:?GLfloat,M2:?GLfloat,M3:?GLfloat,0:?GLfloat,M4:?GLfloat,M5:?GLfloat,M6:?GLfloat,0:?GLfloat,M7:?GLfloat,M8:?GLfloat,M9:?GLfloat,0:?GLfloat,M10:?GLfloat,M11:?GLfloat,M12:?GLfloat,1:?GLfloat>>).
%% @doc glMultTransposeMatrixARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glMultTransposeMatrixARB.xml">external</a> documentation.
-spec multTransposeMatrixdARB(M) -> 'ok' when M :: matrix().
multTransposeMatrixdARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12,M13,M14,M15,M16}) ->
- cast(5594, <<M1:?GLdouble,M2:?GLdouble,M3:?GLdouble,M4:?GLdouble,M5:?GLdouble,M6:?GLdouble,M7:?GLdouble,M8:?GLdouble,M9:?GLdouble,M10:?GLdouble,M11:?GLdouble,M12:?GLdouble,M13:?GLdouble,M14:?GLdouble,M15:?GLdouble,M16:?GLdouble>>);
+ cast(5595, <<M1:?GLdouble,M2:?GLdouble,M3:?GLdouble,M4:?GLdouble,M5:?GLdouble,M6:?GLdouble,M7:?GLdouble,M8:?GLdouble,M9:?GLdouble,M10:?GLdouble,M11:?GLdouble,M12:?GLdouble,M13:?GLdouble,M14:?GLdouble,M15:?GLdouble,M16:?GLdouble>>);
multTransposeMatrixdARB({M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12}) ->
- cast(5594, <<M1:?GLdouble,M2:?GLdouble,M3:?GLdouble,0:?GLdouble,M4:?GLdouble,M5:?GLdouble,M6:?GLdouble,0:?GLdouble,M7:?GLdouble,M8:?GLdouble,M9:?GLdouble,0:?GLdouble,M10:?GLdouble,M11:?GLdouble,M12:?GLdouble,1:?GLdouble>>).
+ cast(5595, <<M1:?GLdouble,M2:?GLdouble,M3:?GLdouble,0:?GLdouble,M4:?GLdouble,M5:?GLdouble,M6:?GLdouble,0:?GLdouble,M7:?GLdouble,M8:?GLdouble,M9:?GLdouble,0:?GLdouble,M10:?GLdouble,M11:?GLdouble,M12:?GLdouble,1:?GLdouble>>).
%% @doc glWeightARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWeightARB.xml">external</a> documentation.
-spec weightbvARB(Weights) -> 'ok' when Weights :: [integer()].
weightbvARB(Weights) ->
- cast(5595, <<(length(Weights)):?GLuint,
- (<< <<C:?GLbyte>> || C <- Weights>>)/binary,0:((8-((length(Weights)+ 4) rem 8)) rem 8)>>).
+ WeightsLen = length(Weights),
+ cast(5596, <<WeightsLen:?GLuint,
+ (<< <<C:?GLbyte>> || C <- Weights>>)/binary,0:((8-((WeightsLen+ 4) rem 8)) rem 8)>>).
%% @doc glWeightARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWeightARB.xml">external</a> documentation.
-spec weightsvARB(Weights) -> 'ok' when Weights :: [integer()].
weightsvARB(Weights) ->
- cast(5596, <<(length(Weights)):?GLuint,
- (<< <<C:?GLshort>> || C <- Weights>>)/binary,0:((8-((length(Weights)*2+ 4) rem 8)) rem 8)>>).
+ WeightsLen = length(Weights),
+ cast(5597, <<WeightsLen:?GLuint,
+ (<< <<C:?GLshort>> || C <- Weights>>)/binary,0:((8-((WeightsLen*2+ 4) rem 8)) rem 8)>>).
%% @doc glWeightARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWeightARB.xml">external</a> documentation.
-spec weightivARB(Weights) -> 'ok' when Weights :: [integer()].
weightivARB(Weights) ->
- cast(5597, <<(length(Weights)):?GLuint,
- (<< <<C:?GLint>> || C <- Weights>>)/binary,0:(((1+length(Weights)) rem 2)*32)>>).
+ WeightsLen = length(Weights),
+ cast(5598, <<WeightsLen:?GLuint,
+ (<< <<C:?GLint>> || C <- Weights>>)/binary,0:(((1+WeightsLen) rem 2)*32)>>).
%% @doc glWeightARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWeightARB.xml">external</a> documentation.
-spec weightfvARB(Weights) -> 'ok' when Weights :: [float()].
weightfvARB(Weights) ->
- cast(5598, <<(length(Weights)):?GLuint,
- (<< <<C:?GLfloat>> || C <- Weights>>)/binary,0:(((1+length(Weights)) rem 2)*32)>>).
+ WeightsLen = length(Weights),
+ cast(5599, <<WeightsLen:?GLuint,
+ (<< <<C:?GLfloat>> || C <- Weights>>)/binary,0:(((1+WeightsLen) rem 2)*32)>>).
%% @doc glWeightARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWeightARB.xml">external</a> documentation.
-spec weightdvARB(Weights) -> 'ok' when Weights :: [float()].
weightdvARB(Weights) ->
- cast(5599, <<(length(Weights)):?GLuint,0:32,
+ WeightsLen = length(Weights),
+ cast(5600, <<WeightsLen:?GLuint,0:32,
(<< <<C:?GLdouble>> || C <- Weights>>)/binary>>).
%% @doc glWeightARB
@@ -13007,175 +13060,183 @@ weightdvARB(Weights) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWeightARB.xml">external</a> documentation.
-spec weightubvARB(Weights) -> 'ok' when Weights :: [integer()].
weightubvARB(Weights) ->
- cast(5600, <<(length(Weights)):?GLuint,
- (<< <<C:?GLubyte>> || C <- Weights>>)/binary,0:((8-((length(Weights)+ 4) rem 8)) rem 8)>>).
+ WeightsLen = length(Weights),
+ cast(5601, <<WeightsLen:?GLuint,
+ (<< <<C:?GLubyte>> || C <- Weights>>)/binary,0:((8-((WeightsLen+ 4) rem 8)) rem 8)>>).
%% @doc glWeightARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWeightARB.xml">external</a> documentation.
-spec weightusvARB(Weights) -> 'ok' when Weights :: [integer()].
weightusvARB(Weights) ->
- cast(5601, <<(length(Weights)):?GLuint,
- (<< <<C:?GLushort>> || C <- Weights>>)/binary,0:((8-((length(Weights)*2+ 4) rem 8)) rem 8)>>).
+ WeightsLen = length(Weights),
+ cast(5602, <<WeightsLen:?GLuint,
+ (<< <<C:?GLushort>> || C <- Weights>>)/binary,0:((8-((WeightsLen*2+ 4) rem 8)) rem 8)>>).
%% @doc glWeightARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWeightARB.xml">external</a> documentation.
-spec weightuivARB(Weights) -> 'ok' when Weights :: [integer()].
weightuivARB(Weights) ->
- cast(5602, <<(length(Weights)):?GLuint,
- (<< <<C:?GLuint>> || C <- Weights>>)/binary,0:(((1+length(Weights)) rem 2)*32)>>).
+ WeightsLen = length(Weights),
+ cast(5603, <<WeightsLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Weights>>)/binary,0:(((1+WeightsLen) rem 2)*32)>>).
%% @doc glVertexBlenARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexBlenARB.xml">external</a> documentation.
-spec vertexBlendARB(Count) -> 'ok' when Count :: integer().
vertexBlendARB(Count) ->
- cast(5603, <<Count:?GLint>>).
+ cast(5604, <<Count:?GLint>>).
%% @doc glCurrentPaletteMatrixARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCurrentPaletteMatrixARB.xml">external</a> documentation.
-spec currentPaletteMatrixARB(Index) -> 'ok' when Index :: integer().
currentPaletteMatrixARB(Index) ->
- cast(5604, <<Index:?GLint>>).
+ cast(5605, <<Index:?GLint>>).
%% @doc glMatrixIndexARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glMatrixIndexARB.xml">external</a> documentation.
-spec matrixIndexubvARB(Indices) -> 'ok' when Indices :: [integer()].
matrixIndexubvARB(Indices) ->
- cast(5605, <<(length(Indices)):?GLuint,
- (<< <<C:?GLubyte>> || C <- Indices>>)/binary,0:((8-((length(Indices)+ 4) rem 8)) rem 8)>>).
+ IndicesLen = length(Indices),
+ cast(5606, <<IndicesLen:?GLuint,
+ (<< <<C:?GLubyte>> || C <- Indices>>)/binary,0:((8-((IndicesLen+ 4) rem 8)) rem 8)>>).
%% @doc glMatrixIndexARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glMatrixIndexARB.xml">external</a> documentation.
-spec matrixIndexusvARB(Indices) -> 'ok' when Indices :: [integer()].
matrixIndexusvARB(Indices) ->
- cast(5606, <<(length(Indices)):?GLuint,
- (<< <<C:?GLushort>> || C <- Indices>>)/binary,0:((8-((length(Indices)*2+ 4) rem 8)) rem 8)>>).
+ IndicesLen = length(Indices),
+ cast(5607, <<IndicesLen:?GLuint,
+ (<< <<C:?GLushort>> || C <- Indices>>)/binary,0:((8-((IndicesLen*2+ 4) rem 8)) rem 8)>>).
%% @doc glMatrixIndexARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glMatrixIndexARB.xml">external</a> documentation.
-spec matrixIndexuivARB(Indices) -> 'ok' when Indices :: [integer()].
matrixIndexuivARB(Indices) ->
- cast(5607, <<(length(Indices)):?GLuint,
- (<< <<C:?GLuint>> || C <- Indices>>)/binary,0:(((1+length(Indices)) rem 2)*32)>>).
+ IndicesLen = length(Indices),
+ cast(5608, <<IndicesLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Indices>>)/binary,0:(((1+IndicesLen) rem 2)*32)>>).
%% @doc glProgramStringARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramStringARB.xml">external</a> documentation.
-spec programStringARB(Target, Format, String) -> 'ok' when Target :: enum(),Format :: enum(),String :: string().
programStringARB(Target,Format,String) ->
- cast(5608, <<Target:?GLenum,Format:?GLenum,(list_to_binary([String|[0]]))/binary,0:((8-((length(String)+ 1) rem 8)) rem 8)>>).
+ StringLen = length(String),
+ cast(5609, <<Target:?GLenum,Format:?GLenum,(list_to_binary([String|[0]]))/binary,0:((8-((StringLen+ 1) rem 8)) rem 8)>>).
%% @doc glBindProgramARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindProgramARB.xml">external</a> documentation.
-spec bindProgramARB(Target, Program) -> 'ok' when Target :: enum(),Program :: integer().
bindProgramARB(Target,Program) ->
- cast(5609, <<Target:?GLenum,Program:?GLuint>>).
+ cast(5610, <<Target:?GLenum,Program:?GLuint>>).
%% @doc glDeleteProgramsARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgramsARB.xml">external</a> documentation.
-spec deleteProgramsARB(Programs) -> 'ok' when Programs :: [integer()].
deleteProgramsARB(Programs) ->
- cast(5610, <<(length(Programs)):?GLuint,
- (<< <<C:?GLuint>> || C <- Programs>>)/binary,0:(((1+length(Programs)) rem 2)*32)>>).
+ ProgramsLen = length(Programs),
+ cast(5611, <<ProgramsLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Programs>>)/binary,0:(((1+ProgramsLen) rem 2)*32)>>).
%% @doc glGenProgramsARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenProgramsARB.xml">external</a> documentation.
-spec genProgramsARB(N) -> [integer()] when N :: integer().
genProgramsARB(N) ->
- call(5611, <<N:?GLsizei>>).
+ call(5612, <<N:?GLsizei>>).
%% @doc glProgramEnvParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramEnvParameterARB.xml">external</a> documentation.
-spec programEnvParameter4dARB(Target, Index, X, Y, Z, W) -> 'ok' when Target :: enum(),Index :: integer(),X :: float(),Y :: float(),Z :: float(),W :: float().
programEnvParameter4dARB(Target,Index,X,Y,Z,W) ->
- cast(5612, <<Target:?GLenum,Index:?GLuint,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
+ cast(5613, <<Target:?GLenum,Index:?GLuint,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
%% @doc glProgramEnvParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramEnvParameterARB.xml">external</a> documentation.
-spec programEnvParameter4dvARB(Target, Index, Params) -> 'ok' when Target :: enum(),Index :: integer(),Params :: {float(),float(),float(),float()}.
programEnvParameter4dvARB(Target,Index,{P1,P2,P3,P4}) ->
- cast(5613, <<Target:?GLenum,Index:?GLuint,P1:?GLdouble,P2:?GLdouble,P3:?GLdouble,P4:?GLdouble>>).
+ cast(5614, <<Target:?GLenum,Index:?GLuint,P1:?GLdouble,P2:?GLdouble,P3:?GLdouble,P4:?GLdouble>>).
%% @doc glProgramEnvParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramEnvParameterARB.xml">external</a> documentation.
-spec programEnvParameter4fARB(Target, Index, X, Y, Z, W) -> 'ok' when Target :: enum(),Index :: integer(),X :: float(),Y :: float(),Z :: float(),W :: float().
programEnvParameter4fARB(Target,Index,X,Y,Z,W) ->
- cast(5614, <<Target:?GLenum,Index:?GLuint,X:?GLfloat,Y:?GLfloat,Z:?GLfloat,W:?GLfloat>>).
+ cast(5615, <<Target:?GLenum,Index:?GLuint,X:?GLfloat,Y:?GLfloat,Z:?GLfloat,W:?GLfloat>>).
%% @doc glProgramEnvParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramEnvParameterARB.xml">external</a> documentation.
-spec programEnvParameter4fvARB(Target, Index, Params) -> 'ok' when Target :: enum(),Index :: integer(),Params :: {float(),float(),float(),float()}.
programEnvParameter4fvARB(Target,Index,{P1,P2,P3,P4}) ->
- cast(5615, <<Target:?GLenum,Index:?GLuint,P1:?GLfloat,P2:?GLfloat,P3:?GLfloat,P4:?GLfloat>>).
+ cast(5616, <<Target:?GLenum,Index:?GLuint,P1:?GLfloat,P2:?GLfloat,P3:?GLfloat,P4:?GLfloat>>).
%% @doc glProgramLocalParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramLocalParameterARB.xml">external</a> documentation.
-spec programLocalParameter4dARB(Target, Index, X, Y, Z, W) -> 'ok' when Target :: enum(),Index :: integer(),X :: float(),Y :: float(),Z :: float(),W :: float().
programLocalParameter4dARB(Target,Index,X,Y,Z,W) ->
- cast(5616, <<Target:?GLenum,Index:?GLuint,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
+ cast(5617, <<Target:?GLenum,Index:?GLuint,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
%% @doc glProgramLocalParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramLocalParameterARB.xml">external</a> documentation.
-spec programLocalParameter4dvARB(Target, Index, Params) -> 'ok' when Target :: enum(),Index :: integer(),Params :: {float(),float(),float(),float()}.
programLocalParameter4dvARB(Target,Index,{P1,P2,P3,P4}) ->
- cast(5617, <<Target:?GLenum,Index:?GLuint,P1:?GLdouble,P2:?GLdouble,P3:?GLdouble,P4:?GLdouble>>).
+ cast(5618, <<Target:?GLenum,Index:?GLuint,P1:?GLdouble,P2:?GLdouble,P3:?GLdouble,P4:?GLdouble>>).
%% @doc glProgramLocalParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramLocalParameterARB.xml">external</a> documentation.
-spec programLocalParameter4fARB(Target, Index, X, Y, Z, W) -> 'ok' when Target :: enum(),Index :: integer(),X :: float(),Y :: float(),Z :: float(),W :: float().
programLocalParameter4fARB(Target,Index,X,Y,Z,W) ->
- cast(5618, <<Target:?GLenum,Index:?GLuint,X:?GLfloat,Y:?GLfloat,Z:?GLfloat,W:?GLfloat>>).
+ cast(5619, <<Target:?GLenum,Index:?GLuint,X:?GLfloat,Y:?GLfloat,Z:?GLfloat,W:?GLfloat>>).
%% @doc glProgramLocalParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramLocalParameterARB.xml">external</a> documentation.
-spec programLocalParameter4fvARB(Target, Index, Params) -> 'ok' when Target :: enum(),Index :: integer(),Params :: {float(),float(),float(),float()}.
programLocalParameter4fvARB(Target,Index,{P1,P2,P3,P4}) ->
- cast(5619, <<Target:?GLenum,Index:?GLuint,P1:?GLfloat,P2:?GLfloat,P3:?GLfloat,P4:?GLfloat>>).
+ cast(5620, <<Target:?GLenum,Index:?GLuint,P1:?GLfloat,P2:?GLfloat,P3:?GLfloat,P4:?GLfloat>>).
%% @doc glGetProgramEnvParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramEnvParameterARB.xml">external</a> documentation.
-spec getProgramEnvParameterdvARB(Target, Index) -> {float(),float(),float(),float()} when Target :: enum(),Index :: integer().
getProgramEnvParameterdvARB(Target,Index) ->
- call(5620, <<Target:?GLenum,Index:?GLuint>>).
+ call(5621, <<Target:?GLenum,Index:?GLuint>>).
%% @doc glGetProgramEnvParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramEnvParameterARB.xml">external</a> documentation.
-spec getProgramEnvParameterfvARB(Target, Index) -> {float(),float(),float(),float()} when Target :: enum(),Index :: integer().
getProgramEnvParameterfvARB(Target,Index) ->
- call(5621, <<Target:?GLenum,Index:?GLuint>>).
+ call(5622, <<Target:?GLenum,Index:?GLuint>>).
%% @doc glGetProgramLocalParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramLocalParameterARB.xml">external</a> documentation.
-spec getProgramLocalParameterdvARB(Target, Index) -> {float(),float(),float(),float()} when Target :: enum(),Index :: integer().
getProgramLocalParameterdvARB(Target,Index) ->
- call(5622, <<Target:?GLenum,Index:?GLuint>>).
+ call(5623, <<Target:?GLenum,Index:?GLuint>>).
%% @doc glGetProgramLocalParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramLocalParameterARB.xml">external</a> documentation.
-spec getProgramLocalParameterfvARB(Target, Index) -> {float(),float(),float(),float()} when Target :: enum(),Index :: integer().
getProgramLocalParameterfvARB(Target,Index) ->
- call(5623, <<Target:?GLenum,Index:?GLuint>>).
+ call(5624, <<Target:?GLenum,Index:?GLuint>>).
%% @doc glGetProgramStringARB
%%
@@ -13183,176 +13244,180 @@ getProgramLocalParameterfvARB(Target,Index) ->
-spec getProgramStringARB(Target, Pname, String) -> 'ok' when Target :: enum(),Pname :: enum(),String :: mem().
getProgramStringARB(Target,Pname,String) ->
send_bin(String),
- call(5624, <<Target:?GLenum,Pname:?GLenum>>).
+ call(5625, <<Target:?GLenum,Pname:?GLenum>>).
%% @doc glGetBufferParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetBufferParameterARB.xml">external</a> documentation.
-spec getBufferParameterivARB(Target, Pname) -> [integer()] when Target :: enum(),Pname :: enum().
getBufferParameterivARB(Target,Pname) ->
- call(5625, <<Target:?GLenum,Pname:?GLenum>>).
+ call(5626, <<Target:?GLenum,Pname:?GLenum>>).
%% @doc glDeleteObjectARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteObjectARB.xml">external</a> documentation.
-spec deleteObjectARB(Obj) -> 'ok' when Obj :: integer().
deleteObjectARB(Obj) ->
- cast(5626, <<Obj:?GLhandleARB>>).
+ cast(5627, <<Obj:?GLhandleARB>>).
%% @doc glGetHandleARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetHandleARB.xml">external</a> documentation.
-spec getHandleARB(Pname) -> integer() when Pname :: enum().
getHandleARB(Pname) ->
- call(5627, <<Pname:?GLenum>>).
+ call(5628, <<Pname:?GLenum>>).
%% @doc glDetachObjectARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDetachObjectARB.xml">external</a> documentation.
-spec detachObjectARB(ContainerObj, AttachedObj) -> 'ok' when ContainerObj :: integer(),AttachedObj :: integer().
detachObjectARB(ContainerObj,AttachedObj) ->
- cast(5628, <<ContainerObj:?GLhandleARB,AttachedObj:?GLhandleARB>>).
+ cast(5629, <<ContainerObj:?GLhandleARB,AttachedObj:?GLhandleARB>>).
%% @doc glCreateShaderObjectARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCreateShaderObjectARB.xml">external</a> documentation.
-spec createShaderObjectARB(ShaderType) -> integer() when ShaderType :: enum().
createShaderObjectARB(ShaderType) ->
- call(5629, <<ShaderType:?GLenum>>).
+ call(5630, <<ShaderType:?GLenum>>).
%% @doc glShaderSourceARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glShaderSourceARB.xml">external</a> documentation.
-spec shaderSourceARB(ShaderObj, String) -> 'ok' when ShaderObj :: integer(),String :: iolist().
shaderSourceARB(ShaderObj,String) ->
- StringTemp = list_to_binary([[Str|[0]] || Str <- String ]),
- cast(5630, <<ShaderObj:?GLhandleARB,(length(String)):?GLuint,(size(StringTemp)):?GLuint,(StringTemp)/binary,0:((8-((size(StringTemp)+4) rem 8)) rem 8)>>).
+ StringTemp = list_to_binary([[Str|[0]] || Str <- String ]),
+ StringLen = length(String),
+ cast(5631, <<ShaderObj:?GLhandleARB,StringLen:?GLuint,(size(StringTemp)):?GLuint,(StringTemp)/binary,0:((8-((size(StringTemp)+4) rem 8)) rem 8)>>).
%% @doc glCompileShaderARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCompileShaderARB.xml">external</a> documentation.
-spec compileShaderARB(ShaderObj) -> 'ok' when ShaderObj :: integer().
compileShaderARB(ShaderObj) ->
- cast(5631, <<ShaderObj:?GLhandleARB>>).
+ cast(5632, <<ShaderObj:?GLhandleARB>>).
%% @doc glCreateProgramObjectARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCreateProgramObjectARB.xml">external</a> documentation.
-spec createProgramObjectARB() -> integer().
createProgramObjectARB() ->
- call(5632, <<>>).
+ call(5633, <<>>).
%% @doc glAttachObjectARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glAttachObjectARB.xml">external</a> documentation.
-spec attachObjectARB(ContainerObj, Obj) -> 'ok' when ContainerObj :: integer(),Obj :: integer().
attachObjectARB(ContainerObj,Obj) ->
- cast(5633, <<ContainerObj:?GLhandleARB,Obj:?GLhandleARB>>).
+ cast(5634, <<ContainerObj:?GLhandleARB,Obj:?GLhandleARB>>).
%% @doc glLinkProgramARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glLinkProgramARB.xml">external</a> documentation.
-spec linkProgramARB(ProgramObj) -> 'ok' when ProgramObj :: integer().
linkProgramARB(ProgramObj) ->
- cast(5634, <<ProgramObj:?GLhandleARB>>).
+ cast(5635, <<ProgramObj:?GLhandleARB>>).
%% @doc glUseProgramObjectARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glUseProgramObjectARB.xml">external</a> documentation.
-spec useProgramObjectARB(ProgramObj) -> 'ok' when ProgramObj :: integer().
useProgramObjectARB(ProgramObj) ->
- cast(5635, <<ProgramObj:?GLhandleARB>>).
+ cast(5636, <<ProgramObj:?GLhandleARB>>).
%% @doc glValidateProgramARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glValidateProgramARB.xml">external</a> documentation.
-spec validateProgramARB(ProgramObj) -> 'ok' when ProgramObj :: integer().
validateProgramARB(ProgramObj) ->
- cast(5636, <<ProgramObj:?GLhandleARB>>).
+ cast(5637, <<ProgramObj:?GLhandleARB>>).
%% @doc glGetObjectParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetObjectParameterARB.xml">external</a> documentation.
-spec getObjectParameterfvARB(Obj, Pname) -> float() when Obj :: integer(),Pname :: enum().
getObjectParameterfvARB(Obj,Pname) ->
- call(5637, <<Obj:?GLhandleARB,Pname:?GLenum>>).
+ call(5638, <<Obj:?GLhandleARB,Pname:?GLenum>>).
%% @doc glGetObjectParameterARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetObjectParameterARB.xml">external</a> documentation.
-spec getObjectParameterivARB(Obj, Pname) -> integer() when Obj :: integer(),Pname :: enum().
getObjectParameterivARB(Obj,Pname) ->
- call(5638, <<Obj:?GLhandleARB,Pname:?GLenum>>).
+ call(5639, <<Obj:?GLhandleARB,Pname:?GLenum>>).
%% @doc glGetInfoLogARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetInfoLogARB.xml">external</a> documentation.
-spec getInfoLogARB(Obj, MaxLength) -> string() when Obj :: integer(),MaxLength :: integer().
getInfoLogARB(Obj,MaxLength) ->
- call(5639, <<Obj:?GLhandleARB,MaxLength:?GLsizei>>).
+ call(5640, <<Obj:?GLhandleARB,MaxLength:?GLsizei>>).
%% @doc glGetAttachedObjectsARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetAttachedObjectsARB.xml">external</a> documentation.
-spec getAttachedObjectsARB(ContainerObj, MaxCount) -> [integer()] when ContainerObj :: integer(),MaxCount :: integer().
getAttachedObjectsARB(ContainerObj,MaxCount) ->
- call(5640, <<ContainerObj:?GLhandleARB,MaxCount:?GLsizei>>).
+ call(5641, <<ContainerObj:?GLhandleARB,MaxCount:?GLsizei>>).
%% @doc glGetUniformLocationARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocationARB.xml">external</a> documentation.
-spec getUniformLocationARB(ProgramObj, Name) -> integer() when ProgramObj :: integer(),Name :: string().
getUniformLocationARB(ProgramObj,Name) ->
- call(5641, <<ProgramObj:?GLhandleARB,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ call(5642, <<ProgramObj:?GLhandleARB,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8)>>).
%% @doc glGetActiveUniformARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveUniformARB.xml">external</a> documentation.
-spec getActiveUniformARB(ProgramObj, Index, MaxLength) -> {Size :: integer(),Type :: enum(),Name :: string()} when ProgramObj :: integer(),Index :: integer(),MaxLength :: integer().
getActiveUniformARB(ProgramObj,Index,MaxLength) ->
- call(5642, <<ProgramObj:?GLhandleARB,Index:?GLuint,MaxLength:?GLsizei>>).
+ call(5643, <<ProgramObj:?GLhandleARB,Index:?GLuint,MaxLength:?GLsizei>>).
%% @doc glGetUniformARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformARB.xml">external</a> documentation.
-spec getUniformfvARB(ProgramObj, Location) -> matrix() when ProgramObj :: integer(),Location :: integer().
getUniformfvARB(ProgramObj,Location) ->
- call(5643, <<ProgramObj:?GLhandleARB,Location:?GLint>>).
+ call(5644, <<ProgramObj:?GLhandleARB,Location:?GLint>>).
%% @doc glGetUniformARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformARB.xml">external</a> documentation.
-spec getUniformivARB(ProgramObj, Location) -> {integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer()} when ProgramObj :: integer(),Location :: integer().
getUniformivARB(ProgramObj,Location) ->
- call(5644, <<ProgramObj:?GLhandleARB,Location:?GLint>>).
+ call(5645, <<ProgramObj:?GLhandleARB,Location:?GLint>>).
%% @doc glGetShaderSourceARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetShaderSourceARB.xml">external</a> documentation.
-spec getShaderSourceARB(Obj, MaxLength) -> string() when Obj :: integer(),MaxLength :: integer().
getShaderSourceARB(Obj,MaxLength) ->
- call(5645, <<Obj:?GLhandleARB,MaxLength:?GLsizei>>).
+ call(5646, <<Obj:?GLhandleARB,MaxLength:?GLsizei>>).
%% @doc glBindAttribLocationARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocationARB.xml">external</a> documentation.
-spec bindAttribLocationARB(ProgramObj, Index, Name) -> 'ok' when ProgramObj :: integer(),Index :: integer(),Name :: string().
bindAttribLocationARB(ProgramObj,Index,Name) ->
- cast(5646, <<ProgramObj:?GLhandleARB,Index:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 5) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ cast(5647, <<ProgramObj:?GLhandleARB,Index:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 5) rem 8)) rem 8)>>).
%% @doc glGetActiveAttribARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveAttribARB.xml">external</a> documentation.
-spec getActiveAttribARB(ProgramObj, Index, MaxLength) -> {Size :: integer(),Type :: enum(),Name :: string()} when ProgramObj :: integer(),Index :: integer(),MaxLength :: integer().
getActiveAttribARB(ProgramObj,Index,MaxLength) ->
- call(5647, <<ProgramObj:?GLhandleARB,Index:?GLuint,MaxLength:?GLsizei>>).
+ call(5648, <<ProgramObj:?GLhandleARB,Index:?GLuint,MaxLength:?GLsizei>>).
%% @doc glGetAttribLocationARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocationARB.xml">external</a> documentation.
-spec getAttribLocationARB(ProgramObj, Name) -> integer() when ProgramObj :: integer(),Name :: string().
getAttribLocationARB(ProgramObj,Name) ->
- call(5648, <<ProgramObj:?GLhandleARB,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ call(5649, <<ProgramObj:?GLhandleARB,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8)>>).
%% @doc Determine if a name corresponds to a renderbuffer object
%%
@@ -13367,7 +13432,7 @@ getAttribLocationARB(ProgramObj,Name) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsRenderbuffer.xml">external</a> documentation.
-spec isRenderbuffer(Renderbuffer) -> 0|1 when Renderbuffer :: integer().
isRenderbuffer(Renderbuffer) ->
- call(5649, <<Renderbuffer:?GLuint>>).
+ call(5650, <<Renderbuffer:?GLuint>>).
%% @doc Bind a renderbuffer to a renderbuffer target
%%
@@ -13380,7 +13445,7 @@ isRenderbuffer(Renderbuffer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindRenderbuffer.xml">external</a> documentation.
-spec bindRenderbuffer(Target, Renderbuffer) -> 'ok' when Target :: enum(),Renderbuffer :: integer().
bindRenderbuffer(Target,Renderbuffer) ->
- cast(5650, <<Target:?GLenum,Renderbuffer:?GLuint>>).
+ cast(5651, <<Target:?GLenum,Renderbuffer:?GLuint>>).
%% @doc Delete renderbuffer objects
%%
@@ -13402,8 +13467,9 @@ bindRenderbuffer(Target,Renderbuffer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteRenderbuffers.xml">external</a> documentation.
-spec deleteRenderbuffers(Renderbuffers) -> 'ok' when Renderbuffers :: [integer()].
deleteRenderbuffers(Renderbuffers) ->
- cast(5651, <<(length(Renderbuffers)):?GLuint,
- (<< <<C:?GLuint>> || C <- Renderbuffers>>)/binary,0:(((1+length(Renderbuffers)) rem 2)*32)>>).
+ RenderbuffersLen = length(Renderbuffers),
+ cast(5652, <<RenderbuffersLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Renderbuffers>>)/binary,0:(((1+RenderbuffersLen) rem 2)*32)>>).
%% @doc Generate renderbuffer object names
%%
@@ -13421,7 +13487,7 @@ deleteRenderbuffers(Renderbuffers) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenRenderbuffers.xml">external</a> documentation.
-spec genRenderbuffers(N) -> [integer()] when N :: integer().
genRenderbuffers(N) ->
- call(5652, <<N:?GLsizei>>).
+ call(5653, <<N:?GLsizei>>).
%% @doc Establish data storage, format and dimensions of a renderbuffer object's image
%%
@@ -13442,7 +13508,7 @@ genRenderbuffers(N) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glRenderbufferStorage.xml">external</a> documentation.
-spec renderbufferStorage(Target, Internalformat, Width, Height) -> 'ok' when Target :: enum(),Internalformat :: enum(),Width :: integer(),Height :: integer().
renderbufferStorage(Target,Internalformat,Width,Height) ->
- cast(5653, <<Target:?GLenum,Internalformat:?GLenum,Width:?GLsizei,Height:?GLsizei>>).
+ cast(5654, <<Target:?GLenum,Internalformat:?GLenum,Width:?GLsizei,Height:?GLsizei>>).
%% @doc Retrieve information about a bound renderbuffer object
%%
@@ -13470,7 +13536,7 @@ renderbufferStorage(Target,Internalformat,Width,Height) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetRenderbufferParameter.xml">external</a> documentation.
-spec getRenderbufferParameteriv(Target, Pname) -> integer() when Target :: enum(),Pname :: enum().
getRenderbufferParameteriv(Target,Pname) ->
- call(5654, <<Target:?GLenum,Pname:?GLenum>>).
+ call(5655, <<Target:?GLenum,Pname:?GLenum>>).
%% @doc Determine if a name corresponds to a framebuffer object
%%
@@ -13484,7 +13550,7 @@ getRenderbufferParameteriv(Target,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsFramebuffer.xml">external</a> documentation.
-spec isFramebuffer(Framebuffer) -> 0|1 when Framebuffer :: integer().
isFramebuffer(Framebuffer) ->
- call(5655, <<Framebuffer:?GLuint>>).
+ call(5656, <<Framebuffer:?GLuint>>).
%% @doc Bind a framebuffer to a framebuffer target
%%
@@ -13502,7 +13568,7 @@ isFramebuffer(Framebuffer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindFramebuffer.xml">external</a> documentation.
-spec bindFramebuffer(Target, Framebuffer) -> 'ok' when Target :: enum(),Framebuffer :: integer().
bindFramebuffer(Target,Framebuffer) ->
- cast(5656, <<Target:?GLenum,Framebuffer:?GLuint>>).
+ cast(5657, <<Target:?GLenum,Framebuffer:?GLuint>>).
%% @doc Delete framebuffer objects
%%
@@ -13517,8 +13583,9 @@ bindFramebuffer(Target,Framebuffer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteFramebuffers.xml">external</a> documentation.
-spec deleteFramebuffers(Framebuffers) -> 'ok' when Framebuffers :: [integer()].
deleteFramebuffers(Framebuffers) ->
- cast(5657, <<(length(Framebuffers)):?GLuint,
- (<< <<C:?GLuint>> || C <- Framebuffers>>)/binary,0:(((1+length(Framebuffers)) rem 2)*32)>>).
+ FramebuffersLen = length(Framebuffers),
+ cast(5658, <<FramebuffersLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Framebuffers>>)/binary,0:(((1+FramebuffersLen) rem 2)*32)>>).
%% @doc Generate framebuffer object names
%%
@@ -13536,7 +13603,7 @@ deleteFramebuffers(Framebuffers) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenFramebuffers.xml">external</a> documentation.
-spec genFramebuffers(N) -> [integer()] when N :: integer().
genFramebuffers(N) ->
- call(5658, <<N:?GLsizei>>).
+ call(5659, <<N:?GLsizei>>).
%% @doc Check the completeness status of a framebuffer
%%
@@ -13587,25 +13654,25 @@ genFramebuffers(N) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCheckFramebufferStatus.xml">external</a> documentation.
-spec checkFramebufferStatus(Target) -> enum() when Target :: enum().
checkFramebufferStatus(Target) ->
- call(5659, <<Target:?GLenum>>).
+ call(5660, <<Target:?GLenum>>).
%% @doc
%% See {@link framebufferTexture/4}
-spec framebufferTexture1D(Target, Attachment, Textarget, Texture, Level) -> 'ok' when Target :: enum(),Attachment :: enum(),Textarget :: enum(),Texture :: integer(),Level :: integer().
framebufferTexture1D(Target,Attachment,Textarget,Texture,Level) ->
- cast(5660, <<Target:?GLenum,Attachment:?GLenum,Textarget:?GLenum,Texture:?GLuint,Level:?GLint>>).
+ cast(5661, <<Target:?GLenum,Attachment:?GLenum,Textarget:?GLenum,Texture:?GLuint,Level:?GLint>>).
%% @doc
%% See {@link framebufferTexture/4}
-spec framebufferTexture2D(Target, Attachment, Textarget, Texture, Level) -> 'ok' when Target :: enum(),Attachment :: enum(),Textarget :: enum(),Texture :: integer(),Level :: integer().
framebufferTexture2D(Target,Attachment,Textarget,Texture,Level) ->
- cast(5661, <<Target:?GLenum,Attachment:?GLenum,Textarget:?GLenum,Texture:?GLuint,Level:?GLint>>).
+ cast(5662, <<Target:?GLenum,Attachment:?GLenum,Textarget:?GLenum,Texture:?GLuint,Level:?GLint>>).
%% @doc
%% See {@link framebufferTexture/4}
-spec framebufferTexture3D(Target, Attachment, Textarget, Texture, Level, Zoffset) -> 'ok' when Target :: enum(),Attachment :: enum(),Textarget :: enum(),Texture :: integer(),Level :: integer(),Zoffset :: integer().
framebufferTexture3D(Target,Attachment,Textarget,Texture,Level,Zoffset) ->
- cast(5662, <<Target:?GLenum,Attachment:?GLenum,Textarget:?GLenum,Texture:?GLuint,Level:?GLint,Zoffset:?GLint>>).
+ cast(5663, <<Target:?GLenum,Attachment:?GLenum,Textarget:?GLenum,Texture:?GLuint,Level:?GLint,Zoffset:?GLint>>).
%% @doc Attach a renderbuffer as a logical buffer to the currently bound framebuffer object
%%
@@ -13637,7 +13704,7 @@ framebufferTexture3D(Target,Attachment,Textarget,Texture,Level,Zoffset) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glFramebufferRenderbuffer.xml">external</a> documentation.
-spec framebufferRenderbuffer(Target, Attachment, Renderbuffertarget, Renderbuffer) -> 'ok' when Target :: enum(),Attachment :: enum(),Renderbuffertarget :: enum(),Renderbuffer :: integer().
framebufferRenderbuffer(Target,Attachment,Renderbuffertarget,Renderbuffer) ->
- cast(5663, <<Target:?GLenum,Attachment:?GLenum,Renderbuffertarget:?GLenum,Renderbuffer:?GLuint>>).
+ cast(5664, <<Target:?GLenum,Attachment:?GLenum,Renderbuffertarget:?GLenum,Renderbuffer:?GLuint>>).
%% @doc Retrieve information about attachments of a bound framebuffer object
%%
@@ -13733,7 +13800,7 @@ framebufferRenderbuffer(Target,Attachment,Renderbuffertarget,Renderbuffer) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetFramebufferAttachmentParameter.xml">external</a> documentation.
-spec getFramebufferAttachmentParameteriv(Target, Attachment, Pname) -> integer() when Target :: enum(),Attachment :: enum(),Pname :: enum().
getFramebufferAttachmentParameteriv(Target,Attachment,Pname) ->
- call(5664, <<Target:?GLenum,Attachment:?GLenum,Pname:?GLenum>>).
+ call(5665, <<Target:?GLenum,Attachment:?GLenum,Pname:?GLenum>>).
%% @doc Generate mipmaps for a specified texture target
%%
@@ -13753,7 +13820,7 @@ getFramebufferAttachmentParameteriv(Target,Attachment,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenerateMipmap.xml">external</a> documentation.
-spec generateMipmap(Target) -> 'ok' when Target :: enum().
generateMipmap(Target) ->
- cast(5665, <<Target:?GLenum>>).
+ cast(5666, <<Target:?GLenum>>).
%% @doc Copy a block of pixels from the read framebuffer to the draw framebuffer
%%
@@ -13795,7 +13862,7 @@ generateMipmap(Target) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBlitFramebuffer.xml">external</a> documentation.
-spec blitFramebuffer(SrcX0, SrcY0, SrcX1, SrcY1, DstX0, DstY0, DstX1, DstY1, Mask, Filter) -> 'ok' when SrcX0 :: integer(),SrcY0 :: integer(),SrcX1 :: integer(),SrcY1 :: integer(),DstX0 :: integer(),DstY0 :: integer(),DstX1 :: integer(),DstY1 :: integer(),Mask :: integer(),Filter :: enum().
blitFramebuffer(SrcX0,SrcY0,SrcX1,SrcY1,DstX0,DstY0,DstX1,DstY1,Mask,Filter) ->
- cast(5666, <<SrcX0:?GLint,SrcY0:?GLint,SrcX1:?GLint,SrcY1:?GLint,DstX0:?GLint,DstY0:?GLint,DstX1:?GLint,DstY1:?GLint,Mask:?GLbitfield,Filter:?GLenum>>).
+ cast(5667, <<SrcX0:?GLint,SrcY0:?GLint,SrcX1:?GLint,SrcY1:?GLint,DstX0:?GLint,DstY0:?GLint,DstX1:?GLint,DstY1:?GLint,Mask:?GLbitfield,Filter:?GLenum>>).
%% @doc Establish data storage, format, dimensions and sample count of a renderbuffer object's image
%%
@@ -13819,19 +13886,19 @@ blitFramebuffer(SrcX0,SrcY0,SrcX1,SrcY1,DstX0,DstY0,DstX1,DstY1,Mask,Filter) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glRenderbufferStorageMultisample.xml">external</a> documentation.
-spec renderbufferStorageMultisample(Target, Samples, Internalformat, Width, Height) -> 'ok' when Target :: enum(),Samples :: integer(),Internalformat :: enum(),Width :: integer(),Height :: integer().
renderbufferStorageMultisample(Target,Samples,Internalformat,Width,Height) ->
- cast(5667, <<Target:?GLenum,Samples:?GLsizei,Internalformat:?GLenum,Width:?GLsizei,Height:?GLsizei>>).
+ cast(5668, <<Target:?GLenum,Samples:?GLsizei,Internalformat:?GLenum,Width:?GLsizei,Height:?GLsizei>>).
%% @doc
%% See {@link framebufferTexture/4}
-spec framebufferTextureLayer(Target, Attachment, Texture, Level, Layer) -> 'ok' when Target :: enum(),Attachment :: enum(),Texture :: integer(),Level :: integer(),Layer :: integer().
framebufferTextureLayer(Target,Attachment,Texture,Level,Layer) ->
- cast(5668, <<Target:?GLenum,Attachment:?GLenum,Texture:?GLuint,Level:?GLint,Layer:?GLint>>).
+ cast(5669, <<Target:?GLenum,Attachment:?GLenum,Texture:?GLuint,Level:?GLint,Layer:?GLint>>).
%% @doc
%% See {@link framebufferTexture/4}
-spec framebufferTextureFaceARB(Target, Attachment, Texture, Level, Face) -> 'ok' when Target :: enum(),Attachment :: enum(),Texture :: integer(),Level :: integer(),Face :: enum().
framebufferTextureFaceARB(Target,Attachment,Texture,Level,Face) ->
- cast(5669, <<Target:?GLenum,Attachment:?GLenum,Texture:?GLuint,Level:?GLint,Face:?GLenum>>).
+ cast(5670, <<Target:?GLenum,Attachment:?GLenum,Texture:?GLuint,Level:?GLint,Face:?GLenum>>).
%% @doc Indicate modifications to a range of a mapped buffer
%%
@@ -13845,7 +13912,7 @@ framebufferTextureFaceARB(Target,Attachment,Texture,Level,Face) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glFlushMappedBufferRange.xml">external</a> documentation.
-spec flushMappedBufferRange(Target, Offset, Length) -> 'ok' when Target :: enum(),Offset :: integer(),Length :: integer().
flushMappedBufferRange(Target,Offset,Length) ->
- cast(5670, <<Target:?GLenum,0:32,Offset:?GLintptr,Length:?GLsizeiptr>>).
+ cast(5671, <<Target:?GLenum,0:32,Offset:?GLintptr,Length:?GLsizeiptr>>).
%% @doc Bind a vertex array object
%%
@@ -13860,7 +13927,7 @@ flushMappedBufferRange(Target,Offset,Length) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindVertexArray.xml">external</a> documentation.
-spec bindVertexArray(Array) -> 'ok' when Array :: integer().
bindVertexArray(Array) ->
- cast(5671, <<Array:?GLuint>>).
+ cast(5672, <<Array:?GLuint>>).
%% @doc Delete vertex array objects
%%
@@ -13873,8 +13940,9 @@ bindVertexArray(Array) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteVertexArrays.xml">external</a> documentation.
-spec deleteVertexArrays(Arrays) -> 'ok' when Arrays :: [integer()].
deleteVertexArrays(Arrays) ->
- cast(5672, <<(length(Arrays)):?GLuint,
- (<< <<C:?GLuint>> || C <- Arrays>>)/binary,0:(((1+length(Arrays)) rem 2)*32)>>).
+ ArraysLen = length(Arrays),
+ cast(5673, <<ArraysLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Arrays>>)/binary,0:(((1+ArraysLen) rem 2)*32)>>).
%% @doc Generate vertex array object names
%%
@@ -13892,7 +13960,7 @@ deleteVertexArrays(Arrays) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenVertexArrays.xml">external</a> documentation.
-spec genVertexArrays(N) -> [integer()] when N :: integer().
genVertexArrays(N) ->
- call(5673, <<N:?GLsizei>>).
+ call(5674, <<N:?GLsizei>>).
%% @doc Determine if a name corresponds to a vertex array object
%%
@@ -13906,7 +13974,7 @@ genVertexArrays(N) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsVertexArray.xml">external</a> documentation.
-spec isVertexArray(Array) -> 0|1 when Array :: integer().
isVertexArray(Array) ->
- call(5674, <<Array:?GLuint>>).
+ call(5675, <<Array:?GLuint>>).
%% @doc Retrieve the index of a named uniform block
%%
@@ -13933,16 +14001,18 @@ isVertexArray(Array) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformIndices.xml">external</a> documentation.
-spec getUniformIndices(Program, UniformNames) -> [integer()] when Program :: integer(),UniformNames :: iolist().
getUniformIndices(Program,UniformNames) ->
- UniformNamesTemp = list_to_binary([[Str|[0]] || Str <- UniformNames ]),
- call(5675, <<Program:?GLuint,(length(UniformNames)):?GLuint,(size(UniformNamesTemp)):?GLuint,(UniformNamesTemp)/binary,0:((8-((size(UniformNamesTemp)+0) rem 8)) rem 8)>>).
+ UniformNamesTemp = list_to_binary([[Str|[0]] || Str <- UniformNames ]),
+ UniformNamesLen = length(UniformNames),
+ call(5676, <<Program:?GLuint,UniformNamesLen:?GLuint,(size(UniformNamesTemp)):?GLuint,(UniformNamesTemp)/binary,0:((8-((size(UniformNamesTemp)+0) rem 8)) rem 8)>>).
%% @doc glGetActiveUniforms
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveUniforms.xml">external</a> documentation.
-spec getActiveUniformsiv(Program, UniformIndices, Pname) -> [integer()] when Program :: integer(),UniformIndices :: [integer()],Pname :: enum().
getActiveUniformsiv(Program,UniformIndices,Pname) ->
- call(5676, <<Program:?GLuint,(length(UniformIndices)):?GLuint,
- (<< <<C:?GLuint>> || C <- UniformIndices>>)/binary,0:(((length(UniformIndices)) rem 2)*32),Pname:?GLenum>>).
+ UniformIndicesLen = length(UniformIndices),
+ call(5677, <<Program:?GLuint,UniformIndicesLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- UniformIndices>>)/binary,0:(((UniformIndicesLen) rem 2)*32),Pname:?GLenum>>).
%% @doc Query the name of an active uniform
%%
@@ -13971,7 +14041,7 @@ getActiveUniformsiv(Program,UniformIndices,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveUniformName.xml">external</a> documentation.
-spec getActiveUniformName(Program, UniformIndex, BufSize) -> string() when Program :: integer(),UniformIndex :: integer(),BufSize :: integer().
getActiveUniformName(Program,UniformIndex,BufSize) ->
- call(5677, <<Program:?GLuint,UniformIndex:?GLuint,BufSize:?GLsizei>>).
+ call(5678, <<Program:?GLuint,UniformIndex:?GLuint,BufSize:?GLsizei>>).
%% @doc Retrieve the index of a named uniform block
%%
@@ -13995,7 +14065,8 @@ getActiveUniformName(Program,UniformIndex,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformBlockIndex.xml">external</a> documentation.
-spec getUniformBlockIndex(Program, UniformBlockName) -> integer() when Program :: integer(),UniformBlockName :: string().
getUniformBlockIndex(Program,UniformBlockName) ->
- call(5678, <<Program:?GLuint,(list_to_binary([UniformBlockName|[0]]))/binary,0:((8-((length(UniformBlockName)+ 5) rem 8)) rem 8)>>).
+ UniformBlockNameLen = length(UniformBlockName),
+ call(5679, <<Program:?GLuint,(list_to_binary([UniformBlockName|[0]]))/binary,0:((8-((UniformBlockNameLen+ 5) rem 8)) rem 8)>>).
%% @doc Query information about an active uniform block
%%
@@ -14048,7 +14119,7 @@ getUniformBlockIndex(Program,UniformBlockName) ->
-spec getActiveUniformBlockiv(Program, UniformBlockIndex, Pname, Params) -> 'ok' when Program :: integer(),UniformBlockIndex :: integer(),Pname :: enum(),Params :: mem().
getActiveUniformBlockiv(Program,UniformBlockIndex,Pname,Params) ->
send_bin(Params),
- call(5679, <<Program:?GLuint,UniformBlockIndex:?GLuint,Pname:?GLenum>>).
+ call(5680, <<Program:?GLuint,UniformBlockIndex:?GLuint,Pname:?GLenum>>).
%% @doc Retrieve the name of an active uniform block
%%
@@ -14077,7 +14148,7 @@ getActiveUniformBlockiv(Program,UniformBlockIndex,Pname,Params) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveUniformBlockName.xml">external</a> documentation.
-spec getActiveUniformBlockName(Program, UniformBlockIndex, BufSize) -> string() when Program :: integer(),UniformBlockIndex :: integer(),BufSize :: integer().
getActiveUniformBlockName(Program,UniformBlockIndex,BufSize) ->
- call(5680, <<Program:?GLuint,UniformBlockIndex:?GLuint,BufSize:?GLsizei>>).
+ call(5681, <<Program:?GLuint,UniformBlockIndex:?GLuint,BufSize:?GLsizei>>).
%% @doc Assign a binding point to an active uniform block
%%
@@ -14097,7 +14168,7 @@ getActiveUniformBlockName(Program,UniformBlockIndex,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glUniformBlockBinding.xml">external</a> documentation.
-spec uniformBlockBinding(Program, UniformBlockIndex, UniformBlockBinding) -> 'ok' when Program :: integer(),UniformBlockIndex :: integer(),UniformBlockBinding :: integer().
uniformBlockBinding(Program,UniformBlockIndex,UniformBlockBinding) ->
- cast(5681, <<Program:?GLuint,UniformBlockIndex:?GLuint,UniformBlockBinding:?GLuint>>).
+ cast(5682, <<Program:?GLuint,UniformBlockIndex:?GLuint,UniformBlockBinding:?GLuint>>).
%% @doc Copy part of the data store of a buffer object to the data store of another buffer object
%%
@@ -14123,7 +14194,7 @@ uniformBlockBinding(Program,UniformBlockIndex,UniformBlockBinding) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCopyBufferSubData.xml">external</a> documentation.
-spec copyBufferSubData(ReadTarget, WriteTarget, ReadOffset, WriteOffset, Size) -> 'ok' when ReadTarget :: enum(),WriteTarget :: enum(),ReadOffset :: integer(),WriteOffset :: integer(),Size :: integer().
copyBufferSubData(ReadTarget,WriteTarget,ReadOffset,WriteOffset,Size) ->
- cast(5682, <<ReadTarget:?GLenum,WriteTarget:?GLenum,ReadOffset:?GLintptr,WriteOffset:?GLintptr,Size:?GLsizeiptr>>).
+ cast(5683, <<ReadTarget:?GLenum,WriteTarget:?GLenum,ReadOffset:?GLintptr,WriteOffset:?GLintptr,Size:?GLsizeiptr>>).
%% @doc Render primitives from array data with a per-element offset
%%
@@ -14137,10 +14208,10 @@ copyBufferSubData(ReadTarget,WriteTarget,ReadOffset,WriteOffset,Size) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawElementsBaseVertex.xml">external</a> documentation.
-spec drawElementsBaseVertex(Mode, Count, Type, Indices, Basevertex) -> 'ok' when Mode :: enum(),Count :: integer(),Type :: enum(),Indices :: offset()|mem(),Basevertex :: integer().
drawElementsBaseVertex(Mode,Count,Type,Indices,Basevertex) when is_integer(Indices) ->
- cast(5683, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Basevertex:?GLint>>);
+ cast(5684, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Basevertex:?GLint>>);
drawElementsBaseVertex(Mode,Count,Type,Indices,Basevertex) ->
send_bin(Indices),
- cast(5684, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Basevertex:?GLint>>).
+ cast(5685, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Basevertex:?GLint>>).
%% @doc Render primitives from array data with a per-element offset
%%
@@ -14159,10 +14230,10 @@ drawElementsBaseVertex(Mode,Count,Type,Indices,Basevertex) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawRangeElementsBaseVertex.xml">external</a> documentation.
-spec drawRangeElementsBaseVertex(Mode, Start, End, Count, Type, Indices, Basevertex) -> 'ok' when Mode :: enum(),Start :: integer(),End :: integer(),Count :: integer(),Type :: enum(),Indices :: offset()|mem(),Basevertex :: integer().
drawRangeElementsBaseVertex(Mode,Start,End,Count,Type,Indices,Basevertex) when is_integer(Indices) ->
- cast(5685, <<Mode:?GLenum,Start:?GLuint,End:?GLuint,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Basevertex:?GLint>>);
+ cast(5686, <<Mode:?GLenum,Start:?GLuint,End:?GLuint,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Basevertex:?GLint>>);
drawRangeElementsBaseVertex(Mode,Start,End,Count,Type,Indices,Basevertex) ->
send_bin(Indices),
- cast(5686, <<Mode:?GLenum,Start:?GLuint,End:?GLuint,Count:?GLsizei,Type:?GLenum,Basevertex:?GLint>>).
+ cast(5687, <<Mode:?GLenum,Start:?GLuint,End:?GLuint,Count:?GLsizei,Type:?GLenum,Basevertex:?GLint>>).
%% @doc Render multiple instances of a set of primitives from array data with a per-element offset
%%
@@ -14176,10 +14247,10 @@ drawRangeElementsBaseVertex(Mode,Start,End,Count,Type,Indices,Basevertex) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawElementsInstancedBaseVertex.xml">external</a> documentation.
-spec drawElementsInstancedBaseVertex(Mode, Count, Type, Indices, Primcount, Basevertex) -> 'ok' when Mode :: enum(),Count :: integer(),Type :: enum(),Indices :: offset()|mem(),Primcount :: integer(),Basevertex :: integer().
drawElementsInstancedBaseVertex(Mode,Count,Type,Indices,Primcount,Basevertex) when is_integer(Indices) ->
- cast(5687, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Primcount:?GLsizei,Basevertex:?GLint>>);
+ cast(5688, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Primcount:?GLsizei,Basevertex:?GLint>>);
drawElementsInstancedBaseVertex(Mode,Count,Type,Indices,Primcount,Basevertex) ->
send_bin(Indices),
- cast(5688, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Primcount:?GLsizei,Basevertex:?GLint>>).
+ cast(5689, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Primcount:?GLsizei,Basevertex:?GLint>>).
%% @doc Specifiy the vertex to be used as the source of data for flat shaded varyings
%%
@@ -14213,7 +14284,7 @@ drawElementsInstancedBaseVertex(Mode,Count,Type,Indices,Primcount,Basevertex) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProvokingVertex.xml">external</a> documentation.
-spec provokingVertex(Mode) -> 'ok' when Mode :: enum().
provokingVertex(Mode) ->
- cast(5689, <<Mode:?GLenum>>).
+ cast(5690, <<Mode:?GLenum>>).
%% @doc Create a new sync object and insert it into the GL command stream
%%
@@ -14237,7 +14308,7 @@ provokingVertex(Mode) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glFenceSync.xml">external</a> documentation.
-spec fenceSync(Condition, Flags) -> integer() when Condition :: enum(),Flags :: integer().
fenceSync(Condition,Flags) ->
- call(5690, <<Condition:?GLenum,Flags:?GLbitfield>>).
+ call(5691, <<Condition:?GLenum,Flags:?GLbitfield>>).
%% @doc Determine if a name corresponds to a sync object
%%
@@ -14248,7 +14319,7 @@ fenceSync(Condition,Flags) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsSync.xml">external</a> documentation.
-spec isSync(Sync) -> 0|1 when Sync :: integer().
isSync(Sync) ->
- call(5691, <<Sync:?GLsync>>).
+ call(5692, <<Sync:?GLsync>>).
%% @doc Delete a sync object
%%
@@ -14265,7 +14336,7 @@ isSync(Sync) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteSync.xml">external</a> documentation.
-spec deleteSync(Sync) -> 'ok' when Sync :: integer().
deleteSync(Sync) ->
- cast(5692, <<Sync:?GLsync>>).
+ cast(5693, <<Sync:?GLsync>>).
%% @doc Block and wait for a sync object to become signaled
%%
@@ -14291,7 +14362,7 @@ deleteSync(Sync) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glClientWaitSync.xml">external</a> documentation.
-spec clientWaitSync(Sync, Flags, Timeout) -> enum() when Sync :: integer(),Flags :: integer(),Timeout :: integer().
clientWaitSync(Sync,Flags,Timeout) ->
- call(5693, <<Sync:?GLsync,Flags:?GLbitfield,0:32,Timeout:?GLuint64>>).
+ call(5694, <<Sync:?GLsync,Flags:?GLbitfield,0:32,Timeout:?GLuint64>>).
%% @doc Instruct the GL server to block until the specified sync object becomes signaled
%%
@@ -14313,13 +14384,13 @@ clientWaitSync(Sync,Flags,Timeout) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glWaitSync.xml">external</a> documentation.
-spec waitSync(Sync, Flags, Timeout) -> 'ok' when Sync :: integer(),Flags :: integer(),Timeout :: integer().
waitSync(Sync,Flags,Timeout) ->
- cast(5694, <<Sync:?GLsync,Flags:?GLbitfield,0:32,Timeout:?GLuint64>>).
+ cast(5695, <<Sync:?GLsync,Flags:?GLbitfield,0:32,Timeout:?GLuint64>>).
%% @doc
%% See {@link getBooleanv/1}
-spec getInteger64v(Pname) -> [integer()] when Pname :: enum().
getInteger64v(Pname) ->
- call(5695, <<Pname:?GLenum>>).
+ call(5696, <<Pname:?GLenum>>).
%% @doc Query the properties of a sync object
%%
@@ -14354,7 +14425,7 @@ getInteger64v(Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetSync.xml">external</a> documentation.
-spec getSynciv(Sync, Pname, BufSize) -> [integer()] when Sync :: integer(),Pname :: enum(),BufSize :: integer().
getSynciv(Sync,Pname,BufSize) ->
- call(5696, <<Sync:?GLsync,Pname:?GLenum,BufSize:?GLsizei>>).
+ call(5697, <<Sync:?GLsync,Pname:?GLenum,BufSize:?GLsizei>>).
%% @doc Establish the data storage, format, dimensions, and number of samples of a multisample texture's image
%%
@@ -14382,7 +14453,7 @@ getSynciv(Sync,Pname,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2DMultisample.xml">external</a> documentation.
-spec texImage2DMultisample(Target, Samples, Internalformat, Width, Height, Fixedsamplelocations) -> 'ok' when Target :: enum(),Samples :: integer(),Internalformat :: integer(),Width :: integer(),Height :: integer(),Fixedsamplelocations :: 0|1.
texImage2DMultisample(Target,Samples,Internalformat,Width,Height,Fixedsamplelocations) ->
- cast(5697, <<Target:?GLenum,Samples:?GLsizei,Internalformat:?GLint,Width:?GLsizei,Height:?GLsizei,Fixedsamplelocations:?GLboolean>>).
+ cast(5698, <<Target:?GLenum,Samples:?GLsizei,Internalformat:?GLint,Width:?GLsizei,Height:?GLsizei,Fixedsamplelocations:?GLboolean>>).
%% @doc Establish the data storage, format, dimensions, and number of samples of a multisample texture's image
%%
@@ -14410,7 +14481,7 @@ texImage2DMultisample(Target,Samples,Internalformat,Width,Height,Fixedsampleloca
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glTexImage3DMultisample.xml">external</a> documentation.
-spec texImage3DMultisample(Target, Samples, Internalformat, Width, Height, Depth, Fixedsamplelocations) -> 'ok' when Target :: enum(),Samples :: integer(),Internalformat :: integer(),Width :: integer(),Height :: integer(),Depth :: integer(),Fixedsamplelocations :: 0|1.
texImage3DMultisample(Target,Samples,Internalformat,Width,Height,Depth,Fixedsamplelocations) ->
- cast(5698, <<Target:?GLenum,Samples:?GLsizei,Internalformat:?GLint,Width:?GLsizei,Height:?GLsizei,Depth:?GLsizei,Fixedsamplelocations:?GLboolean>>).
+ cast(5699, <<Target:?GLenum,Samples:?GLsizei,Internalformat:?GLint,Width:?GLsizei,Height:?GLsizei,Depth:?GLsizei,Fixedsamplelocations:?GLboolean>>).
%% @doc Retrieve the location of a sample
%%
@@ -14428,7 +14499,7 @@ texImage3DMultisample(Target,Samples,Internalformat,Width,Height,Depth,Fixedsamp
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetMultisample.xml">external</a> documentation.
-spec getMultisamplefv(Pname, Index) -> {float(),float()} when Pname :: enum(),Index :: integer().
getMultisamplefv(Pname,Index) ->
- call(5699, <<Pname:?GLenum,Index:?GLuint>>).
+ call(5700, <<Pname:?GLenum,Index:?GLuint>>).
%% @doc Set the value of a sub-word of the sample mask
%%
@@ -14443,57 +14514,65 @@ getMultisamplefv(Pname,Index) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glSampleMaski.xml">external</a> documentation.
-spec sampleMaski(Index, Mask) -> 'ok' when Index :: integer(),Mask :: integer().
sampleMaski(Index,Mask) ->
- cast(5700, <<Index:?GLuint,Mask:?GLbitfield>>).
+ cast(5701, <<Index:?GLuint,Mask:?GLbitfield>>).
%% @doc glNamedStringARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glNamedStringARB.xml">external</a> documentation.
-spec namedStringARB(Type, Name, String) -> 'ok' when Type :: enum(),Name :: string(),String :: string().
namedStringARB(Type,Name,String) ->
- cast(5701, <<Type:?GLenum,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 5) rem 8)) rem 8),(list_to_binary([String|[0]]))/binary,0:((8-((length(String)+ 1) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ StringLen = length(String),
+ cast(5702, <<Type:?GLenum,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 5) rem 8)) rem 8),(list_to_binary([String|[0]]))/binary,0:((8-((StringLen+ 1) rem 8)) rem 8)>>).
%% @doc glDeleteNamedStringARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteNamedStringARB.xml">external</a> documentation.
-spec deleteNamedStringARB(Name) -> 'ok' when Name :: string().
deleteNamedStringARB(Name) ->
- cast(5702, <<(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ cast(5703, <<(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8)>>).
%% @doc glCompileShaderIncludeARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCompileShaderIncludeARB.xml">external</a> documentation.
-spec compileShaderIncludeARB(Shader, Path) -> 'ok' when Shader :: integer(),Path :: iolist().
compileShaderIncludeARB(Shader,Path) ->
- PathTemp = list_to_binary([[Str|[0]] || Str <- Path ]),
- cast(5703, <<Shader:?GLuint,(length(Path)):?GLuint,(size(PathTemp)):?GLuint,(PathTemp)/binary,0:((8-((size(PathTemp)+0) rem 8)) rem 8)>>).
+ PathTemp = list_to_binary([[Str|[0]] || Str <- Path ]),
+ PathLen = length(Path),
+ cast(5704, <<Shader:?GLuint,PathLen:?GLuint,(size(PathTemp)):?GLuint,(PathTemp)/binary,0:((8-((size(PathTemp)+0) rem 8)) rem 8)>>).
%% @doc glIsNamedStringARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsNamedStringARB.xml">external</a> documentation.
-spec isNamedStringARB(Name) -> 0|1 when Name :: string().
isNamedStringARB(Name) ->
- call(5704, <<(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ call(5705, <<(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8)>>).
%% @doc glGetNamedStringARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetNamedStringARB.xml">external</a> documentation.
-spec getNamedStringARB(Name, BufSize) -> string() when Name :: string(),BufSize :: integer().
getNamedStringARB(Name,BufSize) ->
- call(5705, <<(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8),BufSize:?GLsizei>>).
+ NameLen = length(Name),
+ call(5706, <<(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8),BufSize:?GLsizei>>).
%% @doc glGetNamedStringARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetNamedStringARB.xml">external</a> documentation.
-spec getNamedStringivARB(Name, Pname) -> integer() when Name :: string(),Pname :: enum().
getNamedStringivARB(Name,Pname) ->
- call(5706, <<(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8),Pname:?GLenum>>).
+ NameLen = length(Name),
+ call(5707, <<(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8),Pname:?GLenum>>).
%% @doc glBindFragDataLocationIndexe
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindFragDataLocationIndexe.xml">external</a> documentation.
-spec bindFragDataLocationIndexed(Program, ColorNumber, Index, Name) -> 'ok' when Program :: integer(),ColorNumber :: integer(),Index :: integer(),Name :: string().
bindFragDataLocationIndexed(Program,ColorNumber,Index,Name) ->
- cast(5707, <<Program:?GLuint,ColorNumber:?GLuint,Index:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 5) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ cast(5708, <<Program:?GLuint,ColorNumber:?GLuint,Index:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 5) rem 8)) rem 8)>>).
%% @doc Query the bindings of color indices to user-defined varying out variables
%%
@@ -14504,7 +14583,8 @@ bindFragDataLocationIndexed(Program,ColorNumber,Index,Name) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetFragDataIndex.xml">external</a> documentation.
-spec getFragDataIndex(Program, Name) -> integer() when Program :: integer(),Name :: string().
getFragDataIndex(Program,Name) ->
- call(5708, <<Program:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 5) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ call(5709, <<Program:?GLuint,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 5) rem 8)) rem 8)>>).
%% @doc Generate sampler object names
%%
@@ -14522,7 +14602,7 @@ getFragDataIndex(Program,Name) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenSamplers.xml">external</a> documentation.
-spec genSamplers(Count) -> [integer()] when Count :: integer().
genSamplers(Count) ->
- call(5709, <<Count:?GLsizei>>).
+ call(5710, <<Count:?GLsizei>>).
%% @doc Delete named sampler objects
%%
@@ -14535,8 +14615,9 @@ genSamplers(Count) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteSamplers.xml">external</a> documentation.
-spec deleteSamplers(Samplers) -> 'ok' when Samplers :: [integer()].
deleteSamplers(Samplers) ->
- cast(5710, <<(length(Samplers)):?GLuint,
- (<< <<C:?GLuint>> || C <- Samplers>>)/binary,0:(((1+length(Samplers)) rem 2)*32)>>).
+ SamplersLen = length(Samplers),
+ cast(5711, <<SamplersLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Samplers>>)/binary,0:(((1+SamplersLen) rem 2)*32)>>).
%% @doc Determine if a name corresponds to a sampler object
%%
@@ -14549,7 +14630,7 @@ deleteSamplers(Samplers) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsSampler.xml">external</a> documentation.
-spec isSampler(Sampler) -> 0|1 when Sampler :: integer().
isSampler(Sampler) ->
- call(5711, <<Sampler:?GLuint>>).
+ call(5712, <<Sampler:?GLuint>>).
%% @doc Bind a named sampler to a texturing target
%%
@@ -14566,7 +14647,7 @@ isSampler(Sampler) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindSampler.xml">external</a> documentation.
-spec bindSampler(Unit, Sampler) -> 'ok' when Unit :: integer(),Sampler :: integer().
bindSampler(Unit,Sampler) ->
- cast(5712, <<Unit:?GLuint,Sampler:?GLuint>>).
+ cast(5713, <<Unit:?GLuint,Sampler:?GLuint>>).
%% @doc Set sampler parameters
%%
@@ -14712,42 +14793,46 @@ bindSampler(Unit,Sampler) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glSamplerParameter.xml">external</a> documentation.
-spec samplerParameteri(Sampler, Pname, Param) -> 'ok' when Sampler :: integer(),Pname :: enum(),Param :: integer().
samplerParameteri(Sampler,Pname,Param) ->
- cast(5713, <<Sampler:?GLuint,Pname:?GLenum,Param:?GLint>>).
+ cast(5714, <<Sampler:?GLuint,Pname:?GLenum,Param:?GLint>>).
%% @doc
%% See {@link samplerParameteri/3}
-spec samplerParameteriv(Sampler, Pname, Param) -> 'ok' when Sampler :: integer(),Pname :: enum(),Param :: [integer()].
samplerParameteriv(Sampler,Pname,Param) ->
- cast(5714, <<Sampler:?GLuint,Pname:?GLenum,(length(Param)):?GLuint,
- (<< <<C:?GLint>> || C <- Param>>)/binary,0:(((1+length(Param)) rem 2)*32)>>).
+ ParamLen = length(Param),
+ cast(5715, <<Sampler:?GLuint,Pname:?GLenum,ParamLen:?GLuint,
+ (<< <<C:?GLint>> || C <- Param>>)/binary,0:(((1+ParamLen) rem 2)*32)>>).
%% @doc
%% See {@link samplerParameteri/3}
-spec samplerParameterf(Sampler, Pname, Param) -> 'ok' when Sampler :: integer(),Pname :: enum(),Param :: float().
samplerParameterf(Sampler,Pname,Param) ->
- cast(5715, <<Sampler:?GLuint,Pname:?GLenum,Param:?GLfloat>>).
+ cast(5716, <<Sampler:?GLuint,Pname:?GLenum,Param:?GLfloat>>).
%% @doc
%% See {@link samplerParameteri/3}
-spec samplerParameterfv(Sampler, Pname, Param) -> 'ok' when Sampler :: integer(),Pname :: enum(),Param :: [float()].
samplerParameterfv(Sampler,Pname,Param) ->
- cast(5716, <<Sampler:?GLuint,Pname:?GLenum,(length(Param)):?GLuint,
- (<< <<C:?GLfloat>> || C <- Param>>)/binary,0:(((1+length(Param)) rem 2)*32)>>).
+ ParamLen = length(Param),
+ cast(5717, <<Sampler:?GLuint,Pname:?GLenum,ParamLen:?GLuint,
+ (<< <<C:?GLfloat>> || C <- Param>>)/binary,0:(((1+ParamLen) rem 2)*32)>>).
%% @doc
%% See {@link samplerParameteri/3}
-spec samplerParameterIiv(Sampler, Pname, Param) -> 'ok' when Sampler :: integer(),Pname :: enum(),Param :: [integer()].
samplerParameterIiv(Sampler,Pname,Param) ->
- cast(5717, <<Sampler:?GLuint,Pname:?GLenum,(length(Param)):?GLuint,
- (<< <<C:?GLint>> || C <- Param>>)/binary,0:(((1+length(Param)) rem 2)*32)>>).
+ ParamLen = length(Param),
+ cast(5718, <<Sampler:?GLuint,Pname:?GLenum,ParamLen:?GLuint,
+ (<< <<C:?GLint>> || C <- Param>>)/binary,0:(((1+ParamLen) rem 2)*32)>>).
%% @doc glSamplerParameterI
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glSamplerParameterI.xml">external</a> documentation.
-spec samplerParameterIuiv(Sampler, Pname, Param) -> 'ok' when Sampler :: integer(),Pname :: enum(),Param :: [integer()].
samplerParameterIuiv(Sampler,Pname,Param) ->
- cast(5718, <<Sampler:?GLuint,Pname:?GLenum,(length(Param)):?GLuint,
- (<< <<C:?GLuint>> || C <- Param>>)/binary,0:(((1+length(Param)) rem 2)*32)>>).
+ ParamLen = length(Param),
+ cast(5719, <<Sampler:?GLuint,Pname:?GLenum,ParamLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Param>>)/binary,0:(((1+ParamLen) rem 2)*32)>>).
%% @doc Return sampler parameter values
%%
@@ -14794,26 +14879,26 @@ samplerParameterIuiv(Sampler,Pname,Param) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetSamplerParameter.xml">external</a> documentation.
-spec getSamplerParameteriv(Sampler, Pname) -> [integer()] when Sampler :: integer(),Pname :: enum().
getSamplerParameteriv(Sampler,Pname) ->
- call(5719, <<Sampler:?GLuint,Pname:?GLenum>>).
+ call(5720, <<Sampler:?GLuint,Pname:?GLenum>>).
%% @doc
%% See {@link getSamplerParameteriv/2}
-spec getSamplerParameterIiv(Sampler, Pname) -> [integer()] when Sampler :: integer(),Pname :: enum().
getSamplerParameterIiv(Sampler,Pname) ->
- call(5720, <<Sampler:?GLuint,Pname:?GLenum>>).
+ call(5721, <<Sampler:?GLuint,Pname:?GLenum>>).
%% @doc
%% See {@link getSamplerParameteriv/2}
-spec getSamplerParameterfv(Sampler, Pname) -> [float()] when Sampler :: integer(),Pname :: enum().
getSamplerParameterfv(Sampler,Pname) ->
- call(5721, <<Sampler:?GLuint,Pname:?GLenum>>).
+ call(5722, <<Sampler:?GLuint,Pname:?GLenum>>).
%% @doc glGetSamplerParameterI
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetSamplerParameterI.xml">external</a> documentation.
-spec getSamplerParameterIuiv(Sampler, Pname) -> [integer()] when Sampler :: integer(),Pname :: enum().
getSamplerParameterIuiv(Sampler,Pname) ->
- call(5722, <<Sampler:?GLuint,Pname:?GLenum>>).
+ call(5723, <<Sampler:?GLuint,Pname:?GLenum>>).
%% @doc Record the GL time into a query object after all previous commands have reached the GL server but have not yet necessarily executed.
%%
@@ -14828,21 +14913,21 @@ getSamplerParameterIuiv(Sampler,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glQueryCounter.xml">external</a> documentation.
-spec queryCounter(Id, Target) -> 'ok' when Id :: integer(),Target :: enum().
queryCounter(Id,Target) ->
- cast(5723, <<Id:?GLuint,Target:?GLenum>>).
+ cast(5724, <<Id:?GLuint,Target:?GLenum>>).
%% @doc glGetQueryObjecti64v
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetQueryObjecti64v.xml">external</a> documentation.
-spec getQueryObjecti64v(Id, Pname) -> integer() when Id :: integer(),Pname :: enum().
getQueryObjecti64v(Id,Pname) ->
- call(5724, <<Id:?GLuint,Pname:?GLenum>>).
+ call(5725, <<Id:?GLuint,Pname:?GLenum>>).
%% @doc glGetQueryObjectui64v
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetQueryObjectui64v.xml">external</a> documentation.
-spec getQueryObjectui64v(Id, Pname) -> integer() when Id :: integer(),Pname :: enum().
getQueryObjectui64v(Id,Pname) ->
- call(5725, <<Id:?GLuint,Pname:?GLenum>>).
+ call(5726, <<Id:?GLuint,Pname:?GLenum>>).
%% @doc Render primitives from array data, taking parameters from memory
%%
@@ -14872,10 +14957,10 @@ getQueryObjectui64v(Id,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawArraysIndirect.xml">external</a> documentation.
-spec drawArraysIndirect(Mode, Indirect) -> 'ok' when Mode :: enum(),Indirect :: offset()|mem().
drawArraysIndirect(Mode,Indirect) when is_integer(Indirect) ->
- cast(5726, <<Mode:?GLenum,Indirect:?GLuint>>);
+ cast(5727, <<Mode:?GLenum,Indirect:?GLuint>>);
drawArraysIndirect(Mode,Indirect) ->
send_bin(Indirect),
- cast(5727, <<Mode:?GLenum>>).
+ cast(5728, <<Mode:?GLenum>>).
%% @doc Render indexed primitives from array data, taking parameters from memory
%%
@@ -14912,131 +14997,144 @@ drawArraysIndirect(Mode,Indirect) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawElementsIndirect.xml">external</a> documentation.
-spec drawElementsIndirect(Mode, Type, Indirect) -> 'ok' when Mode :: enum(),Type :: enum(),Indirect :: offset()|mem().
drawElementsIndirect(Mode,Type,Indirect) when is_integer(Indirect) ->
- cast(5728, <<Mode:?GLenum,Type:?GLenum,Indirect:?GLuint>>);
+ cast(5729, <<Mode:?GLenum,Type:?GLenum,Indirect:?GLuint>>);
drawElementsIndirect(Mode,Type,Indirect) ->
send_bin(Indirect),
- cast(5729, <<Mode:?GLenum,Type:?GLenum>>).
+ cast(5730, <<Mode:?GLenum,Type:?GLenum>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform1d(Location, X) -> 'ok' when Location :: integer(),X :: float().
uniform1d(Location,X) ->
- cast(5730, <<Location:?GLint,0:32,X:?GLdouble>>).
+ cast(5731, <<Location:?GLint,0:32,X:?GLdouble>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform2d(Location, X, Y) -> 'ok' when Location :: integer(),X :: float(),Y :: float().
uniform2d(Location,X,Y) ->
- cast(5731, <<Location:?GLint,0:32,X:?GLdouble,Y:?GLdouble>>).
+ cast(5732, <<Location:?GLint,0:32,X:?GLdouble,Y:?GLdouble>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform3d(Location, X, Y, Z) -> 'ok' when Location :: integer(),X :: float(),Y :: float(),Z :: float().
uniform3d(Location,X,Y,Z) ->
- cast(5732, <<Location:?GLint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble>>).
+ cast(5733, <<Location:?GLint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform4d(Location, X, Y, Z, W) -> 'ok' when Location :: integer(),X :: float(),Y :: float(),Z :: float(),W :: float().
uniform4d(Location,X,Y,Z,W) ->
- cast(5733, <<Location:?GLint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
+ cast(5734, <<Location:?GLint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform1dv(Location, Value) -> 'ok' when Location :: integer(),Value :: [float()].
uniform1dv(Location,Value) ->
- cast(5734, <<Location:?GLint,0:32,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5735, <<Location:?GLint,0:32,ValueLen:?GLuint,0:32,
(<< <<C:?GLdouble>> || C <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform2dv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{float(),float()}].
uniform2dv(Location,Value) ->
- cast(5735, <<Location:?GLint,0:32,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5736, <<Location:?GLint,0:32,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble>> || {V1,V2} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform3dv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{float(),float(),float()}].
uniform3dv(Location,Value) ->
- cast(5736, <<Location:?GLint,0:32,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5737, <<Location:?GLint,0:32,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble>> || {V1,V2,V3} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniform4dv(Location, Value) -> 'ok' when Location :: integer(),Value :: [{float(),float(),float(),float()}].
uniform4dv(Location,Value) ->
- cast(5737, <<Location:?GLint,0:32,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5738, <<Location:?GLint,0:32,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix2dv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float()}].
uniformMatrix2dv(Location,Transpose,Value) ->
- cast(5738, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5739, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix3dv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix3dv(Location,Transpose,Value) ->
- cast(5739, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5740, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble,V9:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix4dv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix4dv(Location,Transpose,Value) ->
- cast(5740, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5741, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble,V9:?GLdouble,V10:?GLdouble,V11:?GLdouble,V12:?GLdouble,V13:?GLdouble,V14:?GLdouble,V15:?GLdouble,V16:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix2x3dv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float()}].
uniformMatrix2x3dv(Location,Transpose,Value) ->
- cast(5741, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5742, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble>> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix2x4dv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix2x4dv(Location,Transpose,Value) ->
- cast(5742, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5743, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix3x2dv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float()}].
uniformMatrix3x2dv(Location,Transpose,Value) ->
- cast(5743, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5744, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble>> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix3x4dv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix3x4dv(Location,Transpose,Value) ->
- cast(5744, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5745, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble,V9:?GLdouble,V10:?GLdouble,V11:?GLdouble,V12:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix4x2dv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix4x2dv(Location,Transpose,Value) ->
- cast(5745, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5746, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>).
%% @doc
%% See {@link uniform1f/2}
-spec uniformMatrix4x3dv(Location, Transpose, Value) -> 'ok' when Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
uniformMatrix4x3dv(Location,Transpose,Value) ->
- cast(5746, <<Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5747, <<Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble,V9:?GLdouble,V10:?GLdouble,V11:?GLdouble,V12:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>).
%% @doc
%% See {@link getUniformfv/2}
-spec getUniformdv(Program, Location) -> matrix() when Program :: integer(),Location :: integer().
getUniformdv(Program,Location) ->
- call(5747, <<Program:?GLuint,Location:?GLint>>).
+ call(5748, <<Program:?GLuint,Location:?GLint>>).
%% @doc Retrieve the location of a subroutine uniform of a given shader stage within a program
%%
@@ -15055,7 +15153,8 @@ getUniformdv(Program,Location) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetSubroutineUniformLocation.xml">external</a> documentation.
-spec getSubroutineUniformLocation(Program, Shadertype, Name) -> integer() when Program :: integer(),Shadertype :: enum(),Name :: string().
getSubroutineUniformLocation(Program,Shadertype,Name) ->
- call(5748, <<Program:?GLuint,Shadertype:?GLenum,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ call(5749, <<Program:?GLuint,Shadertype:?GLenum,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8)>>).
%% @doc Retrieve the index of a subroutine uniform of a given shader stage within a program
%%
@@ -15075,7 +15174,8 @@ getSubroutineUniformLocation(Program,Shadertype,Name) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetSubroutineIndex.xml">external</a> documentation.
-spec getSubroutineIndex(Program, Shadertype, Name) -> integer() when Program :: integer(),Shadertype :: enum(),Name :: string().
getSubroutineIndex(Program,Shadertype,Name) ->
- call(5749, <<Program:?GLuint,Shadertype:?GLenum,(list_to_binary([Name|[0]]))/binary,0:((8-((length(Name)+ 1) rem 8)) rem 8)>>).
+ NameLen = length(Name),
+ call(5750, <<Program:?GLuint,Shadertype:?GLenum,(list_to_binary([Name|[0]]))/binary,0:((8-((NameLen+ 1) rem 8)) rem 8)>>).
%% @doc Query the name of an active shader subroutine uniform
%%
@@ -15096,7 +15196,7 @@ getSubroutineIndex(Program,Shadertype,Name) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveSubroutineUniformName.xml">external</a> documentation.
-spec getActiveSubroutineUniformName(Program, Shadertype, Index, Bufsize) -> string() when Program :: integer(),Shadertype :: enum(),Index :: integer(),Bufsize :: integer().
getActiveSubroutineUniformName(Program,Shadertype,Index,Bufsize) ->
- call(5750, <<Program:?GLuint,Shadertype:?GLenum,Index:?GLuint,Bufsize:?GLsizei>>).
+ call(5751, <<Program:?GLuint,Shadertype:?GLenum,Index:?GLuint,Bufsize:?GLsizei>>).
%% @doc Query the name of an active shader subroutine
%%
@@ -15114,7 +15214,7 @@ getActiveSubroutineUniformName(Program,Shadertype,Index,Bufsize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveSubroutineName.xml">external</a> documentation.
-spec getActiveSubroutineName(Program, Shadertype, Index, Bufsize) -> string() when Program :: integer(),Shadertype :: enum(),Index :: integer(),Bufsize :: integer().
getActiveSubroutineName(Program,Shadertype,Index,Bufsize) ->
- call(5751, <<Program:?GLuint,Shadertype:?GLenum,Index:?GLuint,Bufsize:?GLsizei>>).
+ call(5752, <<Program:?GLuint,Shadertype:?GLenum,Index:?GLuint,Bufsize:?GLsizei>>).
%% @doc Load active subroutine uniforms
%%
@@ -15128,8 +15228,9 @@ getActiveSubroutineName(Program,Shadertype,Index,Bufsize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glUniformSubroutines.xml">external</a> documentation.
-spec uniformSubroutinesuiv(Shadertype, Indices) -> 'ok' when Shadertype :: enum(),Indices :: [integer()].
uniformSubroutinesuiv(Shadertype,Indices) ->
- cast(5752, <<Shadertype:?GLenum,(length(Indices)):?GLuint,
- (<< <<C:?GLuint>> || C <- Indices>>)/binary,0:(((length(Indices)) rem 2)*32)>>).
+ IndicesLen = length(Indices),
+ cast(5753, <<Shadertype:?GLenum,IndicesLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Indices>>)/binary,0:(((IndicesLen) rem 2)*32)>>).
%% @doc Retrieve the value of a subroutine uniform of a given shader stage of the current program
%%
@@ -15142,7 +15243,7 @@ uniformSubroutinesuiv(Shadertype,Indices) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformSubroutine.xml">external</a> documentation.
-spec getUniformSubroutineuiv(Shadertype, Location) -> {integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer(),integer()} when Shadertype :: enum(),Location :: integer().
getUniformSubroutineuiv(Shadertype,Location) ->
- call(5753, <<Shadertype:?GLenum,Location:?GLint>>).
+ call(5754, <<Shadertype:?GLenum,Location:?GLint>>).
%% @doc Retrieve properties of a program object corresponding to a specified shader stage
%%
@@ -15174,7 +15275,7 @@ getUniformSubroutineuiv(Shadertype,Location) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramStage.xml">external</a> documentation.
-spec getProgramStageiv(Program, Shadertype, Pname) -> integer() when Program :: integer(),Shadertype :: enum(),Pname :: enum().
getProgramStageiv(Program,Shadertype,Pname) ->
- call(5754, <<Program:?GLuint,Shadertype:?GLenum,Pname:?GLenum>>).
+ call(5755, <<Program:?GLuint,Shadertype:?GLenum,Pname:?GLenum>>).
%% @doc Specifies the parameters for patch primitives
%%
@@ -15201,14 +15302,15 @@ getProgramStageiv(Program,Shadertype,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glPatchParameter.xml">external</a> documentation.
-spec patchParameteri(Pname, Value) -> 'ok' when Pname :: enum(),Value :: integer().
patchParameteri(Pname,Value) ->
- cast(5755, <<Pname:?GLenum,Value:?GLint>>).
+ cast(5756, <<Pname:?GLenum,Value:?GLint>>).
%% @doc
%% See {@link patchParameteri/2}
-spec patchParameterfv(Pname, Values) -> 'ok' when Pname :: enum(),Values :: [float()].
patchParameterfv(Pname,Values) ->
- cast(5756, <<Pname:?GLenum,(length(Values)):?GLuint,
- (<< <<C:?GLfloat>> || C <- Values>>)/binary,0:(((length(Values)) rem 2)*32)>>).
+ ValuesLen = length(Values),
+ cast(5757, <<Pname:?GLenum,ValuesLen:?GLuint,
+ (<< <<C:?GLfloat>> || C <- Values>>)/binary,0:(((ValuesLen) rem 2)*32)>>).
%% @doc Bind a transform feedback object
%%
@@ -15231,7 +15333,7 @@ patchParameterfv(Pname,Values) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindTransformFeedback.xml">external</a> documentation.
-spec bindTransformFeedback(Target, Id) -> 'ok' when Target :: enum(),Id :: integer().
bindTransformFeedback(Target,Id) ->
- cast(5757, <<Target:?GLenum,Id:?GLuint>>).
+ cast(5758, <<Target:?GLenum,Id:?GLuint>>).
%% @doc Delete transform feedback objects
%%
@@ -15244,8 +15346,9 @@ bindTransformFeedback(Target,Id) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteTransformFeedbacks.xml">external</a> documentation.
-spec deleteTransformFeedbacks(Ids) -> 'ok' when Ids :: [integer()].
deleteTransformFeedbacks(Ids) ->
- cast(5758, <<(length(Ids)):?GLuint,
- (<< <<C:?GLuint>> || C <- Ids>>)/binary,0:(((1+length(Ids)) rem 2)*32)>>).
+ IdsLen = length(Ids),
+ cast(5759, <<IdsLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Ids>>)/binary,0:(((1+IdsLen) rem 2)*32)>>).
%% @doc Reserve transform feedback object names
%%
@@ -15256,7 +15359,7 @@ deleteTransformFeedbacks(Ids) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenTransformFeedbacks.xml">external</a> documentation.
-spec genTransformFeedbacks(N) -> [integer()] when N :: integer().
genTransformFeedbacks(N) ->
- call(5759, <<N:?GLsizei>>).
+ call(5760, <<N:?GLsizei>>).
%% @doc Determine if a name corresponds to a transform feedback object
%%
@@ -15271,7 +15374,7 @@ genTransformFeedbacks(N) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsTransformFeedback.xml">external</a> documentation.
-spec isTransformFeedback(Id) -> 0|1 when Id :: integer().
isTransformFeedback(Id) ->
- call(5760, <<Id:?GLuint>>).
+ call(5761, <<Id:?GLuint>>).
%% @doc Pause transform feedback operations
%%
@@ -15284,7 +15387,7 @@ isTransformFeedback(Id) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glPauseTransformFeedback.xml">external</a> documentation.
-spec pauseTransformFeedback() -> 'ok'.
pauseTransformFeedback() ->
- cast(5761, <<>>).
+ cast(5762, <<>>).
%% @doc Resume transform feedback operations
%%
@@ -15297,7 +15400,7 @@ pauseTransformFeedback() ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glResumeTransformFeedback.xml">external</a> documentation.
-spec resumeTransformFeedback() -> 'ok'.
resumeTransformFeedback() ->
- cast(5762, <<>>).
+ cast(5763, <<>>).
%% @doc Render primitives using a count derived from a transform feedback object
%%
@@ -15311,7 +15414,7 @@ resumeTransformFeedback() ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawTransformFeedback.xml">external</a> documentation.
-spec drawTransformFeedback(Mode, Id) -> 'ok' when Mode :: enum(),Id :: integer().
drawTransformFeedback(Mode,Id) ->
- cast(5763, <<Mode:?GLenum,Id:?GLuint>>).
+ cast(5764, <<Mode:?GLenum,Id:?GLuint>>).
%% @doc Render primitives using a count derived from a specifed stream of a transform feedback object
%%
@@ -15329,14 +15432,14 @@ drawTransformFeedback(Mode,Id) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawTransformFeedbackStream.xml">external</a> documentation.
-spec drawTransformFeedbackStream(Mode, Id, Stream) -> 'ok' when Mode :: enum(),Id :: integer(),Stream :: integer().
drawTransformFeedbackStream(Mode,Id,Stream) ->
- cast(5764, <<Mode:?GLenum,Id:?GLuint,Stream:?GLuint>>).
+ cast(5765, <<Mode:?GLenum,Id:?GLuint,Stream:?GLuint>>).
%% @doc glBeginQueryIndexe
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBeginQueryIndexe.xml">external</a> documentation.
-spec beginQueryIndexed(Target, Index, Id) -> 'ok' when Target :: enum(),Index :: integer(),Id :: integer().
beginQueryIndexed(Target,Index,Id) ->
- cast(5765, <<Target:?GLenum,Index:?GLuint,Id:?GLuint>>).
+ cast(5766, <<Target:?GLenum,Index:?GLuint,Id:?GLuint>>).
%% @doc Delimit the boundaries of a query object on an indexed target
%%
@@ -15413,7 +15516,7 @@ beginQueryIndexed(Target,Index,Id) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBeginQueryIndexed.xml">external</a> documentation.
-spec endQueryIndexed(Target, Index) -> 'ok' when Target :: enum(),Index :: integer().
endQueryIndexed(Target,Index) ->
- cast(5766, <<Target:?GLenum,Index:?GLuint>>).
+ cast(5767, <<Target:?GLenum,Index:?GLuint>>).
%% @doc Return parameters of an indexed query object target
%%
@@ -15431,7 +15534,7 @@ endQueryIndexed(Target,Index) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetQueryIndexed.xml">external</a> documentation.
-spec getQueryIndexediv(Target, Index, Pname) -> integer() when Target :: enum(),Index :: integer(),Pname :: enum().
getQueryIndexediv(Target,Index,Pname) ->
- call(5767, <<Target:?GLenum,Index:?GLuint,Pname:?GLenum>>).
+ call(5768, <<Target:?GLenum,Index:?GLuint,Pname:?GLenum>>).
%% @doc Release resources consumed by the implementation's shader compiler
%%
@@ -15443,7 +15546,7 @@ getQueryIndexediv(Target,Index,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glReleaseShaderCompiler.xml">external</a> documentation.
-spec releaseShaderCompiler() -> 'ok'.
releaseShaderCompiler() ->
- cast(5768, <<>>).
+ cast(5769, <<>>).
%% @doc Load pre-compiled shader binaries
%%
@@ -15465,9 +15568,10 @@ releaseShaderCompiler() ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glShaderBinary.xml">external</a> documentation.
-spec shaderBinary(Shaders, Binaryformat, Binary) -> 'ok' when Shaders :: [integer()],Binaryformat :: enum(),Binary :: binary().
shaderBinary(Shaders,Binaryformat,Binary) ->
+ ShadersLen = length(Shaders),
send_bin(Binary),
- cast(5769, <<(length(Shaders)):?GLuint,
- (<< <<C:?GLuint>> || C <- Shaders>>)/binary,0:(((1+length(Shaders)) rem 2)*32),Binaryformat:?GLenum>>).
+ cast(5770, <<ShadersLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Shaders>>)/binary,0:(((1+ShadersLen) rem 2)*32),Binaryformat:?GLenum>>).
%% @doc Retrieve the range and precision for numeric formats supported by the shader compiler
%%
@@ -15492,20 +15596,20 @@ shaderBinary(Shaders,Binaryformat,Binary) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetShaderPrecisionFormat.xml">external</a> documentation.
-spec getShaderPrecisionFormat(Shadertype, Precisiontype) -> {Range :: {integer(),integer()},Precision :: integer()} when Shadertype :: enum(),Precisiontype :: enum().
getShaderPrecisionFormat(Shadertype,Precisiontype) ->
- call(5770, <<Shadertype:?GLenum,Precisiontype:?GLenum>>).
+ call(5771, <<Shadertype:?GLenum,Precisiontype:?GLenum>>).
%% @doc
%% See {@link depthRange/2}
-spec depthRangef(N, F) -> 'ok' when N :: clamp(),F :: clamp().
depthRangef(N,F) ->
- cast(5771, <<N:?GLclampf,F:?GLclampf>>).
+ cast(5772, <<N:?GLclampf,F:?GLclampf>>).
%% @doc glClearDepthf
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glClearDepthf.xml">external</a> documentation.
-spec clearDepthf(D) -> 'ok' when D :: clamp().
clearDepthf(D) ->
- cast(5772, <<D:?GLclampf>>).
+ cast(5773, <<D:?GLclampf>>).
%% @doc Return a binary representation of a program object's compiled and linked executable source
%%
@@ -15526,7 +15630,7 @@ clearDepthf(D) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramBinary.xml">external</a> documentation.
-spec getProgramBinary(Program, BufSize) -> {BinaryFormat :: enum(),Binary :: binary()} when Program :: integer(),BufSize :: integer().
getProgramBinary(Program,BufSize) ->
- call(5773, <<Program:?GLuint,BufSize:?GLsizei>>).
+ call(5774, <<Program:?GLuint,BufSize:?GLsizei>>).
%% @doc Load a program object with a program binary
%%
@@ -15554,7 +15658,7 @@ getProgramBinary(Program,BufSize) ->
-spec programBinary(Program, BinaryFormat, Binary) -> 'ok' when Program :: integer(),BinaryFormat :: enum(),Binary :: binary().
programBinary(Program,BinaryFormat,Binary) ->
send_bin(Binary),
- cast(5774, <<Program:?GLuint,BinaryFormat:?GLenum>>).
+ cast(5775, <<Program:?GLuint,BinaryFormat:?GLenum>>).
%% @doc Specify a parameter for a program object
%%
@@ -15579,7 +15683,7 @@ programBinary(Program,BinaryFormat,Binary) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramParameter.xml">external</a> documentation.
-spec programParameteri(Program, Pname, Value) -> 'ok' when Program :: integer(),Pname :: enum(),Value :: integer().
programParameteri(Program,Pname,Value) ->
- cast(5775, <<Program:?GLuint,Pname:?GLenum,Value:?GLint>>).
+ cast(5776, <<Program:?GLuint,Pname:?GLenum,Value:?GLint>>).
%% @doc Bind stages of a program object to a program pipeline
%%
@@ -15604,7 +15708,7 @@ programParameteri(Program,Pname,Value) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glUseProgramStages.xml">external</a> documentation.
-spec useProgramStages(Pipeline, Stages, Program) -> 'ok' when Pipeline :: integer(),Stages :: integer(),Program :: integer().
useProgramStages(Pipeline,Stages,Program) ->
- cast(5776, <<Pipeline:?GLuint,Stages:?GLbitfield,Program:?GLuint>>).
+ cast(5777, <<Pipeline:?GLuint,Stages:?GLbitfield,Program:?GLuint>>).
%% @doc Set the active program object for a program pipeline object
%%
@@ -15616,15 +15720,16 @@ useProgramStages(Pipeline,Stages,Program) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glActiveShaderProgram.xml">external</a> documentation.
-spec activeShaderProgram(Pipeline, Program) -> 'ok' when Pipeline :: integer(),Program :: integer().
activeShaderProgram(Pipeline,Program) ->
- cast(5777, <<Pipeline:?GLuint,Program:?GLuint>>).
+ cast(5778, <<Pipeline:?GLuint,Program:?GLuint>>).
%% @doc glCreateShaderProgramv
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glCreateShaderProgramv.xml">external</a> documentation.
-spec createShaderProgramv(Type, Strings) -> integer() when Type :: enum(),Strings :: iolist().
createShaderProgramv(Type,Strings) ->
- StringsTemp = list_to_binary([[Str|[0]] || Str <- Strings ]),
- call(5778, <<Type:?GLenum,(length(Strings)):?GLuint,(size(StringsTemp)):?GLuint,(StringsTemp)/binary,0:((8-((size(StringsTemp)+0) rem 8)) rem 8)>>).
+ StringsTemp = list_to_binary([[Str|[0]] || Str <- Strings ]),
+ StringsLen = length(Strings),
+ call(5779, <<Type:?GLenum,StringsLen:?GLuint,(size(StringsTemp)):?GLuint,(StringsTemp)/binary,0:((8-((size(StringsTemp)+0) rem 8)) rem 8)>>).
%% @doc Bind a program pipeline to the current context
%%
@@ -15646,7 +15751,7 @@ createShaderProgramv(Type,Strings) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindProgramPipeline.xml">external</a> documentation.
-spec bindProgramPipeline(Pipeline) -> 'ok' when Pipeline :: integer().
bindProgramPipeline(Pipeline) ->
- cast(5779, <<Pipeline:?GLuint>>).
+ cast(5780, <<Pipeline:?GLuint>>).
%% @doc Delete program pipeline objects
%%
@@ -15660,8 +15765,9 @@ bindProgramPipeline(Pipeline) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgramPipelines.xml">external</a> documentation.
-spec deleteProgramPipelines(Pipelines) -> 'ok' when Pipelines :: [integer()].
deleteProgramPipelines(Pipelines) ->
- cast(5780, <<(length(Pipelines)):?GLuint,
- (<< <<C:?GLuint>> || C <- Pipelines>>)/binary,0:(((1+length(Pipelines)) rem 2)*32)>>).
+ PipelinesLen = length(Pipelines),
+ cast(5781, <<PipelinesLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Pipelines>>)/binary,0:(((1+PipelinesLen) rem 2)*32)>>).
%% @doc Reserve program pipeline object names
%%
@@ -15672,7 +15778,7 @@ deleteProgramPipelines(Pipelines) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGenProgramPipelines.xml">external</a> documentation.
-spec genProgramPipelines(N) -> [integer()] when N :: integer().
genProgramPipelines(N) ->
- call(5781, <<N:?GLsizei>>).
+ call(5782, <<N:?GLsizei>>).
%% @doc Determine if a name corresponds to a program pipeline object
%%
@@ -15687,7 +15793,7 @@ genProgramPipelines(N) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glIsProgramPipeline.xml">external</a> documentation.
-spec isProgramPipeline(Pipeline) -> 0|1 when Pipeline :: integer().
isProgramPipeline(Pipeline) ->
- call(5782, <<Pipeline:?GLuint>>).
+ call(5783, <<Pipeline:?GLuint>>).
%% @doc Retrieve properties of a program pipeline object
%%
@@ -15725,7 +15831,7 @@ isProgramPipeline(Pipeline) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramPipeline.xml">external</a> documentation.
-spec getProgramPipelineiv(Pipeline, Pname) -> integer() when Pipeline :: integer(),Pname :: enum().
getProgramPipelineiv(Pipeline,Pname) ->
- call(5783, <<Pipeline:?GLuint,Pname:?GLenum>>).
+ call(5784, <<Pipeline:?GLuint,Pname:?GLenum>>).
%% @doc Specify the value of a uniform variable for a specified program object
%%
@@ -15792,334 +15898,368 @@ getProgramPipelineiv(Pipeline,Pname) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glProgramUniform.xml">external</a> documentation.
-spec programUniform1i(Program, Location, V0) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: integer().
programUniform1i(Program,Location,V0) ->
- cast(5784, <<Program:?GLuint,Location:?GLint,V0:?GLint>>).
+ cast(5785, <<Program:?GLuint,Location:?GLint,V0:?GLint>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform1iv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [integer()].
programUniform1iv(Program,Location,Value) ->
- cast(5785, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
- (<< <<C:?GLint>> || C <- Value>>)/binary,0:(((1+length(Value)) rem 2)*32)>>).
+ ValueLen = length(Value),
+ cast(5786, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
+ (<< <<C:?GLint>> || C <- Value>>)/binary,0:(((1+ValueLen) rem 2)*32)>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform1f(Program, Location, V0) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: float().
programUniform1f(Program,Location,V0) ->
- cast(5786, <<Program:?GLuint,Location:?GLint,V0:?GLfloat>>).
+ cast(5787, <<Program:?GLuint,Location:?GLint,V0:?GLfloat>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform1fv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [float()].
programUniform1fv(Program,Location,Value) ->
- cast(5787, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
- (<< <<C:?GLfloat>> || C <- Value>>)/binary,0:(((1+length(Value)) rem 2)*32)>>).
+ ValueLen = length(Value),
+ cast(5788, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
+ (<< <<C:?GLfloat>> || C <- Value>>)/binary,0:(((1+ValueLen) rem 2)*32)>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform1d(Program, Location, V0) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: float().
programUniform1d(Program,Location,V0) ->
- cast(5788, <<Program:?GLuint,Location:?GLint,V0:?GLdouble>>).
+ cast(5789, <<Program:?GLuint,Location:?GLint,V0:?GLdouble>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform1dv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [float()].
programUniform1dv(Program,Location,Value) ->
- cast(5789, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5790, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,0:32,
(<< <<C:?GLdouble>> || C <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform1ui(Program, Location, V0) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: integer().
programUniform1ui(Program,Location,V0) ->
- cast(5790, <<Program:?GLuint,Location:?GLint,V0:?GLuint>>).
+ cast(5791, <<Program:?GLuint,Location:?GLint,V0:?GLuint>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform1uiv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [integer()].
programUniform1uiv(Program,Location,Value) ->
- cast(5791, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
- (<< <<C:?GLuint>> || C <- Value>>)/binary,0:(((1+length(Value)) rem 2)*32)>>).
+ ValueLen = length(Value),
+ cast(5792, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Value>>)/binary,0:(((1+ValueLen) rem 2)*32)>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform2i(Program, Location, V0, V1) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: integer(),V1 :: integer().
programUniform2i(Program,Location,V0,V1) ->
- cast(5792, <<Program:?GLuint,Location:?GLint,V0:?GLint,V1:?GLint>>).
+ cast(5793, <<Program:?GLuint,Location:?GLint,V0:?GLint,V1:?GLint>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform2iv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{integer(),integer()}].
programUniform2iv(Program,Location,Value) ->
- cast(5793, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5794, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLint,V2:?GLint>> || {V1,V2} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform2f(Program, Location, V0, V1) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: float(),V1 :: float().
programUniform2f(Program,Location,V0,V1) ->
- cast(5794, <<Program:?GLuint,Location:?GLint,V0:?GLfloat,V1:?GLfloat>>).
+ cast(5795, <<Program:?GLuint,Location:?GLint,V0:?GLfloat,V1:?GLfloat>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform2fv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{float(),float()}].
programUniform2fv(Program,Location,Value) ->
- cast(5795, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5796, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat>> || {V1,V2} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform2d(Program, Location, V0, V1) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: float(),V1 :: float().
programUniform2d(Program,Location,V0,V1) ->
- cast(5796, <<Program:?GLuint,Location:?GLint,V0:?GLdouble,V1:?GLdouble>>).
+ cast(5797, <<Program:?GLuint,Location:?GLint,V0:?GLdouble,V1:?GLdouble>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform2dv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{float(),float()}].
programUniform2dv(Program,Location,Value) ->
- cast(5797, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5798, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble>> || {V1,V2} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform2ui(Program, Location, V0, V1) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: integer(),V1 :: integer().
programUniform2ui(Program,Location,V0,V1) ->
- cast(5798, <<Program:?GLuint,Location:?GLint,V0:?GLuint,V1:?GLuint>>).
+ cast(5799, <<Program:?GLuint,Location:?GLint,V0:?GLuint,V1:?GLuint>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform2uiv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{integer(),integer()}].
programUniform2uiv(Program,Location,Value) ->
- cast(5799, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5800, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLuint,V2:?GLuint>> || {V1,V2} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform3i(Program, Location, V0, V1, V2) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: integer(),V1 :: integer(),V2 :: integer().
programUniform3i(Program,Location,V0,V1,V2) ->
- cast(5800, <<Program:?GLuint,Location:?GLint,V0:?GLint,V1:?GLint,V2:?GLint>>).
+ cast(5801, <<Program:?GLuint,Location:?GLint,V0:?GLint,V1:?GLint,V2:?GLint>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform3iv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{integer(),integer(),integer()}].
programUniform3iv(Program,Location,Value) ->
- cast(5801, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5802, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLint,V2:?GLint,V3:?GLint>> || {V1,V2,V3} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform3f(Program, Location, V0, V1, V2) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: float(),V1 :: float(),V2 :: float().
programUniform3f(Program,Location,V0,V1,V2) ->
- cast(5802, <<Program:?GLuint,Location:?GLint,V0:?GLfloat,V1:?GLfloat,V2:?GLfloat>>).
+ cast(5803, <<Program:?GLuint,Location:?GLint,V0:?GLfloat,V1:?GLfloat,V2:?GLfloat>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform3fv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{float(),float(),float()}].
programUniform3fv(Program,Location,Value) ->
- cast(5803, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5804, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat>> || {V1,V2,V3} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform3d(Program, Location, V0, V1, V2) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: float(),V1 :: float(),V2 :: float().
programUniform3d(Program,Location,V0,V1,V2) ->
- cast(5804, <<Program:?GLuint,Location:?GLint,V0:?GLdouble,V1:?GLdouble,V2:?GLdouble>>).
+ cast(5805, <<Program:?GLuint,Location:?GLint,V0:?GLdouble,V1:?GLdouble,V2:?GLdouble>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform3dv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{float(),float(),float()}].
programUniform3dv(Program,Location,Value) ->
- cast(5805, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5806, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble>> || {V1,V2,V3} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform3ui(Program, Location, V0, V1, V2) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: integer(),V1 :: integer(),V2 :: integer().
programUniform3ui(Program,Location,V0,V1,V2) ->
- cast(5806, <<Program:?GLuint,Location:?GLint,V0:?GLuint,V1:?GLuint,V2:?GLuint>>).
+ cast(5807, <<Program:?GLuint,Location:?GLint,V0:?GLuint,V1:?GLuint,V2:?GLuint>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform3uiv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{integer(),integer(),integer()}].
programUniform3uiv(Program,Location,Value) ->
- cast(5807, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5808, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLuint,V2:?GLuint,V3:?GLuint>> || {V1,V2,V3} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform4i(Program, Location, V0, V1, V2, V3) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: integer(),V1 :: integer(),V2 :: integer(),V3 :: integer().
programUniform4i(Program,Location,V0,V1,V2,V3) ->
- cast(5808, <<Program:?GLuint,Location:?GLint,V0:?GLint,V1:?GLint,V2:?GLint,V3:?GLint>>).
+ cast(5809, <<Program:?GLuint,Location:?GLint,V0:?GLint,V1:?GLint,V2:?GLint,V3:?GLint>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform4iv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{integer(),integer(),integer(),integer()}].
programUniform4iv(Program,Location,Value) ->
- cast(5809, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5810, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLint,V2:?GLint,V3:?GLint,V4:?GLint>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform4f(Program, Location, V0, V1, V2, V3) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: float(),V1 :: float(),V2 :: float(),V3 :: float().
programUniform4f(Program,Location,V0,V1,V2,V3) ->
- cast(5810, <<Program:?GLuint,Location:?GLint,V0:?GLfloat,V1:?GLfloat,V2:?GLfloat,V3:?GLfloat>>).
+ cast(5811, <<Program:?GLuint,Location:?GLint,V0:?GLfloat,V1:?GLfloat,V2:?GLfloat,V3:?GLfloat>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform4fv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{float(),float(),float(),float()}].
programUniform4fv(Program,Location,Value) ->
- cast(5811, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5812, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform4d(Program, Location, V0, V1, V2, V3) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: float(),V1 :: float(),V2 :: float(),V3 :: float().
programUniform4d(Program,Location,V0,V1,V2,V3) ->
- cast(5812, <<Program:?GLuint,Location:?GLint,V0:?GLdouble,V1:?GLdouble,V2:?GLdouble,V3:?GLdouble>>).
+ cast(5813, <<Program:?GLuint,Location:?GLint,V0:?GLdouble,V1:?GLdouble,V2:?GLdouble,V3:?GLdouble>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform4dv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{float(),float(),float(),float()}].
programUniform4dv(Program,Location,Value) ->
- cast(5813, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5814, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform4ui(Program, Location, V0, V1, V2, V3) -> 'ok' when Program :: integer(),Location :: integer(),V0 :: integer(),V1 :: integer(),V2 :: integer(),V3 :: integer().
programUniform4ui(Program,Location,V0,V1,V2,V3) ->
- cast(5814, <<Program:?GLuint,Location:?GLint,V0:?GLuint,V1:?GLuint,V2:?GLuint,V3:?GLuint>>).
+ cast(5815, <<Program:?GLuint,Location:?GLint,V0:?GLuint,V1:?GLuint,V2:?GLuint,V3:?GLuint>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniform4uiv(Program, Location, Value) -> 'ok' when Program :: integer(),Location :: integer(),Value :: [{integer(),integer(),integer(),integer()}].
programUniform4uiv(Program,Location,Value) ->
- cast(5815, <<Program:?GLuint,Location:?GLint,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5816, <<Program:?GLuint,Location:?GLint,ValueLen:?GLuint,
(<< <<V1:?GLuint,V2:?GLuint,V3:?GLuint,V4:?GLuint>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix2fv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float()}].
programUniformMatrix2fv(Program,Location,Transpose,Value) ->
- cast(5816, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5817, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix3fv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix3fv(Program,Location,Transpose,Value) ->
- cast(5817, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5818, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat,V9:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix4fv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix4fv(Program,Location,Transpose,Value) ->
- cast(5818, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5819, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat,V9:?GLfloat,V10:?GLfloat,V11:?GLfloat,V12:?GLfloat,V13:?GLfloat,V14:?GLfloat,V15:?GLfloat,V16:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix2dv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float()}].
programUniformMatrix2dv(Program,Location,Transpose,Value) ->
- cast(5819, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5820, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble>> || {V1,V2,V3,V4} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix3dv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix3dv(Program,Location,Transpose,Value) ->
- cast(5820, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5821, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble,V9:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix4dv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix4dv(Program,Location,Transpose,Value) ->
- cast(5821, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5822, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble,V9:?GLdouble,V10:?GLdouble,V11:?GLdouble,V12:?GLdouble,V13:?GLdouble,V14:?GLdouble,V15:?GLdouble,V16:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix2x3fv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float()}].
programUniformMatrix2x3fv(Program,Location,Transpose,Value) ->
- cast(5822, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5823, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat>> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix3x2fv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float()}].
programUniformMatrix3x2fv(Program,Location,Transpose,Value) ->
- cast(5823, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5824, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat>> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix2x4fv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix2x4fv(Program,Location,Transpose,Value) ->
- cast(5824, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5825, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix4x2fv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix4x2fv(Program,Location,Transpose,Value) ->
- cast(5825, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5826, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix3x4fv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix3x4fv(Program,Location,Transpose,Value) ->
- cast(5826, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5827, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat,V9:?GLfloat,V10:?GLfloat,V11:?GLfloat,V12:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix4x3fv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix4x3fv(Program,Location,Transpose,Value) ->
- cast(5827, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,(length(Value)):?GLuint,
+ ValueLen = length(Value),
+ cast(5828, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:24,ValueLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat,V5:?GLfloat,V6:?GLfloat,V7:?GLfloat,V8:?GLfloat,V9:?GLfloat,V10:?GLfloat,V11:?GLfloat,V12:?GLfloat>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix2x3dv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float()}].
programUniformMatrix2x3dv(Program,Location,Transpose,Value) ->
- cast(5828, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5829, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble>> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix3x2dv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float()}].
programUniformMatrix3x2dv(Program,Location,Transpose,Value) ->
- cast(5829, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5830, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble>> || {V1,V2,V3,V4,V5,V6} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix2x4dv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix2x4dv(Program,Location,Transpose,Value) ->
- cast(5830, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5831, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix4x2dv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix4x2dv(Program,Location,Transpose,Value) ->
- cast(5831, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5832, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix3x4dv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix3x4dv(Program,Location,Transpose,Value) ->
- cast(5832, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5833, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble,V9:?GLdouble,V10:?GLdouble,V11:?GLdouble,V12:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>).
%% @doc
%% See {@link programUniform1i/3}
-spec programUniformMatrix4x3dv(Program, Location, Transpose, Value) -> 'ok' when Program :: integer(),Location :: integer(),Transpose :: 0|1,Value :: [{float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float(),float()}].
programUniformMatrix4x3dv(Program,Location,Transpose,Value) ->
- cast(5833, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,(length(Value)):?GLuint,0:32,
+ ValueLen = length(Value),
+ cast(5834, <<Program:?GLuint,Location:?GLint,Transpose:?GLboolean,0:56,ValueLen:?GLuint,0:32,
(<< <<V1:?GLdouble,V2:?GLdouble,V3:?GLdouble,V4:?GLdouble,V5:?GLdouble,V6:?GLdouble,V7:?GLdouble,V8:?GLdouble,V9:?GLdouble,V10:?GLdouble,V11:?GLdouble,V12:?GLdouble>> || {V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12} <- Value>>)/binary>>).
%% @doc Validate a program pipeline object against current GL state
@@ -16140,7 +16280,7 @@ programUniformMatrix4x3dv(Program,Location,Transpose,Value) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glValidateProgramPipeline.xml">external</a> documentation.
-spec validateProgramPipeline(Pipeline) -> 'ok' when Pipeline :: integer().
validateProgramPipeline(Pipeline) ->
- cast(5834, <<Pipeline:?GLuint>>).
+ cast(5835, <<Pipeline:?GLuint>>).
%% @doc Retrieve the info log string from a program pipeline object
%%
@@ -16157,35 +16297,35 @@ validateProgramPipeline(Pipeline) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetProgramPipelineInfoLog.xml">external</a> documentation.
-spec getProgramPipelineInfoLog(Pipeline, BufSize) -> string() when Pipeline :: integer(),BufSize :: integer().
getProgramPipelineInfoLog(Pipeline,BufSize) ->
- call(5835, <<Pipeline:?GLuint,BufSize:?GLsizei>>).
+ call(5836, <<Pipeline:?GLuint,BufSize:?GLsizei>>).
%% @doc glVertexAttribL
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribL.xml">external</a> documentation.
-spec vertexAttribL1d(Index, X) -> 'ok' when Index :: integer(),X :: float().
vertexAttribL1d(Index,X) ->
- cast(5836, <<Index:?GLuint,0:32,X:?GLdouble>>).
+ cast(5837, <<Index:?GLuint,0:32,X:?GLdouble>>).
%% @doc glVertexAttribL
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribL.xml">external</a> documentation.
-spec vertexAttribL2d(Index, X, Y) -> 'ok' when Index :: integer(),X :: float(),Y :: float().
vertexAttribL2d(Index,X,Y) ->
- cast(5837, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble>>).
+ cast(5838, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble>>).
%% @doc glVertexAttribL
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribL.xml">external</a> documentation.
-spec vertexAttribL3d(Index, X, Y, Z) -> 'ok' when Index :: integer(),X :: float(),Y :: float(),Z :: float().
vertexAttribL3d(Index,X,Y,Z) ->
- cast(5838, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble>>).
+ cast(5839, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble>>).
%% @doc glVertexAttribL
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribL.xml">external</a> documentation.
-spec vertexAttribL4d(Index, X, Y, Z, W) -> 'ok' when Index :: integer(),X :: float(),Y :: float(),Z :: float(),W :: float().
vertexAttribL4d(Index,X,Y,Z,W) ->
- cast(5839, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
+ cast(5840, <<Index:?GLuint,0:32,X:?GLdouble,Y:?GLdouble,Z:?GLdouble,W:?GLdouble>>).
%% @equiv vertexAttribL1d(Index,X)
-spec vertexAttribL1dv(Index :: integer(),V) -> 'ok' when V :: {X :: float()}.
@@ -16208,24 +16348,25 @@ vertexAttribL4dv(Index,{X,Y,Z,W}) -> vertexAttribL4d(Index,X,Y,Z,W).
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribLPointer.xml">external</a> documentation.
-spec vertexAttribLPointer(Index, Size, Type, Stride, Pointer) -> 'ok' when Index :: integer(),Size :: integer(),Type :: enum(),Stride :: integer(),Pointer :: offset()|mem().
vertexAttribLPointer(Index,Size,Type,Stride,Pointer) when is_integer(Pointer) ->
- cast(5840, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Stride:?GLsizei,Pointer:?GLuint>>);
+ cast(5841, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Stride:?GLsizei,Pointer:?GLuint>>);
vertexAttribLPointer(Index,Size,Type,Stride,Pointer) ->
send_bin(Pointer),
- cast(5841, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Stride:?GLsizei>>).
+ cast(5842, <<Index:?GLuint,Size:?GLint,Type:?GLenum,Stride:?GLsizei>>).
%% @doc glGetVertexAttribL
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetVertexAttribL.xml">external</a> documentation.
-spec getVertexAttribLdv(Index, Pname) -> {float(),float(),float(),float()} when Index :: integer(),Pname :: enum().
getVertexAttribLdv(Index,Pname) ->
- call(5842, <<Index:?GLuint,Pname:?GLenum>>).
+ call(5843, <<Index:?GLuint,Pname:?GLenum>>).
%% @doc glViewportArrayv
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glViewportArrayv.xml">external</a> documentation.
-spec viewportArrayv(First, V) -> 'ok' when First :: integer(),V :: [{float(),float(),float(),float()}].
viewportArrayv(First,V) ->
- cast(5843, <<First:?GLuint,(length(V)):?GLuint,
+ VLen = length(V),
+ cast(5844, <<First:?GLuint,VLen:?GLuint,
(<< <<V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat>> || {V1,V2,V3,V4} <- V>>)/binary>>).
%% @doc Set a specified viewport
@@ -16265,20 +16406,21 @@ viewportArrayv(First,V) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glViewportIndexed.xml">external</a> documentation.
-spec viewportIndexedf(Index, X, Y, W, H) -> 'ok' when Index :: integer(),X :: float(),Y :: float(),W :: float(),H :: float().
viewportIndexedf(Index,X,Y,W,H) ->
- cast(5844, <<Index:?GLuint,X:?GLfloat,Y:?GLfloat,W:?GLfloat,H:?GLfloat>>).
+ cast(5845, <<Index:?GLuint,X:?GLfloat,Y:?GLfloat,W:?GLfloat,H:?GLfloat>>).
%% @doc
%% See {@link viewportIndexedf/5}
-spec viewportIndexedfv(Index, V) -> 'ok' when Index :: integer(),V :: {float(),float(),float(),float()}.
viewportIndexedfv(Index,{V1,V2,V3,V4}) ->
- cast(5845, <<Index:?GLuint,V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat>>).
+ cast(5846, <<Index:?GLuint,V1:?GLfloat,V2:?GLfloat,V3:?GLfloat,V4:?GLfloat>>).
%% @doc glScissorArrayv
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glScissorArrayv.xml">external</a> documentation.
-spec scissorArrayv(First, V) -> 'ok' when First :: integer(),V :: [{integer(),integer(),integer(),integer()}].
scissorArrayv(First,V) ->
- cast(5846, <<First:?GLuint,(length(V)):?GLuint,
+ VLen = length(V),
+ cast(5847, <<First:?GLuint,VLen:?GLuint,
(<< <<V1:?GLint,V2:?GLint,V3:?GLint,V4:?GLint>> || {V1,V2,V3,V4} <- V>>)/binary>>).
%% @doc glScissorIndexe
@@ -16286,21 +16428,22 @@ scissorArrayv(First,V) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glScissorIndexe.xml">external</a> documentation.
-spec scissorIndexed(Index, Left, Bottom, Width, Height) -> 'ok' when Index :: integer(),Left :: integer(),Bottom :: integer(),Width :: integer(),Height :: integer().
scissorIndexed(Index,Left,Bottom,Width,Height) ->
- cast(5847, <<Index:?GLuint,Left:?GLint,Bottom:?GLint,Width:?GLsizei,Height:?GLsizei>>).
+ cast(5848, <<Index:?GLuint,Left:?GLint,Bottom:?GLint,Width:?GLsizei,Height:?GLsizei>>).
%% @doc glScissorIndexe
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glScissorIndexe.xml">external</a> documentation.
-spec scissorIndexedv(Index, V) -> 'ok' when Index :: integer(),V :: {integer(),integer(),integer(),integer()}.
scissorIndexedv(Index,{V1,V2,V3,V4}) ->
- cast(5848, <<Index:?GLuint,V1:?GLint,V2:?GLint,V3:?GLint,V4:?GLint>>).
+ cast(5849, <<Index:?GLuint,V1:?GLint,V2:?GLint,V3:?GLint,V4:?GLint>>).
%% @doc glDepthRangeArrayv
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDepthRangeArrayv.xml">external</a> documentation.
-spec depthRangeArrayv(First, V) -> 'ok' when First :: integer(),V :: [{clamp(),clamp()}].
depthRangeArrayv(First,V) ->
- cast(5849, <<First:?GLuint,0:32,(length(V)):?GLuint,0:32,
+ VLen = length(V),
+ cast(5850, <<First:?GLuint,0:32,VLen:?GLuint,0:32,
(<< <<V1:?GLclampd,V2:?GLclampd>> || {V1,V2} <- V>>)/binary>>).
%% @doc glDepthRangeIndexe
@@ -16308,48 +16451,50 @@ depthRangeArrayv(First,V) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDepthRangeIndexe.xml">external</a> documentation.
-spec depthRangeIndexed(Index, N, F) -> 'ok' when Index :: integer(),N :: clamp(),F :: clamp().
depthRangeIndexed(Index,N,F) ->
- cast(5850, <<Index:?GLuint,0:32,N:?GLclampd,F:?GLclampd>>).
+ cast(5851, <<Index:?GLuint,0:32,N:?GLclampd,F:?GLclampd>>).
%% @doc
%% See {@link getBooleanv/1}
-spec getFloati_v(Target, Index) -> [float()] when Target :: enum(),Index :: integer().
getFloati_v(Target,Index) ->
- call(5851, <<Target:?GLenum,Index:?GLuint>>).
+ call(5852, <<Target:?GLenum,Index:?GLuint>>).
%% @doc
%% See {@link getBooleanv/1}
-spec getDoublei_v(Target, Index) -> [float()] when Target :: enum(),Index :: integer().
getDoublei_v(Target,Index) ->
- call(5852, <<Target:?GLenum,Index:?GLuint>>).
+ call(5853, <<Target:?GLenum,Index:?GLuint>>).
%% @doc glDebugMessageControlARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDebugMessageControlARB.xml">external</a> documentation.
-spec debugMessageControlARB(Source, Type, Severity, Ids, Enabled) -> 'ok' when Source :: enum(),Type :: enum(),Severity :: enum(),Ids :: [integer()],Enabled :: 0|1.
debugMessageControlARB(Source,Type,Severity,Ids,Enabled) ->
- cast(5853, <<Source:?GLenum,Type:?GLenum,Severity:?GLenum,(length(Ids)):?GLuint,
- (<< <<C:?GLuint>> || C <- Ids>>)/binary,0:(((length(Ids)) rem 2)*32),Enabled:?GLboolean>>).
+ IdsLen = length(Ids),
+ cast(5854, <<Source:?GLenum,Type:?GLenum,Severity:?GLenum,IdsLen:?GLuint,
+ (<< <<C:?GLuint>> || C <- Ids>>)/binary,0:(((IdsLen) rem 2)*32),Enabled:?GLboolean>>).
%% @doc glDebugMessageInsertARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDebugMessageInsertARB.xml">external</a> documentation.
-spec debugMessageInsertARB(Source, Type, Id, Severity, Buf) -> 'ok' when Source :: enum(),Type :: enum(),Id :: integer(),Severity :: enum(),Buf :: string().
debugMessageInsertARB(Source,Type,Id,Severity,Buf) ->
- cast(5854, <<Source:?GLenum,Type:?GLenum,Id:?GLuint,Severity:?GLenum,(list_to_binary([Buf|[0]]))/binary,0:((8-((length(Buf)+ 1) rem 8)) rem 8)>>).
+ BufLen = length(Buf),
+ cast(5855, <<Source:?GLenum,Type:?GLenum,Id:?GLuint,Severity:?GLenum,(list_to_binary([Buf|[0]]))/binary,0:((8-((BufLen+ 1) rem 8)) rem 8)>>).
%% @doc glGetDebugMessageLogARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetDebugMessageLogARB.xml">external</a> documentation.
-spec getDebugMessageLogARB(Count, Bufsize) -> {integer(),Sources :: [enum()],Types :: [enum()],Ids :: [integer()],Severities :: [enum()],MessageLog :: [string()]} when Count :: integer(),Bufsize :: integer().
getDebugMessageLogARB(Count,Bufsize) ->
- call(5855, <<Count:?GLuint,Bufsize:?GLsizei>>).
+ call(5856, <<Count:?GLuint,Bufsize:?GLsizei>>).
%% @doc glGetGraphicsResetStatusARB
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetGraphicsResetStatusARB.xml">external</a> documentation.
-spec getGraphicsResetStatusARB() -> enum().
getGraphicsResetStatusARB() ->
- call(5856, <<>>).
+ call(5857, <<>>).
%% @doc Draw multiple instances of a range of elements with offset applied to instanced attributes
%%
@@ -16372,7 +16517,7 @@ getGraphicsResetStatusARB() ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawArraysInstancedBaseInstance.xml">external</a> documentation.
-spec drawArraysInstancedBaseInstance(Mode, First, Count, Primcount, Baseinstance) -> 'ok' when Mode :: enum(),First :: integer(),Count :: integer(),Primcount :: integer(),Baseinstance :: integer().
drawArraysInstancedBaseInstance(Mode,First,Count,Primcount,Baseinstance) ->
- cast(5857, <<Mode:?GLenum,First:?GLint,Count:?GLsizei,Primcount:?GLsizei,Baseinstance:?GLuint>>).
+ cast(5858, <<Mode:?GLenum,First:?GLint,Count:?GLsizei,Primcount:?GLsizei,Baseinstance:?GLuint>>).
%% @doc Draw multiple instances of a set of elements with offset applied to instanced attributes
%%
@@ -16395,10 +16540,10 @@ drawArraysInstancedBaseInstance(Mode,First,Count,Primcount,Baseinstance) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawElementsInstancedBaseInstance.xml">external</a> documentation.
-spec drawElementsInstancedBaseInstance(Mode, Count, Type, Indices, Primcount, Baseinstance) -> 'ok' when Mode :: enum(),Count :: integer(),Type :: enum(),Indices :: offset()|mem(),Primcount :: integer(),Baseinstance :: integer().
drawElementsInstancedBaseInstance(Mode,Count,Type,Indices,Primcount,Baseinstance) when is_integer(Indices) ->
- cast(5858, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Primcount:?GLsizei,Baseinstance:?GLuint>>);
+ cast(5859, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Primcount:?GLsizei,Baseinstance:?GLuint>>);
drawElementsInstancedBaseInstance(Mode,Count,Type,Indices,Primcount,Baseinstance) ->
send_bin(Indices),
- cast(5859, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Primcount:?GLsizei,Baseinstance:?GLuint>>).
+ cast(5860, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Primcount:?GLsizei,Baseinstance:?GLuint>>).
%% @doc Render multiple instances of a set of primitives from array data with a per-element offset
%%
@@ -16419,31 +16564,31 @@ drawElementsInstancedBaseInstance(Mode,Count,Type,Indices,Primcount,Baseinstance
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawElementsInstancedBaseVertexBaseInstance.xml">external</a> documentation.
-spec drawElementsInstancedBaseVertexBaseInstance(Mode, Count, Type, Indices, Primcount, Basevertex, Baseinstance) -> 'ok' when Mode :: enum(),Count :: integer(),Type :: enum(),Indices :: offset()|mem(),Primcount :: integer(),Basevertex :: integer(),Baseinstance :: integer().
drawElementsInstancedBaseVertexBaseInstance(Mode,Count,Type,Indices,Primcount,Basevertex,Baseinstance) when is_integer(Indices) ->
- cast(5860, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Primcount:?GLsizei,Basevertex:?GLint,Baseinstance:?GLuint>>);
+ cast(5861, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Indices:?GLuint,Primcount:?GLsizei,Basevertex:?GLint,Baseinstance:?GLuint>>);
drawElementsInstancedBaseVertexBaseInstance(Mode,Count,Type,Indices,Primcount,Basevertex,Baseinstance) ->
send_bin(Indices),
- cast(5861, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Primcount:?GLsizei,Basevertex:?GLint,Baseinstance:?GLuint>>).
+ cast(5862, <<Mode:?GLenum,Count:?GLsizei,Type:?GLenum,Primcount:?GLsizei,Basevertex:?GLint,Baseinstance:?GLuint>>).
%% @doc glDrawTransformFeedbackInstance
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawTransformFeedbackInstance.xml">external</a> documentation.
-spec drawTransformFeedbackInstanced(Mode, Id, Primcount) -> 'ok' when Mode :: enum(),Id :: integer(),Primcount :: integer().
drawTransformFeedbackInstanced(Mode,Id,Primcount) ->
- cast(5862, <<Mode:?GLenum,Id:?GLuint,Primcount:?GLsizei>>).
+ cast(5863, <<Mode:?GLenum,Id:?GLuint,Primcount:?GLsizei>>).
%% @doc glDrawTransformFeedbackStreamInstance
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDrawTransformFeedbackStreamInstance.xml">external</a> documentation.
-spec drawTransformFeedbackStreamInstanced(Mode, Id, Stream, Primcount) -> 'ok' when Mode :: enum(),Id :: integer(),Stream :: integer(),Primcount :: integer().
drawTransformFeedbackStreamInstanced(Mode,Id,Stream,Primcount) ->
- cast(5863, <<Mode:?GLenum,Id:?GLuint,Stream:?GLuint,Primcount:?GLsizei>>).
+ cast(5864, <<Mode:?GLenum,Id:?GLuint,Stream:?GLuint,Primcount:?GLsizei>>).
%% @doc glGetInternalformat
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glGetInternalformat.xml">external</a> documentation.
-spec getInternalformativ(Target, Internalformat, Pname, BufSize) -> [integer()] when Target :: enum(),Internalformat :: enum(),Pname :: enum(),BufSize :: integer().
getInternalformativ(Target,Internalformat,Pname,BufSize) ->
- call(5864, <<Target:?GLenum,Internalformat:?GLenum,Pname:?GLenum,BufSize:?GLsizei>>).
+ call(5865, <<Target:?GLenum,Internalformat:?GLenum,Pname:?GLenum,BufSize:?GLsizei>>).
%% @doc Bind a level of a texture to an image unit
%%
@@ -16505,7 +16650,7 @@ getInternalformativ(Target,Internalformat,Pname,BufSize) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glBindImageTexture.xml">external</a> documentation.
-spec bindImageTexture(Unit, Texture, Level, Layered, Layer, Access, Format) -> 'ok' when Unit :: integer(),Texture :: integer(),Level :: integer(),Layered :: 0|1,Layer :: integer(),Access :: enum(),Format :: enum().
bindImageTexture(Unit,Texture,Level,Layered,Layer,Access,Format) ->
- cast(5865, <<Unit:?GLuint,Texture:?GLuint,Level:?GLint,Layered:?GLboolean,0:24,Layer:?GLint,Access:?GLenum,Format:?GLenum>>).
+ cast(5866, <<Unit:?GLuint,Texture:?GLuint,Level:?GLint,Layered:?GLboolean,0:24,Layer:?GLint,Access:?GLenum,Format:?GLenum>>).
%% @doc Defines a barrier ordering memory transactions
%%
@@ -16632,7 +16777,7 @@ bindImageTexture(Unit,Texture,Level,Layered,Layer,Access,Format) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glMemoryBarrier.xml">external</a> documentation.
-spec memoryBarrier(Barriers) -> 'ok' when Barriers :: integer().
memoryBarrier(Barriers) ->
- cast(5866, <<Barriers:?GLbitfield>>).
+ cast(5867, <<Barriers:?GLbitfield>>).
%% @doc Simultaneously specify storage for all levels of a one-dimensional texture
%%
@@ -16665,7 +16810,7 @@ memoryBarrier(Barriers) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glTexStorage1D.xml">external</a> documentation.
-spec texStorage1D(Target, Levels, Internalformat, Width) -> 'ok' when Target :: enum(),Levels :: integer(),Internalformat :: enum(),Width :: integer().
texStorage1D(Target,Levels,Internalformat,Width) ->
- cast(5867, <<Target:?GLenum,Levels:?GLsizei,Internalformat:?GLenum,Width:?GLsizei>>).
+ cast(5868, <<Target:?GLenum,Levels:?GLsizei,Internalformat:?GLenum,Width:?GLsizei>>).
%% @doc Simultaneously specify storage for all levels of a two-dimensional or one-dimensional array texture
%%
@@ -16710,7 +16855,7 @@ texStorage1D(Target,Levels,Internalformat,Width) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glTexStorage2D.xml">external</a> documentation.
-spec texStorage2D(Target, Levels, Internalformat, Width, Height) -> 'ok' when Target :: enum(),Levels :: integer(),Internalformat :: enum(),Width :: integer(),Height :: integer().
texStorage2D(Target,Levels,Internalformat,Width,Height) ->
- cast(5868, <<Target:?GLenum,Levels:?GLsizei,Internalformat:?GLenum,Width:?GLsizei,Height:?GLsizei>>).
+ cast(5869, <<Target:?GLenum,Levels:?GLsizei,Internalformat:?GLenum,Width:?GLsizei,Height:?GLsizei>>).
%% @doc Simultaneously specify storage for all levels of a three-dimensional, two-dimensional array or cube-map array texture
%%
@@ -16753,19 +16898,19 @@ texStorage2D(Target,Levels,Internalformat,Width,Height) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glTexStorage3D.xml">external</a> documentation.
-spec texStorage3D(Target, Levels, Internalformat, Width, Height, Depth) -> 'ok' when Target :: enum(),Levels :: integer(),Internalformat :: enum(),Width :: integer(),Height :: integer(),Depth :: integer().
texStorage3D(Target,Levels,Internalformat,Width,Height,Depth) ->
- cast(5869, <<Target:?GLenum,Levels:?GLsizei,Internalformat:?GLenum,Width:?GLsizei,Height:?GLsizei,Depth:?GLsizei>>).
+ cast(5870, <<Target:?GLenum,Levels:?GLsizei,Internalformat:?GLenum,Width:?GLsizei,Height:?GLsizei,Depth:?GLsizei>>).
%% @doc glDepthBoundsEXT
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glDepthBoundsEXT.xml">external</a> documentation.
-spec depthBoundsEXT(Zmin, Zmax) -> 'ok' when Zmin :: clamp(),Zmax :: clamp().
depthBoundsEXT(Zmin,Zmax) ->
- cast(5870, <<Zmin:?GLclampd,Zmax:?GLclampd>>).
+ cast(5871, <<Zmin:?GLclampd,Zmax:?GLclampd>>).
%% @doc glStencilClearTagEXT
%%
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/glStencilClearTagEXT.xml">external</a> documentation.
-spec stencilClearTagEXT(StencilTagBits, StencilClearTag) -> 'ok' when StencilTagBits :: integer(),StencilClearTag :: integer().
stencilClearTagEXT(StencilTagBits,StencilClearTag) ->
- cast(5871, <<StencilTagBits:?GLsizei,StencilClearTag:?GLuint>>).
+ cast(5872, <<StencilTagBits:?GLsizei,StencilClearTag:?GLuint>>).
diff --git a/lib/wx/src/gen/glu.erl b/lib/wx/src/gen/glu.erl
index 47d9a83999..f641f41262 100644
--- a/lib/wx/src/gen/glu.erl
+++ b/lib/wx/src/gen/glu.erl
@@ -334,7 +334,9 @@ build3DMipmaps(Target,InternalFormat,Width,Height,Depth,Format,Type,Data) ->
%% See <a href="http://www.opengl.org/sdk/docs/man/xhtml/gluCheckExtension.xml">external</a> documentation.
-spec checkExtension(ExtName, ExtString) -> 0|1 when ExtName :: string(),ExtString :: string().
checkExtension(ExtName,ExtString) ->
- call(5016, <<(list_to_binary([ExtName|[0]]))/binary,0:((8-((length(ExtName)+ 1) rem 8)) rem 8),(list_to_binary([ExtString|[0]]))/binary,0:((8-((length(ExtString)+ 1) rem 8)) rem 8)>>).
+ ExtNameLen = length(ExtName),
+ ExtStringLen = length(ExtString),
+ call(5016, <<(list_to_binary([ExtName|[0]]))/binary,0:((8-((ExtNameLen+ 1) rem 8)) rem 8),(list_to_binary([ExtString|[0]]))/binary,0:((8-((ExtStringLen+ 1) rem 8)) rem 8)>>).
%% @doc Draw a cylinder
%%
diff --git a/lib/wx/src/gen/wxAuiNotebook.erl b/lib/wx/src/gen/wxAuiNotebook.erl
index 5d47bc8d6c..adb90c224f 100644
--- a/lib/wx/src/gen/wxAuiNotebook.erl
+++ b/lib/wx/src/gen/wxAuiNotebook.erl
@@ -45,8 +45,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxBitmapButton.erl b/lib/wx/src/gen/wxBitmapButton.erl
index 20d47eb4cd..d0a810bdb9 100644
--- a/lib/wx/src/gen/wxBitmapButton.erl
+++ b/lib/wx/src/gen/wxBitmapButton.erl
@@ -44,8 +44,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -231,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).
diff --git a/lib/wx/src/gen/wxButton.erl b/lib/wx/src/gen/wxButton.erl
index f16e1a376e..f8e24beffa 100644
--- a/lib/wx/src/gen/wxButton.erl
+++ b/lib/wx/src/gen/wxButton.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxCalendarCtrl.erl b/lib/wx/src/gen/wxCalendarCtrl.erl
index 3d3f3ae242..bf033e9bc0 100644
--- a/lib/wx/src/gen/wxCalendarCtrl.erl
+++ b/lib/wx/src/gen/wxCalendarCtrl.erl
@@ -46,8 +46,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxCheckBox.erl b/lib/wx/src/gen/wxCheckBox.erl
index 294831c3a6..5ed49d91b6 100644
--- a/lib/wx/src/gen/wxCheckBox.erl
+++ b/lib/wx/src/gen/wxCheckBox.erl
@@ -43,8 +43,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxCheckListBox.erl b/lib/wx/src/gen/wxCheckListBox.erl
index 758e929696..ddef6a29e2 100644
--- a/lib/wx/src/gen/wxCheckListBox.erl
+++ b/lib/wx/src/gen/wxCheckListBox.erl
@@ -45,24 +45,24 @@
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,getSelections/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,hitTest/2,inheritAttributes/1,initDialog/1,insert/3,insert/4,
- insertItems/3,invalidateBestSize/1,isDoubleBuffered/1,isEmpty/1,isEnabled/1,
- isExposed/2,isExposed/3,isExposed/5,isRetained/1,isSelected/2,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,set/2,setAcceleratorTable/2,
+ 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,
+ getWindowStyleFlag/1,getWindowVariant/1,hasCapture/1,hasScrollbar/2,
+ hasTransparentBackground/1,hide/1,hitTest/2,inheritAttributes/1,initDialog/1,
+ insert/3,insert/4,insertItems/3,invalidateBestSize/1,isDoubleBuffered/1,
+ isEmpty/1,isEnabled/1,isExposed/2,isExposed/3,isExposed/5,isRetained/1,
+ isSelected/2,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,set/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,setFirstItem/2,
@@ -223,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).
diff --git a/lib/wx/src/gen/wxChoice.erl b/lib/wx/src/gen/wxChoice.erl
index 2ce8935895..266a257442 100644
--- a/lib/wx/src/gen/wxChoice.erl
+++ b/lib/wx/src/gen/wxChoice.erl
@@ -44,36 +44,37 @@
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,
+ 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).
diff --git a/lib/wx/src/gen/wxChoicebook.erl b/lib/wx/src/gen/wxChoicebook.erl
index 61ba0fe47f..c6e0941978 100644
--- a/lib/wx/src/gen/wxChoicebook.erl
+++ b/lib/wx/src/gen/wxChoicebook.erl
@@ -46,8 +46,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxColourDialog.erl b/lib/wx/src/gen/wxColourDialog.erl
index 5b8d9f08d5..936c0e5099 100644
--- a/lib/wx/src/gen/wxColourDialog.erl
+++ b/lib/wx/src/gen/wxColourDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxColourPickerCtrl.erl b/lib/wx/src/gen/wxColourPickerCtrl.erl
index 2fe55018dc..c97b194bc8 100644
--- a/lib/wx/src/gen/wxColourPickerCtrl.erl
+++ b/lib/wx/src/gen/wxColourPickerCtrl.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -222,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).
diff --git a/lib/wx/src/gen/wxComboBox.erl b/lib/wx/src/gen/wxComboBox.erl
index 3de2721f38..9f8cf77445 100644
--- a/lib/wx/src/gen/wxComboBox.erl
+++ b/lib/wx/src/gen/wxComboBox.erl
@@ -46,38 +46,38 @@
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]).
+ 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
@@ -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).
diff --git a/lib/wx/src/gen/wxControl.erl b/lib/wx/src/gen/wxControl.erl
index df911b0758..6be7574d80 100644
--- a/lib/wx/src/gen/wxControl.erl
+++ b/lib/wx/src/gen/wxControl.erl
@@ -40,8 +40,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxControlWithItems.erl b/lib/wx/src/gen/wxControlWithItems.erl
index 9c9769b5e3..47ffa7dcba 100644
--- a/lib/wx/src/gen/wxControlWithItems.erl
+++ b/lib/wx/src/gen/wxControlWithItems.erl
@@ -44,8 +44,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxDatePickerCtrl.erl b/lib/wx/src/gen/wxDatePickerCtrl.erl
index 8f1af26cbc..743169c58e 100644
--- a/lib/wx/src/gen/wxDatePickerCtrl.erl
+++ b/lib/wx/src/gen/wxDatePickerCtrl.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -198,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).
diff --git a/lib/wx/src/gen/wxDialog.erl b/lib/wx/src/gen/wxDialog.erl
index 178efde5c6..72f37df178 100644
--- a/lib/wx/src/gen/wxDialog.erl
+++ b/lib/wx/src/gen/wxDialog.erl
@@ -44,8 +44,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxDirDialog.erl b/lib/wx/src/gen/wxDirDialog.erl
index c942116fd9..5a2df9821a 100644
--- a/lib/wx/src/gen/wxDirDialog.erl
+++ b/lib/wx/src/gen/wxDirDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxDirPickerCtrl.erl b/lib/wx/src/gen/wxDirPickerCtrl.erl
index 014e90c120..9bfff7d458 100644
--- a/lib/wx/src/gen/wxDirPickerCtrl.erl
+++ b/lib/wx/src/gen/wxDirPickerCtrl.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -215,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).
diff --git a/lib/wx/src/gen/wxFileDialog.erl b/lib/wx/src/gen/wxFileDialog.erl
index de5d436c11..6032e38a16 100644
--- a/lib/wx/src/gen/wxFileDialog.erl
+++ b/lib/wx/src/gen/wxFileDialog.erl
@@ -46,8 +46,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxFilePickerCtrl.erl b/lib/wx/src/gen/wxFilePickerCtrl.erl
index 24941ad87a..3b1943cbee 100644
--- a/lib/wx/src/gen/wxFilePickerCtrl.erl
+++ b/lib/wx/src/gen/wxFilePickerCtrl.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -219,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).
diff --git a/lib/wx/src/gen/wxFindReplaceDialog.erl b/lib/wx/src/gen/wxFindReplaceDialog.erl
index b5cd3350d2..9250c2fa2f 100644
--- a/lib/wx/src/gen/wxFindReplaceDialog.erl
+++ b/lib/wx/src/gen/wxFindReplaceDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxFontDialog.erl b/lib/wx/src/gen/wxFontDialog.erl
index c0ddb9439e..26010aa46b 100644
--- a/lib/wx/src/gen/wxFontDialog.erl
+++ b/lib/wx/src/gen/wxFontDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxFontPickerCtrl.erl b/lib/wx/src/gen/wxFontPickerCtrl.erl
index f87dcd2344..d1234c5589 100644
--- a/lib/wx/src/gen/wxFontPickerCtrl.erl
+++ b/lib/wx/src/gen/wxFontPickerCtrl.erl
@@ -43,8 +43,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -228,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).
diff --git a/lib/wx/src/gen/wxFrame.erl b/lib/wx/src/gen/wxFrame.erl
index 3e33f650d1..1dc6106bfa 100644
--- a/lib/wx/src/gen/wxFrame.erl
+++ b/lib/wx/src/gen/wxFrame.erl
@@ -46,8 +46,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxGLCanvas.erl b/lib/wx/src/gen/wxGLCanvas.erl
index b31488de4c..8a94d1df26 100644
--- a/lib/wx/src/gen/wxGLCanvas.erl
+++ b/lib/wx/src/gen/wxGLCanvas.erl
@@ -40,8 +40,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxGauge.erl b/lib/wx/src/gen/wxGauge.erl
index a66b98d110..40f7f120b0 100644
--- a/lib/wx/src/gen/wxGauge.erl
+++ b/lib/wx/src/gen/wxGauge.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxGenericDirCtrl.erl b/lib/wx/src/gen/wxGenericDirCtrl.erl
index 3c13e09359..383d592269 100644
--- a/lib/wx/src/gen/wxGenericDirCtrl.erl
+++ b/lib/wx/src/gen/wxGenericDirCtrl.erl
@@ -44,8 +44,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxGrid.erl b/lib/wx/src/gen/wxGrid.erl
index 0cdb37e9e4..b8c94ab555 100644
--- a/lib/wx/src/gen/wxGrid.erl
+++ b/lib/wx/src/gen/wxGrid.erl
@@ -94,34 +94,34 @@
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,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,
@@ -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).
diff --git a/lib/wx/src/gen/wxHtmlWindow.erl b/lib/wx/src/gen/wxHtmlWindow.erl
index c8a3ed5188..7e3906b9a9 100644
--- a/lib/wx/src/gen/wxHtmlWindow.erl
+++ b/lib/wx/src/gen/wxHtmlWindow.erl
@@ -48,34 +48,34 @@
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,
@@ -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).
diff --git a/lib/wx/src/gen/wxListBox.erl b/lib/wx/src/gen/wxListBox.erl
index e1c96f2501..86d8d41f36 100644
--- a/lib/wx/src/gen/wxListBox.erl
+++ b/lib/wx/src/gen/wxListBox.erl
@@ -44,36 +44,37 @@
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,
+ 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]).
@@ -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).
diff --git a/lib/wx/src/gen/wxListCtrl.erl b/lib/wx/src/gen/wxListCtrl.erl
index 0c2e9d0d0a..10dc76f276 100644
--- a/lib/wx/src/gen/wxListCtrl.erl
+++ b/lib/wx/src/gen/wxListCtrl.erl
@@ -55,8 +55,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxListView.erl b/lib/wx/src/gen/wxListView.erl
index b2865ff7c6..adba629d5a 100644
--- a/lib/wx/src/gen/wxListView.erl
+++ b/lib/wx/src/gen/wxListView.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxListbook.erl b/lib/wx/src/gen/wxListbook.erl
index d27efb2500..e2ea559587 100644
--- a/lib/wx/src/gen/wxListbook.erl
+++ b/lib/wx/src/gen/wxListbook.erl
@@ -46,8 +46,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxMDIChildFrame.erl b/lib/wx/src/gen/wxMDIChildFrame.erl
index 6ff47259b4..0d388c016a 100644
--- a/lib/wx/src/gen/wxMDIChildFrame.erl
+++ b/lib/wx/src/gen/wxMDIChildFrame.erl
@@ -45,42 +45,42 @@
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,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]).
+ 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
@@ -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).
diff --git a/lib/wx/src/gen/wxMDIClientWindow.erl b/lib/wx/src/gen/wxMDIClientWindow.erl
index a97b8ab49d..4fc080c64d 100644
--- a/lib/wx/src/gen/wxMDIClientWindow.erl
+++ b/lib/wx/src/gen/wxMDIClientWindow.erl
@@ -40,8 +40,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxMDIParentFrame.erl b/lib/wx/src/gen/wxMDIParentFrame.erl
index f4d06a2658..59f24a1b40 100644
--- a/lib/wx/src/gen/wxMDIParentFrame.erl
+++ b/lib/wx/src/gen/wxMDIParentFrame.erl
@@ -46,24 +46,25 @@
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,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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxMenuBar.erl b/lib/wx/src/gen/wxMenuBar.erl
index bb976fd0ba..fa613c9f3b 100644
--- a/lib/wx/src/gen/wxMenuBar.erl
+++ b/lib/wx/src/gen/wxMenuBar.erl
@@ -44,23 +44,24 @@
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,
- 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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxMessageDialog.erl b/lib/wx/src/gen/wxMessageDialog.erl
index 46a832198c..a63f66741b 100644
--- a/lib/wx/src/gen/wxMessageDialog.erl
+++ b/lib/wx/src/gen/wxMessageDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxMiniFrame.erl b/lib/wx/src/gen/wxMiniFrame.erl
index a13ff18d9e..37dc2f2e04 100644
--- a/lib/wx/src/gen/wxMiniFrame.erl
+++ b/lib/wx/src/gen/wxMiniFrame.erl
@@ -44,24 +44,25 @@
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,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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxMultiChoiceDialog.erl b/lib/wx/src/gen/wxMultiChoiceDialog.erl
index 9b3129cf53..eef15d561e 100644
--- a/lib/wx/src/gen/wxMultiChoiceDialog.erl
+++ b/lib/wx/src/gen/wxMultiChoiceDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxNotebook.erl b/lib/wx/src/gen/wxNotebook.erl
index 3a65cf54cd..d7d1b0f87f 100644
--- a/lib/wx/src/gen/wxNotebook.erl
+++ b/lib/wx/src/gen/wxNotebook.erl
@@ -46,8 +46,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxPanel.erl b/lib/wx/src/gen/wxPanel.erl
index 9dcf124575..fc48d569af 100644
--- a/lib/wx/src/gen/wxPanel.erl
+++ b/lib/wx/src/gen/wxPanel.erl
@@ -40,8 +40,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxPasswordEntryDialog.erl b/lib/wx/src/gen/wxPasswordEntryDialog.erl
index 5913834bb8..4667376783 100644
--- a/lib/wx/src/gen/wxPasswordEntryDialog.erl
+++ b/lib/wx/src/gen/wxPasswordEntryDialog.erl
@@ -45,8 +45,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxPickerBase.erl b/lib/wx/src/gen/wxPickerBase.erl
index 50e21c72b3..0ea3a36d33 100644
--- a/lib/wx/src/gen/wxPickerBase.erl
+++ b/lib/wx/src/gen/wxPickerBase.erl
@@ -44,8 +44,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxPopupTransientWindow.erl b/lib/wx/src/gen/wxPopupTransientWindow.erl
index 00f133b952..6ec2fcae62 100644
--- a/lib/wx/src/gen/wxPopupTransientWindow.erl
+++ b/lib/wx/src/gen/wxPopupTransientWindow.erl
@@ -41,8 +41,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -147,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).
diff --git a/lib/wx/src/gen/wxPopupWindow.erl b/lib/wx/src/gen/wxPopupWindow.erl
index e95d447d22..ddf1033841 100644
--- a/lib/wx/src/gen/wxPopupWindow.erl
+++ b/lib/wx/src/gen/wxPopupWindow.erl
@@ -40,8 +40,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxPreviewCanvas.erl b/lib/wx/src/gen/wxPreviewCanvas.erl
index b1c6832aa9..4e869dd6f2 100644
--- a/lib/wx/src/gen/wxPreviewCanvas.erl
+++ b/lib/wx/src/gen/wxPreviewCanvas.erl
@@ -43,34 +43,34 @@
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).
diff --git a/lib/wx/src/gen/wxPreviewControlBar.erl b/lib/wx/src/gen/wxPreviewControlBar.erl
index 46055202c4..cf17f40527 100644
--- a/lib/wx/src/gen/wxPreviewControlBar.erl
+++ b/lib/wx/src/gen/wxPreviewControlBar.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -153,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).
diff --git a/lib/wx/src/gen/wxPreviewFrame.erl b/lib/wx/src/gen/wxPreviewFrame.erl
index f509faa503..022b0cd46e 100644
--- a/lib/wx/src/gen/wxPreviewFrame.erl
+++ b/lib/wx/src/gen/wxPreviewFrame.erl
@@ -45,24 +45,25 @@
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,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,
+ 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).
diff --git a/lib/wx/src/gen/wxPrintDialog.erl b/lib/wx/src/gen/wxPrintDialog.erl
index f41383c829..4024036166 100644
--- a/lib/wx/src/gen/wxPrintDialog.erl
+++ b/lib/wx/src/gen/wxPrintDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxProgressDialog.erl b/lib/wx/src/gen/wxProgressDialog.erl
index cadb8497dd..a17cb0383a 100644
--- a/lib/wx/src/gen/wxProgressDialog.erl
+++ b/lib/wx/src/gen/wxProgressDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxRadioBox.erl b/lib/wx/src/gen/wxRadioBox.erl
index 34e7f038ec..13d3a496ac 100644
--- a/lib/wx/src/gen/wxRadioBox.erl
+++ b/lib/wx/src/gen/wxRadioBox.erl
@@ -44,26 +44,26 @@
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,
- 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,
+ 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,
@@ -349,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).
diff --git a/lib/wx/src/gen/wxRadioButton.erl b/lib/wx/src/gen/wxRadioButton.erl
index f90afc82a5..b5635e8afe 100644
--- a/lib/wx/src/gen/wxRadioButton.erl
+++ b/lib/wx/src/gen/wxRadioButton.erl
@@ -41,8 +41,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxSashLayoutWindow.erl b/lib/wx/src/gen/wxSashLayoutWindow.erl
index 6c0c0a389f..a0e240b25d 100644
--- a/lib/wx/src/gen/wxSashLayoutWindow.erl
+++ b/lib/wx/src/gen/wxSashLayoutWindow.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -221,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).
diff --git a/lib/wx/src/gen/wxSashWindow.erl b/lib/wx/src/gen/wxSashWindow.erl
index b39e00fce2..5e66d79b11 100644
--- a/lib/wx/src/gen/wxSashWindow.erl
+++ b/lib/wx/src/gen/wxSashWindow.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxScrollBar.erl b/lib/wx/src/gen/wxScrollBar.erl
index 392c7af7a4..a1138725cd 100644
--- a/lib/wx/src/gen/wxScrollBar.erl
+++ b/lib/wx/src/gen/wxScrollBar.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxScrolledWindow.erl b/lib/wx/src/gen/wxScrolledWindow.erl
index 271c7f5c5a..e3f6122cfa 100644
--- a/lib/wx/src/gen/wxScrolledWindow.erl
+++ b/lib/wx/src/gen/wxScrolledWindow.erl
@@ -44,8 +44,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -260,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).
diff --git a/lib/wx/src/gen/wxSingleChoiceDialog.erl b/lib/wx/src/gen/wxSingleChoiceDialog.erl
index d5e4977abc..8b2991da4d 100644
--- a/lib/wx/src/gen/wxSingleChoiceDialog.erl
+++ b/lib/wx/src/gen/wxSingleChoiceDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxSlider.erl b/lib/wx/src/gen/wxSlider.erl
index 81a49d3506..7bdff00589 100644
--- a/lib/wx/src/gen/wxSlider.erl
+++ b/lib/wx/src/gen/wxSlider.erl
@@ -43,8 +43,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxSpinButton.erl b/lib/wx/src/gen/wxSpinButton.erl
index e555875eb4..6c24176974 100644
--- a/lib/wx/src/gen/wxSpinButton.erl
+++ b/lib/wx/src/gen/wxSpinButton.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxSpinCtrl.erl b/lib/wx/src/gen/wxSpinCtrl.erl
index a1d359b117..c229b4caf1 100644
--- a/lib/wx/src/gen/wxSpinCtrl.erl
+++ b/lib/wx/src/gen/wxSpinCtrl.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxSplashScreen.erl b/lib/wx/src/gen/wxSplashScreen.erl
index 68eeb40f73..9729b3529b 100644
--- a/lib/wx/src/gen/wxSplashScreen.erl
+++ b/lib/wx/src/gen/wxSplashScreen.erl
@@ -44,24 +44,25 @@
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,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,
+ 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).
diff --git a/lib/wx/src/gen/wxSplitterWindow.erl b/lib/wx/src/gen/wxSplitterWindow.erl
index aeda0daa6e..fb2f355f43 100644
--- a/lib/wx/src/gen/wxSplitterWindow.erl
+++ b/lib/wx/src/gen/wxSplitterWindow.erl
@@ -45,8 +45,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxStaticBitmap.erl b/lib/wx/src/gen/wxStaticBitmap.erl
index 9a46e3125e..64d8cc4364 100644
--- a/lib/wx/src/gen/wxStaticBitmap.erl
+++ b/lib/wx/src/gen/wxStaticBitmap.erl
@@ -41,8 +41,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxStaticBox.erl b/lib/wx/src/gen/wxStaticBox.erl
index 8a789d2d62..728c02e9e4 100644
--- a/lib/wx/src/gen/wxStaticBox.erl
+++ b/lib/wx/src/gen/wxStaticBox.erl
@@ -41,8 +41,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxStaticLine.erl b/lib/wx/src/gen/wxStaticLine.erl
index b31743eb03..3c648b7746 100644
--- a/lib/wx/src/gen/wxStaticLine.erl
+++ b/lib/wx/src/gen/wxStaticLine.erl
@@ -42,8 +42,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxStaticText.erl b/lib/wx/src/gen/wxStaticText.erl
index 83e83305fb..34216f975f 100644
--- a/lib/wx/src/gen/wxStaticText.erl
+++ b/lib/wx/src/gen/wxStaticText.erl
@@ -41,8 +41,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxStatusBar.erl b/lib/wx/src/gen/wxStatusBar.erl
index db86136f5a..8d9f77c209 100644
--- a/lib/wx/src/gen/wxStatusBar.erl
+++ b/lib/wx/src/gen/wxStatusBar.erl
@@ -43,8 +43,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxStyledTextCtrl.erl b/lib/wx/src/gen/wxStyledTextCtrl.erl
index c684141224..7e45245a72 100644
--- a/lib/wx/src/gen/wxStyledTextCtrl.erl
+++ b/lib/wx/src/gen/wxStyledTextCtrl.erl
@@ -143,8 +143,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -4079,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).
diff --git a/lib/wx/src/gen/wxTextCtrl.erl b/lib/wx/src/gen/wxTextCtrl.erl
index 7ffb161cf5..3acc61ce02 100644
--- a/lib/wx/src/gen/wxTextCtrl.erl
+++ b/lib/wx/src/gen/wxTextCtrl.erl
@@ -49,8 +49,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxTextEntryDialog.erl b/lib/wx/src/gen/wxTextEntryDialog.erl
index d0b55fd769..c43a2d12b8 100644
--- a/lib/wx/src/gen/wxTextEntryDialog.erl
+++ b/lib/wx/src/gen/wxTextEntryDialog.erl
@@ -44,8 +44,8 @@
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,
+ 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,
@@ -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).
diff --git a/lib/wx/src/gen/wxToggleButton.erl b/lib/wx/src/gen/wxToggleButton.erl
index 6a41cef9ae..b82ff4fe68 100644
--- a/lib/wx/src/gen/wxToggleButton.erl
+++ b/lib/wx/src/gen/wxToggleButton.erl
@@ -41,8 +41,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxToolBar.erl b/lib/wx/src/gen/wxToolBar.erl
index a3d337ef59..e2835bf7c4 100644
--- a/lib/wx/src/gen/wxToolBar.erl
+++ b/lib/wx/src/gen/wxToolBar.erl
@@ -50,8 +50,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxToolbook.erl b/lib/wx/src/gen/wxToolbook.erl
index 787d4a468e..c22719680c 100644
--- a/lib/wx/src/gen/wxToolbook.erl
+++ b/lib/wx/src/gen/wxToolbook.erl
@@ -46,8 +46,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxTopLevelWindow.erl b/lib/wx/src/gen/wxTopLevelWindow.erl
index 96135052bc..64713099f6 100644
--- a/lib/wx/src/gen/wxTopLevelWindow.erl
+++ b/lib/wx/src/gen/wxTopLevelWindow.erl
@@ -44,8 +44,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxTreeCtrl.erl b/lib/wx/src/gen/wxTreeCtrl.erl
index 68ea754bef..373cb4c77f 100644
--- a/lib/wx/src/gen/wxTreeCtrl.erl
+++ b/lib/wx/src/gen/wxTreeCtrl.erl
@@ -62,8 +62,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxTreebook.erl b/lib/wx/src/gen/wxTreebook.erl
index 956652f221..dc95730224 100644
--- a/lib/wx/src/gen/wxTreebook.erl
+++ b/lib/wx/src/gen/wxTreebook.erl
@@ -47,8 +47,8 @@
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,getCursor/1,getDropTarget/1,
- getEventHandler/1,getExtraStyle/1,getFont/1,getForegroundColour/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,
@@ -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).
diff --git a/lib/wx/src/gen/wxWindow.erl b/lib/wx/src/gen/wxWindow.erl
index be847861b1..9ace4533c8 100644
--- a/lib/wx/src/gen/wxWindow.erl
+++ b/lib/wx/src/gen/wxWindow.erl
@@ -37,26 +37,27 @@
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,
+ 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,
@@ -1953,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/wxe_debug.hrl b/lib/wx/src/gen/wxe_debug.hrl
index d3314f03a9..58cb5298e6 100644
--- a/lib/wx/src/gen/wxe_debug.hrl
+++ b/lib/wx/src/gen/wxe_debug.hrl
@@ -197,3185 +197,3186 @@ wxdebug_table() ->
{286, {wxWindow, canSetTransparent, 0}},
{287, {wxWindow, isDoubleBuffered, 0}},
{288, {wxWindow, setDoubleBuffered, 1}},
- {289, {wxTopLevelWindow, getIcon, 0}},
- {290, {wxTopLevelWindow, getIcons, 0}},
- {291, {wxTopLevelWindow, getTitle, 0}},
- {292, {wxTopLevelWindow, isActive, 0}},
- {293, {wxTopLevelWindow, iconize, 1}},
- {294, {wxTopLevelWindow, isFullScreen, 0}},
- {295, {wxTopLevelWindow, isIconized, 0}},
- {296, {wxTopLevelWindow, isMaximized, 0}},
- {297, {wxTopLevelWindow, maximize, 1}},
- {298, {wxTopLevelWindow, requestUserAttention, 1}},
- {299, {wxTopLevelWindow, setIcon, 1}},
- {300, {wxTopLevelWindow, setIcons, 1}},
- {301, {wxTopLevelWindow, centerOnScreen, 1}},
- {302, {wxTopLevelWindow, centreOnScreen, 1}},
- {304, {wxTopLevelWindow, setShape, 1}},
- {305, {wxTopLevelWindow, setTitle, 1}},
- {306, {wxTopLevelWindow, showFullScreen, 2}},
- {308, {wxFrame, new_4, 4}},
- {309, {wxFrame, new_0, 0}},
- {311, {wxFrame, destruct, 0}},
- {312, {wxFrame, create, 4}},
- {313, {wxFrame, createStatusBar, 1}},
- {314, {wxFrame, createToolBar, 1}},
- {315, {wxFrame, getClientAreaOrigin, 0}},
- {316, {wxFrame, getMenuBar, 0}},
- {317, {wxFrame, getStatusBar, 0}},
- {318, {wxFrame, getStatusBarPane, 0}},
- {319, {wxFrame, getToolBar, 0}},
- {320, {wxFrame, processCommand, 1}},
- {321, {wxFrame, sendSizeEvent, 0}},
- {322, {wxFrame, setMenuBar, 1}},
- {323, {wxFrame, setStatusBar, 1}},
- {324, {wxFrame, setStatusBarPane, 1}},
- {325, {wxFrame, setStatusText, 2}},
- {326, {wxFrame, setStatusWidths, 2}},
- {327, {wxFrame, setToolBar, 1}},
- {328, {wxMiniFrame, new_0, 0}},
- {329, {wxMiniFrame, new_4, 4}},
- {330, {wxMiniFrame, create, 4}},
- {331, {wxMiniFrame, 'Destroy', undefined}},
- {332, {wxSplashScreen, new_0, 0}},
- {333, {wxSplashScreen, new_6, 6}},
- {334, {wxSplashScreen, destruct, 0}},
- {335, {wxSplashScreen, getSplashStyle, 0}},
- {336, {wxSplashScreen, getTimeout, 0}},
- {337, {wxPanel, new_0, 0}},
- {338, {wxPanel, new_6, 6}},
- {339, {wxPanel, new_2, 2}},
- {340, {wxPanel, destruct, 0}},
- {341, {wxPanel, initDialog, 0}},
- {342, {wxPanel, setFocusIgnoringChildren, 0}},
- {343, {wxScrolledWindow, new_0, 0}},
- {344, {wxScrolledWindow, new_2, 2}},
- {345, {wxScrolledWindow, destruct, 0}},
- {346, {wxScrolledWindow, calcScrolledPosition_4, 4}},
- {347, {wxScrolledWindow, calcScrolledPosition_1, 1}},
- {348, {wxScrolledWindow, calcUnscrolledPosition_4, 4}},
- {349, {wxScrolledWindow, calcUnscrolledPosition_1, 1}},
- {350, {wxScrolledWindow, enableScrolling, 2}},
- {351, {wxScrolledWindow, getScrollPixelsPerUnit, 2}},
- {352, {wxScrolledWindow, getViewStart, 2}},
- {353, {wxScrolledWindow, doPrepareDC, 1}},
- {354, {wxScrolledWindow, prepareDC, 1}},
- {355, {wxScrolledWindow, scroll, 2}},
- {356, {wxScrolledWindow, setScrollbars, 5}},
- {357, {wxScrolledWindow, setScrollRate, 2}},
- {358, {wxScrolledWindow, setTargetWindow, 1}},
- {359, {wxSashWindow, new_0, 0}},
- {360, {wxSashWindow, new_2, 2}},
- {361, {wxSashWindow, destruct, 0}},
- {362, {wxSashWindow, getSashVisible, 1}},
- {363, {wxSashWindow, getMaximumSizeX, 0}},
- {364, {wxSashWindow, getMaximumSizeY, 0}},
- {365, {wxSashWindow, getMinimumSizeX, 0}},
- {366, {wxSashWindow, getMinimumSizeY, 0}},
- {367, {wxSashWindow, setMaximumSizeX, 1}},
- {368, {wxSashWindow, setMaximumSizeY, 1}},
- {369, {wxSashWindow, setMinimumSizeX, 1}},
- {370, {wxSashWindow, setMinimumSizeY, 1}},
- {371, {wxSashWindow, setSashVisible, 2}},
- {372, {wxSashLayoutWindow, new_0, 0}},
- {373, {wxSashLayoutWindow, new_2, 2}},
- {374, {wxSashLayoutWindow, create, 2}},
- {375, {wxSashLayoutWindow, getAlignment, 0}},
- {376, {wxSashLayoutWindow, getOrientation, 0}},
- {377, {wxSashLayoutWindow, setAlignment, 1}},
- {378, {wxSashLayoutWindow, setDefaultSize, 1}},
- {379, {wxSashLayoutWindow, setOrientation, 1}},
- {380, {wxSashLayoutWindow, 'Destroy', undefined}},
- {381, {wxGrid, new_0, 0}},
- {382, {wxGrid, new_3, 3}},
- {383, {wxGrid, new_4, 4}},
- {384, {wxGrid, destruct, 0}},
- {385, {wxGrid, appendCols, 1}},
- {386, {wxGrid, appendRows, 1}},
- {387, {wxGrid, autoSize, 0}},
- {388, {wxGrid, autoSizeColumn, 2}},
- {389, {wxGrid, autoSizeColumns, 1}},
- {390, {wxGrid, autoSizeRow, 2}},
- {391, {wxGrid, autoSizeRows, 1}},
- {392, {wxGrid, beginBatch, 0}},
- {393, {wxGrid, blockToDeviceRect, 2}},
- {394, {wxGrid, canDragColSize, 0}},
- {395, {wxGrid, canDragRowSize, 0}},
- {396, {wxGrid, canDragGridSize, 0}},
- {397, {wxGrid, canEnableCellControl, 0}},
- {398, {wxGrid, cellToRect_2, 2}},
- {399, {wxGrid, cellToRect_1, 1}},
- {400, {wxGrid, clearGrid, 0}},
- {401, {wxGrid, clearSelection, 0}},
- {402, {wxGrid, createGrid, 3}},
- {403, {wxGrid, deleteCols, 1}},
- {404, {wxGrid, deleteRows, 1}},
- {405, {wxGrid, disableCellEditControl, 0}},
- {406, {wxGrid, disableDragColSize, 0}},
- {407, {wxGrid, disableDragGridSize, 0}},
- {408, {wxGrid, disableDragRowSize, 0}},
- {409, {wxGrid, enableCellEditControl, 1}},
- {410, {wxGrid, enableDragColSize, 1}},
- {411, {wxGrid, enableDragGridSize, 1}},
- {412, {wxGrid, enableDragRowSize, 1}},
- {413, {wxGrid, enableEditing, 1}},
- {414, {wxGrid, enableGridLines, 1}},
- {415, {wxGrid, endBatch, 0}},
- {416, {wxGrid, fit, 0}},
- {417, {wxGrid, forceRefresh, 0}},
- {418, {wxGrid, getBatchCount, 0}},
- {419, {wxGrid, getCellAlignment, 4}},
- {420, {wxGrid, getCellBackgroundColour, 2}},
- {421, {wxGrid, getCellEditor, 2}},
- {422, {wxGrid, getCellFont, 2}},
- {423, {wxGrid, getCellRenderer, 2}},
- {424, {wxGrid, getCellTextColour, 2}},
- {425, {wxGrid, getCellValue_2, 2}},
- {426, {wxGrid, getCellValue_1, 1}},
- {427, {wxGrid, getColLabelAlignment, 2}},
- {428, {wxGrid, getColLabelSize, 0}},
- {429, {wxGrid, getColLabelValue, 1}},
- {430, {wxGrid, getColMinimalAcceptableWidth, 0}},
- {431, {wxGrid, getDefaultCellAlignment, 2}},
- {432, {wxGrid, getDefaultCellBackgroundColour, 0}},
- {433, {wxGrid, getDefaultCellFont, 0}},
- {434, {wxGrid, getDefaultCellTextColour, 0}},
- {435, {wxGrid, getDefaultColLabelSize, 0}},
- {436, {wxGrid, getDefaultColSize, 0}},
- {437, {wxGrid, getDefaultEditor, 0}},
- {438, {wxGrid, getDefaultEditorForCell_2, 2}},
- {439, {wxGrid, getDefaultEditorForCell_1, 1}},
- {440, {wxGrid, getDefaultEditorForType, 1}},
- {441, {wxGrid, getDefaultRenderer, 0}},
- {442, {wxGrid, getDefaultRendererForCell, 2}},
- {443, {wxGrid, getDefaultRendererForType, 1}},
- {444, {wxGrid, getDefaultRowLabelSize, 0}},
- {445, {wxGrid, getDefaultRowSize, 0}},
- {446, {wxGrid, getGridCursorCol, 0}},
- {447, {wxGrid, getGridCursorRow, 0}},
- {448, {wxGrid, getGridLineColour, 0}},
- {449, {wxGrid, gridLinesEnabled, 0}},
- {450, {wxGrid, getLabelBackgroundColour, 0}},
- {451, {wxGrid, getLabelFont, 0}},
- {452, {wxGrid, getLabelTextColour, 0}},
- {453, {wxGrid, getNumberCols, 0}},
- {454, {wxGrid, getNumberRows, 0}},
- {455, {wxGrid, getOrCreateCellAttr, 2}},
- {456, {wxGrid, getRowMinimalAcceptableHeight, 0}},
- {457, {wxGrid, getRowLabelAlignment, 2}},
- {458, {wxGrid, getRowLabelSize, 0}},
- {459, {wxGrid, getRowLabelValue, 1}},
- {460, {wxGrid, getRowSize, 1}},
- {461, {wxGrid, getScrollLineX, 0}},
- {462, {wxGrid, getScrollLineY, 0}},
- {463, {wxGrid, getSelectedCells, 0}},
- {464, {wxGrid, getSelectedCols, 0}},
- {465, {wxGrid, getSelectedRows, 0}},
- {466, {wxGrid, getSelectionBackground, 0}},
- {467, {wxGrid, getSelectionBlockTopLeft, 0}},
- {468, {wxGrid, getSelectionBlockBottomRight, 0}},
- {469, {wxGrid, getSelectionForeground, 0}},
- {470, {wxGrid, getViewWidth, 0}},
- {471, {wxGrid, getGridWindow, 0}},
- {472, {wxGrid, getGridRowLabelWindow, 0}},
- {473, {wxGrid, getGridColLabelWindow, 0}},
- {474, {wxGrid, getGridCornerLabelWindow, 0}},
- {475, {wxGrid, hideCellEditControl, 0}},
- {476, {wxGrid, insertCols, 1}},
- {477, {wxGrid, insertRows, 1}},
- {478, {wxGrid, isCellEditControlEnabled, 0}},
- {479, {wxGrid, isCurrentCellReadOnly, 0}},
- {480, {wxGrid, isEditable, 0}},
- {481, {wxGrid, isInSelection_2, 2}},
- {482, {wxGrid, isInSelection_1, 1}},
- {483, {wxGrid, isReadOnly, 2}},
- {484, {wxGrid, isSelection, 0}},
- {485, {wxGrid, isVisible_3, 3}},
- {486, {wxGrid, isVisible_2, 2}},
- {487, {wxGrid, makeCellVisible_2, 2}},
- {488, {wxGrid, makeCellVisible_1, 1}},
- {489, {wxGrid, moveCursorDown, 1}},
- {490, {wxGrid, moveCursorLeft, 1}},
- {491, {wxGrid, moveCursorRight, 1}},
- {492, {wxGrid, moveCursorUp, 1}},
- {493, {wxGrid, moveCursorDownBlock, 1}},
- {494, {wxGrid, moveCursorLeftBlock, 1}},
- {495, {wxGrid, moveCursorRightBlock, 1}},
- {496, {wxGrid, moveCursorUpBlock, 1}},
- {497, {wxGrid, movePageDown, 0}},
- {498, {wxGrid, movePageUp, 0}},
- {499, {wxGrid, registerDataType, 3}},
- {500, {wxGrid, saveEditControlValue, 0}},
- {501, {wxGrid, selectAll, 0}},
- {502, {wxGrid, selectBlock_5, 5}},
- {503, {wxGrid, selectBlock_3, 3}},
- {504, {wxGrid, selectCol, 2}},
- {505, {wxGrid, selectRow, 2}},
- {506, {wxGrid, setCellAlignment_4, 4}},
- {507, {wxGrid, setCellAlignment_3, 3}},
- {508, {wxGrid, setCellAlignment_1, 1}},
- {509, {wxGrid, setCellBackgroundColour_3_0, 3}},
- {510, {wxGrid, setCellBackgroundColour_1, 1}},
- {511, {wxGrid, setCellBackgroundColour_3_1, 3}},
- {512, {wxGrid, setCellEditor, 3}},
- {513, {wxGrid, setCellFont, 3}},
- {514, {wxGrid, setCellRenderer, 3}},
- {515, {wxGrid, setCellTextColour_3_0, 3}},
- {516, {wxGrid, setCellTextColour_3_1, 3}},
- {517, {wxGrid, setCellTextColour_1, 1}},
- {518, {wxGrid, setCellValue_3_0, 3}},
- {519, {wxGrid, setCellValue_2, 2}},
- {520, {wxGrid, setCellValue_3_1, 3}},
- {521, {wxGrid, setColAttr, 2}},
- {522, {wxGrid, setColFormatBool, 1}},
- {523, {wxGrid, setColFormatNumber, 1}},
- {524, {wxGrid, setColFormatFloat, 2}},
- {525, {wxGrid, setColFormatCustom, 2}},
- {526, {wxGrid, setColLabelAlignment, 2}},
- {527, {wxGrid, setColLabelSize, 1}},
- {528, {wxGrid, setColLabelValue, 2}},
- {529, {wxGrid, setColMinimalWidth, 2}},
- {530, {wxGrid, setColMinimalAcceptableWidth, 1}},
- {531, {wxGrid, setColSize, 2}},
- {532, {wxGrid, setDefaultCellAlignment, 2}},
- {533, {wxGrid, setDefaultCellBackgroundColour, 1}},
- {534, {wxGrid, setDefaultCellFont, 1}},
- {535, {wxGrid, setDefaultCellTextColour, 1}},
- {536, {wxGrid, setDefaultEditor, 1}},
- {537, {wxGrid, setDefaultRenderer, 1}},
- {538, {wxGrid, setDefaultColSize, 2}},
- {539, {wxGrid, setDefaultRowSize, 2}},
- {540, {wxGrid, setGridCursor, 2}},
- {541, {wxGrid, setGridLineColour, 1}},
- {542, {wxGrid, setLabelBackgroundColour, 1}},
- {543, {wxGrid, setLabelFont, 1}},
- {544, {wxGrid, setLabelTextColour, 1}},
- {545, {wxGrid, setMargins, 2}},
- {546, {wxGrid, setReadOnly, 3}},
- {547, {wxGrid, setRowAttr, 2}},
- {548, {wxGrid, setRowLabelAlignment, 2}},
- {549, {wxGrid, setRowLabelSize, 1}},
- {550, {wxGrid, setRowLabelValue, 2}},
- {551, {wxGrid, setRowMinimalHeight, 2}},
- {552, {wxGrid, setRowMinimalAcceptableHeight, 1}},
- {553, {wxGrid, setRowSize, 2}},
- {554, {wxGrid, setScrollLineX, 1}},
- {555, {wxGrid, setScrollLineY, 1}},
- {556, {wxGrid, setSelectionBackground, 1}},
- {557, {wxGrid, setSelectionForeground, 1}},
- {558, {wxGrid, setSelectionMode, 1}},
- {559, {wxGrid, showCellEditControl, 0}},
- {560, {wxGrid, xToCol, 2}},
- {561, {wxGrid, xToEdgeOfCol, 1}},
- {562, {wxGrid, yToEdgeOfRow, 1}},
- {563, {wxGrid, yToRow, 1}},
- {564, {wxGridCellRenderer, draw, 7}},
- {565, {wxGridCellRenderer, getBestSize, 5}},
- {566, {wxGridCellEditor, create, 3}},
- {567, {wxGridCellEditor, isCreated, 0}},
- {568, {wxGridCellEditor, setSize, 1}},
- {569, {wxGridCellEditor, show, 2}},
- {570, {wxGridCellEditor, paintBackground, 2}},
- {571, {wxGridCellEditor, beginEdit, 3}},
- {572, {wxGridCellEditor, endEdit, 3}},
- {573, {wxGridCellEditor, reset, 0}},
- {574, {wxGridCellEditor, startingKey, 1}},
- {575, {wxGridCellEditor, startingClick, 0}},
- {576, {wxGridCellEditor, handleReturn, 1}},
- {577, {wxGridCellBoolRenderer, new, 0}},
- {578, {wxGridCellBoolRenderer, 'Destroy', undefined}},
- {579, {wxGridCellBoolEditor, new, 0}},
- {580, {wxGridCellBoolEditor, isTrueValue, 1}},
- {581, {wxGridCellBoolEditor, useStringValues, 1}},
- {582, {wxGridCellBoolEditor, 'Destroy', undefined}},
- {583, {wxGridCellFloatRenderer, new, 1}},
- {584, {wxGridCellFloatRenderer, getPrecision, 0}},
- {585, {wxGridCellFloatRenderer, getWidth, 0}},
- {586, {wxGridCellFloatRenderer, setParameters, 1}},
- {587, {wxGridCellFloatRenderer, setPrecision, 1}},
- {588, {wxGridCellFloatRenderer, setWidth, 1}},
- {589, {wxGridCellFloatRenderer, 'Destroy', undefined}},
- {590, {wxGridCellFloatEditor, new, 1}},
- {591, {wxGridCellFloatEditor, setParameters, 1}},
- {592, {wxGridCellFloatEditor, 'Destroy', undefined}},
- {593, {wxGridCellStringRenderer, new, 0}},
- {594, {wxGridCellStringRenderer, 'Destroy', undefined}},
- {595, {wxGridCellTextEditor, new, 0}},
- {596, {wxGridCellTextEditor, setParameters, 1}},
- {597, {wxGridCellTextEditor, 'Destroy', undefined}},
- {599, {wxGridCellChoiceEditor, new, 2}},
- {600, {wxGridCellChoiceEditor, setParameters, 1}},
- {601, {wxGridCellChoiceEditor, 'Destroy', undefined}},
- {602, {wxGridCellNumberRenderer, new, 0}},
- {603, {wxGridCellNumberRenderer, 'Destroy', undefined}},
- {604, {wxGridCellNumberEditor, new, 1}},
- {605, {wxGridCellNumberEditor, getValue, 0}},
- {606, {wxGridCellNumberEditor, setParameters, 1}},
- {607, {wxGridCellNumberEditor, 'Destroy', undefined}},
- {608, {wxGridCellAttr, setTextColour, 1}},
- {609, {wxGridCellAttr, setBackgroundColour, 1}},
- {610, {wxGridCellAttr, setFont, 1}},
- {611, {wxGridCellAttr, setAlignment, 2}},
- {612, {wxGridCellAttr, setReadOnly, 1}},
- {613, {wxGridCellAttr, setRenderer, 1}},
- {614, {wxGridCellAttr, setEditor, 1}},
- {615, {wxGridCellAttr, hasTextColour, 0}},
- {616, {wxGridCellAttr, hasBackgroundColour, 0}},
- {617, {wxGridCellAttr, hasFont, 0}},
- {618, {wxGridCellAttr, hasAlignment, 0}},
- {619, {wxGridCellAttr, hasRenderer, 0}},
- {620, {wxGridCellAttr, hasEditor, 0}},
- {621, {wxGridCellAttr, getTextColour, 0}},
- {622, {wxGridCellAttr, getBackgroundColour, 0}},
- {623, {wxGridCellAttr, getFont, 0}},
- {624, {wxGridCellAttr, getAlignment, 2}},
- {625, {wxGridCellAttr, getRenderer, 3}},
- {626, {wxGridCellAttr, getEditor, 3}},
- {627, {wxGridCellAttr, isReadOnly, 0}},
- {628, {wxGridCellAttr, setDefAttr, 1}},
- {629, {wxDC, blit, 5}},
- {630, {wxDC, calcBoundingBox, 2}},
- {631, {wxDC, clear, 0}},
- {632, {wxDC, computeScaleAndOrigin, 0}},
- {633, {wxDC, crossHair, 1}},
- {634, {wxDC, destroyClippingRegion, 0}},
- {635, {wxDC, deviceToLogicalX, 1}},
- {636, {wxDC, deviceToLogicalXRel, 1}},
- {637, {wxDC, deviceToLogicalY, 1}},
- {638, {wxDC, deviceToLogicalYRel, 1}},
- {639, {wxDC, drawArc, 3}},
- {640, {wxDC, drawBitmap, 3}},
- {641, {wxDC, drawCheckMark, 1}},
- {642, {wxDC, drawCircle, 2}},
- {644, {wxDC, drawEllipse_2, 2}},
- {645, {wxDC, drawEllipse_1, 1}},
- {646, {wxDC, drawEllipticArc, 4}},
- {647, {wxDC, drawIcon, 2}},
- {648, {wxDC, drawLabel, 3}},
- {649, {wxDC, drawLine, 2}},
- {650, {wxDC, drawLines, 3}},
- {652, {wxDC, drawPolygon, 3}},
- {654, {wxDC, drawPoint, 1}},
- {656, {wxDC, drawRectangle_2, 2}},
- {657, {wxDC, drawRectangle_1, 1}},
- {658, {wxDC, drawRotatedText, 3}},
- {660, {wxDC, drawRoundedRectangle_3, 3}},
- {661, {wxDC, drawRoundedRectangle_2, 2}},
- {662, {wxDC, drawText, 2}},
- {663, {wxDC, endDoc, 0}},
- {664, {wxDC, endPage, 0}},
- {665, {wxDC, floodFill, 3}},
- {666, {wxDC, getBackground, 0}},
- {667, {wxDC, getBackgroundMode, 0}},
- {668, {wxDC, getBrush, 0}},
- {669, {wxDC, getCharHeight, 0}},
- {670, {wxDC, getCharWidth, 0}},
- {671, {wxDC, getClippingBox, 4}},
- {673, {wxDC, getFont, 0}},
- {674, {wxDC, getLayoutDirection, 0}},
- {675, {wxDC, getLogicalFunction, 0}},
- {676, {wxDC, getMapMode, 0}},
- {677, {wxDC, getMultiLineTextExtent_4, 4}},
- {678, {wxDC, getMultiLineTextExtent_1, 1}},
- {679, {wxDC, getPartialTextExtents, 2}},
- {680, {wxDC, getPen, 0}},
- {681, {wxDC, getPixel, 2}},
- {682, {wxDC, getPPI, 0}},
- {684, {wxDC, getSize, 0}},
- {686, {wxDC, getSizeMM, 0}},
- {687, {wxDC, getTextBackground, 0}},
- {688, {wxDC, getTextExtent_4, 4}},
- {689, {wxDC, getTextExtent_1, 1}},
- {691, {wxDC, getTextForeground, 0}},
- {692, {wxDC, getUserScale, 2}},
- {693, {wxDC, gradientFillConcentric_3, 3}},
- {694, {wxDC, gradientFillConcentric_4, 4}},
- {695, {wxDC, gradientFillLinear, 4}},
- {696, {wxDC, logicalToDeviceX, 1}},
- {697, {wxDC, logicalToDeviceXRel, 1}},
- {698, {wxDC, logicalToDeviceY, 1}},
- {699, {wxDC, logicalToDeviceYRel, 1}},
- {700, {wxDC, maxX, 0}},
- {701, {wxDC, maxY, 0}},
- {702, {wxDC, minX, 0}},
- {703, {wxDC, minY, 0}},
- {704, {wxDC, isOk, 0}},
- {705, {wxDC, resetBoundingBox, 0}},
- {706, {wxDC, setAxisOrientation, 2}},
- {707, {wxDC, setBackground, 1}},
- {708, {wxDC, setBackgroundMode, 1}},
- {709, {wxDC, setBrush, 1}},
- {711, {wxDC, setClippingRegion_2, 2}},
- {712, {wxDC, setClippingRegion_1_1, 1}},
- {713, {wxDC, setClippingRegion_1_0, 1}},
- {714, {wxDC, setDeviceOrigin, 2}},
- {715, {wxDC, setFont, 1}},
- {716, {wxDC, setLayoutDirection, 1}},
- {717, {wxDC, setLogicalFunction, 1}},
- {718, {wxDC, setMapMode, 1}},
- {719, {wxDC, setPalette, 1}},
- {720, {wxDC, setPen, 1}},
- {721, {wxDC, setTextBackground, 1}},
- {722, {wxDC, setTextForeground, 1}},
- {723, {wxDC, setUserScale, 2}},
- {724, {wxDC, startDoc, 1}},
- {725, {wxDC, startPage, 0}},
- {726, {wxMirrorDC, new, 2}},
- {727, {wxMirrorDC, 'Destroy', undefined}},
- {728, {wxScreenDC, new, 0}},
- {729, {wxScreenDC, destruct, 0}},
- {730, {wxPostScriptDC, new_0, 0}},
- {731, {wxPostScriptDC, new_1, 1}},
- {732, {wxPostScriptDC, destruct, 0}},
- {733, {wxPostScriptDC, setResolution, 1}},
- {734, {wxPostScriptDC, getResolution, 0}},
- {735, {wxWindowDC, new_0, 0}},
- {736, {wxWindowDC, new_1, 1}},
- {737, {wxWindowDC, destruct, 0}},
- {738, {wxClientDC, new_0, 0}},
- {739, {wxClientDC, new_1, 1}},
- {740, {wxClientDC, 'Destroy', undefined}},
- {741, {wxPaintDC, new_0, 0}},
- {742, {wxPaintDC, new_1, 1}},
- {743, {wxPaintDC, 'Destroy', undefined}},
- {745, {wxMemoryDC, new_1_0, 1}},
- {746, {wxMemoryDC, new_1_1, 1}},
- {747, {wxMemoryDC, new_0, 0}},
- {749, {wxMemoryDC, destruct, 0}},
- {750, {wxMemoryDC, selectObject, 1}},
- {751, {wxMemoryDC, selectObjectAsSource, 1}},
- {752, {wxBufferedDC, new_0, 0}},
- {753, {wxBufferedDC, new_2, 2}},
- {754, {wxBufferedDC, new_3, 3}},
- {755, {wxBufferedDC, destruct, 0}},
- {756, {wxBufferedDC, init_2, 2}},
- {757, {wxBufferedDC, init_3, 3}},
- {758, {wxBufferedPaintDC, new_3, 3}},
- {759, {wxBufferedPaintDC, new_2, 2}},
- {760, {wxBufferedPaintDC, destruct, 0}},
- {761, {wxGraphicsObject, destruct, 0}},
- {762, {wxGraphicsObject, getRenderer, 0}},
- {763, {wxGraphicsObject, isNull, 0}},
- {764, {wxGraphicsContext, destruct, 0}},
- {765, {wxGraphicsContext, create_1_1, 1}},
- {766, {wxGraphicsContext, create_1_0, 1}},
- {767, {wxGraphicsContext, create_0, 0}},
- {768, {wxGraphicsContext, createPen, 1}},
- {769, {wxGraphicsContext, createBrush, 1}},
- {770, {wxGraphicsContext, createRadialGradientBrush, 7}},
- {771, {wxGraphicsContext, createLinearGradientBrush, 6}},
- {772, {wxGraphicsContext, createFont, 2}},
- {773, {wxGraphicsContext, createMatrix, 1}},
- {774, {wxGraphicsContext, createPath, 0}},
- {775, {wxGraphicsContext, clip_1, 1}},
- {776, {wxGraphicsContext, clip_4, 4}},
- {777, {wxGraphicsContext, resetClip, 0}},
- {778, {wxGraphicsContext, drawBitmap, 5}},
- {779, {wxGraphicsContext, drawEllipse, 4}},
- {780, {wxGraphicsContext, drawIcon, 5}},
- {781, {wxGraphicsContext, drawLines, 3}},
- {782, {wxGraphicsContext, drawPath, 2}},
- {783, {wxGraphicsContext, drawRectangle, 4}},
- {784, {wxGraphicsContext, drawRoundedRectangle, 5}},
- {785, {wxGraphicsContext, drawText_3, 3}},
- {786, {wxGraphicsContext, drawText_4_0, 4}},
- {787, {wxGraphicsContext, drawText_4_1, 4}},
- {788, {wxGraphicsContext, drawText_5, 5}},
- {789, {wxGraphicsContext, fillPath, 2}},
- {790, {wxGraphicsContext, strokePath, 1}},
- {791, {wxGraphicsContext, getPartialTextExtents, 2}},
- {792, {wxGraphicsContext, getTextExtent, 5}},
- {793, {wxGraphicsContext, rotate, 1}},
- {794, {wxGraphicsContext, scale, 2}},
- {795, {wxGraphicsContext, translate, 2}},
- {796, {wxGraphicsContext, getTransform, 0}},
- {797, {wxGraphicsContext, setTransform, 1}},
- {798, {wxGraphicsContext, concatTransform, 1}},
- {799, {wxGraphicsContext, setBrush_1_1, 1}},
- {800, {wxGraphicsContext, setBrush_1_0, 1}},
- {801, {wxGraphicsContext, setFont_1, 1}},
- {802, {wxGraphicsContext, setFont_2, 2}},
- {803, {wxGraphicsContext, setPen_1_0, 1}},
- {804, {wxGraphicsContext, setPen_1_1, 1}},
- {805, {wxGraphicsContext, strokeLine, 4}},
- {806, {wxGraphicsContext, strokeLines, 2}},
- {808, {wxGraphicsMatrix, concat, 1}},
- {810, {wxGraphicsMatrix, get, 1}},
- {811, {wxGraphicsMatrix, invert, 0}},
- {812, {wxGraphicsMatrix, isEqual, 1}},
- {814, {wxGraphicsMatrix, isIdentity, 0}},
- {815, {wxGraphicsMatrix, rotate, 1}},
- {816, {wxGraphicsMatrix, scale, 2}},
- {817, {wxGraphicsMatrix, translate, 2}},
- {818, {wxGraphicsMatrix, set, 1}},
- {819, {wxGraphicsMatrix, transformPoint, 2}},
- {820, {wxGraphicsMatrix, transformDistance, 2}},
- {821, {wxGraphicsPath, moveToPoint_2, 2}},
- {822, {wxGraphicsPath, moveToPoint_1, 1}},
- {823, {wxGraphicsPath, addArc_6, 6}},
- {824, {wxGraphicsPath, addArc_5, 5}},
- {825, {wxGraphicsPath, addArcToPoint, 5}},
- {826, {wxGraphicsPath, addCircle, 3}},
- {827, {wxGraphicsPath, addCurveToPoint_6, 6}},
- {828, {wxGraphicsPath, addCurveToPoint_3, 3}},
- {829, {wxGraphicsPath, addEllipse, 4}},
- {830, {wxGraphicsPath, addLineToPoint_2, 2}},
- {831, {wxGraphicsPath, addLineToPoint_1, 1}},
- {832, {wxGraphicsPath, addPath, 1}},
- {833, {wxGraphicsPath, addQuadCurveToPoint, 4}},
- {834, {wxGraphicsPath, addRectangle, 4}},
- {835, {wxGraphicsPath, addRoundedRectangle, 5}},
- {836, {wxGraphicsPath, closeSubpath, 0}},
- {837, {wxGraphicsPath, contains_3, 3}},
- {838, {wxGraphicsPath, contains_2, 2}},
- {840, {wxGraphicsPath, getBox, 0}},
- {842, {wxGraphicsPath, getCurrentPoint, 0}},
- {843, {wxGraphicsPath, transform, 1}},
- {844, {wxGraphicsRenderer, getDefaultRenderer, 0}},
- {845, {wxGraphicsRenderer, createContext_1_1, 1}},
- {846, {wxGraphicsRenderer, createContext_1_0, 1}},
- {847, {wxGraphicsRenderer, createPen, 1}},
- {848, {wxGraphicsRenderer, createBrush, 1}},
- {849, {wxGraphicsRenderer, createLinearGradientBrush, 6}},
- {850, {wxGraphicsRenderer, createRadialGradientBrush, 7}},
- {851, {wxGraphicsRenderer, createFont, 2}},
- {852, {wxGraphicsRenderer, createMatrix, 1}},
- {853, {wxGraphicsRenderer, createPath, 0}},
- {855, {wxMenuBar, new_1, 1}},
- {857, {wxMenuBar, new_0, 0}},
- {859, {wxMenuBar, destruct, 0}},
- {860, {wxMenuBar, append, 2}},
- {861, {wxMenuBar, check, 2}},
- {862, {wxMenuBar, enable_2, 2}},
- {863, {wxMenuBar, enable_1, 1}},
- {864, {wxMenuBar, enableTop, 2}},
- {865, {wxMenuBar, findMenu, 1}},
- {866, {wxMenuBar, findMenuItem, 2}},
- {867, {wxMenuBar, findItem, 2}},
- {868, {wxMenuBar, getHelpString, 1}},
- {869, {wxMenuBar, getLabel_1, 1}},
- {870, {wxMenuBar, getLabel_0, 0}},
- {871, {wxMenuBar, getLabelTop, 1}},
- {872, {wxMenuBar, getMenu, 1}},
- {873, {wxMenuBar, getMenuCount, 0}},
- {874, {wxMenuBar, insert, 3}},
- {875, {wxMenuBar, isChecked, 1}},
- {876, {wxMenuBar, isEnabled_1, 1}},
- {877, {wxMenuBar, isEnabled_0, 0}},
- {878, {wxMenuBar, remove, 1}},
- {879, {wxMenuBar, replace, 3}},
- {880, {wxMenuBar, setHelpString, 2}},
- {881, {wxMenuBar, setLabel_2, 2}},
- {882, {wxMenuBar, setLabel_1, 1}},
- {883, {wxMenuBar, setLabelTop, 2}},
- {884, {wxControl, getLabel, 0}},
- {885, {wxControl, setLabel, 1}},
- {886, {wxControlWithItems, append_1, 1}},
- {887, {wxControlWithItems, append_2, 2}},
- {888, {wxControlWithItems, appendStrings_1, 1}},
- {889, {wxControlWithItems, clear, 0}},
- {890, {wxControlWithItems, delete, 1}},
- {891, {wxControlWithItems, findString, 2}},
- {892, {wxControlWithItems, getClientData, 1}},
- {893, {wxControlWithItems, setClientData, 2}},
- {894, {wxControlWithItems, getCount, 0}},
- {895, {wxControlWithItems, getSelection, 0}},
- {896, {wxControlWithItems, getString, 1}},
- {897, {wxControlWithItems, getStringSelection, 0}},
- {898, {wxControlWithItems, insert_2, 2}},
- {899, {wxControlWithItems, insert_3, 3}},
- {900, {wxControlWithItems, isEmpty, 0}},
- {901, {wxControlWithItems, select, 1}},
- {902, {wxControlWithItems, setSelection, 1}},
- {903, {wxControlWithItems, setString, 2}},
- {904, {wxControlWithItems, setStringSelection, 1}},
- {907, {wxMenu, new_2, 2}},
- {908, {wxMenu, new_1, 1}},
- {910, {wxMenu, destruct, 0}},
- {911, {wxMenu, append_3, 3}},
- {912, {wxMenu, append_1, 1}},
- {913, {wxMenu, append_4_0, 4}},
- {914, {wxMenu, append_4_1, 4}},
- {915, {wxMenu, appendCheckItem, 3}},
- {916, {wxMenu, appendRadioItem, 3}},
- {917, {wxMenu, appendSeparator, 0}},
- {918, {wxMenu, break, 0}},
- {919, {wxMenu, check, 2}},
- {920, {wxMenu, delete_1_0, 1}},
- {921, {wxMenu, delete_1_1, 1}},
- {922, {wxMenu, destroy_1_0, 1}},
- {923, {wxMenu, destroy_1_1, 1}},
- {924, {wxMenu, enable, 2}},
- {925, {wxMenu, findItem_1, 1}},
- {926, {wxMenu, findItem_2, 2}},
- {927, {wxMenu, findItemByPosition, 1}},
- {928, {wxMenu, getHelpString, 1}},
- {929, {wxMenu, getLabel, 1}},
- {930, {wxMenu, getMenuItemCount, 0}},
- {931, {wxMenu, getMenuItems, 0}},
- {933, {wxMenu, getTitle, 0}},
- {934, {wxMenu, insert_2, 2}},
- {935, {wxMenu, insert_3, 3}},
- {936, {wxMenu, insert_5_1, 5}},
- {937, {wxMenu, insert_5_0, 5}},
- {938, {wxMenu, insertCheckItem, 4}},
- {939, {wxMenu, insertRadioItem, 4}},
- {940, {wxMenu, insertSeparator, 1}},
- {941, {wxMenu, isChecked, 1}},
- {942, {wxMenu, isEnabled, 1}},
- {943, {wxMenu, prepend_1, 1}},
- {944, {wxMenu, prepend_2, 2}},
- {945, {wxMenu, prepend_4_1, 4}},
- {946, {wxMenu, prepend_4_0, 4}},
- {947, {wxMenu, prependCheckItem, 3}},
- {948, {wxMenu, prependRadioItem, 3}},
- {949, {wxMenu, prependSeparator, 0}},
- {950, {wxMenu, remove_1_0, 1}},
- {951, {wxMenu, remove_1_1, 1}},
- {952, {wxMenu, setHelpString, 2}},
- {953, {wxMenu, setLabel, 2}},
- {954, {wxMenu, setTitle, 1}},
- {955, {wxMenuItem, new, 1}},
- {957, {wxMenuItem, destruct, 0}},
- {958, {wxMenuItem, check, 1}},
- {959, {wxMenuItem, enable, 1}},
- {960, {wxMenuItem, getBitmap, 0}},
- {961, {wxMenuItem, getHelp, 0}},
- {962, {wxMenuItem, getId, 0}},
- {963, {wxMenuItem, getKind, 0}},
- {964, {wxMenuItem, getLabel, 0}},
- {965, {wxMenuItem, getLabelFromText, 1}},
- {966, {wxMenuItem, getMenu, 0}},
- {967, {wxMenuItem, getText, 0}},
- {968, {wxMenuItem, getSubMenu, 0}},
- {969, {wxMenuItem, isCheckable, 0}},
- {970, {wxMenuItem, isChecked, 0}},
- {971, {wxMenuItem, isEnabled, 0}},
- {972, {wxMenuItem, isSeparator, 0}},
- {973, {wxMenuItem, isSubMenu, 0}},
- {974, {wxMenuItem, setBitmap, 1}},
- {975, {wxMenuItem, setHelp, 1}},
- {976, {wxMenuItem, setMenu, 1}},
- {977, {wxMenuItem, setSubMenu, 1}},
- {978, {wxMenuItem, setText, 1}},
- {979, {wxToolBar, addControl, 1}},
- {980, {wxToolBar, addSeparator, 0}},
- {981, {wxToolBar, addTool_5, 5}},
- {982, {wxToolBar, addTool_4_0, 4}},
- {983, {wxToolBar, addTool_1, 1}},
- {984, {wxToolBar, addTool_4_1, 4}},
- {985, {wxToolBar, addTool_3, 3}},
- {986, {wxToolBar, addTool_6, 6}},
- {987, {wxToolBar, addCheckTool, 4}},
- {988, {wxToolBar, addRadioTool, 4}},
- {989, {wxToolBar, addStretchableSpace, 0}},
- {990, {wxToolBar, insertStretchableSpace, 1}},
- {991, {wxToolBar, deleteTool, 1}},
- {992, {wxToolBar, deleteToolByPos, 1}},
- {993, {wxToolBar, enableTool, 2}},
- {994, {wxToolBar, findById, 1}},
- {995, {wxToolBar, findControl, 1}},
- {996, {wxToolBar, findToolForPosition, 2}},
- {997, {wxToolBar, getToolSize, 0}},
- {998, {wxToolBar, getToolBitmapSize, 0}},
- {999, {wxToolBar, getMargins, 0}},
- {1000, {wxToolBar, getToolEnabled, 1}},
- {1001, {wxToolBar, getToolLongHelp, 1}},
- {1002, {wxToolBar, getToolPacking, 0}},
- {1003, {wxToolBar, getToolPos, 1}},
- {1004, {wxToolBar, getToolSeparation, 0}},
- {1005, {wxToolBar, getToolShortHelp, 1}},
- {1006, {wxToolBar, getToolState, 1}},
- {1007, {wxToolBar, insertControl, 2}},
- {1008, {wxToolBar, insertSeparator, 1}},
- {1009, {wxToolBar, insertTool_5, 5}},
- {1010, {wxToolBar, insertTool_2, 2}},
- {1011, {wxToolBar, insertTool_4, 4}},
- {1012, {wxToolBar, realize, 0}},
- {1013, {wxToolBar, removeTool, 1}},
- {1014, {wxToolBar, setMargins, 2}},
- {1015, {wxToolBar, setToolBitmapSize, 1}},
- {1016, {wxToolBar, setToolLongHelp, 2}},
- {1017, {wxToolBar, setToolPacking, 1}},
- {1018, {wxToolBar, setToolShortHelp, 2}},
- {1019, {wxToolBar, setToolSeparation, 1}},
- {1020, {wxToolBar, toggleTool, 2}},
- {1022, {wxStatusBar, new_0, 0}},
- {1023, {wxStatusBar, new_2, 2}},
- {1025, {wxStatusBar, destruct, 0}},
- {1026, {wxStatusBar, create, 2}},
- {1027, {wxStatusBar, getFieldRect, 2}},
- {1028, {wxStatusBar, getFieldsCount, 0}},
- {1029, {wxStatusBar, getStatusText, 1}},
- {1030, {wxStatusBar, popStatusText, 1}},
- {1031, {wxStatusBar, pushStatusText, 2}},
- {1032, {wxStatusBar, setFieldsCount, 2}},
- {1033, {wxStatusBar, setMinHeight, 1}},
- {1034, {wxStatusBar, setStatusText, 2}},
- {1035, {wxStatusBar, setStatusWidths, 2}},
- {1036, {wxStatusBar, setStatusStyles, 2}},
- {1037, {wxBitmap, new_0, 0}},
- {1038, {wxBitmap, new_3, 3}},
- {1039, {wxBitmap, new_4, 4}},
- {1040, {wxBitmap, new_2_0, 2}},
- {1041, {wxBitmap, new_2_1, 2}},
- {1042, {wxBitmap, destruct, 0}},
- {1043, {wxBitmap, convertToImage, 0}},
- {1044, {wxBitmap, copyFromIcon, 1}},
- {1045, {wxBitmap, create, 3}},
- {1046, {wxBitmap, getDepth, 0}},
- {1047, {wxBitmap, getHeight, 0}},
- {1048, {wxBitmap, getPalette, 0}},
- {1049, {wxBitmap, getMask, 0}},
- {1050, {wxBitmap, getWidth, 0}},
- {1051, {wxBitmap, getSubBitmap, 1}},
- {1052, {wxBitmap, loadFile, 2}},
- {1053, {wxBitmap, ok, 0}},
- {1054, {wxBitmap, saveFile, 3}},
- {1055, {wxBitmap, setDepth, 1}},
- {1056, {wxBitmap, setHeight, 1}},
- {1057, {wxBitmap, setMask, 1}},
- {1058, {wxBitmap, setPalette, 1}},
- {1059, {wxBitmap, setWidth, 1}},
- {1060, {wxIcon, new_0, 0}},
- {1061, {wxIcon, new_2, 2}},
- {1062, {wxIcon, new_1, 1}},
- {1063, {wxIcon, copyFromBitmap, 1}},
- {1064, {wxIcon, 'Destroy', undefined}},
- {1065, {wxIconBundle, new_0, 0}},
- {1066, {wxIconBundle, new_2, 2}},
- {1067, {wxIconBundle, new_1_0, 1}},
- {1068, {wxIconBundle, new_1_1, 1}},
- {1069, {wxIconBundle, destruct, 0}},
- {1070, {wxIconBundle, addIcon_2, 2}},
- {1071, {wxIconBundle, addIcon_1, 1}},
- {1072, {wxIconBundle, getIcon_1_1, 1}},
- {1073, {wxIconBundle, getIcon_1_0, 1}},
- {1074, {wxCursor, new_0, 0}},
- {1075, {wxCursor, new_1_0, 1}},
- {1076, {wxCursor, new_1_1, 1}},
- {1077, {wxCursor, new_4, 4}},
- {1078, {wxCursor, destruct, 0}},
- {1079, {wxCursor, ok, 0}},
- {1080, {wxMask, new_0, 0}},
- {1081, {wxMask, new_2_1, 2}},
- {1082, {wxMask, new_2_0, 2}},
- {1083, {wxMask, new_1, 1}},
- {1084, {wxMask, destruct, 0}},
- {1085, {wxMask, create_2_1, 2}},
- {1086, {wxMask, create_2_0, 2}},
- {1087, {wxMask, create_1, 1}},
- {1088, {wxImage, new_0, 0}},
- {1089, {wxImage, new_3_0, 3}},
- {1090, {wxImage, new_4, 4}},
- {1091, {wxImage, new_5, 5}},
- {1092, {wxImage, new_2, 2}},
- {1093, {wxImage, new_3_1, 3}},
- {1094, {wxImage, blur, 1}},
- {1095, {wxImage, blurHorizontal, 1}},
- {1096, {wxImage, blurVertical, 1}},
- {1097, {wxImage, convertAlphaToMask, 1}},
- {1098, {wxImage, convertToGreyscale, 1}},
- {1099, {wxImage, convertToMono, 3}},
- {1100, {wxImage, copy, 0}},
- {1101, {wxImage, create_3, 3}},
- {1102, {wxImage, create_4, 4}},
- {1103, {wxImage, create_5, 5}},
- {1104, {wxImage, 'Destroy', 0}},
- {1105, {wxImage, findFirstUnusedColour, 4}},
- {1106, {wxImage, getImageExtWildcard, 0}},
- {1107, {wxImage, getAlpha_2, 2}},
- {1108, {wxImage, getAlpha_0, 0}},
- {1109, {wxImage, getBlue, 2}},
- {1110, {wxImage, getData, 0}},
- {1111, {wxImage, getGreen, 2}},
- {1112, {wxImage, getImageCount, 2}},
- {1113, {wxImage, getHeight, 0}},
- {1114, {wxImage, getMaskBlue, 0}},
- {1115, {wxImage, getMaskGreen, 0}},
- {1116, {wxImage, getMaskRed, 0}},
- {1117, {wxImage, getOrFindMaskColour, 3}},
- {1118, {wxImage, getPalette, 0}},
- {1119, {wxImage, getRed, 2}},
- {1120, {wxImage, getSubImage, 1}},
- {1121, {wxImage, getWidth, 0}},
- {1122, {wxImage, hasAlpha, 0}},
- {1123, {wxImage, hasMask, 0}},
- {1124, {wxImage, getOption, 1}},
- {1125, {wxImage, getOptionInt, 1}},
- {1126, {wxImage, hasOption, 1}},
- {1127, {wxImage, initAlpha, 0}},
- {1128, {wxImage, initStandardHandlers, 0}},
- {1129, {wxImage, isTransparent, 3}},
- {1130, {wxImage, loadFile_2, 2}},
- {1131, {wxImage, loadFile_3, 3}},
- {1132, {wxImage, ok, 0}},
- {1133, {wxImage, removeHandler, 1}},
- {1134, {wxImage, mirror, 1}},
- {1135, {wxImage, replace, 6}},
- {1136, {wxImage, rescale, 3}},
- {1137, {wxImage, resize, 3}},
- {1138, {wxImage, rotate, 3}},
- {1139, {wxImage, rotateHue, 1}},
- {1140, {wxImage, rotate90, 1}},
- {1141, {wxImage, saveFile_1, 1}},
- {1142, {wxImage, saveFile_2_0, 2}},
- {1143, {wxImage, saveFile_2_1, 2}},
- {1144, {wxImage, scale, 3}},
- {1145, {wxImage, size, 3}},
- {1146, {wxImage, setAlpha_3, 3}},
- {1147, {wxImage, setAlpha_2, 2}},
- {1148, {wxImage, setData_2, 2}},
- {1149, {wxImage, setData_4, 4}},
- {1150, {wxImage, setMask, 1}},
- {1151, {wxImage, setMaskColour, 3}},
- {1152, {wxImage, setMaskFromImage, 4}},
- {1153, {wxImage, setOption_2_1, 2}},
- {1154, {wxImage, setOption_2_0, 2}},
- {1155, {wxImage, setPalette, 1}},
- {1156, {wxImage, setRGB_5, 5}},
- {1157, {wxImage, setRGB_4, 4}},
- {1158, {wxImage, 'Destroy', undefined}},
- {1159, {wxBrush, new_0, 0}},
- {1160, {wxBrush, new_2, 2}},
- {1161, {wxBrush, new_1, 1}},
- {1163, {wxBrush, destruct, 0}},
- {1164, {wxBrush, getColour, 0}},
- {1165, {wxBrush, getStipple, 0}},
- {1166, {wxBrush, getStyle, 0}},
- {1167, {wxBrush, isHatch, 0}},
- {1168, {wxBrush, isOk, 0}},
- {1169, {wxBrush, setColour_1, 1}},
- {1170, {wxBrush, setColour_3, 3}},
- {1171, {wxBrush, setStipple, 1}},
- {1172, {wxBrush, setStyle, 1}},
- {1173, {wxPen, new_0, 0}},
- {1174, {wxPen, new_2, 2}},
- {1175, {wxPen, destruct, 0}},
- {1176, {wxPen, getCap, 0}},
- {1177, {wxPen, getColour, 0}},
- {1178, {wxPen, getJoin, 0}},
- {1179, {wxPen, getStyle, 0}},
- {1180, {wxPen, getWidth, 0}},
- {1181, {wxPen, isOk, 0}},
- {1182, {wxPen, setCap, 1}},
- {1183, {wxPen, setColour_1, 1}},
- {1184, {wxPen, setColour_3, 3}},
- {1185, {wxPen, setJoin, 1}},
- {1186, {wxPen, setStyle, 1}},
- {1187, {wxPen, setWidth, 1}},
- {1188, {wxRegion, new_0, 0}},
- {1189, {wxRegion, new_4, 4}},
- {1190, {wxRegion, new_2, 2}},
- {1191, {wxRegion, new_1_1, 1}},
- {1193, {wxRegion, new_1_0, 1}},
- {1195, {wxRegion, destruct, 0}},
- {1196, {wxRegion, clear, 0}},
- {1197, {wxRegion, contains_2, 2}},
- {1198, {wxRegion, contains_1_0, 1}},
- {1199, {wxRegion, contains_4, 4}},
- {1200, {wxRegion, contains_1_1, 1}},
- {1201, {wxRegion, convertToBitmap, 0}},
- {1202, {wxRegion, getBox, 0}},
- {1203, {wxRegion, intersect_4, 4}},
- {1204, {wxRegion, intersect_1_1, 1}},
- {1205, {wxRegion, intersect_1_0, 1}},
- {1206, {wxRegion, isEmpty, 0}},
- {1207, {wxRegion, subtract_4, 4}},
- {1208, {wxRegion, subtract_1_1, 1}},
- {1209, {wxRegion, subtract_1_0, 1}},
- {1210, {wxRegion, offset_2, 2}},
- {1211, {wxRegion, offset_1, 1}},
- {1212, {wxRegion, union_4, 4}},
- {1213, {wxRegion, union_1_2, 1}},
- {1214, {wxRegion, union_1_1, 1}},
- {1215, {wxRegion, union_1_0, 1}},
- {1216, {wxRegion, union_3, 3}},
- {1217, {wxRegion, xor_4, 4}},
- {1218, {wxRegion, xor_1_1, 1}},
- {1219, {wxRegion, xor_1_0, 1}},
- {1220, {wxAcceleratorTable, new_0, 0}},
- {1221, {wxAcceleratorTable, new_2, 2}},
- {1222, {wxAcceleratorTable, destruct, 0}},
- {1223, {wxAcceleratorTable, ok, 0}},
- {1224, {wxAcceleratorEntry, new_1_0, 1}},
- {1225, {wxAcceleratorEntry, new_1_1, 1}},
- {1226, {wxAcceleratorEntry, getCommand, 0}},
- {1227, {wxAcceleratorEntry, getFlags, 0}},
- {1228, {wxAcceleratorEntry, getKeyCode, 0}},
- {1229, {wxAcceleratorEntry, set, 4}},
- {1230, {wxAcceleratorEntry, 'Destroy', undefined}},
- {1235, {wxCaret, new_3, 3}},
- {1236, {wxCaret, new_2, 2}},
- {1238, {wxCaret, destruct, 0}},
- {1239, {wxCaret, create_3, 3}},
- {1240, {wxCaret, create_2, 2}},
- {1241, {wxCaret, getBlinkTime, 0}},
- {1243, {wxCaret, getPosition, 0}},
- {1245, {wxCaret, getSize, 0}},
- {1246, {wxCaret, getWindow, 0}},
- {1247, {wxCaret, hide, 0}},
- {1248, {wxCaret, isOk, 0}},
- {1249, {wxCaret, isVisible, 0}},
- {1250, {wxCaret, move_2, 2}},
- {1251, {wxCaret, move_1, 1}},
- {1252, {wxCaret, setBlinkTime, 1}},
- {1253, {wxCaret, setSize_2, 2}},
- {1254, {wxCaret, setSize_1, 1}},
- {1255, {wxCaret, show, 1}},
- {1256, {wxSizer, add_2_1, 2}},
- {1257, {wxSizer, add_2_0, 2}},
- {1258, {wxSizer, add_3, 3}},
- {1259, {wxSizer, add_2_3, 2}},
- {1260, {wxSizer, add_2_2, 2}},
- {1261, {wxSizer, addSpacer, 1}},
- {1262, {wxSizer, addStretchSpacer, 1}},
- {1263, {wxSizer, calcMin, 0}},
- {1264, {wxSizer, clear, 1}},
- {1265, {wxSizer, detach_1_2, 1}},
- {1266, {wxSizer, detach_1_1, 1}},
- {1267, {wxSizer, detach_1_0, 1}},
- {1268, {wxSizer, fit, 1}},
- {1269, {wxSizer, fitInside, 1}},
- {1270, {wxSizer, getChildren, 0}},
- {1271, {wxSizer, getItem_2_1, 2}},
- {1272, {wxSizer, getItem_2_0, 2}},
- {1273, {wxSizer, getItem_1, 1}},
- {1274, {wxSizer, getSize, 0}},
- {1275, {wxSizer, getPosition, 0}},
- {1276, {wxSizer, getMinSize, 0}},
- {1277, {wxSizer, hide_2_0, 2}},
- {1278, {wxSizer, hide_2_1, 2}},
- {1279, {wxSizer, hide_1, 1}},
- {1280, {wxSizer, insert_3_1, 3}},
- {1281, {wxSizer, insert_3_0, 3}},
- {1282, {wxSizer, insert_4, 4}},
- {1283, {wxSizer, insert_3_3, 3}},
- {1284, {wxSizer, insert_3_2, 3}},
- {1285, {wxSizer, insert_2, 2}},
- {1286, {wxSizer, insertSpacer, 2}},
- {1287, {wxSizer, insertStretchSpacer, 2}},
- {1288, {wxSizer, isShown_1_2, 1}},
- {1289, {wxSizer, isShown_1_1, 1}},
- {1290, {wxSizer, isShown_1_0, 1}},
- {1291, {wxSizer, layout, 0}},
- {1292, {wxSizer, prepend_2_1, 2}},
- {1293, {wxSizer, prepend_2_0, 2}},
- {1294, {wxSizer, prepend_3, 3}},
- {1295, {wxSizer, prepend_2_3, 2}},
- {1296, {wxSizer, prepend_2_2, 2}},
- {1297, {wxSizer, prepend_1, 1}},
- {1298, {wxSizer, prependSpacer, 1}},
- {1299, {wxSizer, prependStretchSpacer, 1}},
- {1300, {wxSizer, recalcSizes, 0}},
- {1301, {wxSizer, remove_1_1, 1}},
- {1302, {wxSizer, remove_1_0, 1}},
- {1303, {wxSizer, replace_3_1, 3}},
- {1304, {wxSizer, replace_3_0, 3}},
- {1305, {wxSizer, replace_2, 2}},
- {1306, {wxSizer, setDimension, 4}},
- {1307, {wxSizer, setMinSize_2, 2}},
- {1308, {wxSizer, setMinSize_1, 1}},
- {1309, {wxSizer, setItemMinSize_3_2, 3}},
- {1310, {wxSizer, setItemMinSize_2_2, 2}},
- {1311, {wxSizer, setItemMinSize_3_1, 3}},
- {1312, {wxSizer, setItemMinSize_2_1, 2}},
- {1313, {wxSizer, setItemMinSize_3_0, 3}},
- {1314, {wxSizer, setItemMinSize_2_0, 2}},
- {1315, {wxSizer, setSizeHints, 1}},
- {1316, {wxSizer, setVirtualSizeHints, 1}},
- {1317, {wxSizer, show_2_2, 2}},
- {1318, {wxSizer, show_2_1, 2}},
- {1319, {wxSizer, show_2_0, 2}},
- {1320, {wxSizer, show_1, 1}},
- {1321, {wxSizerFlags, new, 1}},
- {1322, {wxSizerFlags, align, 1}},
- {1323, {wxSizerFlags, border_2, 2}},
- {1324, {wxSizerFlags, border_1, 1}},
- {1325, {wxSizerFlags, center, 0}},
- {1326, {wxSizerFlags, centre, 0}},
- {1327, {wxSizerFlags, expand, 0}},
- {1328, {wxSizerFlags, left, 0}},
- {1329, {wxSizerFlags, proportion, 1}},
- {1330, {wxSizerFlags, right, 0}},
- {1331, {wxSizerFlags, 'Destroy', undefined}},
- {1332, {wxSizerItem, new_5_1, 5}},
- {1333, {wxSizerItem, new_2_1, 2}},
- {1334, {wxSizerItem, new_5_0, 5}},
- {1335, {wxSizerItem, new_2_0, 2}},
- {1336, {wxSizerItem, new_6, 6}},
- {1337, {wxSizerItem, new_3, 3}},
- {1338, {wxSizerItem, new_0, 0}},
- {1339, {wxSizerItem, destruct, 0}},
- {1340, {wxSizerItem, calcMin, 0}},
- {1341, {wxSizerItem, deleteWindows, 0}},
- {1342, {wxSizerItem, detachSizer, 0}},
- {1343, {wxSizerItem, getBorder, 0}},
- {1344, {wxSizerItem, getFlag, 0}},
- {1345, {wxSizerItem, getMinSize, 0}},
- {1346, {wxSizerItem, getPosition, 0}},
- {1347, {wxSizerItem, getProportion, 0}},
- {1348, {wxSizerItem, getRatio, 0}},
- {1349, {wxSizerItem, getRect, 0}},
- {1350, {wxSizerItem, getSize, 0}},
- {1351, {wxSizerItem, getSizer, 0}},
- {1352, {wxSizerItem, getSpacer, 0}},
- {1353, {wxSizerItem, getUserData, 0}},
- {1354, {wxSizerItem, getWindow, 0}},
- {1355, {wxSizerItem, isSizer, 0}},
- {1356, {wxSizerItem, isShown, 0}},
- {1357, {wxSizerItem, isSpacer, 0}},
- {1358, {wxSizerItem, isWindow, 0}},
- {1359, {wxSizerItem, setBorder, 1}},
- {1360, {wxSizerItem, setDimension, 2}},
- {1361, {wxSizerItem, setFlag, 1}},
- {1362, {wxSizerItem, setInitSize, 2}},
- {1363, {wxSizerItem, setMinSize_1, 1}},
- {1364, {wxSizerItem, setMinSize_2, 2}},
- {1365, {wxSizerItem, setProportion, 1}},
- {1366, {wxSizerItem, setRatio_2, 2}},
- {1367, {wxSizerItem, setRatio_1_1, 1}},
- {1368, {wxSizerItem, setRatio_1_0, 1}},
- {1369, {wxSizerItem, setSizer, 1}},
- {1370, {wxSizerItem, setSpacer_1, 1}},
- {1371, {wxSizerItem, setSpacer_2, 2}},
- {1372, {wxSizerItem, setWindow, 1}},
- {1373, {wxSizerItem, show, 1}},
- {1374, {wxBoxSizer, new, 1}},
- {1375, {wxBoxSizer, getOrientation, 0}},
- {1376, {wxBoxSizer, 'Destroy', undefined}},
- {1377, {wxStaticBoxSizer, new_2, 2}},
- {1378, {wxStaticBoxSizer, new_3, 3}},
- {1379, {wxStaticBoxSizer, getStaticBox, 0}},
- {1380, {wxStaticBoxSizer, 'Destroy', undefined}},
- {1381, {wxGridSizer, new_4, 4}},
- {1382, {wxGridSizer, new_2, 2}},
- {1383, {wxGridSizer, getCols, 0}},
- {1384, {wxGridSizer, getHGap, 0}},
- {1385, {wxGridSizer, getRows, 0}},
- {1386, {wxGridSizer, getVGap, 0}},
- {1387, {wxGridSizer, setCols, 1}},
- {1388, {wxGridSizer, setHGap, 1}},
- {1389, {wxGridSizer, setRows, 1}},
- {1390, {wxGridSizer, setVGap, 1}},
- {1391, {wxGridSizer, 'Destroy', undefined}},
- {1392, {wxFlexGridSizer, new_4, 4}},
- {1393, {wxFlexGridSizer, new_2, 2}},
- {1394, {wxFlexGridSizer, addGrowableCol, 2}},
- {1395, {wxFlexGridSizer, addGrowableRow, 2}},
- {1396, {wxFlexGridSizer, getFlexibleDirection, 0}},
- {1397, {wxFlexGridSizer, getNonFlexibleGrowMode, 0}},
- {1398, {wxFlexGridSizer, removeGrowableCol, 1}},
- {1399, {wxFlexGridSizer, removeGrowableRow, 1}},
- {1400, {wxFlexGridSizer, setFlexibleDirection, 1}},
- {1401, {wxFlexGridSizer, setNonFlexibleGrowMode, 1}},
- {1402, {wxFlexGridSizer, 'Destroy', undefined}},
- {1403, {wxGridBagSizer, new, 1}},
- {1404, {wxGridBagSizer, add_3_2, 3}},
- {1405, {wxGridBagSizer, add_3_1, 3}},
- {1406, {wxGridBagSizer, add_4, 4}},
- {1407, {wxGridBagSizer, add_1_0, 1}},
- {1408, {wxGridBagSizer, add_2_1, 2}},
- {1409, {wxGridBagSizer, add_2_0, 2}},
- {1410, {wxGridBagSizer, add_3_0, 3}},
- {1411, {wxGridBagSizer, add_1_1, 1}},
- {1412, {wxGridBagSizer, calcMin, 0}},
- {1413, {wxGridBagSizer, checkForIntersection_2, 2}},
- {1414, {wxGridBagSizer, checkForIntersection_3, 3}},
- {1415, {wxGridBagSizer, findItem_1_1, 1}},
- {1416, {wxGridBagSizer, findItem_1_0, 1}},
- {1417, {wxGridBagSizer, findItemAtPoint, 1}},
- {1418, {wxGridBagSizer, findItemAtPosition, 1}},
- {1419, {wxGridBagSizer, findItemWithData, 1}},
- {1420, {wxGridBagSizer, getCellSize, 2}},
- {1421, {wxGridBagSizer, getEmptyCellSize, 0}},
- {1422, {wxGridBagSizer, getItemPosition_1_2, 1}},
- {1423, {wxGridBagSizer, getItemPosition_1_1, 1}},
- {1424, {wxGridBagSizer, getItemPosition_1_0, 1}},
- {1425, {wxGridBagSizer, getItemSpan_1_2, 1}},
- {1426, {wxGridBagSizer, getItemSpan_1_1, 1}},
- {1427, {wxGridBagSizer, getItemSpan_1_0, 1}},
- {1428, {wxGridBagSizer, setEmptyCellSize, 1}},
- {1429, {wxGridBagSizer, setItemPosition_2_2, 2}},
- {1430, {wxGridBagSizer, setItemPosition_2_1, 2}},
- {1431, {wxGridBagSizer, setItemPosition_2_0, 2}},
- {1432, {wxGridBagSizer, setItemSpan_2_2, 2}},
- {1433, {wxGridBagSizer, setItemSpan_2_1, 2}},
- {1434, {wxGridBagSizer, setItemSpan_2_0, 2}},
- {1435, {wxGridBagSizer, 'Destroy', undefined}},
- {1436, {wxStdDialogButtonSizer, new, 0}},
- {1437, {wxStdDialogButtonSizer, addButton, 1}},
- {1438, {wxStdDialogButtonSizer, realize, 0}},
- {1439, {wxStdDialogButtonSizer, setAffirmativeButton, 1}},
- {1440, {wxStdDialogButtonSizer, setCancelButton, 1}},
- {1441, {wxStdDialogButtonSizer, setNegativeButton, 1}},
- {1442, {wxStdDialogButtonSizer, 'Destroy', undefined}},
- {1443, {wxFont, new_0, 0}},
- {1444, {wxFont, new_1, 1}},
- {1445, {wxFont, new_5, 5}},
- {1447, {wxFont, destruct, 0}},
- {1448, {wxFont, isFixedWidth, 0}},
- {1449, {wxFont, getDefaultEncoding, 0}},
- {1450, {wxFont, getFaceName, 0}},
- {1451, {wxFont, getFamily, 0}},
- {1452, {wxFont, getNativeFontInfoDesc, 0}},
- {1453, {wxFont, getNativeFontInfoUserDesc, 0}},
- {1454, {wxFont, getPointSize, 0}},
- {1455, {wxFont, getStyle, 0}},
- {1456, {wxFont, getUnderlined, 0}},
- {1457, {wxFont, getWeight, 0}},
- {1458, {wxFont, ok, 0}},
- {1459, {wxFont, setDefaultEncoding, 1}},
- {1460, {wxFont, setFaceName, 1}},
- {1461, {wxFont, setFamily, 1}},
- {1462, {wxFont, setPointSize, 1}},
- {1463, {wxFont, setStyle, 1}},
- {1464, {wxFont, setUnderlined, 1}},
- {1465, {wxFont, setWeight, 1}},
- {1466, {wxToolTip, enable, 1}},
- {1467, {wxToolTip, setDelay, 1}},
- {1468, {wxToolTip, new, 1}},
- {1469, {wxToolTip, setTip, 1}},
- {1470, {wxToolTip, getTip, 0}},
- {1471, {wxToolTip, getWindow, 0}},
- {1472, {wxToolTip, 'Destroy', undefined}},
- {1474, {wxButton, new_3, 3}},
- {1475, {wxButton, new_0, 0}},
- {1476, {wxButton, destruct, 0}},
- {1477, {wxButton, create, 3}},
- {1478, {wxButton, getDefaultSize, 0}},
- {1479, {wxButton, setDefault, 0}},
- {1480, {wxButton, setLabel, 1}},
- {1482, {wxBitmapButton, new_4, 4}},
- {1483, {wxBitmapButton, new_0, 0}},
- {1484, {wxBitmapButton, create, 4}},
- {1485, {wxBitmapButton, getBitmapDisabled, 0}},
- {1487, {wxBitmapButton, getBitmapFocus, 0}},
- {1489, {wxBitmapButton, getBitmapLabel, 0}},
- {1491, {wxBitmapButton, getBitmapSelected, 0}},
- {1493, {wxBitmapButton, setBitmapDisabled, 1}},
- {1494, {wxBitmapButton, setBitmapFocus, 1}},
- {1495, {wxBitmapButton, setBitmapLabel, 1}},
- {1496, {wxBitmapButton, setBitmapSelected, 1}},
- {1497, {wxBitmapButton, 'Destroy', undefined}},
- {1498, {wxToggleButton, new_0, 0}},
- {1499, {wxToggleButton, new_4, 4}},
- {1500, {wxToggleButton, create, 4}},
- {1501, {wxToggleButton, getValue, 0}},
- {1502, {wxToggleButton, setValue, 1}},
- {1503, {wxToggleButton, 'Destroy', undefined}},
- {1504, {wxCalendarCtrl, new_0, 0}},
- {1505, {wxCalendarCtrl, new_3, 3}},
- {1506, {wxCalendarCtrl, create, 3}},
- {1507, {wxCalendarCtrl, destruct, 0}},
- {1508, {wxCalendarCtrl, setDate, 1}},
- {1509, {wxCalendarCtrl, getDate, 0}},
- {1510, {wxCalendarCtrl, enableYearChange, 1}},
- {1511, {wxCalendarCtrl, enableMonthChange, 1}},
- {1512, {wxCalendarCtrl, enableHolidayDisplay, 1}},
- {1513, {wxCalendarCtrl, setHeaderColours, 2}},
- {1514, {wxCalendarCtrl, getHeaderColourFg, 0}},
- {1515, {wxCalendarCtrl, getHeaderColourBg, 0}},
- {1516, {wxCalendarCtrl, setHighlightColours, 2}},
- {1517, {wxCalendarCtrl, getHighlightColourFg, 0}},
- {1518, {wxCalendarCtrl, getHighlightColourBg, 0}},
- {1519, {wxCalendarCtrl, setHolidayColours, 2}},
- {1520, {wxCalendarCtrl, getHolidayColourFg, 0}},
- {1521, {wxCalendarCtrl, getHolidayColourBg, 0}},
- {1522, {wxCalendarCtrl, getAttr, 1}},
- {1523, {wxCalendarCtrl, setAttr, 2}},
- {1524, {wxCalendarCtrl, setHoliday, 1}},
- {1525, {wxCalendarCtrl, resetAttr, 1}},
- {1526, {wxCalendarCtrl, hitTest, 2}},
- {1527, {wxCalendarDateAttr, new_0, 0}},
- {1528, {wxCalendarDateAttr, new_2_1, 2}},
- {1529, {wxCalendarDateAttr, new_2_0, 2}},
- {1530, {wxCalendarDateAttr, setTextColour, 1}},
- {1531, {wxCalendarDateAttr, setBackgroundColour, 1}},
- {1532, {wxCalendarDateAttr, setBorderColour, 1}},
- {1533, {wxCalendarDateAttr, setFont, 1}},
- {1534, {wxCalendarDateAttr, setBorder, 1}},
- {1535, {wxCalendarDateAttr, setHoliday, 1}},
- {1536, {wxCalendarDateAttr, hasTextColour, 0}},
- {1537, {wxCalendarDateAttr, hasBackgroundColour, 0}},
- {1538, {wxCalendarDateAttr, hasBorderColour, 0}},
- {1539, {wxCalendarDateAttr, hasFont, 0}},
- {1540, {wxCalendarDateAttr, hasBorder, 0}},
- {1541, {wxCalendarDateAttr, isHoliday, 0}},
- {1542, {wxCalendarDateAttr, getTextColour, 0}},
- {1543, {wxCalendarDateAttr, getBackgroundColour, 0}},
- {1544, {wxCalendarDateAttr, getBorderColour, 0}},
- {1545, {wxCalendarDateAttr, getFont, 0}},
- {1546, {wxCalendarDateAttr, getBorder, 0}},
- {1547, {wxCalendarDateAttr, 'Destroy', undefined}},
- {1549, {wxCheckBox, new_4, 4}},
- {1550, {wxCheckBox, new_0, 0}},
- {1551, {wxCheckBox, create, 4}},
- {1552, {wxCheckBox, getValue, 0}},
- {1553, {wxCheckBox, get3StateValue, 0}},
- {1554, {wxCheckBox, is3rdStateAllowedForUser, 0}},
- {1555, {wxCheckBox, is3State, 0}},
- {1556, {wxCheckBox, isChecked, 0}},
- {1557, {wxCheckBox, setValue, 1}},
- {1558, {wxCheckBox, set3StateValue, 1}},
- {1559, {wxCheckBox, 'Destroy', undefined}},
- {1560, {wxCheckListBox, new_0, 0}},
- {1562, {wxCheckListBox, new_3, 3}},
- {1563, {wxCheckListBox, check, 2}},
- {1564, {wxCheckListBox, isChecked, 1}},
- {1565, {wxCheckListBox, 'Destroy', undefined}},
- {1568, {wxChoice, new_3, 3}},
- {1569, {wxChoice, new_0, 0}},
- {1571, {wxChoice, destruct, 0}},
- {1573, {wxChoice, create, 6}},
- {1574, {wxChoice, delete, 1}},
- {1575, {wxChoice, getColumns, 0}},
- {1576, {wxChoice, setColumns, 1}},
- {1577, {wxComboBox, new_0, 0}},
- {1579, {wxComboBox, new_3, 3}},
- {1580, {wxComboBox, destruct, 0}},
- {1582, {wxComboBox, create, 7}},
- {1583, {wxComboBox, canCopy, 0}},
- {1584, {wxComboBox, canCut, 0}},
- {1585, {wxComboBox, canPaste, 0}},
- {1586, {wxComboBox, canRedo, 0}},
- {1587, {wxComboBox, canUndo, 0}},
- {1588, {wxComboBox, copy, 0}},
- {1589, {wxComboBox, cut, 0}},
- {1590, {wxComboBox, getInsertionPoint, 0}},
- {1591, {wxComboBox, getLastPosition, 0}},
- {1592, {wxComboBox, getValue, 0}},
- {1593, {wxComboBox, paste, 0}},
- {1594, {wxComboBox, redo, 0}},
- {1595, {wxComboBox, replace, 3}},
- {1596, {wxComboBox, remove, 2}},
- {1597, {wxComboBox, setInsertionPoint, 1}},
- {1598, {wxComboBox, setInsertionPointEnd, 0}},
- {1599, {wxComboBox, setSelection_1, 1}},
- {1600, {wxComboBox, setSelection_2, 2}},
- {1601, {wxComboBox, setValue, 1}},
- {1602, {wxComboBox, undo, 0}},
- {1603, {wxGauge, new_0, 0}},
- {1604, {wxGauge, new_4, 4}},
- {1605, {wxGauge, create, 4}},
- {1606, {wxGauge, getRange, 0}},
- {1607, {wxGauge, getValue, 0}},
- {1608, {wxGauge, isVertical, 0}},
- {1609, {wxGauge, setRange, 1}},
- {1610, {wxGauge, setValue, 1}},
- {1611, {wxGauge, pulse, 0}},
- {1612, {wxGauge, 'Destroy', undefined}},
- {1613, {wxGenericDirCtrl, new_0, 0}},
- {1614, {wxGenericDirCtrl, new_2, 2}},
- {1615, {wxGenericDirCtrl, destruct, 0}},
- {1616, {wxGenericDirCtrl, create, 2}},
- {1617, {wxGenericDirCtrl, init, 0}},
- {1618, {wxGenericDirCtrl, collapseTree, 0}},
- {1619, {wxGenericDirCtrl, expandPath, 1}},
- {1620, {wxGenericDirCtrl, getDefaultPath, 0}},
- {1621, {wxGenericDirCtrl, getPath, 0}},
- {1622, {wxGenericDirCtrl, getFilePath, 0}},
- {1623, {wxGenericDirCtrl, getFilter, 0}},
- {1624, {wxGenericDirCtrl, getFilterIndex, 0}},
- {1625, {wxGenericDirCtrl, getRootId, 0}},
- {1626, {wxGenericDirCtrl, getTreeCtrl, 0}},
- {1627, {wxGenericDirCtrl, reCreateTree, 0}},
- {1628, {wxGenericDirCtrl, setDefaultPath, 1}},
- {1629, {wxGenericDirCtrl, setFilter, 1}},
- {1630, {wxGenericDirCtrl, setFilterIndex, 1}},
- {1631, {wxGenericDirCtrl, setPath, 1}},
- {1633, {wxStaticBox, new_4, 4}},
- {1634, {wxStaticBox, new_0, 0}},
- {1635, {wxStaticBox, create, 4}},
- {1636, {wxStaticBox, 'Destroy', undefined}},
- {1638, {wxStaticLine, new_2, 2}},
- {1639, {wxStaticLine, new_0, 0}},
- {1640, {wxStaticLine, create, 2}},
- {1641, {wxStaticLine, isVertical, 0}},
- {1642, {wxStaticLine, getDefaultSize, 0}},
- {1643, {wxStaticLine, 'Destroy', undefined}},
- {1646, {wxListBox, new_3, 3}},
- {1647, {wxListBox, new_0, 0}},
- {1649, {wxListBox, destruct, 0}},
- {1651, {wxListBox, create, 6}},
- {1652, {wxListBox, deselect, 1}},
- {1653, {wxListBox, getSelections, 1}},
- {1654, {wxListBox, insertItems, 2}},
- {1655, {wxListBox, isSelected, 1}},
- {1656, {wxListBox, set, 1}},
- {1657, {wxListBox, hitTest, 1}},
- {1658, {wxListBox, setFirstItem_1_0, 1}},
- {1659, {wxListBox, setFirstItem_1_1, 1}},
- {1660, {wxListCtrl, new_0, 0}},
- {1661, {wxListCtrl, new_2, 2}},
- {1662, {wxListCtrl, arrange, 1}},
- {1663, {wxListCtrl, assignImageList, 2}},
- {1664, {wxListCtrl, clearAll, 0}},
- {1665, {wxListCtrl, create, 2}},
- {1666, {wxListCtrl, deleteAllItems, 0}},
- {1667, {wxListCtrl, deleteColumn, 1}},
- {1668, {wxListCtrl, deleteItem, 1}},
- {1669, {wxListCtrl, editLabel, 1}},
- {1670, {wxListCtrl, ensureVisible, 1}},
- {1671, {wxListCtrl, findItem_3_0, 3}},
- {1672, {wxListCtrl, findItem_3_1, 3}},
- {1673, {wxListCtrl, getColumn, 2}},
- {1674, {wxListCtrl, getColumnCount, 0}},
- {1675, {wxListCtrl, getColumnWidth, 1}},
- {1676, {wxListCtrl, getCountPerPage, 0}},
- {1677, {wxListCtrl, getEditControl, 0}},
- {1678, {wxListCtrl, getImageList, 1}},
- {1679, {wxListCtrl, getItem, 1}},
- {1680, {wxListCtrl, getItemBackgroundColour, 1}},
- {1681, {wxListCtrl, getItemCount, 0}},
- {1682, {wxListCtrl, getItemData, 1}},
- {1683, {wxListCtrl, getItemFont, 1}},
- {1684, {wxListCtrl, getItemPosition, 2}},
- {1685, {wxListCtrl, getItemRect, 3}},
- {1686, {wxListCtrl, getItemSpacing, 0}},
- {1687, {wxListCtrl, getItemState, 2}},
- {1688, {wxListCtrl, getItemText, 1}},
- {1689, {wxListCtrl, getItemTextColour, 1}},
- {1690, {wxListCtrl, getNextItem, 2}},
- {1691, {wxListCtrl, getSelectedItemCount, 0}},
- {1692, {wxListCtrl, getTextColour, 0}},
- {1693, {wxListCtrl, getTopItem, 0}},
- {1694, {wxListCtrl, getViewRect, 0}},
- {1695, {wxListCtrl, hitTest, 3}},
- {1696, {wxListCtrl, insertColumn_2, 2}},
- {1697, {wxListCtrl, insertColumn_3, 3}},
- {1698, {wxListCtrl, insertItem_1, 1}},
- {1699, {wxListCtrl, insertItem_2_1, 2}},
- {1700, {wxListCtrl, insertItem_2_0, 2}},
- {1701, {wxListCtrl, insertItem_3, 3}},
- {1702, {wxListCtrl, refreshItem, 1}},
- {1703, {wxListCtrl, refreshItems, 2}},
- {1704, {wxListCtrl, scrollList, 2}},
- {1705, {wxListCtrl, setBackgroundColour, 1}},
- {1706, {wxListCtrl, setColumn, 2}},
- {1707, {wxListCtrl, setColumnWidth, 2}},
- {1708, {wxListCtrl, setImageList, 2}},
- {1709, {wxListCtrl, setItem_1, 1}},
- {1710, {wxListCtrl, setItem_4, 4}},
- {1711, {wxListCtrl, setItemBackgroundColour, 2}},
- {1712, {wxListCtrl, setItemCount, 1}},
- {1713, {wxListCtrl, setItemData, 2}},
- {1714, {wxListCtrl, setItemFont, 2}},
- {1715, {wxListCtrl, setItemImage, 3}},
- {1716, {wxListCtrl, setItemColumnImage, 3}},
- {1717, {wxListCtrl, setItemPosition, 2}},
- {1718, {wxListCtrl, setItemState, 3}},
- {1719, {wxListCtrl, setItemText, 2}},
- {1720, {wxListCtrl, setItemTextColour, 2}},
- {1721, {wxListCtrl, setSingleStyle, 2}},
- {1722, {wxListCtrl, setTextColour, 1}},
- {1723, {wxListCtrl, setWindowStyleFlag, 1}},
- {1724, {wxListCtrl, sortItems, 2}},
- {1725, {wxListCtrl, 'Destroy', undefined}},
- {1726, {wxListView, clearColumnImage, 1}},
- {1727, {wxListView, focus, 1}},
- {1728, {wxListView, getFirstSelected, 0}},
- {1729, {wxListView, getFocusedItem, 0}},
- {1730, {wxListView, getNextSelected, 1}},
- {1731, {wxListView, isSelected, 1}},
- {1732, {wxListView, select, 2}},
- {1733, {wxListView, setColumnImage, 2}},
- {1734, {wxListItem, new_0, 0}},
- {1735, {wxListItem, new_1, 1}},
- {1736, {wxListItem, destruct, 0}},
- {1737, {wxListItem, clear, 0}},
- {1738, {wxListItem, getAlign, 0}},
- {1739, {wxListItem, getBackgroundColour, 0}},
- {1740, {wxListItem, getColumn, 0}},
- {1741, {wxListItem, getFont, 0}},
- {1742, {wxListItem, getId, 0}},
- {1743, {wxListItem, getImage, 0}},
- {1744, {wxListItem, getMask, 0}},
- {1745, {wxListItem, getState, 0}},
- {1746, {wxListItem, getText, 0}},
- {1747, {wxListItem, getTextColour, 0}},
- {1748, {wxListItem, getWidth, 0}},
- {1749, {wxListItem, setAlign, 1}},
- {1750, {wxListItem, setBackgroundColour, 1}},
- {1751, {wxListItem, setColumn, 1}},
- {1752, {wxListItem, setFont, 1}},
- {1753, {wxListItem, setId, 1}},
- {1754, {wxListItem, setImage, 1}},
- {1755, {wxListItem, setMask, 1}},
- {1756, {wxListItem, setState, 1}},
- {1757, {wxListItem, setStateMask, 1}},
- {1758, {wxListItem, setText, 1}},
- {1759, {wxListItem, setTextColour, 1}},
- {1760, {wxListItem, setWidth, 1}},
- {1761, {wxListItemAttr, new_0, 0}},
- {1762, {wxListItemAttr, new_3, 3}},
- {1763, {wxListItemAttr, getBackgroundColour, 0}},
- {1764, {wxListItemAttr, getFont, 0}},
- {1765, {wxListItemAttr, getTextColour, 0}},
- {1766, {wxListItemAttr, hasBackgroundColour, 0}},
- {1767, {wxListItemAttr, hasFont, 0}},
- {1768, {wxListItemAttr, hasTextColour, 0}},
- {1769, {wxListItemAttr, setBackgroundColour, 1}},
- {1770, {wxListItemAttr, setFont, 1}},
- {1771, {wxListItemAttr, setTextColour, 1}},
- {1772, {wxListItemAttr, 'Destroy', undefined}},
- {1773, {wxImageList, new_0, 0}},
- {1774, {wxImageList, new_3, 3}},
- {1775, {wxImageList, add_1, 1}},
- {1776, {wxImageList, add_2_0, 2}},
- {1777, {wxImageList, add_2_1, 2}},
- {1778, {wxImageList, create, 3}},
- {1780, {wxImageList, draw, 5}},
- {1781, {wxImageList, getBitmap, 1}},
- {1782, {wxImageList, getIcon, 1}},
- {1783, {wxImageList, getImageCount, 0}},
- {1784, {wxImageList, getSize, 3}},
- {1785, {wxImageList, remove, 1}},
- {1786, {wxImageList, removeAll, 0}},
- {1787, {wxImageList, replace_2, 2}},
- {1788, {wxImageList, replace_3, 3}},
- {1789, {wxImageList, 'Destroy', undefined}},
- {1790, {wxTextAttr, new_0, 0}},
- {1791, {wxTextAttr, new_2, 2}},
- {1792, {wxTextAttr, getAlignment, 0}},
- {1793, {wxTextAttr, getBackgroundColour, 0}},
- {1794, {wxTextAttr, getFont, 0}},
- {1795, {wxTextAttr, getLeftIndent, 0}},
- {1796, {wxTextAttr, getLeftSubIndent, 0}},
- {1797, {wxTextAttr, getRightIndent, 0}},
- {1798, {wxTextAttr, getTabs, 0}},
- {1799, {wxTextAttr, getTextColour, 0}},
- {1800, {wxTextAttr, hasBackgroundColour, 0}},
- {1801, {wxTextAttr, hasFont, 0}},
- {1802, {wxTextAttr, hasTextColour, 0}},
- {1803, {wxTextAttr, getFlags, 0}},
- {1804, {wxTextAttr, isDefault, 0}},
- {1805, {wxTextAttr, setAlignment, 1}},
- {1806, {wxTextAttr, setBackgroundColour, 1}},
- {1807, {wxTextAttr, setFlags, 1}},
- {1808, {wxTextAttr, setFont, 2}},
- {1809, {wxTextAttr, setLeftIndent, 2}},
- {1810, {wxTextAttr, setRightIndent, 1}},
- {1811, {wxTextAttr, setTabs, 1}},
- {1812, {wxTextAttr, setTextColour, 1}},
- {1813, {wxTextAttr, 'Destroy', undefined}},
- {1815, {wxTextCtrl, new_3, 3}},
- {1816, {wxTextCtrl, new_0, 0}},
- {1818, {wxTextCtrl, destruct, 0}},
- {1819, {wxTextCtrl, appendText, 1}},
- {1820, {wxTextCtrl, canCopy, 0}},
- {1821, {wxTextCtrl, canCut, 0}},
- {1822, {wxTextCtrl, canPaste, 0}},
- {1823, {wxTextCtrl, canRedo, 0}},
- {1824, {wxTextCtrl, canUndo, 0}},
- {1825, {wxTextCtrl, clear, 0}},
- {1826, {wxTextCtrl, copy, 0}},
- {1827, {wxTextCtrl, create, 3}},
- {1828, {wxTextCtrl, cut, 0}},
- {1829, {wxTextCtrl, discardEdits, 0}},
- {1830, {wxTextCtrl, changeValue, 1}},
- {1831, {wxTextCtrl, emulateKeyPress, 1}},
- {1832, {wxTextCtrl, getDefaultStyle, 0}},
- {1833, {wxTextCtrl, getInsertionPoint, 0}},
- {1834, {wxTextCtrl, getLastPosition, 0}},
- {1835, {wxTextCtrl, getLineLength, 1}},
- {1836, {wxTextCtrl, getLineText, 1}},
- {1837, {wxTextCtrl, getNumberOfLines, 0}},
- {1838, {wxTextCtrl, getRange, 2}},
- {1839, {wxTextCtrl, getSelection, 2}},
- {1840, {wxTextCtrl, getStringSelection, 0}},
- {1841, {wxTextCtrl, getStyle, 2}},
- {1842, {wxTextCtrl, getValue, 0}},
- {1843, {wxTextCtrl, isEditable, 0}},
- {1844, {wxTextCtrl, isModified, 0}},
- {1845, {wxTextCtrl, isMultiLine, 0}},
- {1846, {wxTextCtrl, isSingleLine, 0}},
- {1847, {wxTextCtrl, loadFile, 2}},
- {1848, {wxTextCtrl, markDirty, 0}},
- {1849, {wxTextCtrl, paste, 0}},
- {1850, {wxTextCtrl, positionToXY, 3}},
- {1851, {wxTextCtrl, redo, 0}},
- {1852, {wxTextCtrl, remove, 2}},
- {1853, {wxTextCtrl, replace, 3}},
- {1854, {wxTextCtrl, saveFile, 1}},
- {1855, {wxTextCtrl, setDefaultStyle, 1}},
- {1856, {wxTextCtrl, setEditable, 1}},
- {1857, {wxTextCtrl, setInsertionPoint, 1}},
- {1858, {wxTextCtrl, setInsertionPointEnd, 0}},
- {1860, {wxTextCtrl, setMaxLength, 1}},
- {1861, {wxTextCtrl, setSelection, 2}},
- {1862, {wxTextCtrl, setStyle, 3}},
- {1863, {wxTextCtrl, setValue, 1}},
- {1864, {wxTextCtrl, showPosition, 1}},
- {1865, {wxTextCtrl, undo, 0}},
- {1866, {wxTextCtrl, writeText, 1}},
- {1867, {wxTextCtrl, xYToPosition, 2}},
- {1870, {wxNotebook, new_0, 0}},
- {1871, {wxNotebook, new_3, 3}},
- {1872, {wxNotebook, destruct, 0}},
- {1873, {wxNotebook, addPage, 3}},
- {1874, {wxNotebook, advanceSelection, 1}},
- {1875, {wxNotebook, assignImageList, 1}},
- {1876, {wxNotebook, create, 3}},
- {1877, {wxNotebook, deleteAllPages, 0}},
- {1878, {wxNotebook, deletePage, 1}},
- {1879, {wxNotebook, removePage, 1}},
- {1880, {wxNotebook, getCurrentPage, 0}},
- {1881, {wxNotebook, getImageList, 0}},
- {1883, {wxNotebook, getPage, 1}},
- {1884, {wxNotebook, getPageCount, 0}},
- {1885, {wxNotebook, getPageImage, 1}},
- {1886, {wxNotebook, getPageText, 1}},
- {1887, {wxNotebook, getRowCount, 0}},
- {1888, {wxNotebook, getSelection, 0}},
- {1889, {wxNotebook, getThemeBackgroundColour, 0}},
- {1891, {wxNotebook, hitTest, 2}},
- {1893, {wxNotebook, insertPage, 4}},
- {1894, {wxNotebook, setImageList, 1}},
- {1895, {wxNotebook, setPadding, 1}},
- {1896, {wxNotebook, setPageSize, 1}},
- {1897, {wxNotebook, setPageImage, 2}},
- {1898, {wxNotebook, setPageText, 2}},
- {1899, {wxNotebook, setSelection, 1}},
- {1900, {wxNotebook, changeSelection, 1}},
- {1901, {wxChoicebook, new_0, 0}},
- {1902, {wxChoicebook, new_3, 3}},
- {1903, {wxChoicebook, addPage, 3}},
- {1904, {wxChoicebook, advanceSelection, 1}},
- {1905, {wxChoicebook, assignImageList, 1}},
- {1906, {wxChoicebook, create, 3}},
- {1907, {wxChoicebook, deleteAllPages, 0}},
- {1908, {wxChoicebook, deletePage, 1}},
- {1909, {wxChoicebook, removePage, 1}},
- {1910, {wxChoicebook, getCurrentPage, 0}},
- {1911, {wxChoicebook, getImageList, 0}},
- {1913, {wxChoicebook, getPage, 1}},
- {1914, {wxChoicebook, getPageCount, 0}},
- {1915, {wxChoicebook, getPageImage, 1}},
- {1916, {wxChoicebook, getPageText, 1}},
- {1917, {wxChoicebook, getSelection, 0}},
- {1918, {wxChoicebook, hitTest, 2}},
- {1919, {wxChoicebook, insertPage, 4}},
- {1920, {wxChoicebook, setImageList, 1}},
- {1921, {wxChoicebook, setPageSize, 1}},
- {1922, {wxChoicebook, setPageImage, 2}},
- {1923, {wxChoicebook, setPageText, 2}},
- {1924, {wxChoicebook, setSelection, 1}},
- {1925, {wxChoicebook, changeSelection, 1}},
- {1926, {wxChoicebook, 'Destroy', undefined}},
- {1927, {wxToolbook, new_0, 0}},
- {1928, {wxToolbook, new_3, 3}},
- {1929, {wxToolbook, addPage, 3}},
- {1930, {wxToolbook, advanceSelection, 1}},
- {1931, {wxToolbook, assignImageList, 1}},
- {1932, {wxToolbook, create, 3}},
- {1933, {wxToolbook, deleteAllPages, 0}},
- {1934, {wxToolbook, deletePage, 1}},
- {1935, {wxToolbook, removePage, 1}},
- {1936, {wxToolbook, getCurrentPage, 0}},
- {1937, {wxToolbook, getImageList, 0}},
- {1939, {wxToolbook, getPage, 1}},
- {1940, {wxToolbook, getPageCount, 0}},
- {1941, {wxToolbook, getPageImage, 1}},
- {1942, {wxToolbook, getPageText, 1}},
- {1943, {wxToolbook, getSelection, 0}},
- {1945, {wxToolbook, hitTest, 2}},
- {1946, {wxToolbook, insertPage, 4}},
- {1947, {wxToolbook, setImageList, 1}},
- {1948, {wxToolbook, setPageSize, 1}},
- {1949, {wxToolbook, setPageImage, 2}},
- {1950, {wxToolbook, setPageText, 2}},
- {1951, {wxToolbook, setSelection, 1}},
- {1952, {wxToolbook, changeSelection, 1}},
- {1953, {wxToolbook, 'Destroy', undefined}},
- {1954, {wxListbook, new_0, 0}},
- {1955, {wxListbook, new_3, 3}},
- {1956, {wxListbook, addPage, 3}},
- {1957, {wxListbook, advanceSelection, 1}},
- {1958, {wxListbook, assignImageList, 1}},
- {1959, {wxListbook, create, 3}},
- {1960, {wxListbook, deleteAllPages, 0}},
- {1961, {wxListbook, deletePage, 1}},
- {1962, {wxListbook, removePage, 1}},
- {1963, {wxListbook, getCurrentPage, 0}},
- {1964, {wxListbook, getImageList, 0}},
- {1966, {wxListbook, getPage, 1}},
- {1967, {wxListbook, getPageCount, 0}},
- {1968, {wxListbook, getPageImage, 1}},
- {1969, {wxListbook, getPageText, 1}},
- {1970, {wxListbook, getSelection, 0}},
- {1972, {wxListbook, hitTest, 2}},
- {1973, {wxListbook, insertPage, 4}},
- {1974, {wxListbook, setImageList, 1}},
- {1975, {wxListbook, setPageSize, 1}},
- {1976, {wxListbook, setPageImage, 2}},
- {1977, {wxListbook, setPageText, 2}},
- {1978, {wxListbook, setSelection, 1}},
- {1979, {wxListbook, changeSelection, 1}},
- {1980, {wxListbook, 'Destroy', undefined}},
- {1981, {wxTreebook, new_0, 0}},
- {1982, {wxTreebook, new_3, 3}},
- {1983, {wxTreebook, addPage, 3}},
- {1984, {wxTreebook, advanceSelection, 1}},
- {1985, {wxTreebook, assignImageList, 1}},
- {1986, {wxTreebook, create, 3}},
- {1987, {wxTreebook, deleteAllPages, 0}},
- {1988, {wxTreebook, deletePage, 1}},
- {1989, {wxTreebook, removePage, 1}},
- {1990, {wxTreebook, getCurrentPage, 0}},
- {1991, {wxTreebook, getImageList, 0}},
- {1993, {wxTreebook, getPage, 1}},
- {1994, {wxTreebook, getPageCount, 0}},
- {1995, {wxTreebook, getPageImage, 1}},
- {1996, {wxTreebook, getPageText, 1}},
- {1997, {wxTreebook, getSelection, 0}},
- {1998, {wxTreebook, expandNode, 2}},
- {1999, {wxTreebook, isNodeExpanded, 1}},
- {2001, {wxTreebook, hitTest, 2}},
- {2002, {wxTreebook, insertPage, 4}},
- {2003, {wxTreebook, insertSubPage, 4}},
- {2004, {wxTreebook, setImageList, 1}},
- {2005, {wxTreebook, setPageSize, 1}},
- {2006, {wxTreebook, setPageImage, 2}},
- {2007, {wxTreebook, setPageText, 2}},
- {2008, {wxTreebook, setSelection, 1}},
- {2009, {wxTreebook, changeSelection, 1}},
- {2010, {wxTreebook, 'Destroy', undefined}},
- {2013, {wxTreeCtrl, new_2, 2}},
- {2014, {wxTreeCtrl, new_0, 0}},
- {2016, {wxTreeCtrl, destruct, 0}},
- {2017, {wxTreeCtrl, addRoot, 2}},
- {2018, {wxTreeCtrl, appendItem, 3}},
- {2019, {wxTreeCtrl, assignImageList, 1}},
- {2020, {wxTreeCtrl, assignStateImageList, 1}},
- {2021, {wxTreeCtrl, collapse, 1}},
- {2022, {wxTreeCtrl, collapseAndReset, 1}},
- {2023, {wxTreeCtrl, create, 2}},
- {2024, {wxTreeCtrl, delete, 1}},
- {2025, {wxTreeCtrl, deleteAllItems, 0}},
- {2026, {wxTreeCtrl, deleteChildren, 1}},
- {2027, {wxTreeCtrl, editLabel, 1}},
- {2028, {wxTreeCtrl, ensureVisible, 1}},
- {2029, {wxTreeCtrl, expand, 1}},
- {2030, {wxTreeCtrl, getBoundingRect, 3}},
- {2032, {wxTreeCtrl, getChildrenCount, 2}},
- {2033, {wxTreeCtrl, getCount, 0}},
- {2034, {wxTreeCtrl, getEditControl, 0}},
- {2035, {wxTreeCtrl, getFirstChild, 2}},
- {2036, {wxTreeCtrl, getNextChild, 2}},
- {2037, {wxTreeCtrl, getFirstVisibleItem, 0}},
- {2038, {wxTreeCtrl, getImageList, 0}},
- {2039, {wxTreeCtrl, getIndent, 0}},
- {2040, {wxTreeCtrl, getItemBackgroundColour, 1}},
- {2041, {wxTreeCtrl, getItemData, 1}},
- {2042, {wxTreeCtrl, getItemFont, 1}},
- {2043, {wxTreeCtrl, getItemImage_1, 1}},
- {2044, {wxTreeCtrl, getItemImage_2, 2}},
- {2045, {wxTreeCtrl, getItemText, 1}},
- {2046, {wxTreeCtrl, getItemTextColour, 1}},
- {2047, {wxTreeCtrl, getLastChild, 1}},
- {2048, {wxTreeCtrl, getNextSibling, 1}},
- {2049, {wxTreeCtrl, getNextVisible, 1}},
- {2050, {wxTreeCtrl, getItemParent, 1}},
- {2051, {wxTreeCtrl, getPrevSibling, 1}},
- {2052, {wxTreeCtrl, getPrevVisible, 1}},
- {2053, {wxTreeCtrl, getRootItem, 0}},
- {2054, {wxTreeCtrl, getSelection, 0}},
- {2055, {wxTreeCtrl, getSelections, 1}},
- {2056, {wxTreeCtrl, getStateImageList, 0}},
- {2057, {wxTreeCtrl, hitTest, 2}},
- {2059, {wxTreeCtrl, insertItem, 4}},
- {2060, {wxTreeCtrl, isBold, 1}},
- {2061, {wxTreeCtrl, isExpanded, 1}},
- {2062, {wxTreeCtrl, isSelected, 1}},
- {2063, {wxTreeCtrl, isVisible, 1}},
- {2064, {wxTreeCtrl, itemHasChildren, 1}},
- {2065, {wxTreeCtrl, isTreeItemIdOk, 1}},
- {2066, {wxTreeCtrl, prependItem, 3}},
- {2067, {wxTreeCtrl, scrollTo, 1}},
- {2068, {wxTreeCtrl, selectItem_1, 1}},
- {2069, {wxTreeCtrl, selectItem_2, 2}},
- {2070, {wxTreeCtrl, setIndent, 1}},
- {2071, {wxTreeCtrl, setImageList, 1}},
- {2072, {wxTreeCtrl, setItemBackgroundColour, 2}},
- {2073, {wxTreeCtrl, setItemBold, 2}},
- {2074, {wxTreeCtrl, setItemData, 2}},
- {2075, {wxTreeCtrl, setItemDropHighlight, 2}},
- {2076, {wxTreeCtrl, setItemFont, 2}},
- {2077, {wxTreeCtrl, setItemHasChildren, 2}},
- {2078, {wxTreeCtrl, setItemImage_2, 2}},
- {2079, {wxTreeCtrl, setItemImage_3, 3}},
- {2080, {wxTreeCtrl, setItemText, 2}},
- {2081, {wxTreeCtrl, setItemTextColour, 2}},
- {2082, {wxTreeCtrl, setStateImageList, 1}},
- {2083, {wxTreeCtrl, setWindowStyle, 1}},
- {2084, {wxTreeCtrl, sortChildren, 1}},
- {2085, {wxTreeCtrl, toggle, 1}},
- {2086, {wxTreeCtrl, toggleItemSelection, 1}},
- {2087, {wxTreeCtrl, unselect, 0}},
- {2088, {wxTreeCtrl, unselectAll, 0}},
- {2089, {wxTreeCtrl, unselectItem, 1}},
- {2090, {wxScrollBar, new_0, 0}},
- {2091, {wxScrollBar, new_3, 3}},
- {2092, {wxScrollBar, destruct, 0}},
- {2093, {wxScrollBar, create, 3}},
- {2094, {wxScrollBar, getRange, 0}},
- {2095, {wxScrollBar, getPageSize, 0}},
- {2096, {wxScrollBar, getThumbPosition, 0}},
- {2097, {wxScrollBar, getThumbSize, 0}},
- {2098, {wxScrollBar, setThumbPosition, 1}},
- {2099, {wxScrollBar, setScrollbar, 5}},
- {2101, {wxSpinButton, new_2, 2}},
- {2102, {wxSpinButton, new_0, 0}},
- {2103, {wxSpinButton, create, 2}},
- {2104, {wxSpinButton, getMax, 0}},
- {2105, {wxSpinButton, getMin, 0}},
- {2106, {wxSpinButton, getValue, 0}},
- {2107, {wxSpinButton, setRange, 2}},
- {2108, {wxSpinButton, setValue, 1}},
- {2109, {wxSpinButton, 'Destroy', undefined}},
- {2110, {wxSpinCtrl, new_0, 0}},
- {2111, {wxSpinCtrl, new_2, 2}},
- {2113, {wxSpinCtrl, create, 2}},
- {2116, {wxSpinCtrl, setValue_1_1, 1}},
- {2117, {wxSpinCtrl, setValue_1_0, 1}},
- {2119, {wxSpinCtrl, getValue, 0}},
- {2121, {wxSpinCtrl, setRange, 2}},
- {2122, {wxSpinCtrl, setSelection, 2}},
- {2124, {wxSpinCtrl, getMin, 0}},
- {2126, {wxSpinCtrl, getMax, 0}},
- {2127, {wxSpinCtrl, 'Destroy', undefined}},
- {2128, {wxStaticText, new_0, 0}},
- {2129, {wxStaticText, new_4, 4}},
- {2130, {wxStaticText, create, 4}},
- {2131, {wxStaticText, getLabel, 0}},
- {2132, {wxStaticText, setLabel, 1}},
- {2133, {wxStaticText, wrap, 1}},
- {2134, {wxStaticText, 'Destroy', undefined}},
- {2135, {wxStaticBitmap, new_0, 0}},
- {2136, {wxStaticBitmap, new_4, 4}},
- {2137, {wxStaticBitmap, create, 4}},
- {2138, {wxStaticBitmap, getBitmap, 0}},
- {2139, {wxStaticBitmap, setBitmap, 1}},
- {2140, {wxStaticBitmap, 'Destroy', undefined}},
- {2141, {wxRadioBox, new, 7}},
- {2143, {wxRadioBox, destruct, 0}},
- {2144, {wxRadioBox, create, 7}},
- {2145, {wxRadioBox, enable_2, 2}},
- {2146, {wxRadioBox, enable_1, 1}},
- {2147, {wxRadioBox, getSelection, 0}},
- {2148, {wxRadioBox, getString, 1}},
- {2149, {wxRadioBox, setSelection, 1}},
- {2150, {wxRadioBox, show_2, 2}},
- {2151, {wxRadioBox, show_1, 1}},
- {2152, {wxRadioBox, getColumnCount, 0}},
- {2153, {wxRadioBox, getItemHelpText, 1}},
- {2154, {wxRadioBox, getItemToolTip, 1}},
- {2156, {wxRadioBox, getItemFromPoint, 1}},
- {2157, {wxRadioBox, getRowCount, 0}},
- {2158, {wxRadioBox, isItemEnabled, 1}},
- {2159, {wxRadioBox, isItemShown, 1}},
- {2160, {wxRadioBox, setItemHelpText, 2}},
- {2161, {wxRadioBox, setItemToolTip, 2}},
- {2162, {wxRadioButton, new_0, 0}},
- {2163, {wxRadioButton, new_4, 4}},
- {2164, {wxRadioButton, create, 4}},
- {2165, {wxRadioButton, getValue, 0}},
- {2166, {wxRadioButton, setValue, 1}},
- {2167, {wxRadioButton, 'Destroy', undefined}},
- {2169, {wxSlider, new_6, 6}},
- {2170, {wxSlider, new_0, 0}},
- {2171, {wxSlider, create, 6}},
- {2172, {wxSlider, getLineSize, 0}},
- {2173, {wxSlider, getMax, 0}},
- {2174, {wxSlider, getMin, 0}},
- {2175, {wxSlider, getPageSize, 0}},
- {2176, {wxSlider, getThumbLength, 0}},
- {2177, {wxSlider, getValue, 0}},
- {2178, {wxSlider, setLineSize, 1}},
- {2179, {wxSlider, setPageSize, 1}},
- {2180, {wxSlider, setRange, 2}},
- {2181, {wxSlider, setThumbLength, 1}},
- {2182, {wxSlider, setValue, 1}},
- {2183, {wxSlider, 'Destroy', undefined}},
- {2185, {wxDialog, new_4, 4}},
- {2186, {wxDialog, new_0, 0}},
- {2188, {wxDialog, destruct, 0}},
- {2189, {wxDialog, create, 4}},
- {2190, {wxDialog, createButtonSizer, 1}},
- {2191, {wxDialog, createStdDialogButtonSizer, 1}},
- {2192, {wxDialog, endModal, 1}},
- {2193, {wxDialog, getAffirmativeId, 0}},
- {2194, {wxDialog, getReturnCode, 0}},
- {2195, {wxDialog, isModal, 0}},
- {2196, {wxDialog, setAffirmativeId, 1}},
- {2197, {wxDialog, setReturnCode, 1}},
- {2198, {wxDialog, show, 1}},
- {2199, {wxDialog, showModal, 0}},
- {2200, {wxColourDialog, new_0, 0}},
- {2201, {wxColourDialog, new_2, 2}},
- {2202, {wxColourDialog, destruct, 0}},
- {2203, {wxColourDialog, create, 2}},
- {2204, {wxColourDialog, getColourData, 0}},
- {2205, {wxColourData, new_0, 0}},
- {2206, {wxColourData, new_1, 1}},
- {2207, {wxColourData, destruct, 0}},
- {2208, {wxColourData, getChooseFull, 0}},
- {2209, {wxColourData, getColour, 0}},
- {2211, {wxColourData, getCustomColour, 1}},
- {2212, {wxColourData, setChooseFull, 1}},
- {2213, {wxColourData, setColour, 1}},
- {2214, {wxColourData, setCustomColour, 2}},
- {2215, {wxPalette, new_0, 0}},
- {2216, {wxPalette, new_4, 4}},
- {2218, {wxPalette, destruct, 0}},
- {2219, {wxPalette, create, 4}},
- {2220, {wxPalette, getColoursCount, 0}},
- {2221, {wxPalette, getPixel, 3}},
- {2222, {wxPalette, getRGB, 4}},
- {2223, {wxPalette, isOk, 0}},
- {2227, {wxDirDialog, new, 2}},
- {2228, {wxDirDialog, destruct, 0}},
- {2229, {wxDirDialog, getPath, 0}},
- {2230, {wxDirDialog, getMessage, 0}},
- {2231, {wxDirDialog, setMessage, 1}},
- {2232, {wxDirDialog, setPath, 1}},
- {2236, {wxFileDialog, new, 2}},
- {2237, {wxFileDialog, destruct, 0}},
- {2238, {wxFileDialog, getDirectory, 0}},
- {2239, {wxFileDialog, getFilename, 0}},
- {2240, {wxFileDialog, getFilenames, 1}},
- {2241, {wxFileDialog, getFilterIndex, 0}},
- {2242, {wxFileDialog, getMessage, 0}},
- {2243, {wxFileDialog, getPath, 0}},
- {2244, {wxFileDialog, getPaths, 1}},
- {2245, {wxFileDialog, getWildcard, 0}},
- {2246, {wxFileDialog, setDirectory, 1}},
- {2247, {wxFileDialog, setFilename, 1}},
- {2248, {wxFileDialog, setFilterIndex, 1}},
- {2249, {wxFileDialog, setMessage, 1}},
- {2250, {wxFileDialog, setPath, 1}},
- {2251, {wxFileDialog, setWildcard, 1}},
- {2252, {wxPickerBase, setInternalMargin, 1}},
- {2253, {wxPickerBase, getInternalMargin, 0}},
- {2254, {wxPickerBase, setTextCtrlProportion, 1}},
- {2255, {wxPickerBase, setPickerCtrlProportion, 1}},
- {2256, {wxPickerBase, getTextCtrlProportion, 0}},
- {2257, {wxPickerBase, getPickerCtrlProportion, 0}},
- {2258, {wxPickerBase, hasTextCtrl, 0}},
- {2259, {wxPickerBase, getTextCtrl, 0}},
- {2260, {wxPickerBase, isTextCtrlGrowable, 0}},
- {2261, {wxPickerBase, setPickerCtrlGrowable, 1}},
- {2262, {wxPickerBase, setTextCtrlGrowable, 1}},
- {2263, {wxPickerBase, isPickerCtrlGrowable, 0}},
- {2264, {wxFilePickerCtrl, new_0, 0}},
- {2265, {wxFilePickerCtrl, new_3, 3}},
- {2266, {wxFilePickerCtrl, create, 3}},
- {2267, {wxFilePickerCtrl, getPath, 0}},
- {2268, {wxFilePickerCtrl, setPath, 1}},
- {2269, {wxFilePickerCtrl, 'Destroy', undefined}},
- {2270, {wxDirPickerCtrl, new_0, 0}},
- {2271, {wxDirPickerCtrl, new_3, 3}},
- {2272, {wxDirPickerCtrl, create, 3}},
- {2273, {wxDirPickerCtrl, getPath, 0}},
- {2274, {wxDirPickerCtrl, setPath, 1}},
- {2275, {wxDirPickerCtrl, 'Destroy', undefined}},
- {2276, {wxColourPickerCtrl, new_0, 0}},
- {2277, {wxColourPickerCtrl, new_3, 3}},
- {2278, {wxColourPickerCtrl, create, 3}},
- {2279, {wxColourPickerCtrl, getColour, 0}},
- {2280, {wxColourPickerCtrl, setColour_1_1, 1}},
- {2281, {wxColourPickerCtrl, setColour_1_0, 1}},
- {2282, {wxColourPickerCtrl, 'Destroy', undefined}},
- {2283, {wxDatePickerCtrl, new_0, 0}},
- {2284, {wxDatePickerCtrl, new_3, 3}},
- {2285, {wxDatePickerCtrl, getRange, 2}},
- {2286, {wxDatePickerCtrl, getValue, 0}},
- {2287, {wxDatePickerCtrl, setRange, 2}},
- {2288, {wxDatePickerCtrl, setValue, 1}},
- {2289, {wxDatePickerCtrl, 'Destroy', undefined}},
- {2290, {wxFontPickerCtrl, new_0, 0}},
- {2291, {wxFontPickerCtrl, new_3, 3}},
- {2292, {wxFontPickerCtrl, create, 3}},
- {2293, {wxFontPickerCtrl, getSelectedFont, 0}},
- {2294, {wxFontPickerCtrl, setSelectedFont, 1}},
- {2295, {wxFontPickerCtrl, getMaxPointSize, 0}},
- {2296, {wxFontPickerCtrl, setMaxPointSize, 1}},
- {2297, {wxFontPickerCtrl, 'Destroy', undefined}},
- {2300, {wxFindReplaceDialog, new_0, 0}},
- {2301, {wxFindReplaceDialog, new_4, 4}},
- {2302, {wxFindReplaceDialog, destruct, 0}},
- {2303, {wxFindReplaceDialog, create, 4}},
- {2304, {wxFindReplaceDialog, getData, 0}},
- {2305, {wxFindReplaceData, new_0, 0}},
- {2306, {wxFindReplaceData, new_1, 1}},
- {2307, {wxFindReplaceData, getFindString, 0}},
- {2308, {wxFindReplaceData, getReplaceString, 0}},
- {2309, {wxFindReplaceData, getFlags, 0}},
- {2310, {wxFindReplaceData, setFlags, 1}},
- {2311, {wxFindReplaceData, setFindString, 1}},
- {2312, {wxFindReplaceData, setReplaceString, 1}},
- {2313, {wxFindReplaceData, 'Destroy', undefined}},
- {2314, {wxMultiChoiceDialog, new_0, 0}},
- {2316, {wxMultiChoiceDialog, new_5, 5}},
- {2317, {wxMultiChoiceDialog, getSelections, 0}},
- {2318, {wxMultiChoiceDialog, setSelections, 1}},
- {2319, {wxMultiChoiceDialog, 'Destroy', undefined}},
- {2320, {wxSingleChoiceDialog, new_0, 0}},
- {2322, {wxSingleChoiceDialog, new_5, 5}},
- {2323, {wxSingleChoiceDialog, getSelection, 0}},
- {2324, {wxSingleChoiceDialog, getStringSelection, 0}},
- {2325, {wxSingleChoiceDialog, setSelection, 1}},
- {2326, {wxSingleChoiceDialog, 'Destroy', undefined}},
- {2327, {wxTextEntryDialog, new, 3}},
- {2328, {wxTextEntryDialog, getValue, 0}},
- {2329, {wxTextEntryDialog, setValue, 1}},
- {2330, {wxTextEntryDialog, 'Destroy', undefined}},
- {2331, {wxPasswordEntryDialog, new, 3}},
- {2332, {wxPasswordEntryDialog, 'Destroy', undefined}},
- {2333, {wxFontData, new_0, 0}},
- {2334, {wxFontData, new_1, 1}},
- {2335, {wxFontData, destruct, 0}},
- {2336, {wxFontData, enableEffects, 1}},
- {2337, {wxFontData, getAllowSymbols, 0}},
- {2338, {wxFontData, getColour, 0}},
- {2339, {wxFontData, getChosenFont, 0}},
- {2340, {wxFontData, getEnableEffects, 0}},
- {2341, {wxFontData, getInitialFont, 0}},
- {2342, {wxFontData, getShowHelp, 0}},
- {2343, {wxFontData, setAllowSymbols, 1}},
- {2344, {wxFontData, setChosenFont, 1}},
- {2345, {wxFontData, setColour, 1}},
- {2346, {wxFontData, setInitialFont, 1}},
- {2347, {wxFontData, setRange, 2}},
- {2348, {wxFontData, setShowHelp, 1}},
- {2352, {wxFontDialog, new_0, 0}},
- {2354, {wxFontDialog, new_2, 2}},
- {2356, {wxFontDialog, create, 2}},
- {2357, {wxFontDialog, getFontData, 0}},
- {2359, {wxFontDialog, 'Destroy', undefined}},
- {2360, {wxProgressDialog, new, 3}},
- {2361, {wxProgressDialog, destruct, 0}},
- {2362, {wxProgressDialog, resume, 0}},
- {2363, {wxProgressDialog, update_2, 2}},
- {2364, {wxProgressDialog, update_0, 0}},
- {2365, {wxMessageDialog, new, 3}},
- {2366, {wxMessageDialog, destruct, 0}},
- {2367, {wxPageSetupDialog, new, 2}},
- {2368, {wxPageSetupDialog, destruct, 0}},
- {2369, {wxPageSetupDialog, getPageSetupData, 0}},
- {2370, {wxPageSetupDialog, showModal, 0}},
- {2371, {wxPageSetupDialogData, new_0, 0}},
- {2372, {wxPageSetupDialogData, new_1_0, 1}},
- {2373, {wxPageSetupDialogData, new_1_1, 1}},
- {2374, {wxPageSetupDialogData, destruct, 0}},
- {2375, {wxPageSetupDialogData, enableHelp, 1}},
- {2376, {wxPageSetupDialogData, enableMargins, 1}},
- {2377, {wxPageSetupDialogData, enableOrientation, 1}},
- {2378, {wxPageSetupDialogData, enablePaper, 1}},
- {2379, {wxPageSetupDialogData, enablePrinter, 1}},
- {2380, {wxPageSetupDialogData, getDefaultMinMargins, 0}},
- {2381, {wxPageSetupDialogData, getEnableMargins, 0}},
- {2382, {wxPageSetupDialogData, getEnableOrientation, 0}},
- {2383, {wxPageSetupDialogData, getEnablePaper, 0}},
- {2384, {wxPageSetupDialogData, getEnablePrinter, 0}},
- {2385, {wxPageSetupDialogData, getEnableHelp, 0}},
- {2386, {wxPageSetupDialogData, getDefaultInfo, 0}},
- {2387, {wxPageSetupDialogData, getMarginTopLeft, 0}},
- {2388, {wxPageSetupDialogData, getMarginBottomRight, 0}},
- {2389, {wxPageSetupDialogData, getMinMarginTopLeft, 0}},
- {2390, {wxPageSetupDialogData, getMinMarginBottomRight, 0}},
- {2391, {wxPageSetupDialogData, getPaperId, 0}},
- {2392, {wxPageSetupDialogData, getPaperSize, 0}},
- {2394, {wxPageSetupDialogData, getPrintData, 0}},
- {2395, {wxPageSetupDialogData, isOk, 0}},
- {2396, {wxPageSetupDialogData, setDefaultInfo, 1}},
- {2397, {wxPageSetupDialogData, setDefaultMinMargins, 1}},
- {2398, {wxPageSetupDialogData, setMarginTopLeft, 1}},
- {2399, {wxPageSetupDialogData, setMarginBottomRight, 1}},
- {2400, {wxPageSetupDialogData, setMinMarginTopLeft, 1}},
- {2401, {wxPageSetupDialogData, setMinMarginBottomRight, 1}},
- {2402, {wxPageSetupDialogData, setPaperId, 1}},
- {2403, {wxPageSetupDialogData, setPaperSize_1_1, 1}},
- {2404, {wxPageSetupDialogData, setPaperSize_1_0, 1}},
- {2405, {wxPageSetupDialogData, setPrintData, 1}},
- {2406, {wxPrintDialog, new_2_0, 2}},
- {2407, {wxPrintDialog, new_2_1, 2}},
- {2408, {wxPrintDialog, destruct, 0}},
- {2409, {wxPrintDialog, getPrintDialogData, 0}},
- {2410, {wxPrintDialog, getPrintDC, 0}},
- {2411, {wxPrintDialogData, new_0, 0}},
- {2412, {wxPrintDialogData, new_1_1, 1}},
- {2413, {wxPrintDialogData, new_1_0, 1}},
- {2414, {wxPrintDialogData, destruct, 0}},
- {2415, {wxPrintDialogData, enableHelp, 1}},
- {2416, {wxPrintDialogData, enablePageNumbers, 1}},
- {2417, {wxPrintDialogData, enablePrintToFile, 1}},
- {2418, {wxPrintDialogData, enableSelection, 1}},
- {2419, {wxPrintDialogData, getAllPages, 0}},
- {2420, {wxPrintDialogData, getCollate, 0}},
- {2421, {wxPrintDialogData, getFromPage, 0}},
- {2422, {wxPrintDialogData, getMaxPage, 0}},
- {2423, {wxPrintDialogData, getMinPage, 0}},
- {2424, {wxPrintDialogData, getNoCopies, 0}},
- {2425, {wxPrintDialogData, getPrintData, 0}},
- {2426, {wxPrintDialogData, getPrintToFile, 0}},
- {2427, {wxPrintDialogData, getSelection, 0}},
- {2428, {wxPrintDialogData, getToPage, 0}},
- {2429, {wxPrintDialogData, isOk, 0}},
- {2430, {wxPrintDialogData, setCollate, 1}},
- {2431, {wxPrintDialogData, setFromPage, 1}},
- {2432, {wxPrintDialogData, setMaxPage, 1}},
- {2433, {wxPrintDialogData, setMinPage, 1}},
- {2434, {wxPrintDialogData, setNoCopies, 1}},
- {2435, {wxPrintDialogData, setPrintData, 1}},
- {2436, {wxPrintDialogData, setPrintToFile, 1}},
- {2437, {wxPrintDialogData, setSelection, 1}},
- {2438, {wxPrintDialogData, setToPage, 1}},
- {2439, {wxPrintData, new_0, 0}},
- {2440, {wxPrintData, new_1, 1}},
- {2441, {wxPrintData, destruct, 0}},
- {2442, {wxPrintData, getCollate, 0}},
- {2443, {wxPrintData, getBin, 0}},
- {2444, {wxPrintData, getColour, 0}},
- {2445, {wxPrintData, getDuplex, 0}},
- {2446, {wxPrintData, getNoCopies, 0}},
- {2447, {wxPrintData, getOrientation, 0}},
- {2448, {wxPrintData, getPaperId, 0}},
- {2449, {wxPrintData, getPrinterName, 0}},
- {2450, {wxPrintData, getQuality, 0}},
- {2451, {wxPrintData, isOk, 0}},
- {2452, {wxPrintData, setBin, 1}},
- {2453, {wxPrintData, setCollate, 1}},
- {2454, {wxPrintData, setColour, 1}},
- {2455, {wxPrintData, setDuplex, 1}},
- {2456, {wxPrintData, setNoCopies, 1}},
- {2457, {wxPrintData, setOrientation, 1}},
- {2458, {wxPrintData, setPaperId, 1}},
- {2459, {wxPrintData, setPrinterName, 1}},
- {2460, {wxPrintData, setQuality, 1}},
- {2463, {wxPrintPreview, new_2, 2}},
- {2464, {wxPrintPreview, new_3, 3}},
- {2466, {wxPrintPreview, destruct, 0}},
- {2467, {wxPrintPreview, getCanvas, 0}},
- {2468, {wxPrintPreview, getCurrentPage, 0}},
- {2469, {wxPrintPreview, getFrame, 0}},
- {2470, {wxPrintPreview, getMaxPage, 0}},
- {2471, {wxPrintPreview, getMinPage, 0}},
- {2472, {wxPrintPreview, getPrintout, 0}},
- {2473, {wxPrintPreview, getPrintoutForPrinting, 0}},
- {2474, {wxPrintPreview, isOk, 0}},
- {2475, {wxPrintPreview, paintPage, 2}},
- {2476, {wxPrintPreview, print, 1}},
- {2477, {wxPrintPreview, renderPage, 1}},
- {2478, {wxPrintPreview, setCanvas, 1}},
- {2479, {wxPrintPreview, setCurrentPage, 1}},
- {2480, {wxPrintPreview, setFrame, 1}},
- {2481, {wxPrintPreview, setPrintout, 1}},
- {2482, {wxPrintPreview, setZoom, 1}},
- {2483, {wxPreviewFrame, new, 3}},
- {2484, {wxPreviewFrame, destruct, 0}},
- {2485, {wxPreviewFrame, createControlBar, 0}},
- {2486, {wxPreviewFrame, createCanvas, 0}},
- {2487, {wxPreviewFrame, initialize, 0}},
- {2488, {wxPreviewFrame, onCloseWindow, 1}},
- {2489, {wxPreviewControlBar, new, 4}},
- {2490, {wxPreviewControlBar, destruct, 0}},
- {2491, {wxPreviewControlBar, createButtons, 0}},
- {2492, {wxPreviewControlBar, getPrintPreview, 0}},
- {2493, {wxPreviewControlBar, getZoomControl, 0}},
- {2494, {wxPreviewControlBar, setZoomControl, 1}},
- {2496, {wxPrinter, new, 1}},
- {2497, {wxPrinter, createAbortWindow, 2}},
- {2498, {wxPrinter, getAbort, 0}},
- {2499, {wxPrinter, getLastError, 0}},
- {2500, {wxPrinter, getPrintDialogData, 0}},
- {2501, {wxPrinter, print, 3}},
- {2502, {wxPrinter, printDialog, 1}},
- {2503, {wxPrinter, reportError, 3}},
- {2504, {wxPrinter, setup, 1}},
- {2505, {wxPrinter, 'Destroy', undefined}},
- {2506, {wxXmlResource, new_1, 1}},
- {2507, {wxXmlResource, new_2, 2}},
- {2508, {wxXmlResource, destruct, 0}},
- {2509, {wxXmlResource, attachUnknownControl, 3}},
- {2510, {wxXmlResource, clearHandlers, 0}},
- {2511, {wxXmlResource, compareVersion, 4}},
- {2512, {wxXmlResource, get, 0}},
- {2513, {wxXmlResource, getFlags, 0}},
- {2514, {wxXmlResource, getVersion, 0}},
- {2515, {wxXmlResource, getXRCID, 2}},
- {2516, {wxXmlResource, initAllHandlers, 0}},
- {2517, {wxXmlResource, load, 1}},
- {2518, {wxXmlResource, loadBitmap, 1}},
- {2519, {wxXmlResource, loadDialog_2, 2}},
- {2520, {wxXmlResource, loadDialog_3, 3}},
- {2521, {wxXmlResource, loadFrame_2, 2}},
- {2522, {wxXmlResource, loadFrame_3, 3}},
- {2523, {wxXmlResource, loadIcon, 1}},
- {2524, {wxXmlResource, loadMenu, 1}},
- {2525, {wxXmlResource, loadMenuBar_2, 2}},
- {2526, {wxXmlResource, loadMenuBar_1, 1}},
- {2527, {wxXmlResource, loadPanel_2, 2}},
- {2528, {wxXmlResource, loadPanel_3, 3}},
- {2529, {wxXmlResource, loadToolBar, 2}},
- {2530, {wxXmlResource, set, 1}},
- {2531, {wxXmlResource, setFlags, 1}},
- {2532, {wxXmlResource, unload, 1}},
- {2533, {wxXmlResource, xrcctrl, 3}},
- {2534, {wxHtmlEasyPrinting, new, 1}},
- {2535, {wxHtmlEasyPrinting, destruct, 0}},
- {2536, {wxHtmlEasyPrinting, getPrintData, 0}},
- {2537, {wxHtmlEasyPrinting, getPageSetupData, 0}},
- {2538, {wxHtmlEasyPrinting, previewFile, 1}},
- {2539, {wxHtmlEasyPrinting, previewText, 2}},
- {2540, {wxHtmlEasyPrinting, printFile, 1}},
- {2541, {wxHtmlEasyPrinting, printText, 2}},
- {2542, {wxHtmlEasyPrinting, pageSetup, 0}},
- {2543, {wxHtmlEasyPrinting, setFonts, 3}},
- {2544, {wxHtmlEasyPrinting, setHeader, 2}},
- {2545, {wxHtmlEasyPrinting, setFooter, 2}},
- {2547, {wxGLCanvas, new_2, 2}},
- {2548, {wxGLCanvas, new_3_1, 3}},
- {2549, {wxGLCanvas, new_3_0, 3}},
- {2550, {wxGLCanvas, getContext, 0}},
- {2552, {wxGLCanvas, setCurrent, 0}},
- {2553, {wxGLCanvas, swapBuffers, 0}},
- {2554, {wxGLCanvas, 'Destroy', undefined}},
- {2555, {wxAuiManager, new, 1}},
- {2556, {wxAuiManager, destruct, 0}},
- {2557, {wxAuiManager, addPane_2_1, 2}},
- {2558, {wxAuiManager, addPane_3, 3}},
- {2559, {wxAuiManager, addPane_2_0, 2}},
- {2560, {wxAuiManager, detachPane, 1}},
- {2561, {wxAuiManager, getAllPanes, 0}},
- {2562, {wxAuiManager, getArtProvider, 0}},
- {2563, {wxAuiManager, getDockSizeConstraint, 2}},
- {2564, {wxAuiManager, getFlags, 0}},
- {2565, {wxAuiManager, getManagedWindow, 0}},
- {2566, {wxAuiManager, getManager, 1}},
- {2567, {wxAuiManager, getPane_1_1, 1}},
- {2568, {wxAuiManager, getPane_1_0, 1}},
- {2569, {wxAuiManager, hideHint, 0}},
- {2570, {wxAuiManager, insertPane, 3}},
- {2571, {wxAuiManager, loadPaneInfo, 2}},
- {2572, {wxAuiManager, loadPerspective, 2}},
- {2573, {wxAuiManager, savePaneInfo, 1}},
- {2574, {wxAuiManager, savePerspective, 0}},
- {2575, {wxAuiManager, setArtProvider, 1}},
- {2576, {wxAuiManager, setDockSizeConstraint, 2}},
- {2577, {wxAuiManager, setFlags, 1}},
- {2578, {wxAuiManager, setManagedWindow, 1}},
- {2579, {wxAuiManager, showHint, 1}},
- {2580, {wxAuiManager, unInit, 0}},
- {2581, {wxAuiManager, update, 0}},
- {2582, {wxAuiPaneInfo, new_0, 0}},
- {2583, {wxAuiPaneInfo, new_1, 1}},
- {2584, {wxAuiPaneInfo, destruct, 0}},
- {2585, {wxAuiPaneInfo, bestSize_1, 1}},
- {2586, {wxAuiPaneInfo, bestSize_2, 2}},
- {2587, {wxAuiPaneInfo, bottom, 0}},
- {2588, {wxAuiPaneInfo, bottomDockable, 1}},
- {2589, {wxAuiPaneInfo, caption, 1}},
- {2590, {wxAuiPaneInfo, captionVisible, 1}},
- {2591, {wxAuiPaneInfo, centre, 0}},
- {2592, {wxAuiPaneInfo, centrePane, 0}},
- {2593, {wxAuiPaneInfo, closeButton, 1}},
- {2594, {wxAuiPaneInfo, defaultPane, 0}},
- {2595, {wxAuiPaneInfo, destroyOnClose, 1}},
- {2596, {wxAuiPaneInfo, direction, 1}},
- {2597, {wxAuiPaneInfo, dock, 0}},
- {2598, {wxAuiPaneInfo, dockable, 1}},
- {2599, {wxAuiPaneInfo, fixed, 0}},
- {2600, {wxAuiPaneInfo, float, 0}},
- {2601, {wxAuiPaneInfo, floatable, 1}},
- {2602, {wxAuiPaneInfo, floatingPosition_1, 1}},
- {2603, {wxAuiPaneInfo, floatingPosition_2, 2}},
- {2604, {wxAuiPaneInfo, floatingSize_1, 1}},
- {2605, {wxAuiPaneInfo, floatingSize_2, 2}},
- {2606, {wxAuiPaneInfo, gripper, 1}},
- {2607, {wxAuiPaneInfo, gripperTop, 1}},
- {2608, {wxAuiPaneInfo, hasBorder, 0}},
- {2609, {wxAuiPaneInfo, hasCaption, 0}},
- {2610, {wxAuiPaneInfo, hasCloseButton, 0}},
- {2611, {wxAuiPaneInfo, hasFlag, 1}},
- {2612, {wxAuiPaneInfo, hasGripper, 0}},
- {2613, {wxAuiPaneInfo, hasGripperTop, 0}},
- {2614, {wxAuiPaneInfo, hasMaximizeButton, 0}},
- {2615, {wxAuiPaneInfo, hasMinimizeButton, 0}},
- {2616, {wxAuiPaneInfo, hasPinButton, 0}},
- {2617, {wxAuiPaneInfo, hide, 0}},
- {2618, {wxAuiPaneInfo, isBottomDockable, 0}},
- {2619, {wxAuiPaneInfo, isDocked, 0}},
- {2620, {wxAuiPaneInfo, isFixed, 0}},
- {2621, {wxAuiPaneInfo, isFloatable, 0}},
- {2622, {wxAuiPaneInfo, isFloating, 0}},
- {2623, {wxAuiPaneInfo, isLeftDockable, 0}},
- {2624, {wxAuiPaneInfo, isMovable, 0}},
- {2625, {wxAuiPaneInfo, isOk, 0}},
- {2626, {wxAuiPaneInfo, isResizable, 0}},
- {2627, {wxAuiPaneInfo, isRightDockable, 0}},
- {2628, {wxAuiPaneInfo, isShown, 0}},
- {2629, {wxAuiPaneInfo, isToolbar, 0}},
- {2630, {wxAuiPaneInfo, isTopDockable, 0}},
- {2631, {wxAuiPaneInfo, layer, 1}},
- {2632, {wxAuiPaneInfo, left, 0}},
- {2633, {wxAuiPaneInfo, leftDockable, 1}},
- {2634, {wxAuiPaneInfo, maxSize_1, 1}},
- {2635, {wxAuiPaneInfo, maxSize_2, 2}},
- {2636, {wxAuiPaneInfo, maximizeButton, 1}},
- {2637, {wxAuiPaneInfo, minSize_1, 1}},
- {2638, {wxAuiPaneInfo, minSize_2, 2}},
- {2639, {wxAuiPaneInfo, minimizeButton, 1}},
- {2640, {wxAuiPaneInfo, movable, 1}},
- {2641, {wxAuiPaneInfo, name, 1}},
- {2642, {wxAuiPaneInfo, paneBorder, 1}},
- {2643, {wxAuiPaneInfo, pinButton, 1}},
- {2644, {wxAuiPaneInfo, position, 1}},
- {2645, {wxAuiPaneInfo, resizable, 1}},
- {2646, {wxAuiPaneInfo, right, 0}},
- {2647, {wxAuiPaneInfo, rightDockable, 1}},
- {2648, {wxAuiPaneInfo, row, 1}},
- {2649, {wxAuiPaneInfo, safeSet, 1}},
- {2650, {wxAuiPaneInfo, setFlag, 2}},
- {2651, {wxAuiPaneInfo, show, 1}},
- {2652, {wxAuiPaneInfo, toolbarPane, 0}},
- {2653, {wxAuiPaneInfo, top, 0}},
- {2654, {wxAuiPaneInfo, topDockable, 1}},
- {2655, {wxAuiPaneInfo, window, 1}},
- {2656, {wxAuiPaneInfo, getWindow, 0}},
- {2657, {wxAuiPaneInfo, getFrame, 0}},
- {2658, {wxAuiPaneInfo, getDirection, 0}},
- {2659, {wxAuiPaneInfo, getLayer, 0}},
- {2660, {wxAuiPaneInfo, getRow, 0}},
- {2661, {wxAuiPaneInfo, getPosition, 0}},
- {2662, {wxAuiPaneInfo, getFloatingPosition, 0}},
- {2663, {wxAuiPaneInfo, getFloatingSize, 0}},
- {2664, {wxAuiNotebook, new_0, 0}},
- {2665, {wxAuiNotebook, new_2, 2}},
- {2666, {wxAuiNotebook, addPage, 3}},
- {2667, {wxAuiNotebook, create, 2}},
- {2668, {wxAuiNotebook, deletePage, 1}},
- {2669, {wxAuiNotebook, getArtProvider, 0}},
- {2670, {wxAuiNotebook, getPage, 1}},
- {2671, {wxAuiNotebook, getPageBitmap, 1}},
- {2672, {wxAuiNotebook, getPageCount, 0}},
- {2673, {wxAuiNotebook, getPageIndex, 1}},
- {2674, {wxAuiNotebook, getPageText, 1}},
- {2675, {wxAuiNotebook, getSelection, 0}},
- {2676, {wxAuiNotebook, insertPage, 4}},
- {2677, {wxAuiNotebook, removePage, 1}},
- {2678, {wxAuiNotebook, setArtProvider, 1}},
- {2679, {wxAuiNotebook, setFont, 1}},
- {2680, {wxAuiNotebook, setPageBitmap, 2}},
- {2681, {wxAuiNotebook, setPageText, 2}},
- {2682, {wxAuiNotebook, setSelection, 1}},
- {2683, {wxAuiNotebook, setTabCtrlHeight, 1}},
- {2684, {wxAuiNotebook, setUniformBitmapSize, 1}},
- {2685, {wxAuiNotebook, 'Destroy', undefined}},
- {2686, {wxAuiTabArt, setFlags, 1}},
- {2687, {wxAuiTabArt, setMeasuringFont, 1}},
- {2688, {wxAuiTabArt, setNormalFont, 1}},
- {2689, {wxAuiTabArt, setSelectedFont, 1}},
- {2690, {wxAuiTabArt, setColour, 1}},
- {2691, {wxAuiTabArt, setActiveColour, 1}},
- {2692, {wxAuiDockArt, getColour, 1}},
- {2693, {wxAuiDockArt, getFont, 1}},
- {2694, {wxAuiDockArt, getMetric, 1}},
- {2695, {wxAuiDockArt, setColour, 2}},
- {2696, {wxAuiDockArt, setFont, 2}},
- {2697, {wxAuiDockArt, setMetric, 2}},
- {2698, {wxAuiSimpleTabArt, new, 0}},
- {2699, {wxAuiSimpleTabArt, 'Destroy', undefined}},
- {2700, {wxMDIParentFrame, new_0, 0}},
- {2701, {wxMDIParentFrame, new_4, 4}},
- {2702, {wxMDIParentFrame, destruct, 0}},
- {2703, {wxMDIParentFrame, activateNext, 0}},
- {2704, {wxMDIParentFrame, activatePrevious, 0}},
- {2705, {wxMDIParentFrame, arrangeIcons, 0}},
- {2706, {wxMDIParentFrame, cascade, 0}},
- {2707, {wxMDIParentFrame, create, 4}},
- {2708, {wxMDIParentFrame, getActiveChild, 0}},
- {2709, {wxMDIParentFrame, getClientWindow, 0}},
- {2710, {wxMDIParentFrame, tile, 1}},
- {2711, {wxMDIChildFrame, new_0, 0}},
- {2712, {wxMDIChildFrame, new_4, 4}},
- {2713, {wxMDIChildFrame, destruct, 0}},
- {2714, {wxMDIChildFrame, activate, 0}},
- {2715, {wxMDIChildFrame, create, 4}},
- {2716, {wxMDIChildFrame, maximize, 1}},
- {2717, {wxMDIChildFrame, restore, 0}},
- {2718, {wxMDIClientWindow, new_0, 0}},
- {2719, {wxMDIClientWindow, new_2, 2}},
- {2720, {wxMDIClientWindow, destruct, 0}},
- {2721, {wxMDIClientWindow, createClient, 2}},
- {2722, {wxLayoutAlgorithm, new, 0}},
- {2723, {wxLayoutAlgorithm, layoutFrame, 2}},
- {2724, {wxLayoutAlgorithm, layoutMDIFrame, 2}},
- {2725, {wxLayoutAlgorithm, layoutWindow, 2}},
- {2726, {wxLayoutAlgorithm, 'Destroy', undefined}},
- {2727, {wxEvent, getId, 0}},
- {2728, {wxEvent, getSkipped, 0}},
- {2729, {wxEvent, getTimestamp, 0}},
- {2730, {wxEvent, isCommandEvent, 0}},
- {2731, {wxEvent, resumePropagation, 1}},
- {2732, {wxEvent, shouldPropagate, 0}},
- {2733, {wxEvent, skip, 1}},
- {2734, {wxEvent, stopPropagation, 0}},
- {2735, {wxCommandEvent, getClientData, 0}},
- {2736, {wxCommandEvent, getExtraLong, 0}},
- {2737, {wxCommandEvent, getInt, 0}},
- {2738, {wxCommandEvent, getSelection, 0}},
- {2739, {wxCommandEvent, getString, 0}},
- {2740, {wxCommandEvent, isChecked, 0}},
- {2741, {wxCommandEvent, isSelection, 0}},
- {2742, {wxCommandEvent, setInt, 1}},
- {2743, {wxCommandEvent, setString, 1}},
- {2744, {wxScrollEvent, getOrientation, 0}},
- {2745, {wxScrollEvent, getPosition, 0}},
- {2746, {wxScrollWinEvent, getOrientation, 0}},
- {2747, {wxScrollWinEvent, getPosition, 0}},
- {2748, {wxMouseEvent, altDown, 0}},
- {2749, {wxMouseEvent, button, 1}},
- {2750, {wxMouseEvent, buttonDClick, 1}},
- {2751, {wxMouseEvent, buttonDown, 1}},
- {2752, {wxMouseEvent, buttonUp, 1}},
- {2753, {wxMouseEvent, cmdDown, 0}},
- {2754, {wxMouseEvent, controlDown, 0}},
- {2755, {wxMouseEvent, dragging, 0}},
- {2756, {wxMouseEvent, entering, 0}},
- {2757, {wxMouseEvent, getButton, 0}},
- {2760, {wxMouseEvent, getPosition, 0}},
- {2761, {wxMouseEvent, getLogicalPosition, 1}},
- {2762, {wxMouseEvent, getLinesPerAction, 0}},
- {2763, {wxMouseEvent, getWheelRotation, 0}},
- {2764, {wxMouseEvent, getWheelDelta, 0}},
- {2765, {wxMouseEvent, getX, 0}},
- {2766, {wxMouseEvent, getY, 0}},
- {2767, {wxMouseEvent, isButton, 0}},
- {2768, {wxMouseEvent, isPageScroll, 0}},
- {2769, {wxMouseEvent, leaving, 0}},
- {2770, {wxMouseEvent, leftDClick, 0}},
- {2771, {wxMouseEvent, leftDown, 0}},
- {2772, {wxMouseEvent, leftIsDown, 0}},
- {2773, {wxMouseEvent, leftUp, 0}},
- {2774, {wxMouseEvent, metaDown, 0}},
- {2775, {wxMouseEvent, middleDClick, 0}},
- {2776, {wxMouseEvent, middleDown, 0}},
- {2777, {wxMouseEvent, middleIsDown, 0}},
- {2778, {wxMouseEvent, middleUp, 0}},
- {2779, {wxMouseEvent, moving, 0}},
- {2780, {wxMouseEvent, rightDClick, 0}},
- {2781, {wxMouseEvent, rightDown, 0}},
- {2782, {wxMouseEvent, rightIsDown, 0}},
- {2783, {wxMouseEvent, rightUp, 0}},
- {2784, {wxMouseEvent, shiftDown, 0}},
- {2785, {wxSetCursorEvent, getCursor, 0}},
- {2786, {wxSetCursorEvent, getX, 0}},
- {2787, {wxSetCursorEvent, getY, 0}},
- {2788, {wxSetCursorEvent, hasCursor, 0}},
- {2789, {wxSetCursorEvent, setCursor, 1}},
- {2790, {wxKeyEvent, altDown, 0}},
- {2791, {wxKeyEvent, cmdDown, 0}},
- {2792, {wxKeyEvent, controlDown, 0}},
- {2793, {wxKeyEvent, getKeyCode, 0}},
- {2794, {wxKeyEvent, getModifiers, 0}},
- {2797, {wxKeyEvent, getPosition, 0}},
- {2798, {wxKeyEvent, getRawKeyCode, 0}},
- {2799, {wxKeyEvent, getRawKeyFlags, 0}},
- {2800, {wxKeyEvent, getUnicodeKey, 0}},
- {2801, {wxKeyEvent, getX, 0}},
- {2802, {wxKeyEvent, getY, 0}},
- {2803, {wxKeyEvent, hasModifiers, 0}},
- {2804, {wxKeyEvent, metaDown, 0}},
- {2805, {wxKeyEvent, shiftDown, 0}},
- {2806, {wxSizeEvent, getSize, 0}},
- {2807, {wxMoveEvent, getPosition, 0}},
- {2808, {wxEraseEvent, getDC, 0}},
- {2809, {wxFocusEvent, getWindow, 0}},
- {2810, {wxChildFocusEvent, getWindow, 0}},
- {2811, {wxMenuEvent, getMenu, 0}},
- {2812, {wxMenuEvent, getMenuId, 0}},
- {2813, {wxMenuEvent, isPopup, 0}},
- {2814, {wxCloseEvent, canVeto, 0}},
- {2815, {wxCloseEvent, getLoggingOff, 0}},
- {2816, {wxCloseEvent, setCanVeto, 1}},
- {2817, {wxCloseEvent, setLoggingOff, 1}},
- {2818, {wxCloseEvent, veto, 1}},
- {2819, {wxShowEvent, setShow, 1}},
- {2820, {wxShowEvent, getShow, 0}},
- {2821, {wxIconizeEvent, iconized, 0}},
- {2822, {wxJoystickEvent, buttonDown, 1}},
- {2823, {wxJoystickEvent, buttonIsDown, 1}},
- {2824, {wxJoystickEvent, buttonUp, 1}},
- {2825, {wxJoystickEvent, getButtonChange, 0}},
- {2826, {wxJoystickEvent, getButtonState, 0}},
- {2827, {wxJoystickEvent, getJoystick, 0}},
- {2828, {wxJoystickEvent, getPosition, 0}},
- {2829, {wxJoystickEvent, getZPosition, 0}},
- {2830, {wxJoystickEvent, isButton, 0}},
- {2831, {wxJoystickEvent, isMove, 0}},
- {2832, {wxJoystickEvent, isZMove, 0}},
- {2833, {wxUpdateUIEvent, canUpdate, 1}},
- {2834, {wxUpdateUIEvent, check, 1}},
- {2835, {wxUpdateUIEvent, enable, 1}},
- {2836, {wxUpdateUIEvent, show, 1}},
- {2837, {wxUpdateUIEvent, getChecked, 0}},
- {2838, {wxUpdateUIEvent, getEnabled, 0}},
- {2839, {wxUpdateUIEvent, getShown, 0}},
- {2840, {wxUpdateUIEvent, getSetChecked, 0}},
- {2841, {wxUpdateUIEvent, getSetEnabled, 0}},
- {2842, {wxUpdateUIEvent, getSetShown, 0}},
- {2843, {wxUpdateUIEvent, getSetText, 0}},
- {2844, {wxUpdateUIEvent, getText, 0}},
- {2845, {wxUpdateUIEvent, getMode, 0}},
- {2846, {wxUpdateUIEvent, getUpdateInterval, 0}},
- {2847, {wxUpdateUIEvent, resetUpdateTime, 0}},
- {2848, {wxUpdateUIEvent, setMode, 1}},
- {2849, {wxUpdateUIEvent, setText, 1}},
- {2850, {wxUpdateUIEvent, setUpdateInterval, 1}},
- {2851, {wxMouseCaptureChangedEvent, getCapturedWindow, 0}},
- {2852, {wxPaletteChangedEvent, setChangedWindow, 1}},
- {2853, {wxPaletteChangedEvent, getChangedWindow, 0}},
- {2854, {wxQueryNewPaletteEvent, setPaletteRealized, 1}},
- {2855, {wxQueryNewPaletteEvent, getPaletteRealized, 0}},
- {2856, {wxNavigationKeyEvent, getDirection, 0}},
- {2857, {wxNavigationKeyEvent, setDirection, 1}},
- {2858, {wxNavigationKeyEvent, isWindowChange, 0}},
- {2859, {wxNavigationKeyEvent, setWindowChange, 1}},
- {2860, {wxNavigationKeyEvent, isFromTab, 0}},
- {2861, {wxNavigationKeyEvent, setFromTab, 1}},
- {2862, {wxNavigationKeyEvent, getCurrentFocus, 0}},
- {2863, {wxNavigationKeyEvent, setCurrentFocus, 1}},
- {2864, {wxHelpEvent, getOrigin, 0}},
- {2865, {wxHelpEvent, getPosition, 0}},
- {2866, {wxHelpEvent, setOrigin, 1}},
- {2867, {wxHelpEvent, setPosition, 1}},
- {2868, {wxContextMenuEvent, getPosition, 0}},
- {2869, {wxContextMenuEvent, setPosition, 1}},
- {2870, {wxIdleEvent, canSend, 1}},
- {2871, {wxIdleEvent, getMode, 0}},
- {2872, {wxIdleEvent, requestMore, 1}},
- {2873, {wxIdleEvent, moreRequested, 0}},
- {2874, {wxIdleEvent, setMode, 1}},
- {2875, {wxGridEvent, altDown, 0}},
- {2876, {wxGridEvent, controlDown, 0}},
- {2877, {wxGridEvent, getCol, 0}},
- {2878, {wxGridEvent, getPosition, 0}},
- {2879, {wxGridEvent, getRow, 0}},
- {2880, {wxGridEvent, metaDown, 0}},
- {2881, {wxGridEvent, selecting, 0}},
- {2882, {wxGridEvent, shiftDown, 0}},
- {2883, {wxNotifyEvent, allow, 0}},
- {2884, {wxNotifyEvent, isAllowed, 0}},
- {2885, {wxNotifyEvent, veto, 0}},
- {2886, {wxSashEvent, getEdge, 0}},
- {2887, {wxSashEvent, getDragRect, 0}},
- {2888, {wxSashEvent, getDragStatus, 0}},
- {2889, {wxListEvent, getCacheFrom, 0}},
- {2890, {wxListEvent, getCacheTo, 0}},
- {2891, {wxListEvent, getKeyCode, 0}},
- {2892, {wxListEvent, getIndex, 0}},
- {2893, {wxListEvent, getColumn, 0}},
- {2894, {wxListEvent, getPoint, 0}},
- {2895, {wxListEvent, getLabel, 0}},
- {2896, {wxListEvent, getText, 0}},
- {2897, {wxListEvent, getImage, 0}},
- {2898, {wxListEvent, getData, 0}},
- {2899, {wxListEvent, getMask, 0}},
- {2900, {wxListEvent, getItem, 0}},
- {2901, {wxListEvent, isEditCancelled, 0}},
- {2902, {wxDateEvent, getDate, 0}},
- {2903, {wxCalendarEvent, getWeekDay, 0}},
- {2904, {wxFileDirPickerEvent, getPath, 0}},
- {2905, {wxColourPickerEvent, getColour, 0}},
- {2906, {wxFontPickerEvent, getFont, 0}},
- {2907, {wxStyledTextEvent, getPosition, 0}},
- {2908, {wxStyledTextEvent, getKey, 0}},
- {2909, {wxStyledTextEvent, getModifiers, 0}},
- {2910, {wxStyledTextEvent, getModificationType, 0}},
- {2911, {wxStyledTextEvent, getText, 0}},
- {2912, {wxStyledTextEvent, getLength, 0}},
- {2913, {wxStyledTextEvent, getLinesAdded, 0}},
- {2914, {wxStyledTextEvent, getLine, 0}},
- {2915, {wxStyledTextEvent, getFoldLevelNow, 0}},
- {2916, {wxStyledTextEvent, getFoldLevelPrev, 0}},
- {2917, {wxStyledTextEvent, getMargin, 0}},
- {2918, {wxStyledTextEvent, getMessage, 0}},
- {2919, {wxStyledTextEvent, getWParam, 0}},
- {2920, {wxStyledTextEvent, getLParam, 0}},
- {2921, {wxStyledTextEvent, getListType, 0}},
- {2922, {wxStyledTextEvent, getX, 0}},
- {2923, {wxStyledTextEvent, getY, 0}},
- {2924, {wxStyledTextEvent, getDragText, 0}},
- {2925, {wxStyledTextEvent, getDragAllowMove, 0}},
- {2926, {wxStyledTextEvent, getDragResult, 0}},
- {2927, {wxStyledTextEvent, getShift, 0}},
- {2928, {wxStyledTextEvent, getControl, 0}},
- {2929, {wxStyledTextEvent, getAlt, 0}},
- {2930, {utils, getKeyState, 1}},
- {2931, {utils, getMousePosition, 2}},
- {2932, {utils, getMouseState, 0}},
- {2933, {utils, setDetectableAutoRepeat, 1}},
- {2934, {utils, bell, 0}},
- {2935, {utils, findMenuItemId, 3}},
- {2936, {utils, genericFindWindowAtPoint, 1}},
- {2937, {utils, findWindowAtPoint, 1}},
- {2938, {utils, beginBusyCursor, 1}},
- {2939, {utils, endBusyCursor, 0}},
- {2940, {utils, isBusy, 0}},
- {2941, {utils, shutdown, 1}},
- {2942, {utils, shell, 1}},
- {2943, {utils, launchDefaultBrowser, 2}},
- {2944, {utils, getEmailAddress, 0}},
- {2945, {utils, getUserId, 0}},
- {2946, {utils, getHomeDir, 0}},
- {2947, {utils, newId, 0}},
- {2948, {utils, registerId, 1}},
- {2949, {utils, getCurrentId, 0}},
- {2950, {utils, getOsDescription, 0}},
- {2951, {utils, isPlatformLittleEndian, 0}},
- {2952, {utils, isPlatform64Bit, 0}},
- {2953, {gdicmn, displaySize, 2}},
- {2954, {gdicmn, setCursor, 1}},
- {2955, {wxPrintout, new, 1}},
- {2956, {wxPrintout, destruct, 0}},
- {2957, {wxPrintout, getDC, 0}},
- {2958, {wxPrintout, getPageSizeMM, 2}},
- {2959, {wxPrintout, getPageSizePixels, 2}},
- {2960, {wxPrintout, getPaperRectPixels, 0}},
- {2961, {wxPrintout, getPPIPrinter, 2}},
- {2962, {wxPrintout, getPPIScreen, 2}},
- {2963, {wxPrintout, getTitle, 0}},
- {2964, {wxPrintout, isPreview, 0}},
- {2965, {wxPrintout, fitThisSizeToPaper, 1}},
- {2966, {wxPrintout, fitThisSizeToPage, 1}},
- {2967, {wxPrintout, fitThisSizeToPageMargins, 2}},
- {2968, {wxPrintout, mapScreenSizeToPaper, 0}},
- {2969, {wxPrintout, mapScreenSizeToPage, 0}},
- {2970, {wxPrintout, mapScreenSizeToPageMargins, 1}},
- {2971, {wxPrintout, mapScreenSizeToDevice, 0}},
- {2972, {wxPrintout, getLogicalPaperRect, 0}},
- {2973, {wxPrintout, getLogicalPageRect, 0}},
- {2974, {wxPrintout, getLogicalPageMarginsRect, 1}},
- {2975, {wxPrintout, setLogicalOrigin, 2}},
- {2976, {wxPrintout, offsetLogicalOrigin, 2}},
- {2977, {wxStyledTextCtrl, new_2, 2}},
- {2978, {wxStyledTextCtrl, new_0, 0}},
- {2979, {wxStyledTextCtrl, destruct, 0}},
- {2980, {wxStyledTextCtrl, create, 2}},
- {2981, {wxStyledTextCtrl, addText, 1}},
- {2982, {wxStyledTextCtrl, addStyledText, 1}},
- {2983, {wxStyledTextCtrl, insertText, 2}},
- {2984, {wxStyledTextCtrl, clearAll, 0}},
- {2985, {wxStyledTextCtrl, clearDocumentStyle, 0}},
- {2986, {wxStyledTextCtrl, getLength, 0}},
- {2987, {wxStyledTextCtrl, getCharAt, 1}},
- {2988, {wxStyledTextCtrl, getCurrentPos, 0}},
- {2989, {wxStyledTextCtrl, getAnchor, 0}},
- {2990, {wxStyledTextCtrl, getStyleAt, 1}},
- {2991, {wxStyledTextCtrl, redo, 0}},
- {2992, {wxStyledTextCtrl, setUndoCollection, 1}},
- {2993, {wxStyledTextCtrl, selectAll, 0}},
- {2994, {wxStyledTextCtrl, setSavePoint, 0}},
- {2995, {wxStyledTextCtrl, getStyledText, 2}},
- {2996, {wxStyledTextCtrl, canRedo, 0}},
- {2997, {wxStyledTextCtrl, markerLineFromHandle, 1}},
- {2998, {wxStyledTextCtrl, markerDeleteHandle, 1}},
- {2999, {wxStyledTextCtrl, getUndoCollection, 0}},
- {3000, {wxStyledTextCtrl, getViewWhiteSpace, 0}},
- {3001, {wxStyledTextCtrl, setViewWhiteSpace, 1}},
- {3002, {wxStyledTextCtrl, positionFromPoint, 1}},
- {3003, {wxStyledTextCtrl, positionFromPointClose, 2}},
- {3004, {wxStyledTextCtrl, gotoLine, 1}},
- {3005, {wxStyledTextCtrl, gotoPos, 1}},
- {3006, {wxStyledTextCtrl, setAnchor, 1}},
- {3007, {wxStyledTextCtrl, getCurLine, 1}},
- {3008, {wxStyledTextCtrl, getEndStyled, 0}},
- {3009, {wxStyledTextCtrl, convertEOLs, 1}},
- {3010, {wxStyledTextCtrl, getEOLMode, 0}},
- {3011, {wxStyledTextCtrl, setEOLMode, 1}},
- {3012, {wxStyledTextCtrl, startStyling, 2}},
- {3013, {wxStyledTextCtrl, setStyling, 2}},
- {3014, {wxStyledTextCtrl, getBufferedDraw, 0}},
- {3015, {wxStyledTextCtrl, setBufferedDraw, 1}},
- {3016, {wxStyledTextCtrl, setTabWidth, 1}},
- {3017, {wxStyledTextCtrl, getTabWidth, 0}},
- {3018, {wxStyledTextCtrl, setCodePage, 1}},
- {3019, {wxStyledTextCtrl, markerDefine, 3}},
- {3020, {wxStyledTextCtrl, markerSetForeground, 2}},
- {3021, {wxStyledTextCtrl, markerSetBackground, 2}},
- {3022, {wxStyledTextCtrl, markerAdd, 2}},
- {3023, {wxStyledTextCtrl, markerDelete, 2}},
- {3024, {wxStyledTextCtrl, markerDeleteAll, 1}},
- {3025, {wxStyledTextCtrl, markerGet, 1}},
- {3026, {wxStyledTextCtrl, markerNext, 2}},
- {3027, {wxStyledTextCtrl, markerPrevious, 2}},
- {3028, {wxStyledTextCtrl, markerDefineBitmap, 2}},
- {3029, {wxStyledTextCtrl, markerAddSet, 2}},
- {3030, {wxStyledTextCtrl, markerSetAlpha, 2}},
- {3031, {wxStyledTextCtrl, setMarginType, 2}},
- {3032, {wxStyledTextCtrl, getMarginType, 1}},
- {3033, {wxStyledTextCtrl, setMarginWidth, 2}},
- {3034, {wxStyledTextCtrl, getMarginWidth, 1}},
- {3035, {wxStyledTextCtrl, setMarginMask, 2}},
- {3036, {wxStyledTextCtrl, getMarginMask, 1}},
- {3037, {wxStyledTextCtrl, setMarginSensitive, 2}},
- {3038, {wxStyledTextCtrl, getMarginSensitive, 1}},
- {3039, {wxStyledTextCtrl, styleClearAll, 0}},
- {3040, {wxStyledTextCtrl, styleSetForeground, 2}},
- {3041, {wxStyledTextCtrl, styleSetBackground, 2}},
- {3042, {wxStyledTextCtrl, styleSetBold, 2}},
- {3043, {wxStyledTextCtrl, styleSetItalic, 2}},
- {3044, {wxStyledTextCtrl, styleSetSize, 2}},
- {3045, {wxStyledTextCtrl, styleSetFaceName, 2}},
- {3046, {wxStyledTextCtrl, styleSetEOLFilled, 2}},
- {3047, {wxStyledTextCtrl, styleResetDefault, 0}},
- {3048, {wxStyledTextCtrl, styleSetUnderline, 2}},
- {3049, {wxStyledTextCtrl, styleSetCase, 2}},
- {3050, {wxStyledTextCtrl, styleSetHotSpot, 2}},
- {3051, {wxStyledTextCtrl, setSelForeground, 2}},
- {3052, {wxStyledTextCtrl, setSelBackground, 2}},
- {3053, {wxStyledTextCtrl, getSelAlpha, 0}},
- {3054, {wxStyledTextCtrl, setSelAlpha, 1}},
- {3055, {wxStyledTextCtrl, setCaretForeground, 1}},
- {3056, {wxStyledTextCtrl, cmdKeyAssign, 3}},
- {3057, {wxStyledTextCtrl, cmdKeyClear, 2}},
- {3058, {wxStyledTextCtrl, cmdKeyClearAll, 0}},
- {3059, {wxStyledTextCtrl, setStyleBytes, 2}},
- {3060, {wxStyledTextCtrl, styleSetVisible, 2}},
- {3061, {wxStyledTextCtrl, getCaretPeriod, 0}},
- {3062, {wxStyledTextCtrl, setCaretPeriod, 1}},
- {3063, {wxStyledTextCtrl, setWordChars, 1}},
- {3064, {wxStyledTextCtrl, beginUndoAction, 0}},
- {3065, {wxStyledTextCtrl, endUndoAction, 0}},
- {3066, {wxStyledTextCtrl, indicatorSetStyle, 2}},
- {3067, {wxStyledTextCtrl, indicatorGetStyle, 1}},
- {3068, {wxStyledTextCtrl, indicatorSetForeground, 2}},
- {3069, {wxStyledTextCtrl, indicatorGetForeground, 1}},
- {3070, {wxStyledTextCtrl, setWhitespaceForeground, 2}},
- {3071, {wxStyledTextCtrl, setWhitespaceBackground, 2}},
- {3072, {wxStyledTextCtrl, getStyleBits, 0}},
- {3073, {wxStyledTextCtrl, setLineState, 2}},
- {3074, {wxStyledTextCtrl, getLineState, 1}},
- {3075, {wxStyledTextCtrl, getMaxLineState, 0}},
- {3076, {wxStyledTextCtrl, getCaretLineVisible, 0}},
- {3077, {wxStyledTextCtrl, setCaretLineVisible, 1}},
- {3078, {wxStyledTextCtrl, getCaretLineBackground, 0}},
- {3079, {wxStyledTextCtrl, setCaretLineBackground, 1}},
- {3080, {wxStyledTextCtrl, autoCompShow, 2}},
- {3081, {wxStyledTextCtrl, autoCompCancel, 0}},
- {3082, {wxStyledTextCtrl, autoCompActive, 0}},
- {3083, {wxStyledTextCtrl, autoCompPosStart, 0}},
- {3084, {wxStyledTextCtrl, autoCompComplete, 0}},
- {3085, {wxStyledTextCtrl, autoCompStops, 1}},
- {3086, {wxStyledTextCtrl, autoCompSetSeparator, 1}},
- {3087, {wxStyledTextCtrl, autoCompGetSeparator, 0}},
- {3088, {wxStyledTextCtrl, autoCompSelect, 1}},
- {3089, {wxStyledTextCtrl, autoCompSetCancelAtStart, 1}},
- {3090, {wxStyledTextCtrl, autoCompGetCancelAtStart, 0}},
- {3091, {wxStyledTextCtrl, autoCompSetFillUps, 1}},
- {3092, {wxStyledTextCtrl, autoCompSetChooseSingle, 1}},
- {3093, {wxStyledTextCtrl, autoCompGetChooseSingle, 0}},
- {3094, {wxStyledTextCtrl, autoCompSetIgnoreCase, 1}},
- {3095, {wxStyledTextCtrl, autoCompGetIgnoreCase, 0}},
- {3096, {wxStyledTextCtrl, userListShow, 2}},
- {3097, {wxStyledTextCtrl, autoCompSetAutoHide, 1}},
- {3098, {wxStyledTextCtrl, autoCompGetAutoHide, 0}},
- {3099, {wxStyledTextCtrl, autoCompSetDropRestOfWord, 1}},
- {3100, {wxStyledTextCtrl, autoCompGetDropRestOfWord, 0}},
- {3101, {wxStyledTextCtrl, registerImage, 2}},
- {3102, {wxStyledTextCtrl, clearRegisteredImages, 0}},
- {3103, {wxStyledTextCtrl, autoCompGetTypeSeparator, 0}},
- {3104, {wxStyledTextCtrl, autoCompSetTypeSeparator, 1}},
- {3105, {wxStyledTextCtrl, autoCompSetMaxWidth, 1}},
- {3106, {wxStyledTextCtrl, autoCompGetMaxWidth, 0}},
- {3107, {wxStyledTextCtrl, autoCompSetMaxHeight, 1}},
- {3108, {wxStyledTextCtrl, autoCompGetMaxHeight, 0}},
- {3109, {wxStyledTextCtrl, setIndent, 1}},
- {3110, {wxStyledTextCtrl, getIndent, 0}},
- {3111, {wxStyledTextCtrl, setUseTabs, 1}},
- {3112, {wxStyledTextCtrl, getUseTabs, 0}},
- {3113, {wxStyledTextCtrl, setLineIndentation, 2}},
- {3114, {wxStyledTextCtrl, getLineIndentation, 1}},
- {3115, {wxStyledTextCtrl, getLineIndentPosition, 1}},
- {3116, {wxStyledTextCtrl, getColumn, 1}},
- {3117, {wxStyledTextCtrl, setUseHorizontalScrollBar, 1}},
- {3118, {wxStyledTextCtrl, getUseHorizontalScrollBar, 0}},
- {3119, {wxStyledTextCtrl, setIndentationGuides, 1}},
- {3120, {wxStyledTextCtrl, getIndentationGuides, 0}},
- {3121, {wxStyledTextCtrl, setHighlightGuide, 1}},
- {3122, {wxStyledTextCtrl, getHighlightGuide, 0}},
- {3123, {wxStyledTextCtrl, getLineEndPosition, 1}},
- {3124, {wxStyledTextCtrl, getCodePage, 0}},
- {3125, {wxStyledTextCtrl, getCaretForeground, 0}},
- {3126, {wxStyledTextCtrl, getReadOnly, 0}},
- {3127, {wxStyledTextCtrl, setCurrentPos, 1}},
- {3128, {wxStyledTextCtrl, setSelectionStart, 1}},
- {3129, {wxStyledTextCtrl, getSelectionStart, 0}},
- {3130, {wxStyledTextCtrl, setSelectionEnd, 1}},
- {3131, {wxStyledTextCtrl, getSelectionEnd, 0}},
- {3132, {wxStyledTextCtrl, setPrintMagnification, 1}},
- {3133, {wxStyledTextCtrl, getPrintMagnification, 0}},
- {3134, {wxStyledTextCtrl, setPrintColourMode, 1}},
- {3135, {wxStyledTextCtrl, getPrintColourMode, 0}},
- {3136, {wxStyledTextCtrl, findText, 4}},
- {3137, {wxStyledTextCtrl, formatRange, 7}},
- {3138, {wxStyledTextCtrl, getFirstVisibleLine, 0}},
- {3139, {wxStyledTextCtrl, getLine, 1}},
- {3140, {wxStyledTextCtrl, getLineCount, 0}},
- {3141, {wxStyledTextCtrl, setMarginLeft, 1}},
- {3142, {wxStyledTextCtrl, getMarginLeft, 0}},
- {3143, {wxStyledTextCtrl, setMarginRight, 1}},
- {3144, {wxStyledTextCtrl, getMarginRight, 0}},
- {3145, {wxStyledTextCtrl, getModify, 0}},
- {3146, {wxStyledTextCtrl, setSelection, 2}},
- {3147, {wxStyledTextCtrl, getSelectedText, 0}},
- {3148, {wxStyledTextCtrl, getTextRange, 2}},
- {3149, {wxStyledTextCtrl, hideSelection, 1}},
- {3150, {wxStyledTextCtrl, lineFromPosition, 1}},
- {3151, {wxStyledTextCtrl, positionFromLine, 1}},
- {3152, {wxStyledTextCtrl, lineScroll, 2}},
- {3153, {wxStyledTextCtrl, ensureCaretVisible, 0}},
- {3154, {wxStyledTextCtrl, replaceSelection, 1}},
- {3155, {wxStyledTextCtrl, setReadOnly, 1}},
- {3156, {wxStyledTextCtrl, canPaste, 0}},
- {3157, {wxStyledTextCtrl, canUndo, 0}},
- {3158, {wxStyledTextCtrl, emptyUndoBuffer, 0}},
- {3159, {wxStyledTextCtrl, undo, 0}},
- {3160, {wxStyledTextCtrl, cut, 0}},
- {3161, {wxStyledTextCtrl, copy, 0}},
- {3162, {wxStyledTextCtrl, paste, 0}},
- {3163, {wxStyledTextCtrl, clear, 0}},
- {3164, {wxStyledTextCtrl, setText, 1}},
- {3165, {wxStyledTextCtrl, getText, 0}},
- {3166, {wxStyledTextCtrl, getTextLength, 0}},
- {3167, {wxStyledTextCtrl, getOvertype, 0}},
- {3168, {wxStyledTextCtrl, setCaretWidth, 1}},
- {3169, {wxStyledTextCtrl, getCaretWidth, 0}},
- {3170, {wxStyledTextCtrl, setTargetStart, 1}},
- {3171, {wxStyledTextCtrl, getTargetStart, 0}},
- {3172, {wxStyledTextCtrl, setTargetEnd, 1}},
- {3173, {wxStyledTextCtrl, getTargetEnd, 0}},
- {3174, {wxStyledTextCtrl, replaceTarget, 1}},
- {3175, {wxStyledTextCtrl, searchInTarget, 1}},
- {3176, {wxStyledTextCtrl, setSearchFlags, 1}},
- {3177, {wxStyledTextCtrl, getSearchFlags, 0}},
- {3178, {wxStyledTextCtrl, callTipShow, 2}},
- {3179, {wxStyledTextCtrl, callTipCancel, 0}},
- {3180, {wxStyledTextCtrl, callTipActive, 0}},
- {3181, {wxStyledTextCtrl, callTipPosAtStart, 0}},
- {3182, {wxStyledTextCtrl, callTipSetHighlight, 2}},
- {3183, {wxStyledTextCtrl, callTipSetBackground, 1}},
- {3184, {wxStyledTextCtrl, callTipSetForeground, 1}},
- {3185, {wxStyledTextCtrl, callTipSetForegroundHighlight, 1}},
- {3186, {wxStyledTextCtrl, callTipUseStyle, 1}},
- {3187, {wxStyledTextCtrl, visibleFromDocLine, 1}},
- {3188, {wxStyledTextCtrl, docLineFromVisible, 1}},
- {3189, {wxStyledTextCtrl, wrapCount, 1}},
- {3190, {wxStyledTextCtrl, setFoldLevel, 2}},
- {3191, {wxStyledTextCtrl, getFoldLevel, 1}},
- {3192, {wxStyledTextCtrl, getLastChild, 2}},
- {3193, {wxStyledTextCtrl, getFoldParent, 1}},
- {3194, {wxStyledTextCtrl, showLines, 2}},
- {3195, {wxStyledTextCtrl, hideLines, 2}},
- {3196, {wxStyledTextCtrl, getLineVisible, 1}},
- {3197, {wxStyledTextCtrl, setFoldExpanded, 2}},
- {3198, {wxStyledTextCtrl, getFoldExpanded, 1}},
- {3199, {wxStyledTextCtrl, toggleFold, 1}},
- {3200, {wxStyledTextCtrl, ensureVisible, 1}},
- {3201, {wxStyledTextCtrl, setFoldFlags, 1}},
- {3202, {wxStyledTextCtrl, ensureVisibleEnforcePolicy, 1}},
- {3203, {wxStyledTextCtrl, setTabIndents, 1}},
- {3204, {wxStyledTextCtrl, getTabIndents, 0}},
- {3205, {wxStyledTextCtrl, setBackSpaceUnIndents, 1}},
- {3206, {wxStyledTextCtrl, getBackSpaceUnIndents, 0}},
- {3207, {wxStyledTextCtrl, setMouseDwellTime, 1}},
- {3208, {wxStyledTextCtrl, getMouseDwellTime, 0}},
- {3209, {wxStyledTextCtrl, wordStartPosition, 2}},
- {3210, {wxStyledTextCtrl, wordEndPosition, 2}},
- {3211, {wxStyledTextCtrl, setWrapMode, 1}},
- {3212, {wxStyledTextCtrl, getWrapMode, 0}},
- {3213, {wxStyledTextCtrl, setWrapVisualFlags, 1}},
- {3214, {wxStyledTextCtrl, getWrapVisualFlags, 0}},
- {3215, {wxStyledTextCtrl, setWrapVisualFlagsLocation, 1}},
- {3216, {wxStyledTextCtrl, getWrapVisualFlagsLocation, 0}},
- {3217, {wxStyledTextCtrl, setWrapStartIndent, 1}},
- {3218, {wxStyledTextCtrl, getWrapStartIndent, 0}},
- {3219, {wxStyledTextCtrl, setLayoutCache, 1}},
- {3220, {wxStyledTextCtrl, getLayoutCache, 0}},
- {3221, {wxStyledTextCtrl, setScrollWidth, 1}},
- {3222, {wxStyledTextCtrl, getScrollWidth, 0}},
- {3223, {wxStyledTextCtrl, textWidth, 2}},
- {3224, {wxStyledTextCtrl, getEndAtLastLine, 0}},
- {3225, {wxStyledTextCtrl, textHeight, 1}},
- {3226, {wxStyledTextCtrl, setUseVerticalScrollBar, 1}},
- {3227, {wxStyledTextCtrl, getUseVerticalScrollBar, 0}},
- {3228, {wxStyledTextCtrl, appendText, 1}},
- {3229, {wxStyledTextCtrl, getTwoPhaseDraw, 0}},
- {3230, {wxStyledTextCtrl, setTwoPhaseDraw, 1}},
- {3231, {wxStyledTextCtrl, targetFromSelection, 0}},
- {3232, {wxStyledTextCtrl, linesJoin, 0}},
- {3233, {wxStyledTextCtrl, linesSplit, 1}},
- {3234, {wxStyledTextCtrl, setFoldMarginColour, 2}},
- {3235, {wxStyledTextCtrl, setFoldMarginHiColour, 2}},
- {3236, {wxStyledTextCtrl, lineDown, 0}},
- {3237, {wxStyledTextCtrl, lineDownExtend, 0}},
- {3238, {wxStyledTextCtrl, lineUp, 0}},
- {3239, {wxStyledTextCtrl, lineUpExtend, 0}},
- {3240, {wxStyledTextCtrl, charLeft, 0}},
- {3241, {wxStyledTextCtrl, charLeftExtend, 0}},
- {3242, {wxStyledTextCtrl, charRight, 0}},
- {3243, {wxStyledTextCtrl, charRightExtend, 0}},
- {3244, {wxStyledTextCtrl, wordLeft, 0}},
- {3245, {wxStyledTextCtrl, wordLeftExtend, 0}},
- {3246, {wxStyledTextCtrl, wordRight, 0}},
- {3247, {wxStyledTextCtrl, wordRightExtend, 0}},
- {3248, {wxStyledTextCtrl, home, 0}},
- {3249, {wxStyledTextCtrl, homeExtend, 0}},
- {3250, {wxStyledTextCtrl, lineEnd, 0}},
- {3251, {wxStyledTextCtrl, lineEndExtend, 0}},
- {3252, {wxStyledTextCtrl, documentStart, 0}},
- {3253, {wxStyledTextCtrl, documentStartExtend, 0}},
- {3254, {wxStyledTextCtrl, documentEnd, 0}},
- {3255, {wxStyledTextCtrl, documentEndExtend, 0}},
- {3256, {wxStyledTextCtrl, pageUp, 0}},
- {3257, {wxStyledTextCtrl, pageUpExtend, 0}},
- {3258, {wxStyledTextCtrl, pageDown, 0}},
- {3259, {wxStyledTextCtrl, pageDownExtend, 0}},
- {3260, {wxStyledTextCtrl, editToggleOvertype, 0}},
- {3261, {wxStyledTextCtrl, cancel, 0}},
- {3262, {wxStyledTextCtrl, deleteBack, 0}},
- {3263, {wxStyledTextCtrl, tab, 0}},
- {3264, {wxStyledTextCtrl, backTab, 0}},
- {3265, {wxStyledTextCtrl, newLine, 0}},
- {3266, {wxStyledTextCtrl, formFeed, 0}},
- {3267, {wxStyledTextCtrl, vCHome, 0}},
- {3268, {wxStyledTextCtrl, vCHomeExtend, 0}},
- {3269, {wxStyledTextCtrl, zoomIn, 0}},
- {3270, {wxStyledTextCtrl, zoomOut, 0}},
- {3271, {wxStyledTextCtrl, delWordLeft, 0}},
- {3272, {wxStyledTextCtrl, delWordRight, 0}},
- {3273, {wxStyledTextCtrl, lineCut, 0}},
- {3274, {wxStyledTextCtrl, lineDelete, 0}},
- {3275, {wxStyledTextCtrl, lineTranspose, 0}},
- {3276, {wxStyledTextCtrl, lineDuplicate, 0}},
- {3277, {wxStyledTextCtrl, lowerCase, 0}},
- {3278, {wxStyledTextCtrl, upperCase, 0}},
- {3279, {wxStyledTextCtrl, lineScrollDown, 0}},
- {3280, {wxStyledTextCtrl, lineScrollUp, 0}},
- {3281, {wxStyledTextCtrl, deleteBackNotLine, 0}},
- {3282, {wxStyledTextCtrl, homeDisplay, 0}},
- {3283, {wxStyledTextCtrl, homeDisplayExtend, 0}},
- {3284, {wxStyledTextCtrl, lineEndDisplay, 0}},
- {3285, {wxStyledTextCtrl, lineEndDisplayExtend, 0}},
- {3286, {wxStyledTextCtrl, homeWrapExtend, 0}},
- {3287, {wxStyledTextCtrl, lineEndWrap, 0}},
- {3288, {wxStyledTextCtrl, lineEndWrapExtend, 0}},
- {3289, {wxStyledTextCtrl, vCHomeWrap, 0}},
- {3290, {wxStyledTextCtrl, vCHomeWrapExtend, 0}},
- {3291, {wxStyledTextCtrl, lineCopy, 0}},
- {3292, {wxStyledTextCtrl, moveCaretInsideView, 0}},
- {3293, {wxStyledTextCtrl, lineLength, 1}},
- {3294, {wxStyledTextCtrl, braceHighlight, 2}},
- {3295, {wxStyledTextCtrl, braceBadLight, 1}},
- {3296, {wxStyledTextCtrl, braceMatch, 1}},
- {3297, {wxStyledTextCtrl, getViewEOL, 0}},
- {3298, {wxStyledTextCtrl, setViewEOL, 1}},
- {3299, {wxStyledTextCtrl, setModEventMask, 1}},
- {3300, {wxStyledTextCtrl, getEdgeColumn, 0}},
- {3301, {wxStyledTextCtrl, setEdgeColumn, 1}},
- {3302, {wxStyledTextCtrl, setEdgeMode, 1}},
- {3303, {wxStyledTextCtrl, getEdgeMode, 0}},
- {3304, {wxStyledTextCtrl, getEdgeColour, 0}},
- {3305, {wxStyledTextCtrl, setEdgeColour, 1}},
- {3306, {wxStyledTextCtrl, searchAnchor, 0}},
- {3307, {wxStyledTextCtrl, searchNext, 2}},
- {3308, {wxStyledTextCtrl, searchPrev, 2}},
- {3309, {wxStyledTextCtrl, linesOnScreen, 0}},
- {3310, {wxStyledTextCtrl, usePopUp, 1}},
- {3311, {wxStyledTextCtrl, selectionIsRectangle, 0}},
- {3312, {wxStyledTextCtrl, setZoom, 1}},
- {3313, {wxStyledTextCtrl, getZoom, 0}},
- {3314, {wxStyledTextCtrl, getModEventMask, 0}},
- {3315, {wxStyledTextCtrl, setSTCFocus, 1}},
- {3316, {wxStyledTextCtrl, getSTCFocus, 0}},
- {3317, {wxStyledTextCtrl, setStatus, 1}},
- {3318, {wxStyledTextCtrl, getStatus, 0}},
- {3319, {wxStyledTextCtrl, setMouseDownCaptures, 1}},
- {3320, {wxStyledTextCtrl, getMouseDownCaptures, 0}},
- {3321, {wxStyledTextCtrl, setSTCCursor, 1}},
- {3322, {wxStyledTextCtrl, getSTCCursor, 0}},
- {3323, {wxStyledTextCtrl, setControlCharSymbol, 1}},
- {3324, {wxStyledTextCtrl, getControlCharSymbol, 0}},
- {3325, {wxStyledTextCtrl, wordPartLeft, 0}},
- {3326, {wxStyledTextCtrl, wordPartLeftExtend, 0}},
- {3327, {wxStyledTextCtrl, wordPartRight, 0}},
- {3328, {wxStyledTextCtrl, wordPartRightExtend, 0}},
- {3329, {wxStyledTextCtrl, setVisiblePolicy, 2}},
- {3330, {wxStyledTextCtrl, delLineLeft, 0}},
- {3331, {wxStyledTextCtrl, delLineRight, 0}},
- {3332, {wxStyledTextCtrl, getXOffset, 0}},
- {3333, {wxStyledTextCtrl, chooseCaretX, 0}},
- {3334, {wxStyledTextCtrl, setXCaretPolicy, 2}},
- {3335, {wxStyledTextCtrl, setYCaretPolicy, 2}},
- {3336, {wxStyledTextCtrl, getPrintWrapMode, 0}},
- {3337, {wxStyledTextCtrl, setHotspotActiveForeground, 2}},
- {3338, {wxStyledTextCtrl, setHotspotActiveBackground, 2}},
- {3339, {wxStyledTextCtrl, setHotspotActiveUnderline, 1}},
- {3340, {wxStyledTextCtrl, setHotspotSingleLine, 1}},
- {3341, {wxStyledTextCtrl, paraDownExtend, 0}},
- {3342, {wxStyledTextCtrl, paraUp, 0}},
- {3343, {wxStyledTextCtrl, paraUpExtend, 0}},
- {3344, {wxStyledTextCtrl, positionBefore, 1}},
- {3345, {wxStyledTextCtrl, positionAfter, 1}},
- {3346, {wxStyledTextCtrl, copyRange, 2}},
- {3347, {wxStyledTextCtrl, copyText, 2}},
- {3348, {wxStyledTextCtrl, setSelectionMode, 1}},
- {3349, {wxStyledTextCtrl, getSelectionMode, 0}},
- {3350, {wxStyledTextCtrl, lineDownRectExtend, 0}},
- {3351, {wxStyledTextCtrl, lineUpRectExtend, 0}},
- {3352, {wxStyledTextCtrl, charLeftRectExtend, 0}},
- {3353, {wxStyledTextCtrl, charRightRectExtend, 0}},
- {3354, {wxStyledTextCtrl, homeRectExtend, 0}},
- {3355, {wxStyledTextCtrl, vCHomeRectExtend, 0}},
- {3356, {wxStyledTextCtrl, lineEndRectExtend, 0}},
- {3357, {wxStyledTextCtrl, pageUpRectExtend, 0}},
- {3358, {wxStyledTextCtrl, pageDownRectExtend, 0}},
- {3359, {wxStyledTextCtrl, stutteredPageUp, 0}},
- {3360, {wxStyledTextCtrl, stutteredPageUpExtend, 0}},
- {3361, {wxStyledTextCtrl, stutteredPageDown, 0}},
- {3362, {wxStyledTextCtrl, stutteredPageDownExtend, 0}},
- {3363, {wxStyledTextCtrl, wordLeftEnd, 0}},
- {3364, {wxStyledTextCtrl, wordLeftEndExtend, 0}},
- {3365, {wxStyledTextCtrl, wordRightEnd, 0}},
- {3366, {wxStyledTextCtrl, wordRightEndExtend, 0}},
- {3367, {wxStyledTextCtrl, setWhitespaceChars, 1}},
- {3368, {wxStyledTextCtrl, setCharsDefault, 0}},
- {3369, {wxStyledTextCtrl, autoCompGetCurrent, 0}},
- {3370, {wxStyledTextCtrl, allocate, 1}},
- {3371, {wxStyledTextCtrl, findColumn, 2}},
- {3372, {wxStyledTextCtrl, getCaretSticky, 0}},
- {3373, {wxStyledTextCtrl, setCaretSticky, 1}},
- {3374, {wxStyledTextCtrl, toggleCaretSticky, 0}},
- {3375, {wxStyledTextCtrl, setPasteConvertEndings, 1}},
- {3376, {wxStyledTextCtrl, getPasteConvertEndings, 0}},
- {3377, {wxStyledTextCtrl, selectionDuplicate, 0}},
- {3378, {wxStyledTextCtrl, setCaretLineBackAlpha, 1}},
- {3379, {wxStyledTextCtrl, getCaretLineBackAlpha, 0}},
- {3380, {wxStyledTextCtrl, startRecord, 0}},
- {3381, {wxStyledTextCtrl, stopRecord, 0}},
- {3382, {wxStyledTextCtrl, setLexer, 1}},
- {3383, {wxStyledTextCtrl, getLexer, 0}},
- {3384, {wxStyledTextCtrl, colourise, 2}},
- {3385, {wxStyledTextCtrl, setProperty, 2}},
- {3386, {wxStyledTextCtrl, setKeyWords, 2}},
- {3387, {wxStyledTextCtrl, setLexerLanguage, 1}},
- {3388, {wxStyledTextCtrl, getProperty, 1}},
- {3389, {wxStyledTextCtrl, getStyleBitsNeeded, 0}},
- {3390, {wxStyledTextCtrl, getCurrentLine, 0}},
- {3391, {wxStyledTextCtrl, styleSetSpec, 2}},
- {3392, {wxStyledTextCtrl, styleSetFont, 2}},
- {3393, {wxStyledTextCtrl, styleSetFontAttr, 7}},
- {3394, {wxStyledTextCtrl, styleSetCharacterSet, 2}},
- {3395, {wxStyledTextCtrl, styleSetFontEncoding, 2}},
- {3396, {wxStyledTextCtrl, cmdKeyExecute, 1}},
- {3397, {wxStyledTextCtrl, setMargins, 2}},
- {3398, {wxStyledTextCtrl, getSelection, 2}},
- {3399, {wxStyledTextCtrl, pointFromPosition, 1}},
- {3400, {wxStyledTextCtrl, scrollToLine, 1}},
- {3401, {wxStyledTextCtrl, scrollToColumn, 1}},
- {3402, {wxStyledTextCtrl, setVScrollBar, 1}},
- {3403, {wxStyledTextCtrl, setHScrollBar, 1}},
- {3404, {wxStyledTextCtrl, getLastKeydownProcessed, 0}},
- {3405, {wxStyledTextCtrl, setLastKeydownProcessed, 1}},
- {3406, {wxStyledTextCtrl, saveFile, 1}},
- {3407, {wxStyledTextCtrl, loadFile, 1}},
- {3408, {wxStyledTextCtrl, doDragOver, 3}},
- {3409, {wxStyledTextCtrl, doDropText, 3}},
- {3410, {wxStyledTextCtrl, getUseAntiAliasing, 0}},
- {3411, {wxStyledTextCtrl, addTextRaw, 1}},
- {3412, {wxStyledTextCtrl, insertTextRaw, 2}},
- {3413, {wxStyledTextCtrl, getCurLineRaw, 1}},
- {3414, {wxStyledTextCtrl, getLineRaw, 1}},
- {3415, {wxStyledTextCtrl, getSelectedTextRaw, 0}},
- {3416, {wxStyledTextCtrl, getTextRangeRaw, 2}},
- {3417, {wxStyledTextCtrl, setTextRaw, 1}},
- {3418, {wxStyledTextCtrl, getTextRaw, 0}},
- {3419, {wxStyledTextCtrl, appendTextRaw, 1}},
- {3420, {wxArtProvider, getBitmap, 2}},
- {3421, {wxArtProvider, getIcon, 2}},
- {3422, {wxTreeEvent, getKeyCode, 0}},
- {3423, {wxTreeEvent, getItem, 0}},
- {3424, {wxTreeEvent, getKeyEvent, 0}},
- {3425, {wxTreeEvent, getLabel, 0}},
- {3426, {wxTreeEvent, getOldItem, 0}},
- {3427, {wxTreeEvent, getPoint, 0}},
- {3428, {wxTreeEvent, isEditCancelled, 0}},
- {3429, {wxTreeEvent, setToolTip, 1}},
- {3430, {wxNotebookEvent, getOldSelection, 0}},
- {3431, {wxNotebookEvent, getSelection, 0}},
- {3432, {wxNotebookEvent, setOldSelection, 1}},
- {3433, {wxNotebookEvent, setSelection, 1}},
- {3434, {wxFileDataObject, new, 0}},
- {3435, {wxFileDataObject, addFile, 1}},
- {3436, {wxFileDataObject, getFilenames, 0}},
- {3437, {wxFileDataObject, 'Destroy', undefined}},
- {3438, {wxTextDataObject, new, 1}},
- {3439, {wxTextDataObject, getTextLength, 0}},
- {3440, {wxTextDataObject, getText, 0}},
- {3441, {wxTextDataObject, setText, 1}},
- {3442, {wxTextDataObject, 'Destroy', undefined}},
- {3443, {wxBitmapDataObject, new_1_1, 1}},
- {3444, {wxBitmapDataObject, new_1_0, 1}},
- {3445, {wxBitmapDataObject, getBitmap, 0}},
- {3446, {wxBitmapDataObject, setBitmap, 1}},
- {3447, {wxBitmapDataObject, 'Destroy', undefined}},
- {3449, {wxClipboard, new, 0}},
- {3450, {wxClipboard, destruct, 0}},
- {3451, {wxClipboard, addData, 1}},
- {3452, {wxClipboard, clear, 0}},
- {3453, {wxClipboard, close, 0}},
- {3454, {wxClipboard, flush, 0}},
- {3455, {wxClipboard, getData, 1}},
- {3456, {wxClipboard, isOpened, 0}},
- {3457, {wxClipboard, open, 0}},
- {3458, {wxClipboard, setData, 1}},
- {3460, {wxClipboard, usePrimarySelection, 1}},
- {3461, {wxClipboard, isSupported, 1}},
- {3462, {wxClipboard, get, 0}},
- {3463, {wxSpinEvent, getPosition, 0}},
- {3464, {wxSpinEvent, setPosition, 1}},
- {3465, {wxSplitterWindow, new_0, 0}},
- {3466, {wxSplitterWindow, new_2, 2}},
- {3467, {wxSplitterWindow, destruct, 0}},
- {3468, {wxSplitterWindow, create, 2}},
- {3469, {wxSplitterWindow, getMinimumPaneSize, 0}},
- {3470, {wxSplitterWindow, getSashGravity, 0}},
- {3471, {wxSplitterWindow, getSashPosition, 0}},
- {3472, {wxSplitterWindow, getSplitMode, 0}},
- {3473, {wxSplitterWindow, getWindow1, 0}},
- {3474, {wxSplitterWindow, getWindow2, 0}},
- {3475, {wxSplitterWindow, initialize, 1}},
- {3476, {wxSplitterWindow, isSplit, 0}},
- {3477, {wxSplitterWindow, replaceWindow, 2}},
- {3478, {wxSplitterWindow, setSashGravity, 1}},
- {3479, {wxSplitterWindow, setSashPosition, 2}},
- {3480, {wxSplitterWindow, setSashSize, 1}},
- {3481, {wxSplitterWindow, setMinimumPaneSize, 1}},
- {3482, {wxSplitterWindow, setSplitMode, 1}},
- {3483, {wxSplitterWindow, splitHorizontally, 3}},
- {3484, {wxSplitterWindow, splitVertically, 3}},
- {3485, {wxSplitterWindow, unsplit, 1}},
- {3486, {wxSplitterWindow, updateSize, 0}},
- {3487, {wxSplitterEvent, getSashPosition, 0}},
- {3488, {wxSplitterEvent, getX, 0}},
- {3489, {wxSplitterEvent, getY, 0}},
- {3490, {wxSplitterEvent, getWindowBeingRemoved, 0}},
- {3491, {wxSplitterEvent, setSashPosition, 1}},
- {3492, {wxHtmlWindow, new_0, 0}},
- {3493, {wxHtmlWindow, new_2, 2}},
- {3494, {wxHtmlWindow, appendToPage, 1}},
- {3495, {wxHtmlWindow, getOpenedAnchor, 0}},
- {3496, {wxHtmlWindow, getOpenedPage, 0}},
- {3497, {wxHtmlWindow, getOpenedPageTitle, 0}},
- {3498, {wxHtmlWindow, getRelatedFrame, 0}},
- {3499, {wxHtmlWindow, historyBack, 0}},
- {3500, {wxHtmlWindow, historyCanBack, 0}},
- {3501, {wxHtmlWindow, historyCanForward, 0}},
- {3502, {wxHtmlWindow, historyClear, 0}},
- {3503, {wxHtmlWindow, historyForward, 0}},
- {3504, {wxHtmlWindow, loadFile, 1}},
- {3505, {wxHtmlWindow, loadPage, 1}},
- {3506, {wxHtmlWindow, selectAll, 0}},
- {3507, {wxHtmlWindow, selectionToText, 0}},
- {3508, {wxHtmlWindow, selectLine, 1}},
- {3509, {wxHtmlWindow, selectWord, 1}},
- {3510, {wxHtmlWindow, setBorders, 1}},
- {3511, {wxHtmlWindow, setFonts, 3}},
- {3512, {wxHtmlWindow, setPage, 1}},
- {3513, {wxHtmlWindow, setRelatedFrame, 2}},
- {3514, {wxHtmlWindow, setRelatedStatusBar, 1}},
- {3515, {wxHtmlWindow, toText, 0}},
- {3516, {wxHtmlWindow, 'Destroy', undefined}},
- {3517, {wxHtmlLinkEvent, getLinkInfo, 0}},
- {3518, {wxSystemSettings, getColour, 1}},
- {3519, {wxSystemSettings, getFont, 1}},
- {3520, {wxSystemSettings, getMetric, 2}},
- {3521, {wxSystemSettings, getScreenType, 0}},
- {3522, {wxSystemOptions, getOption, 1}},
- {3523, {wxSystemOptions, getOptionInt, 1}},
- {3524, {wxSystemOptions, hasOption, 1}},
- {3525, {wxSystemOptions, isFalse, 1}},
- {3526, {wxSystemOptions, setOption_2_1, 2}},
- {3527, {wxSystemOptions, setOption_2_0, 2}},
- {3528, {wxAuiNotebookEvent, setSelection, 1}},
- {3529, {wxAuiNotebookEvent, getSelection, 0}},
- {3530, {wxAuiNotebookEvent, setOldSelection, 1}},
- {3531, {wxAuiNotebookEvent, getOldSelection, 0}},
- {3532, {wxAuiNotebookEvent, setDragSource, 1}},
- {3533, {wxAuiNotebookEvent, getDragSource, 0}},
- {3534, {wxAuiManagerEvent, setManager, 1}},
- {3535, {wxAuiManagerEvent, getManager, 0}},
- {3536, {wxAuiManagerEvent, setPane, 1}},
- {3537, {wxAuiManagerEvent, getPane, 0}},
- {3538, {wxAuiManagerEvent, setButton, 1}},
- {3539, {wxAuiManagerEvent, getButton, 0}},
- {3540, {wxAuiManagerEvent, setDC, 1}},
- {3541, {wxAuiManagerEvent, getDC, 0}},
- {3542, {wxAuiManagerEvent, veto, 1}},
- {3543, {wxAuiManagerEvent, getVeto, 0}},
- {3544, {wxAuiManagerEvent, setCanVeto, 1}},
- {3545, {wxAuiManagerEvent, canVeto, 0}},
- {3546, {wxLogNull, new, 0}},
- {3547, {wxLogNull, 'Destroy', undefined}},
- {3548, {wxTaskBarIcon, new, 0}},
- {3549, {wxTaskBarIcon, destruct, 0}},
- {3550, {wxTaskBarIcon, popupMenu, 1}},
- {3551, {wxTaskBarIcon, removeIcon, 0}},
- {3552, {wxTaskBarIcon, setIcon, 2}},
- {3553, {wxLocale, new_0, 0}},
- {3555, {wxLocale, new_2, 2}},
- {3556, {wxLocale, destruct, 0}},
- {3558, {wxLocale, init, 1}},
- {3559, {wxLocale, addCatalog_1, 1}},
- {3560, {wxLocale, addCatalog_3, 3}},
- {3561, {wxLocale, addCatalogLookupPathPrefix, 1}},
- {3562, {wxLocale, getCanonicalName, 0}},
- {3563, {wxLocale, getLanguage, 0}},
- {3564, {wxLocale, getLanguageName, 1}},
- {3565, {wxLocale, getLocale, 0}},
- {3566, {wxLocale, getName, 0}},
- {3567, {wxLocale, getString_2, 2}},
- {3568, {wxLocale, getString_4, 4}},
- {3569, {wxLocale, getHeaderValue, 2}},
- {3570, {wxLocale, getSysName, 0}},
- {3571, {wxLocale, getSystemEncoding, 0}},
- {3572, {wxLocale, getSystemEncodingName, 0}},
- {3573, {wxLocale, getSystemLanguage, 0}},
- {3574, {wxLocale, isLoaded, 1}},
- {3575, {wxLocale, isOk, 0}},
- {3576, {wxActivateEvent, getActive, 0}},
- {3578, {wxPopupWindow, new_2, 2}},
- {3579, {wxPopupWindow, new_0, 0}},
- {3581, {wxPopupWindow, destruct, 0}},
- {3582, {wxPopupWindow, create, 2}},
- {3583, {wxPopupWindow, position, 2}},
- {3584, {wxPopupTransientWindow, new_0, 0}},
- {3585, {wxPopupTransientWindow, new_2, 2}},
- {3586, {wxPopupTransientWindow, destruct, 0}},
- {3587, {wxPopupTransientWindow, popup, 1}},
- {3588, {wxPopupTransientWindow, dismiss, 0}},
- {3589, {wxOverlay, new, 0}},
- {3590, {wxOverlay, destruct, 0}},
- {3591, {wxOverlay, reset, 0}},
- {3592, {wxDCOverlay, new_6, 6}},
- {3593, {wxDCOverlay, new_2, 2}},
- {3594, {wxDCOverlay, destruct, 0}},
- {3595, {wxDCOverlay, clear, 0}},
- {3596, {wxDropFilesEvent, getPosition, 0}},
- {3597, {wxDropFilesEvent, getNumberOfFiles, 0}},
- {3598, {wxDropFilesEvent, getFiles, 0}},
+ {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 4713889b0b..af0cee0dcd 100644
--- a/lib/wx/src/gen/wxe_funcs.hrl
+++ b/lib/wx/src/gen/wxe_funcs.hrl
@@ -194,3182 +194,3183 @@
-define(wxWindow_CanSetTransparent, 286).
-define(wxWindow_IsDoubleBuffered, 287).
-define(wxWindow_SetDoubleBuffered, 288).
--define(wxTopLevelWindow_GetIcon, 289).
--define(wxTopLevelWindow_GetIcons, 290).
--define(wxTopLevelWindow_GetTitle, 291).
--define(wxTopLevelWindow_IsActive, 292).
--define(wxTopLevelWindow_Iconize, 293).
--define(wxTopLevelWindow_IsFullScreen, 294).
--define(wxTopLevelWindow_IsIconized, 295).
--define(wxTopLevelWindow_IsMaximized, 296).
--define(wxTopLevelWindow_Maximize, 297).
--define(wxTopLevelWindow_RequestUserAttention, 298).
--define(wxTopLevelWindow_SetIcon, 299).
--define(wxTopLevelWindow_SetIcons, 300).
--define(wxTopLevelWindow_CenterOnScreen, 301).
--define(wxTopLevelWindow_CentreOnScreen, 302).
--define(wxTopLevelWindow_SetShape, 304).
--define(wxTopLevelWindow_SetTitle, 305).
--define(wxTopLevelWindow_ShowFullScreen, 306).
--define(wxFrame_new_4, 308).
--define(wxFrame_new_0, 309).
--define(wxFrame_destruct, 311).
--define(wxFrame_Create, 312).
--define(wxFrame_CreateStatusBar, 313).
--define(wxFrame_CreateToolBar, 314).
--define(wxFrame_GetClientAreaOrigin, 315).
--define(wxFrame_GetMenuBar, 316).
--define(wxFrame_GetStatusBar, 317).
--define(wxFrame_GetStatusBarPane, 318).
--define(wxFrame_GetToolBar, 319).
--define(wxFrame_ProcessCommand, 320).
--define(wxFrame_SendSizeEvent, 321).
--define(wxFrame_SetMenuBar, 322).
--define(wxFrame_SetStatusBar, 323).
--define(wxFrame_SetStatusBarPane, 324).
--define(wxFrame_SetStatusText, 325).
--define(wxFrame_SetStatusWidths, 326).
--define(wxFrame_SetToolBar, 327).
--define(wxMiniFrame_new_0, 328).
--define(wxMiniFrame_new_4, 329).
--define(wxMiniFrame_Create, 330).
--define(wxMiniFrame_destroy, 331).
--define(wxSplashScreen_new_0, 332).
--define(wxSplashScreen_new_6, 333).
--define(wxSplashScreen_destruct, 334).
--define(wxSplashScreen_GetSplashStyle, 335).
--define(wxSplashScreen_GetTimeout, 336).
--define(wxPanel_new_0, 337).
--define(wxPanel_new_6, 338).
--define(wxPanel_new_2, 339).
--define(wxPanel_destruct, 340).
--define(wxPanel_InitDialog, 341).
--define(wxPanel_SetFocusIgnoringChildren, 342).
--define(wxScrolledWindow_new_0, 343).
--define(wxScrolledWindow_new_2, 344).
--define(wxScrolledWindow_destruct, 345).
--define(wxScrolledWindow_CalcScrolledPosition_4, 346).
--define(wxScrolledWindow_CalcScrolledPosition_1, 347).
--define(wxScrolledWindow_CalcUnscrolledPosition_4, 348).
--define(wxScrolledWindow_CalcUnscrolledPosition_1, 349).
--define(wxScrolledWindow_EnableScrolling, 350).
--define(wxScrolledWindow_GetScrollPixelsPerUnit, 351).
--define(wxScrolledWindow_GetViewStart, 352).
--define(wxScrolledWindow_DoPrepareDC, 353).
--define(wxScrolledWindow_PrepareDC, 354).
--define(wxScrolledWindow_Scroll, 355).
--define(wxScrolledWindow_SetScrollbars, 356).
--define(wxScrolledWindow_SetScrollRate, 357).
--define(wxScrolledWindow_SetTargetWindow, 358).
--define(wxSashWindow_new_0, 359).
--define(wxSashWindow_new_2, 360).
--define(wxSashWindow_destruct, 361).
--define(wxSashWindow_GetSashVisible, 362).
--define(wxSashWindow_GetMaximumSizeX, 363).
--define(wxSashWindow_GetMaximumSizeY, 364).
--define(wxSashWindow_GetMinimumSizeX, 365).
--define(wxSashWindow_GetMinimumSizeY, 366).
--define(wxSashWindow_SetMaximumSizeX, 367).
--define(wxSashWindow_SetMaximumSizeY, 368).
--define(wxSashWindow_SetMinimumSizeX, 369).
--define(wxSashWindow_SetMinimumSizeY, 370).
--define(wxSashWindow_SetSashVisible, 371).
--define(wxSashLayoutWindow_new_0, 372).
--define(wxSashLayoutWindow_new_2, 373).
--define(wxSashLayoutWindow_Create, 374).
--define(wxSashLayoutWindow_GetAlignment, 375).
--define(wxSashLayoutWindow_GetOrientation, 376).
--define(wxSashLayoutWindow_SetAlignment, 377).
--define(wxSashLayoutWindow_SetDefaultSize, 378).
--define(wxSashLayoutWindow_SetOrientation, 379).
--define(wxSashLayoutWindow_destroy, 380).
--define(wxGrid_new_0, 381).
--define(wxGrid_new_3, 382).
--define(wxGrid_new_4, 383).
--define(wxGrid_destruct, 384).
--define(wxGrid_AppendCols, 385).
--define(wxGrid_AppendRows, 386).
--define(wxGrid_AutoSize, 387).
--define(wxGrid_AutoSizeColumn, 388).
--define(wxGrid_AutoSizeColumns, 389).
--define(wxGrid_AutoSizeRow, 390).
--define(wxGrid_AutoSizeRows, 391).
--define(wxGrid_BeginBatch, 392).
--define(wxGrid_BlockToDeviceRect, 393).
--define(wxGrid_CanDragColSize, 394).
--define(wxGrid_CanDragRowSize, 395).
--define(wxGrid_CanDragGridSize, 396).
--define(wxGrid_CanEnableCellControl, 397).
--define(wxGrid_CellToRect_2, 398).
--define(wxGrid_CellToRect_1, 399).
--define(wxGrid_ClearGrid, 400).
--define(wxGrid_ClearSelection, 401).
--define(wxGrid_CreateGrid, 402).
--define(wxGrid_DeleteCols, 403).
--define(wxGrid_DeleteRows, 404).
--define(wxGrid_DisableCellEditControl, 405).
--define(wxGrid_DisableDragColSize, 406).
--define(wxGrid_DisableDragGridSize, 407).
--define(wxGrid_DisableDragRowSize, 408).
--define(wxGrid_EnableCellEditControl, 409).
--define(wxGrid_EnableDragColSize, 410).
--define(wxGrid_EnableDragGridSize, 411).
--define(wxGrid_EnableDragRowSize, 412).
--define(wxGrid_EnableEditing, 413).
--define(wxGrid_EnableGridLines, 414).
--define(wxGrid_EndBatch, 415).
--define(wxGrid_Fit, 416).
--define(wxGrid_ForceRefresh, 417).
--define(wxGrid_GetBatchCount, 418).
--define(wxGrid_GetCellAlignment, 419).
--define(wxGrid_GetCellBackgroundColour, 420).
--define(wxGrid_GetCellEditor, 421).
--define(wxGrid_GetCellFont, 422).
--define(wxGrid_GetCellRenderer, 423).
--define(wxGrid_GetCellTextColour, 424).
--define(wxGrid_GetCellValue_2, 425).
--define(wxGrid_GetCellValue_1, 426).
--define(wxGrid_GetColLabelAlignment, 427).
--define(wxGrid_GetColLabelSize, 428).
--define(wxGrid_GetColLabelValue, 429).
--define(wxGrid_GetColMinimalAcceptableWidth, 430).
--define(wxGrid_GetDefaultCellAlignment, 431).
--define(wxGrid_GetDefaultCellBackgroundColour, 432).
--define(wxGrid_GetDefaultCellFont, 433).
--define(wxGrid_GetDefaultCellTextColour, 434).
--define(wxGrid_GetDefaultColLabelSize, 435).
--define(wxGrid_GetDefaultColSize, 436).
--define(wxGrid_GetDefaultEditor, 437).
--define(wxGrid_GetDefaultEditorForCell_2, 438).
--define(wxGrid_GetDefaultEditorForCell_1, 439).
--define(wxGrid_GetDefaultEditorForType, 440).
--define(wxGrid_GetDefaultRenderer, 441).
--define(wxGrid_GetDefaultRendererForCell, 442).
--define(wxGrid_GetDefaultRendererForType, 443).
--define(wxGrid_GetDefaultRowLabelSize, 444).
--define(wxGrid_GetDefaultRowSize, 445).
--define(wxGrid_GetGridCursorCol, 446).
--define(wxGrid_GetGridCursorRow, 447).
--define(wxGrid_GetGridLineColour, 448).
--define(wxGrid_GridLinesEnabled, 449).
--define(wxGrid_GetLabelBackgroundColour, 450).
--define(wxGrid_GetLabelFont, 451).
--define(wxGrid_GetLabelTextColour, 452).
--define(wxGrid_GetNumberCols, 453).
--define(wxGrid_GetNumberRows, 454).
--define(wxGrid_GetOrCreateCellAttr, 455).
--define(wxGrid_GetRowMinimalAcceptableHeight, 456).
--define(wxGrid_GetRowLabelAlignment, 457).
--define(wxGrid_GetRowLabelSize, 458).
--define(wxGrid_GetRowLabelValue, 459).
--define(wxGrid_GetRowSize, 460).
--define(wxGrid_GetScrollLineX, 461).
--define(wxGrid_GetScrollLineY, 462).
--define(wxGrid_GetSelectedCells, 463).
--define(wxGrid_GetSelectedCols, 464).
--define(wxGrid_GetSelectedRows, 465).
--define(wxGrid_GetSelectionBackground, 466).
--define(wxGrid_GetSelectionBlockTopLeft, 467).
--define(wxGrid_GetSelectionBlockBottomRight, 468).
--define(wxGrid_GetSelectionForeground, 469).
--define(wxGrid_GetViewWidth, 470).
--define(wxGrid_GetGridWindow, 471).
--define(wxGrid_GetGridRowLabelWindow, 472).
--define(wxGrid_GetGridColLabelWindow, 473).
--define(wxGrid_GetGridCornerLabelWindow, 474).
--define(wxGrid_HideCellEditControl, 475).
--define(wxGrid_InsertCols, 476).
--define(wxGrid_InsertRows, 477).
--define(wxGrid_IsCellEditControlEnabled, 478).
--define(wxGrid_IsCurrentCellReadOnly, 479).
--define(wxGrid_IsEditable, 480).
--define(wxGrid_IsInSelection_2, 481).
--define(wxGrid_IsInSelection_1, 482).
--define(wxGrid_IsReadOnly, 483).
--define(wxGrid_IsSelection, 484).
--define(wxGrid_IsVisible_3, 485).
--define(wxGrid_IsVisible_2, 486).
--define(wxGrid_MakeCellVisible_2, 487).
--define(wxGrid_MakeCellVisible_1, 488).
--define(wxGrid_MoveCursorDown, 489).
--define(wxGrid_MoveCursorLeft, 490).
--define(wxGrid_MoveCursorRight, 491).
--define(wxGrid_MoveCursorUp, 492).
--define(wxGrid_MoveCursorDownBlock, 493).
--define(wxGrid_MoveCursorLeftBlock, 494).
--define(wxGrid_MoveCursorRightBlock, 495).
--define(wxGrid_MoveCursorUpBlock, 496).
--define(wxGrid_MovePageDown, 497).
--define(wxGrid_MovePageUp, 498).
--define(wxGrid_RegisterDataType, 499).
--define(wxGrid_SaveEditControlValue, 500).
--define(wxGrid_SelectAll, 501).
--define(wxGrid_SelectBlock_5, 502).
--define(wxGrid_SelectBlock_3, 503).
--define(wxGrid_SelectCol, 504).
--define(wxGrid_SelectRow, 505).
--define(wxGrid_SetCellAlignment_4, 506).
--define(wxGrid_SetCellAlignment_3, 507).
--define(wxGrid_SetCellAlignment_1, 508).
--define(wxGrid_SetCellBackgroundColour_3_0, 509).
--define(wxGrid_SetCellBackgroundColour_1, 510).
--define(wxGrid_SetCellBackgroundColour_3_1, 511).
--define(wxGrid_SetCellEditor, 512).
--define(wxGrid_SetCellFont, 513).
--define(wxGrid_SetCellRenderer, 514).
--define(wxGrid_SetCellTextColour_3_0, 515).
--define(wxGrid_SetCellTextColour_3_1, 516).
--define(wxGrid_SetCellTextColour_1, 517).
--define(wxGrid_SetCellValue_3_0, 518).
--define(wxGrid_SetCellValue_2, 519).
--define(wxGrid_SetCellValue_3_1, 520).
--define(wxGrid_SetColAttr, 521).
--define(wxGrid_SetColFormatBool, 522).
--define(wxGrid_SetColFormatNumber, 523).
--define(wxGrid_SetColFormatFloat, 524).
--define(wxGrid_SetColFormatCustom, 525).
--define(wxGrid_SetColLabelAlignment, 526).
--define(wxGrid_SetColLabelSize, 527).
--define(wxGrid_SetColLabelValue, 528).
--define(wxGrid_SetColMinimalWidth, 529).
--define(wxGrid_SetColMinimalAcceptableWidth, 530).
--define(wxGrid_SetColSize, 531).
--define(wxGrid_SetDefaultCellAlignment, 532).
--define(wxGrid_SetDefaultCellBackgroundColour, 533).
--define(wxGrid_SetDefaultCellFont, 534).
--define(wxGrid_SetDefaultCellTextColour, 535).
--define(wxGrid_SetDefaultEditor, 536).
--define(wxGrid_SetDefaultRenderer, 537).
--define(wxGrid_SetDefaultColSize, 538).
--define(wxGrid_SetDefaultRowSize, 539).
--define(wxGrid_SetGridCursor, 540).
--define(wxGrid_SetGridLineColour, 541).
--define(wxGrid_SetLabelBackgroundColour, 542).
--define(wxGrid_SetLabelFont, 543).
--define(wxGrid_SetLabelTextColour, 544).
--define(wxGrid_SetMargins, 545).
--define(wxGrid_SetReadOnly, 546).
--define(wxGrid_SetRowAttr, 547).
--define(wxGrid_SetRowLabelAlignment, 548).
--define(wxGrid_SetRowLabelSize, 549).
--define(wxGrid_SetRowLabelValue, 550).
--define(wxGrid_SetRowMinimalHeight, 551).
--define(wxGrid_SetRowMinimalAcceptableHeight, 552).
--define(wxGrid_SetRowSize, 553).
--define(wxGrid_SetScrollLineX, 554).
--define(wxGrid_SetScrollLineY, 555).
--define(wxGrid_SetSelectionBackground, 556).
--define(wxGrid_SetSelectionForeground, 557).
--define(wxGrid_SetSelectionMode, 558).
--define(wxGrid_ShowCellEditControl, 559).
--define(wxGrid_XToCol, 560).
--define(wxGrid_XToEdgeOfCol, 561).
--define(wxGrid_YToEdgeOfRow, 562).
--define(wxGrid_YToRow, 563).
--define(wxGridCellRenderer_Draw, 564).
--define(wxGridCellRenderer_GetBestSize, 565).
--define(wxGridCellEditor_Create, 566).
--define(wxGridCellEditor_IsCreated, 567).
--define(wxGridCellEditor_SetSize, 568).
--define(wxGridCellEditor_Show, 569).
--define(wxGridCellEditor_PaintBackground, 570).
--define(wxGridCellEditor_BeginEdit, 571).
--define(wxGridCellEditor_EndEdit, 572).
--define(wxGridCellEditor_Reset, 573).
--define(wxGridCellEditor_StartingKey, 574).
--define(wxGridCellEditor_StartingClick, 575).
--define(wxGridCellEditor_HandleReturn, 576).
--define(wxGridCellBoolRenderer_new, 577).
--define(wxGridCellBoolRenderer_destroy, 578).
--define(wxGridCellBoolEditor_new, 579).
--define(wxGridCellBoolEditor_IsTrueValue, 580).
--define(wxGridCellBoolEditor_UseStringValues, 581).
--define(wxGridCellBoolEditor_destroy, 582).
--define(wxGridCellFloatRenderer_new, 583).
--define(wxGridCellFloatRenderer_GetPrecision, 584).
--define(wxGridCellFloatRenderer_GetWidth, 585).
--define(wxGridCellFloatRenderer_SetParameters, 586).
--define(wxGridCellFloatRenderer_SetPrecision, 587).
--define(wxGridCellFloatRenderer_SetWidth, 588).
--define(wxGridCellFloatRenderer_destroy, 589).
--define(wxGridCellFloatEditor_new, 590).
--define(wxGridCellFloatEditor_SetParameters, 591).
--define(wxGridCellFloatEditor_destroy, 592).
--define(wxGridCellStringRenderer_new, 593).
--define(wxGridCellStringRenderer_destroy, 594).
--define(wxGridCellTextEditor_new, 595).
--define(wxGridCellTextEditor_SetParameters, 596).
--define(wxGridCellTextEditor_destroy, 597).
--define(wxGridCellChoiceEditor_new, 599).
--define(wxGridCellChoiceEditor_SetParameters, 600).
--define(wxGridCellChoiceEditor_destroy, 601).
--define(wxGridCellNumberRenderer_new, 602).
--define(wxGridCellNumberRenderer_destroy, 603).
--define(wxGridCellNumberEditor_new, 604).
--define(wxGridCellNumberEditor_GetValue, 605).
--define(wxGridCellNumberEditor_SetParameters, 606).
--define(wxGridCellNumberEditor_destroy, 607).
--define(wxGridCellAttr_SetTextColour, 608).
--define(wxGridCellAttr_SetBackgroundColour, 609).
--define(wxGridCellAttr_SetFont, 610).
--define(wxGridCellAttr_SetAlignment, 611).
--define(wxGridCellAttr_SetReadOnly, 612).
--define(wxGridCellAttr_SetRenderer, 613).
--define(wxGridCellAttr_SetEditor, 614).
--define(wxGridCellAttr_HasTextColour, 615).
--define(wxGridCellAttr_HasBackgroundColour, 616).
--define(wxGridCellAttr_HasFont, 617).
--define(wxGridCellAttr_HasAlignment, 618).
--define(wxGridCellAttr_HasRenderer, 619).
--define(wxGridCellAttr_HasEditor, 620).
--define(wxGridCellAttr_GetTextColour, 621).
--define(wxGridCellAttr_GetBackgroundColour, 622).
--define(wxGridCellAttr_GetFont, 623).
--define(wxGridCellAttr_GetAlignment, 624).
--define(wxGridCellAttr_GetRenderer, 625).
--define(wxGridCellAttr_GetEditor, 626).
--define(wxGridCellAttr_IsReadOnly, 627).
--define(wxGridCellAttr_SetDefAttr, 628).
--define(wxDC_Blit, 629).
--define(wxDC_CalcBoundingBox, 630).
--define(wxDC_Clear, 631).
--define(wxDC_ComputeScaleAndOrigin, 632).
--define(wxDC_CrossHair, 633).
--define(wxDC_DestroyClippingRegion, 634).
--define(wxDC_DeviceToLogicalX, 635).
--define(wxDC_DeviceToLogicalXRel, 636).
--define(wxDC_DeviceToLogicalY, 637).
--define(wxDC_DeviceToLogicalYRel, 638).
--define(wxDC_DrawArc, 639).
--define(wxDC_DrawBitmap, 640).
--define(wxDC_DrawCheckMark, 641).
--define(wxDC_DrawCircle, 642).
--define(wxDC_DrawEllipse_2, 644).
--define(wxDC_DrawEllipse_1, 645).
--define(wxDC_DrawEllipticArc, 646).
--define(wxDC_DrawIcon, 647).
--define(wxDC_DrawLabel, 648).
--define(wxDC_DrawLine, 649).
--define(wxDC_DrawLines, 650).
--define(wxDC_DrawPolygon, 652).
--define(wxDC_DrawPoint, 654).
--define(wxDC_DrawRectangle_2, 656).
--define(wxDC_DrawRectangle_1, 657).
--define(wxDC_DrawRotatedText, 658).
--define(wxDC_DrawRoundedRectangle_3, 660).
--define(wxDC_DrawRoundedRectangle_2, 661).
--define(wxDC_DrawText, 662).
--define(wxDC_EndDoc, 663).
--define(wxDC_EndPage, 664).
--define(wxDC_FloodFill, 665).
--define(wxDC_GetBackground, 666).
--define(wxDC_GetBackgroundMode, 667).
--define(wxDC_GetBrush, 668).
--define(wxDC_GetCharHeight, 669).
--define(wxDC_GetCharWidth, 670).
--define(wxDC_GetClippingBox, 671).
--define(wxDC_GetFont, 673).
--define(wxDC_GetLayoutDirection, 674).
--define(wxDC_GetLogicalFunction, 675).
--define(wxDC_GetMapMode, 676).
--define(wxDC_GetMultiLineTextExtent_4, 677).
--define(wxDC_GetMultiLineTextExtent_1, 678).
--define(wxDC_GetPartialTextExtents, 679).
--define(wxDC_GetPen, 680).
--define(wxDC_GetPixel, 681).
--define(wxDC_GetPPI, 682).
--define(wxDC_GetSize, 684).
--define(wxDC_GetSizeMM, 686).
--define(wxDC_GetTextBackground, 687).
--define(wxDC_GetTextExtent_4, 688).
--define(wxDC_GetTextExtent_1, 689).
--define(wxDC_GetTextForeground, 691).
--define(wxDC_GetUserScale, 692).
--define(wxDC_GradientFillConcentric_3, 693).
--define(wxDC_GradientFillConcentric_4, 694).
--define(wxDC_GradientFillLinear, 695).
--define(wxDC_LogicalToDeviceX, 696).
--define(wxDC_LogicalToDeviceXRel, 697).
--define(wxDC_LogicalToDeviceY, 698).
--define(wxDC_LogicalToDeviceYRel, 699).
--define(wxDC_MaxX, 700).
--define(wxDC_MaxY, 701).
--define(wxDC_MinX, 702).
--define(wxDC_MinY, 703).
--define(wxDC_IsOk, 704).
--define(wxDC_ResetBoundingBox, 705).
--define(wxDC_SetAxisOrientation, 706).
--define(wxDC_SetBackground, 707).
--define(wxDC_SetBackgroundMode, 708).
--define(wxDC_SetBrush, 709).
--define(wxDC_SetClippingRegion_2, 711).
--define(wxDC_SetClippingRegion_1_1, 712).
--define(wxDC_SetClippingRegion_1_0, 713).
--define(wxDC_SetDeviceOrigin, 714).
--define(wxDC_SetFont, 715).
--define(wxDC_SetLayoutDirection, 716).
--define(wxDC_SetLogicalFunction, 717).
--define(wxDC_SetMapMode, 718).
--define(wxDC_SetPalette, 719).
--define(wxDC_SetPen, 720).
--define(wxDC_SetTextBackground, 721).
--define(wxDC_SetTextForeground, 722).
--define(wxDC_SetUserScale, 723).
--define(wxDC_StartDoc, 724).
--define(wxDC_StartPage, 725).
--define(wxMirrorDC_new, 726).
--define(wxMirrorDC_destroy, 727).
--define(wxScreenDC_new, 728).
--define(wxScreenDC_destruct, 729).
--define(wxPostScriptDC_new_0, 730).
--define(wxPostScriptDC_new_1, 731).
--define(wxPostScriptDC_destruct, 732).
--define(wxPostScriptDC_SetResolution, 733).
--define(wxPostScriptDC_GetResolution, 734).
--define(wxWindowDC_new_0, 735).
--define(wxWindowDC_new_1, 736).
--define(wxWindowDC_destruct, 737).
--define(wxClientDC_new_0, 738).
--define(wxClientDC_new_1, 739).
--define(wxClientDC_destroy, 740).
--define(wxPaintDC_new_0, 741).
--define(wxPaintDC_new_1, 742).
--define(wxPaintDC_destroy, 743).
--define(wxMemoryDC_new_1_0, 745).
--define(wxMemoryDC_new_1_1, 746).
--define(wxMemoryDC_new_0, 747).
--define(wxMemoryDC_destruct, 749).
--define(wxMemoryDC_SelectObject, 750).
--define(wxMemoryDC_SelectObjectAsSource, 751).
--define(wxBufferedDC_new_0, 752).
--define(wxBufferedDC_new_2, 753).
--define(wxBufferedDC_new_3, 754).
--define(wxBufferedDC_destruct, 755).
--define(wxBufferedDC_Init_2, 756).
--define(wxBufferedDC_Init_3, 757).
--define(wxBufferedPaintDC_new_3, 758).
--define(wxBufferedPaintDC_new_2, 759).
--define(wxBufferedPaintDC_destruct, 760).
--define(wxGraphicsObject_destruct, 761).
--define(wxGraphicsObject_GetRenderer, 762).
--define(wxGraphicsObject_IsNull, 763).
--define(wxGraphicsContext_destruct, 764).
--define(wxGraphicsContext_Create_1_1, 765).
--define(wxGraphicsContext_Create_1_0, 766).
--define(wxGraphicsContext_Create_0, 767).
--define(wxGraphicsContext_CreatePen, 768).
--define(wxGraphicsContext_CreateBrush, 769).
--define(wxGraphicsContext_CreateRadialGradientBrush, 770).
--define(wxGraphicsContext_CreateLinearGradientBrush, 771).
--define(wxGraphicsContext_CreateFont, 772).
--define(wxGraphicsContext_CreateMatrix, 773).
--define(wxGraphicsContext_CreatePath, 774).
--define(wxGraphicsContext_Clip_1, 775).
--define(wxGraphicsContext_Clip_4, 776).
--define(wxGraphicsContext_ResetClip, 777).
--define(wxGraphicsContext_DrawBitmap, 778).
--define(wxGraphicsContext_DrawEllipse, 779).
--define(wxGraphicsContext_DrawIcon, 780).
--define(wxGraphicsContext_DrawLines, 781).
--define(wxGraphicsContext_DrawPath, 782).
--define(wxGraphicsContext_DrawRectangle, 783).
--define(wxGraphicsContext_DrawRoundedRectangle, 784).
--define(wxGraphicsContext_DrawText_3, 785).
--define(wxGraphicsContext_DrawText_4_0, 786).
--define(wxGraphicsContext_DrawText_4_1, 787).
--define(wxGraphicsContext_DrawText_5, 788).
--define(wxGraphicsContext_FillPath, 789).
--define(wxGraphicsContext_StrokePath, 790).
--define(wxGraphicsContext_GetPartialTextExtents, 791).
--define(wxGraphicsContext_GetTextExtent, 792).
--define(wxGraphicsContext_Rotate, 793).
--define(wxGraphicsContext_Scale, 794).
--define(wxGraphicsContext_Translate, 795).
--define(wxGraphicsContext_GetTransform, 796).
--define(wxGraphicsContext_SetTransform, 797).
--define(wxGraphicsContext_ConcatTransform, 798).
--define(wxGraphicsContext_SetBrush_1_1, 799).
--define(wxGraphicsContext_SetBrush_1_0, 800).
--define(wxGraphicsContext_SetFont_1, 801).
--define(wxGraphicsContext_SetFont_2, 802).
--define(wxGraphicsContext_SetPen_1_0, 803).
--define(wxGraphicsContext_SetPen_1_1, 804).
--define(wxGraphicsContext_StrokeLine, 805).
--define(wxGraphicsContext_StrokeLines, 806).
--define(wxGraphicsMatrix_Concat, 808).
--define(wxGraphicsMatrix_Get, 810).
--define(wxGraphicsMatrix_Invert, 811).
--define(wxGraphicsMatrix_IsEqual, 812).
--define(wxGraphicsMatrix_IsIdentity, 814).
--define(wxGraphicsMatrix_Rotate, 815).
--define(wxGraphicsMatrix_Scale, 816).
--define(wxGraphicsMatrix_Translate, 817).
--define(wxGraphicsMatrix_Set, 818).
--define(wxGraphicsMatrix_TransformPoint, 819).
--define(wxGraphicsMatrix_TransformDistance, 820).
--define(wxGraphicsPath_MoveToPoint_2, 821).
--define(wxGraphicsPath_MoveToPoint_1, 822).
--define(wxGraphicsPath_AddArc_6, 823).
--define(wxGraphicsPath_AddArc_5, 824).
--define(wxGraphicsPath_AddArcToPoint, 825).
--define(wxGraphicsPath_AddCircle, 826).
--define(wxGraphicsPath_AddCurveToPoint_6, 827).
--define(wxGraphicsPath_AddCurveToPoint_3, 828).
--define(wxGraphicsPath_AddEllipse, 829).
--define(wxGraphicsPath_AddLineToPoint_2, 830).
--define(wxGraphicsPath_AddLineToPoint_1, 831).
--define(wxGraphicsPath_AddPath, 832).
--define(wxGraphicsPath_AddQuadCurveToPoint, 833).
--define(wxGraphicsPath_AddRectangle, 834).
--define(wxGraphicsPath_AddRoundedRectangle, 835).
--define(wxGraphicsPath_CloseSubpath, 836).
--define(wxGraphicsPath_Contains_3, 837).
--define(wxGraphicsPath_Contains_2, 838).
--define(wxGraphicsPath_GetBox, 840).
--define(wxGraphicsPath_GetCurrentPoint, 842).
--define(wxGraphicsPath_Transform, 843).
--define(wxGraphicsRenderer_GetDefaultRenderer, 844).
--define(wxGraphicsRenderer_CreateContext_1_1, 845).
--define(wxGraphicsRenderer_CreateContext_1_0, 846).
--define(wxGraphicsRenderer_CreatePen, 847).
--define(wxGraphicsRenderer_CreateBrush, 848).
--define(wxGraphicsRenderer_CreateLinearGradientBrush, 849).
--define(wxGraphicsRenderer_CreateRadialGradientBrush, 850).
--define(wxGraphicsRenderer_CreateFont, 851).
--define(wxGraphicsRenderer_CreateMatrix, 852).
--define(wxGraphicsRenderer_CreatePath, 853).
--define(wxMenuBar_new_1, 855).
--define(wxMenuBar_new_0, 857).
--define(wxMenuBar_destruct, 859).
--define(wxMenuBar_Append, 860).
--define(wxMenuBar_Check, 861).
--define(wxMenuBar_Enable_2, 862).
--define(wxMenuBar_Enable_1, 863).
--define(wxMenuBar_EnableTop, 864).
--define(wxMenuBar_FindMenu, 865).
--define(wxMenuBar_FindMenuItem, 866).
--define(wxMenuBar_FindItem, 867).
--define(wxMenuBar_GetHelpString, 868).
--define(wxMenuBar_GetLabel_1, 869).
--define(wxMenuBar_GetLabel_0, 870).
--define(wxMenuBar_GetLabelTop, 871).
--define(wxMenuBar_GetMenu, 872).
--define(wxMenuBar_GetMenuCount, 873).
--define(wxMenuBar_Insert, 874).
--define(wxMenuBar_IsChecked, 875).
--define(wxMenuBar_IsEnabled_1, 876).
--define(wxMenuBar_IsEnabled_0, 877).
--define(wxMenuBar_Remove, 878).
--define(wxMenuBar_Replace, 879).
--define(wxMenuBar_SetHelpString, 880).
--define(wxMenuBar_SetLabel_2, 881).
--define(wxMenuBar_SetLabel_1, 882).
--define(wxMenuBar_SetLabelTop, 883).
--define(wxControl_GetLabel, 884).
--define(wxControl_SetLabel, 885).
--define(wxControlWithItems_Append_1, 886).
--define(wxControlWithItems_Append_2, 887).
--define(wxControlWithItems_appendStrings_1, 888).
--define(wxControlWithItems_Clear, 889).
--define(wxControlWithItems_Delete, 890).
--define(wxControlWithItems_FindString, 891).
--define(wxControlWithItems_getClientData, 892).
--define(wxControlWithItems_setClientData, 893).
--define(wxControlWithItems_GetCount, 894).
--define(wxControlWithItems_GetSelection, 895).
--define(wxControlWithItems_GetString, 896).
--define(wxControlWithItems_GetStringSelection, 897).
--define(wxControlWithItems_Insert_2, 898).
--define(wxControlWithItems_Insert_3, 899).
--define(wxControlWithItems_IsEmpty, 900).
--define(wxControlWithItems_Select, 901).
--define(wxControlWithItems_SetSelection, 902).
--define(wxControlWithItems_SetString, 903).
--define(wxControlWithItems_SetStringSelection, 904).
--define(wxMenu_new_2, 907).
--define(wxMenu_new_1, 908).
--define(wxMenu_destruct, 910).
--define(wxMenu_Append_3, 911).
--define(wxMenu_Append_1, 912).
--define(wxMenu_Append_4_0, 913).
--define(wxMenu_Append_4_1, 914).
--define(wxMenu_AppendCheckItem, 915).
--define(wxMenu_AppendRadioItem, 916).
--define(wxMenu_AppendSeparator, 917).
--define(wxMenu_Break, 918).
--define(wxMenu_Check, 919).
--define(wxMenu_Delete_1_0, 920).
--define(wxMenu_Delete_1_1, 921).
--define(wxMenu_Destroy_1_0, 922).
--define(wxMenu_Destroy_1_1, 923).
--define(wxMenu_Enable, 924).
--define(wxMenu_FindItem_1, 925).
--define(wxMenu_FindItem_2, 926).
--define(wxMenu_FindItemByPosition, 927).
--define(wxMenu_GetHelpString, 928).
--define(wxMenu_GetLabel, 929).
--define(wxMenu_GetMenuItemCount, 930).
--define(wxMenu_GetMenuItems, 931).
--define(wxMenu_GetTitle, 933).
--define(wxMenu_Insert_2, 934).
--define(wxMenu_Insert_3, 935).
--define(wxMenu_Insert_5_1, 936).
--define(wxMenu_Insert_5_0, 937).
--define(wxMenu_InsertCheckItem, 938).
--define(wxMenu_InsertRadioItem, 939).
--define(wxMenu_InsertSeparator, 940).
--define(wxMenu_IsChecked, 941).
--define(wxMenu_IsEnabled, 942).
--define(wxMenu_Prepend_1, 943).
--define(wxMenu_Prepend_2, 944).
--define(wxMenu_Prepend_4_1, 945).
--define(wxMenu_Prepend_4_0, 946).
--define(wxMenu_PrependCheckItem, 947).
--define(wxMenu_PrependRadioItem, 948).
--define(wxMenu_PrependSeparator, 949).
--define(wxMenu_Remove_1_0, 950).
--define(wxMenu_Remove_1_1, 951).
--define(wxMenu_SetHelpString, 952).
--define(wxMenu_SetLabel, 953).
--define(wxMenu_SetTitle, 954).
--define(wxMenuItem_new, 955).
--define(wxMenuItem_destruct, 957).
--define(wxMenuItem_Check, 958).
--define(wxMenuItem_Enable, 959).
--define(wxMenuItem_GetBitmap, 960).
--define(wxMenuItem_GetHelp, 961).
--define(wxMenuItem_GetId, 962).
--define(wxMenuItem_GetKind, 963).
--define(wxMenuItem_GetLabel, 964).
--define(wxMenuItem_GetLabelFromText, 965).
--define(wxMenuItem_GetMenu, 966).
--define(wxMenuItem_GetText, 967).
--define(wxMenuItem_GetSubMenu, 968).
--define(wxMenuItem_IsCheckable, 969).
--define(wxMenuItem_IsChecked, 970).
--define(wxMenuItem_IsEnabled, 971).
--define(wxMenuItem_IsSeparator, 972).
--define(wxMenuItem_IsSubMenu, 973).
--define(wxMenuItem_SetBitmap, 974).
--define(wxMenuItem_SetHelp, 975).
--define(wxMenuItem_SetMenu, 976).
--define(wxMenuItem_SetSubMenu, 977).
--define(wxMenuItem_SetText, 978).
--define(wxToolBar_AddControl, 979).
--define(wxToolBar_AddSeparator, 980).
--define(wxToolBar_AddTool_5, 981).
--define(wxToolBar_AddTool_4_0, 982).
--define(wxToolBar_AddTool_1, 983).
--define(wxToolBar_AddTool_4_1, 984).
--define(wxToolBar_AddTool_3, 985).
--define(wxToolBar_AddTool_6, 986).
--define(wxToolBar_AddCheckTool, 987).
--define(wxToolBar_AddRadioTool, 988).
--define(wxToolBar_AddStretchableSpace, 989).
--define(wxToolBar_InsertStretchableSpace, 990).
--define(wxToolBar_DeleteTool, 991).
--define(wxToolBar_DeleteToolByPos, 992).
--define(wxToolBar_EnableTool, 993).
--define(wxToolBar_FindById, 994).
--define(wxToolBar_FindControl, 995).
--define(wxToolBar_FindToolForPosition, 996).
--define(wxToolBar_GetToolSize, 997).
--define(wxToolBar_GetToolBitmapSize, 998).
--define(wxToolBar_GetMargins, 999).
--define(wxToolBar_GetToolEnabled, 1000).
--define(wxToolBar_GetToolLongHelp, 1001).
--define(wxToolBar_GetToolPacking, 1002).
--define(wxToolBar_GetToolPos, 1003).
--define(wxToolBar_GetToolSeparation, 1004).
--define(wxToolBar_GetToolShortHelp, 1005).
--define(wxToolBar_GetToolState, 1006).
--define(wxToolBar_InsertControl, 1007).
--define(wxToolBar_InsertSeparator, 1008).
--define(wxToolBar_InsertTool_5, 1009).
--define(wxToolBar_InsertTool_2, 1010).
--define(wxToolBar_InsertTool_4, 1011).
--define(wxToolBar_Realize, 1012).
--define(wxToolBar_RemoveTool, 1013).
--define(wxToolBar_SetMargins, 1014).
--define(wxToolBar_SetToolBitmapSize, 1015).
--define(wxToolBar_SetToolLongHelp, 1016).
--define(wxToolBar_SetToolPacking, 1017).
--define(wxToolBar_SetToolShortHelp, 1018).
--define(wxToolBar_SetToolSeparation, 1019).
--define(wxToolBar_ToggleTool, 1020).
--define(wxStatusBar_new_0, 1022).
--define(wxStatusBar_new_2, 1023).
--define(wxStatusBar_destruct, 1025).
--define(wxStatusBar_Create, 1026).
--define(wxStatusBar_GetFieldRect, 1027).
--define(wxStatusBar_GetFieldsCount, 1028).
--define(wxStatusBar_GetStatusText, 1029).
--define(wxStatusBar_PopStatusText, 1030).
--define(wxStatusBar_PushStatusText, 1031).
--define(wxStatusBar_SetFieldsCount, 1032).
--define(wxStatusBar_SetMinHeight, 1033).
--define(wxStatusBar_SetStatusText, 1034).
--define(wxStatusBar_SetStatusWidths, 1035).
--define(wxStatusBar_SetStatusStyles, 1036).
--define(wxBitmap_new_0, 1037).
--define(wxBitmap_new_3, 1038).
--define(wxBitmap_new_4, 1039).
--define(wxBitmap_new_2_0, 1040).
--define(wxBitmap_new_2_1, 1041).
--define(wxBitmap_destruct, 1042).
--define(wxBitmap_ConvertToImage, 1043).
--define(wxBitmap_CopyFromIcon, 1044).
--define(wxBitmap_Create, 1045).
--define(wxBitmap_GetDepth, 1046).
--define(wxBitmap_GetHeight, 1047).
--define(wxBitmap_GetPalette, 1048).
--define(wxBitmap_GetMask, 1049).
--define(wxBitmap_GetWidth, 1050).
--define(wxBitmap_GetSubBitmap, 1051).
--define(wxBitmap_LoadFile, 1052).
--define(wxBitmap_Ok, 1053).
--define(wxBitmap_SaveFile, 1054).
--define(wxBitmap_SetDepth, 1055).
--define(wxBitmap_SetHeight, 1056).
--define(wxBitmap_SetMask, 1057).
--define(wxBitmap_SetPalette, 1058).
--define(wxBitmap_SetWidth, 1059).
--define(wxIcon_new_0, 1060).
--define(wxIcon_new_2, 1061).
--define(wxIcon_new_1, 1062).
--define(wxIcon_CopyFromBitmap, 1063).
--define(wxIcon_destroy, 1064).
--define(wxIconBundle_new_0, 1065).
--define(wxIconBundle_new_2, 1066).
--define(wxIconBundle_new_1_0, 1067).
--define(wxIconBundle_new_1_1, 1068).
--define(wxIconBundle_destruct, 1069).
--define(wxIconBundle_AddIcon_2, 1070).
--define(wxIconBundle_AddIcon_1, 1071).
--define(wxIconBundle_GetIcon_1_1, 1072).
--define(wxIconBundle_GetIcon_1_0, 1073).
--define(wxCursor_new_0, 1074).
--define(wxCursor_new_1_0, 1075).
--define(wxCursor_new_1_1, 1076).
--define(wxCursor_new_4, 1077).
--define(wxCursor_destruct, 1078).
--define(wxCursor_Ok, 1079).
--define(wxMask_new_0, 1080).
--define(wxMask_new_2_1, 1081).
--define(wxMask_new_2_0, 1082).
--define(wxMask_new_1, 1083).
--define(wxMask_destruct, 1084).
--define(wxMask_Create_2_1, 1085).
--define(wxMask_Create_2_0, 1086).
--define(wxMask_Create_1, 1087).
--define(wxImage_new_0, 1088).
--define(wxImage_new_3_0, 1089).
--define(wxImage_new_4, 1090).
--define(wxImage_new_5, 1091).
--define(wxImage_new_2, 1092).
--define(wxImage_new_3_1, 1093).
--define(wxImage_Blur, 1094).
--define(wxImage_BlurHorizontal, 1095).
--define(wxImage_BlurVertical, 1096).
--define(wxImage_ConvertAlphaToMask, 1097).
--define(wxImage_ConvertToGreyscale, 1098).
--define(wxImage_ConvertToMono, 1099).
--define(wxImage_Copy, 1100).
--define(wxImage_Create_3, 1101).
--define(wxImage_Create_4, 1102).
--define(wxImage_Create_5, 1103).
--define(wxImage_Destroy, 1104).
--define(wxImage_FindFirstUnusedColour, 1105).
--define(wxImage_GetImageExtWildcard, 1106).
--define(wxImage_GetAlpha_2, 1107).
--define(wxImage_GetAlpha_0, 1108).
--define(wxImage_GetBlue, 1109).
--define(wxImage_GetData, 1110).
--define(wxImage_GetGreen, 1111).
--define(wxImage_GetImageCount, 1112).
--define(wxImage_GetHeight, 1113).
--define(wxImage_GetMaskBlue, 1114).
--define(wxImage_GetMaskGreen, 1115).
--define(wxImage_GetMaskRed, 1116).
--define(wxImage_GetOrFindMaskColour, 1117).
--define(wxImage_GetPalette, 1118).
--define(wxImage_GetRed, 1119).
--define(wxImage_GetSubImage, 1120).
--define(wxImage_GetWidth, 1121).
--define(wxImage_HasAlpha, 1122).
--define(wxImage_HasMask, 1123).
--define(wxImage_GetOption, 1124).
--define(wxImage_GetOptionInt, 1125).
--define(wxImage_HasOption, 1126).
--define(wxImage_InitAlpha, 1127).
--define(wxImage_InitStandardHandlers, 1128).
--define(wxImage_IsTransparent, 1129).
--define(wxImage_LoadFile_2, 1130).
--define(wxImage_LoadFile_3, 1131).
--define(wxImage_Ok, 1132).
--define(wxImage_RemoveHandler, 1133).
--define(wxImage_Mirror, 1134).
--define(wxImage_Replace, 1135).
--define(wxImage_Rescale, 1136).
--define(wxImage_Resize, 1137).
--define(wxImage_Rotate, 1138).
--define(wxImage_RotateHue, 1139).
--define(wxImage_Rotate90, 1140).
--define(wxImage_SaveFile_1, 1141).
--define(wxImage_SaveFile_2_0, 1142).
--define(wxImage_SaveFile_2_1, 1143).
--define(wxImage_Scale, 1144).
--define(wxImage_Size, 1145).
--define(wxImage_SetAlpha_3, 1146).
--define(wxImage_SetAlpha_2, 1147).
--define(wxImage_SetData_2, 1148).
--define(wxImage_SetData_4, 1149).
--define(wxImage_SetMask, 1150).
--define(wxImage_SetMaskColour, 1151).
--define(wxImage_SetMaskFromImage, 1152).
--define(wxImage_SetOption_2_1, 1153).
--define(wxImage_SetOption_2_0, 1154).
--define(wxImage_SetPalette, 1155).
--define(wxImage_SetRGB_5, 1156).
--define(wxImage_SetRGB_4, 1157).
--define(wxImage_destroy, 1158).
--define(wxBrush_new_0, 1159).
--define(wxBrush_new_2, 1160).
--define(wxBrush_new_1, 1161).
--define(wxBrush_destruct, 1163).
--define(wxBrush_GetColour, 1164).
--define(wxBrush_GetStipple, 1165).
--define(wxBrush_GetStyle, 1166).
--define(wxBrush_IsHatch, 1167).
--define(wxBrush_IsOk, 1168).
--define(wxBrush_SetColour_1, 1169).
--define(wxBrush_SetColour_3, 1170).
--define(wxBrush_SetStipple, 1171).
--define(wxBrush_SetStyle, 1172).
--define(wxPen_new_0, 1173).
--define(wxPen_new_2, 1174).
--define(wxPen_destruct, 1175).
--define(wxPen_GetCap, 1176).
--define(wxPen_GetColour, 1177).
--define(wxPen_GetJoin, 1178).
--define(wxPen_GetStyle, 1179).
--define(wxPen_GetWidth, 1180).
--define(wxPen_IsOk, 1181).
--define(wxPen_SetCap, 1182).
--define(wxPen_SetColour_1, 1183).
--define(wxPen_SetColour_3, 1184).
--define(wxPen_SetJoin, 1185).
--define(wxPen_SetStyle, 1186).
--define(wxPen_SetWidth, 1187).
--define(wxRegion_new_0, 1188).
--define(wxRegion_new_4, 1189).
--define(wxRegion_new_2, 1190).
--define(wxRegion_new_1_1, 1191).
--define(wxRegion_new_1_0, 1193).
--define(wxRegion_destruct, 1195).
--define(wxRegion_Clear, 1196).
--define(wxRegion_Contains_2, 1197).
--define(wxRegion_Contains_1_0, 1198).
--define(wxRegion_Contains_4, 1199).
--define(wxRegion_Contains_1_1, 1200).
--define(wxRegion_ConvertToBitmap, 1201).
--define(wxRegion_GetBox, 1202).
--define(wxRegion_Intersect_4, 1203).
--define(wxRegion_Intersect_1_1, 1204).
--define(wxRegion_Intersect_1_0, 1205).
--define(wxRegion_IsEmpty, 1206).
--define(wxRegion_Subtract_4, 1207).
--define(wxRegion_Subtract_1_1, 1208).
--define(wxRegion_Subtract_1_0, 1209).
--define(wxRegion_Offset_2, 1210).
--define(wxRegion_Offset_1, 1211).
--define(wxRegion_Union_4, 1212).
--define(wxRegion_Union_1_2, 1213).
--define(wxRegion_Union_1_1, 1214).
--define(wxRegion_Union_1_0, 1215).
--define(wxRegion_Union_3, 1216).
--define(wxRegion_Xor_4, 1217).
--define(wxRegion_Xor_1_1, 1218).
--define(wxRegion_Xor_1_0, 1219).
--define(wxAcceleratorTable_new_0, 1220).
--define(wxAcceleratorTable_new_2, 1221).
--define(wxAcceleratorTable_destruct, 1222).
--define(wxAcceleratorTable_Ok, 1223).
--define(wxAcceleratorEntry_new_1_0, 1224).
--define(wxAcceleratorEntry_new_1_1, 1225).
--define(wxAcceleratorEntry_GetCommand, 1226).
--define(wxAcceleratorEntry_GetFlags, 1227).
--define(wxAcceleratorEntry_GetKeyCode, 1228).
--define(wxAcceleratorEntry_Set, 1229).
--define(wxAcceleratorEntry_destroy, 1230).
--define(wxCaret_new_3, 1235).
--define(wxCaret_new_2, 1236).
--define(wxCaret_destruct, 1238).
--define(wxCaret_Create_3, 1239).
--define(wxCaret_Create_2, 1240).
--define(wxCaret_GetBlinkTime, 1241).
--define(wxCaret_GetPosition, 1243).
--define(wxCaret_GetSize, 1245).
--define(wxCaret_GetWindow, 1246).
--define(wxCaret_Hide, 1247).
--define(wxCaret_IsOk, 1248).
--define(wxCaret_IsVisible, 1249).
--define(wxCaret_Move_2, 1250).
--define(wxCaret_Move_1, 1251).
--define(wxCaret_SetBlinkTime, 1252).
--define(wxCaret_SetSize_2, 1253).
--define(wxCaret_SetSize_1, 1254).
--define(wxCaret_Show, 1255).
--define(wxSizer_Add_2_1, 1256).
--define(wxSizer_Add_2_0, 1257).
--define(wxSizer_Add_3, 1258).
--define(wxSizer_Add_2_3, 1259).
--define(wxSizer_Add_2_2, 1260).
--define(wxSizer_AddSpacer, 1261).
--define(wxSizer_AddStretchSpacer, 1262).
--define(wxSizer_CalcMin, 1263).
--define(wxSizer_Clear, 1264).
--define(wxSizer_Detach_1_2, 1265).
--define(wxSizer_Detach_1_1, 1266).
--define(wxSizer_Detach_1_0, 1267).
--define(wxSizer_Fit, 1268).
--define(wxSizer_FitInside, 1269).
--define(wxSizer_GetChildren, 1270).
--define(wxSizer_GetItem_2_1, 1271).
--define(wxSizer_GetItem_2_0, 1272).
--define(wxSizer_GetItem_1, 1273).
--define(wxSizer_GetSize, 1274).
--define(wxSizer_GetPosition, 1275).
--define(wxSizer_GetMinSize, 1276).
--define(wxSizer_Hide_2_0, 1277).
--define(wxSizer_Hide_2_1, 1278).
--define(wxSizer_Hide_1, 1279).
--define(wxSizer_Insert_3_1, 1280).
--define(wxSizer_Insert_3_0, 1281).
--define(wxSizer_Insert_4, 1282).
--define(wxSizer_Insert_3_3, 1283).
--define(wxSizer_Insert_3_2, 1284).
--define(wxSizer_Insert_2, 1285).
--define(wxSizer_InsertSpacer, 1286).
--define(wxSizer_InsertStretchSpacer, 1287).
--define(wxSizer_IsShown_1_2, 1288).
--define(wxSizer_IsShown_1_1, 1289).
--define(wxSizer_IsShown_1_0, 1290).
--define(wxSizer_Layout, 1291).
--define(wxSizer_Prepend_2_1, 1292).
--define(wxSizer_Prepend_2_0, 1293).
--define(wxSizer_Prepend_3, 1294).
--define(wxSizer_Prepend_2_3, 1295).
--define(wxSizer_Prepend_2_2, 1296).
--define(wxSizer_Prepend_1, 1297).
--define(wxSizer_PrependSpacer, 1298).
--define(wxSizer_PrependStretchSpacer, 1299).
--define(wxSizer_RecalcSizes, 1300).
--define(wxSizer_Remove_1_1, 1301).
--define(wxSizer_Remove_1_0, 1302).
--define(wxSizer_Replace_3_1, 1303).
--define(wxSizer_Replace_3_0, 1304).
--define(wxSizer_Replace_2, 1305).
--define(wxSizer_SetDimension, 1306).
--define(wxSizer_SetMinSize_2, 1307).
--define(wxSizer_SetMinSize_1, 1308).
--define(wxSizer_SetItemMinSize_3_2, 1309).
--define(wxSizer_SetItemMinSize_2_2, 1310).
--define(wxSizer_SetItemMinSize_3_1, 1311).
--define(wxSizer_SetItemMinSize_2_1, 1312).
--define(wxSizer_SetItemMinSize_3_0, 1313).
--define(wxSizer_SetItemMinSize_2_0, 1314).
--define(wxSizer_SetSizeHints, 1315).
--define(wxSizer_SetVirtualSizeHints, 1316).
--define(wxSizer_Show_2_2, 1317).
--define(wxSizer_Show_2_1, 1318).
--define(wxSizer_Show_2_0, 1319).
--define(wxSizer_Show_1, 1320).
--define(wxSizerFlags_new, 1321).
--define(wxSizerFlags_Align, 1322).
--define(wxSizerFlags_Border_2, 1323).
--define(wxSizerFlags_Border_1, 1324).
--define(wxSizerFlags_Center, 1325).
--define(wxSizerFlags_Centre, 1326).
--define(wxSizerFlags_Expand, 1327).
--define(wxSizerFlags_Left, 1328).
--define(wxSizerFlags_Proportion, 1329).
--define(wxSizerFlags_Right, 1330).
--define(wxSizerFlags_destroy, 1331).
--define(wxSizerItem_new_5_1, 1332).
--define(wxSizerItem_new_2_1, 1333).
--define(wxSizerItem_new_5_0, 1334).
--define(wxSizerItem_new_2_0, 1335).
--define(wxSizerItem_new_6, 1336).
--define(wxSizerItem_new_3, 1337).
--define(wxSizerItem_new_0, 1338).
--define(wxSizerItem_destruct, 1339).
--define(wxSizerItem_CalcMin, 1340).
--define(wxSizerItem_DeleteWindows, 1341).
--define(wxSizerItem_DetachSizer, 1342).
--define(wxSizerItem_GetBorder, 1343).
--define(wxSizerItem_GetFlag, 1344).
--define(wxSizerItem_GetMinSize, 1345).
--define(wxSizerItem_GetPosition, 1346).
--define(wxSizerItem_GetProportion, 1347).
--define(wxSizerItem_GetRatio, 1348).
--define(wxSizerItem_GetRect, 1349).
--define(wxSizerItem_GetSize, 1350).
--define(wxSizerItem_GetSizer, 1351).
--define(wxSizerItem_GetSpacer, 1352).
--define(wxSizerItem_GetUserData, 1353).
--define(wxSizerItem_GetWindow, 1354).
--define(wxSizerItem_IsSizer, 1355).
--define(wxSizerItem_IsShown, 1356).
--define(wxSizerItem_IsSpacer, 1357).
--define(wxSizerItem_IsWindow, 1358).
--define(wxSizerItem_SetBorder, 1359).
--define(wxSizerItem_SetDimension, 1360).
--define(wxSizerItem_SetFlag, 1361).
--define(wxSizerItem_SetInitSize, 1362).
--define(wxSizerItem_SetMinSize_1, 1363).
--define(wxSizerItem_SetMinSize_2, 1364).
--define(wxSizerItem_SetProportion, 1365).
--define(wxSizerItem_SetRatio_2, 1366).
--define(wxSizerItem_SetRatio_1_1, 1367).
--define(wxSizerItem_SetRatio_1_0, 1368).
--define(wxSizerItem_SetSizer, 1369).
--define(wxSizerItem_SetSpacer_1, 1370).
--define(wxSizerItem_SetSpacer_2, 1371).
--define(wxSizerItem_SetWindow, 1372).
--define(wxSizerItem_Show, 1373).
--define(wxBoxSizer_new, 1374).
--define(wxBoxSizer_GetOrientation, 1375).
--define(wxBoxSizer_destroy, 1376).
--define(wxStaticBoxSizer_new_2, 1377).
--define(wxStaticBoxSizer_new_3, 1378).
--define(wxStaticBoxSizer_GetStaticBox, 1379).
--define(wxStaticBoxSizer_destroy, 1380).
--define(wxGridSizer_new_4, 1381).
--define(wxGridSizer_new_2, 1382).
--define(wxGridSizer_GetCols, 1383).
--define(wxGridSizer_GetHGap, 1384).
--define(wxGridSizer_GetRows, 1385).
--define(wxGridSizer_GetVGap, 1386).
--define(wxGridSizer_SetCols, 1387).
--define(wxGridSizer_SetHGap, 1388).
--define(wxGridSizer_SetRows, 1389).
--define(wxGridSizer_SetVGap, 1390).
--define(wxGridSizer_destroy, 1391).
--define(wxFlexGridSizer_new_4, 1392).
--define(wxFlexGridSizer_new_2, 1393).
--define(wxFlexGridSizer_AddGrowableCol, 1394).
--define(wxFlexGridSizer_AddGrowableRow, 1395).
--define(wxFlexGridSizer_GetFlexibleDirection, 1396).
--define(wxFlexGridSizer_GetNonFlexibleGrowMode, 1397).
--define(wxFlexGridSizer_RemoveGrowableCol, 1398).
--define(wxFlexGridSizer_RemoveGrowableRow, 1399).
--define(wxFlexGridSizer_SetFlexibleDirection, 1400).
--define(wxFlexGridSizer_SetNonFlexibleGrowMode, 1401).
--define(wxFlexGridSizer_destroy, 1402).
--define(wxGridBagSizer_new, 1403).
--define(wxGridBagSizer_Add_3_2, 1404).
--define(wxGridBagSizer_Add_3_1, 1405).
--define(wxGridBagSizer_Add_4, 1406).
--define(wxGridBagSizer_Add_1_0, 1407).
--define(wxGridBagSizer_Add_2_1, 1408).
--define(wxGridBagSizer_Add_2_0, 1409).
--define(wxGridBagSizer_Add_3_0, 1410).
--define(wxGridBagSizer_Add_1_1, 1411).
--define(wxGridBagSizer_CalcMin, 1412).
--define(wxGridBagSizer_CheckForIntersection_2, 1413).
--define(wxGridBagSizer_CheckForIntersection_3, 1414).
--define(wxGridBagSizer_FindItem_1_1, 1415).
--define(wxGridBagSizer_FindItem_1_0, 1416).
--define(wxGridBagSizer_FindItemAtPoint, 1417).
--define(wxGridBagSizer_FindItemAtPosition, 1418).
--define(wxGridBagSizer_FindItemWithData, 1419).
--define(wxGridBagSizer_GetCellSize, 1420).
--define(wxGridBagSizer_GetEmptyCellSize, 1421).
--define(wxGridBagSizer_GetItemPosition_1_2, 1422).
--define(wxGridBagSizer_GetItemPosition_1_1, 1423).
--define(wxGridBagSizer_GetItemPosition_1_0, 1424).
--define(wxGridBagSizer_GetItemSpan_1_2, 1425).
--define(wxGridBagSizer_GetItemSpan_1_1, 1426).
--define(wxGridBagSizer_GetItemSpan_1_0, 1427).
--define(wxGridBagSizer_SetEmptyCellSize, 1428).
--define(wxGridBagSizer_SetItemPosition_2_2, 1429).
--define(wxGridBagSizer_SetItemPosition_2_1, 1430).
--define(wxGridBagSizer_SetItemPosition_2_0, 1431).
--define(wxGridBagSizer_SetItemSpan_2_2, 1432).
--define(wxGridBagSizer_SetItemSpan_2_1, 1433).
--define(wxGridBagSizer_SetItemSpan_2_0, 1434).
--define(wxGridBagSizer_destroy, 1435).
--define(wxStdDialogButtonSizer_new, 1436).
--define(wxStdDialogButtonSizer_AddButton, 1437).
--define(wxStdDialogButtonSizer_Realize, 1438).
--define(wxStdDialogButtonSizer_SetAffirmativeButton, 1439).
--define(wxStdDialogButtonSizer_SetCancelButton, 1440).
--define(wxStdDialogButtonSizer_SetNegativeButton, 1441).
--define(wxStdDialogButtonSizer_destroy, 1442).
--define(wxFont_new_0, 1443).
--define(wxFont_new_1, 1444).
--define(wxFont_new_5, 1445).
--define(wxFont_destruct, 1447).
--define(wxFont_IsFixedWidth, 1448).
--define(wxFont_GetDefaultEncoding, 1449).
--define(wxFont_GetFaceName, 1450).
--define(wxFont_GetFamily, 1451).
--define(wxFont_GetNativeFontInfoDesc, 1452).
--define(wxFont_GetNativeFontInfoUserDesc, 1453).
--define(wxFont_GetPointSize, 1454).
--define(wxFont_GetStyle, 1455).
--define(wxFont_GetUnderlined, 1456).
--define(wxFont_GetWeight, 1457).
--define(wxFont_Ok, 1458).
--define(wxFont_SetDefaultEncoding, 1459).
--define(wxFont_SetFaceName, 1460).
--define(wxFont_SetFamily, 1461).
--define(wxFont_SetPointSize, 1462).
--define(wxFont_SetStyle, 1463).
--define(wxFont_SetUnderlined, 1464).
--define(wxFont_SetWeight, 1465).
--define(wxToolTip_Enable, 1466).
--define(wxToolTip_SetDelay, 1467).
--define(wxToolTip_new, 1468).
--define(wxToolTip_SetTip, 1469).
--define(wxToolTip_GetTip, 1470).
--define(wxToolTip_GetWindow, 1471).
--define(wxToolTip_destroy, 1472).
--define(wxButton_new_3, 1474).
--define(wxButton_new_0, 1475).
--define(wxButton_destruct, 1476).
--define(wxButton_Create, 1477).
--define(wxButton_GetDefaultSize, 1478).
--define(wxButton_SetDefault, 1479).
--define(wxButton_SetLabel, 1480).
--define(wxBitmapButton_new_4, 1482).
--define(wxBitmapButton_new_0, 1483).
--define(wxBitmapButton_Create, 1484).
--define(wxBitmapButton_GetBitmapDisabled, 1485).
--define(wxBitmapButton_GetBitmapFocus, 1487).
--define(wxBitmapButton_GetBitmapLabel, 1489).
--define(wxBitmapButton_GetBitmapSelected, 1491).
--define(wxBitmapButton_SetBitmapDisabled, 1493).
--define(wxBitmapButton_SetBitmapFocus, 1494).
--define(wxBitmapButton_SetBitmapLabel, 1495).
--define(wxBitmapButton_SetBitmapSelected, 1496).
--define(wxBitmapButton_destroy, 1497).
--define(wxToggleButton_new_0, 1498).
--define(wxToggleButton_new_4, 1499).
--define(wxToggleButton_Create, 1500).
--define(wxToggleButton_GetValue, 1501).
--define(wxToggleButton_SetValue, 1502).
--define(wxToggleButton_destroy, 1503).
--define(wxCalendarCtrl_new_0, 1504).
--define(wxCalendarCtrl_new_3, 1505).
--define(wxCalendarCtrl_Create, 1506).
--define(wxCalendarCtrl_destruct, 1507).
--define(wxCalendarCtrl_SetDate, 1508).
--define(wxCalendarCtrl_GetDate, 1509).
--define(wxCalendarCtrl_EnableYearChange, 1510).
--define(wxCalendarCtrl_EnableMonthChange, 1511).
--define(wxCalendarCtrl_EnableHolidayDisplay, 1512).
--define(wxCalendarCtrl_SetHeaderColours, 1513).
--define(wxCalendarCtrl_GetHeaderColourFg, 1514).
--define(wxCalendarCtrl_GetHeaderColourBg, 1515).
--define(wxCalendarCtrl_SetHighlightColours, 1516).
--define(wxCalendarCtrl_GetHighlightColourFg, 1517).
--define(wxCalendarCtrl_GetHighlightColourBg, 1518).
--define(wxCalendarCtrl_SetHolidayColours, 1519).
--define(wxCalendarCtrl_GetHolidayColourFg, 1520).
--define(wxCalendarCtrl_GetHolidayColourBg, 1521).
--define(wxCalendarCtrl_GetAttr, 1522).
--define(wxCalendarCtrl_SetAttr, 1523).
--define(wxCalendarCtrl_SetHoliday, 1524).
--define(wxCalendarCtrl_ResetAttr, 1525).
--define(wxCalendarCtrl_HitTest, 1526).
--define(wxCalendarDateAttr_new_0, 1527).
--define(wxCalendarDateAttr_new_2_1, 1528).
--define(wxCalendarDateAttr_new_2_0, 1529).
--define(wxCalendarDateAttr_SetTextColour, 1530).
--define(wxCalendarDateAttr_SetBackgroundColour, 1531).
--define(wxCalendarDateAttr_SetBorderColour, 1532).
--define(wxCalendarDateAttr_SetFont, 1533).
--define(wxCalendarDateAttr_SetBorder, 1534).
--define(wxCalendarDateAttr_SetHoliday, 1535).
--define(wxCalendarDateAttr_HasTextColour, 1536).
--define(wxCalendarDateAttr_HasBackgroundColour, 1537).
--define(wxCalendarDateAttr_HasBorderColour, 1538).
--define(wxCalendarDateAttr_HasFont, 1539).
--define(wxCalendarDateAttr_HasBorder, 1540).
--define(wxCalendarDateAttr_IsHoliday, 1541).
--define(wxCalendarDateAttr_GetTextColour, 1542).
--define(wxCalendarDateAttr_GetBackgroundColour, 1543).
--define(wxCalendarDateAttr_GetBorderColour, 1544).
--define(wxCalendarDateAttr_GetFont, 1545).
--define(wxCalendarDateAttr_GetBorder, 1546).
--define(wxCalendarDateAttr_destroy, 1547).
--define(wxCheckBox_new_4, 1549).
--define(wxCheckBox_new_0, 1550).
--define(wxCheckBox_Create, 1551).
--define(wxCheckBox_GetValue, 1552).
--define(wxCheckBox_Get3StateValue, 1553).
--define(wxCheckBox_Is3rdStateAllowedForUser, 1554).
--define(wxCheckBox_Is3State, 1555).
--define(wxCheckBox_IsChecked, 1556).
--define(wxCheckBox_SetValue, 1557).
--define(wxCheckBox_Set3StateValue, 1558).
--define(wxCheckBox_destroy, 1559).
--define(wxCheckListBox_new_0, 1560).
--define(wxCheckListBox_new_3, 1562).
--define(wxCheckListBox_Check, 1563).
--define(wxCheckListBox_IsChecked, 1564).
--define(wxCheckListBox_destroy, 1565).
--define(wxChoice_new_3, 1568).
--define(wxChoice_new_0, 1569).
--define(wxChoice_destruct, 1571).
--define(wxChoice_Create, 1573).
--define(wxChoice_Delete, 1574).
--define(wxChoice_GetColumns, 1575).
--define(wxChoice_SetColumns, 1576).
--define(wxComboBox_new_0, 1577).
--define(wxComboBox_new_3, 1579).
--define(wxComboBox_destruct, 1580).
--define(wxComboBox_Create, 1582).
--define(wxComboBox_CanCopy, 1583).
--define(wxComboBox_CanCut, 1584).
--define(wxComboBox_CanPaste, 1585).
--define(wxComboBox_CanRedo, 1586).
--define(wxComboBox_CanUndo, 1587).
--define(wxComboBox_Copy, 1588).
--define(wxComboBox_Cut, 1589).
--define(wxComboBox_GetInsertionPoint, 1590).
--define(wxComboBox_GetLastPosition, 1591).
--define(wxComboBox_GetValue, 1592).
--define(wxComboBox_Paste, 1593).
--define(wxComboBox_Redo, 1594).
--define(wxComboBox_Replace, 1595).
--define(wxComboBox_Remove, 1596).
--define(wxComboBox_SetInsertionPoint, 1597).
--define(wxComboBox_SetInsertionPointEnd, 1598).
--define(wxComboBox_SetSelection_1, 1599).
--define(wxComboBox_SetSelection_2, 1600).
--define(wxComboBox_SetValue, 1601).
--define(wxComboBox_Undo, 1602).
--define(wxGauge_new_0, 1603).
--define(wxGauge_new_4, 1604).
--define(wxGauge_Create, 1605).
--define(wxGauge_GetRange, 1606).
--define(wxGauge_GetValue, 1607).
--define(wxGauge_IsVertical, 1608).
--define(wxGauge_SetRange, 1609).
--define(wxGauge_SetValue, 1610).
--define(wxGauge_Pulse, 1611).
--define(wxGauge_destroy, 1612).
--define(wxGenericDirCtrl_new_0, 1613).
--define(wxGenericDirCtrl_new_2, 1614).
--define(wxGenericDirCtrl_destruct, 1615).
--define(wxGenericDirCtrl_Create, 1616).
--define(wxGenericDirCtrl_Init, 1617).
--define(wxGenericDirCtrl_CollapseTree, 1618).
--define(wxGenericDirCtrl_ExpandPath, 1619).
--define(wxGenericDirCtrl_GetDefaultPath, 1620).
--define(wxGenericDirCtrl_GetPath, 1621).
--define(wxGenericDirCtrl_GetFilePath, 1622).
--define(wxGenericDirCtrl_GetFilter, 1623).
--define(wxGenericDirCtrl_GetFilterIndex, 1624).
--define(wxGenericDirCtrl_GetRootId, 1625).
--define(wxGenericDirCtrl_GetTreeCtrl, 1626).
--define(wxGenericDirCtrl_ReCreateTree, 1627).
--define(wxGenericDirCtrl_SetDefaultPath, 1628).
--define(wxGenericDirCtrl_SetFilter, 1629).
--define(wxGenericDirCtrl_SetFilterIndex, 1630).
--define(wxGenericDirCtrl_SetPath, 1631).
--define(wxStaticBox_new_4, 1633).
--define(wxStaticBox_new_0, 1634).
--define(wxStaticBox_Create, 1635).
--define(wxStaticBox_destroy, 1636).
--define(wxStaticLine_new_2, 1638).
--define(wxStaticLine_new_0, 1639).
--define(wxStaticLine_Create, 1640).
--define(wxStaticLine_IsVertical, 1641).
--define(wxStaticLine_GetDefaultSize, 1642).
--define(wxStaticLine_destroy, 1643).
--define(wxListBox_new_3, 1646).
--define(wxListBox_new_0, 1647).
--define(wxListBox_destruct, 1649).
--define(wxListBox_Create, 1651).
--define(wxListBox_Deselect, 1652).
--define(wxListBox_GetSelections, 1653).
--define(wxListBox_InsertItems, 1654).
--define(wxListBox_IsSelected, 1655).
--define(wxListBox_Set, 1656).
--define(wxListBox_HitTest, 1657).
--define(wxListBox_SetFirstItem_1_0, 1658).
--define(wxListBox_SetFirstItem_1_1, 1659).
--define(wxListCtrl_new_0, 1660).
--define(wxListCtrl_new_2, 1661).
--define(wxListCtrl_Arrange, 1662).
--define(wxListCtrl_AssignImageList, 1663).
--define(wxListCtrl_ClearAll, 1664).
--define(wxListCtrl_Create, 1665).
--define(wxListCtrl_DeleteAllItems, 1666).
--define(wxListCtrl_DeleteColumn, 1667).
--define(wxListCtrl_DeleteItem, 1668).
--define(wxListCtrl_EditLabel, 1669).
--define(wxListCtrl_EnsureVisible, 1670).
--define(wxListCtrl_FindItem_3_0, 1671).
--define(wxListCtrl_FindItem_3_1, 1672).
--define(wxListCtrl_GetColumn, 1673).
--define(wxListCtrl_GetColumnCount, 1674).
--define(wxListCtrl_GetColumnWidth, 1675).
--define(wxListCtrl_GetCountPerPage, 1676).
--define(wxListCtrl_GetEditControl, 1677).
--define(wxListCtrl_GetImageList, 1678).
--define(wxListCtrl_GetItem, 1679).
--define(wxListCtrl_GetItemBackgroundColour, 1680).
--define(wxListCtrl_GetItemCount, 1681).
--define(wxListCtrl_GetItemData, 1682).
--define(wxListCtrl_GetItemFont, 1683).
--define(wxListCtrl_GetItemPosition, 1684).
--define(wxListCtrl_GetItemRect, 1685).
--define(wxListCtrl_GetItemSpacing, 1686).
--define(wxListCtrl_GetItemState, 1687).
--define(wxListCtrl_GetItemText, 1688).
--define(wxListCtrl_GetItemTextColour, 1689).
--define(wxListCtrl_GetNextItem, 1690).
--define(wxListCtrl_GetSelectedItemCount, 1691).
--define(wxListCtrl_GetTextColour, 1692).
--define(wxListCtrl_GetTopItem, 1693).
--define(wxListCtrl_GetViewRect, 1694).
--define(wxListCtrl_HitTest, 1695).
--define(wxListCtrl_InsertColumn_2, 1696).
--define(wxListCtrl_InsertColumn_3, 1697).
--define(wxListCtrl_InsertItem_1, 1698).
--define(wxListCtrl_InsertItem_2_1, 1699).
--define(wxListCtrl_InsertItem_2_0, 1700).
--define(wxListCtrl_InsertItem_3, 1701).
--define(wxListCtrl_RefreshItem, 1702).
--define(wxListCtrl_RefreshItems, 1703).
--define(wxListCtrl_ScrollList, 1704).
--define(wxListCtrl_SetBackgroundColour, 1705).
--define(wxListCtrl_SetColumn, 1706).
--define(wxListCtrl_SetColumnWidth, 1707).
--define(wxListCtrl_SetImageList, 1708).
--define(wxListCtrl_SetItem_1, 1709).
--define(wxListCtrl_SetItem_4, 1710).
--define(wxListCtrl_SetItemBackgroundColour, 1711).
--define(wxListCtrl_SetItemCount, 1712).
--define(wxListCtrl_SetItemData, 1713).
--define(wxListCtrl_SetItemFont, 1714).
--define(wxListCtrl_SetItemImage, 1715).
--define(wxListCtrl_SetItemColumnImage, 1716).
--define(wxListCtrl_SetItemPosition, 1717).
--define(wxListCtrl_SetItemState, 1718).
--define(wxListCtrl_SetItemText, 1719).
--define(wxListCtrl_SetItemTextColour, 1720).
--define(wxListCtrl_SetSingleStyle, 1721).
--define(wxListCtrl_SetTextColour, 1722).
--define(wxListCtrl_SetWindowStyleFlag, 1723).
--define(wxListCtrl_SortItems, 1724).
--define(wxListCtrl_destroy, 1725).
--define(wxListView_ClearColumnImage, 1726).
--define(wxListView_Focus, 1727).
--define(wxListView_GetFirstSelected, 1728).
--define(wxListView_GetFocusedItem, 1729).
--define(wxListView_GetNextSelected, 1730).
--define(wxListView_IsSelected, 1731).
--define(wxListView_Select, 1732).
--define(wxListView_SetColumnImage, 1733).
--define(wxListItem_new_0, 1734).
--define(wxListItem_new_1, 1735).
--define(wxListItem_destruct, 1736).
--define(wxListItem_Clear, 1737).
--define(wxListItem_GetAlign, 1738).
--define(wxListItem_GetBackgroundColour, 1739).
--define(wxListItem_GetColumn, 1740).
--define(wxListItem_GetFont, 1741).
--define(wxListItem_GetId, 1742).
--define(wxListItem_GetImage, 1743).
--define(wxListItem_GetMask, 1744).
--define(wxListItem_GetState, 1745).
--define(wxListItem_GetText, 1746).
--define(wxListItem_GetTextColour, 1747).
--define(wxListItem_GetWidth, 1748).
--define(wxListItem_SetAlign, 1749).
--define(wxListItem_SetBackgroundColour, 1750).
--define(wxListItem_SetColumn, 1751).
--define(wxListItem_SetFont, 1752).
--define(wxListItem_SetId, 1753).
--define(wxListItem_SetImage, 1754).
--define(wxListItem_SetMask, 1755).
--define(wxListItem_SetState, 1756).
--define(wxListItem_SetStateMask, 1757).
--define(wxListItem_SetText, 1758).
--define(wxListItem_SetTextColour, 1759).
--define(wxListItem_SetWidth, 1760).
--define(wxListItemAttr_new_0, 1761).
--define(wxListItemAttr_new_3, 1762).
--define(wxListItemAttr_GetBackgroundColour, 1763).
--define(wxListItemAttr_GetFont, 1764).
--define(wxListItemAttr_GetTextColour, 1765).
--define(wxListItemAttr_HasBackgroundColour, 1766).
--define(wxListItemAttr_HasFont, 1767).
--define(wxListItemAttr_HasTextColour, 1768).
--define(wxListItemAttr_SetBackgroundColour, 1769).
--define(wxListItemAttr_SetFont, 1770).
--define(wxListItemAttr_SetTextColour, 1771).
--define(wxListItemAttr_destroy, 1772).
--define(wxImageList_new_0, 1773).
--define(wxImageList_new_3, 1774).
--define(wxImageList_Add_1, 1775).
--define(wxImageList_Add_2_0, 1776).
--define(wxImageList_Add_2_1, 1777).
--define(wxImageList_Create, 1778).
--define(wxImageList_Draw, 1780).
--define(wxImageList_GetBitmap, 1781).
--define(wxImageList_GetIcon, 1782).
--define(wxImageList_GetImageCount, 1783).
--define(wxImageList_GetSize, 1784).
--define(wxImageList_Remove, 1785).
--define(wxImageList_RemoveAll, 1786).
--define(wxImageList_Replace_2, 1787).
--define(wxImageList_Replace_3, 1788).
--define(wxImageList_destroy, 1789).
--define(wxTextAttr_new_0, 1790).
--define(wxTextAttr_new_2, 1791).
--define(wxTextAttr_GetAlignment, 1792).
--define(wxTextAttr_GetBackgroundColour, 1793).
--define(wxTextAttr_GetFont, 1794).
--define(wxTextAttr_GetLeftIndent, 1795).
--define(wxTextAttr_GetLeftSubIndent, 1796).
--define(wxTextAttr_GetRightIndent, 1797).
--define(wxTextAttr_GetTabs, 1798).
--define(wxTextAttr_GetTextColour, 1799).
--define(wxTextAttr_HasBackgroundColour, 1800).
--define(wxTextAttr_HasFont, 1801).
--define(wxTextAttr_HasTextColour, 1802).
--define(wxTextAttr_GetFlags, 1803).
--define(wxTextAttr_IsDefault, 1804).
--define(wxTextAttr_SetAlignment, 1805).
--define(wxTextAttr_SetBackgroundColour, 1806).
--define(wxTextAttr_SetFlags, 1807).
--define(wxTextAttr_SetFont, 1808).
--define(wxTextAttr_SetLeftIndent, 1809).
--define(wxTextAttr_SetRightIndent, 1810).
--define(wxTextAttr_SetTabs, 1811).
--define(wxTextAttr_SetTextColour, 1812).
--define(wxTextAttr_destroy, 1813).
--define(wxTextCtrl_new_3, 1815).
--define(wxTextCtrl_new_0, 1816).
--define(wxTextCtrl_destruct, 1818).
--define(wxTextCtrl_AppendText, 1819).
--define(wxTextCtrl_CanCopy, 1820).
--define(wxTextCtrl_CanCut, 1821).
--define(wxTextCtrl_CanPaste, 1822).
--define(wxTextCtrl_CanRedo, 1823).
--define(wxTextCtrl_CanUndo, 1824).
--define(wxTextCtrl_Clear, 1825).
--define(wxTextCtrl_Copy, 1826).
--define(wxTextCtrl_Create, 1827).
--define(wxTextCtrl_Cut, 1828).
--define(wxTextCtrl_DiscardEdits, 1829).
--define(wxTextCtrl_ChangeValue, 1830).
--define(wxTextCtrl_EmulateKeyPress, 1831).
--define(wxTextCtrl_GetDefaultStyle, 1832).
--define(wxTextCtrl_GetInsertionPoint, 1833).
--define(wxTextCtrl_GetLastPosition, 1834).
--define(wxTextCtrl_GetLineLength, 1835).
--define(wxTextCtrl_GetLineText, 1836).
--define(wxTextCtrl_GetNumberOfLines, 1837).
--define(wxTextCtrl_GetRange, 1838).
--define(wxTextCtrl_GetSelection, 1839).
--define(wxTextCtrl_GetStringSelection, 1840).
--define(wxTextCtrl_GetStyle, 1841).
--define(wxTextCtrl_GetValue, 1842).
--define(wxTextCtrl_IsEditable, 1843).
--define(wxTextCtrl_IsModified, 1844).
--define(wxTextCtrl_IsMultiLine, 1845).
--define(wxTextCtrl_IsSingleLine, 1846).
--define(wxTextCtrl_LoadFile, 1847).
--define(wxTextCtrl_MarkDirty, 1848).
--define(wxTextCtrl_Paste, 1849).
--define(wxTextCtrl_PositionToXY, 1850).
--define(wxTextCtrl_Redo, 1851).
--define(wxTextCtrl_Remove, 1852).
--define(wxTextCtrl_Replace, 1853).
--define(wxTextCtrl_SaveFile, 1854).
--define(wxTextCtrl_SetDefaultStyle, 1855).
--define(wxTextCtrl_SetEditable, 1856).
--define(wxTextCtrl_SetInsertionPoint, 1857).
--define(wxTextCtrl_SetInsertionPointEnd, 1858).
--define(wxTextCtrl_SetMaxLength, 1860).
--define(wxTextCtrl_SetSelection, 1861).
--define(wxTextCtrl_SetStyle, 1862).
--define(wxTextCtrl_SetValue, 1863).
--define(wxTextCtrl_ShowPosition, 1864).
--define(wxTextCtrl_Undo, 1865).
--define(wxTextCtrl_WriteText, 1866).
--define(wxTextCtrl_XYToPosition, 1867).
--define(wxNotebook_new_0, 1870).
--define(wxNotebook_new_3, 1871).
--define(wxNotebook_destruct, 1872).
--define(wxNotebook_AddPage, 1873).
--define(wxNotebook_AdvanceSelection, 1874).
--define(wxNotebook_AssignImageList, 1875).
--define(wxNotebook_Create, 1876).
--define(wxNotebook_DeleteAllPages, 1877).
--define(wxNotebook_DeletePage, 1878).
--define(wxNotebook_RemovePage, 1879).
--define(wxNotebook_GetCurrentPage, 1880).
--define(wxNotebook_GetImageList, 1881).
--define(wxNotebook_GetPage, 1883).
--define(wxNotebook_GetPageCount, 1884).
--define(wxNotebook_GetPageImage, 1885).
--define(wxNotebook_GetPageText, 1886).
--define(wxNotebook_GetRowCount, 1887).
--define(wxNotebook_GetSelection, 1888).
--define(wxNotebook_GetThemeBackgroundColour, 1889).
--define(wxNotebook_HitTest, 1891).
--define(wxNotebook_InsertPage, 1893).
--define(wxNotebook_SetImageList, 1894).
--define(wxNotebook_SetPadding, 1895).
--define(wxNotebook_SetPageSize, 1896).
--define(wxNotebook_SetPageImage, 1897).
--define(wxNotebook_SetPageText, 1898).
--define(wxNotebook_SetSelection, 1899).
--define(wxNotebook_ChangeSelection, 1900).
--define(wxChoicebook_new_0, 1901).
--define(wxChoicebook_new_3, 1902).
--define(wxChoicebook_AddPage, 1903).
--define(wxChoicebook_AdvanceSelection, 1904).
--define(wxChoicebook_AssignImageList, 1905).
--define(wxChoicebook_Create, 1906).
--define(wxChoicebook_DeleteAllPages, 1907).
--define(wxChoicebook_DeletePage, 1908).
--define(wxChoicebook_RemovePage, 1909).
--define(wxChoicebook_GetCurrentPage, 1910).
--define(wxChoicebook_GetImageList, 1911).
--define(wxChoicebook_GetPage, 1913).
--define(wxChoicebook_GetPageCount, 1914).
--define(wxChoicebook_GetPageImage, 1915).
--define(wxChoicebook_GetPageText, 1916).
--define(wxChoicebook_GetSelection, 1917).
--define(wxChoicebook_HitTest, 1918).
--define(wxChoicebook_InsertPage, 1919).
--define(wxChoicebook_SetImageList, 1920).
--define(wxChoicebook_SetPageSize, 1921).
--define(wxChoicebook_SetPageImage, 1922).
--define(wxChoicebook_SetPageText, 1923).
--define(wxChoicebook_SetSelection, 1924).
--define(wxChoicebook_ChangeSelection, 1925).
--define(wxChoicebook_destroy, 1926).
--define(wxToolbook_new_0, 1927).
--define(wxToolbook_new_3, 1928).
--define(wxToolbook_AddPage, 1929).
--define(wxToolbook_AdvanceSelection, 1930).
--define(wxToolbook_AssignImageList, 1931).
--define(wxToolbook_Create, 1932).
--define(wxToolbook_DeleteAllPages, 1933).
--define(wxToolbook_DeletePage, 1934).
--define(wxToolbook_RemovePage, 1935).
--define(wxToolbook_GetCurrentPage, 1936).
--define(wxToolbook_GetImageList, 1937).
--define(wxToolbook_GetPage, 1939).
--define(wxToolbook_GetPageCount, 1940).
--define(wxToolbook_GetPageImage, 1941).
--define(wxToolbook_GetPageText, 1942).
--define(wxToolbook_GetSelection, 1943).
--define(wxToolbook_HitTest, 1945).
--define(wxToolbook_InsertPage, 1946).
--define(wxToolbook_SetImageList, 1947).
--define(wxToolbook_SetPageSize, 1948).
--define(wxToolbook_SetPageImage, 1949).
--define(wxToolbook_SetPageText, 1950).
--define(wxToolbook_SetSelection, 1951).
--define(wxToolbook_ChangeSelection, 1952).
--define(wxToolbook_destroy, 1953).
--define(wxListbook_new_0, 1954).
--define(wxListbook_new_3, 1955).
--define(wxListbook_AddPage, 1956).
--define(wxListbook_AdvanceSelection, 1957).
--define(wxListbook_AssignImageList, 1958).
--define(wxListbook_Create, 1959).
--define(wxListbook_DeleteAllPages, 1960).
--define(wxListbook_DeletePage, 1961).
--define(wxListbook_RemovePage, 1962).
--define(wxListbook_GetCurrentPage, 1963).
--define(wxListbook_GetImageList, 1964).
--define(wxListbook_GetPage, 1966).
--define(wxListbook_GetPageCount, 1967).
--define(wxListbook_GetPageImage, 1968).
--define(wxListbook_GetPageText, 1969).
--define(wxListbook_GetSelection, 1970).
--define(wxListbook_HitTest, 1972).
--define(wxListbook_InsertPage, 1973).
--define(wxListbook_SetImageList, 1974).
--define(wxListbook_SetPageSize, 1975).
--define(wxListbook_SetPageImage, 1976).
--define(wxListbook_SetPageText, 1977).
--define(wxListbook_SetSelection, 1978).
--define(wxListbook_ChangeSelection, 1979).
--define(wxListbook_destroy, 1980).
--define(wxTreebook_new_0, 1981).
--define(wxTreebook_new_3, 1982).
--define(wxTreebook_AddPage, 1983).
--define(wxTreebook_AdvanceSelection, 1984).
--define(wxTreebook_AssignImageList, 1985).
--define(wxTreebook_Create, 1986).
--define(wxTreebook_DeleteAllPages, 1987).
--define(wxTreebook_DeletePage, 1988).
--define(wxTreebook_RemovePage, 1989).
--define(wxTreebook_GetCurrentPage, 1990).
--define(wxTreebook_GetImageList, 1991).
--define(wxTreebook_GetPage, 1993).
--define(wxTreebook_GetPageCount, 1994).
--define(wxTreebook_GetPageImage, 1995).
--define(wxTreebook_GetPageText, 1996).
--define(wxTreebook_GetSelection, 1997).
--define(wxTreebook_ExpandNode, 1998).
--define(wxTreebook_IsNodeExpanded, 1999).
--define(wxTreebook_HitTest, 2001).
--define(wxTreebook_InsertPage, 2002).
--define(wxTreebook_InsertSubPage, 2003).
--define(wxTreebook_SetImageList, 2004).
--define(wxTreebook_SetPageSize, 2005).
--define(wxTreebook_SetPageImage, 2006).
--define(wxTreebook_SetPageText, 2007).
--define(wxTreebook_SetSelection, 2008).
--define(wxTreebook_ChangeSelection, 2009).
--define(wxTreebook_destroy, 2010).
--define(wxTreeCtrl_new_2, 2013).
--define(wxTreeCtrl_new_0, 2014).
--define(wxTreeCtrl_destruct, 2016).
--define(wxTreeCtrl_AddRoot, 2017).
--define(wxTreeCtrl_AppendItem, 2018).
--define(wxTreeCtrl_AssignImageList, 2019).
--define(wxTreeCtrl_AssignStateImageList, 2020).
--define(wxTreeCtrl_Collapse, 2021).
--define(wxTreeCtrl_CollapseAndReset, 2022).
--define(wxTreeCtrl_Create, 2023).
--define(wxTreeCtrl_Delete, 2024).
--define(wxTreeCtrl_DeleteAllItems, 2025).
--define(wxTreeCtrl_DeleteChildren, 2026).
--define(wxTreeCtrl_EditLabel, 2027).
--define(wxTreeCtrl_EnsureVisible, 2028).
--define(wxTreeCtrl_Expand, 2029).
--define(wxTreeCtrl_GetBoundingRect, 2030).
--define(wxTreeCtrl_GetChildrenCount, 2032).
--define(wxTreeCtrl_GetCount, 2033).
--define(wxTreeCtrl_GetEditControl, 2034).
--define(wxTreeCtrl_GetFirstChild, 2035).
--define(wxTreeCtrl_GetNextChild, 2036).
--define(wxTreeCtrl_GetFirstVisibleItem, 2037).
--define(wxTreeCtrl_GetImageList, 2038).
--define(wxTreeCtrl_GetIndent, 2039).
--define(wxTreeCtrl_GetItemBackgroundColour, 2040).
--define(wxTreeCtrl_GetItemData, 2041).
--define(wxTreeCtrl_GetItemFont, 2042).
--define(wxTreeCtrl_GetItemImage_1, 2043).
--define(wxTreeCtrl_GetItemImage_2, 2044).
--define(wxTreeCtrl_GetItemText, 2045).
--define(wxTreeCtrl_GetItemTextColour, 2046).
--define(wxTreeCtrl_GetLastChild, 2047).
--define(wxTreeCtrl_GetNextSibling, 2048).
--define(wxTreeCtrl_GetNextVisible, 2049).
--define(wxTreeCtrl_GetItemParent, 2050).
--define(wxTreeCtrl_GetPrevSibling, 2051).
--define(wxTreeCtrl_GetPrevVisible, 2052).
--define(wxTreeCtrl_GetRootItem, 2053).
--define(wxTreeCtrl_GetSelection, 2054).
--define(wxTreeCtrl_GetSelections, 2055).
--define(wxTreeCtrl_GetStateImageList, 2056).
--define(wxTreeCtrl_HitTest, 2057).
--define(wxTreeCtrl_InsertItem, 2059).
--define(wxTreeCtrl_IsBold, 2060).
--define(wxTreeCtrl_IsExpanded, 2061).
--define(wxTreeCtrl_IsSelected, 2062).
--define(wxTreeCtrl_IsVisible, 2063).
--define(wxTreeCtrl_ItemHasChildren, 2064).
--define(wxTreeCtrl_IsTreeItemIdOk, 2065).
--define(wxTreeCtrl_PrependItem, 2066).
--define(wxTreeCtrl_ScrollTo, 2067).
--define(wxTreeCtrl_SelectItem_1, 2068).
--define(wxTreeCtrl_SelectItem_2, 2069).
--define(wxTreeCtrl_SetIndent, 2070).
--define(wxTreeCtrl_SetImageList, 2071).
--define(wxTreeCtrl_SetItemBackgroundColour, 2072).
--define(wxTreeCtrl_SetItemBold, 2073).
--define(wxTreeCtrl_SetItemData, 2074).
--define(wxTreeCtrl_SetItemDropHighlight, 2075).
--define(wxTreeCtrl_SetItemFont, 2076).
--define(wxTreeCtrl_SetItemHasChildren, 2077).
--define(wxTreeCtrl_SetItemImage_2, 2078).
--define(wxTreeCtrl_SetItemImage_3, 2079).
--define(wxTreeCtrl_SetItemText, 2080).
--define(wxTreeCtrl_SetItemTextColour, 2081).
--define(wxTreeCtrl_SetStateImageList, 2082).
--define(wxTreeCtrl_SetWindowStyle, 2083).
--define(wxTreeCtrl_SortChildren, 2084).
--define(wxTreeCtrl_Toggle, 2085).
--define(wxTreeCtrl_ToggleItemSelection, 2086).
--define(wxTreeCtrl_Unselect, 2087).
--define(wxTreeCtrl_UnselectAll, 2088).
--define(wxTreeCtrl_UnselectItem, 2089).
--define(wxScrollBar_new_0, 2090).
--define(wxScrollBar_new_3, 2091).
--define(wxScrollBar_destruct, 2092).
--define(wxScrollBar_Create, 2093).
--define(wxScrollBar_GetRange, 2094).
--define(wxScrollBar_GetPageSize, 2095).
--define(wxScrollBar_GetThumbPosition, 2096).
--define(wxScrollBar_GetThumbSize, 2097).
--define(wxScrollBar_SetThumbPosition, 2098).
--define(wxScrollBar_SetScrollbar, 2099).
--define(wxSpinButton_new_2, 2101).
--define(wxSpinButton_new_0, 2102).
--define(wxSpinButton_Create, 2103).
--define(wxSpinButton_GetMax, 2104).
--define(wxSpinButton_GetMin, 2105).
--define(wxSpinButton_GetValue, 2106).
--define(wxSpinButton_SetRange, 2107).
--define(wxSpinButton_SetValue, 2108).
--define(wxSpinButton_destroy, 2109).
--define(wxSpinCtrl_new_0, 2110).
--define(wxSpinCtrl_new_2, 2111).
--define(wxSpinCtrl_Create, 2113).
--define(wxSpinCtrl_SetValue_1_1, 2116).
--define(wxSpinCtrl_SetValue_1_0, 2117).
--define(wxSpinCtrl_GetValue, 2119).
--define(wxSpinCtrl_SetRange, 2121).
--define(wxSpinCtrl_SetSelection, 2122).
--define(wxSpinCtrl_GetMin, 2124).
--define(wxSpinCtrl_GetMax, 2126).
--define(wxSpinCtrl_destroy, 2127).
--define(wxStaticText_new_0, 2128).
--define(wxStaticText_new_4, 2129).
--define(wxStaticText_Create, 2130).
--define(wxStaticText_GetLabel, 2131).
--define(wxStaticText_SetLabel, 2132).
--define(wxStaticText_Wrap, 2133).
--define(wxStaticText_destroy, 2134).
--define(wxStaticBitmap_new_0, 2135).
--define(wxStaticBitmap_new_4, 2136).
--define(wxStaticBitmap_Create, 2137).
--define(wxStaticBitmap_GetBitmap, 2138).
--define(wxStaticBitmap_SetBitmap, 2139).
--define(wxStaticBitmap_destroy, 2140).
--define(wxRadioBox_new, 2141).
--define(wxRadioBox_destruct, 2143).
--define(wxRadioBox_Create, 2144).
--define(wxRadioBox_Enable_2, 2145).
--define(wxRadioBox_Enable_1, 2146).
--define(wxRadioBox_GetSelection, 2147).
--define(wxRadioBox_GetString, 2148).
--define(wxRadioBox_SetSelection, 2149).
--define(wxRadioBox_Show_2, 2150).
--define(wxRadioBox_Show_1, 2151).
--define(wxRadioBox_GetColumnCount, 2152).
--define(wxRadioBox_GetItemHelpText, 2153).
--define(wxRadioBox_GetItemToolTip, 2154).
--define(wxRadioBox_GetItemFromPoint, 2156).
--define(wxRadioBox_GetRowCount, 2157).
--define(wxRadioBox_IsItemEnabled, 2158).
--define(wxRadioBox_IsItemShown, 2159).
--define(wxRadioBox_SetItemHelpText, 2160).
--define(wxRadioBox_SetItemToolTip, 2161).
--define(wxRadioButton_new_0, 2162).
--define(wxRadioButton_new_4, 2163).
--define(wxRadioButton_Create, 2164).
--define(wxRadioButton_GetValue, 2165).
--define(wxRadioButton_SetValue, 2166).
--define(wxRadioButton_destroy, 2167).
--define(wxSlider_new_6, 2169).
--define(wxSlider_new_0, 2170).
--define(wxSlider_Create, 2171).
--define(wxSlider_GetLineSize, 2172).
--define(wxSlider_GetMax, 2173).
--define(wxSlider_GetMin, 2174).
--define(wxSlider_GetPageSize, 2175).
--define(wxSlider_GetThumbLength, 2176).
--define(wxSlider_GetValue, 2177).
--define(wxSlider_SetLineSize, 2178).
--define(wxSlider_SetPageSize, 2179).
--define(wxSlider_SetRange, 2180).
--define(wxSlider_SetThumbLength, 2181).
--define(wxSlider_SetValue, 2182).
--define(wxSlider_destroy, 2183).
--define(wxDialog_new_4, 2185).
--define(wxDialog_new_0, 2186).
--define(wxDialog_destruct, 2188).
--define(wxDialog_Create, 2189).
--define(wxDialog_CreateButtonSizer, 2190).
--define(wxDialog_CreateStdDialogButtonSizer, 2191).
--define(wxDialog_EndModal, 2192).
--define(wxDialog_GetAffirmativeId, 2193).
--define(wxDialog_GetReturnCode, 2194).
--define(wxDialog_IsModal, 2195).
--define(wxDialog_SetAffirmativeId, 2196).
--define(wxDialog_SetReturnCode, 2197).
--define(wxDialog_Show, 2198).
--define(wxDialog_ShowModal, 2199).
--define(wxColourDialog_new_0, 2200).
--define(wxColourDialog_new_2, 2201).
--define(wxColourDialog_destruct, 2202).
--define(wxColourDialog_Create, 2203).
--define(wxColourDialog_GetColourData, 2204).
--define(wxColourData_new_0, 2205).
--define(wxColourData_new_1, 2206).
--define(wxColourData_destruct, 2207).
--define(wxColourData_GetChooseFull, 2208).
--define(wxColourData_GetColour, 2209).
--define(wxColourData_GetCustomColour, 2211).
--define(wxColourData_SetChooseFull, 2212).
--define(wxColourData_SetColour, 2213).
--define(wxColourData_SetCustomColour, 2214).
--define(wxPalette_new_0, 2215).
--define(wxPalette_new_4, 2216).
--define(wxPalette_destruct, 2218).
--define(wxPalette_Create, 2219).
--define(wxPalette_GetColoursCount, 2220).
--define(wxPalette_GetPixel, 2221).
--define(wxPalette_GetRGB, 2222).
--define(wxPalette_IsOk, 2223).
--define(wxDirDialog_new, 2227).
--define(wxDirDialog_destruct, 2228).
--define(wxDirDialog_GetPath, 2229).
--define(wxDirDialog_GetMessage, 2230).
--define(wxDirDialog_SetMessage, 2231).
--define(wxDirDialog_SetPath, 2232).
--define(wxFileDialog_new, 2236).
--define(wxFileDialog_destruct, 2237).
--define(wxFileDialog_GetDirectory, 2238).
--define(wxFileDialog_GetFilename, 2239).
--define(wxFileDialog_GetFilenames, 2240).
--define(wxFileDialog_GetFilterIndex, 2241).
--define(wxFileDialog_GetMessage, 2242).
--define(wxFileDialog_GetPath, 2243).
--define(wxFileDialog_GetPaths, 2244).
--define(wxFileDialog_GetWildcard, 2245).
--define(wxFileDialog_SetDirectory, 2246).
--define(wxFileDialog_SetFilename, 2247).
--define(wxFileDialog_SetFilterIndex, 2248).
--define(wxFileDialog_SetMessage, 2249).
--define(wxFileDialog_SetPath, 2250).
--define(wxFileDialog_SetWildcard, 2251).
--define(wxPickerBase_SetInternalMargin, 2252).
--define(wxPickerBase_GetInternalMargin, 2253).
--define(wxPickerBase_SetTextCtrlProportion, 2254).
--define(wxPickerBase_SetPickerCtrlProportion, 2255).
--define(wxPickerBase_GetTextCtrlProportion, 2256).
--define(wxPickerBase_GetPickerCtrlProportion, 2257).
--define(wxPickerBase_HasTextCtrl, 2258).
--define(wxPickerBase_GetTextCtrl, 2259).
--define(wxPickerBase_IsTextCtrlGrowable, 2260).
--define(wxPickerBase_SetPickerCtrlGrowable, 2261).
--define(wxPickerBase_SetTextCtrlGrowable, 2262).
--define(wxPickerBase_IsPickerCtrlGrowable, 2263).
--define(wxFilePickerCtrl_new_0, 2264).
--define(wxFilePickerCtrl_new_3, 2265).
--define(wxFilePickerCtrl_Create, 2266).
--define(wxFilePickerCtrl_GetPath, 2267).
--define(wxFilePickerCtrl_SetPath, 2268).
--define(wxFilePickerCtrl_destroy, 2269).
--define(wxDirPickerCtrl_new_0, 2270).
--define(wxDirPickerCtrl_new_3, 2271).
--define(wxDirPickerCtrl_Create, 2272).
--define(wxDirPickerCtrl_GetPath, 2273).
--define(wxDirPickerCtrl_SetPath, 2274).
--define(wxDirPickerCtrl_destroy, 2275).
--define(wxColourPickerCtrl_new_0, 2276).
--define(wxColourPickerCtrl_new_3, 2277).
--define(wxColourPickerCtrl_Create, 2278).
--define(wxColourPickerCtrl_GetColour, 2279).
--define(wxColourPickerCtrl_SetColour_1_1, 2280).
--define(wxColourPickerCtrl_SetColour_1_0, 2281).
--define(wxColourPickerCtrl_destroy, 2282).
--define(wxDatePickerCtrl_new_0, 2283).
--define(wxDatePickerCtrl_new_3, 2284).
--define(wxDatePickerCtrl_GetRange, 2285).
--define(wxDatePickerCtrl_GetValue, 2286).
--define(wxDatePickerCtrl_SetRange, 2287).
--define(wxDatePickerCtrl_SetValue, 2288).
--define(wxDatePickerCtrl_destroy, 2289).
--define(wxFontPickerCtrl_new_0, 2290).
--define(wxFontPickerCtrl_new_3, 2291).
--define(wxFontPickerCtrl_Create, 2292).
--define(wxFontPickerCtrl_GetSelectedFont, 2293).
--define(wxFontPickerCtrl_SetSelectedFont, 2294).
--define(wxFontPickerCtrl_GetMaxPointSize, 2295).
--define(wxFontPickerCtrl_SetMaxPointSize, 2296).
--define(wxFontPickerCtrl_destroy, 2297).
--define(wxFindReplaceDialog_new_0, 2300).
--define(wxFindReplaceDialog_new_4, 2301).
--define(wxFindReplaceDialog_destruct, 2302).
--define(wxFindReplaceDialog_Create, 2303).
--define(wxFindReplaceDialog_GetData, 2304).
--define(wxFindReplaceData_new_0, 2305).
--define(wxFindReplaceData_new_1, 2306).
--define(wxFindReplaceData_GetFindString, 2307).
--define(wxFindReplaceData_GetReplaceString, 2308).
--define(wxFindReplaceData_GetFlags, 2309).
--define(wxFindReplaceData_SetFlags, 2310).
--define(wxFindReplaceData_SetFindString, 2311).
--define(wxFindReplaceData_SetReplaceString, 2312).
--define(wxFindReplaceData_destroy, 2313).
--define(wxMultiChoiceDialog_new_0, 2314).
--define(wxMultiChoiceDialog_new_5, 2316).
--define(wxMultiChoiceDialog_GetSelections, 2317).
--define(wxMultiChoiceDialog_SetSelections, 2318).
--define(wxMultiChoiceDialog_destroy, 2319).
--define(wxSingleChoiceDialog_new_0, 2320).
--define(wxSingleChoiceDialog_new_5, 2322).
--define(wxSingleChoiceDialog_GetSelection, 2323).
--define(wxSingleChoiceDialog_GetStringSelection, 2324).
--define(wxSingleChoiceDialog_SetSelection, 2325).
--define(wxSingleChoiceDialog_destroy, 2326).
--define(wxTextEntryDialog_new, 2327).
--define(wxTextEntryDialog_GetValue, 2328).
--define(wxTextEntryDialog_SetValue, 2329).
--define(wxTextEntryDialog_destroy, 2330).
--define(wxPasswordEntryDialog_new, 2331).
--define(wxPasswordEntryDialog_destroy, 2332).
--define(wxFontData_new_0, 2333).
--define(wxFontData_new_1, 2334).
--define(wxFontData_destruct, 2335).
--define(wxFontData_EnableEffects, 2336).
--define(wxFontData_GetAllowSymbols, 2337).
--define(wxFontData_GetColour, 2338).
--define(wxFontData_GetChosenFont, 2339).
--define(wxFontData_GetEnableEffects, 2340).
--define(wxFontData_GetInitialFont, 2341).
--define(wxFontData_GetShowHelp, 2342).
--define(wxFontData_SetAllowSymbols, 2343).
--define(wxFontData_SetChosenFont, 2344).
--define(wxFontData_SetColour, 2345).
--define(wxFontData_SetInitialFont, 2346).
--define(wxFontData_SetRange, 2347).
--define(wxFontData_SetShowHelp, 2348).
--define(wxFontDialog_new_0, 2352).
--define(wxFontDialog_new_2, 2354).
--define(wxFontDialog_Create, 2356).
--define(wxFontDialog_GetFontData, 2357).
--define(wxFontDialog_destroy, 2359).
--define(wxProgressDialog_new, 2360).
--define(wxProgressDialog_destruct, 2361).
--define(wxProgressDialog_Resume, 2362).
--define(wxProgressDialog_Update_2, 2363).
--define(wxProgressDialog_Update_0, 2364).
--define(wxMessageDialog_new, 2365).
--define(wxMessageDialog_destruct, 2366).
--define(wxPageSetupDialog_new, 2367).
--define(wxPageSetupDialog_destruct, 2368).
--define(wxPageSetupDialog_GetPageSetupData, 2369).
--define(wxPageSetupDialog_ShowModal, 2370).
--define(wxPageSetupDialogData_new_0, 2371).
--define(wxPageSetupDialogData_new_1_0, 2372).
--define(wxPageSetupDialogData_new_1_1, 2373).
--define(wxPageSetupDialogData_destruct, 2374).
--define(wxPageSetupDialogData_EnableHelp, 2375).
--define(wxPageSetupDialogData_EnableMargins, 2376).
--define(wxPageSetupDialogData_EnableOrientation, 2377).
--define(wxPageSetupDialogData_EnablePaper, 2378).
--define(wxPageSetupDialogData_EnablePrinter, 2379).
--define(wxPageSetupDialogData_GetDefaultMinMargins, 2380).
--define(wxPageSetupDialogData_GetEnableMargins, 2381).
--define(wxPageSetupDialogData_GetEnableOrientation, 2382).
--define(wxPageSetupDialogData_GetEnablePaper, 2383).
--define(wxPageSetupDialogData_GetEnablePrinter, 2384).
--define(wxPageSetupDialogData_GetEnableHelp, 2385).
--define(wxPageSetupDialogData_GetDefaultInfo, 2386).
--define(wxPageSetupDialogData_GetMarginTopLeft, 2387).
--define(wxPageSetupDialogData_GetMarginBottomRight, 2388).
--define(wxPageSetupDialogData_GetMinMarginTopLeft, 2389).
--define(wxPageSetupDialogData_GetMinMarginBottomRight, 2390).
--define(wxPageSetupDialogData_GetPaperId, 2391).
--define(wxPageSetupDialogData_GetPaperSize, 2392).
--define(wxPageSetupDialogData_GetPrintData, 2394).
--define(wxPageSetupDialogData_IsOk, 2395).
--define(wxPageSetupDialogData_SetDefaultInfo, 2396).
--define(wxPageSetupDialogData_SetDefaultMinMargins, 2397).
--define(wxPageSetupDialogData_SetMarginTopLeft, 2398).
--define(wxPageSetupDialogData_SetMarginBottomRight, 2399).
--define(wxPageSetupDialogData_SetMinMarginTopLeft, 2400).
--define(wxPageSetupDialogData_SetMinMarginBottomRight, 2401).
--define(wxPageSetupDialogData_SetPaperId, 2402).
--define(wxPageSetupDialogData_SetPaperSize_1_1, 2403).
--define(wxPageSetupDialogData_SetPaperSize_1_0, 2404).
--define(wxPageSetupDialogData_SetPrintData, 2405).
--define(wxPrintDialog_new_2_0, 2406).
--define(wxPrintDialog_new_2_1, 2407).
--define(wxPrintDialog_destruct, 2408).
--define(wxPrintDialog_GetPrintDialogData, 2409).
--define(wxPrintDialog_GetPrintDC, 2410).
--define(wxPrintDialogData_new_0, 2411).
--define(wxPrintDialogData_new_1_1, 2412).
--define(wxPrintDialogData_new_1_0, 2413).
--define(wxPrintDialogData_destruct, 2414).
--define(wxPrintDialogData_EnableHelp, 2415).
--define(wxPrintDialogData_EnablePageNumbers, 2416).
--define(wxPrintDialogData_EnablePrintToFile, 2417).
--define(wxPrintDialogData_EnableSelection, 2418).
--define(wxPrintDialogData_GetAllPages, 2419).
--define(wxPrintDialogData_GetCollate, 2420).
--define(wxPrintDialogData_GetFromPage, 2421).
--define(wxPrintDialogData_GetMaxPage, 2422).
--define(wxPrintDialogData_GetMinPage, 2423).
--define(wxPrintDialogData_GetNoCopies, 2424).
--define(wxPrintDialogData_GetPrintData, 2425).
--define(wxPrintDialogData_GetPrintToFile, 2426).
--define(wxPrintDialogData_GetSelection, 2427).
--define(wxPrintDialogData_GetToPage, 2428).
--define(wxPrintDialogData_IsOk, 2429).
--define(wxPrintDialogData_SetCollate, 2430).
--define(wxPrintDialogData_SetFromPage, 2431).
--define(wxPrintDialogData_SetMaxPage, 2432).
--define(wxPrintDialogData_SetMinPage, 2433).
--define(wxPrintDialogData_SetNoCopies, 2434).
--define(wxPrintDialogData_SetPrintData, 2435).
--define(wxPrintDialogData_SetPrintToFile, 2436).
--define(wxPrintDialogData_SetSelection, 2437).
--define(wxPrintDialogData_SetToPage, 2438).
--define(wxPrintData_new_0, 2439).
--define(wxPrintData_new_1, 2440).
--define(wxPrintData_destruct, 2441).
--define(wxPrintData_GetCollate, 2442).
--define(wxPrintData_GetBin, 2443).
--define(wxPrintData_GetColour, 2444).
--define(wxPrintData_GetDuplex, 2445).
--define(wxPrintData_GetNoCopies, 2446).
--define(wxPrintData_GetOrientation, 2447).
--define(wxPrintData_GetPaperId, 2448).
--define(wxPrintData_GetPrinterName, 2449).
--define(wxPrintData_GetQuality, 2450).
--define(wxPrintData_IsOk, 2451).
--define(wxPrintData_SetBin, 2452).
--define(wxPrintData_SetCollate, 2453).
--define(wxPrintData_SetColour, 2454).
--define(wxPrintData_SetDuplex, 2455).
--define(wxPrintData_SetNoCopies, 2456).
--define(wxPrintData_SetOrientation, 2457).
--define(wxPrintData_SetPaperId, 2458).
--define(wxPrintData_SetPrinterName, 2459).
--define(wxPrintData_SetQuality, 2460).
--define(wxPrintPreview_new_2, 2463).
--define(wxPrintPreview_new_3, 2464).
--define(wxPrintPreview_destruct, 2466).
--define(wxPrintPreview_GetCanvas, 2467).
--define(wxPrintPreview_GetCurrentPage, 2468).
--define(wxPrintPreview_GetFrame, 2469).
--define(wxPrintPreview_GetMaxPage, 2470).
--define(wxPrintPreview_GetMinPage, 2471).
--define(wxPrintPreview_GetPrintout, 2472).
--define(wxPrintPreview_GetPrintoutForPrinting, 2473).
--define(wxPrintPreview_IsOk, 2474).
--define(wxPrintPreview_PaintPage, 2475).
--define(wxPrintPreview_Print, 2476).
--define(wxPrintPreview_RenderPage, 2477).
--define(wxPrintPreview_SetCanvas, 2478).
--define(wxPrintPreview_SetCurrentPage, 2479).
--define(wxPrintPreview_SetFrame, 2480).
--define(wxPrintPreview_SetPrintout, 2481).
--define(wxPrintPreview_SetZoom, 2482).
--define(wxPreviewFrame_new, 2483).
--define(wxPreviewFrame_destruct, 2484).
--define(wxPreviewFrame_CreateControlBar, 2485).
--define(wxPreviewFrame_CreateCanvas, 2486).
--define(wxPreviewFrame_Initialize, 2487).
--define(wxPreviewFrame_OnCloseWindow, 2488).
--define(wxPreviewControlBar_new, 2489).
--define(wxPreviewControlBar_destruct, 2490).
--define(wxPreviewControlBar_CreateButtons, 2491).
--define(wxPreviewControlBar_GetPrintPreview, 2492).
--define(wxPreviewControlBar_GetZoomControl, 2493).
--define(wxPreviewControlBar_SetZoomControl, 2494).
--define(wxPrinter_new, 2496).
--define(wxPrinter_CreateAbortWindow, 2497).
--define(wxPrinter_GetAbort, 2498).
--define(wxPrinter_GetLastError, 2499).
--define(wxPrinter_GetPrintDialogData, 2500).
--define(wxPrinter_Print, 2501).
--define(wxPrinter_PrintDialog, 2502).
--define(wxPrinter_ReportError, 2503).
--define(wxPrinter_Setup, 2504).
--define(wxPrinter_destroy, 2505).
--define(wxXmlResource_new_1, 2506).
--define(wxXmlResource_new_2, 2507).
--define(wxXmlResource_destruct, 2508).
--define(wxXmlResource_AttachUnknownControl, 2509).
--define(wxXmlResource_ClearHandlers, 2510).
--define(wxXmlResource_CompareVersion, 2511).
--define(wxXmlResource_Get, 2512).
--define(wxXmlResource_GetFlags, 2513).
--define(wxXmlResource_GetVersion, 2514).
--define(wxXmlResource_GetXRCID, 2515).
--define(wxXmlResource_InitAllHandlers, 2516).
--define(wxXmlResource_Load, 2517).
--define(wxXmlResource_LoadBitmap, 2518).
--define(wxXmlResource_LoadDialog_2, 2519).
--define(wxXmlResource_LoadDialog_3, 2520).
--define(wxXmlResource_LoadFrame_2, 2521).
--define(wxXmlResource_LoadFrame_3, 2522).
--define(wxXmlResource_LoadIcon, 2523).
--define(wxXmlResource_LoadMenu, 2524).
--define(wxXmlResource_LoadMenuBar_2, 2525).
--define(wxXmlResource_LoadMenuBar_1, 2526).
--define(wxXmlResource_LoadPanel_2, 2527).
--define(wxXmlResource_LoadPanel_3, 2528).
--define(wxXmlResource_LoadToolBar, 2529).
--define(wxXmlResource_Set, 2530).
--define(wxXmlResource_SetFlags, 2531).
--define(wxXmlResource_Unload, 2532).
--define(wxXmlResource_xrcctrl, 2533).
--define(wxHtmlEasyPrinting_new, 2534).
--define(wxHtmlEasyPrinting_destruct, 2535).
--define(wxHtmlEasyPrinting_GetPrintData, 2536).
--define(wxHtmlEasyPrinting_GetPageSetupData, 2537).
--define(wxHtmlEasyPrinting_PreviewFile, 2538).
--define(wxHtmlEasyPrinting_PreviewText, 2539).
--define(wxHtmlEasyPrinting_PrintFile, 2540).
--define(wxHtmlEasyPrinting_PrintText, 2541).
--define(wxHtmlEasyPrinting_PageSetup, 2542).
--define(wxHtmlEasyPrinting_SetFonts, 2543).
--define(wxHtmlEasyPrinting_SetHeader, 2544).
--define(wxHtmlEasyPrinting_SetFooter, 2545).
--define(wxGLCanvas_new_2, 2547).
--define(wxGLCanvas_new_3_1, 2548).
--define(wxGLCanvas_new_3_0, 2549).
--define(wxGLCanvas_GetContext, 2550).
--define(wxGLCanvas_SetCurrent, 2552).
--define(wxGLCanvas_SwapBuffers, 2553).
--define(wxGLCanvas_destroy, 2554).
--define(wxAuiManager_new, 2555).
--define(wxAuiManager_destruct, 2556).
--define(wxAuiManager_AddPane_2_1, 2557).
--define(wxAuiManager_AddPane_3, 2558).
--define(wxAuiManager_AddPane_2_0, 2559).
--define(wxAuiManager_DetachPane, 2560).
--define(wxAuiManager_GetAllPanes, 2561).
--define(wxAuiManager_GetArtProvider, 2562).
--define(wxAuiManager_GetDockSizeConstraint, 2563).
--define(wxAuiManager_GetFlags, 2564).
--define(wxAuiManager_GetManagedWindow, 2565).
--define(wxAuiManager_GetManager, 2566).
--define(wxAuiManager_GetPane_1_1, 2567).
--define(wxAuiManager_GetPane_1_0, 2568).
--define(wxAuiManager_HideHint, 2569).
--define(wxAuiManager_InsertPane, 2570).
--define(wxAuiManager_LoadPaneInfo, 2571).
--define(wxAuiManager_LoadPerspective, 2572).
--define(wxAuiManager_SavePaneInfo, 2573).
--define(wxAuiManager_SavePerspective, 2574).
--define(wxAuiManager_SetArtProvider, 2575).
--define(wxAuiManager_SetDockSizeConstraint, 2576).
--define(wxAuiManager_SetFlags, 2577).
--define(wxAuiManager_SetManagedWindow, 2578).
--define(wxAuiManager_ShowHint, 2579).
--define(wxAuiManager_UnInit, 2580).
--define(wxAuiManager_Update, 2581).
--define(wxAuiPaneInfo_new_0, 2582).
--define(wxAuiPaneInfo_new_1, 2583).
--define(wxAuiPaneInfo_destruct, 2584).
--define(wxAuiPaneInfo_BestSize_1, 2585).
--define(wxAuiPaneInfo_BestSize_2, 2586).
--define(wxAuiPaneInfo_Bottom, 2587).
--define(wxAuiPaneInfo_BottomDockable, 2588).
--define(wxAuiPaneInfo_Caption, 2589).
--define(wxAuiPaneInfo_CaptionVisible, 2590).
--define(wxAuiPaneInfo_Centre, 2591).
--define(wxAuiPaneInfo_CentrePane, 2592).
--define(wxAuiPaneInfo_CloseButton, 2593).
--define(wxAuiPaneInfo_DefaultPane, 2594).
--define(wxAuiPaneInfo_DestroyOnClose, 2595).
--define(wxAuiPaneInfo_Direction, 2596).
--define(wxAuiPaneInfo_Dock, 2597).
--define(wxAuiPaneInfo_Dockable, 2598).
--define(wxAuiPaneInfo_Fixed, 2599).
--define(wxAuiPaneInfo_Float, 2600).
--define(wxAuiPaneInfo_Floatable, 2601).
--define(wxAuiPaneInfo_FloatingPosition_1, 2602).
--define(wxAuiPaneInfo_FloatingPosition_2, 2603).
--define(wxAuiPaneInfo_FloatingSize_1, 2604).
--define(wxAuiPaneInfo_FloatingSize_2, 2605).
--define(wxAuiPaneInfo_Gripper, 2606).
--define(wxAuiPaneInfo_GripperTop, 2607).
--define(wxAuiPaneInfo_HasBorder, 2608).
--define(wxAuiPaneInfo_HasCaption, 2609).
--define(wxAuiPaneInfo_HasCloseButton, 2610).
--define(wxAuiPaneInfo_HasFlag, 2611).
--define(wxAuiPaneInfo_HasGripper, 2612).
--define(wxAuiPaneInfo_HasGripperTop, 2613).
--define(wxAuiPaneInfo_HasMaximizeButton, 2614).
--define(wxAuiPaneInfo_HasMinimizeButton, 2615).
--define(wxAuiPaneInfo_HasPinButton, 2616).
--define(wxAuiPaneInfo_Hide, 2617).
--define(wxAuiPaneInfo_IsBottomDockable, 2618).
--define(wxAuiPaneInfo_IsDocked, 2619).
--define(wxAuiPaneInfo_IsFixed, 2620).
--define(wxAuiPaneInfo_IsFloatable, 2621).
--define(wxAuiPaneInfo_IsFloating, 2622).
--define(wxAuiPaneInfo_IsLeftDockable, 2623).
--define(wxAuiPaneInfo_IsMovable, 2624).
--define(wxAuiPaneInfo_IsOk, 2625).
--define(wxAuiPaneInfo_IsResizable, 2626).
--define(wxAuiPaneInfo_IsRightDockable, 2627).
--define(wxAuiPaneInfo_IsShown, 2628).
--define(wxAuiPaneInfo_IsToolbar, 2629).
--define(wxAuiPaneInfo_IsTopDockable, 2630).
--define(wxAuiPaneInfo_Layer, 2631).
--define(wxAuiPaneInfo_Left, 2632).
--define(wxAuiPaneInfo_LeftDockable, 2633).
--define(wxAuiPaneInfo_MaxSize_1, 2634).
--define(wxAuiPaneInfo_MaxSize_2, 2635).
--define(wxAuiPaneInfo_MaximizeButton, 2636).
--define(wxAuiPaneInfo_MinSize_1, 2637).
--define(wxAuiPaneInfo_MinSize_2, 2638).
--define(wxAuiPaneInfo_MinimizeButton, 2639).
--define(wxAuiPaneInfo_Movable, 2640).
--define(wxAuiPaneInfo_Name, 2641).
--define(wxAuiPaneInfo_PaneBorder, 2642).
--define(wxAuiPaneInfo_PinButton, 2643).
--define(wxAuiPaneInfo_Position, 2644).
--define(wxAuiPaneInfo_Resizable, 2645).
--define(wxAuiPaneInfo_Right, 2646).
--define(wxAuiPaneInfo_RightDockable, 2647).
--define(wxAuiPaneInfo_Row, 2648).
--define(wxAuiPaneInfo_SafeSet, 2649).
--define(wxAuiPaneInfo_SetFlag, 2650).
--define(wxAuiPaneInfo_Show, 2651).
--define(wxAuiPaneInfo_ToolbarPane, 2652).
--define(wxAuiPaneInfo_Top, 2653).
--define(wxAuiPaneInfo_TopDockable, 2654).
--define(wxAuiPaneInfo_Window, 2655).
--define(wxAuiPaneInfo_GetWindow, 2656).
--define(wxAuiPaneInfo_GetFrame, 2657).
--define(wxAuiPaneInfo_GetDirection, 2658).
--define(wxAuiPaneInfo_GetLayer, 2659).
--define(wxAuiPaneInfo_GetRow, 2660).
--define(wxAuiPaneInfo_GetPosition, 2661).
--define(wxAuiPaneInfo_GetFloatingPosition, 2662).
--define(wxAuiPaneInfo_GetFloatingSize, 2663).
--define(wxAuiNotebook_new_0, 2664).
--define(wxAuiNotebook_new_2, 2665).
--define(wxAuiNotebook_AddPage, 2666).
--define(wxAuiNotebook_Create, 2667).
--define(wxAuiNotebook_DeletePage, 2668).
--define(wxAuiNotebook_GetArtProvider, 2669).
--define(wxAuiNotebook_GetPage, 2670).
--define(wxAuiNotebook_GetPageBitmap, 2671).
--define(wxAuiNotebook_GetPageCount, 2672).
--define(wxAuiNotebook_GetPageIndex, 2673).
--define(wxAuiNotebook_GetPageText, 2674).
--define(wxAuiNotebook_GetSelection, 2675).
--define(wxAuiNotebook_InsertPage, 2676).
--define(wxAuiNotebook_RemovePage, 2677).
--define(wxAuiNotebook_SetArtProvider, 2678).
--define(wxAuiNotebook_SetFont, 2679).
--define(wxAuiNotebook_SetPageBitmap, 2680).
--define(wxAuiNotebook_SetPageText, 2681).
--define(wxAuiNotebook_SetSelection, 2682).
--define(wxAuiNotebook_SetTabCtrlHeight, 2683).
--define(wxAuiNotebook_SetUniformBitmapSize, 2684).
--define(wxAuiNotebook_destroy, 2685).
--define(wxAuiTabArt_SetFlags, 2686).
--define(wxAuiTabArt_SetMeasuringFont, 2687).
--define(wxAuiTabArt_SetNormalFont, 2688).
--define(wxAuiTabArt_SetSelectedFont, 2689).
--define(wxAuiTabArt_SetColour, 2690).
--define(wxAuiTabArt_SetActiveColour, 2691).
--define(wxAuiDockArt_GetColour, 2692).
--define(wxAuiDockArt_GetFont, 2693).
--define(wxAuiDockArt_GetMetric, 2694).
--define(wxAuiDockArt_SetColour, 2695).
--define(wxAuiDockArt_SetFont, 2696).
--define(wxAuiDockArt_SetMetric, 2697).
--define(wxAuiSimpleTabArt_new, 2698).
--define(wxAuiSimpleTabArt_destroy, 2699).
--define(wxMDIParentFrame_new_0, 2700).
--define(wxMDIParentFrame_new_4, 2701).
--define(wxMDIParentFrame_destruct, 2702).
--define(wxMDIParentFrame_ActivateNext, 2703).
--define(wxMDIParentFrame_ActivatePrevious, 2704).
--define(wxMDIParentFrame_ArrangeIcons, 2705).
--define(wxMDIParentFrame_Cascade, 2706).
--define(wxMDIParentFrame_Create, 2707).
--define(wxMDIParentFrame_GetActiveChild, 2708).
--define(wxMDIParentFrame_GetClientWindow, 2709).
--define(wxMDIParentFrame_Tile, 2710).
--define(wxMDIChildFrame_new_0, 2711).
--define(wxMDIChildFrame_new_4, 2712).
--define(wxMDIChildFrame_destruct, 2713).
--define(wxMDIChildFrame_Activate, 2714).
--define(wxMDIChildFrame_Create, 2715).
--define(wxMDIChildFrame_Maximize, 2716).
--define(wxMDIChildFrame_Restore, 2717).
--define(wxMDIClientWindow_new_0, 2718).
--define(wxMDIClientWindow_new_2, 2719).
--define(wxMDIClientWindow_destruct, 2720).
--define(wxMDIClientWindow_CreateClient, 2721).
--define(wxLayoutAlgorithm_new, 2722).
--define(wxLayoutAlgorithm_LayoutFrame, 2723).
--define(wxLayoutAlgorithm_LayoutMDIFrame, 2724).
--define(wxLayoutAlgorithm_LayoutWindow, 2725).
--define(wxLayoutAlgorithm_destroy, 2726).
--define(wxEvent_GetId, 2727).
--define(wxEvent_GetSkipped, 2728).
--define(wxEvent_GetTimestamp, 2729).
--define(wxEvent_IsCommandEvent, 2730).
--define(wxEvent_ResumePropagation, 2731).
--define(wxEvent_ShouldPropagate, 2732).
--define(wxEvent_Skip, 2733).
--define(wxEvent_StopPropagation, 2734).
--define(wxCommandEvent_getClientData, 2735).
--define(wxCommandEvent_GetExtraLong, 2736).
--define(wxCommandEvent_GetInt, 2737).
--define(wxCommandEvent_GetSelection, 2738).
--define(wxCommandEvent_GetString, 2739).
--define(wxCommandEvent_IsChecked, 2740).
--define(wxCommandEvent_IsSelection, 2741).
--define(wxCommandEvent_SetInt, 2742).
--define(wxCommandEvent_SetString, 2743).
--define(wxScrollEvent_GetOrientation, 2744).
--define(wxScrollEvent_GetPosition, 2745).
--define(wxScrollWinEvent_GetOrientation, 2746).
--define(wxScrollWinEvent_GetPosition, 2747).
--define(wxMouseEvent_AltDown, 2748).
--define(wxMouseEvent_Button, 2749).
--define(wxMouseEvent_ButtonDClick, 2750).
--define(wxMouseEvent_ButtonDown, 2751).
--define(wxMouseEvent_ButtonUp, 2752).
--define(wxMouseEvent_CmdDown, 2753).
--define(wxMouseEvent_ControlDown, 2754).
--define(wxMouseEvent_Dragging, 2755).
--define(wxMouseEvent_Entering, 2756).
--define(wxMouseEvent_GetButton, 2757).
--define(wxMouseEvent_GetPosition, 2760).
--define(wxMouseEvent_GetLogicalPosition, 2761).
--define(wxMouseEvent_GetLinesPerAction, 2762).
--define(wxMouseEvent_GetWheelRotation, 2763).
--define(wxMouseEvent_GetWheelDelta, 2764).
--define(wxMouseEvent_GetX, 2765).
--define(wxMouseEvent_GetY, 2766).
--define(wxMouseEvent_IsButton, 2767).
--define(wxMouseEvent_IsPageScroll, 2768).
--define(wxMouseEvent_Leaving, 2769).
--define(wxMouseEvent_LeftDClick, 2770).
--define(wxMouseEvent_LeftDown, 2771).
--define(wxMouseEvent_LeftIsDown, 2772).
--define(wxMouseEvent_LeftUp, 2773).
--define(wxMouseEvent_MetaDown, 2774).
--define(wxMouseEvent_MiddleDClick, 2775).
--define(wxMouseEvent_MiddleDown, 2776).
--define(wxMouseEvent_MiddleIsDown, 2777).
--define(wxMouseEvent_MiddleUp, 2778).
--define(wxMouseEvent_Moving, 2779).
--define(wxMouseEvent_RightDClick, 2780).
--define(wxMouseEvent_RightDown, 2781).
--define(wxMouseEvent_RightIsDown, 2782).
--define(wxMouseEvent_RightUp, 2783).
--define(wxMouseEvent_ShiftDown, 2784).
--define(wxSetCursorEvent_GetCursor, 2785).
--define(wxSetCursorEvent_GetX, 2786).
--define(wxSetCursorEvent_GetY, 2787).
--define(wxSetCursorEvent_HasCursor, 2788).
--define(wxSetCursorEvent_SetCursor, 2789).
--define(wxKeyEvent_AltDown, 2790).
--define(wxKeyEvent_CmdDown, 2791).
--define(wxKeyEvent_ControlDown, 2792).
--define(wxKeyEvent_GetKeyCode, 2793).
--define(wxKeyEvent_GetModifiers, 2794).
--define(wxKeyEvent_GetPosition, 2797).
--define(wxKeyEvent_GetRawKeyCode, 2798).
--define(wxKeyEvent_GetRawKeyFlags, 2799).
--define(wxKeyEvent_GetUnicodeKey, 2800).
--define(wxKeyEvent_GetX, 2801).
--define(wxKeyEvent_GetY, 2802).
--define(wxKeyEvent_HasModifiers, 2803).
--define(wxKeyEvent_MetaDown, 2804).
--define(wxKeyEvent_ShiftDown, 2805).
--define(wxSizeEvent_GetSize, 2806).
--define(wxMoveEvent_GetPosition, 2807).
--define(wxEraseEvent_GetDC, 2808).
--define(wxFocusEvent_GetWindow, 2809).
--define(wxChildFocusEvent_GetWindow, 2810).
--define(wxMenuEvent_GetMenu, 2811).
--define(wxMenuEvent_GetMenuId, 2812).
--define(wxMenuEvent_IsPopup, 2813).
--define(wxCloseEvent_CanVeto, 2814).
--define(wxCloseEvent_GetLoggingOff, 2815).
--define(wxCloseEvent_SetCanVeto, 2816).
--define(wxCloseEvent_SetLoggingOff, 2817).
--define(wxCloseEvent_Veto, 2818).
--define(wxShowEvent_SetShow, 2819).
--define(wxShowEvent_GetShow, 2820).
--define(wxIconizeEvent_Iconized, 2821).
--define(wxJoystickEvent_ButtonDown, 2822).
--define(wxJoystickEvent_ButtonIsDown, 2823).
--define(wxJoystickEvent_ButtonUp, 2824).
--define(wxJoystickEvent_GetButtonChange, 2825).
--define(wxJoystickEvent_GetButtonState, 2826).
--define(wxJoystickEvent_GetJoystick, 2827).
--define(wxJoystickEvent_GetPosition, 2828).
--define(wxJoystickEvent_GetZPosition, 2829).
--define(wxJoystickEvent_IsButton, 2830).
--define(wxJoystickEvent_IsMove, 2831).
--define(wxJoystickEvent_IsZMove, 2832).
--define(wxUpdateUIEvent_CanUpdate, 2833).
--define(wxUpdateUIEvent_Check, 2834).
--define(wxUpdateUIEvent_Enable, 2835).
--define(wxUpdateUIEvent_Show, 2836).
--define(wxUpdateUIEvent_GetChecked, 2837).
--define(wxUpdateUIEvent_GetEnabled, 2838).
--define(wxUpdateUIEvent_GetShown, 2839).
--define(wxUpdateUIEvent_GetSetChecked, 2840).
--define(wxUpdateUIEvent_GetSetEnabled, 2841).
--define(wxUpdateUIEvent_GetSetShown, 2842).
--define(wxUpdateUIEvent_GetSetText, 2843).
--define(wxUpdateUIEvent_GetText, 2844).
--define(wxUpdateUIEvent_GetMode, 2845).
--define(wxUpdateUIEvent_GetUpdateInterval, 2846).
--define(wxUpdateUIEvent_ResetUpdateTime, 2847).
--define(wxUpdateUIEvent_SetMode, 2848).
--define(wxUpdateUIEvent_SetText, 2849).
--define(wxUpdateUIEvent_SetUpdateInterval, 2850).
--define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2851).
--define(wxPaletteChangedEvent_SetChangedWindow, 2852).
--define(wxPaletteChangedEvent_GetChangedWindow, 2853).
--define(wxQueryNewPaletteEvent_SetPaletteRealized, 2854).
--define(wxQueryNewPaletteEvent_GetPaletteRealized, 2855).
--define(wxNavigationKeyEvent_GetDirection, 2856).
--define(wxNavigationKeyEvent_SetDirection, 2857).
--define(wxNavigationKeyEvent_IsWindowChange, 2858).
--define(wxNavigationKeyEvent_SetWindowChange, 2859).
--define(wxNavigationKeyEvent_IsFromTab, 2860).
--define(wxNavigationKeyEvent_SetFromTab, 2861).
--define(wxNavigationKeyEvent_GetCurrentFocus, 2862).
--define(wxNavigationKeyEvent_SetCurrentFocus, 2863).
--define(wxHelpEvent_GetOrigin, 2864).
--define(wxHelpEvent_GetPosition, 2865).
--define(wxHelpEvent_SetOrigin, 2866).
--define(wxHelpEvent_SetPosition, 2867).
--define(wxContextMenuEvent_GetPosition, 2868).
--define(wxContextMenuEvent_SetPosition, 2869).
--define(wxIdleEvent_CanSend, 2870).
--define(wxIdleEvent_GetMode, 2871).
--define(wxIdleEvent_RequestMore, 2872).
--define(wxIdleEvent_MoreRequested, 2873).
--define(wxIdleEvent_SetMode, 2874).
--define(wxGridEvent_AltDown, 2875).
--define(wxGridEvent_ControlDown, 2876).
--define(wxGridEvent_GetCol, 2877).
--define(wxGridEvent_GetPosition, 2878).
--define(wxGridEvent_GetRow, 2879).
--define(wxGridEvent_MetaDown, 2880).
--define(wxGridEvent_Selecting, 2881).
--define(wxGridEvent_ShiftDown, 2882).
--define(wxNotifyEvent_Allow, 2883).
--define(wxNotifyEvent_IsAllowed, 2884).
--define(wxNotifyEvent_Veto, 2885).
--define(wxSashEvent_GetEdge, 2886).
--define(wxSashEvent_GetDragRect, 2887).
--define(wxSashEvent_GetDragStatus, 2888).
--define(wxListEvent_GetCacheFrom, 2889).
--define(wxListEvent_GetCacheTo, 2890).
--define(wxListEvent_GetKeyCode, 2891).
--define(wxListEvent_GetIndex, 2892).
--define(wxListEvent_GetColumn, 2893).
--define(wxListEvent_GetPoint, 2894).
--define(wxListEvent_GetLabel, 2895).
--define(wxListEvent_GetText, 2896).
--define(wxListEvent_GetImage, 2897).
--define(wxListEvent_GetData, 2898).
--define(wxListEvent_GetMask, 2899).
--define(wxListEvent_GetItem, 2900).
--define(wxListEvent_IsEditCancelled, 2901).
--define(wxDateEvent_GetDate, 2902).
--define(wxCalendarEvent_GetWeekDay, 2903).
--define(wxFileDirPickerEvent_GetPath, 2904).
--define(wxColourPickerEvent_GetColour, 2905).
--define(wxFontPickerEvent_GetFont, 2906).
--define(wxStyledTextEvent_GetPosition, 2907).
--define(wxStyledTextEvent_GetKey, 2908).
--define(wxStyledTextEvent_GetModifiers, 2909).
--define(wxStyledTextEvent_GetModificationType, 2910).
--define(wxStyledTextEvent_GetText, 2911).
--define(wxStyledTextEvent_GetLength, 2912).
--define(wxStyledTextEvent_GetLinesAdded, 2913).
--define(wxStyledTextEvent_GetLine, 2914).
--define(wxStyledTextEvent_GetFoldLevelNow, 2915).
--define(wxStyledTextEvent_GetFoldLevelPrev, 2916).
--define(wxStyledTextEvent_GetMargin, 2917).
--define(wxStyledTextEvent_GetMessage, 2918).
--define(wxStyledTextEvent_GetWParam, 2919).
--define(wxStyledTextEvent_GetLParam, 2920).
--define(wxStyledTextEvent_GetListType, 2921).
--define(wxStyledTextEvent_GetX, 2922).
--define(wxStyledTextEvent_GetY, 2923).
--define(wxStyledTextEvent_GetDragText, 2924).
--define(wxStyledTextEvent_GetDragAllowMove, 2925).
--define(wxStyledTextEvent_GetDragResult, 2926).
--define(wxStyledTextEvent_GetShift, 2927).
--define(wxStyledTextEvent_GetControl, 2928).
--define(wxStyledTextEvent_GetAlt, 2929).
--define(utils_wxGetKeyState, 2930).
--define(utils_wxGetMousePosition, 2931).
--define(utils_wxGetMouseState, 2932).
--define(utils_wxSetDetectableAutoRepeat, 2933).
--define(utils_wxBell, 2934).
--define(utils_wxFindMenuItemId, 2935).
--define(utils_wxGenericFindWindowAtPoint, 2936).
--define(utils_wxFindWindowAtPoint, 2937).
--define(utils_wxBeginBusyCursor, 2938).
--define(utils_wxEndBusyCursor, 2939).
--define(utils_wxIsBusy, 2940).
--define(utils_wxShutdown, 2941).
--define(utils_wxShell, 2942).
--define(utils_wxLaunchDefaultBrowser, 2943).
--define(utils_wxGetEmailAddress, 2944).
--define(utils_wxGetUserId, 2945).
--define(utils_wxGetHomeDir, 2946).
--define(utils_wxNewId, 2947).
--define(utils_wxRegisterId, 2948).
--define(utils_wxGetCurrentId, 2949).
--define(utils_wxGetOsDescription, 2950).
--define(utils_wxIsPlatformLittleEndian, 2951).
--define(utils_wxIsPlatform64Bit, 2952).
--define(gdicmn_wxDisplaySize, 2953).
--define(gdicmn_wxSetCursor, 2954).
--define(wxPrintout_new, 2955).
--define(wxPrintout_destruct, 2956).
--define(wxPrintout_GetDC, 2957).
--define(wxPrintout_GetPageSizeMM, 2958).
--define(wxPrintout_GetPageSizePixels, 2959).
--define(wxPrintout_GetPaperRectPixels, 2960).
--define(wxPrintout_GetPPIPrinter, 2961).
--define(wxPrintout_GetPPIScreen, 2962).
--define(wxPrintout_GetTitle, 2963).
--define(wxPrintout_IsPreview, 2964).
--define(wxPrintout_FitThisSizeToPaper, 2965).
--define(wxPrintout_FitThisSizeToPage, 2966).
--define(wxPrintout_FitThisSizeToPageMargins, 2967).
--define(wxPrintout_MapScreenSizeToPaper, 2968).
--define(wxPrintout_MapScreenSizeToPage, 2969).
--define(wxPrintout_MapScreenSizeToPageMargins, 2970).
--define(wxPrintout_MapScreenSizeToDevice, 2971).
--define(wxPrintout_GetLogicalPaperRect, 2972).
--define(wxPrintout_GetLogicalPageRect, 2973).
--define(wxPrintout_GetLogicalPageMarginsRect, 2974).
--define(wxPrintout_SetLogicalOrigin, 2975).
--define(wxPrintout_OffsetLogicalOrigin, 2976).
--define(wxStyledTextCtrl_new_2, 2977).
--define(wxStyledTextCtrl_new_0, 2978).
--define(wxStyledTextCtrl_destruct, 2979).
--define(wxStyledTextCtrl_Create, 2980).
--define(wxStyledTextCtrl_AddText, 2981).
--define(wxStyledTextCtrl_AddStyledText, 2982).
--define(wxStyledTextCtrl_InsertText, 2983).
--define(wxStyledTextCtrl_ClearAll, 2984).
--define(wxStyledTextCtrl_ClearDocumentStyle, 2985).
--define(wxStyledTextCtrl_GetLength, 2986).
--define(wxStyledTextCtrl_GetCharAt, 2987).
--define(wxStyledTextCtrl_GetCurrentPos, 2988).
--define(wxStyledTextCtrl_GetAnchor, 2989).
--define(wxStyledTextCtrl_GetStyleAt, 2990).
--define(wxStyledTextCtrl_Redo, 2991).
--define(wxStyledTextCtrl_SetUndoCollection, 2992).
--define(wxStyledTextCtrl_SelectAll, 2993).
--define(wxStyledTextCtrl_SetSavePoint, 2994).
--define(wxStyledTextCtrl_GetStyledText, 2995).
--define(wxStyledTextCtrl_CanRedo, 2996).
--define(wxStyledTextCtrl_MarkerLineFromHandle, 2997).
--define(wxStyledTextCtrl_MarkerDeleteHandle, 2998).
--define(wxStyledTextCtrl_GetUndoCollection, 2999).
--define(wxStyledTextCtrl_GetViewWhiteSpace, 3000).
--define(wxStyledTextCtrl_SetViewWhiteSpace, 3001).
--define(wxStyledTextCtrl_PositionFromPoint, 3002).
--define(wxStyledTextCtrl_PositionFromPointClose, 3003).
--define(wxStyledTextCtrl_GotoLine, 3004).
--define(wxStyledTextCtrl_GotoPos, 3005).
--define(wxStyledTextCtrl_SetAnchor, 3006).
--define(wxStyledTextCtrl_GetCurLine, 3007).
--define(wxStyledTextCtrl_GetEndStyled, 3008).
--define(wxStyledTextCtrl_ConvertEOLs, 3009).
--define(wxStyledTextCtrl_GetEOLMode, 3010).
--define(wxStyledTextCtrl_SetEOLMode, 3011).
--define(wxStyledTextCtrl_StartStyling, 3012).
--define(wxStyledTextCtrl_SetStyling, 3013).
--define(wxStyledTextCtrl_GetBufferedDraw, 3014).
--define(wxStyledTextCtrl_SetBufferedDraw, 3015).
--define(wxStyledTextCtrl_SetTabWidth, 3016).
--define(wxStyledTextCtrl_GetTabWidth, 3017).
--define(wxStyledTextCtrl_SetCodePage, 3018).
--define(wxStyledTextCtrl_MarkerDefine, 3019).
--define(wxStyledTextCtrl_MarkerSetForeground, 3020).
--define(wxStyledTextCtrl_MarkerSetBackground, 3021).
--define(wxStyledTextCtrl_MarkerAdd, 3022).
--define(wxStyledTextCtrl_MarkerDelete, 3023).
--define(wxStyledTextCtrl_MarkerDeleteAll, 3024).
--define(wxStyledTextCtrl_MarkerGet, 3025).
--define(wxStyledTextCtrl_MarkerNext, 3026).
--define(wxStyledTextCtrl_MarkerPrevious, 3027).
--define(wxStyledTextCtrl_MarkerDefineBitmap, 3028).
--define(wxStyledTextCtrl_MarkerAddSet, 3029).
--define(wxStyledTextCtrl_MarkerSetAlpha, 3030).
--define(wxStyledTextCtrl_SetMarginType, 3031).
--define(wxStyledTextCtrl_GetMarginType, 3032).
--define(wxStyledTextCtrl_SetMarginWidth, 3033).
--define(wxStyledTextCtrl_GetMarginWidth, 3034).
--define(wxStyledTextCtrl_SetMarginMask, 3035).
--define(wxStyledTextCtrl_GetMarginMask, 3036).
--define(wxStyledTextCtrl_SetMarginSensitive, 3037).
--define(wxStyledTextCtrl_GetMarginSensitive, 3038).
--define(wxStyledTextCtrl_StyleClearAll, 3039).
--define(wxStyledTextCtrl_StyleSetForeground, 3040).
--define(wxStyledTextCtrl_StyleSetBackground, 3041).
--define(wxStyledTextCtrl_StyleSetBold, 3042).
--define(wxStyledTextCtrl_StyleSetItalic, 3043).
--define(wxStyledTextCtrl_StyleSetSize, 3044).
--define(wxStyledTextCtrl_StyleSetFaceName, 3045).
--define(wxStyledTextCtrl_StyleSetEOLFilled, 3046).
--define(wxStyledTextCtrl_StyleResetDefault, 3047).
--define(wxStyledTextCtrl_StyleSetUnderline, 3048).
--define(wxStyledTextCtrl_StyleSetCase, 3049).
--define(wxStyledTextCtrl_StyleSetHotSpot, 3050).
--define(wxStyledTextCtrl_SetSelForeground, 3051).
--define(wxStyledTextCtrl_SetSelBackground, 3052).
--define(wxStyledTextCtrl_GetSelAlpha, 3053).
--define(wxStyledTextCtrl_SetSelAlpha, 3054).
--define(wxStyledTextCtrl_SetCaretForeground, 3055).
--define(wxStyledTextCtrl_CmdKeyAssign, 3056).
--define(wxStyledTextCtrl_CmdKeyClear, 3057).
--define(wxStyledTextCtrl_CmdKeyClearAll, 3058).
--define(wxStyledTextCtrl_SetStyleBytes, 3059).
--define(wxStyledTextCtrl_StyleSetVisible, 3060).
--define(wxStyledTextCtrl_GetCaretPeriod, 3061).
--define(wxStyledTextCtrl_SetCaretPeriod, 3062).
--define(wxStyledTextCtrl_SetWordChars, 3063).
--define(wxStyledTextCtrl_BeginUndoAction, 3064).
--define(wxStyledTextCtrl_EndUndoAction, 3065).
--define(wxStyledTextCtrl_IndicatorSetStyle, 3066).
--define(wxStyledTextCtrl_IndicatorGetStyle, 3067).
--define(wxStyledTextCtrl_IndicatorSetForeground, 3068).
--define(wxStyledTextCtrl_IndicatorGetForeground, 3069).
--define(wxStyledTextCtrl_SetWhitespaceForeground, 3070).
--define(wxStyledTextCtrl_SetWhitespaceBackground, 3071).
--define(wxStyledTextCtrl_GetStyleBits, 3072).
--define(wxStyledTextCtrl_SetLineState, 3073).
--define(wxStyledTextCtrl_GetLineState, 3074).
--define(wxStyledTextCtrl_GetMaxLineState, 3075).
--define(wxStyledTextCtrl_GetCaretLineVisible, 3076).
--define(wxStyledTextCtrl_SetCaretLineVisible, 3077).
--define(wxStyledTextCtrl_GetCaretLineBackground, 3078).
--define(wxStyledTextCtrl_SetCaretLineBackground, 3079).
--define(wxStyledTextCtrl_AutoCompShow, 3080).
--define(wxStyledTextCtrl_AutoCompCancel, 3081).
--define(wxStyledTextCtrl_AutoCompActive, 3082).
--define(wxStyledTextCtrl_AutoCompPosStart, 3083).
--define(wxStyledTextCtrl_AutoCompComplete, 3084).
--define(wxStyledTextCtrl_AutoCompStops, 3085).
--define(wxStyledTextCtrl_AutoCompSetSeparator, 3086).
--define(wxStyledTextCtrl_AutoCompGetSeparator, 3087).
--define(wxStyledTextCtrl_AutoCompSelect, 3088).
--define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3089).
--define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3090).
--define(wxStyledTextCtrl_AutoCompSetFillUps, 3091).
--define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3092).
--define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3093).
--define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3094).
--define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3095).
--define(wxStyledTextCtrl_UserListShow, 3096).
--define(wxStyledTextCtrl_AutoCompSetAutoHide, 3097).
--define(wxStyledTextCtrl_AutoCompGetAutoHide, 3098).
--define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3099).
--define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3100).
--define(wxStyledTextCtrl_RegisterImage, 3101).
--define(wxStyledTextCtrl_ClearRegisteredImages, 3102).
--define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3103).
--define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3104).
--define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3105).
--define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3106).
--define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3107).
--define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3108).
--define(wxStyledTextCtrl_SetIndent, 3109).
--define(wxStyledTextCtrl_GetIndent, 3110).
--define(wxStyledTextCtrl_SetUseTabs, 3111).
--define(wxStyledTextCtrl_GetUseTabs, 3112).
--define(wxStyledTextCtrl_SetLineIndentation, 3113).
--define(wxStyledTextCtrl_GetLineIndentation, 3114).
--define(wxStyledTextCtrl_GetLineIndentPosition, 3115).
--define(wxStyledTextCtrl_GetColumn, 3116).
--define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3117).
--define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3118).
--define(wxStyledTextCtrl_SetIndentationGuides, 3119).
--define(wxStyledTextCtrl_GetIndentationGuides, 3120).
--define(wxStyledTextCtrl_SetHighlightGuide, 3121).
--define(wxStyledTextCtrl_GetHighlightGuide, 3122).
--define(wxStyledTextCtrl_GetLineEndPosition, 3123).
--define(wxStyledTextCtrl_GetCodePage, 3124).
--define(wxStyledTextCtrl_GetCaretForeground, 3125).
--define(wxStyledTextCtrl_GetReadOnly, 3126).
--define(wxStyledTextCtrl_SetCurrentPos, 3127).
--define(wxStyledTextCtrl_SetSelectionStart, 3128).
--define(wxStyledTextCtrl_GetSelectionStart, 3129).
--define(wxStyledTextCtrl_SetSelectionEnd, 3130).
--define(wxStyledTextCtrl_GetSelectionEnd, 3131).
--define(wxStyledTextCtrl_SetPrintMagnification, 3132).
--define(wxStyledTextCtrl_GetPrintMagnification, 3133).
--define(wxStyledTextCtrl_SetPrintColourMode, 3134).
--define(wxStyledTextCtrl_GetPrintColourMode, 3135).
--define(wxStyledTextCtrl_FindText, 3136).
--define(wxStyledTextCtrl_FormatRange, 3137).
--define(wxStyledTextCtrl_GetFirstVisibleLine, 3138).
--define(wxStyledTextCtrl_GetLine, 3139).
--define(wxStyledTextCtrl_GetLineCount, 3140).
--define(wxStyledTextCtrl_SetMarginLeft, 3141).
--define(wxStyledTextCtrl_GetMarginLeft, 3142).
--define(wxStyledTextCtrl_SetMarginRight, 3143).
--define(wxStyledTextCtrl_GetMarginRight, 3144).
--define(wxStyledTextCtrl_GetModify, 3145).
--define(wxStyledTextCtrl_SetSelection, 3146).
--define(wxStyledTextCtrl_GetSelectedText, 3147).
--define(wxStyledTextCtrl_GetTextRange, 3148).
--define(wxStyledTextCtrl_HideSelection, 3149).
--define(wxStyledTextCtrl_LineFromPosition, 3150).
--define(wxStyledTextCtrl_PositionFromLine, 3151).
--define(wxStyledTextCtrl_LineScroll, 3152).
--define(wxStyledTextCtrl_EnsureCaretVisible, 3153).
--define(wxStyledTextCtrl_ReplaceSelection, 3154).
--define(wxStyledTextCtrl_SetReadOnly, 3155).
--define(wxStyledTextCtrl_CanPaste, 3156).
--define(wxStyledTextCtrl_CanUndo, 3157).
--define(wxStyledTextCtrl_EmptyUndoBuffer, 3158).
--define(wxStyledTextCtrl_Undo, 3159).
--define(wxStyledTextCtrl_Cut, 3160).
--define(wxStyledTextCtrl_Copy, 3161).
--define(wxStyledTextCtrl_Paste, 3162).
--define(wxStyledTextCtrl_Clear, 3163).
--define(wxStyledTextCtrl_SetText, 3164).
--define(wxStyledTextCtrl_GetText, 3165).
--define(wxStyledTextCtrl_GetTextLength, 3166).
--define(wxStyledTextCtrl_GetOvertype, 3167).
--define(wxStyledTextCtrl_SetCaretWidth, 3168).
--define(wxStyledTextCtrl_GetCaretWidth, 3169).
--define(wxStyledTextCtrl_SetTargetStart, 3170).
--define(wxStyledTextCtrl_GetTargetStart, 3171).
--define(wxStyledTextCtrl_SetTargetEnd, 3172).
--define(wxStyledTextCtrl_GetTargetEnd, 3173).
--define(wxStyledTextCtrl_ReplaceTarget, 3174).
--define(wxStyledTextCtrl_SearchInTarget, 3175).
--define(wxStyledTextCtrl_SetSearchFlags, 3176).
--define(wxStyledTextCtrl_GetSearchFlags, 3177).
--define(wxStyledTextCtrl_CallTipShow, 3178).
--define(wxStyledTextCtrl_CallTipCancel, 3179).
--define(wxStyledTextCtrl_CallTipActive, 3180).
--define(wxStyledTextCtrl_CallTipPosAtStart, 3181).
--define(wxStyledTextCtrl_CallTipSetHighlight, 3182).
--define(wxStyledTextCtrl_CallTipSetBackground, 3183).
--define(wxStyledTextCtrl_CallTipSetForeground, 3184).
--define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3185).
--define(wxStyledTextCtrl_CallTipUseStyle, 3186).
--define(wxStyledTextCtrl_VisibleFromDocLine, 3187).
--define(wxStyledTextCtrl_DocLineFromVisible, 3188).
--define(wxStyledTextCtrl_WrapCount, 3189).
--define(wxStyledTextCtrl_SetFoldLevel, 3190).
--define(wxStyledTextCtrl_GetFoldLevel, 3191).
--define(wxStyledTextCtrl_GetLastChild, 3192).
--define(wxStyledTextCtrl_GetFoldParent, 3193).
--define(wxStyledTextCtrl_ShowLines, 3194).
--define(wxStyledTextCtrl_HideLines, 3195).
--define(wxStyledTextCtrl_GetLineVisible, 3196).
--define(wxStyledTextCtrl_SetFoldExpanded, 3197).
--define(wxStyledTextCtrl_GetFoldExpanded, 3198).
--define(wxStyledTextCtrl_ToggleFold, 3199).
--define(wxStyledTextCtrl_EnsureVisible, 3200).
--define(wxStyledTextCtrl_SetFoldFlags, 3201).
--define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3202).
--define(wxStyledTextCtrl_SetTabIndents, 3203).
--define(wxStyledTextCtrl_GetTabIndents, 3204).
--define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3205).
--define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3206).
--define(wxStyledTextCtrl_SetMouseDwellTime, 3207).
--define(wxStyledTextCtrl_GetMouseDwellTime, 3208).
--define(wxStyledTextCtrl_WordStartPosition, 3209).
--define(wxStyledTextCtrl_WordEndPosition, 3210).
--define(wxStyledTextCtrl_SetWrapMode, 3211).
--define(wxStyledTextCtrl_GetWrapMode, 3212).
--define(wxStyledTextCtrl_SetWrapVisualFlags, 3213).
--define(wxStyledTextCtrl_GetWrapVisualFlags, 3214).
--define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3215).
--define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3216).
--define(wxStyledTextCtrl_SetWrapStartIndent, 3217).
--define(wxStyledTextCtrl_GetWrapStartIndent, 3218).
--define(wxStyledTextCtrl_SetLayoutCache, 3219).
--define(wxStyledTextCtrl_GetLayoutCache, 3220).
--define(wxStyledTextCtrl_SetScrollWidth, 3221).
--define(wxStyledTextCtrl_GetScrollWidth, 3222).
--define(wxStyledTextCtrl_TextWidth, 3223).
--define(wxStyledTextCtrl_GetEndAtLastLine, 3224).
--define(wxStyledTextCtrl_TextHeight, 3225).
--define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3226).
--define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3227).
--define(wxStyledTextCtrl_AppendText, 3228).
--define(wxStyledTextCtrl_GetTwoPhaseDraw, 3229).
--define(wxStyledTextCtrl_SetTwoPhaseDraw, 3230).
--define(wxStyledTextCtrl_TargetFromSelection, 3231).
--define(wxStyledTextCtrl_LinesJoin, 3232).
--define(wxStyledTextCtrl_LinesSplit, 3233).
--define(wxStyledTextCtrl_SetFoldMarginColour, 3234).
--define(wxStyledTextCtrl_SetFoldMarginHiColour, 3235).
--define(wxStyledTextCtrl_LineDown, 3236).
--define(wxStyledTextCtrl_LineDownExtend, 3237).
--define(wxStyledTextCtrl_LineUp, 3238).
--define(wxStyledTextCtrl_LineUpExtend, 3239).
--define(wxStyledTextCtrl_CharLeft, 3240).
--define(wxStyledTextCtrl_CharLeftExtend, 3241).
--define(wxStyledTextCtrl_CharRight, 3242).
--define(wxStyledTextCtrl_CharRightExtend, 3243).
--define(wxStyledTextCtrl_WordLeft, 3244).
--define(wxStyledTextCtrl_WordLeftExtend, 3245).
--define(wxStyledTextCtrl_WordRight, 3246).
--define(wxStyledTextCtrl_WordRightExtend, 3247).
--define(wxStyledTextCtrl_Home, 3248).
--define(wxStyledTextCtrl_HomeExtend, 3249).
--define(wxStyledTextCtrl_LineEnd, 3250).
--define(wxStyledTextCtrl_LineEndExtend, 3251).
--define(wxStyledTextCtrl_DocumentStart, 3252).
--define(wxStyledTextCtrl_DocumentStartExtend, 3253).
--define(wxStyledTextCtrl_DocumentEnd, 3254).
--define(wxStyledTextCtrl_DocumentEndExtend, 3255).
--define(wxStyledTextCtrl_PageUp, 3256).
--define(wxStyledTextCtrl_PageUpExtend, 3257).
--define(wxStyledTextCtrl_PageDown, 3258).
--define(wxStyledTextCtrl_PageDownExtend, 3259).
--define(wxStyledTextCtrl_EditToggleOvertype, 3260).
--define(wxStyledTextCtrl_Cancel, 3261).
--define(wxStyledTextCtrl_DeleteBack, 3262).
--define(wxStyledTextCtrl_Tab, 3263).
--define(wxStyledTextCtrl_BackTab, 3264).
--define(wxStyledTextCtrl_NewLine, 3265).
--define(wxStyledTextCtrl_FormFeed, 3266).
--define(wxStyledTextCtrl_VCHome, 3267).
--define(wxStyledTextCtrl_VCHomeExtend, 3268).
--define(wxStyledTextCtrl_ZoomIn, 3269).
--define(wxStyledTextCtrl_ZoomOut, 3270).
--define(wxStyledTextCtrl_DelWordLeft, 3271).
--define(wxStyledTextCtrl_DelWordRight, 3272).
--define(wxStyledTextCtrl_LineCut, 3273).
--define(wxStyledTextCtrl_LineDelete, 3274).
--define(wxStyledTextCtrl_LineTranspose, 3275).
--define(wxStyledTextCtrl_LineDuplicate, 3276).
--define(wxStyledTextCtrl_LowerCase, 3277).
--define(wxStyledTextCtrl_UpperCase, 3278).
--define(wxStyledTextCtrl_LineScrollDown, 3279).
--define(wxStyledTextCtrl_LineScrollUp, 3280).
--define(wxStyledTextCtrl_DeleteBackNotLine, 3281).
--define(wxStyledTextCtrl_HomeDisplay, 3282).
--define(wxStyledTextCtrl_HomeDisplayExtend, 3283).
--define(wxStyledTextCtrl_LineEndDisplay, 3284).
--define(wxStyledTextCtrl_LineEndDisplayExtend, 3285).
--define(wxStyledTextCtrl_HomeWrapExtend, 3286).
--define(wxStyledTextCtrl_LineEndWrap, 3287).
--define(wxStyledTextCtrl_LineEndWrapExtend, 3288).
--define(wxStyledTextCtrl_VCHomeWrap, 3289).
--define(wxStyledTextCtrl_VCHomeWrapExtend, 3290).
--define(wxStyledTextCtrl_LineCopy, 3291).
--define(wxStyledTextCtrl_MoveCaretInsideView, 3292).
--define(wxStyledTextCtrl_LineLength, 3293).
--define(wxStyledTextCtrl_BraceHighlight, 3294).
--define(wxStyledTextCtrl_BraceBadLight, 3295).
--define(wxStyledTextCtrl_BraceMatch, 3296).
--define(wxStyledTextCtrl_GetViewEOL, 3297).
--define(wxStyledTextCtrl_SetViewEOL, 3298).
--define(wxStyledTextCtrl_SetModEventMask, 3299).
--define(wxStyledTextCtrl_GetEdgeColumn, 3300).
--define(wxStyledTextCtrl_SetEdgeColumn, 3301).
--define(wxStyledTextCtrl_SetEdgeMode, 3302).
--define(wxStyledTextCtrl_GetEdgeMode, 3303).
--define(wxStyledTextCtrl_GetEdgeColour, 3304).
--define(wxStyledTextCtrl_SetEdgeColour, 3305).
--define(wxStyledTextCtrl_SearchAnchor, 3306).
--define(wxStyledTextCtrl_SearchNext, 3307).
--define(wxStyledTextCtrl_SearchPrev, 3308).
--define(wxStyledTextCtrl_LinesOnScreen, 3309).
--define(wxStyledTextCtrl_UsePopUp, 3310).
--define(wxStyledTextCtrl_SelectionIsRectangle, 3311).
--define(wxStyledTextCtrl_SetZoom, 3312).
--define(wxStyledTextCtrl_GetZoom, 3313).
--define(wxStyledTextCtrl_GetModEventMask, 3314).
--define(wxStyledTextCtrl_SetSTCFocus, 3315).
--define(wxStyledTextCtrl_GetSTCFocus, 3316).
--define(wxStyledTextCtrl_SetStatus, 3317).
--define(wxStyledTextCtrl_GetStatus, 3318).
--define(wxStyledTextCtrl_SetMouseDownCaptures, 3319).
--define(wxStyledTextCtrl_GetMouseDownCaptures, 3320).
--define(wxStyledTextCtrl_SetSTCCursor, 3321).
--define(wxStyledTextCtrl_GetSTCCursor, 3322).
--define(wxStyledTextCtrl_SetControlCharSymbol, 3323).
--define(wxStyledTextCtrl_GetControlCharSymbol, 3324).
--define(wxStyledTextCtrl_WordPartLeft, 3325).
--define(wxStyledTextCtrl_WordPartLeftExtend, 3326).
--define(wxStyledTextCtrl_WordPartRight, 3327).
--define(wxStyledTextCtrl_WordPartRightExtend, 3328).
--define(wxStyledTextCtrl_SetVisiblePolicy, 3329).
--define(wxStyledTextCtrl_DelLineLeft, 3330).
--define(wxStyledTextCtrl_DelLineRight, 3331).
--define(wxStyledTextCtrl_GetXOffset, 3332).
--define(wxStyledTextCtrl_ChooseCaretX, 3333).
--define(wxStyledTextCtrl_SetXCaretPolicy, 3334).
--define(wxStyledTextCtrl_SetYCaretPolicy, 3335).
--define(wxStyledTextCtrl_GetPrintWrapMode, 3336).
--define(wxStyledTextCtrl_SetHotspotActiveForeground, 3337).
--define(wxStyledTextCtrl_SetHotspotActiveBackground, 3338).
--define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3339).
--define(wxStyledTextCtrl_SetHotspotSingleLine, 3340).
--define(wxStyledTextCtrl_ParaDownExtend, 3341).
--define(wxStyledTextCtrl_ParaUp, 3342).
--define(wxStyledTextCtrl_ParaUpExtend, 3343).
--define(wxStyledTextCtrl_PositionBefore, 3344).
--define(wxStyledTextCtrl_PositionAfter, 3345).
--define(wxStyledTextCtrl_CopyRange, 3346).
--define(wxStyledTextCtrl_CopyText, 3347).
--define(wxStyledTextCtrl_SetSelectionMode, 3348).
--define(wxStyledTextCtrl_GetSelectionMode, 3349).
--define(wxStyledTextCtrl_LineDownRectExtend, 3350).
--define(wxStyledTextCtrl_LineUpRectExtend, 3351).
--define(wxStyledTextCtrl_CharLeftRectExtend, 3352).
--define(wxStyledTextCtrl_CharRightRectExtend, 3353).
--define(wxStyledTextCtrl_HomeRectExtend, 3354).
--define(wxStyledTextCtrl_VCHomeRectExtend, 3355).
--define(wxStyledTextCtrl_LineEndRectExtend, 3356).
--define(wxStyledTextCtrl_PageUpRectExtend, 3357).
--define(wxStyledTextCtrl_PageDownRectExtend, 3358).
--define(wxStyledTextCtrl_StutteredPageUp, 3359).
--define(wxStyledTextCtrl_StutteredPageUpExtend, 3360).
--define(wxStyledTextCtrl_StutteredPageDown, 3361).
--define(wxStyledTextCtrl_StutteredPageDownExtend, 3362).
--define(wxStyledTextCtrl_WordLeftEnd, 3363).
--define(wxStyledTextCtrl_WordLeftEndExtend, 3364).
--define(wxStyledTextCtrl_WordRightEnd, 3365).
--define(wxStyledTextCtrl_WordRightEndExtend, 3366).
--define(wxStyledTextCtrl_SetWhitespaceChars, 3367).
--define(wxStyledTextCtrl_SetCharsDefault, 3368).
--define(wxStyledTextCtrl_AutoCompGetCurrent, 3369).
--define(wxStyledTextCtrl_Allocate, 3370).
--define(wxStyledTextCtrl_FindColumn, 3371).
--define(wxStyledTextCtrl_GetCaretSticky, 3372).
--define(wxStyledTextCtrl_SetCaretSticky, 3373).
--define(wxStyledTextCtrl_ToggleCaretSticky, 3374).
--define(wxStyledTextCtrl_SetPasteConvertEndings, 3375).
--define(wxStyledTextCtrl_GetPasteConvertEndings, 3376).
--define(wxStyledTextCtrl_SelectionDuplicate, 3377).
--define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3378).
--define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3379).
--define(wxStyledTextCtrl_StartRecord, 3380).
--define(wxStyledTextCtrl_StopRecord, 3381).
--define(wxStyledTextCtrl_SetLexer, 3382).
--define(wxStyledTextCtrl_GetLexer, 3383).
--define(wxStyledTextCtrl_Colourise, 3384).
--define(wxStyledTextCtrl_SetProperty, 3385).
--define(wxStyledTextCtrl_SetKeyWords, 3386).
--define(wxStyledTextCtrl_SetLexerLanguage, 3387).
--define(wxStyledTextCtrl_GetProperty, 3388).
--define(wxStyledTextCtrl_GetStyleBitsNeeded, 3389).
--define(wxStyledTextCtrl_GetCurrentLine, 3390).
--define(wxStyledTextCtrl_StyleSetSpec, 3391).
--define(wxStyledTextCtrl_StyleSetFont, 3392).
--define(wxStyledTextCtrl_StyleSetFontAttr, 3393).
--define(wxStyledTextCtrl_StyleSetCharacterSet, 3394).
--define(wxStyledTextCtrl_StyleSetFontEncoding, 3395).
--define(wxStyledTextCtrl_CmdKeyExecute, 3396).
--define(wxStyledTextCtrl_SetMargins, 3397).
--define(wxStyledTextCtrl_GetSelection, 3398).
--define(wxStyledTextCtrl_PointFromPosition, 3399).
--define(wxStyledTextCtrl_ScrollToLine, 3400).
--define(wxStyledTextCtrl_ScrollToColumn, 3401).
--define(wxStyledTextCtrl_SetVScrollBar, 3402).
--define(wxStyledTextCtrl_SetHScrollBar, 3403).
--define(wxStyledTextCtrl_GetLastKeydownProcessed, 3404).
--define(wxStyledTextCtrl_SetLastKeydownProcessed, 3405).
--define(wxStyledTextCtrl_SaveFile, 3406).
--define(wxStyledTextCtrl_LoadFile, 3407).
--define(wxStyledTextCtrl_DoDragOver, 3408).
--define(wxStyledTextCtrl_DoDropText, 3409).
--define(wxStyledTextCtrl_GetUseAntiAliasing, 3410).
--define(wxStyledTextCtrl_AddTextRaw, 3411).
--define(wxStyledTextCtrl_InsertTextRaw, 3412).
--define(wxStyledTextCtrl_GetCurLineRaw, 3413).
--define(wxStyledTextCtrl_GetLineRaw, 3414).
--define(wxStyledTextCtrl_GetSelectedTextRaw, 3415).
--define(wxStyledTextCtrl_GetTextRangeRaw, 3416).
--define(wxStyledTextCtrl_SetTextRaw, 3417).
--define(wxStyledTextCtrl_GetTextRaw, 3418).
--define(wxStyledTextCtrl_AppendTextRaw, 3419).
--define(wxArtProvider_GetBitmap, 3420).
--define(wxArtProvider_GetIcon, 3421).
--define(wxTreeEvent_GetKeyCode, 3422).
--define(wxTreeEvent_GetItem, 3423).
--define(wxTreeEvent_GetKeyEvent, 3424).
--define(wxTreeEvent_GetLabel, 3425).
--define(wxTreeEvent_GetOldItem, 3426).
--define(wxTreeEvent_GetPoint, 3427).
--define(wxTreeEvent_IsEditCancelled, 3428).
--define(wxTreeEvent_SetToolTip, 3429).
--define(wxNotebookEvent_GetOldSelection, 3430).
--define(wxNotebookEvent_GetSelection, 3431).
--define(wxNotebookEvent_SetOldSelection, 3432).
--define(wxNotebookEvent_SetSelection, 3433).
--define(wxFileDataObject_new, 3434).
--define(wxFileDataObject_AddFile, 3435).
--define(wxFileDataObject_GetFilenames, 3436).
--define(wxFileDataObject_destroy, 3437).
--define(wxTextDataObject_new, 3438).
--define(wxTextDataObject_GetTextLength, 3439).
--define(wxTextDataObject_GetText, 3440).
--define(wxTextDataObject_SetText, 3441).
--define(wxTextDataObject_destroy, 3442).
--define(wxBitmapDataObject_new_1_1, 3443).
--define(wxBitmapDataObject_new_1_0, 3444).
--define(wxBitmapDataObject_GetBitmap, 3445).
--define(wxBitmapDataObject_SetBitmap, 3446).
--define(wxBitmapDataObject_destroy, 3447).
--define(wxClipboard_new, 3449).
--define(wxClipboard_destruct, 3450).
--define(wxClipboard_AddData, 3451).
--define(wxClipboard_Clear, 3452).
--define(wxClipboard_Close, 3453).
--define(wxClipboard_Flush, 3454).
--define(wxClipboard_GetData, 3455).
--define(wxClipboard_IsOpened, 3456).
--define(wxClipboard_Open, 3457).
--define(wxClipboard_SetData, 3458).
--define(wxClipboard_UsePrimarySelection, 3460).
--define(wxClipboard_IsSupported, 3461).
--define(wxClipboard_Get, 3462).
--define(wxSpinEvent_GetPosition, 3463).
--define(wxSpinEvent_SetPosition, 3464).
--define(wxSplitterWindow_new_0, 3465).
--define(wxSplitterWindow_new_2, 3466).
--define(wxSplitterWindow_destruct, 3467).
--define(wxSplitterWindow_Create, 3468).
--define(wxSplitterWindow_GetMinimumPaneSize, 3469).
--define(wxSplitterWindow_GetSashGravity, 3470).
--define(wxSplitterWindow_GetSashPosition, 3471).
--define(wxSplitterWindow_GetSplitMode, 3472).
--define(wxSplitterWindow_GetWindow1, 3473).
--define(wxSplitterWindow_GetWindow2, 3474).
--define(wxSplitterWindow_Initialize, 3475).
--define(wxSplitterWindow_IsSplit, 3476).
--define(wxSplitterWindow_ReplaceWindow, 3477).
--define(wxSplitterWindow_SetSashGravity, 3478).
--define(wxSplitterWindow_SetSashPosition, 3479).
--define(wxSplitterWindow_SetSashSize, 3480).
--define(wxSplitterWindow_SetMinimumPaneSize, 3481).
--define(wxSplitterWindow_SetSplitMode, 3482).
--define(wxSplitterWindow_SplitHorizontally, 3483).
--define(wxSplitterWindow_SplitVertically, 3484).
--define(wxSplitterWindow_Unsplit, 3485).
--define(wxSplitterWindow_UpdateSize, 3486).
--define(wxSplitterEvent_GetSashPosition, 3487).
--define(wxSplitterEvent_GetX, 3488).
--define(wxSplitterEvent_GetY, 3489).
--define(wxSplitterEvent_GetWindowBeingRemoved, 3490).
--define(wxSplitterEvent_SetSashPosition, 3491).
--define(wxHtmlWindow_new_0, 3492).
--define(wxHtmlWindow_new_2, 3493).
--define(wxHtmlWindow_AppendToPage, 3494).
--define(wxHtmlWindow_GetOpenedAnchor, 3495).
--define(wxHtmlWindow_GetOpenedPage, 3496).
--define(wxHtmlWindow_GetOpenedPageTitle, 3497).
--define(wxHtmlWindow_GetRelatedFrame, 3498).
--define(wxHtmlWindow_HistoryBack, 3499).
--define(wxHtmlWindow_HistoryCanBack, 3500).
--define(wxHtmlWindow_HistoryCanForward, 3501).
--define(wxHtmlWindow_HistoryClear, 3502).
--define(wxHtmlWindow_HistoryForward, 3503).
--define(wxHtmlWindow_LoadFile, 3504).
--define(wxHtmlWindow_LoadPage, 3505).
--define(wxHtmlWindow_SelectAll, 3506).
--define(wxHtmlWindow_SelectionToText, 3507).
--define(wxHtmlWindow_SelectLine, 3508).
--define(wxHtmlWindow_SelectWord, 3509).
--define(wxHtmlWindow_SetBorders, 3510).
--define(wxHtmlWindow_SetFonts, 3511).
--define(wxHtmlWindow_SetPage, 3512).
--define(wxHtmlWindow_SetRelatedFrame, 3513).
--define(wxHtmlWindow_SetRelatedStatusBar, 3514).
--define(wxHtmlWindow_ToText, 3515).
--define(wxHtmlWindow_destroy, 3516).
--define(wxHtmlLinkEvent_GetLinkInfo, 3517).
--define(wxSystemSettings_GetColour, 3518).
--define(wxSystemSettings_GetFont, 3519).
--define(wxSystemSettings_GetMetric, 3520).
--define(wxSystemSettings_GetScreenType, 3521).
--define(wxSystemOptions_GetOption, 3522).
--define(wxSystemOptions_GetOptionInt, 3523).
--define(wxSystemOptions_HasOption, 3524).
--define(wxSystemOptions_IsFalse, 3525).
--define(wxSystemOptions_SetOption_2_1, 3526).
--define(wxSystemOptions_SetOption_2_0, 3527).
--define(wxAuiNotebookEvent_SetSelection, 3528).
--define(wxAuiNotebookEvent_GetSelection, 3529).
--define(wxAuiNotebookEvent_SetOldSelection, 3530).
--define(wxAuiNotebookEvent_GetOldSelection, 3531).
--define(wxAuiNotebookEvent_SetDragSource, 3532).
--define(wxAuiNotebookEvent_GetDragSource, 3533).
--define(wxAuiManagerEvent_SetManager, 3534).
--define(wxAuiManagerEvent_GetManager, 3535).
--define(wxAuiManagerEvent_SetPane, 3536).
--define(wxAuiManagerEvent_GetPane, 3537).
--define(wxAuiManagerEvent_SetButton, 3538).
--define(wxAuiManagerEvent_GetButton, 3539).
--define(wxAuiManagerEvent_SetDC, 3540).
--define(wxAuiManagerEvent_GetDC, 3541).
--define(wxAuiManagerEvent_Veto, 3542).
--define(wxAuiManagerEvent_GetVeto, 3543).
--define(wxAuiManagerEvent_SetCanVeto, 3544).
--define(wxAuiManagerEvent_CanVeto, 3545).
--define(wxLogNull_new, 3546).
--define(wxLogNull_destroy, 3547).
--define(wxTaskBarIcon_new, 3548).
--define(wxTaskBarIcon_destruct, 3549).
--define(wxTaskBarIcon_PopupMenu, 3550).
--define(wxTaskBarIcon_RemoveIcon, 3551).
--define(wxTaskBarIcon_SetIcon, 3552).
--define(wxLocale_new_0, 3553).
--define(wxLocale_new_2, 3555).
--define(wxLocale_destruct, 3556).
--define(wxLocale_Init, 3558).
--define(wxLocale_AddCatalog_1, 3559).
--define(wxLocale_AddCatalog_3, 3560).
--define(wxLocale_AddCatalogLookupPathPrefix, 3561).
--define(wxLocale_GetCanonicalName, 3562).
--define(wxLocale_GetLanguage, 3563).
--define(wxLocale_GetLanguageName, 3564).
--define(wxLocale_GetLocale, 3565).
--define(wxLocale_GetName, 3566).
--define(wxLocale_GetString_2, 3567).
--define(wxLocale_GetString_4, 3568).
--define(wxLocale_GetHeaderValue, 3569).
--define(wxLocale_GetSysName, 3570).
--define(wxLocale_GetSystemEncoding, 3571).
--define(wxLocale_GetSystemEncodingName, 3572).
--define(wxLocale_GetSystemLanguage, 3573).
--define(wxLocale_IsLoaded, 3574).
--define(wxLocale_IsOk, 3575).
--define(wxActivateEvent_GetActive, 3576).
--define(wxPopupWindow_new_2, 3578).
--define(wxPopupWindow_new_0, 3579).
--define(wxPopupWindow_destruct, 3581).
--define(wxPopupWindow_Create, 3582).
--define(wxPopupWindow_Position, 3583).
--define(wxPopupTransientWindow_new_0, 3584).
--define(wxPopupTransientWindow_new_2, 3585).
--define(wxPopupTransientWindow_destruct, 3586).
--define(wxPopupTransientWindow_Popup, 3587).
--define(wxPopupTransientWindow_Dismiss, 3588).
--define(wxOverlay_new, 3589).
--define(wxOverlay_destruct, 3590).
--define(wxOverlay_Reset, 3591).
--define(wxDCOverlay_new_6, 3592).
--define(wxDCOverlay_new_2, 3593).
--define(wxDCOverlay_destruct, 3594).
--define(wxDCOverlay_Clear, 3595).
--define(wxDropFilesEvent_GetPosition, 3596).
--define(wxDropFilesEvent_GetNumberOfFiles, 3597).
--define(wxDropFilesEvent_GetFiles, 3598).
+-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/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/otp_versions.table b/otp_versions.table
index ee59f4729f..793f7bcd28 100644
--- a/otp_versions.table
+++ b/otp_versions.table
@@ -1,3 +1,5 @@
+OTP-19.1.6 : erts-8.1.1 # asn1-4.0.4 common_test-1.12.3 compiler-7.0.2 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7.1 debugger-4.2.1 dialyzer-3.0.2 diameter-1.12.1 edoc-0.8 eldap-1.2.2 erl_docgen-0.6 erl_interface-3.9.1 et-1.6 eunit-2.3.1 gs-1.6.2 hipe-3.15.2 ic-4.4.2 inets-6.3.3 jinterface-1.7.1 kernel-5.1 megaco-3.18.1 mnesia-4.14.1 observer-2.2.2 odbc-2.11.3 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.3 percept-0.9 public_key-1.2 reltool-0.7.2 runtime_tools-1.10.1 sasl-3.0.1 snmp-5.2.4 ssh-4.3.6 ssl-8.0.3 stdlib-3.1 syntax_tools-2.1 tools-2.8.6 typer-0.9.11 wx-1.7.1 xmerl-1.3.12 :
+OTP-19.1.5 : ssh-4.3.6 # asn1-4.0.4 common_test-1.12.3 compiler-7.0.2 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7.1 debugger-4.2.1 dialyzer-3.0.2 diameter-1.12.1 edoc-0.8 eldap-1.2.2 erl_docgen-0.6 erl_interface-3.9.1 erts-8.1 et-1.6 eunit-2.3.1 gs-1.6.2 hipe-3.15.2 ic-4.4.2 inets-6.3.3 jinterface-1.7.1 kernel-5.1 megaco-3.18.1 mnesia-4.14.1 observer-2.2.2 odbc-2.11.3 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.3 percept-0.9 public_key-1.2 reltool-0.7.2 runtime_tools-1.10.1 sasl-3.0.1 snmp-5.2.4 ssl-8.0.3 stdlib-3.1 syntax_tools-2.1 tools-2.8.6 typer-0.9.11 wx-1.7.1 xmerl-1.3.12 :
OTP-19.1.4 : ssh-4.3.5 # asn1-4.0.4 common_test-1.12.3 compiler-7.0.2 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7.1 debugger-4.2.1 dialyzer-3.0.2 diameter-1.12.1 edoc-0.8 eldap-1.2.2 erl_docgen-0.6 erl_interface-3.9.1 erts-8.1 et-1.6 eunit-2.3.1 gs-1.6.2 hipe-3.15.2 ic-4.4.2 inets-6.3.3 jinterface-1.7.1 kernel-5.1 megaco-3.18.1 mnesia-4.14.1 observer-2.2.2 odbc-2.11.3 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.3 percept-0.9 public_key-1.2 reltool-0.7.2 runtime_tools-1.10.1 sasl-3.0.1 snmp-5.2.4 ssl-8.0.3 stdlib-3.1 syntax_tools-2.1 tools-2.8.6 typer-0.9.11 wx-1.7.1 xmerl-1.3.12 :
OTP-19.1.3 : ssh-4.3.4 # asn1-4.0.4 common_test-1.12.3 compiler-7.0.2 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7.1 debugger-4.2.1 dialyzer-3.0.2 diameter-1.12.1 edoc-0.8 eldap-1.2.2 erl_docgen-0.6 erl_interface-3.9.1 erts-8.1 et-1.6 eunit-2.3.1 gs-1.6.2 hipe-3.15.2 ic-4.4.2 inets-6.3.3 jinterface-1.7.1 kernel-5.1 megaco-3.18.1 mnesia-4.14.1 observer-2.2.2 odbc-2.11.3 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.3 percept-0.9 public_key-1.2 reltool-0.7.2 runtime_tools-1.10.1 sasl-3.0.1 snmp-5.2.4 ssl-8.0.3 stdlib-3.1 syntax_tools-2.1 tools-2.8.6 typer-0.9.11 wx-1.7.1 xmerl-1.3.12 :
OTP-19.1.2 : ssh-4.3.3 # asn1-4.0.4 common_test-1.12.3 compiler-7.0.2 cosEvent-2.2.1 cosEventDomain-1.2.1 cosFileTransfer-1.2.1 cosNotification-1.2.2 cosProperty-1.2.1 cosTime-1.2.2 cosTransactions-1.3.2 crypto-3.7.1 debugger-4.2.1 dialyzer-3.0.2 diameter-1.12.1 edoc-0.8 eldap-1.2.2 erl_docgen-0.6 erl_interface-3.9.1 erts-8.1 et-1.6 eunit-2.3.1 gs-1.6.2 hipe-3.15.2 ic-4.4.2 inets-6.3.3 jinterface-1.7.1 kernel-5.1 megaco-3.18.1 mnesia-4.14.1 observer-2.2.2 odbc-2.11.3 orber-3.8.2 os_mon-2.4.1 otp_mibs-1.1.1 parsetools-2.1.3 percept-0.9 public_key-1.2 reltool-0.7.2 runtime_tools-1.10.1 sasl-3.0.1 snmp-5.2.4 ssl-8.0.3 stdlib-3.1 syntax_tools-2.1 tools-2.8.6 typer-0.9.11 wx-1.7.1 xmerl-1.3.12 :
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
index 8e6ff8a898..eaa2aca5b0 100644
--- a/system/doc/design_principles/code_lock.dia
+++ b/system/doc/design_principles/code_lock.dia
Binary files differ
diff --git a/system/doc/design_principles/code_lock.png b/system/doc/design_principles/code_lock.png
index 745fd91920..40bd35fc74 100644
--- a/system/doc/design_principles/code_lock.png
+++ b/system/doc/design_principles/code_lock.png
Binary files differ
diff --git a/system/doc/design_principles/code_lock_2.dia b/system/doc/design_principles/code_lock_2.dia
index 142909a2f5..3b9ba554d8 100644
--- a/system/doc/design_principles/code_lock_2.dia
+++ b/system/doc/design_principles/code_lock_2.dia
Binary files differ
diff --git a/system/doc/design_principles/code_lock_2.png b/system/doc/design_principles/code_lock_2.png
index ecf7b0d799..3aca9dd5aa 100644
--- a/system/doc/design_principles/code_lock_2.png
+++ b/system/doc/design_principles/code_lock_2.png
Binary files differ
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>&nbsp;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(&lt;&lt;"001">>),
+ code_lock:put_chars(&lt;&lt;"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